Skip to content

Commit 9ee63d5

Browse files
authored
Merge pull request #22 from LAMPSPUC/jg/version
Set versions
2 parents ae5a403 + 2bad0fd commit 9ee63d5

File tree

7 files changed

+74
-35
lines changed

7 files changed

+74
-35
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
matrix:
2525
version:
2626
- '1.11'
27-
- '1.6'
27+
- '1'
2828
os:
2929
- ubuntu-latest
3030
arch:
@@ -39,4 +39,4 @@ jobs:
3939
- uses: julia-actions/julia-buildpkg@v1
4040
- uses: julia-actions/julia-runtest@v1
4141
- uses: julia-actions/julia-processcoverage@v1
42-
- uses: codecov/codecov-action@v5
42+
- uses: codecov/codecov-action@v5

Project.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,14 @@ Optim = "429524aa-4258-5aef-a3af-852621145aeb"
1414
ParametricOptInterface = "0ce4ce61-57bf-432b-a095-efac525d185e"
1515
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
1616
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
17+
18+
[compat]
19+
BilevelJuMP = "0.6.2"
20+
DiffOpt = "0.5.0"
21+
Flux = "0.14.25"
22+
JobQueueMPI = "0.1.1"
23+
JuMP = "1.24"
24+
Optim = "1.11"
25+
MPI = "0.20.22"
26+
ParametricOptInterface = "0.9.0"
27+
Zygote = "0.6.75"

src/jump.jl

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,9 @@ JuMP.object_dictionary(model::Model) = model.obj_dict
117117

118118
function JuMP.set_optimizer(model::Model, builder, evaluate_duals::Bool = true)
119119
# set diffopt optimizer for plan model
120-
new_diff_optimizer = DiffOpt.diff_optimizer(builder)
121-
JuMP.set_optimizer(
122-
model.plan,
123-
() ->
124-
POI.Optimizer(new_diff_optimizer; evaluate_duals = evaluate_duals),
125-
)
120+
new_diff_optimizer =
121+
DiffOpt.diff_optimizer(builder; with_parametric_opt_interface = true)
122+
JuMP.set_optimizer(model.plan, () -> new_diff_optimizer)
126123

127124
# basic setting for assess model
128125
return JuMP.set_optimizer(model.assess, builder)
@@ -133,10 +130,6 @@ function JuMP.set_silent(model::Model)
133130
return MOI.set(model.assess, MOI.Silent(), true)
134131
end
135132

136-
function JuMP.num_variables(model::Model)
137-
return JuMP.num_variables(model.plan) + JuMP.num_variables(model.assess)
138-
end
139-
140133
function JuMP.num_constraints(model::Model)
141134
return JuMP.num_constraints(model.plan) + JuMP.num_constraints(model.assess)
142135
end

src/simulation.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ function compute_single_step_gradient(
2525
dCdy::Vector{<:Real},
2626
)
2727
dCdz .= dual.(model.assess[:assess_policy_fix])
28+
DiffOpt.empty_input_sensitivities!(model.plan)
2829
for i = 1:size(model.policy_vars, 1)
2930
MOI.set(
3031
model.plan,
@@ -35,11 +36,12 @@ function compute_single_step_gradient(
3536
end
3637
DiffOpt.reverse_differentiate!(model.plan)
3738
for j = 1:size(model.forecast_vars, 1)
38-
dCdy[j] = MOI.get(
39-
model.plan,
40-
POI.ReverseParameter(),
41-
model.plan_forecast_params[j],
42-
)
39+
dCdy[j] =
40+
MOI.get(
41+
model.plan,
42+
DiffOpt.ReverseConstraintSet(),
43+
ParameterRef(model.plan_forecast_params[j]),
44+
).value
4345
end
4446

4547
return dCdy

test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ Random.seed!(123)
1313

1414
include("utils.jl")
1515
include("test_predictive_model.jl")
16-
include("test_newsvendor.jl")
16+
include("test_newsvendor.jl")

test/test_newsvendor.jl

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,27 @@ end)
1919
con1, y <= d.plan
2020
con2, y + w <= x.plan
2121
end)
22-
@objective(ApplicationDrivenLearning.Plan(model), Min, c * x.plan - q * y - r * w)
22+
@objective(
23+
ApplicationDrivenLearning.Plan(model),
24+
Min,
25+
c * x.plan - q * y - r * w
26+
)
2327
@variables(ApplicationDrivenLearning.Assess(model), begin
2428
y >= 0
2529
w >= 0
2630
end)
27-
@constraints(ApplicationDrivenLearning.Assess(model), begin
28-
con1, y <= d.assess
29-
con2, y + w <= x.assess
30-
end)
31-
@objective(ApplicationDrivenLearning.Assess(model), Min, c * x.assess - q * y - r * w)
31+
@constraints(
32+
ApplicationDrivenLearning.Assess(model),
33+
begin
34+
con1, y <= d.assess
35+
con2, y + w <= x.assess
36+
end
37+
)
38+
@objective(
39+
ApplicationDrivenLearning.Assess(model),
40+
Min,
41+
c * x.assess - q * y - r * w
42+
)
3243
set_optimizer(model, HiGHS.Optimizer)
3344
set_silent(model)
3445
nn = Chain(Dense(1 => 1; bias = false, init = (size...) -> rand(size...)))
@@ -41,7 +52,10 @@ nn = Chain(Dense(1 => 1; bias = false, init = (size...) -> rand(size...)))
4152
opt = ApplicationDrivenLearning.Options(
4253
ApplicationDrivenLearning.BilevelMode,
4354
optimizer = HiGHS.Optimizer,
44-
mode = BilevelJuMP.FortunyAmatMcCarlMode(primal_big_M = 100, dual_big_M = 100),
55+
mode = BilevelJuMP.FortunyAmatMcCarlMode(
56+
primal_big_M = 100,
57+
dual_big_M = 100,
58+
),
4559
silent = true,
4660
)
4761
sol = ApplicationDrivenLearning.train!(model, X, Y, opt)

