np.set_printoptions(precision=3)
plt.rcParams.update({'font.size': 16})

prior_lambda = (1, 1, 1, 1, 1)
lambda_prior = np.array([special.digamma(prior_lambda[0]) - special.digamma(prior_lambda[4]),
                         special.digamma(prior_lambda[1]) - special.digamma(prior_lambda[4]),
                         special.digamma(prior_lambda[2]) - special.digamma(prior_lambda[4]),
                         special.digamma(prior_lambda[3]) - special.digamma(prior_lambda[4])]) #
lambda_prior_noise_diag = np.array([special.polygamma(1, prior_lambda[0]) + special.polygamma(1, prior_lambda[4]),
                                   special.polygamma(1, prior_lambda[1]) + special.polygamma(1, prior_lambda[4]),
                                   special.polygamma(1, prior_lambda[2]) + special.polygamma(1, prior_lambda[4]),
                                   special.polygamma(1, prior_lambda[3]) + special.polygamma(1, prior_lambda[4])])
lambda_prior_noise = gtsam.noiseModel.Diagonal.Variances(lambda_prior_noise_diag)

da_model = damodel.DAModel(camera_fov_angle_horizontal=opening_angle_rad, range_limit=measurement_radius_limit,
                           range_minimum=measurement_radius_minimum)
geo_model_noise_diag = np.array([0.00001, 0.00001, 30.001, 0.05, 0.05, 0.05])
geo_model_noise = gtsam.noiseModel.Diagonal.Variances(geo_model_noise_diag)
geo_model = geomodel_proj.GeoModel(geo_model_noise)
if Lambda_BSP_mode == 1:#TODO: PROGRAM IT IN AFTER JLP WORKS
    import clsmodel_real_lg4 as clsmodel_lg1
    cls_model = clsmodel_lg1.ClsModel('../exp_model_Book Jacket.pt',
                                           '../exp_model_Digital Clock.pt',
                                           '../exp_model_Packet.pt',
                                           '../exp_model_Pop Bottle.pt',
                                           '../exp_model_Soap Dispenser.pt',
                                           '../rinf_model_Book Jacket.pt',
                                           '../rinf_model_Digital Clock.pt',
                                           '../rinf_model_Packet.pt',
                                           '../rinf_model_Pop Bottle.pt',
                                           '../rinf_model_Soap Dispenser.pt')
