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

Public Member Functions

def evaluate (self)
 
- Public Member Functions inherited from CellMLToNektar.pycml.mathml_operator
def wrong_number_of_operands (self, found, wanted)
 
- 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 __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)
 

Private Member Functions

def _set_in_units (self, units, no_act=False)
 
def _reduce (self)
 

Additional Inherited Members

- Static Public Member Functions inherited from CellMLToNektar.pycml.mathml
def clone (expr)
 
- Public Attributes inherited from CellMLToNektar.pycml.element_base
 xml_attributes
 
- Properties inherited from CellMLToNektar.pycml.mathml
 component = property(get_component)
 

Detailed Description

Class representing the MathML <power> operator.

Definition at line 5692 of file pycml.py.

Member Function Documentation

◆ _reduce()

def CellMLToNektar.pycml.mathml_power._reduce (   self)
private
Reduce this expression by evaluating its static parts.

If the whole expression is static, proceed as normal for an <apply>.
Otherwise check if the exponent is static and the expression being exponentiated
is a <ci>.  If so, and the exponent is equal to 2, 3, or 4, convert the expression
to a multiplication.

Definition at line 5728 of file pycml.py.

5728  def _reduce(self):
5729  """Reduce this expression by evaluating its static parts.
5730 
5731  If the whole expression is static, proceed as normal for an <apply>.
5732  Otherwise check if the exponent is static and the expression being exponentiated
5733  is a <ci>. If so, and the exponent is equal to 2, 3, or 4, convert the expression
5734  to a multiplication.
5735  """
5736  app = self.xml_parent
5737  bt = app._get_binding_time()
5738  converted = False
5739  if bt != BINDING_TIMES.static and self.model.get_option('pe_convert_power'):
5740  base, expt = list(app.operands())
5741  expt_bt = app._get_element_binding_time(expt)
5742  if expt_bt == BINDING_TIMES.static and isinstance(base, mathml_ci):
5743  expt_val = self.eval(expt)
5744  if expt_val in [2,3,4]:
5745  # Do the conversion
5746  app.safe_remove_child(base)
5747  operands = [base]
5748  for _ in range(1, expt_val):
5749  operands.append(base.clone_self())
5750  base.variable._used()
5751  new_app = mathml_apply.create_new(app, u'times', operands)
5752  app.replace_child(app, new_app, app.xml_parent)
5753  # Finally, reduce the new expression, just to be safe!
5754  new_app._reduce()
5755  converted = True
5756  if not converted:
5757  # Evaluate this expression as normal
5758  app._reduce(check_operator=False)
5759 

References CellMLToNektar.pycml.mathml.eval(), CellMLToNektar.processors.ModelModifier.model, CellMLToNektar.pycml.cellml_variable.model(), CellMLToNektar.pycml.mathml.model(), and CellMLToNektar.translators.CellMLTranslator.model.

◆ _set_in_units()

def CellMLToNektar.pycml.mathml_power._set_in_units (   self,
  units,
  no_act = False 
)
private
Set the units of the application of this operator.

Set the exponent to have units of dimensionless, and the operand to
have an arbitrary member of its possible units set.

Where these mean the <apply> doesn't have the given units, wrap it
in suitable units conversion mathematics.

Definition at line 5694 of file pycml.py.

5694  def _set_in_units(self, units, no_act=False):
5695  """Set the units of the application of this operator.
5696 
5697  Set the exponent to have units of dimensionless, and the operand to
5698  have an arbitrary member of its possible units set.
5699 
5700  Where these mean the <apply> doesn't have the given units, wrap it
5701  in suitable units conversion mathematics.
5702  """
5703  app = self.xml_parent
5704  defn_units_set = app.get_units()
5705  defn_units = defn_units_set.extract()
5706  app._add_units_conversion(app, defn_units, units, no_act)
5707  # Record which member of the set we used
5708  if not no_act:
5709  app._cml_units = defn_units
5710  # Set exponent units
5711  dimensionless = app.model.get_units_by_name('dimensionless')
5712  ops = list(app.operands())
5713  self._set_element_in_units(ops[1], dimensionless, no_act)
5714  # Set operand units
5715  for src_units_set, src_units in defn_units_set._get_sources(defn_units):
5716  expr = src_units_set.get_expression()
5717  self._set_element_in_units(expr, src_units, no_act)
5718  return
5719 

References CellMLToNektar.pycml.mathml_units_mixin._set_element_in_units().

◆ evaluate()

def CellMLToNektar.pycml.mathml_power.evaluate (   self)
Return the first operand to the power of the second.

Definition at line 5720 of file pycml.py.

5720  def evaluate(self):
5721  """Return the first operand to the power of the second."""
5722  app = self.xml_parent
5723  ops = list(app.operands())
5724  if len(ops) != 2:
5725  self.wrong_number_of_operands(len(ops), [2])
5726  return self.eval(ops[0]) ** self.eval(ops[1])
5727 

References CellMLToNektar.pycml.mathml.eval(), and CellMLToNektar.pycml.mathml_operator.wrong_number_of_operands().

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