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 __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)
 

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