Nektar++
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
CellMLToNektar.pycml.mathml_piecewise Class Reference
Inheritance diagram for CellMLToNektar.pycml.mathml_piecewise:
[legend]

Public Member Functions

def __init__ (self)
 
def tree_complexity (self, **kw)
 
def get_units (self)
 
def classify_variables (self, dependencies_only=False, needs_special_treatment=lambda n:None)
 
def evaluate (self)
 
def __init__ (self)
 
- Public Member Functions inherited from CellMLToNektar.pycml.mathml
def __init__ (self)
 
def __repr__ (self)
 
def __deepcopy__ (self, memo)
 
def clone_self (self, register=False)
 
def get_original_of_clone (self)
 
def get_component (self)
 
def model (self)
 
def eval (self, elt)
 
- Public Member Functions inherited from CellMLToNektar.pycml.element_base
def __init__ (self)
 
def __delattr__ (self, key)
 
def __setattr__ (self, key, value)
 
def rootNode (self)
 
def cmeta_id (self)
 
def xml_remove_child_at (self, index=-1)
 
def xml_doc (self)
 
def xml_properties (self)
 

Static Public Member Functions

def create_new (elt, pieces, otherwise=None)
 
- Static Public Member Functions inherited from CellMLToNektar.pycml.mathml
def clone (expr)
 

Private Member Functions

def _set_in_units (self, units, no_act=False)
 
def _get_binding_time (self)
 
def _reduce (self, check_operator=True)
 

Private Attributes

 _cml_units
 
 _cml_binding_time
 

Additional Inherited Members

- Public Attributes inherited from CellMLToNektar.pycml.element_base
 xml_attributes
 
- Properties inherited from CellMLToNektar.pycml.mathml
 component = property(get_component)
 

Detailed Description

Definition at line 5032 of file pycml.py.

Constructor & Destructor Documentation

◆ __init__()

def CellMLToNektar.pycml.mathml_piecewise.__init__ (   self)

Reimplemented from CellMLToNektar.pycml.mathml_constructor.

Definition at line 5033 of file pycml.py.

5033 def __init__(self):
5034 super(mathml_piecewise, self).__init__()
5035 self._cml_units = None
5036 self._cml_binding_time = None
5037

References CellMLToNektar.pycml.mathml_piecewise.__init__().

Referenced by CellMLToNektar.pycml.mathml_piecewise.__init__().

Member Function Documentation

◆ _get_binding_time()

def CellMLToNektar.pycml.mathml_piecewise._get_binding_time (   self)
private
Return the binding time of this expression.

The binding time will be computed recursively and cached.
It will also be made available as an attribute in the XML.

It is computed by taking the least upper bound of the binding
times of (some of) the conditions and cases.

Condition & case binding times are computed in the order given
in the file.  If a condition is static with value False, its
associated case is not considered.  If a condition is static
with value True, subsequent conditions & cases and the
otherwise (if present) will not be considered.

Definition at line 5228 of file pycml.py.

5228 def _get_binding_time(self):
5229 """Return the binding time of this expression.
5230
5231 The binding time will be computed recursively and cached.
5232 It will also be made available as an attribute in the XML.
5233
5234 It is computed by taking the least upper bound of the binding
5235 times of (some of) the conditions and cases.
5236
5237 Condition & case binding times are computed in the order given
5238 in the file. If a condition is static with value False, its
5239 associated case is not considered. If a condition is static
5240 with value True, subsequent conditions & cases and the
5241 otherwise (if present) will not be considered.
5242 """
5243 if self._cml_binding_time is not None:
5244 return self._cml_binding_time
5245
5246 # Do we have an annotation?
5247 if hasattr(self, u'binding_time'):
5248 self._cml_binding_time = getattr(BINDING_TIMES,
5249 self.binding_time)
5250 return self._cml_binding_time
5251
5252 # Compute condition binding times
5253 bts = [BINDING_TIMES.static]
5254 for piece in getattr(self, u'piece', []):
5255 condition = child_i(piece, 2)
5256 bt = self._get_element_binding_time(condition)
5257 if bt is BINDING_TIMES.static:
5258 cond_value = self.eval(condition)
5259 if cond_value is True:
5260 # Compute BT for associated case
5261 bts.append(self._get_element_binding_time(
5262 child_i(piece, 1)))
5263 # Skip remaining conditions & otherwise
5264 break
5265 else:
5266 # Don't need to append extra statics, since bts
5267 # contains at least one member that is static
5268 bts.append(bt)
5269 # Compute BT for associated case
5270 bts.append(self._get_element_binding_time(
5271 child_i(piece, 1)))
5272 else:
5273 # Consider the <otherwise> element
5274 if hasattr(self, u'otherwise'):
5275 bts.append(self._get_element_binding_time(
5276 child_i(self.otherwise, 1)))
5277 # Take least upper bound of appropriate binding times
5278 self._cml_binding_time = max(bts)
5279
5280 # Annotate the element with the binding time
5281 self.xml_set_attribute((u'pe:binding_time', NSS[u'pe']),
5282 unicode(self._cml_binding_time))
5283 return self._cml_binding_time
5284
def child_i(elt, i)
Definition: pycml.py:3449

