@Override
  public double weight(Observable observable) {

    // Shape/stack.
    if (!(observable instanceof Shape || observable instanceof Stack)) {
      return 0;
    }
    Position p1 = observable.referencePoint();

    // Landmarks.
    for (ObservableHypothesis hypothesis : landmarkDistribution) {
      Observable landmark = hypothesis.observable();
      double weight = hypothesis.weight();

      // Gripper / active position.
      if (landmark instanceof Gripper || landmark instanceof ActivePosition) {
        Position p2 = landmark.referencePoint();
        if (p1.x() == p2.x() && p1.y() == p2.y()) {
          return weight;
        }
        continue;
      }

      // Not supported.
      throw new RoboticException("%s below %s is not supported.", observable, landmark);
    }
    return 0;
  }
  @Override
  public DestinationDistribution destinations(PlannerContext context) {
    DestinationDistribution destinations = new DestinationDistribution(layout);
    for (ObservableHypothesis hypothesis : landmarkDistribution) {
      Observable landmark = hypothesis.observable();
      double weight = hypothesis.weight();

      // Gripper / active position.
      if (landmark instanceof Gripper || landmark instanceof ActivePosition) {
        destinations.add(
            new DestinationHypothesis(
                (context.simulator().dropPosition(landmark.referencePoint())), null, weight));
      }

      // Not supported.
      else {
        throw new RoboticException(
            "Below destination is not supported with landmark %s.", landmark);
      }
    }
    destinations.normalize();
    return destinations;
  }