def __init__(self, *args, **kwargs): """Regime constructor :param name: The name of the constructor. If none, then a name will be automatically generated. :param time_derivatives: A list of time derivatives, as either ``string``s (e.g 'dg/dt = g/gtau') or as |TimeDerivative| objects. :param transitions: A list containing either |OnEvent| or |OnCondition| objects, which will automatically be sorted into the appropriate classes automatically. :param *args: Any non-keyword arguments will be treated as time_derivatives. """ valid_kwargs = ('name', 'transitions', 'time_derivatives') for arg in kwargs: if not arg in valid_kwargs: err = 'Unexpected Arg: %s' % arg raise NineMLRuntimeError(err) transitions = kwargs.get('transitions', None) name = kwargs.get('name', None) kw_tds = nineml.utility.normalise_parameter_as_list(kwargs.get('time_derivatives', None)) time_derivatives = list(args) + kw_tds # Generate a name for unnamed regions: self._name = name.strip() if name else Regime.get_next_name() nineml.utility.ensure_valid_c_variable_name(self._name) # Un-named arguments are time_derivatives: time_derivatives = nineml.utility.normalise_parameter_as_list(time_derivatives) # time_derivatives.extend( args ) td_types = (basestring, TimeDerivative) td_type_dict = nineml.utility.filter_discrete_types(time_derivatives, td_types) td_from_str = [StrToExpr.time_derivative(o) for o in td_type_dict[basestring]] self._time_derivatives = td_type_dict[TimeDerivative] + td_from_str # Check for double definitions: td_dep_vars = [td.dependent_variable for td in self._time_derivatives] nineml.utility.assert_no_duplicates(td_dep_vars) # We support passing in 'transitions', which is a list of both OnEvents # and OnConditions. So, lets filter this by type and add them # appropriately: transitions = nineml.utility.normalise_parameter_as_list(transitions) f_dict = nineml.utility.filter_discrete_types(transitions, (OnEvent, OnCondition)) self._on_events = [] self._on_conditions = [] # Add all the OnEvents and OnConditions: for event in f_dict[OnEvent]: self.add_on_event(event) for condition in f_dict[OnCondition]: self.add_on_condition(condition)