References CellMLToNektar.pycml.cellml_variable._cml_binding_time, CellMLToNektar.pycml.mathml_apply._cml_binding_time, CellMLToNektar.pycml.mathml_piecewise._cml_binding_time, CellMLToNektar.pycml.mathml_constructor._get_element_binding_time(), CellMLToNektar.pycml.child_i(), and CellMLToNektar.pycml.mathml.eval().

Referenced by CellMLToNektar.pycml.mathml_ci._reduce(), CellMLToNektar.pycml.mathml_apply._reduce(), CellMLToNektar.pycml.mathml_piecewise._reduce(), CellMLToNektar.pycml.cellml_variable.get_value(), and CellMLToNektar.pycml.cellml_variable.is_statically_const().

◆ _reduce()

def CellMLToNektar.pycml.mathml_piecewise._reduce (   self,
  check_operator = True 
)
private
Reduce this expression by evaluating its static parts.

Even in a dynamic conditional, where a condition is static and
evaluates to False, the associated case is discarded.

Definition at line 5285 of file pycml.py.

5285 def _reduce(self, check_operator=True):
5286 """Reduce this expression by evaluating its static parts.
5287
5288 Even in a dynamic conditional, where a condition is static and
5289 evaluates to False, the associated case is discarded.
5290 """
5291 # Element to replace this <piecewise> with, if any
5292 new_elt = None
5293 if self._get_binding_time() == BINDING_TIMES.static:
5294 # Evaluate self and replace by a <cn>, <true> or <false>
5295 new_elt = self._eval_self()
5296 elif self._get_binding_time() == BINDING_TIMES.dynamic:
5297 # Go through pieces and reduce where appropriate
5298 deletable_pieces = []
5299 found_dynamic_piece = False
5300 for piece in getattr(self, u'piece', []):
5301 condition = child_i(piece, 2)
5302 bt = self._get_element_binding_time(condition)
5303 if bt is BINDING_TIMES.static:
5304 cond_value = self.eval(condition)
5305 if cond_value is True:
5306 if not found_dynamic_piece:
5307 # Replace the entire piecewise element by our case
5308 # We don't replace if a previous piece had a
5309 # dynamic condition, since this would change
5310 # execution order, which could alter the semantics.
5311 new_elt = child_i(piece, 1)
5312 break
5313 else:
5314 # Discard this condition & case
5315 deletable_pieces.append(piece)
5316 elif bt is BINDING_TIMES.dynamic:
5317 found_dynamic_piece = True
5318 # Reduce the condition & case
5319 self._reduce_elt(condition)
5320 self._reduce_elt(child_i(piece, 1))
5321 else:
5322 # Didn't replace entire conditional
5323 # Remove pieces with False conditions
5324 for piece in deletable_pieces:
5325 self._update_usage_counts(piece, remove=True)
5326 self.xml_remove_child(piece)
5327 # Consider the <otherwise> element
5328 if hasattr(self, u'otherwise'):
5329 if not found_dynamic_piece:
5330 # All the <piece> elements were removed, so replace
5331 # the entire conditional by this <otherwise>
5332 new_elt = child_i(self.otherwise, 1)
5333 else:
5334 # Just reduce the <otherwise>
5335 self._reduce_elt(child_i(self.otherwise, 1))
5336 # Replace this element, if required
5337 if new_elt is not None:
5338 # Update usage counts for removed expressions
5339 for piece in getattr(self, u'piece', []):
5340 if not new_elt is child_i(piece, 1):
5341 self._update_usage_counts(piece, remove=True)
5342 else:
5343 # Condition is being removed
5344 self._update_usage_counts(child_i(piece, 2), remove=True)
5345 piece.xml_remove_child(child_i(piece, 2))
5346 piece.xml_remove_child(new_elt)
5347 if hasattr(self, u'otherwise') and \
5348 not new_elt is child_i(self.otherwise, 1):
5349 self._update_usage_counts(child_i(self.otherwise, 1),
5350 remove=True)
5351 # Do the replace
5352 self._xfer_complexity(new_elt)
5353 self.replace_child(self, new_elt, self.xml_parent)
5354 # May need to reduce our replacement
5355 self._reduce_elt(new_elt)
5356

