def test_triple_int_optimizer(self):
        params = Parameter()
        params.set("dt", 0.2)
        params.set("function_tolerance", 1e-6)
        params.set("max_num_iterations", 1000)

        initial_state = np.array([[0., 10., 0., 0., 10., 0., 0., 1., 0.],
                                  [2., 10., 0., 2., 10., 0., 0.2, 1., 0.],
                                  [4., 10., 0., 4., 10., 0., 0.4, 1., 0.],
                                  [6., 10., 0., 6., 10., 0., 0.6, 1., 0.]])
        opt_vec = np.zeros(shape=(30, 3))
        ref_line = np.array([[10., -100.], [50.1, 100.1]])

        # optimizer
        opt = Optimizer(params)
        opt.SetOptimizationVector(opt_vec)

        # costs
        ref_cost = ReferenceLineCost(params, 10.)
        ref_cost.SetReferenceLine(ref_line)
        jerk_cost = JerkCost(params, 100.)
        speed_cost = SpeedCost(params, 10.)
        speed_cost.SetDesiredSpeed(20.)

        # optimization problem
        functor = opt.AddTripleIntFunctor(initial_state, params,
                                          [ref_cost, jerk_cost, speed_cost])
        opt.FixOptimizationVector(0, 1)
        opt.Solve()
        opt.Report()
        inputs = opt.Result()
        trajectory = GenerateTrajectoryTripleInt(initial_state, inputs, params)

        fig = plt.figure()
        plt.subplot(144)
        ax = fig.add_subplot(144, projection='3d')
        plt.plot(trajectory[:, 0],
                 trajectory[:, 3],
                 trajectory[:, 6],
                 marker='o')
        plt.plot([10, 50.1], [-100, 100], [0., 0.], marker='o')
        plt.axis("equal")
        plt.subplot(141)
        plt.plot(trajectory[:-3, 1], label="vx", marker='o')
        plt.plot(trajectory[:-3, 4], label="vy", marker='o', color="green")
        plt.plot(trajectory[:-3, 7], label="vz", marker='o', color="red")
        plt.xlabel("v [m/s]")
        plt.legend()
        plt.subplot(142)
        plt.plot(trajectory[:, 0], trajectory[:, 3], marker='o')
        plt.plot([10, 50.1], [-100, 100], marker='o')
        plt.axis("equal")
        plt.xlabel("x [m]")
        plt.ylabel("y [m]")
        plt.subplot(143)
        plt.plot(trajectory[:, 3], trajectory[:, 6], marker='o')
        plt.axis("equal")
        plt.xlabel("y [m]")
        plt.ylabel("z [m]")
        # fig, ax = plt.subplots(nrows=1, ncols=2)
        # colorbar_axis = ax[0].plot(trajectory[:, 0], trajectory[:, 3])
        # ax[0].axis("equal")
        # ax[1].plot(inputs[:-1, 0], label="ax", marker='o')
        # ax[1].plot(inputs[:-1, 1], label="ay", marker='o', color="green")
        # ax[1].plot(inputs[:-1, 2], label="az", marker='o', color="red")
        # ax[1].legend()

        plt.show()
        print(repr(trajectory))
        print(repr(inputs))
  def test_single_track_optimizer(self):
    params = Parameter()
    params.set("wheel_base", 2.7)
    params.set("dt", 0.2)
    params.set("function_tolerance", 1e-8)
    params.set("max_num_iterations", 1000)

    initial_state = np.array([[0., 0., 0., 10.],
                              [2., 0., 0., 10.],
                              [4., 0., 0., 10.],
                              [6., 0., 0., 10.]])
    opt_vec = np.array([[ 0.        ,  0.        ],
                        [-0.00581466, -0.02969236],
                        [-0.0100573 , -0.05063586],
                        [-0.01290205, -0.06336555],
                        [-0.0145111 , -0.06958468],
                        [-0.01504364, -0.07147759],
                        [-0.01466189, -0.0712203 ],
                        [-0.01353391, -0.07066254],
                        [-0.01183398, -0.0711591 ],
                        [-0.00974178, -0.0735261 ],
                        [-0.00744058, -0.07806701],
                        [-0.00509113, -0.08413195],
                        [-0.0028139 , -0.09089476],
                        [-0.00069383, -0.0976187 ],
                        [ 0.00121458, -0.10373539],
                        [ 0.00288213, -0.10887319],
                        [ 0.00430011, -0.11284776],
                        [ 0.00547573, -0.11562908],
                        [ 0.00642782, -0.11729807],
                        [ 0.00718276, -0.11800159],
                        [ 0.0077706 , -0.11791354],
                        [ 0.00821974, -0.11720583],
                        [ 0.00855625, -0.11603267],
                        [ 0.0088038 , -0.11452536],
                        [ 0.0089836 , -0.11278997],
                        [ 0.00911419, -0.11090794],
                        [ 0.00921137, -0.10893774],
                        [ 0.00928801, -0.10691821],
                        [ 0.00935393, -0.10487191],
                        [ 0.        ,  0.00059502]])
    ref_line = np.array([[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         1.00000000e+01],
       [ 2.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         1.00000000e+01],
       [ 4.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         1.00000000e+01],
       [ 6.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         1.00000000e+01],
       [ 8.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         1.00000000e+01],
       [ 9.99939997e+00, -4.30463875e-03, -4.30592393e-03,
         9.99406153e+00],
       [ 1.19971306e+01, -2.03405218e-02, -1.17478308e-02,
         9.98393436e+00],
       [ 1.39923704e+01, -5.32967584e-02, -2.12840277e-02,
         9.97126125e+00],
       [ 1.59845144e+01, -1.06379431e-01, -3.19953707e-02,
         9.95734431e+00],
       [ 1.79731414e+01, -1.81067097e-01, -4.30841450e-02,
         9.94304879e+00],
       [ 1.99579824e+01, -2.77367780e-01, -5.38759931e-02,
         9.92880473e+00],
       [ 2.19388867e+01, -3.94078028e-01, -6.38232626e-02,
         9.91467222e+00],
       [ 2.39157899e+01, -5.29044532e-01, -7.25085470e-02,
         9.90044040e+00],
       [ 2.58886800e+01, -6.79428615e-01, -7.96477572e-02,
         9.88573518e+00],
       [ 2.78575651e+01, -8.41973335e-01, -8.50921200e-02,
         9.87012178e+00],
       [ 2.98224543e+01, -1.01325561e+00, -8.88112060e-02,
         9.85329539e+00],
       [ 3.17833555e+01, -1.18989285e+00, -9.08631109e-02,
         9.83511644e+00],
       [ 3.37402750e+01, -1.36869381e+00, -9.13680809e-02,
         9.81559270e+00],
       [ 3.56932177e+01, -1.54676003e+00, -9.04859136e-02,
         9.79484562e+00],
       [ 3.76421873e+01, -1.72154515e+00, -8.83971179e-02,
         9.77307098e+00],
       [ 3.95871864e+01, -1.89087947e+00, -8.52877092e-02,
         9.75050143e+00],
       [ 4.15282170e+01, -2.05296693e+00, -8.13374631e-02,
         9.72737561e+00],
       [ 4.34652803e+01, -2.20636175e+00, -7.67114427e-02,
         9.70391600e+00],
       [ 4.53983772e+01, -2.34993117e+00, -7.15546057e-02,
         9.68031568e+00],
       [ 4.73275086e+01, -2.48281085e+00, -6.59892879e-02,
         9.65673297e+00],
       [ 4.92526750e+01, -2.60435938e+00, -6.01165980e-02,
         9.63329181e+00],
       [ 5.11738771e+01, -2.71411662e+00, -5.40182610e-02,
         9.61008527e+00],
       [ 5.30911154e+01, -2.81176608e+00, -4.77585100e-02,
         9.58718020e+00],
       [ 5.50043903e+01, -2.89710162e+00, -4.13860399e-02,
         9.56462221e+00],
       [ 5.69137022e+01, -2.96999832e+00, -3.49360318e-02,
         9.54244062e+00],
       [ 5.88190514e+01, -3.03038789e+00, -2.84322483e-02,
         9.52065307e+00],
       [ 6.07204383e+01, -3.07823825e+00, -2.18892006e-02,
         9.49926943e+00],
       [ 6.26178630e+01, -3.11353783e+00, -1.53143860e-02,
         9.47829505e+00],
       [ 6.45133116e+01, -3.14256773e+00, -1.53143860e-02,
         9.47841405e+00]])

    obstacle_outline0 = np.array([[14., 1.7],
                                  [22., 1.7],
                                  [22., 4.7],
                                  [14., 4.7],
                                  [14., 1.7]])
    # optimizer
    opt = Optimizer(params)
    opt.SetOptimizationVector(opt_vec)

    # costs
    ref_cost = ReferenceCost(params, 100.)
    ref_cost.SetReference(ref_line)
    jerk_cost = JerkCost(params, 10000.)

    outline = ObjectOutline()
    obstacle_outline1 = obstacle_outline0 + np.array([[30.0, -3.]])
    outline.Add(obstacle_outline0, 0.)
    outline.Add(obstacle_outline1, 6.)

    object_cost = StaticObjectCost(params, 2.5, 10000.)
    object_cost.AddObjectOutline(outline)

    input_cost = InputCost(params, 10.)
    input_cost.SetLowerBound(np.array([[-0.2, -1.0]]))
    input_cost.SetUpperBound(np.array([[0.2, 1.0]]))

 
    # optimization problem
    functor = opt.AddFastSingleTrackFunctor(initial_state,
                                            params,
                                            [jerk_cost,
                                             object_cost,
                                             input_cost,
                                             ref_cost])

    opt.FixOptimizationVector(0, 1)    
    opt.Solve()
    opt.Report()
    inputs = opt.Result()
    trajectory = GenerateTrajectorySingleTrack(initial_state, inputs, params)


    cmap, norm = GetColorMap(0., 6.)
    fig, ax = plt.subplots(nrows=1, ncols=2)
    for t in np.arange(0, 6, 0.5):
        poly = outline.Query(t)
        ax[0].plot(poly[:, 0], poly[:, 1], color=cmap(norm(t)))

    colorbar_axis = ax[0].plot(trajectory[:, 0], trajectory[:, 1])
    for i, pt in enumerate(trajectory[:]):
        ax[0].plot(pt[0], pt[1], color=cmap(norm(params.set("dt", 0.2)*i)), marker='o')
    
    ax[0].axis("equal")
    ax[1].plot(inputs[:-1, 0], label="Steering angle", marker='o')
    ax[1].plot(inputs[:-1, 1], label="Acceleration", marker='o', color="green")
    ax[1].legend()

    plt.show()
    print(repr(inputs))
    print(repr(trajectory))
    def test_single_track_optimizer(self):
        params = Parameter()
        params.set("wheel_base", 2.7)
        params.set("dt", 0.2)
        params.set("function_tolerance", 1e-6)
        params.set("max_num_iterations", 1000)
        params.set("num_threads", 1)

        initial_state = np.array([[0., 0., 0., 10.], [2., 0., 0., 10.],
                                  [4., 0., 0., 10.], [6., 0., 0., 10.]])
        opt_vec = np.zeros(shape=(30, 2))
        ref_line = np.array([[0., 4.], [1000., 4.]])

        obstacle_outline0 = np.array([[14., 1.7], [22., 1.7], [22., 4.7],
                                      [14., 4.7], [14., 1.7]])
        # optimizer
        opt = Optimizer(params)
        opt.SetOptimizationVector(opt_vec)

        # costs
        ref_cost = ReferenceLineCost(params, 100.)
        ref_cost.SetReferenceLine(ref_line)
        jerk_cost = JerkCost(params, 10000.)

        outline = ObjectOutline()
        obstacle_outline1 = obstacle_outline0 + np.array([[30.0, -2.]])
        outline.Add(obstacle_outline0, 0.)
        outline.Add(obstacle_outline1, 6.)

        object_cost = StaticObjectCost(params, 2.5, 10000.)
        object_cost.AddObjectOutline(outline)

        input_cost = InputCost(params, 10.)
        input_cost.SetLowerBound(np.array([[-0.2, -1.0]]))
        input_cost.SetUpperBound(np.array([[0.2, 1.0]]))

        speed_cost = SpeedCost(params, 10.)
        speed_cost.SetDesiredSpeed(10.)

        # optimization problem
        functor = opt.AddFastSingleTrackFunctor(
            initial_state, params,
            [jerk_cost, ref_cost, input_cost, object_cost, speed_cost])
        opt.FixOptimizationVector(0, 1)
        opt.Solve()
        opt.Report()
        inputs = opt.Result()
        trajectory = GenerateTrajectorySingleTrack(initial_state, inputs,
                                                   params)

        cmap, norm = GetColorMap(0., 6.)
        fig, ax = plt.subplots(nrows=1, ncols=2)
        for t in np.arange(0, 6, 0.5):
            poly = outline.Query(t)
            ax[0].plot(poly[:, 0], poly[:, 1], color=cmap(norm(t)))

        colorbar_axis = ax[0].plot(trajectory[:, 0], trajectory[:, 1])
        for i, pt in enumerate(trajectory[:]):
            ax[0].plot(pt[0],
                       pt[1],
                       color=cmap(norm(params.set("dt", 0.2) * i)),
                       marker='o')

        ax[0].axis("equal")
        ax[1].plot(inputs[:-1, 0], label="Steering angle", marker='o')
        ax[1].plot(inputs[:-1, 1],
                   label="Acceleration",
                   marker='o',
                   color="green")
        ax[1].legend()

        plt.show()
        print(repr(trajectory))
        print(repr(inputs))