CONOPT
Loading...
Searching...
No Matches
pinadd2.java
Go to the documentation of this file.
1
7
8import java.util.*;
9import java.lang.Math;
10import conopt.*;
11
14public class pinadd2 {
15 public static void main(String argv[]) {
16 System.loadLibrary("conoptjni4");
17
18 String name = "pinadd2";
19
20 Conopt conopt = new Conopt(name);
22
23 // adding the message handler to the conopt interface
24 conopt.setMessageHandler(msghdlr);
25
26 // try to set the license using the environment variables
27 try {
28 int license_int_1 = Integer.parseInt(System.getenv("CONOPT_LICENSE_INT_1"));
29 int license_int_2 = Integer.parseInt(System.getenv("CONOPT_LICENSE_INT_2"));
30 int license_int_3 = Integer.parseInt(System.getenv("CONOPT_LICENSE_INT_3"));
31 String license_text = System.getenv("CONOPT_LICENSE_TEXT");
32
35 } catch (Exception e) {
36 System.out.println("Unable to set license: " + e.getMessage());
37 }
38
39 std s = new std();
40 int retcode = 0;
41 double[] expectedSols = {1170.4862854128057, 1225.8643407378518, 1280.284354018754, 1333.7424507050348, 1386.2354828262864};
42
43 for (int i = 16; i <= 20; i++) {
44 PinAdd2ModelData model = new PinAdd2ModelData();
45
46 double[] xkeep = conopt.getVariableValues();
47 int[] xstat = conopt.getVariableStatus();
48 int[] estat = conopt.getConstraintStatus();
49
50 // building the model
51 model.buildModel(i, xkeep, xstat, estat);
52
53 // loading the model in the conopt object
54 conopt.loadModel(model);
55 conopt.solve();
56
57 retcode = s.checkSolve(name, conopt.modelStatus(), conopt.solutionStatus(),
58 conopt.objectiveValue(), expectedSols[i - 16], 0.001);
59
60 conopt.printStatus();
61 }
62 msghdlr.close();
63 System.exit(retcode);
64 }
65}
66
67class PinAdd2ModelData extends ModelData {
68 static final int CONS_SEQ = 0;
69 static final int CONS_DREV = 1;
70
71 private int T = 0;
72 private int Vpp = 7; // Variables per period
73 private int Epp = 6; // Equations per period
74
75 // the demand vector
76 private double[] demand;
77
78 // index arrays for the variables
79 private int[] vartd;
80 private int[] varcs;
81 private int[] vars;
82 private int[] vard;
83 private int[] varr;
84 private int[] varp;
85 private int[] varrev;
86
87 // index arrays for the constraints
88 private int[] consttdeq;
89 private int[] constseq;
90 private int[] constcseq;
91 private int[] constdeq;
92 private int[] constreq;
93 private int[] constdrev;
94
95 private int[] hessianstart;
96
97 public class IntPair {
98 int first_;
99 int second_;
100
101 public IntPair(int first, int second) {
102 first_ = first;
103 second_ = second;
104 }
105
106 public int first() { return first_; }
107 public int second() { return second_; }
108 };
109
110 private final Map<Integer, IntPair> consmapping = new HashMap<>();
111
112
113 public PinAdd2ModelData() {
114 super();
115 }
116
121 public void buildModel(int T, double[] xkeep, int[] xstat, int[] estat) {
122
123 this.T = T;
124
125 demand = new double[T];
126
127 vartd = new int[T];
128 varcs = new int[T];
129 vars = new int[T];
130 vard = new int[T];
131 varr = new int[T];
132 varp = new int[T];
133 varrev = new int[T];
134
135 consttdeq = new int[T];
136 constseq = new int[T];
137 constcseq = new int[T];
138 constdeq = new int[T];
139 constreq = new int[T];
140 constdrev = new int[T];
141 hessianstart = new int[T];
142
143
144 // adding the variables to the model
145 // defining the demand for each time period.
146 for (int t = 0; t < T; t++) {
147 demand[t] = 1.0 + 2.3 * Math.pow(1.015, t);
148 }
149
150 // other variables
151 int varidx;
152 for (int t = 0; t < T; t++) {
153 /* td: Lower=0, Upper=inf, Curr=18 */
154 varidx = addVariable(0, Conopt.Infinity, 18);
155 vartd[t] = varidx;
156
157 /* cs: Lower=0, Upper=inf, Curr=7*t */
158 varidx = addVariable(0, Conopt.Infinity, 7 * (t + 1));
159 varcs[t] = varidx;
160
161 /* s: Lower=0, Upper=inf, Curr=7 */
162 varidx = addVariable(0, Conopt.Infinity, 7);
163 vars[t] = varidx;
164
165 /* d: Lower=0, Upper=inf, Curr=td-s */
166 varidx =
167 addVariable(0, Conopt.Infinity, getVariable(vartd[t]).getCurr() - getVariable(vars[t]).getCurr());
168 vard[t] = varidx;
169
170 /* r: Lower=1, Upper=inf, Curr=r(t-1)-d */
171 if (t > 0)
172 varidx = addVariable(
173 1, Conopt.Infinity, getVariable(varr[t - 1]).getCurr() - getVariable(vard[t]).getCurr());
174 else
175 varidx = addVariable(1, Conopt.Infinity, 500 - getVariable(vard[t]).getCurr());
176 varr[t] = varidx;
177
178 /* p: Lower=1, Upper=inf, Curr=14 */
179 varidx = addVariable(1, Conopt.Infinity, 14);
180 varp[t] = varidx;
181
182 /* rev: Lower=-inf, Upper=inf, Curr=0 */
184 varrev[t] = varidx;
185 }
186
187 if (xkeep.length > 0) {
188 for (int i = 0; i < xkeep.length; i++) {
189 getVariable(i).setCurr(xkeep[i]);
190 }
191
192 // linear extrapolation for the last period of variable td
193 getVariable(vartd[T - 1]).setCurr(
194 2 * getVariable(vartd[T - 2]).getCurr() - getVariable(vartd[T - 3]).getCurr());
195 // cs
196 getVariable(varcs[T - 1]).setCurr(
197 2 * getVariable(varcs[T - 2]).getCurr() - getVariable(varcs[T - 3]).getCurr());
198 // s
199 getVariable(vars[T - 1]).setCurr(
200 2 * getVariable(vars[T - 2]).getCurr() - getVariable(vars[T - 3]).getCurr());
201 // d
202 getVariable(vard[T - 1]).setCurr(
203 2 * getVariable(vard[T - 2]).getCurr() - getVariable(vard[T - 3]).getCurr());
204 // r
205 getVariable(varr[T - 1]).setCurr(
206 2 * getVariable(varr[T - 2]).getCurr() - getVariable(varr[T - 3]).getCurr());
207 // p
208 getVariable(varp[T - 1]).setCurr(
209 2 * getVariable(varp[T - 2]).getCurr() - getVariable(varp[T - 3]).getCurr());
210 // rev
211 getVariable(varrev[T - 1]).setCurr(
212 2 * getVariable(varrev[T - 2]).getCurr() - getVariable(varrev[T - 3]).getCurr());
213
219 for (int i = 0; i < xstat.length; i++) {
220 getVariable(i).setVarstatus(xstat[i]);
221 }
222
223 /* td */
224 getVariable(vartd[T - 1]).setVarstatus(getVariable(vartd[T - 2]).getVarstatus());
225 /* cs */
226 getVariable(varcs[T - 1]).setVarstatus(getVariable(varcs[T - 2]).getVarstatus());
227 /* s */
228 getVariable(vars[T - 1]).setVarstatus(getVariable(vars[T - 2]).getVarstatus());
229 /* d */
230 getVariable(vard[T - 1]).setVarstatus(getVariable(vard[T - 2]).getVarstatus());
231 /* r */
232 getVariable(varr[T - 1]).setVarstatus(getVariable(varr[T - 2]).getVarstatus());
233 /* p */
234 getVariable(varp[T - 1]).setVarstatus(getVariable(varp[T - 2]).getVarstatus());
235 /* rev */
236 getVariable(varrev[T - 1]).setVarstatus(getVariable(varrev[T - 2]).getVarstatus());
237 }
238
239
240 // adding the objective
241 double[] objcoeff = new double[T];
242 int[] objnlflag = new int[T];
243
244 for (int t = 0; t < T; ++t) {
245 objcoeff[t] = Math.pow(1.05, 1 - (t + 1));
246 }
247 int objidx = addConstraint(ConstraintType.Free, 0.0, varrev, objcoeff, objnlflag);
248
249
250 // adding the constraints to the model
251 int considx;
252 for (int t = 0; t < T; t++) {
253
254 // adding the tdeq equations
255 if (t == 0) {
256 {
257 int[] index = {vartd[t], varp[t]}; // the variables
258 double[] value = {1.0, 0.13}; // the coefficients
259 int[] nlflag = {0, 0}; // nlflags
260 considx = addConstraint(ConstraintType.Eq, demand[t] + 0.87 * 18.0, index, value, nlflag);
261 }
262 }
263 else {
264 {
265 int[] index = {vartd[t], vartd[t - 1], varp[t]};
266 double[] value = {1.0, -0.87, 0.13};
267 int[] nlflag = {0, 0, 0};
268 considx = addConstraint(ConstraintType.Eq, demand[t], index, value, nlflag);
269 }
270 }
271 consttdeq[t] = considx;
272
273 // adding the seq Equations
274 if (t == 0) {
275 {
276 int[] index = {vars[t], varp[t], varcs[t]};
277 double[] value = {1.0, 0.0, 0.0};
278 int[] nlflag = {0, 1, 1};
279 considx = addConstraint(ConstraintType.Eq, 0.75 * 6.5, index, value, nlflag);
280 }
281 }
282 else {
283 {
284 int[] index = {vars[t], vars[t - 1], varp[t], varcs[t]};
285 double[] value = {1.0, -0.75, 0.0, 0.0};
286 int[] nlflag = {0, 0, 1, 1};
287 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
288 }
289 }
290 constseq[t] = considx;
291 consmapping.putIfAbsent(considx, new IntPair(CONS_SEQ, t));
292
293 // adding the cseq Equations
294 if (t == 0) {
295 {
296 int[] index = {varcs[t], vars[t]};
297 double[] value = {1.0, -1.0};
298 int[] nlflag = {0, 0};
299 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
300 }
301 }
302 else {
303 {
304 int[] index = {varcs[t], varcs[t - 1], vars[t]};
305 double[] value = {1.0, -1.0, -1.0};
306 int[] nlflag = {0, 0, 0};
307 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
308 }
309 }
310 constcseq[t] = considx;
311
312 // adding the deq equations
313 {
314 int[] index = {vard[t], vartd[t], vars[t]};
315 double[] value = {1.0, -1.0, 1.0};
316 int[] nlflag = {0, 0, 0};
317 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
318 }
319 constdeq[t] = considx;
320
321 // adding the req equations
322 if (t == 0) {
323 {
324 int[] index = {varr[t], vard[t]};
325 double[] value = {1.0, 1.0};
326 int[] nlflag = {0, 0};
327 considx = addConstraint(ConstraintType.Eq, 500.0, index, value, nlflag);
328 }
329 }
330 else {
331 {
332 int[] index = {varr[t], varr[t - 1], vard[t]};
333 double[] value = {1.0, -1.0, 1.0};
334 int[] nlflag = {0, 0, 0};
335 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
336 }
337 }
338 constreq[t] = considx;
339
340 // adding the drev equations
341 {
342 int[] index = {varrev[t], vard[t], varp[t], varr[t]};
343 double[] value = {1.0, 0.0, 0.0, 0.0};
344 int[] nlflag = {0, 1, 1, 1};
345 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
346 }
347 constdrev[t] = considx;
348 consmapping.putIfAbsent(considx, new IntPair(CONS_DREV, t));
349 }
350
351 // Restore values from previous runs
352 if (estat.length > 0) {
353 // the equation status
354 for (int i = 0; i < estat.length; i++) {
355 getConstraint(i).setSlackstatus(estat[i]);
356 }
357
358 // tdeq
359 getConstraint(consttdeq[T - 1]).setSlackstatus(getConstraint(consttdeq[T - 2]).getSlackstatus());
360 // seq
361 getConstraint(constseq[T - 1]).setSlackstatus(getConstraint(constseq[T - 2]).getSlackstatus());
362 // cseq
363 getConstraint(constcseq[T - 1]).setSlackstatus(getConstraint(constcseq[T - 2]).getSlackstatus());
364 // deq
365 getConstraint(constdeq[T - 1]).setSlackstatus(getConstraint(constdeq[T - 2]).getSlackstatus());
366 // req
367 getConstraint(constreq[T - 1]).setSlackstatus(getConstraint(constreq[T - 2]).getSlackstatus());
368 // drev
369 getConstraint(constdrev[T - 1]).setSlackstatus(getConstraint(constdrev[T - 2]).getSlackstatus());
370 }
371
372 // setting the objective constraint
374
375 // setting the optimisation direction
377
378 // setting the structure of the hessian
379 int[] hsrow = new int[T * 5];
380 int[] hscol = new int[T * 5];
381
382 int idx = 0; // running index into hsrow/hscol
383 for (int t = 0; t < T; ++t) {
384 hessianstart[t] = idx;
385
386 // 1) (cs, cs)
387 hscol[idx] = varcs[t];
388 hsrow[idx] = varcs[t];
389 idx++;
390
391 // 2) (cs, p)
392 hscol[idx] = varcs[t];
393 hsrow[idx] = varp[t];
394 idx++;
395
396 // 3) (d, r)
397 hscol[idx] = vard[t];
398 hsrow[idx] = varr[t];
399 idx++;
400
401 // 4) (d, p)
402 hscol[idx] = vard[t];
403 hsrow[idx] = varp[t];
404 idx++;
405
406 // 5) (r, r)
407 hscol[idx] = varr[t];
408 hsrow[idx] = varr[t];
409 idx++;
410 }
411 setSDLagrangianStructure(hsrow, hscol);
412 }
413
418 public double evaluateNonlinearTerm(double[] x, int rowno, boolean ignerr, int thread) {
419 IntPair conspair = consmapping.get(rowno);
420 if (conspair == null) return 0;
421
422 int consset = conspair.first();
423 int t = conspair.second();
424
425 assert (consset == CONS_SEQ || consset == CONS_DREV);
426 double g = 0;
427 if (consset == CONS_SEQ) {
428 // seq equation. Nonlinear term = -(1.1+0.1*p(t))*1.02**(-cs(t)/7)
429 double h1, h2;
430
431 h1 = (1.1 + 0.1 * x[varp[t]]);
432 h2 = Math.pow(1.02, -x[varcs[t]] / 7.0);
433 g = -h1 * h2;
434 }
435 else if (consset == CONS_DREV) {
436 g = -x[vard[t]] * (x[varp[t]] - 250. / x[varr[t]]);
437 }
438
439 return g;
440 }
441
446 public void evaluateNonlinearJacobian(double[] x, double[] jac, int rowno, int[] jacnum, boolean ignerr, int thread) {
447 assert x.length == jac.length;
448
449 IntPair conspair = consmapping.get(rowno);
450 if (conspair == null) return;
451
452 int consset = conspair.first();
453 int t = conspair.second();
454
455 assert (consset == CONS_SEQ || consset == CONS_DREV);
456
457 if (consset == CONS_SEQ) {
458 // seq equation. Nonlinear term = -(1.1+0.1*p(t))*1.02**(-cs(t)/7)
459 double h1, h2;
460
461 h1 = (1.1 + 0.1 * x[varp[t]]);
462 h2 = Math.pow(1.02, -x[varcs[t]] / 7.0);
463
464 jac[varcs[t]] = h1 * h2 * Math.log(1.02) / 7.0;
465 jac[varp[t]] = -h2 * 0.1;
466 }
467 else if (consset == CONS_DREV) {
468 jac[vard[t]] = -(x[varp[t]] - 250. / x[varr[t]]);
469 jac[varr[t]] = -x[vard[t]] * 250. / Math.pow(x[varr[t]], 2);
470 jac[varp[t]] = -x[vard[t]];
471 }
472 }
473
478 public void evaluateSDLagrangian(double x[], double u[], int[] hessianrow, int[] hessiancol, double[] hessianval) {
479
480 double cs, d, r, p;
481 double h1, h2;
482
483 /* Normal Evaluation mode */
484 for (int t = 0; t < T; t++) {
485 int hessidx = hessianstart[t];
486 cs = x[varcs[t]];
487 d = x[vard[t]];
488 r = x[varr[t]];
489 p = x[varp[t]];
490
491 h1 = 1.1 + 0.1 * p;
492 h2 = Math.pow(1.02, -cs / 7.0);
493
494 /* the second derivative of the SEQ equations */
495 hessianval[hessidx] = -h1 * h2 * Math.pow(Math.log(1.02) / 7.0, 2) * u[constseq[t]];
496 hessianval[hessidx + 1] = 0.1 * h2 * (Math.log(1.02) / 7.) * u[constseq[t]];
497
498 /* the second derivative of the DREV equations */
499 hessianval[hessidx + 2] = -250.0 / Math.pow(r, 2) * u[constdrev[t]];
500 hessianval[hessidx + 3] = -1.0 * u[constdrev[t]];
501 hessianval[hessidx + 4] = 500.0 * d / Math.pow(r, 3) * u[constdrev[t]];
502 }
503 }
504}
IntPair(int first, int second)
Definition pinadd2.java:101
The Conopt class.
Definition conopt.py:1380
static final ConstraintType Eq
static final ConstraintType Free
A class that can be extended to build and solve a model using Conopt.
Definition conopt.py:2407
static final ObjectiveElement Constraint
static final Sense Maximize
Definition Sense.java:29
license_int_3
Definition pinadd2.py:442
license_text
Definition pinadd2.py:443
static void main(String argv[])
Definition pinadd2.java:15
license_int_1
Definition pinadd2.py:440
license_int_2
Definition pinadd2.py:441
static int checkSolve(String name, int model_status, int solution_status, double objective, double expected_objective, double tol)
Definition std.java:20
addConstraint(self, *args)
Overload 1: adds a constraint to the problem.
Definition conopt.py:2621
setObjectiveElement(self, elem, elemindex)
sets the index for the objective variable or constraint
Definition conopt.py:2766
addVariable(self, *args)
Overload 1: adds a variable to the model.
Definition conopt.py:2677
setOptimizationSense(self, sense)
sets the optimisation direction.
Definition conopt.py:2775
setSDLagrangianStructure(self, rownum, colnum)
sets the structure of the second derivatives of the Lagrangian
Definition conopt.py:2889
void evaluateNonlinearJacobian(double[] x, double[] jac, int rowno, int[] jacnum, boolean ignerr, int thread)
callback method for evaluating the jacobian for the nonlinear terms in a given row
Definition pinadd2.java:446
void evaluateSDLagrangian(double x[], double u[], int[] hessianrow, int[] hessiancol, double[] hessianval)
Computes and returns the numerical values of the Lagrangian of the Hessian.
Definition pinadd2.java:478
double evaluateNonlinearTerm(double[] x, int rowno, boolean ignerr, int thread)
callback method for evaluating the nonlinear terms in a given row
Definition pinadd2.java:418
void buildModel(int T, double[] xkeep, int[] xstat, int[] estat)
adds variables and constraints to the model
Definition pinadd2.java:121
getVariable(self, *args)
Overload 1: returns a reference to the variable object
Definition conopt.py:2844
getConstraint(self, *args)
Overload 1: returns a reference to the constraint object
Definition conopt.py:2862
double xkeep[Tmax *Tmax *Vpp]
Definition std.py:1