Ejemplo n.º 2
0
def motion_primitive_planning(seed, Lambda_BSP_mode, reward_mode, cls_model, number_of_beliefs, random_objects=True):

    # Initializations ----------------------------------------------------
    sample_use_flag = True
    ML_planning_flag = False
    track_length = 20
    horizon = 5
    ML_update = True
    MCTS_flag = True
    MCTS_branches = 4
    cls_enable = True
    display_graphs = True
    measurement_radius_limit = 10
    measurement_radius_minimum = 0
    com_radius = 100000
    class_GT = {1: 1, 2: 1, 3: 2, 4: 2, 5: 1}#, 6: 2}#, 7: 1, 8: 1, 9: 2}#, 10: 1}
    np.random.seed(seed)
    measurements_enabler = True
    opening_angle = 60
    opening_angle_rad = opening_angle * math.pi / 180
    num_samp = 50
    CVaR_flag = True
    start_time = time.time()
    entropy_lower_limit = None

    # Set models ---------------------------------------------------------

    np.set_printoptions(precision=3)
    plt.rcParams.update({'font.size': 16})

    prior_lambda = (1, 1)
    lambda_prior = np.array([special.digamma(prior_lambda[0]) - special.digamma(prior_lambda[1])]) #
    lambda_prior_noise_diag = np.matrix(special.polygamma(1, prior_lambda[0]) + special.polygamma(1, prior_lambda[1]))
    lambda_prior_noise = gtsam.noiseModel.Diagonal.Variances(lambda_prior_noise_diag)

    da_model = damodel.DAModel(camera_fov_angle_horizontal=opening_angle_rad, range_limit=measurement_radius_limit,
                               range_minimum=measurement_radius_minimum)
    geo_model_noise_diag = np.array([0.00001, 0.00001, 0.001, 0.0001, 0.0001, 0.001])
    geo_model_noise = gtsam.noiseModel.Diagonal.Variances(geo_model_noise_diag)
    geo_model = geomodel_proj.GeoModel(geo_model_noise)
    # DEFINE GROUND TRUTH -------------------------------------------------

    # Objects
    GT_objects = list()
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([0.0, -2.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-math.pi/2, 0.0, 0.0), np.array([1.0, 2.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(math.pi/2, 0.0, 0.0), np.array([-2.5, 3.5, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3*math.pi/4, 0.0, 0.0), np.array([1.0, 4.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-6.0, -3.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(math.pi/4, 0.0, 0.0), np.array([3.0, -2.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3*math.pi/2, 0.0, 0.0), np.array([1.5,-6.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(math.pi, 0.0, 0.0), np.array([-1.0, -4.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-math.pi, 0.0, 0.0 / 2), np.array([-1.5, -1.0, 0.0])))
    # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(3.141, 0.0, 0.0), np.array([-6.5, 1.0, 0.0])))

    if random_objects is False:

        # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([2.5, -4.0, 0.0])))
        # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(3.141/2, 0.0, 0.0), np.array([4, -7.0, 0.0])))
        # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3.141/2, 0.0, 0.0), np.array([4.5, -1.0, 0.0])))
        GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3.141 / 4, 0.0, 0.0), np.array([1.0, -4.0, 0.0])))
        # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(0*3.141, 0.0, 0.0), np.array([7.5, 4.0, 0.0])))
        GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3.141 / 4, 0.0, 0.0), np.array([2, -2, 0.0])))
        GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3.141 / 2, 0.0, 0.0), np.array([8.5, 4.7, 0.0])))
        GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-3.141 / 4, 0.0, 0.0), np.array([11.5, 1.0, 0.0])))
        GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-2 * 3.141 / 4, 0.0, 0.0), np.array([12, -6.5, 0.0])))
        # GT_objects.append(gtsam.Pose3(gtsam.Rot3.Ypr(-2*3.141/4, 0.0, 0.0), np.array([14.5, 2.7, 0.0])))

    elif random_objects is True:
        for idx in range(len(class_GT)):
            GT_objects.append(gtsam.Pose3(gtsam.Pose2(np.random.uniform(0, 10, 1),
                                                      np.random.uniform(-8, 8, 1),
                                                      np.random.uniform(-3.141, 3.141, 1))))


    # Init poses
    Init_poses = list()
    Init_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-8.0, 0.2, 0.0])))
    Init_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-8.0, 0.1, 0.0])))
    Init_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-8.0, -0.1, 0.0])))
    Init_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-8.0, -0.3, 0.0])))
    Init_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-8.0, -0.4, 0.0])))
    Init_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([-8.0, -0.5, 0.0])))


    # Robot poses
    GT_poses = list()
    GT_poses.append(gtsam.Pose3(gtsam.Rot3.Ypr(-0*math.pi/2, 0.0, 0.0), np.array([-4.0, 0.0, 0.0])))

    # DEFINE ACTION PRIMITIVES ----------------------------------------------

    stride_length = 1.0
    motion_primitives = list()
    motion_primitives.append(gtsam.Pose3(gtsam.Rot3.Ypr(-0.00, 0.0, 0.0), np.array([stride_length, 0.0, 0.0])))
    motion_primitives.append(gtsam.Pose3(gtsam.Rot3.Ypr(+math.pi/4, 0.0, 0.0), np.array([stride_length, stride_length, 0.0])))
    motion_primitives.append(gtsam.Pose3(gtsam.Rot3.Ypr(-math.pi/4, 0.0, 0.0), np.array([stride_length, -stride_length, 0.0])))
    motion_primitives.append(gtsam.Pose3(gtsam.Rot3.Ypr(+math.pi/2, 0.0, 0.0), np.array([0.0, stride_length, 0.0])))
    motion_primitives.append(gtsam.Pose3(gtsam.Rot3.Ypr(-math.pi/2, 0.0, 0.0), np.array([0.0, -stride_length, 0.0])))

    #------------------------------------------------ PRIORS

    # Robot priors
    #prior = gtsam.Pose3(gtsam.Rot3.Ypr(0.0, 0.0, 0.0), np.array([0.0, 0.0, 0.0]))
    prior = GT_poses[0]
    prior_noise_diag = np.array([00.000001, 0.000001, 0.0000038, 00.00002, 00.0000202, 0.000001])
    prior_noise = gtsam.noiseModel.Diagonal.Variances(prior_noise_diag)
    prior_noise_cov = np.diag(prior_noise_diag)

    # Create belief based on the switch
    if Lambda_BSP_mode == 1:

        belief_list = list()
        lambda_planner_list = list()

        for idx in range(number_of_beliefs):
            # cls_prior_rand_0 = np.random.dirichlet(prior_lambda)
            cls_prior_rand_0_lg = np.random.multivariate_normal(lambda_prior, lambda_prior_noise_diag)
            cls_prior_rand_0_con = np.exp(cls_prior_rand_0_lg) / (1 + np.sum(np.exp(cls_prior_rand_0_lg)))
            cls_prior_rand_0 = np.concatenate((cls_prior_rand_0_con, 1 /
                                               (1 + np.sum(np.exp(cls_prior_rand_0_lg)))), axis=None)
            cls_prior_rand = cls_prior_rand_0.tolist()


            belief_list.append(
                HybridBelief(2, geo_model, da_model, cls_model, cls_prior_rand, GT_poses[0],
                             prior_noise,
                             cls_enable=cls_enable, pruning_threshold=250, ML_update=ML_update))

        lambda_belief = LambdaBelief(belief_list)
        lambda_planner = LambdaPlannerPrimitives(lambda_belief)

    if Lambda_BSP_mode == 2:

        lambda_belief = gaussianb_jlp.JLPBelief(geo_model, da_model, cls_model, GT_poses[0], prior_noise,
                                                              lambda_prior_mean=lambda_prior,
                                                              lambda_prior_noise=lambda_prior_noise_diag,
                                                              cls_enable=cls_enable)
        lambda_planner = JLPPLannerPrimitives(lambda_belief, entropy_lower_limit=entropy_lower_limit)

    # Plot all the GT sequences
    # fig = plt.figure(0)
    # ax = fig.gca()
    # plotterdaac2d.GT_plotter_line(GT_poses, GT_objects, color=(0.8, 0.4, 0.4),
    #                               limitx=[-10, 7], limity=[-8, 8], show_plot=False, ax=ax,
    #                               start_pose=GT_poses[0])
    # ax.set_xlabel('X axis [m]')
    # ax.set_ylabel('Y axis [m]')
    # plt.tight_layout()
    # plt.show()

    # SEMANTIC MEASUREMENT GENERATION FUNCTION-----------------------------------------------------

    def sem_measurements_generator(relative_pose, no_noise=False):

        radius = np.sqrt(relative_pose.x()**2 + relative_pose.y()**2)
        psi = np.arctan2(relative_pose.y(), relative_pose.x())
        theta = np.arctan2(-relative_pose.z(), radius)

        K = 2
        Alpha = 0.5

        R = K * (0.7 + 0.3 * np.cos(psi + theta))
        Sigma = 1 / R ** 2

        f = Alpha * np.cos(2 * psi + 2 * theta) + Alpha

        sem_gen = -1

        if no_noise is False:
            sem_gen = np.random.normal(f, Sigma)
        else:
            sem_gen = f

        sem_gen_vector = [ np.exp(sem_gen) / (1 + np.exp(sem_gen)), 1 / (1 + np.exp(sem_gen))]

        return sem_gen_vector


    def sem_measurements_generator_2(relative_pose, no_noise=False):

        radius = np.sqrt(relative_pose.x()**2 + relative_pose.y()**2)
        psi = np.arctan2(relative_pose.y(), relative_pose.x())
        theta = np.arctan2(-relative_pose.z(), radius)

        K = 2
        Alpha = -0.5

        R = K * (0.7 + 0.3 * np.cos(psi + theta))
        Sigma = 1 / R ** 2

        f = Alpha * np.cos(2 * psi + 2 * theta) + Alpha

        sem_gen = -1

        if no_noise is False:
            sem_gen = np.random.normal(f, Sigma)
        else:
            sem_gen = f

        sem_gen_vector = [ np.exp(sem_gen) / (1 + np.exp(sem_gen)), 1 / (1 + np.exp(sem_gen))]

        return sem_gen_vector


    # GEOMETRIC MEASUREMENT GENERATOR -------------------------------------------------------------------

    def geo_measurement_generator(relative_pose, meas_cov, no_noise=False):

        # Break down pose to components
        pose_pos = [relative_pose.x(), relative_pose.y(), relative_pose.z()]
        pose_rot = relative_pose.rotation().rpy()

        #
        pose_total = np.concatenate((pose_rot, pose_pos))

        # Create the pose
        if no_noise is False:
            pose_sample = np.random.multivariate_normal(pose_total, meas_cov)
        else:
            pose_sample = pose_total

        # Transfer to pose3
        pose_generated = gtsam.Pose3(gtsam.Rot3.Ypr(pose_sample[2], pose_sample[1], pose_sample[0]),
                                         np.array([pose_sample[3], pose_sample[4], pose_sample[5]]))

        return pose_generated

    # ACTION GENERATOR

    def action_generator(action, action_noise_diag, no_noise=False):
        """

        :type action: gtsam.Pose3
        """
        action_noise = np.diag(action_noise_diag)
        action_rotation = action.rotation().rpy()
        action_vector = np.array([action_rotation[2], action_rotation[1], action_rotation[0],
                                  action.x(), action.y(), action.z()])
        generated_action = np.random.multivariate_normal(action_vector, action_noise)
        generated_action_pose = gtsam.Pose3(gtsam.Rot3.Ypr(generated_action[0], generated_action[1], generated_action[2]),
                                            np.array([generated_action[3], generated_action[4], generated_action[5]]))
        if no_noise is False:
            return generated_action_pose
        else:
            return action

    def lambda_entropy_individual_numeric(exp, covariance, number_of_samples=100):

        entropy = 0
        for idx in range(number_of_samples):

            sample = np.random.multivariate_normal(exp, covariance)
            sample_aug = np.concatenate((sample, 0), axis=None)
            sample_cpv = np.exp(sample_aug)/(np.sum(np.exp(sample_aug)))
            log_pdf_value = np.log(stats.multivariate_normal.pdf(sample, exp, covariance)) - \
                        np.sum(np.log(sample_cpv))
            entropy -= log_pdf_value / number_of_samples

        return entropy


    prior_entropy = lambda_entropy_individual_numeric(lambda_prior, lambda_prior_noise_diag)

    # INFERENCE
    action_noise_diag = np.array([0.0003, 0.0003, 0.0001, 0.0003, 0.00030, 0.001])
    action_noise = gtsam.noiseModel.Diagonal.Variances(action_noise_diag)

    reward_collections = list()
    chosen_action_list = list()
    current_entropy_list = list()
    current_entropy_list.append(0)
    sigma_list = list()
    sigma_list.append(0)
    time_list = list()
    time_list.append(0)
    MSDE = list()
    MSDE.append(1/4)

    #for sequence_idx in range(track_length):
    for idx in range(track_length):

        step_time = time.time()

        # action, reward = lambda_planner.planning_session(action_noise, np.diag(geo_model_noise_diag), horizon=horizon, reward_print=True,
        #                                                  enable_MCTS=MCTS_flag, MCTS_braches_per_action=MCTS_branches,
        #                                                  ML_planning=ML_planning_flag, sample_use_flag=sample_use_flag,
        #                                                  reward_mode=reward_mode, motion_primitives=motion_primitives)
        # action = motion_primitives[0]

        if idx < 5:
            action = gtsam.Pose3(gtsam.Pose2(1.0, 0.0, -np.pi / 16))

        elif idx < 15:
            action = gtsam.Pose3(gtsam.Pose2(1.0, 0.0, np.pi / 16))

        else:
            action = gtsam.Pose3(gtsam.Pose2(1.0, 0.0, -np.pi / 16))

        chosen_action_list.append(action)


        # action = motion_primitives[0]
        print('----------------------------------------------------------------------------')
        print('Action:\n' + str(action))
        # print('Reward: ' + str(reward))
        GT_poses.append(GT_poses[idx].compose(action))
        action_generated = action_generator(action, action_noise_diag, no_noise=True)
        print('idx ' + str(idx))
        lambda_belief.action_step(action_generated, action_noise) #TODO: see if belief within the planner is update

        # Defining opening angle
        geo_measurements = list()
        sem_measurements = list()
        for lambda_real in range(num_samp):
            sem_measurements.append(list())
        GT_DA = list()

        # Generate measurements and forward the beliefs
        for j in range(len(GT_objects)):

            # Check if the object is seen
            xy_angle = np.arctan2(GT_objects[j].y() - GT_poses[idx + 1].y(),
                                  GT_objects[j].x() - GT_poses[idx + 1].x())
            angles = GT_poses[idx + 1].rotation().matrix()
            psi = np.arctan2(angles[1, 0], angles[0, 0])
            geo_part = GT_poses[idx + 1].between(GT_objects[j])
            geo_radius = np.sqrt(geo_part.x() ** 2 + geo_part.y() ** 2 + geo_part.z() ** 2)

            # if np.abs(xy_angle - psi) <= opening_angle_rad and geo_radius <= measurement_radius_limit and \
            #         geo_radius >= measurement_radius_minimum:

            if da_model.object_observation_3d(GT_poses[idx + 1], GT_objects[j]) is 1:

                GT_DA.append(j + 1)

                geo_cov = np.diag(geo_model_noise_diag)
                meas_relative_pose = geo_measurement_generator(geo_part, geo_cov, no_noise=False)

                geo_measurements.append(meas_relative_pose)
                # print(geo_measurements)

                for lambda_real in range(num_samp):

                    if class_GT[j + 1] == 2:
                        sem_part = sem_measurements_generator_2(GT_objects[j].between(GT_poses[idx + 1]),
                                                                no_noise=False)
                        #print('Object: ' + str(j + 1) + ',sem: ' + str(sem_part) + ',robot ' + robot_id + ',Class 2')
                    else:
                        sem_part = sem_measurements_generator(GT_objects[j].between(GT_poses[idx + 1]),
                                                              no_noise=False)

                    sem_measurements[lambda_real].append(sem_part)  # GENERATED




        # -------------------------------###
        if Lambda_BSP_mode == 1:
            lambda_belief.add_measurements(geo_measurements, sem_measurements, da_current_step=GT_DA,
                                                              number_of_samples=num_samp, new_input_object_prior=None,
                                                              new_input_object_covariance=None)

        # -------------------------------###
        if Lambda_BSP_mode == 2:

            sem_measurements_exp = list()
            sem_measurements_cov = list()

            obj_idx_running = 0
            # Go over all objects
            for obj_idx in GT_DA:

                obj_data = np.zeros((num_samp, len(prior_lambda)))
                for b_idx in range(num_samp):
                    obj_data[b_idx, :] = sem_measurements[b_idx][obj_idx_running]
                #obj_data = np.array(sem_measurements[obj_idx - 1])
                obj_data_logit = np.array(np.log(obj_data[:, 0] / obj_data[:, 1]))

                sem_measurements_exp.append([np.sum(obj_data_logit, axis=0) / num_samp])
                sem_measurements_cov.append(np.matrix(np.dot(np.transpose(obj_data_logit - sem_measurements_exp[-1]),
                                                      obj_data_logit - sem_measurements_exp[-1]) / (num_samp - 1)))
                obj_idx_running += 1

            lambda_belief.add_measurements(geo_measurements, sem_measurements_exp, sem_measurements_cov,
                                                              GT_DA)

        lambda_belief.print_lambda_lg_params()

        entropy_collector = 0
        sigma_collector = 0
        if Lambda_BSP_mode == 1:

            for belief in lambda_belief.belief_list:
                object_list = belief.obj_realization
                break

            for obj in object_list:
                entropy_collector -= lambda_belief.entropy(obj)
                sigma_collector += 2 * np.sqrt(lambda_belief.lambda_covariance(obj)[0, 0]) / len(object_list)

        if Lambda_BSP_mode == 2:

            for obj in lambda_belief.object_lambda_dict:
                entropy_collector -= lambda_belief.\
                    lambda_entropy_individual_numeric(lambda_belief.object_lambda_dict[obj])
                sigma_collector += 2 * np.sqrt(lambda_belief.
                                               lambda_covariance_numeric(
                    lambda_belief.object_lambda_dict[obj])[0, 0]) / len(lambda_belief.object_lambda_dict)

        current_entropy_list.append(entropy_collector)
        MSDE.append(lambda_belief.MSDE_expectation(class_GT))
        sigma_list.append(sigma_collector)

        time_list.append(time.time() - step_time)

    print(chosen_action_list)

    return current_entropy_list, MSDE, sigma_list, time.time() - start_time, time_list
