Source code for smif.model.dependency

"""Dependencies represent the flow of data explicitly, with reference to the source model
output and sink model input.

A Dependency is an edge in the model process graph. No processing happens on dependency edges,
only on the Model nodes.

A Dependency can have a timestep specified - by default this is the current timestep, but a
system-of-systems model may also want to specify that data should be provided from the previous
timestep or a base timestep.
"""
from smif.metadata import RelativeTimestep


[docs]class Dependency(object): """Link a model input to a data source Arguments --------- source_model : smif.model.Model The source model object source : smif.metadata.Spec The source output description sink_model : smif.model.Model The sink model object sink : smif.metadata.Spec The sink input description timestep : smif.metadata.RelativeTimestep, optional The relative timestep of the dependency, defaults to CURRENT """ def __init__( self, source_model, source, sink_model, sink, timestep=RelativeTimestep.CURRENT ): # Insist on identical metadata - conversions must be explicit if source != sink: diff = "" if source.dtype != sink.dtype: diff += "dtype(%s!=%s) " % (source.dtype, sink.dtype) if source.dims != sink.dims: diff += "dims(%s!=%s) " % (source.dims, sink.dims) if source.coords != sink.coords: diff += "coords do not match " if source.unit != sink.unit: diff += "unit(%s!=%s) " % (source.unit, sink.unit) msg = ( "Dependencies must connect identical metadata (up to variable name). " + "Connecting %s:%s->%s:%s with mismatched %s" ) raise ValueError( msg % (source_model.name, source.name, sink_model.name, sink.name, diff) ) self.source_model = source_model self.source = source self.sink_model = sink_model self.sink = sink self.timestep = timestep
[docs] def as_dict(self): """Serialise to dictionary representation""" config = { "source": self.source_model.name, "source_output": self.source.name, "sink": self.sink_model.name, "sink_input": self.sink.name, } try: config["timestep"] = self.timestep.value except AttributeError: config["timestep"] = self.timestep return config
def __repr__(self): return "<Dependency({}, {}, {}, {}, {})>".format( self.source_model, self.source, self.sink_model, self.sink, self.timestep ) def __eq__(self, other): return ( self.source_model == other.source_model and self.source == other.source and self.sink_model == other.sink_model and self.sink == other.sink and self.timestep == other.timestep )