References CellMLToNektar.pycml.mathml_constructor._eval_self(), CellMLToNektar.pycml.cellml_variable._get_binding_time(), CellMLToNektar.pycml.mathml_cn._get_binding_time(), CellMLToNektar.pycml.mathml_ci._get_binding_time(), CellMLToNektar.pycml.mathml_piecewise._get_binding_time(), CellMLToNektar.pycml.mathml_diff._get_binding_time(), CellMLToNektar.pycml.mathml_and._get_binding_time(), CellMLToNektar.pycml.mathml_or._get_binding_time(), CellMLToNektar.pycml.mathml_eq._get_binding_time(), CellMLToNektar.pycml.mathml_apply._get_binding_time(), CellMLToNektar.pycml.mathml_constructor._get_element_binding_time(), CellMLToNektar.pycml.mathml_constructor._reduce_elt(), CellMLToNektar.pycml.mathml_constructor._update_usage_counts(), CellMLToNektar.pycml.child_i(), and CellMLToNektar.pycml.mathml.eval().

◆ _set_in_units()

def CellMLToNektar.pycml.mathml_piecewise._set_in_units (   self,
  units,
  no_act = False 
)
private
Set the units this expression should be given in.

This is done recursively by setting the units for each option.

We also set the units on each condition to be boolean, since
subexpressions of the conditions may need units conversions added.

Definition at line 5106 of file pycml.py.

5106 def _set_in_units(self, units, no_act=False):
5107 """Set the units this expression should be given in.
5108
5109 This is done recursively by setting the units for each option.
5110
5111 We also set the units on each condition to be boolean, since
5112 subexpressions of the conditions may need units conversions added.
5113 """
5114 # First, record our units
5115 if not no_act:
5116 self._cml_units = units
5117 # Now process our children
5118 boolean = self.model.get_units_by_name(u'cellml:boolean')
5119 for piece in getattr(self, u'piece', []):
5120 self._set_element_in_units(child_i(piece, 1), units, no_act)
5121 self._set_element_in_units(child_i(piece, 2), boolean, no_act)
5122 if hasattr(self, u'otherwise'):
5123 self._set_element_in_units(child_i(self.otherwise, 1), units, no_act)
5124
def get_units_by_name(self, uname)
Definition: pycml.py:2725

References CellMLToNektar.pycml.cellml_model._cml_units, CellMLToNektar.pycml.cellml_component._cml_units, CellMLToNektar.pycml.mathml_units_mixin_tokens._cml_units, CellMLToNektar.pycml.mathml_units_mixin_container._cml_units, CellMLToNektar.pycml.mathml_cn._cml_units, CellMLToNektar.pycml.mathml_ci._cml_units, CellMLToNektar.pycml.mathml_apply._cml_units, CellMLToNektar.pycml.mathml_piecewise._cml_units, CellMLToNektar.pycml.mathml_units_mixin._set_element_in_units(), CellMLToNektar.pycml.child_i(), CellMLToNektar.pycml.get_units_by_name(), CellMLToNektar.processors.ModelModifier.model, CellMLToNektar.pycml.cellml_variable.model(), CellMLToNektar.pycml.mathml.model(), and CellMLToNektar.translators.CellMLTranslator.model.

◆ classify_variables()

def CellMLToNektar.pycml.mathml_piecewise.classify_variables (   self,
  dependencies_only = False,
  needs_special_treatment = lambda n: None 
)
Classify variables in this expression according to how they are used.

In the process, compute and return a set of variables on which
this expression depends.

