SYSTEM ARCHITECTURE ============================================================= CROSS-PLATFORM COMPATIBILITY we use the C language with ANSI specifications; we will run the application on Linux, Windows, MacOS, Unix and other operating systems ZERO ENTITY COLLISION we store the ID of some entities in UUID format, in order to prevent collisions on entities defined across different machines SIMULATION TIME SCALABILITY we store the simulation time in a string format (e.g. YYYY-MM-DD-HH-NN-SS-LLL) which allows us to increase the simulation time scale (e.g. ...YYYY-MM-DD-HH-NN-SS-LLL-...) without having to change the application code UNIVERSAL DATA STORAGE we use a file addressing system ZERO DATABASE ADMINISTRATION we use an embedded database for data storage ZERO DATA LOSS we use ACID compliant transactions that protect us against hardware & software crashes; we replicate the same data across multiple machines FAST DATA ACCESS we use non-linear data access using B-TREEs, database connection caching and in-memory databases ZERO DATA CONCURRENCY we use one writer and multiple readers for each database file ZERO STRUCTURAL DATABASE CHANGES we keep the object id in the Objects table so that we can allow for future changes without having to change the structure of the table; if we need to add new columns (e.g. UserName or LastUpdateDate) we only need to define new properties for the object (e.g. user name, last update date) and assign values to them; thus we do not need to change all database files across all machines when doing an upgrade HISTORICAL DATA STORAGE we store in Property_Values table only the current property values that have been changed since last time step; we will end up with property values that have not changed since creation (e.g. neuron type) and other ones that are changed at each time step (e.g. voltage); the Archive_Property_Values will store the property values that have been changed over time ZERO DATA CORRUPTION IN MEMORY we use Valgrind to identify memory leaks CELLULAR MODELLING SCALABILITY we use generalized data structures for storage of any cell model UNIVERSAL INTEGRATION METHODS we can use multiple integration methods during simulation of different objects ZERO INSTALLATION STEPS we use a self-contained executable that does not require external libraries; setup requires file copy only UNIVERSAL GRAPHICS PLATFORM we use OpenGL SINGLE-THREADED MULTIPLE PROCESSES we will use a single-threaded model for the application but we will run multiple instances of the module processes ZERO APPLICATION CHANGES FOR NEW CELL MODELS we use a modular architecture with local message queues SINGLE POINT OF CONTROL we will use a single point of command and control; if data is corrupted on more than x% on all machines in the entire set we must redo the computations on other machines; we will use redundant machines COMPUTATIONAL PROCESSING SCALABILITY we use automatic process creation and destruction based on each machine's available resources; the application will be able to scale up to the maximum available resources HIGH SECURITY we use data encryption and private & public keys for data transfer; users, groups, permissions, access rights and auditing (USERS: user id, user name, password, is account locked, last connected date, creation date, created by user, modification date, modified by user) SIMULATION TRANSACTIONS we will use transactions on top of database transactions ZERO DOWNTIME we will have the core system working even when performing entity updates ZERO APPLICATION CHANGES once the simulator's source code will be completed, we will freeze its development and switch to the development of brain functions like learning, decision taking and everything else UNIVERSAL DATA VISUALIZATION we will be able to visualize brain processes on any machine and at any level, from molecular to system level SIMPLE TO USE we will build the system in such a way so that the application can be used both by researchers and by people with little or no expertise in neuroscience; brain processes will be employed without the need to be understood