def __init__(self, dynamics, incoming_port_names): ActionVisitor.__init__(self, explicitly_require_action_overrides=True) # State Variables: self.state_variable_names = set() for regime in dynamics.regimes: for time_deriv in regime.time_derivatives: self.state_variable_names.add(time_deriv.dependent_variable) for transition in regime.transitions: for state_assignment in transition.state_assignments: self.state_variable_names.add(state_assignment.lhs) # Which symbols can we account for: alias_symbols = set(dynamics.aliases_map.keys()) self.accounted_for_symbols = set(itertools.chain( self.state_variable_names, alias_symbols, incoming_port_names, get_reserved_and_builtin_symbols() )) # Parameters: # Use visitation to collect all atoms that are not aliases and not # state variables self.free_atoms = set() self.input_event_port_names = set() self.output_event_port_names = set() self.visit(dynamics) self.free_atoms -= self.input_event_port_names self.free_atoms -= self.output_event_port_names self.parameter_names = self.free_atoms
def __init__(self, component): ComponentValidatorPerNamespace.__init__(self, explicitly_require_action_overrides=False) self.available_symbols = defaultdict(list) self.aliases = defaultdict(list) self.time_derivatives = defaultdict(list) self.state_assignments = defaultdict(list) self.visit(component) excludes = get_reserved_and_builtin_symbols() # Check Aliases: for ns, aliases in self.aliases.iteritems(): for alias in aliases: for rhs_atom in alias.rhs_atoms: if rhs_atom in excludes: continue if not rhs_atom in self.available_symbols[ns]: err = ('Unresolved Symbol in Alias: %s [%s]' % (rhs_atom, alias)) raise NineMLRuntimeError(err) # Check TimeDerivatives: for ns, timederivatives in self.time_derivatives.iteritems(): for timederivative in timederivatives: for rhs_atom in timederivative.rhs_atoms: if (not rhs_atom in self.available_symbols[ns] and not rhs_atom in excludes): err = ('Unresolved Symbol in Time Derivative: %s [%s]' % (rhs_atom, timederivative)) raise NineMLRuntimeError(err) # Check StateAssignments for ns, state_assignments in self.state_assignments.iteritems(): for state_assignment in state_assignments: for rhs_atom in state_assignment.rhs_atoms: if (not rhs_atom in self.available_symbols[ns] and not rhs_atom in excludes): err = ('Unresolved Symbol in Assignment: %s [%s]' % (rhs_atom, state_assignment)) raise NineMLRuntimeError(err)