Open ankostis opened 4 years ago
Another "too pruning" but more complex example is when a multi-output operation MUST NOT run, not to override a given intermediate input, but it MUST run, to provide other outputs.
In the diagram below, must run
is needed for e
but must not override overriden
.
def test_pruning_multiouts_not_override_intermediates():
# Test #25: v.1.2.4 overrides intermediate data when a previous operation
# must run for its other outputs (outputs asked or not)
netop = compose(name="netop")(
operation(name="must run", needs=["a"], provides=["overriden", "e"])
(lambda x: (x, 2 * x)),
operation(name="op1", needs=["overriden", "c"], provides=["d"])(add),
operation(name="op2", needs=["d", "e"], provides=["asked"])(lambda x, y: x * y),
)
# FAILs
# - on v1.2.4 with KeyError: 'e',
# - # - on #18(unsatisfied) + #23(ordered-sets) with empty result.
assert netop({"a": 5, "overriden": 1, "c": 2}, ["asked"]) == {"asked": 3}
# FAILs
# - on v1.2.4 with (overriden, asked) = (5, 70) instead of (1, 13)
# - # - on #18(unsatisfied) + #23(ordered-sets) like v1.2.4.
assert (
netop({"a": 5, "overriden": 1, "c": 2})
==
{"a": 5, "overriden": 1, "c": 2, "asked": 3})
Or this even simpler one:
def test_pruning_multiouts_not_override_intermediates1():
# Test #25: v.1.2.4 overrides intermediate data when a previous operation
# must run for its other outputs (outputs asked or not)
netop = compose(name="netop")(
operation(name="must run", needs=["a"], provides=["overriden", "calced"])
(lambda x: (x, 2 * x)),
operation(name="add", needs=["overriden", "calced"], provides=["asked"])(add),
)
netop.net.plot('t.png')
# FAILs
# - on v1.2.4 with KeyError: 'e',
# - on #18(unsatisfied) + #23(ordered-sets) with empty result.
assert netop({"a": 5, "overriden": 1, "c": 2}, ["asked"]) == {"asked": 3}
# FAILs
# - on v1.2.4 with (overriden, asked) = (5, 15) instead of (1, 1)
# - on #18(unsatisfied) + #23(ordered-sets) like v1.2.4.
assert (
netop({"a": 5, "overriden": 1})
==
{"a": 5, "overriden": 1, "calced": 10, "asked": 3})
In the following diagram, all data are given, and
asked
is different, depending on whether we expicitly ask it in the outputs:asked
output asked, it checksoverriden
is already given and dose not recompute it,Code to reproduce it:
Root cause:
Note that the pruning code in v1.2.4 is buggy (#24), so it cannot be used as is.