CONOPT
Loading...
Searching...
No Matches
pinadd.java
Go to the documentation of this file.
1
7
8import java.util.*;
9import java.lang.Math;
10import conopt.*;
11
14public class pinadd {
15 public static void main(String argv[]) {
16 System.loadLibrary("conoptjni4");
17
18 String name = "pinadd";
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 PinAddModelData model = new PinAddModelData();
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 PinAddModelData extends ModelData {
68 static final int CONS_SEQ = 0;
69 static final int CONS_DREV = 1;
70
71 private int Vpp = 7; // Variables per period
72 private int Epp = 6; // Equations per period
73
74 // the demand vector
75 private double[] demand;
76
77 // index arrays for the variables
78 private int[] vartd;
79 private int[] varcs;
80 private int[] vars;
81 private int[] vard;
82 private int[] varr;
83 private int[] varp;
84 private int[] varrev;
85
86 // index arrays for the constraints
87 private int[] consttdeq;
88 private int[] constseq;
89 private int[] constcseq;
90 private int[] constdeq;
91 private int[] constreq;
92 private int[] constdrev;
93
94 public class IntPair {
95 int first_;
96 int second_;
97
98 public IntPair(int first, int second) {
99 first_ = first;
100 second_ = second;
101 }
102
103 public int first() { return first_; }
104 public int second() { return second_; }
105 };
106
107 private final Map<Integer, IntPair> consmapping = new HashMap<>();
108
109
110 public PinAddModelData() {
111 super();
112 }
113
118 public void buildModel(int T, double[] xkeep, int[] xstat, int[] estat) {
119
120 demand = new double[T];
121
122 vartd = new int[T];
123 varcs = new int[T];
124 vars = new int[T];
125 vard = new int[T];
126 varr = new int[T];
127 varp = new int[T];
128 varrev = new int[T];
129
130 consttdeq = new int[T];
131 constseq = new int[T];
132 constcseq = new int[T];
133 constdeq = new int[T];
134 constreq = new int[T];
135 constdrev = new int[T];
136
137
138 // adding the variables to the model
139 // defining the demand for each time period.
140 for (int t = 0; t < T; t++) {
141 demand[t] = 1.0 + 2.3 * Math.pow(1.015, t);
142 }
143
144 // other variables
145 int varidx;
146 for (int t = 0; t < T; t++) {
147 /* td: Lower=0, Upper=inf, Curr=18 */
148 varidx = addVariable(0, Conopt.Infinity, 18);
149 vartd[t] = varidx;
150
151 /* cs: Lower=0, Upper=inf, Curr=7*t */
152 varidx = addVariable(0, Conopt.Infinity, 7 * (t + 1));
153 varcs[t] = varidx;
154
155 /* s: Lower=0, Upper=inf, Curr=7 */
156 varidx = addVariable(0, Conopt.Infinity, 7);
157 vars[t] = varidx;
158
159 /* d: Lower=0, Upper=inf, Curr=td-s */
160 varidx =
161 addVariable(0, Conopt.Infinity, getVariable(vartd[t]).getCurr() - getVariable(vars[t]).getCurr());
162 vard[t] = varidx;
163
164 /* r: Lower=1, Upper=inf, Curr=r(t-1)-d */
165 if (t > 0)
166 varidx = addVariable(
167 1, Conopt.Infinity, getVariable(varr[t - 1]).getCurr() - getVariable(vard[t]).getCurr());
168 else
169 varidx = addVariable(1, Conopt.Infinity, 500 - getVariable(vard[t]).getCurr());
170 varr[t] = varidx;
171
172 /* p: Lower=1, Upper=inf, Curr=14 */
173 varidx = addVariable(1, Conopt.Infinity, 14);
174 varp[t] = varidx;
175
176 /* rev: Lower=-inf, Upper=inf, Curr=0 */
178 varrev[t] = varidx;
179 }
180
181 if (xkeep.length > 0) {
182 for (int i = 0; i < xkeep.length; i++) {
183 getVariable(i).setCurr(xkeep[i]);
184 }
185
186 // linear extrapolation for the last period of variable td
187 getVariable(vartd[T - 1]).setCurr(
188 2 * getVariable(vartd[T - 2]).getCurr() - getVariable(vartd[T - 3]).getCurr());
189 // cs
190 getVariable(varcs[T - 1]).setCurr(
191 2 * getVariable(varcs[T - 2]).getCurr() - getVariable(varcs[T - 3]).getCurr());
192 // s
193 getVariable(vars[T - 1]).setCurr(
194 2 * getVariable(vars[T - 2]).getCurr() - getVariable(vars[T - 3]).getCurr());
195 // d
196 getVariable(vard[T - 1]).setCurr(
197 2 * getVariable(vard[T - 2]).getCurr() - getVariable(vard[T - 3]).getCurr());
198 // r
199 getVariable(varr[T - 1]).setCurr(
200 2 * getVariable(varr[T - 2]).getCurr() - getVariable(varr[T - 3]).getCurr());
201 // p
202 getVariable(varp[T - 1]).setCurr(
203 2 * getVariable(varp[T - 2]).getCurr() - getVariable(varp[T - 3]).getCurr());
204 // rev
205 getVariable(varrev[T - 1]).setCurr(
206 2 * getVariable(varrev[T - 2]).getCurr() - getVariable(varrev[T - 3]).getCurr());
207
213 for (int i = 0; i < xstat.length; i++) {
214 getVariable(i).setVarstatus(xstat[i]);
215 }
216
217 /* td */
218 getVariable(vartd[T - 1]).setVarstatus(getVariable(vartd[T - 2]).getVarstatus());
219 /* cs */
220 getVariable(varcs[T - 1]).setVarstatus(getVariable(varcs[T - 2]).getVarstatus());
221 /* s */
222 getVariable(vars[T - 1]).setVarstatus(getVariable(vars[T - 2]).getVarstatus());
223 /* d */
224 getVariable(vard[T - 1]).setVarstatus(getVariable(vard[T - 2]).getVarstatus());
225 /* r */
226 getVariable(varr[T - 1]).setVarstatus(getVariable(varr[T - 2]).getVarstatus());
227 /* p */
228 getVariable(varp[T - 1]).setVarstatus(getVariable(varp[T - 2]).getVarstatus());
229 /* rev */
230 getVariable(varrev[T - 1]).setVarstatus(getVariable(varrev[T - 2]).getVarstatus());
231 }
232
233
234 // adding the objective
235 double[] objcoeff = new double[T];
236 int[] objnlflag = new int[T];
237
238 for (int t = 0; t < T; ++t) {
239 objcoeff[t] = Math.pow(1.05, 1 - (t + 1));
240 }
241 int objidx = addConstraint(ConstraintType.Free, 0.0, varrev, objcoeff, objnlflag);
242
243
244 // adding the constraints to the model
245 int considx;
246 for (int t = 0; t < T; t++) {
247
248 // adding the tdeq equations
249 if (t == 0) {
250 {
251 int[] index = {vartd[t], varp[t]}; // the variables
252 double[] value = {1.0, 0.13}; // the coefficients
253 int[] nlflag = {0, 0}; // nlflags
254 considx = addConstraint(ConstraintType.Eq, demand[t] + 0.87 * 18.0, index, value, nlflag);
255 }
256 }
257 else {
258 {
259 int[] index = {vartd[t], vartd[t - 1], varp[t]};
260 double[] value = {1.0, -0.87, 0.13};
261 int[] nlflag = {0, 0, 0};
262 considx = addConstraint(ConstraintType.Eq, demand[t], index, value, nlflag);
263 }
264 }
265 consttdeq[t] = considx;
266
267 // adding the seq Equations
268 if (t == 0) {
269 {
270 int[] index = {vars[t], varp[t], varcs[t]};
271 double[] value = {1.0, 0.0, 0.0};
272 int[] nlflag = {0, 1, 1};
273 considx = addConstraint(ConstraintType.Eq, 0.75 * 6.5, index, value, nlflag);
274 }
275 }
276 else {
277 {
278 int[] index = {vars[t], vars[t - 1], varp[t], varcs[t]};
279 double[] value = {1.0, -0.75, 0.0, 0.0};
280 int[] nlflag = {0, 0, 1, 1};
281 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
282 }
283 }
284 constseq[t] = considx;
285 consmapping.putIfAbsent(considx, new IntPair(CONS_SEQ, t));
286
287 // adding the cseq Equations
288 if (t == 0) {
289 {
290 int[] index = {varcs[t], vars[t]};
291 double[] value = {1.0, -1.0};
292 int[] nlflag = {0, 0};
293 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
294 }
295 }
296 else {
297 {
298 int[] index = {varcs[t], varcs[t - 1], vars[t]};
299 double[] value = {1.0, -1.0, -1.0};
300 int[] nlflag = {0, 0, 0};
301 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
302 }
303 }
304 constcseq[t] = considx;
305
306 // adding the deq equations
307 {
308 int[] index = {vard[t], vartd[t], vars[t]};
309 double[] value = {1.0, -1.0, 1.0};
310 int[] nlflag = {0, 0, 0};
311 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
312 }
313 constdeq[t] = considx;
314
315 // adding the req equations
316 if (t == 0) {
317 {
318 int[] index = {varr[t], vard[t]};
319 double[] value = {1.0, 1.0};
320 int[] nlflag = {0, 0};
321 considx = addConstraint(ConstraintType.Eq, 500.0, index, value, nlflag);
322 }
323 }
324 else {
325 {
326 int[] index = {varr[t], varr[t - 1], vard[t]};
327 double[] value = {1.0, -1.0, 1.0};
328 int[] nlflag = {0, 0, 0};
329 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
330 }
331 }
332 constreq[t] = considx;
333
334 // adding the drev equations
335 {
336 int[] index = {varrev[t], vard[t], varp[t], varr[t]};
337 double[] value = {1.0, 0.0, 0.0, 0.0};
338 int[] nlflag = {0, 1, 1, 1};
339 considx = addConstraint(ConstraintType.Eq, 0.0, index, value, nlflag);
340 }
341 constdrev[t] = considx;
342 consmapping.putIfAbsent(considx, new IntPair(CONS_DREV, t));
343 }
344
345 // Restore values from previous runs
346 if (estat.length > 0) {
347 // the equation status
348 for (int i = 0; i < estat.length; i++) {
349 getConstraint(i).setSlackstatus(estat[i]);
350 }
351
352 // tdeq
353 getConstraint(consttdeq[T - 1]).setSlackstatus(getConstraint(consttdeq[T - 2]).getSlackstatus());
354 // seq
355 getConstraint(constseq[T - 1]).setSlackstatus(getConstraint(constseq[T - 2]).getSlackstatus());
356 // cseq
357 getConstraint(constcseq[T - 1]).setSlackstatus(getConstraint(constcseq[T - 2]).getSlackstatus());
358 // deq
359 getConstraint(constdeq[T - 1]).setSlackstatus(getConstraint(constdeq[T - 2]).getSlackstatus());
360 // req
361 getConstraint(constreq[T - 1]).setSlackstatus(getConstraint(constreq[T - 2]).getSlackstatus());
362 // drev
363 getConstraint(constdrev[T - 1]).setSlackstatus(getConstraint(constdrev[T - 2]).getSlackstatus());
364 }
365
366 // setting the objective constraint
368
369 // setting the optimisation direction
371 }
372
377 public double evaluateNonlinearTerm(double[] x, int rowno, boolean ignerr, int thread) {
378 IntPair conspair = consmapping.get(rowno);
379 if (conspair == null) return 0;
380
381 int consset = conspair.first();
382 int t = conspair.second();
383
384 assert (consset == CONS_SEQ || consset == CONS_DREV);
385 double g = 0;
386 if (consset == CONS_SEQ) {
387 // seq equation. Nonlinear term = -(1.1+0.1*p(t))*1.02**(-cs(t)/7)
388 double h1, h2;
389
390 h1 = (1.1 + 0.1 * x[varp[t]]);
391 h2 = Math.pow(1.02, -x[varcs[t]] / 7.0);
392 g = -h1 * h2;
393 }
394 else if (consset == CONS_DREV) {
395 g = -x[vard[t]] * (x[varp[t]] - 250. / x[varr[t]]);
396 }
397
398 return g;
399 }
400
405 public void evaluateNonlinearJacobian(double[] x, double[] jac, int rowno, int[] jacnum, boolean ignerr, int thread) {
406 assert x.length == jac.length;
407
408 IntPair conspair = consmapping.get(rowno);
409 if (conspair == null) return;
410
411 int consset = conspair.first();
412 int t = conspair.second();
413
414 assert (consset == CONS_SEQ || consset == CONS_DREV);
415
416 if (consset == CONS_SEQ) {
417 // seq equation. Nonlinear term = -(1.1+0.1*p(t))*1.02**(-cs(t)/7)
418 double h1, h2;
419
420 h1 = (1.1 + 0.1 * x[varp[t]]);
421 h2 = Math.pow(1.02, -x[varcs[t]] / 7.0);
422
423 jac[varcs[t]] = h1 * h2 * Math.log(1.02) / 7.0;
424 jac[varp[t]] = -h2 * 0.1;
425 }
426 else if (consset == CONS_DREV) {
427 jac[vard[t]] = -(x[varp[t]] - 250. / x[varr[t]]);
428 jac[varr[t]] = -x[vard[t]] * 250. / Math.pow(x[varr[t]], 2);
429 jac[varp[t]] = -x[vard[t]];
430 }
431 }
432}
IntPair(int first, int second)
Definition pinadd.java:98
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 pinadd.py:382
license_int_1
Definition pinadd.py:380
retcode
Definition pinadd.py:414
license_text
Definition pinadd.py:383
msghdlr
Definition pinadd.py:376
license_int_2
Definition pinadd.py:381
static void main(String argv[])
Definition pinadd.java:15
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
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 pinadd.java:405
void buildModel(int T, double[] xkeep, int[] xstat, int[] estat)
adds variables and constraints to the model
Definition pinadd.java:118
double evaluateNonlinearTerm(double[] x, int rowno, boolean ignerr, int thread)
callback method for evaluating the nonlinear terms in a given row
Definition pinadd.java:377
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
int T
Definition pinadd.c:14