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)
 
- Public Member Functions inherited from CellMLToNektar.pycml.mathml_constructor
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)

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 

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.

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_piecewise._reduce().

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

◆ _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.

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_apply._get_binding_time(), CellMLToNektar.pycml.mathml_piecewise._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().

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 
def child_i(elt, i)
Definition: pycml.py:3449

◆ _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.

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, Nektar::NekMeshUtils::CADSystemCFI.model, CellMLToNektar.translators.CellMLTranslator.model, CellMLToNektar.pycml.cellml_variable.model(), and CellMLToNektar.pycml.mathml.model().

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 child_i(elt, i)
Definition: pycml.py:3449
def get_units_by_name(self, uname)
Definition: pycml.py:2725

◆ 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 5177 of file pycml.py.

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

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.

References CellMLToNektar.pycml.check_append_safety().

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
5370  check_append_safety(case)
5371  check_append_safety(cond)
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 check_append_safety(elt)
Definition: pycml.py:197
def create_new(parent, name, bases, add_to_parent=False, standard=False)
Definition: pycml.py:2912

◆ 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.

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

Referenced by CellMLToNektar.pycml.mathml_constructor._eval_self().

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 child_i(elt, i)
Definition: pycml.py:3449
def _child1(elt)
Definition: pycml.py:3460

◆ 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.

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.mathml_piecewise.classify_variables(), CellMLToNektar.pycml.copy(), CellMLToNektar.pycml.get_units_by_name(), CellMLToNektar.processors.ModelModifier.model, Nektar::NekMeshUtils::CADSystemCFI.model, CellMLToNektar.translators.CellMLTranslator.model, CellMLToNektar.pycml.cellml_variable.model(), and CellMLToNektar.pycml.mathml.model().

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

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
def child_i(elt, i)
Definition: pycml.py:3449
def get_units_by_name(self, uname)
Definition: pycml.py:2725

◆ 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.

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().

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 
def child_i(elt, i)
Definition: pycml.py:3449

Member Data Documentation

◆ _cml_binding_time

CellMLToNektar.pycml.mathml_piecewise._cml_binding_time
private

Definition at line 5036 of file pycml.py.

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

◆ _cml_units

CellMLToNektar.pycml.mathml_piecewise._cml_units
private