Skip to content

Commit

Permalink
handle optional dependencies for composites (not tested)
Browse files Browse the repository at this point in the history
  • Loading branch information
djhoese committed Dec 2, 2015
1 parent ba6bdbf commit 8199641
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 16 deletions.
7 changes: 1 addition & 6 deletions mpop/composites/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,7 @@ def __init__(self, name, prerequisites=[], optional_prerequisites=[], metadata_r
kwargs["metadata_requirements"] = metadata_requirements
super(CompositeBase, self).__init__(**kwargs)

@property
def prerequisites(self):
# Semi-backward compatible
return self.info["prerequisites"]

def __call__(self, projectables, nonprojectables=None, **info):
def __call__(self, datasets, optional_datasets=None, **info):
raise NotImplementedError()


Expand Down
27 changes: 17 additions & 10 deletions mpop/scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,9 +308,10 @@ def read(self, dataset_keys, calibration=None, resolution=None, polarization=Non
needed_bands = set(dataset_ids)
while composites_needed:
for band in composites_needed.copy():
new_bands = set(reader_instance.get_dataset_key(prereq)
for prereq in self.compositors[band].prerequisites)
needed_bands |= new_bands
needed_bands |= set(reader_instance.get_dataset_key(prereq)
for prereq in self.compositors[band].info["prerequisites"])
needed_bands |= set(reader_instance.get_dataset_key(prereq)
for prereq in self.compositors[band].info["optional_prerequisites"])
composites_needed.remove(band)

# A composite might use a product from another reader, so only pass along the ones we know about
Expand Down Expand Up @@ -352,13 +353,19 @@ def compute(self, *requirements):
requirement_name = requirement.name
else:
requirement_name = requirement
# Compute any composites that this one depends on
self.compute(*self.compositors[requirement_name].prerequisites)

# TODO: Get non-projectable dependencies like moon illumination fraction
prereq_projectables = [self[prereq] for prereq in self.compositors[requirement_name].prerequisites]
compositor = self.compositors[requirement_name]
# Compute any composites that this one depends on
self.compute(*compositor.info["prerequisites"])
# Compute any composites that this composite might optionally depend on
if compositor.info["optional_prerequisites"]:
self.compute(*compositor.info["optional_prerequisites"])

prereq_datasets = [self[prereq] for prereq in compositor.info["prerequisites"]]
optional_datasets = [self[prereq] for prereq in compositor.info["optional_prerequisites"]
if prereq in self]
try:
comp_projectable = self.compositors[requirement_name](prereq_projectables, **self.info)
comp_projectable = compositor(prereq_datasets, optional_datasets=optional_datasets, **self.info)

# validate the composite projectable
assert("name" in comp_projectable.info)
Expand All @@ -382,9 +389,9 @@ def compute(self, *requirements):
self.wishlist.remove(requirement_name)
self.wishlist.add(band_id)
except IncompatibleAreas:
for ds_id, projectable in self.datasets.iteritems():
for ds_id, projectable in self.datasets.items():
# FIXME: Can compositors use wavelengths or only names?
if ds_id.name in self.compositors[requirement_name].prerequisites:
if ds_id.name in compositor.info["prerequisites"]:
projectable.info["keep"] = True

def unload(self):
Expand Down

0 comments on commit 8199641

Please sign in to comment.