{"action":"opened","issue":{"url":"https://api.github.com/repos/ModellingWebLab/cellmlmanip/issues/21","repository_url":"https://api.github.com/repos/ModellingWebLab/cellmlmanip","labels_url":"https://api.github.com/repos/ModellingWebLab/cellmlmanip/issues/21/labels{/name}","comments_url":"https://api.github.com/repos/ModellingWebLab/cellmlmanip/issues/21/comments","events_url":"https://api.github.com/repos/ModellingWebLab/cellmlmanip/issues/21/events","html_url":"https://github.com/ModellingWebLab/cellmlmanip/issues/21","id":298918849,"number":21,"title":"Determine test cases for model manipulation","user":{"login":"jonc125","id":2032871,"avatar_url":"https://avatars1.githubusercontent.com/u/2032871?v=4","gravatar_id":"","url":"https://api.github.com/users/jonc125","html_url":"https://github.com/jonc125","followers_url":"https://api.github.com/users/jonc125/followers","following_url":"https://api.github.com/users/jonc125/following{/other_user}","gists_url":"https://api.github.com/users/jonc125/gists{/gist_id}","starred_url":"https://api.github.com/users/jonc125/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonc125/subscriptions","organizations_url":"https://api.github.com/users/jonc125/orgs","repos_url":"https://api.github.com/users/jonc125/repos","events_url":"https://api.github.com/users/jonc125/events{/privacy}","received_events_url":"https://api.github.com/users/jonc125/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":{"login":"tamuri","id":360002,"avatar_url":"https://avatars2.githubusercontent.com/u/360002?v=4","gravatar_id":"","url":"https://api.github.com/users/tamuri","html_url":"https://github.com/tamuri","followers_url":"https://api.github.com/users/tamuri/followers","following_url":"https://api.github.com/users/tamuri/following{/other_user}","gists_url":"https://api.github.com/users/tamuri/gists{/gist_id}","starred_url":"https://api.github.com/users/tamuri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tamuri/subscriptions","organizations_url":"https://api.github.com/users/tamuri/orgs","repos_url":"https://api.github.com/users/tamuri/repos","events_url":"https://api.github.com/users/tamuri/events{/privacy}","received_events_url":"https://api.github.com/users/tamuri/received_events","type":"User","site_admin":false},"assignees":[{"login":"tamuri","id":360002,"avatar_url":"https://avatars2.githubusercontent.com/u/360002?v=4","gravatar_id":"","url":"https://api.github.com/users/tamuri","html_url":"https://github.com/tamuri","followers_url":"https://api.github.com/users/tamuri/followers","following_url":"https://api.github.com/users/tamuri/following{/other_user}","gists_url":"https://api.github.com/users/tamuri/gists{/gist_id}","starred_url":"https://api.github.com/users/tamuri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tamuri/subscriptions","organizations_url":"https://api.github.com/users/tamuri/orgs","repos_url":"https://api.github.com/users/tamuri/repos","events_url":"https://api.github.com/users/tamuri/events{/privacy}","received_events_url":"https://api.github.com/users/tamuri/received_events","type":"User","site_admin":false},{"login":"jonc125","id":2032871,"avatar_url":"https://avatars1.githubusercontent.com/u/2032871?v=4","gravatar_id":"","url":"https://api.github.com/users/jonc125","html_url":"https://github.com/jonc125","followers_url":"https://api.github.com/users/jonc125/followers","following_url":"https://api.github.com/users/jonc125/following{/other_user}","gists_url":"https://api.github.com/users/jonc125/gists{/gist_id}","starred_url":"https://api.github.com/users/jonc125/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonc125/subscriptions","organizations_url":"https://api.github.com/users/jonc125/orgs","repos_url":"https://api.github.com/users/jonc125/repos","events_url":"https://api.github.com/users/jonc125/events{/privacy}","received_events_url":"https://api.github.com/users/jonc125/received_events","type":"User","site_admin":false}],"milestone":null,"comments":0,"created_at":"2018-02-21T10:39:49Z","updated_at":"2018-02-21T10:39:49Z","closed_at":null,"author_association":"CONTRIBUTOR","body":"Initial thoughts, to be expanded...\r\n\r\n* Parsing of simple mathematical systems\r\n    * See existing pure MathML tests - stick these in components\r\n    * With single connection\r\n    * Include a purely algebraic system as well as ODEs\r\n    * Units conversions at connections - add new equations to model\r\n* Analysing systems of equations\r\n    * Checking for over/under-determined cases\r\n    * Identifying free/state/computed variables\r\n    * Can we do this ignoring the directionality on interfaces? (Makes future CellML 2 support easier.)\r\n    * Handle initial values nicely\r\n        * Where these are actually constants, make them look like a simple assignment\r\n        * Where they are really initial values for state vars, store them separately\r\n            * In CellML 2 these could be computed by an equation, but we don't need that for now\r\n    * Figure out the units for an equation (or part of an equation, e.g. the RHS of an assignment)\r\n* Interface needed for model manipulation\r\n    * Look up variable(s) by RDF annotation\r\n        * No variable found - can be OK or not\r\n        * One variable found\r\n        * Multiple variables found - can be OK or not\r\n    * Get the free variable\r\n    * Iterate over state variables\r\n    * Iterate over all variables\r\n    * Get the equation defining a variable / derivative\r\n        * Get the RHS of the equation\r\n    * Get variables referenced by an equation\r\n    * Get equations needed to compute a set of variables, recursively\r\n        * Where 'variables' can include ODE RHSs\r\n    * Given an equation, tell easily if it's an ODE or simple assignment\r\n        * Get the variable assigned to, state var, or free var\r\n    * Add a variable (optionally with units, annotations)\r\n        * Add an annotation for a variable\r\n    * Remove an equation from the system\r\n    * Add an equation to the system\r\n        * Variable names in new equations can be things like oxmeta:membrane_voltage - these need to be mapped to names suitable for code generation at some point, and identified with other variables having that annotation\r\n    * Replace part of an equation\r\n        * E.g. to replace an 'original_definition' symbol with the equation originally defining it\r\n        * This needs to be a 'clone' of the inserted equation\r\n    * Allow 'special' operations, so we can represent 'linear interpolation on a data file'\r\n    * Handle time units conversion\r\n        * RHS gets assigned to new variable with original units; change references to original derivative to this new variable; add another version of this variable with desired units, assigned from this one; use that to define the ODE.\r\n    * Handle [state] variable units conversion\r\n        * See _replace_variable logic, and perhaps _add_converted_variable - should be able to merge these\r\n    * Construct an equation on the fly\r\n* Interface needed for code generation\r\n    * Iterate over all equations\r\n    * Topological sort of equations\r\n    * Renaming variables if needed?\r\n    * Mark a variable as\r\n        * Modifiable parameter\r\n        * System output of interest (also called derived quantity in pycml)\r\n    * Cython + CVODE code gen\r\n        * Basic system of ODEs\r\n        * Add interfaces for setting parameters & reading outputs\r\n        * Handling a purely algebraic system\r\n"}}
{"actor":{"display_login":"jonc125"}}