@@ -71,7 +71,7 @@ facts("SDDP algorithm: 1D case") do
7171
7272 # Test if the first subgradient has the same dimension as state:
7373 @fact size (V[1 ]. lambdas, 2 ) --> model. dimStates
74- @fact V[1 ]. numCuts < n_scenarios* max_iterations + n_scenarios --> true
74+ @fact V[1 ]. numCuts <= n_scenarios* max_iterations + n_scenarios --> true
7575 @fact size (V[1 ]. lambdas, 1 ) --> V[1 ]. numCuts
7676
7777 # Test upper bounds estimation with Monte-Carlo:
@@ -109,10 +109,62 @@ facts("SDDP algorithm: 1D case") do
109109 context (" Cuts pruning" ) do
110110 v = V[1 ]
111111 vt = PolyhedralFunction ([v. betas[1 ]; v. betas[1 ] - 1. ], v. lambdas[[1 ,1 ],:], 2 )
112- isactive1 = StochDynamicProgramming. is_cut_relevant (model, 1 , vt, param. SOLVER)
113- isactive2 = StochDynamicProgramming. is_cut_relevant (model, 2 , vt, param. SOLVER)
112+ # Check cuts counting:
113+ @fact StochDynamicProgramming. get_total_number_cuts ([vt]) --> 2
114+
115+ # Check computation of cut value:
116+ @fact StochDynamicProgramming. cutvalue (vt, 1 , [0. , 0. ]) --> v. betas[1 ]
117+
118+ # Check computation of optimal cut:
119+ @fact StochDynamicProgramming. optimalcut ([0. , 0. ], vt)[2 ] --> 1
120+
121+ terr = StochDynamicProgramming. Territories (2 )
122+ StochDynamicProgramming. find_territory! (terr, vt, [0. 0. ; 1. 0. ])
123+ @fact terr. ncuts --> 2
124+ @fact terr. nstates --> 2
125+ @fact length (terr. territories[1 ]) --> 2
126+ @fact length (terr. territories[2 ]) --> 0
127+
128+ # Check heuristic removal:
129+ vt2 = StochDynamicProgramming. remove_empty_cuts! (terr, vt)
130+ @fact isa (vt2, StochDynamicProgramming. PolyhedralFunction) --> true
131+ @fact vt2. numCuts --> 1
132+ @fact vt2. betas[1 ] --> vt. betas[1 ]
133+
134+ # Check exact dominance test:
135+ isactive1 = StochDynamicProgramming. is_cut_relevant (model, 1 , vt, param. SOLVER)[1 ]
136+ isactive2 = StochDynamicProgramming. is_cut_relevant (model, 2 , vt, param. SOLVER)[1 ]
114137 @fact isactive1 --> true
115138 @fact isactive2 --> false
139+
140+ # Check insertion of pruning algorithms into SDDP solver:
141+ param1 = StochDynamicProgramming. SDDPparameters (solver,
142+ passnumber= n_scenarios,
143+ gap= epsilon,
144+ pruning_algo= " exact" ,
145+ prune_cuts= 1 ,
146+ max_iterations= 1 )
147+ V1 = solve_SDDP (model, param1, 0 )[1 ]
148+ param1 = StochDynamicProgramming. SDDPparameters (solver,
149+ passnumber= n_scenarios,
150+ gap= epsilon,
151+ pruning_algo= " territory" ,
152+ prune_cuts= 1 ,
153+ max_iterations= 1 )
154+ V2 = solve_SDDP (model, param1, 0 )[1 ]
155+ param1 = StochDynamicProgramming. SDDPparameters (solver,
156+ passnumber= n_scenarios,
157+ gap= epsilon,
158+ pruning_algo= " mixed" ,
159+ prune_cuts= 1 ,
160+ max_iterations= 1 )
161+ V3 = solve_SDDP (model, param1, 0 )[1 ]
162+
163+ n1 = StochDynamicProgramming. get_total_number_cuts (V1)
164+ n2 = StochDynamicProgramming. get_total_number_cuts (V2)
165+ n3 = StochDynamicProgramming. get_total_number_cuts (V3)
166+ @fact n1 > n2 --> true
167+ @fact n3 > n2 --> true
116168 end
117169
118170 context (" Quadratic regularization" ) do
0 commit comments