Esempio n. 1
0
    def __init__(self, regimes=None, aliases=None, state_variables=None):
        """Dynamics object constructor

           :param aliases: A list of aliases, which must be either |Alias|
               objects or ``string``s.
           :param regimes: A list containing at least one |Regime| object.
           :param state_variables: An optional list of the state variables,
                which can either be |StateVariable| objects or `string` s. If
                provided, it must match the inferred state-variables from the
                regimes; if it is not provided it will be inferred
                automatically.
        """

        aliases = nineml.utility.normalise_parameter_as_list(aliases)
        regimes = nineml.utility.normalise_parameter_as_list(regimes)
        state_variables = nineml.utility.normalise_parameter_as_list(state_variables)

        # Load the aliases as objects or strings:
        from nineml.utility import filter_discrete_types
        alias_td = filter_discrete_types(aliases, (basestring, Alias))
        aliases_from_strs = [StrToExpr.alias(o) for o in alias_td[basestring]]
        aliases = alias_td[Alias] + aliases_from_strs

        # Load the state variables as objects or strings:
        sv_types = (basestring, StateVariable)
        sv_td = filter_discrete_types(state_variables, sv_types)
        sv_from_strings = [StateVariable(o) for o in sv_td[basestring]]
        state_variables = sv_td[StateVariable] + sv_from_strings

        self._regimes = regimes
        self._aliases = aliases
        self._state_variables = state_variables
Esempio n. 2
0
def expr_to_obj(s, name=None):
    """ Construct nineml objects from expressions """
    from util import StrToExpr

    # import re

    # Is our job already done?
    if isinstance(s, (RegimeElement)):
        return s

    # strip surrounding whitespace
    s = s.strip()

    # Do we have a alias?
    if StrToExpr.is_alias(s):
        return StrToExpr.alias(s)

    # re for an expression -> groups into lhs, op, rhs
    p_eqn = re.compile(
        r"(?P<lhs>[a-zA-Z_]+[a-zA-Z_0-9]*(/?[a-zA-Z_]+[a-zA-Z_0-9]*)?)\s*(?P<op>[+\-*/:]?=)\s*(?P<rhs>.*)")
    m = p_eqn.match(s)
    if not m:
        raise ValueError, "Not a valid nineml expression: %s" % s

    # get lhs, op, rhs
    lhs, op, rhs = [m.group(x) for x in ['lhs', 'op', 'rhs']]

    # do we have an TimeDerivative?
    # re for lhs for TimeDerivative
    p_ode_lhs = re.compile(r"(?:d)([a-zA-Z_]+[a-zA-Z_0-9]*)/(?:d)([a-zA-Z_]+[a-zA-Z_0-9]*)")
    m = p_ode_lhs.match(lhs)
    if m:
        if op != "=":
            raise ValueError, "TimeDerivative lhs, but op not '=' in %s" % s

        dep_var = m.group(1)
        indep_var = m.group(2)
        return TimeDerivative(dep_var, indep_var, rhs, name=name)

    # Do we have an Inplace op?
    # if op in Inplace.op_name_map.keys():
    #    return Inplace(lhs,op,rhs, name = name)

    # Do we have an assignment?
    if op == "=":
        return StateAssignment(lhs, rhs, name=name)

    # If we get here, what do we have?
    raise ValueError, "Cannot map expr '%s' to a nineml Expression" % s