If dependencies_only then the variable classification will not be
done, only dependencies will be analysed.  This is useful for doing
a 'light' re-analysis if the dependency set has been reduced; if the
set has increased then the topological sort of equations may need to
be redone.

The function needs_special_treatment may be supplied to override the
default recursion into sub-trees.  It takes a single sub-tree as
argument, and should either return the dependency set for that
sub-tree, or None to use the default recursion.  This is used when
re-analysing dependencies after applying lookup tables, since table
lookups only depend on the keying variable.

Definition at line 5176 of file pycml.py.

5177 needs_special_treatment=lambda n: None):
5178 """Classify variables in this expression according to how they are used.
5179
5180 In the process, compute and return a set of variables on which
5181 this expression depends.
5182
5183 If dependencies_only then the variable classification will not be
5184 done, only dependencies will be analysed. This is useful for doing
5185 a 'light' re-analysis if the dependency set has been reduced; if the
5186 set has increased then the topological sort of equations may need to
5187 be redone.
5188
5189 The function needs_special_treatment may be supplied to override the
5190 default recursion into sub-trees. It takes a single sub-tree as
5191 argument, and should either return the dependency set for that
5192 sub-tree, or None to use the default recursion. This is used when
5193 re-analysing dependencies after applying lookup tables, since table
5194 lookups only depend on the keying variable.
5195 """
5196 dependencies = set()
5197 pieces = list(getattr(self, u'piece', []))
5198 if hasattr(self, u'otherwise'):
5199 pieces.append(self.otherwise)
5200 for piece in pieces:
5201 dependencies.update(self.classify_child_variables(piece, dependencies_only=dependencies_only,
5202 needs_special_treatment=needs_special_treatment))
5203 return dependencies
5204

◆ create_new()

def CellMLToNektar.pycml.mathml_piecewise.create_new (   elt,
  pieces,
  otherwise = None 
)
static
Create a new piecewise element.

elt is any element in the current document.

pieces is a list of pairs of expressions: (case, condition).

otherwise, if given, is the default case.

Definition at line 5358 of file pycml.py.

5358 def create_new(elt, pieces, otherwise=None):
5359 """Create a new piecewise element.
5360
5361 elt is any element in the current document.
5362
5363 pieces is a list of pairs of expressions: (case, condition).
5364
5365 otherwise, if given, is the default case.
5366 """
5367 piecewise = elt.xml_create_element(u'piecewise', NSS[u'm'])
5368 for piece in pieces:
5369 case, cond = piece
5372 piece_elt = elt.xml_create_element(u'piece', NSS[u'm'])
5373 piece_elt.xml_append(case)
5374 piece_elt.xml_append(cond)
5375 piecewise.xml_append(piece_elt)
5376 if otherwise:
5377 check_append_safety(otherwise)
5378 otherwise_elt = elt.xml_create_element(u'otherwise', NSS[u'm'])
5379 otherwise_elt.xml_append(otherwise)
5380 piecewise.xml_append(otherwise_elt)
5381 return piecewise
5382
5383
def create_new(parent, name, bases, add_to_parent=False, standard=False)
Definition: pycml.py:2912
def check_append_safety(elt)
Definition: pycml.py:197

References CellMLToNektar.pycml.check_append_safety().

◆ evaluate()

def CellMLToNektar.pycml.mathml_piecewise.evaluate (   self)
Evaluate this piecewise expression.

Tests choices in the order they occur in the file.
Only evaluates a choice if its condition evaluates to True.

Definition at line 5205 of file pycml.py.

5205 def evaluate(self):
5206 """Evaluate this piecewise expression.
5207
5208 Tests choices in the order they occur in the file.
5209 Only evaluates a choice if its condition evaluates to True.
5210 """
5211 for piece in getattr(self, u'piece', []):
5212 condition = child_i(piece, 2)
5213 cond_value = self.eval(condition)
5214 if cond_value is True:
5215 # This is the option to take
5216 value = self.eval(child_i(piece, 1))
5217 break
5218 else:
5219 # Evaluate the <otherwise>
5220 if hasattr(self, u'otherwise'):
5221 value = self.eval(_child1(self.otherwise))
5222 else:
5223 raise EvaluationError(u' '.join([
5224 "A piecewise element where the pieces aren't mutually",
5225 "exhaustive requires an otherwise element."]))
5226 return value
5227
def _child1(elt)
Definition: pycml.py:3460

