Metabor\Statemachine\Factory\TransitionSelector\WeightTransition::selectTransition PHP Method

selectTransition() public method

See also: MetaborStd\Statemachine\Factory\TransitionSelectorInterface::selectTransition()
public selectTransition ( Traversable $transitions )
$transitions Traversable
    public function selectTransition(\Traversable $transitions)
    {
        $bestTransitions = array();
        $bestWeight = null;
        foreach ($transitions as $transition) {
            if ($transition instanceof WeightedInterface) {
                $weight = $transition->getWeight();
                $diff = $weight - $bestWeight;
                if ($bestWeight === null || $diff >= $this->epsilon) {
                    $bestWeight = $weight;
                    $bestTransitions = array($transition);
                } elseif (abs($diff) < $this->epsilon) {
                    $bestTransitions[] = $transition;
                }
            }
        }
        return $this->innerSelector->selectTransition(new \ArrayIterator($bestTransitions));
    }

Usage Example

 /**
  *
  */
 public function testThrowsAnExceptionIfMoreThanOneTransitionHasHighestWeight()
 {
     $targetState = new State('TargetState');
     $transitions = array();
     $transition = new Transition($targetState);
     $transition->setWeight(0.001);
     $transitions[] = $transition;
     $transition = new Transition($targetState);
     $transition->setWeight(0.001);
     $transitions[] = $transition;
     $selector = new WeightTransition();
     $this->setExpectedException('\\RuntimeException');
     $selector->selectTransition(new \ArrayIterator($transitions));
 }