InterpolationType.CONSTANT,
)

muscle_states_init = InitialConditions(
    [muscle_activated_init] * ocp.nlp[0]["model"].nbMuscles() +
    [muscle_fatigued_init] * ocp.nlp[0]["model"].nbMuscles() +
    [muscle_resting_init] * ocp.nlp[0]["model"].nbMuscles(),
    InterpolationType.CONSTANT,
)
X.concatenate(muscle_states_init)

# --- Simulate --- #
sol_simulate = Simulate.from_controls_and_initial_states(ocp,
                                                         X,
                                                         U,
                                                         single_shoot=True)

# --- Save for biorbdviz --- #
OptimalControlProgram.save_get_data(ocp,
                                    sol_simulate,
                                    f"results/simulate.bob",
                                    interpolate_nb_frames=100)

# --- Graph --- #
result_single = ShowResult(ocp, sol_simulate)
result_single.graphs()
# todo multiphase
print("ok")

# result_single.animate()
    # --- Solve the program --- #
    tic = time.time()
    sol, sol_iterations = ocp.solve(
        show_online_optim=True,
        return_iterations=True,
        solver_options={
            "tol": 1e-4,
            "max_iter": 3000,
            "ipopt.hessian_approximation": "limited-memory"
        },
    )
    toc = time.time() - tic
    print(f"Time to solve : {toc}sec")

    t = time.localtime(time.time())
    date = f"{t.tm_year}_{t.tm_mon}_{t.tm_mday}"
    OptimalControlProgram.save(ocp, sol, f"results/{date}_xiaModel.bo")
    OptimalControlProgram.save_get_data(ocp,
                                        sol,
                                        f"results/{date}_xiaModel.bob",
                                        sol_iterations=sol_iterations)
    OptimalControlProgram.save_get_data(
        ocp,
        sol,
        f"results/{date}_xiaModel_interpolate.bob",
        interpolate_nb_frames=100)

    # --- Show results --- #
    result = ShowResult(ocp, sol)
    result.graphs()