Ejemplo n.º 3
0
display_graphs = False
measurement_radius_limit = 7
com_radius = 10
class_GT = {1: 1, 2: 2, 3: 1, 4: 1, 5: 1, 6: 2, 7: 1, 8: 1}
GT_cls_realization = ((1, 1), (2, 2), (3, 1), (4, 1), (5, 1), (6, 2), (7, 1),
                      (8, 1))
np.random.seed(3)
measurements_enabler = True

# Set models ---------------------------------------------------------

np.set_printoptions(precision=3)
plt.rcParams.update({'font.size': 16})

cls_prior = np.array([0.5, 0.5])
da_model = damodel.DAModel()
geo_model_noise_diag = np.array([0.00001, 0.00001, 0.01, 0.1, 0.1, 0.00001])
geo_model_noise = gtsam.noiseModel.Diagonal.Variances(geo_model_noise_diag)
geo_model = geomodel_proj.GeoModel(geo_model_noise)
cls_model = clsmodel.ClsModel()

# DEFINE GROUND TRUTH -------------------------------------------------

# Objects
GT_objects = list()
GT_objects.append(
    gtsam.Pose3(gtsam.Rot3.Ypr(3 * math.pi / 8, 0.0, 0.0),
                np.array([0.0, -2.0, 0.0])))