test/test_predictive_model.jl

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@ in_size = 3
33
out_size = 2
44

55
@testset "Single-Dense" begin
6-
forecaster =
7-
ApplicationDrivenLearning.PredictiveModel(Flux.Dense(in_size => out_size) |> f64)
6+
forecaster = ApplicationDrivenLearning.PredictiveModel(
7+
Flux.Dense(in_size => out_size) |> f64,
8+
)
89
x = ones((in_size, 1))
910
@test size(forecaster(x)) == (out_size, 1)
1011

1112
θ = ApplicationDrivenLearning.extract_params(forecaster)
1213
expected_params_size = in_size * out_size + out_size
1314
@test size(θ) == (expected_params_size,)
1415

15-
ApplicationDrivenLearning.apply_params(forecaster, ones(expected_params_size))
16+
ApplicationDrivenLearning.apply_params(
17+
forecaster,
18+
ones(expected_params_size),
19+
)
1620
x = ones(in_size)
1721
@test forecaster(x) == (in_size + 1) .* ones(out_size)
1822

@@ -22,7 +26,8 @@ out_size = 2
2226
ones((1, in_size)),
2327
Flux.Descent(0.1),
2428
)
25-
@test Flux.params(forecaster.networks[1])[1] == 0.9 * ones((out_size, in_size))
29+
@test Flux.params(forecaster.networks[1])[1] ==
30+
0.9 * ones((out_size, in_size))
2631
@test Flux.params(forecaster.networks[1])[2] == 0.9 * ones(out_size)
2732
end
2833

@@ -37,7 +42,10 @@ end
3742
expected_params_size = in_size * out_size + out_size
3843
@test size(θ) == (expected_params_size,)
3944

40-
ApplicationDrivenLearning.apply_params(forecaster, ones(expected_params_size))
45+
ApplicationDrivenLearning.apply_params(
46+
forecaster,
47+
ones(expected_params_size),
48+
)
4149
x = ones(in_size)
4250
@test forecaster(x) == (in_size + 1) .* ones(out_size)
4351

@@ -47,7 +55,8 @@ end
4755
ones((1, in_size)),
4856
Flux.Descent(0.1),
4957
)
50-
@test Flux.params(forecaster.networks[1])[1] == 0.9 * ones((out_size, in_size))
58+
@test Flux.params(forecaster.networks[1])[1] ==
59+
0.9 * ones((out_size, in_size))
5160
@test Flux.params(forecaster.networks[1])[2] == 0.9 * ones(out_size)
5261
end
5362

@@ -64,7 +73,10 @@ end
6473
expected_params_size = model_in_size * model_out_size + model_out_size
6574
@test size(θ) == (expected_params_size,)
6675

67-
ApplicationDrivenLearning.apply_params(forecaster, ones(expected_params_size))
76+
ApplicationDrivenLearning.apply_params(
77+
forecaster,
78+
ones(expected_params_size),
79+
)
6880
x = ones(in_size)
6981
@test forecaster(x) == (model_in_size + 1) .* ones(out_size)
7082

@@ -85,8 +97,12 @@ end
8597
nn1 = Flux.Dense(model_in_size => model_out_size) |> f64
8698
nn2 = Flux.Dense(model_in_size => model_out_size) |> f64
8799
in_out_map = [Dict([1, 2] => [1]), Dict([1, 3] => [2])]
88-
forecaster =
89-
ApplicationDrivenLearning.PredictiveModel([nn1, nn2], in_out_map, in_size, out_size)
100+
forecaster = ApplicationDrivenLearning.PredictiveModel(
101+
[nn1, nn2],
102+
in_out_map,
103+
in_size,
104+
out_size,
105+
)
90106

91107
x = ones((in_size, 1))
92108
@test size(forecaster(x)) == (out_size, 1)
@@ -95,7 +111,10 @@ end
95111
expected_params_size = 2 * (model_in_size * model_out_size + model_out_size)
96112
@test size(θ) == (expected_params_size,)
97113

98-
ApplicationDrivenLearning.apply_params(forecaster, ones(expected_params_size))
114+
ApplicationDrivenLearning.apply_params(
115+
forecaster,
116+
ones(expected_params_size),
117+
)
99118
x = ones(in_size)
100119
@test forecaster(x) == (model_in_size + 1) .* ones(out_size)
101120

0 commit comments

Comments
 (0)