Skip to content

Commit 56956b7

Browse files
committed
Quick-and-dirty test of interior point MCP backend
1 parent 72cab15 commit 56956b7

File tree

5 files changed

+41
-37
lines changed

5 files changed

+41
-37
lines changed

Project.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ version = "0.1.1"
66
[deps]
77
BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
88
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
9-
ParametricMCPs = "9b992ff8-05bb-4ea1-b9d2-5ef72d82f7ad"
9+
MixedComplementarityProblems = "6c9e26cb-9263-41b8-a6c6-f4ca104ccdcd"
1010
TrajectoryGamesBase = "ac1ac542-73eb-4349-ae1b-660ab3609574"
1111

1212
[compat]
13-
BlockArrays = "0.16"
13+
BlockArrays = "0.16, 1"
1414
ChainRulesCore = "1"
15-
ParametricMCPs = "0.1.14"
15+
MixedComplementarityProblems = "0.1.1"
1616
TrajectoryGamesBase = "0.3.6"
1717
julia = "1.7"

src/MCPTrajectoryGameSolver.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using TrajectoryGamesBase:
1818
unflatten_trajectory,
1919
unstack_trajectory
2020

21-
using ParametricMCPs: ParametricMCPs, SymbolicUtils
21+
using MixedComplementarityProblems: MixedComplementarityProblems as IPMCPs, SymbolicUtils
2222

2323
using BlockArrays: BlockArrays, mortar, blocks, eachblock
2424
using ChainRulesCore: ChainRulesCore

src/solve.jl

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ function TrajectoryGamesBase.solve_trajectory_game!(
1717

1818
θ = compose_parameter_vector(; initial_state, context, shared_constraint_premultipliers)
1919

20-
raw_solution = ParametricMCPs.solve(
20+
raw_solution = IPMCPs.solve(
21+
IPMCPs.InteriorPoint(),
2122
solver.mcp_problem_representation,
2223
θ;
23-
initial_guess = isnothing(initial_guess) ?
24-
generate_initial_guess(solver, game, initial_state) : initial_guess,
24+
# initial_guess = isnothing(initial_guess) ?
25+
# generate_initial_guess(solver, game, initial_state) : initial_guess,
2526
parametric_mcp_solve_options...,
2627
)
2728

@@ -33,7 +34,8 @@ Reshapes the raw solution into a `JointStrategy` over `OpenLoopStrategy`s.
3334
"""
3435
function strategy_from_raw_solution(; raw_solution, game, solver)
3536
number_of_players = num_players(game)
36-
z_iter = Iterators.Stateful(raw_solution.z)
37+
# z_iter = Iterators.Stateful(raw_solution.z)
38+
z_iter = Iterators.Stateful(raw_solution.x)
3739

3840
substrategies = map(1:number_of_players) do player_index
3941
private_state_dimension = solver.dimensions.state_blocks[player_index]
@@ -50,24 +52,24 @@ function strategy_from_raw_solution(; raw_solution, game, solver)
5052
TrajectoryGamesBase.JointStrategy(substrategies, info)
5153
end
5254

53-
function generate_initial_guess(solver, game, initial_state)
54-
ChainRulesCore.ignore_derivatives() do
55-
z_initial = zeros(ParametricMCPs.get_problem_size(solver.mcp_problem_representation))
56-
57-
rollout_strategy =
58-
map(solver.dimensions.control_blocks) do control_dimension_player_i
59-
(x, t) -> zeros(control_dimension_player_i)
60-
end |> TrajectoryGamesBase.JointStrategy
61-
62-
zero_input_trajectory = TrajectoryGamesBase.rollout(
63-
game.dynamics,
64-
rollout_strategy,
65-
initial_state,
66-
solver.dimensions.horizon,
67-
)
68-
69-
copyto!(z_initial, reduce(vcat, flatten_trajetory_per_player(zero_input_trajectory)))
70-
71-
z_initial
72-
end
73-
end
55+
# function generate_initial_guess(solver, game, initial_state)
56+
# ChainRulesCore.ignore_derivatives() do
57+
# z_initial = zeros(ParametricMCPs.get_problem_size(solver.mcp_problem_representation))
58+
#
59+
# rollout_strategy =
60+
# map(solver.dimensions.control_blocks) do control_dimension_player_i
61+
# (x, t) -> zeros(control_dimension_player_i)
62+
# end |> TrajectoryGamesBase.JointStrategy
63+
#
64+
# zero_input_trajectory = TrajectoryGamesBase.rollout(
65+
# game.dynamics,
66+
# rollout_strategy,
67+
# initial_state,
68+
# solver.dimensions.horizon,
69+
# )
70+
#
71+
# copyto!(z_initial, reduce(vcat, flatten_trajetory_per_player(zero_input_trajectory)))
72+
#
73+
# z_initial
74+
# end
75+
# end

src/solver_setup.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ function Solver(
164164
]
165165
upper_bounds = fill(Inf, length(lower_bounds))
166166
167-
mcp_problem_representation = ParametricMCPs.ParametricMCP(
167+
mcp_problem_representation = IPMCPs.PrimalDualMCP(
168168
f_symbolic,
169169
z_symbolic,
170170
θ_symbolic,

test/Demo.jl

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ using BlockArrays: blocks, mortar
1515
using MCPTrajectoryGameSolver: Solver
1616
using GLMakie: GLMakie
1717
using Zygote: Zygote
18-
using ParametricMCPs: ParametricMCPs
18+
# using ParametricMCPs: ParametricMCPs
1919

2020
"""
2121
Set up a simple two-player collision-avoidance game:
@@ -77,12 +77,14 @@ function demo_model_predictive_game_play()
7777
# TODO: potentially allow the user to only warm-start the primals and or add noise
7878
generate_initial_guess = function (last_strategy, state, time)
7979
# only warm-start if the last strategy is converged / feasible
80-
if !isnothing(last_strategy) &&
81-
last_strategy.info.raw_solution.status == ParametricMCPs.PATHSolver.MCP_Solved
82-
initial_guess = last_strategy.info.raw_solution.z
83-
else
84-
nothing
85-
end
80+
# if !isnothing(last_strategy) &&
81+
# # last_strategy.info.raw_solution.status == ParametricMCPs.PATHSolver.MCP_Solved
82+
# last_strategy.info.raw_solution.status === :solved
83+
# initial_guess = last_strategy.info.raw_solution.z
84+
# else
85+
# nothing
86+
# end
87+
nothing
8688
end,
8789
)
8890

0 commit comments

Comments
 (0)