def __init__(self, scenario_file, perturb=False, gravity_dir=(-1,-1)):
        self.perturb = perturb
        self.gravity_dir = gravity_dir
        # create scenario
        self.width, self.height, self.immobile_objs, self.mobile_objs, self.manipulatable_obj, self.target_obj = loadScenario(
            scenario_file)
        self.scenario_file = scenario_file
        print 'solving scenario: ', scenario_file
        print 'gravity internal sim: ', gravity_dir

        self.evalReal = EvaluateQualiSol(scenario_file, gravity_dir)
        #self.evalReal = EvaluateQualiSol('./scenarios/mini2.json')
        #self.evalReal = EvaluateQualiSol('./scenarios/s2.json')
        self.objs_map = {}
        self.obj_min_angle_difference = {}
        self.first_real_sol = -1
        for obj in self.immobile_objs:
            if perturb:
                perturb_obj(obj)
            self.objs_map[obj['id']] = obj
            #self.obj_min_angle_difference[obj['id']] = [100,100]
            self.obj_min_angle_difference[obj['id']] = [100, 0]
        if perturb:
            sps(scenario_file, 5, self.immobile_objs)

        self.target_obj_id = self.target_obj['id']

        self.maxd = 3
        self.scenario = None
        self.qualitative_paths = {}
        self.qualitative_paths_actions = {}
        self.zones = []

        self.simulation_counter = 0
        self.round = 0
        quali_sim = qualitative_simulation(scenario_file)
        self.estimated_qualitative_paths = quali_sim.run()

        self.initial_zone = quali_sim.initial_zone
        self.graph = quali_sim.graph
        self.zones = quali_sim.zones
        self.zone_dic = {}
        self.zone_distance = {}
        for x in xrange(self.width):
            for y in xrange(self.height):
                self.zone_dic[(x, y)] = self.__find_zones(x, y)

        for i in xrange(len(self.zones) - 1):
            self.zone_distance[(i, i)] = 0
            for j in xrange(i + 1, len(self.zones)):
                distance = self.zones[i].distance(self.zones[j])
                self.zone_distance[(i, j)] = distance
                self.zone_distance[(j, i)] = distance
                self.zone_distance[(len(self.zones) - 1, len(self.zones) - 1)] = 0
    def __init__(self, scenario_file, gravity_dir=(-1, -1)):
        # self.evalPath = EVAL(scenario_file)
        self.gravity_dir = gravity_dir
        self.evalPath = EVAL(scenario_file, gravity_dir=gravity_dir)
        # create scenario
        self.sigma = -0.0001
        self.width, self.height, self.immobile_objs, self.mobile_objs, self.manipulatable_obj, self.target_obj = loadScenario(
            scenario_file
        )
        self.target_obj_id = self.target_obj["id"]
        self.maxd = 3
        self.qualitative_paths = {}
        self.qualitative_paths_actions = {}
        self.zones = []

        self.simulation_counter = 0

        quali_sim = qualitative_simulation(scenario_file)
        self.estimated_qualitative_paths = quali_sim.run()

        self.initial_zone = quali_sim.initial_zone
        self.graph = quali_sim.graph
        self.zones = quali_sim.zones
        self.zone_dic = {}
        self.zone_distance = {}
        for x in xrange(self.width):
            for y in xrange(self.height):
                self.zone_dic[(x, y)] = self.__find_zones(x, y)

        for i in xrange(len(self.zones) - 1):
            self.zone_distance[(i, i)] = 0
            for j in xrange(i + 1, len(self.zones)):
                distance = self.zones[i].distance(self.zones[j])
                self.zone_distance[(i, j)] = distance
                self.zone_distance[(j, i)] = distance
                self.zone_distance[(len(self.zones) - 1, len(self.zones) - 1)] = 0