References CellMLToNektar.pycml._child1(), CellMLToNektar.pycml.child_i(), and CellMLToNektar.pycml.mathml.eval().

Referenced by CellMLToNektar.pycml.mathml_constructor._eval_self(), and CellMLToNektar.pycml.mathml_ci._reduce().

◆ get_units()

def CellMLToNektar.pycml.mathml_piecewise.get_units (   self)
Recursively check this expression for dimensional consistency.

The first child elements of each <piece> and <otherwise> element
should have dimensionally equivalent units (the resulting <units>
element will be dimensionally equivalent to these).  The second child
elements of each <piece> should have units of cellml:boolean.

If consistent, returns a <units> element for the whole expression.
Throws a UnitsError if the units are inconsistent.

Definition at line 5125 of file pycml.py.

5125 def get_units(self):
5126 """Recursively check this expression for dimensional consistency.
5127
5128 The first child elements of each <piece> and <otherwise> element
5129 should have dimensionally equivalent units (the resulting <units>
5130 element will be dimensionally equivalent to these). The second child
5131 elements of each <piece> should have units of cellml:boolean.
5132
5133 If consistent, returns a <units> element for the whole expression.
5134 Throws a UnitsError if the units are inconsistent.
5135 """
5136 if self._cml_units:
5137 return self._cml_units
5138 # Check the second child of each <piece> element
5139 boolean = self.model.get_units_by_name(u'cellml:boolean')
5140 for piece in getattr(self, u'piece', []):
5141 cond_elt = child_i(piece, 2)
5142 units = self._get_element_units(cond_elt)
5143 if not boolean in units:
5144 raise UnitsError(self, u' '.join([
5145 u'The second child element of a <piece> element must have'
5146 u'units of cellml:boolean, not',units.description()]))
5147 # Compare the first child element of each <piece> and the <otherwise>,
5148 # if present.
5149 our_units = None
5150 if hasattr(self, u'otherwise'):
5151 value_elt = child_i(self.otherwise, 1)
5152 our_units = self._get_element_units(value_elt).copy()
5153 for piece in getattr(self, u'piece', []):
5154 value_elt = child_i(piece, 1)
5155 if our_units is None:
5156 our_units = self._get_element_units(value_elt).copy()
5157 else:
5158 units = self._get_element_units(value_elt)
5159 if not our_units.dimensionally_equivalent(units):
5160 raise UnitsError(self, u' '.join([
5161 u'The first child elements of children of a piecewise',
5162 u'element must have dimensionally equivalent units;',
5163 units.description(),'and',our_units.description(),
5164 u'differ']))
5165 our_units.update(units)
5166 # Check that we have some units for this element
5167 if our_units is None:
5168 raise UnitsError(self, u' '.join([
5169 u'A piecewise element must have at least one piece or',
5170 u'otherwise child in order to have defined units.']))
5171 # Cache & return units
5172 self._cml_units = our_units
5173 our_units.set_expression(self)
5174 return self._cml_units
5175
def copy(self)
Definition: pycml.py:2663

References CellMLToNektar.pycml.cellml_model._cml_units, CellMLToNektar.pycml.cellml_component._cml_units, CellMLToNektar.pycml.mathml_units_mixin_tokens._cml_units, CellMLToNektar.pycml.mathml_units_mixin_container._cml_units, CellMLToNektar.pycml.mathml_cn._cml_units, CellMLToNektar.pycml.mathml_ci._cml_units, CellMLToNektar.pycml.mathml_apply._cml_units, CellMLToNektar.pycml.mathml_piecewise._cml_units, CellMLToNektar.pycml.mathml_constructor._get_element_units(), CellMLToNektar.pycml.child_i(), CellMLToNektar.pycml.copy(), CellMLToNektar.pycml.get_units_by_name(), CellMLToNektar.processors.ModelModifier.model, CellMLToNektar.pycml.cellml_variable.model(), CellMLToNektar.pycml.mathml.model(), and CellMLToNektar.translators.CellMLTranslator.model.

Referenced by CellMLToNektar.pycml.mathml._ensure_units_exist(), CellMLToNektar.pycml.mathml_units_mixin_tokens._set_in_units(), and CellMLToNektar.pycml.mathml_apply._set_in_units().

◆ tree_complexity()

