def generator(self, start_vertex, goal_connector, rg):
    oracle = self.oracle
    if USE_CONFIGURATION == CONFIGURATIONS.DYNAMIC:
      IMMEDIATE = True
    elif USE_CONFIGURATION == CONFIGURATIONS.FIXED_BRANCHING:
      IMMEDIATE = False

    start_config = start_vertex.substate['robot']
    object_name = goal_connector.condition.object_name
    start_pose = start_vertex.substate[object_name]
    goal_point = goal_connector.condition.point

    if not IMMEDIATE: yield
    if PRINT: print '%s-%s: %d'%(self.__class__.__name__, goal_connector.condition, 0)

    for trajectory in get_push_trajs(oracle, object_name, start_pose, goal_point, max_failures=INF):
      for push in trajectory:
        base_trajs = oracle.plan_base_roadmap(start_config, push.approach_config)
        if base_trajs is None: continue
        vertex1 = rg.vertex(Substate({object_name: push.start_pose}))
        vertex2 = rg.vertex(Substate({object_name: push.end_pose}))
        edge = rg.edge(MovePush(object_name, push, start_config, base_trajs, oracle))
        edge.intermediates.add(edge.connectors[0])
        if start_vertex.substate in edge.connectors[0].condition: start_vertex.connect(edge.connectors[0])
        vertex1.connect(edge.connectors[0]) # TODO - icky, give conditions names
        edge.connect(vertex2)
      else:
        vertex2.connect(goal_connector)
def push_script(oracle):
  body_name = 'blue_cylinder'
  body = oracle.get_body(body_name)

  start_pose = Pose(get_pose(body))
  goal_point = Point(get_point(body) + -.1*unit_x() + .8*unit_y())

  # trans1 = get_manip_trans(oracle) # Tip of gripper with strange orientation
  # trans2 = np.dot(get_manip_trans(oracle), np.linalg.inv(get_tool_trans(oracle))) # Gripper joint with good orientation
  # trans3 = np.dot(get_manip_trans(oracle), get_tool_trans(oracle)) # Nonsense
  # oracle.env.Remove(oracle.robot)
  # handle1 = draw_point(oracle.env, trans_transform_point(trans1, unit_point()), color=(1, 0, 0, .5))
  # handle2 = draw_point(oracle.env, trans_transform_point(trans2, unit_point()), color=(0, 1, 0, .5))
  # handle3 = draw_point(oracle.env, trans_transform_point(trans3, unit_point()), color=(0, 0, 1, .5))
  # raw_input()

  # direction = np.array((-1, 0, 0))
  # for contact in get_contacts(oracle, body_name, direction):
  #   print contact.contact_trans
  #   body_trans = object_trans_from_manip_trans(get_manip_trans(oracle), contact.contact_trans)
  #   set_trans(body, body_trans)
  #   handle = draw_point(oracle.env, trans_transform_point(body_trans, np.array([.1, 0, -.1])))
  #   print oracle.env.CheckCollision(oracle.robot, body)
  #   update_viewer()
  #   raw_input()

  # for push in linear_push_trajectory(oracle, body_name, start_pose, goal_point):
  #   print push
  #   configs = [
  #     push.approach_config,
  #     push.start_vector_config,
  #     push.start_contact_config,
  #     push.end_contact_config,
  #     push.end_vector_config,
  #     push.approach_config,
  #   ]
  #   oracle.set_pose(body_name, push.start_pose)
  #   for config in configs:
  #     oracle.set_robot_config(config)
  #     raw_input('Next?')
  #   oracle.set_pose(body_name, push.end_pose)
  #   print

  # for push in linear_push_trajectory(oracle, body_name, start_pose, goal_point):
  #   oracle.set_robot_config(push.start_contact_config)
  #   raw_input('Execute?')
  #   grab(oracle, body_name)
  #   execute_trajectories([push.push_traj])
  #   release(oracle, body_name)
  #   raw_input('Next?')

  for push in get_push_trajs(oracle, body_name, start_pose, goal_point):
    oracle.set_robot_config(push.approach_config)
    raw_input('Execute?')
    execute_trajectories(push.start_trajs)
    grab(oracle, body_name)
    execute_trajectories([push.push_traj])
    release(oracle, body_name)
    execute_trajectories(push.end_trajs)
    raw_input('Next?')