eykd / owyl

A python behavior tree for implementing fast and flexible AI.
BSD 3-Clause "New" or "Revised" License
69 stars 16 forks source link

Sequences and selectors leak child values #3

Open eykd opened 9 years ago

eykd commented 9 years ago

The #2 PR appears to have dredged up a bunch of problems. In mucking around with parallel I've realized that sequence and selector leak child return values:

        tree = owyl.sequence(owyl.succeed(),
                             owyl.succeed(),
                             owyl.fail(),
                             owyl.succeed())
        v = owyl.visit(tree)

        results = [x for x in v if x is not None]
        self.assertEqual(results, [True, True, False, False])

See how the succeed()/succeed()/fail() leaks out to the results? The first three results are from the sequence children, while the 4th result is the sequence itself failing.

It's been a few years since I designed this library, but I can't think for the life of me why they would do that. Do any of you using owyl depend on this behavior?

Gaboose commented 9 years ago

The tests do:

def testVisitSequenceSuccess(self):
        """Can we visit a successful sequence?
        """
        tree = owyl.sequence(owyl.succeed(),
                             owyl.succeed(),
                             owyl.succeed())

        v = owyl.visit(tree)

        results = [x for x in v if x is not None]
        self.assertEqual(results, [True, True, True, True])

I thought this was what owyl.visit was supposed to do, because it visits each node :) I think I can say the Hanson Robotics folk don't depend on visit's yield values.