def CellMLToNektar.pycml.mathml_piecewise.tree_complexity (   self,
**  kw 
)
Calculate a rough estimate of the computation time for
evaluating this <piecewise> element.

The real evaluation time will generally depend on run time
data, which makes things tricky.  Here we estimate by taking
the sum of the complexities of the conditions and the maximum
of the complexity of the cases, in order to obtain an upper
bound.

If lookup_tables is True, then assume we're using lookup tables
where possible.
If algebraic is True, the complexity is calculated as a dictionary,
mapping node types to the number of occurences of that type.

If self.rootNode.num_lookup_tables exists, this method will
update the count of lookup tables based on this expression,
unless the argument 'count_tables' is False or algebraic is True.

Definition at line 5038 of file pycml.py.

5038 def tree_complexity(self, **kw):
5039 """
5040 Calculate a rough estimate of the computation time for
5041 evaluating this <piecewise> element.
5042
5043 The real evaluation time will generally depend on run time
5044 data, which makes things tricky. Here we estimate by taking
5045 the sum of the complexities of the conditions and the maximum
5046 of the complexity of the cases, in order to obtain an upper
5047 bound.
5048
5049 If lookup_tables is True, then assume we're using lookup tables
5050 where possible.
5051 If algebraic is True, the complexity is calculated as a dictionary,
5052 mapping node types to the number of occurences of that type.
5053
5054 If self.rootNode.num_lookup_tables exists, this method will
5055 update the count of lookup tables based on this expression,
5056 unless the argument 'count_tables' is False or algebraic is True.
5057 """
5058 kw['algebraic'] = kw.get('algebraic', False)
5059 alg = kw['algebraic']
5060 if alg: ac, piece_dicts = {}, []
5061 else: ac = 0
5062 piece_acs = []
5063 count_lts = hasattr(self.rootNode, 'num_lookup_tables') and kw.get('count_tables', True) and not alg
5064 if count_lts:
5065 # Alternative method of counting number of lookup tables;
5066 # handles the Zhang model better!
5067 num_lts = self.rootNode.num_lookup_tables
5068 piece_num_lts = []
5069
5070 for piece in getattr(self, u'piece', []):
5071 test_ac = self._tree_complexity(child_i(piece, 2), **kw)
5072 if alg: add_dicts(ac, test_ac)
5073 else: ac += test_ac
5074 if count_lts:
5075 nlts = self.rootNode.num_lookup_tables
5076 piece_ac = self._tree_complexity(child_i(piece, 1), **kw)
5077 if alg:
5078 piece_dicts.append(piece_ac)
5079 piece_acs.append(self._tree_complexity(child_i(piece, 1), count_tables=False))
5080 else:
5081 piece_acs.append(piece_ac)
5082 if count_lts:
5083 piece_num_lts.append(self.rootNode.num_lookup_tables - nlts)
5084 if hasattr(self, u'otherwise'):
5085 if count_lts:
5086 nlts = self.rootNode.num_lookup_tables
5087 ow_ac = self._tree_complexity(child_i(self.otherwise, 1), **kw)
5088 if alg:
5089 piece_dicts.append(ow_ac)
5090 piece_acs.append(
5091 self._tree_complexity(child_i(self.otherwise, 1), count_tables=False))
5092 else:
5093 piece_acs.append(ow_ac)
5094 if count_lts:
5095 piece_num_lts.append(self.rootNode.num_lookup_tables - nlts)
5096 max_idx, max_piece_ac = max_i(piece_acs)
5097 if alg:
5098 add_dicts(ac, piece_dicts[max_idx])
5099 else:
5100 ac += max_piece_ac
5101 if count_lts:
5102 self.rootNode.num_lookup_tables -= sum(piece_num_lts)
5103 self.rootNode.num_lookup_tables += piece_num_lts[max_idx]
5104 return ac
5105

References CellMLToNektar.pycml.mathml_constructor._tree_complexity(), CellMLToNektar.utilities.add_dicts(), CellMLToNektar.pycml.child_i(), CellMLToNektar.utilities.max_i(), and CellMLToNektar.pycml.element_base.rootNode().

Member Data Documentation

◆ _cml_binding_time

CellMLToNektar.pycml.mathml_piecewise._cml_binding_time
private

◆ _cml_units

CellMLToNektar.pycml.mathml_piecewise._cml_units
private