GT_objects.append(
    gtsam.Pose3(gtsam.Rot3.Ypr(math.pi / 2, 0.0, 0.0),
                np.array([1.0, 2.0, 0.0])))
Ejemplo n.º 4
0
def motion_primitive_planning(seed,
                              Lambda_BSP_mode,
                              reward_mode,
                              cls_model,
                              number_of_beliefs,
                              random_objects=True,
                              use_bounds=False,
                              plt_ax=None,
                              bar_ax=None,
                              initial_image='000510000250101.jpg'):

    ## --------------- PRLIMINARIES: NETWORK AND SCENARIO SETUP

    # Find the corresponding depth image to the jpg
    def depth_image_find(image_address):

        depth_address = image_address[0:-5]
        depth_address += '3.png'
        return depth_address

    # Load json file
    actions = [
        'forward', 'rotate_cw', 'rotate_ccw', 'backward', 'left', 'right'
    ]
    # action_sequence = ['forward', 'forward', 'forward', 'rotate_cw', 'rotate_cw', 'rotate_cw', 'rotate_cw',
    #                    'rotate_cw', 'rotate_cw', 'forward', 'rotate_cw', 'forward', 'forward', 'forward', 'forward',
    #                    'forward', 'rotate_cw', 'rotate_cw', 'rotate_cw', 'rotate_cw']

    scenario_file = open('home_005_data/annotations.json')
    scenario_data = json.load(scenario_file)

    classification_file = open('home_005_data/classification_data_vgg.json')
    classification_data = json.load(classification_file)

    #------------------------------------- EXTRACT GROUND TRUTH

    detailed_GT_file = scipy.io.loadmat('home_005_data/image_structs.mat')

    GT_pose = dict()
    x_pos = list()
    y_pos = list()
    z_pos = list()

    for location in detailed_GT_file['image_structs']['world_pos'][0]:
        x_pos.append(float(location[0]))
        y_pos.append(float(location[2]))
        z_pos.append(float(location[1]))

    psi = list()
    theta = list()
    for rotation in detailed_GT_file['image_structs']['direction'][0]:
        psi.append(math.atan2(rotation[2], rotation[0]) * 180 / np.pi)
        theta.append(
            math.atan2(rotation[1], np.sqrt(rotation[2]**2 + rotation[0]**2)) *
            180 / np.pi)

    idx = int(0)
    for name in detailed_GT_file['image_structs']['image_name'][0]:
        GT_pose[name[0]] = gtsam.Pose3(
            gtsam.Rot3.Ypr(psi[idx] * np.pi / 180,
                           theta[idx] * np.pi / 180, 0.0),
            np.array([x_pos[idx], y_pos[idx], z_pos[idx]]))
        idx += 1

    scenario_file.close()
    classification_file.close()

    # Initializations ----------------------------------------------------
    conf_flag = False
    sample_use_flag = True
    ML_planning_flag = True
    track_length = 20
    horizon = 1
    ML_update = True
    MCTS_flag = True
    MCTS_branches = 3
    cls_enable = True
    display_graphs = True
    measurement_radius_limit = 10
    measurement_radius_minimum = 0
    com_radius = 100000
    # class_GT = {1: 1, 2: 1, 3: 2, 4: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 2}#, 10: 1}
    # GT_cls_realization = ((1, 1), (2, 2), (3, 1), (4, 1), (5, 1), (6, 2), (7, 1), (8, 1))
    np.random.seed(seed)
    measurements_enabler = True
    opening_angle = 50
    opening_angle_rad = opening_angle * math.pi / 180
    num_samp = 50
    CVaR_flag = True
    start_time = time.time()
    entropy_lower_limit = -500
    random_object_location_flag = False

    # Set models ---------------------------------------------------------

    np.set_printoptions(precision=3)
    plt.rcParams.update({'font.size': 16})

    prior_lambda = (1, 1, 1, 1, 1)
    lambda_prior = np.array([
        special.digamma(prior_lambda[0]) - special.digamma(prior_lambda[4]),
        special.digamma(prior_lambda[1]) - special.digamma(prior_lambda[4]),
        special.digamma(prior_lambda[2]) - special.digamma(prior_lambda[4]),
        special.digamma(prior_lambda[3]) - special.digamma(prior_lambda[4])
    ])  #
    lambda_prior_noise_diag = np.array([
        special.polygamma(1, prior_lambda[0]) +
        special.polygamma(1, prior_lambda[4]),
        special.polygamma(1, prior_lambda[1]) +
        special.polygamma(1, prior_lambda[4]),
        special.polygamma(1, prior_lambda[2]) +
        special.polygamma(1, prior_lambda[4]),
        special.polygamma(1, prior_lambda[3]) +
        special.polygamma(1, prior_lambda[4])
    ])
    lambda_prior_noise = gtsam.noiseModel.Diagonal.Variances(
        lambda_prior_noise_diag)

    da_model = damodel.DAModel(camera_fov_angle_horizontal=opening_angle_rad,
                               range_limit=measurement_radius_limit,
                               range_minimum=measurement_radius_minimum)
    geo_model_noise_diag = np.array(
        [0.00001, 0.00001, 30.001, 0.05, 0.05, 0.05])
    geo_model_noise = gtsam.noiseModel.Diagonal.Variances(geo_model_noise_diag)
    geo_model = geomodel_proj.GeoModel(geo_model_noise)

    # Robot poses GT
    current_image = initial_image

    GT_poses = list()
    GT_poses.append(GT_pose[initial_image])

    #------------------------------------------------ PRIORS

    prior = GT_poses[0]
    prior_noise_diag = np.array(
        [00.000001, 0.000001, 0.0000038, 00.00002, 00.0000202, 0.000001])
    prior_noise = gtsam.noiseModel.Diagonal.Variances(prior_noise_diag)
    prior_noise_cov = np.diag(prior_noise_diag)

    # Create belief based on the switch
    if Lambda_BSP_mode == 1:  #TODO: complete this side

        belief_list = list()
        lambda_planner_list = list()

        for idx in range(number_of_beliefs):
            # cls_prior_rand_0 = np.random.dirichlet(prior_lambda)
            cls_prior_rand_0_lg = np.random.multivariate_normal(
                lambda_prior, np.diag(lambda_prior_noise_diag))
            cls_prior_rand_0_con = np.exp(cls_prior_rand_0_lg) / (
                1 + np.sum(np.exp(cls_prior_rand_0_lg)))
            cls_prior_rand_0 = np.concatenate(
                (cls_prior_rand_0_con, 1 /
                 (1 + np.sum(np.exp(cls_prior_rand_0_lg)))),
                axis=None)
            cls_prior_rand = cls_prior_rand_0.tolist()

            belief_list.append(
                HybridBelief(5,
                             geo_model,
                             da_model,
                             cls_model,
                             cls_prior_rand,
                             GT_poses[0],
                             prior_noise,
                             cls_enable=cls_enable,
                             pruning_threshold=3.5,
                             ML_update=ML_update))

        lambda_belief = LambdaBelief(belief_list)
        lambda_planner = LambdaPlannerPrimitives(
            lambda_belief,
            entropy_lower_limit=entropy_lower_limit,
            AVD_mapping=scenario_data,
            AVD_poses=GT_pose)

    if Lambda_BSP_mode == 2:

        lambda_belief = gaussianb_jlp.JLPBelief(
            geo_model,
            da_model,
            cls_model,
            GT_poses[0],
            prior_noise,
            lambda_prior_mean=lambda_prior,
            lambda_prior_noise=np.diag(lambda_prior_noise_diag),
            cls_enable=cls_enable)
        lambda_planner = JLPPLannerPrimitives(
            lambda_belief,
            entropy_lower_limit=entropy_lower_limit,
            AVD_mapping=scenario_data,
            AVD_poses=GT_pose)

    # ACTION GENERATOR

    def action_generator(action, action_noise_diag, no_noise=False):
        """

        :type action: gtsam.Pose3
        """
        action_noise = np.diag(action_noise_diag)
        action_rotation = action.rotation().rpy()
        action_vector = np.array([
            action_rotation[2], action_rotation[1], action_rotation[0],
            action.x(),
            action.y(),
            action.z()
        ])
        generated_action = np.random.multivariate_normal(
            action_vector, action_noise)
        generated_action_pose = gtsam.Pose3(
            gtsam.Rot3.Ypr(generated_action[0], generated_action[1],
                           generated_action[2]),
            np.array([
                generated_action[3], generated_action[4], generated_action[5]
            ]))
        if no_noise is False:
            return generated_action_pose
        else:
            return action

    def lambda_entropy_individual_numeric(exp,
                                          covariance,
                                          number_of_samples=100):

        entropy = 0
        for idx in range(number_of_samples):

            sample = np.random.multivariate_normal(exp, covariance)
            sample_aug = np.concatenate((sample, 0), axis=None)
            sample_cpv = np.exp(sample_aug) / (np.sum(np.exp(sample_aug)))
            log_pdf_value = np.log(stats.multivariate_normal.pdf(sample, exp, covariance)) - \
                        np.sum(np.log(sample_cpv))
            entropy -= log_pdf_value / number_of_samples

        return entropy

    prior_entropy = lambda_entropy_individual_numeric(
        lambda_prior, np.diag(lambda_prior_noise_diag))

    # INFERENCE
    action_noise_diag = np.array(
        [0.0003, 0.0003, 0.0001, 0.0003, 0.00030, 0.001])
    action_noise = gtsam.noiseModel.Diagonal.Variances(action_noise_diag)

    class_GT = {
        15: 2,
        4: 3,
        14: 2,
        3: 2,
        17: 3,
        19: 2,
        20: 2,
        23: 5,
        29: 2,
        2: 2,
        5: 2
    }
    bars_list_of_objects = [15, 4, 14, 3, 17, 19, 23, 20, 29, 2, 10, 2, 5]

    reward_collections = list()
    chosen_action_list = list()
    current_entropy_list = list()
    current_entropy_list.append(0)
    current_R2_list = list()
    current_R2_list.append(-len(class_GT) * np.log(0.5))
    sigma_list = list()
    sigma_list.append(0)
    time_list = list()
    time_list.append(0)
    MSDE = list()
    MSDE.append(4 / 25)
    current_entropy_list_per_object = dict()
    current_MSDE_list_per_object = dict()
    for obj in class_GT:
        current_entropy_list_per_object[obj] = list()
        current_entropy_list_per_object[obj].append(0)
        current_MSDE_list_per_object[obj] = list()
        current_MSDE_list_per_object[obj].append(4 / 25)
    MSDE_per_object = list()
    sigma_list = list()

    #for sequence_idx in range(track_length):
    for idx in range(track_length):

        step_time = time.time()

        # action_name, reward = lambda_planner.planning_session(action_noise, np.diag(geo_model_noise_diag), horizon=horizon,
        #                                                  reward_print=True,
        #                                                  enable_MCTS=MCTS_flag, MCTS_braches_per_action=MCTS_branches,
        #                                                  ML_planning=ML_planning_flag, sample_use_flag=sample_use_flag,
        #                                                  reward_mode=reward_mode, return_index_flag=True,
        #                                                  number_of_samples=number_of_beliefs,
        #                                                  use_lower_bound=use_bounds,
        #                                                  current_location_name=current_image)

        #action_name = action_sequence[idx]
        if scenario_data[current_image]['forward'] != '':
            action_name = 'forward'
        else:
            action_name = 'rotate_ccw'

        action = GT_pose[current_image].between(
            GT_pose[scenario_data[current_image][action_name]])
        action = action_generator(action, action_noise_diag, no_noise=True)

        # action = motion_primitives[0]
        print(
            '----------------------------------------------------------------------------'
        )
        print('Action:\n' + action_name)
        print('idx ' + str(idx))
        GT_poses.append(GT_poses[idx].compose(action))
        lambda_belief.action_step(action, action_noise)
        current_image = scenario_data[current_image][action_name]

        # Create the ground truth data association
        GT_DA = list()
        geo_measurements = list()
        sem_measurements = list()
        sem_measurements_exp = list()
        sem_measurements_cov = list()
        idx_range = 0
        for angle in classification_data[current_image]['Angles']:
            if classification_data[current_image]['Range'][
                    idx_range] != 0 and classification_data[current_image][
                        'DA'][idx_range][
                            0] != 10:  #TODO:SECOND TEMPORARY CONDITION
                GT_DA.append(
                    classification_data[current_image]['DA'][idx_range][0])
                # geo_measurements.append([angle[0], angle[1], classification_data[current_image]['Range'][idx_range]])
                geo_measurements.append([
                    angle[0], -0.0,
                    classification_data[current_image]['Range'][idx_range]
                ])

                if Lambda_BSP_mode == 1:
                    sem_measurements.append(
                        classification_data[current_image]['CPV'][idx_range]
                    )  #TODO: If MH needs more than 1 measurement change it

                if Lambda_BSP_mode == 2:
                    sem_measurements_exp.append(
                        np.array(classification_data[current_image]
                                 ['LG expectation'][idx_range]))
                    sem_measurements_cov.append(
                        cls_model.unflatten_cov(
                            np.array(classification_data[current_image]
                                     ['LG covariance'][idx_range])))

            idx_range += 1

        sem_measurements = [sem_measurements]

        if Lambda_BSP_mode == 1:
            lambda_belief.add_measurements(geo_measurements,
                                           sem_measurements,
                                           da_current_step=GT_DA,
                                           number_of_samples=num_samp,
                                           new_input_object_prior=None,
                                           new_input_object_covariance=None)

        if Lambda_BSP_mode == 2:

            lambda_belief.add_measurements(geo_measurements,
                                           sem_measurements_exp,
                                           sem_measurements_cov, GT_DA)

        lambda_belief.print_lambda_lg_params()

        for obj in class_GT:
            current_entropy_list_per_object[obj].append(0)
            current_MSDE_list_per_object[obj].append(4 / 25)

        entropy_collector = 0
        sigma_collector = 0
        if Lambda_BSP_mode == 1:

            for belief in lambda_belief.belief_list:
                object_list = belief.obj_realization
                break

            for obj in object_list:
                current_entropy_list_per_object[obj][
                    -1] = lambda_belief.entropy(
                        obj, entropy_lower_limit=entropy_lower_limit)
                current_MSDE_list_per_object[obj][-1] = lambda_belief.MSDE_obj(
                    obj, class_GT[obj])
                entropy_collector += current_entropy_list_per_object[obj][-1]
                sigma_collector += 2 * np.sqrt(
                    lambda_belief.lambda_covariance(obj)[0,
                                                         0]) / len(object_list)

        if Lambda_BSP_mode == 2:

            for obj in lambda_belief.object_lambda_dict:

                if use_bounds is False:

                    current_entropy_list_per_object[obj][
                        -1] = lambda_belief.lambda_entropy_individual_numeric(
                            lambda_belief.object_lambda_dict[obj],
                            entropy_lower_limit=entropy_lower_limit)

                else:

                    current_entropy_list_per_object[obj][
                        -1], _ = lambda_belief.lambda_entropy_individual_bounds(
                            lambda_belief.object_lambda_dict[obj],
                            entropy_lower_limit=entropy_lower_limit)

                current_MSDE_list_per_object[obj][-1] = lambda_belief.MSDE_obj(
                    obj, class_GT[obj])
                entropy_collector += current_entropy_list_per_object[obj][-1]
                sigma_collector += 2 * np.sqrt(
                    lambda_belief.lambda_covariance_numeric(
                        lambda_belief.object_lambda_dict[obj])[0, 0]) / len(
                            lambda_belief.object_lambda_dict)

        current_entropy_list.append(entropy_collector)
        MSDE.append(lambda_belief.MSDE_expectation(class_GT))
        sigma_list.append(sigma_collector)

        time_list.append(time.time() - step_time)

    print(chosen_action_list)

    # if Lambda_BSP_mode == 1:
    #     ax = lambda_belief.belief_list[0].graph_realizations_in_one(idx + 1, fig_num=0, show_obj=True,
    #                                                                 show_weights=False, show_plot=False,
    #                                                                 show_elipses=False)
    # if Lambda_BSP_mode == 2:
    #     ax = lambda_belief.display_graph(plot_line=True, display_title=False, show_plot=False)

    width_offset = -0.36
    if reward_mode == 1:
        width_offset = -0.36
        color_bar = 'red'
    elif reward_mode == 2:
        width_offset = 0.0
        color_bar = 'red'
    if Lambda_BSP_mode == 2:
        if reward_mode == 1:
            width_offset = -0.09
            color_bar = 'blue'
        elif reward_mode == 2:
            width_offset = 0.0
            color_bar = 'blue'
    elif Lambda_BSP_mode == 1 and number_of_beliefs == 1:
        width_offset = 0.09
        color_bar = 'green'

    # if reward_mode == 1:
    #     color = 'r'
    # elif reward_mode == 2 and number_of_beliefs == 1:
    #     color = 'g'
    # elif reward_mode == 2 and number_of_beliefs != 1:
    #     color = 'b'

    # plotterdaac2d.GT_plotter_line(GT_poses, [], fig_num=0, show_plot=False,
    #                              plt_save_name=None, pause_time=None,
    #                              jpg_save=False, alpha=0.75, color=color_bar, ax=plt_ax)
    if Lambda_BSP_mode == 1:
        plt_ax = lambda_belief.belief_list[0].graph_realizations_in_one(
            idx + 1,
            fig_num=0,
            show_obj=True,
            show_weights=False,
            show_plot=False,
            show_elipses=True,
            plot_line=True,
            color=color_bar,
            single_plot=True,
            show_robot_pose=False,
            ax=plt_ax,
            enlarge=3)
    if Lambda_BSP_mode == 2:
        plt_ax = lambda_belief.display_graph(plot_line=True,
                                             display_title=False,
                                             show_plot=False,
                                             color=color_bar,
                                             ax=plt_ax,
                                             enlarge=3)

    # plt_ax.set_xlim(-8, 15)
    # plt_ax.set_ylim(-10, 10)

    lambda_belief.lambda_bar_error_graph_multi(show_plt=False,
                                               ax=bar_ax,
                                               color=color_bar,
                                               width_offset=width_offset,
                                               GT_bar=True,
                                               GT_classes=class_GT)
    plt.tight_layout()

    return current_entropy_list, MSDE, sigma_list, time.time(
    ) - start_time, time_list, current_R2_list