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