diff --git a/AfterPreProcessing.txt b/AfterPreProcessing.txt index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bb11d391fba2fdab6717d6591c92d83d9920eb46 100644 --- a/AfterPreProcessing.txt +++ b/AfterPreProcessing.txt @@ -0,0 +1,122 @@ +\ SCIP STATISTICS +\ Problem name : data/6f4s.lp_relaxscip +\ Variables : 54 (54 binary, 0 integer, 0 implicit integer, 0 continuous) +\ Constraints : 36 +Minimize + Obj: +1 t_x_{1}_{0} +15 t_x_{1}_{15} +30 t_x_{1}_{30} +45 t_x_{1}_{45} +60 t_x_{1}_{60} +75 t_x_{1}_{75} + +90 t_x_{1}_{90} +105 t_x_{1}_{105} +120 t_x_{1}_{120} +15 t_x_{2}_{15} +30 t_x_{2}_{30} +45 t_x_{2}_{45} + +60 t_x_{2}_{60} +75 t_x_{2}_{75} +90 t_x_{2}_{90} +105 t_x_{2}_{105} +120 t_x_{2}_{120} +15 t_x_{3}_{15} + +30 t_x_{3}_{30} +45 t_x_{3}_{45} +60 t_x_{3}_{60} +75 t_x_{3}_{75} +90 t_x_{3}_{90} +105 t_x_{3}_{105} + +120 t_x_{3}_{120} +15 t_x_{4}_{15} +30 t_x_{4}_{30} +45 t_x_{4}_{45} +60 t_x_{4}_{60} +75 t_x_{4}_{75} + +90 t_x_{4}_{90} +105 t_x_{4}_{105} +120 t_x_{4}_{120} +15 t_x_{5}_{15} +30 t_x_{5}_{30} +45 t_x_{5}_{45} + +60 t_x_{5}_{60} +75 t_x_{5}_{75} +90 t_x_{5}_{90} +105 t_x_{5}_{105} +120 t_x_{5}_{120} +15 t_x_{6}_{15} + +30 t_x_{6}_{30} +45 t_x_{6}_{45} +60 t_x_{6}_{60} +75 t_x_{6}_{75} +90 t_x_{6}_{90} +105 t_x_{6}_{105} + +120 t_x_{6}_{120} +Subject to + slot1: +1 t_x_{1}_{0} +1 t_x_{2}_{0} <= +1 + slot2: +1 t_x_{1}_{15} +1 t_x_{2}_{15} <= +1 + slot3: +1 t_x_{1}_{30} +1 t_x_{2}_{30} <= +1 + slot4: +1 t_x_{1}_{45} +1 t_x_{2}_{45} <= +1 + slot5: +1 t_x_{1}_{60} +1 t_x_{2}_{60} <= +1 + slot6: +1 t_x_{1}_{75} +1 t_x_{2}_{75} <= +1 + slot7: +1 t_x_{1}_{90} +1 t_x_{2}_{90} <= +1 + slot8: +1 t_x_{1}_{105} +1 t_x_{2}_{105} <= +1 + F_6: +1 t_x_{6}_{0} +1 t_x_{6}_{15} +1 t_x_{6}_{30} +1 t_x_{6}_{45} +1 t_x_{6}_{60} +1 t_x_{6}_{75} +1 t_x_{6}_{90} + +1 t_x_{6}_{105} +1 t_x_{6}_{120} = +1 + slot10: +1 t_x_{2}_{0} +1 t_x_{3}_{0} +1 t_x_{4}_{0} <= +1 + slot11: +1 t_x_{2}_{15} +1 t_x_{3}_{15} +1 t_x_{4}_{15} <= +1 + slot12: +1 t_x_{2}_{30} +1 t_x_{3}_{30} +1 t_x_{4}_{30} <= +1 + slot13: +1 t_x_{2}_{45} +1 t_x_{3}_{45} +1 t_x_{4}_{45} <= +1 + slot14: +1 t_x_{2}_{60} +1 t_x_{3}_{60} +1 t_x_{4}_{60} <= +1 + slot15: +1 t_x_{2}_{75} +1 t_x_{3}_{75} +1 t_x_{4}_{75} <= +1 + slot16: +1 t_x_{2}_{90} +1 t_x_{3}_{90} +1 t_x_{4}_{90} <= +1 + F_4: +1 t_x_{4}_{0} +1 t_x_{4}_{15} +1 t_x_{4}_{30} +1 t_x_{4}_{45} +1 t_x_{4}_{60} +1 t_x_{4}_{75} +1 t_x_{4}_{90} + +1 t_x_{4}_{105} +1 t_x_{4}_{120} = +1 + F_2: +1 t_x_{2}_{0} +1 t_x_{2}_{15} +1 t_x_{2}_{30} +1 t_x_{2}_{45} +1 t_x_{2}_{60} +1 t_x_{2}_{75} +1 t_x_{2}_{90} + +1 t_x_{2}_{105} +1 t_x_{2}_{120} = +1 + slot19: +1 t_x_{1}_{0} +1 t_x_{3}_{0} +1 t_x_{5}_{0} <= +1 + slot20: +1 t_x_{1}_{15} +1 t_x_{3}_{15} +1 t_x_{5}_{15} <= +1 + slot21: +1 t_x_{1}_{30} +1 t_x_{3}_{30} +1 t_x_{5}_{30} <= +1 + slot22: +1 t_x_{1}_{45} +1 t_x_{3}_{45} +1 t_x_{5}_{45} <= +1 + slot23: +1 t_x_{1}_{60} +1 t_x_{3}_{60} +1 t_x_{5}_{60} <= +1 + slot24: +1 t_x_{1}_{75} +1 t_x_{3}_{75} +1 t_x_{5}_{75} <= +1 + F_1: +1 t_x_{1}_{0} +1 t_x_{1}_{15} +1 t_x_{1}_{30} +1 t_x_{1}_{45} +1 t_x_{1}_{60} +1 t_x_{1}_{75} +1 t_x_{1}_{90} + +1 t_x_{1}_{105} +1 t_x_{1}_{120} = +1 + F_3: +1 t_x_{3}_{0} +1 t_x_{3}_{15} +1 t_x_{3}_{30} +1 t_x_{3}_{45} +1 t_x_{3}_{60} +1 t_x_{3}_{75} +1 t_x_{3}_{90} + +1 t_x_{3}_{105} +1 t_x_{3}_{120} = +1 + F_5: +1 t_x_{5}_{0} +1 t_x_{5}_{15} +1 t_x_{5}_{30} +1 t_x_{5}_{45} +1 t_x_{5}_{60} +1 t_x_{5}_{75} +1 t_x_{5}_{90} + +1 t_x_{5}_{105} +1 t_x_{5}_{120} = +1 + slot28: +1 t_x_{4}_{0} +1 t_x_{5}_{0} +1 t_x_{6}_{0} <= +1 + slot29: +1 t_x_{4}_{15} +1 t_x_{5}_{15} +1 t_x_{6}_{15} <= +1 + slot30: +1 t_x_{4}_{30} +1 t_x_{5}_{30} +1 t_x_{6}_{30} <= +1 + slot31: +1 t_x_{4}_{45} +1 t_x_{5}_{45} +1 t_x_{6}_{45} <= +1 + slot32: +1 t_x_{4}_{60} +1 t_x_{5}_{60} +1 t_x_{6}_{60} <= +1 + slot33: +1 t_x_{4}_{75} +1 t_x_{5}_{75} +1 t_x_{6}_{75} <= +1 + slot35: +1 t_x_{4}_{105} +1 t_x_{5}_{105} +1 t_x_{6}_{105} <= +1 + cf1_0: -1 t_x_{2}_{60} +1 t_x_{3}_{0} +1 t_x_{3}_{15} +1 t_x_{3}_{30} +1 t_x_{3}_{45} +1 t_x_{3}_{75} + >= +0 + cf1_1: -1 t_x_{1}_{15} -1 t_x_{3}_{30} -1 t_x_{4}_{15} -1 t_x_{6}_{30} >= -3 +Bounds + 0 <= t_x_{1}_{0} <= 1 + 0 <= t_x_{1}_{15} <= 1 + 0 <= t_x_{1}_{30} <= 1 + 0 <= t_x_{1}_{45} <= 1 + 0 <= t_x_{1}_{60} <= 1 + 0 <= t_x_{1}_{75} <= 0 + 0 <= t_x_{1}_{90} <= 0 + 0 <= t_x_{1}_{105} <= 0 + 0 <= t_x_{1}_{120} <= 0 + 0 <= t_x_{2}_{0} <= 1 + 0 <= t_x_{2}_{15} <= 1 + 0 <= t_x_{2}_{30} <= 1 + 0 <= t_x_{2}_{45} <= 1 + 0 <= t_x_{2}_{60} <= 1 + 0 <= t_x_{2}_{75} <= 1 + 0 <= t_x_{2}_{90} <= 0 + 0 <= t_x_{2}_{105} <= 0 + 0 <= t_x_{2}_{120} <= 0 + 0 <= t_x_{3}_{0} <= 1 + 0 <= t_x_{3}_{15} <= 1 + 0 <= t_x_{3}_{30} <= 1 + 0 <= t_x_{3}_{45} <= 1 + 0 <= t_x_{3}_{60} <= 1 + 0 <= t_x_{3}_{75} <= 1 + 0 <= t_x_{3}_{90} <= 0 + 0 <= t_x_{3}_{105} <= 0 + 0 <= t_x_{3}_{120} <= 0 + 0 <= t_x_{4}_{0} <= 1 + 0 <= t_x_{4}_{15} <= 1 + 0 <= t_x_{4}_{30} <= 1 + 0 <= t_x_{4}_{45} <= 1 + 0 <= t_x_{4}_{60} <= 1 + 0 <= t_x_{4}_{75} <= 1 + 0 <= t_x_{4}_{90} <= 0 + 0 <= t_x_{4}_{105} <= 0 + 0 <= t_x_{4}_{120} <= 0 + 0 <= t_x_{5}_{0} <= 1 + 0 <= t_x_{5}_{15} <= 1 + 0 <= t_x_{5}_{30} <= 1 + 0 <= t_x_{5}_{45} <= 1 + 0 <= t_x_{5}_{60} <= 1 + 0 <= t_x_{5}_{75} <= 1 + 0 <= t_x_{5}_{90} <= 0 + 0 <= t_x_{5}_{105} <= 0 + 0 <= t_x_{5}_{120} <= 0 + 0 <= t_x_{6}_{0} <= 1 + 0 <= t_x_{6}_{15} <= 1 + 0 <= t_x_{6}_{30} <= 1 + 0 <= t_x_{6}_{45} <= 1 + 0 <= t_x_{6}_{60} <= 1 + 0 <= t_x_{6}_{75} <= 1 + 0 <= t_x_{6}_{90} <= 0 + 0 <= t_x_{6}_{105} <= 0 + 0 <= t_x_{6}_{120} <= 0 +Binaries + t_x_{1}_{0} t_x_{1}_{15} t_x_{1}_{30} t_x_{1}_{45} t_x_{1}_{60} t_x_{1}_{75} t_x_{1}_{90} t_x_{1}_{105} + t_x_{1}_{120} t_x_{2}_{0} t_x_{2}_{15} t_x_{2}_{30} t_x_{2}_{45} t_x_{2}_{60} t_x_{2}_{75} t_x_{2}_{90} + t_x_{2}_{105} t_x_{2}_{120} t_x_{3}_{0} t_x_{3}_{15} t_x_{3}_{30} t_x_{3}_{45} t_x_{3}_{60} t_x_{3}_{75} + t_x_{3}_{90} t_x_{3}_{105} t_x_{3}_{120} t_x_{4}_{0} t_x_{4}_{15} t_x_{4}_{30} t_x_{4}_{45} t_x_{4}_{60} + t_x_{4}_{75} t_x_{4}_{90} t_x_{4}_{105} t_x_{4}_{120} t_x_{5}_{0} t_x_{5}_{15} t_x_{5}_{30} t_x_{5}_{45} + t_x_{5}_{60} t_x_{5}_{75} t_x_{5}_{90} t_x_{5}_{105} t_x_{5}_{120} t_x_{6}_{0} t_x_{6}_{15} t_x_{6}_{30} + t_x_{6}_{45} t_x_{6}_{60} t_x_{6}_{75} t_x_{6}_{90} t_x_{6}_{105} t_x_{6}_{120} +End diff --git a/bin/LagrangianRelaxation.linux.x86_64.gnu.opt.spx2 b/bin/LagrangianRelaxation.linux.x86_64.gnu.opt.spx2 index 7646cf7ffeb605a22cfef039e9b54308b7470493..e5990c187b37c0da0a444cab8cf1ee388826497c 100755 Binary files a/bin/LagrangianRelaxation.linux.x86_64.gnu.opt.spx2 and b/bin/LagrangianRelaxation.linux.x86_64.gnu.opt.spx2 differ diff --git a/dual.txt b/dual.txt index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f20efa7b22c8a15995020098e982408c121bcc2e 100644 --- a/dual.txt +++ b/dual.txt @@ -0,0 +1,21 @@ +dualbound = 1.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 21.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 41.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 61.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 78.000000, lowerbound=46.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 83.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 85.000000, lowerbound=75.000000, norm of subgrad 5.830952 stepsize= 1.000000 +dualbound = 93.000000, lowerbound=31.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 100.000000, lowerbound=46.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 105.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 103.000000, lowerbound=75.000000, norm of subgrad 5.830952 stepsize= 1.000000 +dualbound = 115.000000, lowerbound=31.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 119.000000, lowerbound=75.000000, norm of subgrad 5.830952 stepsize= 1.000000 +dualbound = 117.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 127.000000, lowerbound=75.000000, norm of subgrad 5.830952 stepsize= 1.000000 +dualbound = 129.000000, lowerbound=1.000000, norm of subgrad 6.164414 stepsize= 1.000000 +dualbound = 135.000000, lowerbound=75.000000, norm of subgrad 5.830952 stepsize= 1.000000 +dualbound = 139.000000, lowerbound=31.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 147.000000, lowerbound=31.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 152.000000, lowerbound=60.000000, norm of subgrad 5.099020 stepsize= 1.000000 +dualbound = 153.000000, lowerbound=61.000000, norm of subgrad 5.099020 stepsize= 1.000000 diff --git a/lowerbounds.txt b/lowerbounds.txt index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2c00649f04f7aad1260860d43c81fd9ae4fc5ad5 100644 --- a/lowerbounds.txt +++ b/lowerbounds.txt @@ -0,0 +1,22 @@ +1.000000 +14.000000 +27.000000 +40.000000 +50.000000 +51.000000 +49.000000 +54.000000 +58.000000 +59.000000 +53.000000 +62.000000 +63.000000 +58.000000 +65.000000 +64.000000 +67.000000 +68.000000 +73.000000 +74.000000 +72.000000 +71.000000 diff --git a/obj/static/O.linux.x86_64.gnu.opt/probdata_lagr.o b/obj/static/O.linux.x86_64.gnu.opt/probdata_lagr.o index 7e5b979768dd2bbe7213f53767eae1accfb489a8..443feb2f2b64a4969623f001989423ee55a8691d 100644 Binary files a/obj/static/O.linux.x86_64.gnu.opt/probdata_lagr.o and b/obj/static/O.linux.x86_64.gnu.opt/probdata_lagr.o differ diff --git a/obj/static/O.linux.x86_64.gnu.opt/relax_lagr.o b/obj/static/O.linux.x86_64.gnu.opt/relax_lagr.o index 5484d4c3e92bf6ec17dd9678cf50ceae9b9a9c2d..2640a527281af9008f8a7e4ba7f71b1af65ce37d 100644 Binary files a/obj/static/O.linux.x86_64.gnu.opt/relax_lagr.o and b/obj/static/O.linux.x86_64.gnu.opt/relax_lagr.o differ diff --git a/probdata.txt b/probdata.txt new file mode 100644 index 0000000000000000000000000000000000000000..ee9f3ea3cd6b00bec3187074c25dedd799f73cec --- /dev/null +++ b/probdata.txt @@ -0,0 +1,31 @@ +28 nslot conss +all = 76 + 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 2 4 6 8 10 12 14 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 t_x_{1}_{0} t_x_{2}_{0} +t_x_{1}_{15} t_x_{2}_{15} +t_x_{1}_{30} t_x_{2}_{30} +t_x_{1}_{45} t_x_{2}_{45} +t_x_{1}_{60} t_x_{2}_{60} +t_x_{1}_{75} t_x_{2}_{75} +t_x_{1}_{90} t_x_{2}_{90} +t_x_{1}_{105} t_x_{2}_{105} +t_x_{2}_{0} t_x_{3}_{0} t_x_{4}_{0} +t_x_{2}_{15} t_x_{3}_{15} t_x_{4}_{15} +t_x_{2}_{30} t_x_{3}_{30} t_x_{4}_{30} +t_x_{2}_{45} t_x_{3}_{45} t_x_{4}_{45} +t_x_{2}_{60} t_x_{3}_{60} t_x_{4}_{60} +t_x_{2}_{75} t_x_{3}_{75} t_x_{4}_{75} +t_x_{2}_{90} t_x_{3}_{90} t_x_{4}_{90} +t_x_{1}_{0} t_x_{3}_{0} t_x_{5}_{0} +t_x_{1}_{15} t_x_{3}_{15} t_x_{5}_{15} +t_x_{1}_{30} t_x_{3}_{30} t_x_{5}_{30} +t_x_{1}_{45} t_x_{3}_{45} t_x_{5}_{45} +t_x_{1}_{60} t_x_{3}_{60} t_x_{5}_{60} +t_x_{1}_{75} t_x_{3}_{75} t_x_{5}_{75} +t_x_{4}_{0} t_x_{5}_{0} t_x_{6}_{0} +t_x_{4}_{15} t_x_{5}_{15} t_x_{6}_{15} +t_x_{4}_{30} t_x_{5}_{30} t_x_{6}_{30} +t_x_{4}_{45} t_x_{5}_{45} t_x_{6}_{45} +t_x_{4}_{60} t_x_{5}_{60} t_x_{6}_{60} +t_x_{4}_{75} t_x_{5}_{75} t_x_{6}_{75} +t_x_{4}_{105} t_x_{5}_{105} t_x_{6}_{105} diff --git a/sol.txt b/sol.txt index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5c268155fb18f503994bda4d20ad462254b87d7d 100644 --- a/sol.txt +++ b/sol.txt @@ -0,0 +1,133 @@ + + F_6 +t_x_{6}_{0} 45 nvarincons = 1 var = t_x_{4}_{0} var = t_x_{5}_{0} +(t_x_{6}_{0},45,1.000000) +t_x_{6}_{15} 46 (t_x_{6}_{15},46,0.000000) +t_x_{6}_{30} 47 (t_x_{6}_{30},47,0.000000) +t_x_{6}_{45} 48 (t_x_{6}_{45},48,0.000000) +t_x_{6}_{60} 49 (t_x_{6}_{60},49,0.000000) +t_x_{6}_{75} 50 (t_x_{6}_{75},50,0.000000) +t_x_{6}_{90} 51 (t_x_{6}_{90},51,0.000000) +t_x_{6}_{105} 52 (t_x_{6}_{105},52,0.000000) +t_x_{6}_{120} 53 (t_x_{6}_{120},53,0.000000) + + + F_4 +t_x_{4}_{0} 27 (t_x_{4}_{0},27,0.000000) +t_x_{4}_{15} 28 nvarincons = 2 var = t_x_{2}_{15} var = t_x_{3}_{15} var = t_x_{5}_{15} var = t_x_{6}_{15} +(t_x_{4}_{15},28,1.000000) +t_x_{4}_{30} 29 (t_x_{4}_{30},29,0.000000) +t_x_{4}_{45} 30 (t_x_{4}_{45},30,0.000000) +t_x_{4}_{60} 31 (t_x_{4}_{60},31,0.000000) +t_x_{4}_{75} 32 (t_x_{4}_{75},32,0.000000) +t_x_{4}_{90} 33 (t_x_{4}_{90},33,0.000000) +t_x_{4}_{105} 34 (t_x_{4}_{105},34,0.000000) +t_x_{4}_{120} 35 (t_x_{4}_{120},35,0.000000) + + + F_5 +t_x_{5}_{0} 36 (t_x_{5}_{0},36,0.000000) +t_x_{5}_{15} 37 (t_x_{5}_{15},37,0.000000) +t_x_{5}_{30} 38 nvarincons = 2 var = t_x_{1}_{30} var = t_x_{3}_{30} var = t_x_{4}_{30} var = t_x_{6}_{30} +(t_x_{5}_{30},38,1.000000) +t_x_{5}_{45} 39 (t_x_{5}_{45},39,0.000000) +t_x_{5}_{60} 40 (t_x_{5}_{60},40,0.000000) +t_x_{5}_{75} 41 (t_x_{5}_{75},41,0.000000) +t_x_{5}_{90} 42 (t_x_{5}_{90},42,0.000000) +t_x_{5}_{105} 43 (t_x_{5}_{105},43,0.000000) +t_x_{5}_{120} 44 (t_x_{5}_{120},44,0.000000) + + + F_3 +t_x_{3}_{0} 18 nvarincons = 2 var = t_x_{2}_{0} var = t_x_{4}_{0} var = t_x_{1}_{0} var = t_x_{5}_{0} +(t_x_{3}_{0},18,1.000000) +t_x_{3}_{15} 19 (t_x_{3}_{15},19,0.000000) +t_x_{3}_{30} 20 (t_x_{3}_{30},20,0.000000) +t_x_{3}_{45} 21 (t_x_{3}_{45},21,0.000000) +t_x_{3}_{60} 22 (t_x_{3}_{60},22,0.000000) +t_x_{3}_{75} 23 (t_x_{3}_{75},23,0.000000) +t_x_{3}_{90} 24 (t_x_{3}_{90},24,0.000000) +t_x_{3}_{105} 25 (t_x_{3}_{105},25,0.000000) +t_x_{3}_{120} 26 (t_x_{3}_{120},26,0.000000) + + + F_1 +t_x_{1}_{0} 0 (t_x_{1}_{0},0,0.000000) +t_x_{1}_{15} 1 nvarincons = 2 var = t_x_{2}_{15} var = t_x_{3}_{15} var = t_x_{5}_{15} +(t_x_{1}_{15},1,1.000000) +t_x_{1}_{30} 2 (t_x_{1}_{30},2,0.000000) +t_x_{1}_{45} 3 (t_x_{1}_{45},3,0.000000) +t_x_{1}_{60} 4 (t_x_{1}_{60},4,0.000000) +t_x_{1}_{75} 5 (t_x_{1}_{75},5,0.000000) +t_x_{1}_{90} 6 (t_x_{1}_{90},6,0.000000) +t_x_{1}_{105} 7 (t_x_{1}_{105},7,0.000000) +t_x_{1}_{120} 8 (t_x_{1}_{120},8,0.000000) + + + F_2 +t_x_{2}_{0} 9 (t_x_{2}_{0},9,0.000000) +t_x_{2}_{15} 10 (t_x_{2}_{15},10,0.000000) +t_x_{2}_{30} 11 nvarincons = 2 var = t_x_{1}_{30} var = t_x_{3}_{30} var = t_x_{4}_{30} +(t_x_{2}_{30},11,1.000000) +t_x_{2}_{45} 12 (t_x_{2}_{45},12,0.000000) +t_x_{2}_{60} 13 (t_x_{2}_{60},13,0.000000) +t_x_{2}_{75} 14 (t_x_{2}_{75},14,0.000000) +t_x_{2}_{90} 15 (t_x_{2}_{90},15,0.000000) +t_x_{2}_{105} 16 (t_x_{2}_{105},16,0.000000) +t_x_{2}_{120} 17 (t_x_{2}_{120},17,0.000000) + + (t_x_{1}_{0} 0.000000 weight 1.000000) + (t_x_{1}_{15} 1.000000 weight 15.000000) + (t_x_{1}_{30} 0.000000 weight 30.000000) + (t_x_{1}_{45} 0.000000 weight 45.000000) + (t_x_{1}_{60} 0.000000 weight 60.000000) + (t_x_{1}_{75} 0.000000 weight 75.000000) + (t_x_{1}_{90} 0.000000 weight 90.000000) + (t_x_{1}_{105} 0.000000 weight 105.000000) + (t_x_{1}_{120} 0.000000 weight 120.000000) + (t_x_{2}_{0} 0.000000 weight 0.000000) + (t_x_{2}_{15} 0.000000 weight 15.000000) + (t_x_{2}_{30} 1.000000 weight 30.000000) + (t_x_{2}_{45} 0.000000 weight 45.000000) + (t_x_{2}_{60} 0.000000 weight 60.000000) + (t_x_{2}_{75} 0.000000 weight 75.000000) + (t_x_{2}_{90} 0.000000 weight 90.000000) + (t_x_{2}_{105} 0.000000 weight 105.000000) + (t_x_{2}_{120} 0.000000 weight 120.000000) + (t_x_{3}_{0} 1.000000 weight 0.000000) + (t_x_{3}_{15} 0.000000 weight 15.000000) + (t_x_{3}_{30} 0.000000 weight 30.000000) + (t_x_{3}_{45} 0.000000 weight 45.000000) + (t_x_{3}_{60} 0.000000 weight 60.000000) + (t_x_{3}_{75} 0.000000 weight 75.000000) + (t_x_{3}_{90} 0.000000 weight 90.000000) + (t_x_{3}_{105} 0.000000 weight 105.000000) + (t_x_{3}_{120} 0.000000 weight 120.000000) + (t_x_{4}_{0} 0.000000 weight 0.000000) + (t_x_{4}_{15} 1.000000 weight 15.000000) + (t_x_{4}_{30} 0.000000 weight 30.000000) + (t_x_{4}_{45} 0.000000 weight 45.000000) + (t_x_{4}_{60} 0.000000 weight 60.000000) + (t_x_{4}_{75} 0.000000 weight 75.000000) + (t_x_{4}_{90} 0.000000 weight 90.000000) + (t_x_{4}_{105} 0.000000 weight 105.000000) + (t_x_{4}_{120} 0.000000 weight 120.000000) + (t_x_{5}_{0} 0.000000 weight 0.000000) + (t_x_{5}_{15} 0.000000 weight 15.000000) + (t_x_{5}_{30} 1.000000 weight 30.000000) + (t_x_{5}_{45} 0.000000 weight 45.000000) + (t_x_{5}_{60} 0.000000 weight 60.000000) + (t_x_{5}_{75} 0.000000 weight 75.000000) + (t_x_{5}_{90} 0.000000 weight 90.000000) + (t_x_{5}_{105} 0.000000 weight 105.000000) + (t_x_{5}_{120} 0.000000 weight 120.000000) + (t_x_{6}_{0} 1.000000 weight 0.000000) + (t_x_{6}_{15} 0.000000 weight 15.000000) + (t_x_{6}_{30} 0.000000 weight 30.000000) + (t_x_{6}_{45} 0.000000 weight 45.000000) + (t_x_{6}_{60} 0.000000 weight 60.000000) + (t_x_{6}_{75} 0.000000 weight 75.000000) + (t_x_{6}_{90} 0.000000 weight 90.000000) + (t_x_{6}_{105} 0.000000 weight 105.000000) + (t_x_{6}_{120} 0.000000 weight 120.000000) + \ No newline at end of file diff --git a/src/probdata_lagr.cpp b/src/probdata_lagr.cpp index 20f6666df11db5ec0bbc27c1ba3f61d52228ba69..0363583eb0150dffa42256b21cdb985c9b09c54b 100644 --- a/src/probdata_lagr.cpp +++ b/src/probdata_lagr.cpp @@ -176,6 +176,8 @@ SCIP_RETCODE SCIPcreateprobdata int** badconss ) { + FILE* prob; + prob = fopen("probdata.txt","wr"); int nconss = SCIPgetNConss(relaxscip); int nvars = SCIPgetNVars(relaxscip); int nSlotConss = 0; @@ -189,7 +191,7 @@ SCIP_RETCODE SCIPcreateprobdata ++nSlotConss; } } - printf("%d nslot conss",nSlotConss); + fprintf(prob,"%d nslot conss \n",nSlotConss); int allnconsvars=0; int nconsvars=0; @@ -239,7 +241,11 @@ SCIP_RETCODE SCIPcreateprobdata { (*varbuffers)[v] =vars[v]; } - printf("all = %d\n",allnconsvars); + // for (int v = 0; v < nvars; v++) + // { + // fprintf(prob,"(%s %d)\t", SCIPvarGetName(vars[v]), SCIPvarGetIndex(vars[v])); + // } + fprintf(prob,"all = %d\n",allnconsvars); counter=0; for (int r = 0; r < nSlotConss; ++r) @@ -254,7 +260,7 @@ SCIP_RETCODE SCIPcreateprobdata if (!success){ abort(); } listnconsvars[r] = nconsvars; - printf(" %d ",listnconsvars[r]); + fprintf(prob," %d ",listnconsvars[r]); for (int j = 0; j < nconsvars; ++j) /* (8) */ { SCIP_VAR* varx = (*varbuffers)[j]; @@ -264,23 +270,29 @@ SCIP_RETCODE SCIPcreateprobdata counter++; } } - printf("\n"); + int* increasingorder; //example {2,4,6,9,12,...} SCIP_CALL(SCIPallocBufferArray(relaxscip,&increasingorder,nSlotConss)); increasingorder[0] = listnconsvars[0]; //listnconsvars[0]; for(int r=1; r<nSlotConss;r++) { increasingorder[r]=listnconsvars[r]+increasingorder[r-1]; - // printf(" %d ",increasingorder[r]); + + } + fprintf(prob,"\n"); + //printing to prob.txt + for(int r=0; r<nSlotConss;r++) + { + fprintf(prob," %d ",increasingorder[r]); } for(int r=0; r<nSlotConss;r++) { for (int p = increasingorder[r]-listnconsvars[r]; p < increasingorder[r]; p++) { - printf("%d ",listconsvarids[p]); + fprintf(prob,"%s ",SCIPvarGetName(vars[listconsvarids[p]])); } - printf("\n"); + fprintf(prob,"\n"); } // for(int s=0;s<allnconsvars;s++) @@ -360,7 +372,7 @@ SCIP_RETCODE SCIPcreateprobdata // // // printf("%d\n->",counter); // } - + fclose(prob); SCIP_CALL(SCIPallocMemory(relaxscip,probdata)); (*probdata)->nSlotConss = nSlotConss; diff --git a/src/relax_lagr.cpp b/src/relax_lagr.cpp index 3cccb7ad99975aa52ebe5a937f82e6640da7ef2f..b556e0aca96e4719111c533d1bca76fa45b87762 100644 --- a/src/relax_lagr.cpp +++ b/src/relax_lagr.cpp @@ -42,8 +42,8 @@ #define RELAX_NAME "lagr" -#define RELAX_DESC "relaxator template" -#define RELAX_PRIORITY 0 +#define RELAX_DESC "relaxator" +#define RELAX_PRIORITY 100000 #define RELAX_FREQ 0 @@ -115,320 +115,320 @@ static SCIP_DECL_RELAXINIT(relaxInitlagr) { /*lint --e{715}*/ - SCIP* relaxscip; - SCIP_HASHMAP* varmap; - SCIP_HASHMAP* consmap; - SCIP_CONS** conss; - SCIP_PROBDATA* probdata; - SCIP_VARDATA* vardata; - - SCIP_Real relaxval; - SCIP_Bool valid; - int nconss; - int i; - int counter; - int id; - - - // *lowerbound = -SCIPinfinity(scip); - // *result = SCIP_DIDNOTRUN; - - /* we can only run if none of the present constraints expect their variables to be binary or integer during transformation */ - conss = SCIPgetConss(scip); - nconss = SCIPgetNConss(scip); - - /* create the variable mapping hash map */ - SCIP_CALL( SCIPcreate(&relaxscip) ); - SCIP_CALL( SCIPhashmapCreate(&varmap, SCIPblkmem(relaxscip), SCIPgetNVars(scip)) ); - valid = FALSE; - SCIP_CALL( SCIPcopy(scip, relaxscip, varmap, consmap, "relaxscip", FALSE, FALSE, FALSE, FALSE, &valid) ); + // SCIP* relaxscip; + // SCIP_HASHMAP* varmap; + // SCIP_HASHMAP* consmap; + // SCIP_CONS** conss; + // SCIP_PROBDATA* probdata; + // SCIP_VARDATA* vardata; + + // SCIP_Real relaxval; + // SCIP_Bool valid; + // int nconss; + // int i; + // int counter; + // int id; + + + // // *lowerbound = -SCIPinfinity(scip); + // // *result = SCIP_DIDNOTRUN; + + // /* we can only run if none of the present constraints expect their variables to be binary or integer during transformation */ + // conss = SCIPgetConss(scip); + // nconss = SCIPgetNConss(scip); + + // /* create the variable mapping hash map */ + // SCIP_CALL( SCIPcreate(&relaxscip) ); + // SCIP_CALL( SCIPhashmapCreate(&varmap, SCIPblkmem(relaxscip), SCIPgetNVars(scip)) ); + // valid = FALSE; + // SCIP_CALL( SCIPcopy(scip, relaxscip, varmap, consmap, "relaxscip", FALSE, FALSE, FALSE, FALSE, &valid) ); - /**************************************************************************************************************/ - /*First, */ - //*the probdata: where we get to identify the bad constraint we want to formulate(in our case, the slot conss) */ - /***************************************************************************************************************/ - int nvars = SCIPgetNVars(relaxscip); - SCIP_VAR** vars = SCIPgetVars(relaxscip); - SCIP_VAR** varbuffers; - int* badconss; + // /**************************************************************************************************************/ + // /*First, */ + // //*the probdata: where we get to identify the bad constraint we want to formulate(in our case, the slot conss) */ + // /***************************************************************************************************************/ + // int nvars = SCIPgetNVars(relaxscip); + // SCIP_VAR** vars = SCIPgetVars(relaxscip); + // SCIP_VAR** varbuffers; + // int* badconss; - SCIPcreateprobdata(relaxscip,&probdata,SCIPgetConss(relaxscip),vars,&varbuffers,&badconss); /*will be used to identify the # of slot(bad) constraints*/ - int nSlotConss = SCIPgetNSlotConss(probdata); //number of bad(slot) constraint - int allnconsvars = SCIPgetallnconsvars(probdata); //sum of all nconsvars, used for creating later on an array to collect the list of varids in each row - int* listnconsvars = SCIPlistnconsvars(probdata); - int* listconsvarids = SCIPlistconsvarids(probdata); - int* increasingorder = SCIPlistincreasing(probdata); + // SCIPcreateprobdata(relaxscip,&probdata,SCIPgetConss(relaxscip),vars,&varbuffers,&badconss); /*will be used to identify the # of slot(bad) constraints*/ + // int nSlotConss = SCIPgetNSlotConss(probdata); //number of bad(slot) constraint + // int allnconsvars = SCIPgetallnconsvars(probdata); //sum of all nconsvars, used for creating later on an array to collect the list of varids in each row + // int* listnconsvars = SCIPlistnconsvars(probdata); + // int* listconsvarids = SCIPlistconsvarids(probdata); + // int* increasingorder = SCIPlistincreasing(probdata); - /* we then create the vardata function for each variable, to see at which constraint the variable is found*/ - FILE* TimeCollector; - TimeCollector = fopen("time.txt","w"); - SCIP_CLOCK* varslottime; //to help us record the time - SCIP_CALL( SCIPcreateClock(relaxscip, &varslottime) ); //* start time counting* - SCIP_CALL(SCIPstartClock(relaxscip,varslottime)); + // /* we then create the vardata function for each variable, to see at which constraint the variable is found*/ + // FILE* TimeCollector; + // TimeCollector = fopen("time.txt","w"); + // SCIP_CLOCK* varslottime; //to help us record the time + // SCIP_CALL( SCIPcreateClock(relaxscip, &varslottime) ); //* start time counting* + // SCIP_CALL(SCIPstartClock(relaxscip,varslottime)); - SCIP_CLOCK* totaliteration; //to help us record the time - SCIP_CALL( SCIPcreateClock(relaxscip, &totaliteration) ); //* start time counting* + // SCIP_CLOCK* totaliteration; //to help us record the time + // SCIP_CALL( SCIPcreateClock(relaxscip, &totaliteration) ); //* start time counting* - int* consids; + // int* consids; - SCIP_Real* weights; - SCIP_CALL(SCIPallocBufferArray(relaxscip,&weights,nvars)); + // SCIP_Real* weights; + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&weights,nvars)); - SCIP_CALL(SCIPallocBufferArray(relaxscip,&consids,nSlotConss)); + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&consids,nSlotConss)); - SCIP_Real maxobj=0; - for (int v = 0; v < nvars; v++) - { - SCIP_VAR* var = vars[v]; - weights[v]=SCIPvarGetObj(var); - if(maxobj<weights[v]){maxobj=weights[v];} - } + // SCIP_Real maxobj=0; + // for (int v = 0; v < nvars; v++) + // { + // SCIP_VAR* var = vars[v]; + // weights[v]=SCIPvarGetObj(var); + // if(maxobj<weights[v]){maxobj=weights[v];} + // } - for (int v = 0; v < nvars; v++) - { - int* varids; - int NVarInBadConss=0; - int nconsvars = 0; - SCIP_VAR* var = vars[v]; + // for (int v = 0; v < nvars; v++) + // { + // int* varids; + // int NVarInBadConss=0; + // int nconsvars = 0; + // SCIP_VAR* var = vars[v]; - int varindex = SCIPvarGetIndex(var); /* (2) */ - assert(varindex!= NULL); + // int varindex = SCIPvarGetIndex(var); /* (2) */ + // assert(varindex!= NULL); - for (int r = 0; r < nSlotConss; ++r) - { - id = badconss[r]; - SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; - // printf("%s \t",SCIPconsGetName(cons)); - SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); - SCIP_CALL(SCIPgetConsVars(relaxscip, cons, varbuffers, nconsvars, &valid)); - if (!valid){abort(); } + // for (int r = 0; r < nSlotConss; ++r) + // { + // id = badconss[r]; + // SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; + // // printf("%s \t",SCIPconsGetName(cons)); + // SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); + // SCIP_CALL(SCIPgetConsVars(relaxscip, cons, varbuffers, nconsvars, &valid)); + // if (!valid){abort(); } - for (int j = 0; j < nconsvars; ++j) /* (8) */ - { - SCIP_VAR* varx = varbuffers[j]; - int varbufindex = SCIPvarGetIndex(varx); - assert(varbufindex != NULL); - // printf("%s\t \t%d",SCIPvarGetName(varx),varbufindex); + // for (int j = 0; j < nconsvars; ++j) /* (8) */ + // { + // SCIP_VAR* varx = varbuffers[j]; + // int varbufindex = SCIPvarGetIndex(varx); + // assert(varbufindex != NULL); + // // printf("%s\t \t%d",SCIPvarGetName(varx),varbufindex); - /** if var[i] is in cons[c], write conspointer in VarConss and increase nVarConsscounter */ - if (varindex == varbufindex) /* (9) */ - { + // /** if var[i] is in cons[c], write conspointer in VarConss and increase nVarConsscounter */ + // if (varindex == varbufindex) /* (9) */ + // { - // VarSlotConss[NVarInBadConss] = cons; - consids[NVarInBadConss]=id; - NVarInBadConss++; - // printf(" %s \t,",SCIPconsGetName(cons)); - } - } - } + // // VarSlotConss[NVarInBadConss] = cons; + // consids[NVarInBadConss]=id; + // NVarInBadConss++; + // // printf(" %s \t,",SCIPconsGetName(cons)); + // } + // } + // } - SCIP_CALL(SCIPallocBufferArray(relaxscip, &varids, NVarInBadConss)); - for(int t=0;t<NVarInBadConss;t++) - { - varids[t]=consids[t]; - // printf("%d \t",varids[t]); - } - // printf("\n"); - // // vardata=SCIPvarGetData(var); - SCIP_CALL(SCIPallocBlockMemory(scip , &vardata)); - SCIP_CALL(SCIPduplicateBlockMemoryArray(scip, &(vardata->varids), varids, NVarInBadConss)); - vardata->NVarInBadConss = NVarInBadConss; /**copy nVarConss to VarData */ - vardata->varids = varids; - // /**set the variable data to the variable*/ - SCIPvarSetData(var,vardata); - } + // SCIP_CALL(SCIPallocBufferArray(relaxscip, &varids, NVarInBadConss)); + // for(int t=0;t<NVarInBadConss;t++) + // { + // varids[t]=consids[t]; + // // printf("%d \t",varids[t]); + // } + // // printf("\n"); + // // // vardata=SCIPvarGetData(var); + // SCIP_CALL(SCIPallocBlockMemory(scip , &vardata)); + // SCIP_CALL(SCIPduplicateBlockMemoryArray(scip, &(vardata->varids), varids, NVarInBadConss)); + // vardata->NVarInBadConss = NVarInBadConss; /**copy nVarConss to VarData */ + // vardata->varids = varids; + // // /**set the variable data to the variable*/ + // SCIPvarSetData(var,vardata); + // } - SCIP_CALL(SCIPstopClock(relaxscip,varslottime)); + // SCIP_CALL(SCIPstopClock(relaxscip,varslottime)); - FILE* AfterPreProcessing; - AfterPreProcessing = fopen("AfterPreProcessing.txt","w+"); + // FILE* AfterPreProcessing; + // AfterPreProcessing = fopen("AfterPreProcessing.txt","w+"); - // SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); + // // SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); - SCIPinfoMessage(relaxscip, TimeCollector, "\n row and column identified in (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); - for(int r=0;r<nSlotConss;r++) - { - id = badconss[r]; - SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; - SCIP_CALL(SCIPdelCons(relaxscip,cons)); - } + // SCIPinfoMessage(relaxscip, TimeCollector, "\n row and column identified in (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); + // for(int r=0;r<nSlotConss;r++) + // { + // id = badconss[r]; + // SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; + // SCIP_CALL(SCIPdelCons(relaxscip,cons)); + // } - /******************************************************************************************************************/ - /*Next, we will do the initial iteration of finding the dual mulpliers of each slot conss, and their sum(dualsum) */ - /* In the end, we will subtract this sum from the objective of the function. */ - /* It's initial, because while we would search for more dual multipliers to solve the Lagrangian relaxation */ - /******************************************************************************************************************/ - SCIP_Real* dualmultipliers; - SCIP_CALL(SCIPallocBufferArray(relaxscip,&dualmultipliers,nSlotConss)); + // /******************************************************************************************************************/ + // /*Next, we will do the initial iteration of finding the dual mulpliers of each slot conss, and their sum(dualsum) */ + // /* In the end, we will subtract this sum from the objective of the function. */ + // /* It's initial, because while we would search for more dual multipliers to solve the Lagrangian relaxation */ + // /******************************************************************************************************************/ + // SCIP_Real* dualmultipliers; + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&dualmultipliers,nSlotConss)); - SCIP_Real* subgradients; - SCIP_CALL(SCIPallocBufferArray(relaxscip,&subgradients,nSlotConss)); - //initialize subgradients; - SCIP_Real stepsize = 15; - SCIP_Real sumofduals=0; - for ( int r = 0; r < nSlotConss; ++r) - { - dualmultipliers[r] = 0; - sumofduals+=dualmultipliers[r]; //adds the negative of the minimum in each iteration - } + // SCIP_Real* subgradients; + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&subgradients,nSlotConss)); + // //initialize subgradients; + // SCIP_Real stepsize = 15; + // SCIP_Real sumofduals=0; + // for ( int r = 0; r < nSlotConss; ++r) + // { + // dualmultipliers[r] = 0; + // sumofduals+=dualmultipliers[r]; //adds the negative of the minimum in each iteration + // } - // /*******************************************************************************************************/ - // /* The reformulation of the problem can be written as follows */ - // //*>>>>>>>>>>>>>>>>>> min sum { (w[i]+sum{dual[j]})}x[i]-sum{dual[r]} <<<<<<<<<<<< */ - // /*where i is nvars, j is NVarInBadConss, and r is nSlotConss for our case *******************************/ - // /****************************************************************************************************************/ - // /* The following function will add the following to the obj(weight) of the variable, */ - // //* the obj(weight) of var + the sum of the dualmultipliers of bad constraints which contains this variable */ - // /****************************************************************************************************************/ + // // /*******************************************************************************************************/ + // // /* The reformulation of the problem can be written as follows */ + // // //*>>>>>>>>>>>>>>>>>> min sum { (w[i]+sum{dual[j]})}x[i]-sum{dual[r]} <<<<<<<<<<<< */ + // // /*where i is nvars, j is NVarInBadConss, and r is nSlotConss for our case *******************************/ + // // /****************************************************************************************************************/ + // // /* The following function will add the following to the obj(weight) of the variable, */ + // // //* the obj(weight) of var + the sum of the dualmultipliers of bad constraints which contains this variable */ + // // /****************************************************************************************************************/ - FILE* solutions; - solutions = fopen("sol.txt","wr"); - FILE* dual; - dual= fopen("dual.txt","wr"); - FILE* variableinfo; - variableinfo = fopen("var.txt","wr"); - FILE* subgrad; - subgrad = fopen("subgrads.txt","wr"); - FILE* varobjects; - varobjects=fopen("varobjs.txt","wr"); - FILE* lower; - lower=fopen("lowerbounds.txt","wr"); - FILE* iter; - iter=fopen("iter.txt","wr"); - + // FILE* solutions; + // solutions = fopen("sol.txt","wr"); + // FILE* dual; + // dual= fopen("dual.txt","wr"); + // FILE* variableinfo; + // variableinfo = fopen("var.txt","wr"); + // FILE* subgrad; + // subgrad = fopen("subgrads.txt","wr"); + // FILE* varobjects; + // varobjects=fopen("varobjs.txt","wr"); + // FILE* lower; + // lower=fopen("lowerbounds.txt","wr"); + // FILE* iter; + // iter=fopen("iter.txt","wr"); - //fprintf(lower, "hi"); - SCIP_Real* solvals; - SCIP_CALL(SCIPallocBufferArray(relaxscip,&solvals,nvars+2)); - solvals[nvars+1]=0; //for last solutions - solvals[nvars]=0; //for best solution - int maxiter=1500; + // //fprintf(lower, "hi"); + // SCIP_Real* solvals; + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&solvals,nvars+2)); + // solvals[nvars+1]=0; //for last solutions + // solvals[nvars]=0; //for best solution - int oscilatecounter=0; - int improvementcounter = 0; - SCIP_Real oscilator1=0; - SCIP_Real oscilator2=0; - SCIP_Real forcompare = -1000000000000000000; - SCIP_CALL(SCIPstartClock(relaxscip,totaliteration)); + // int maxiter=1500; - int* feasol; - SCIP_CALL(SCIPallocBufferArray(relaxscip,&feasol,nvars)); //will containt a feasible solution for our problem. - for(int v=0;v<nvars;v++) - { - feasol[v]=-1; //we assign initial values equal to -1, signifying that the variable's value hasn't been decided yet. - } + // int oscilatecounter=0; + // int improvementcounter = 0; + // SCIP_Real oscilator1=0; + // SCIP_Real oscilator2=0; + // SCIP_Real forcompare = -1000000000000000000; + // SCIP_CALL(SCIPstartClock(relaxscip,totaliteration)); + // SCIP_Real* feasol; + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&feasol,nvars)); //will containt a feasible solution for our problem. // for(int v=0;v<nvars;v++) // { - // printf(" %d ",feasol[v]); - + // feasol[v]=-1; //we assign initial values equal to -1, signifying that the variable's value hasn't been decided yet. // } + // // for(int v=0;v<nvars;v++) + // // { + // // printf(" %d ",feasol[v]); + + // // } + - int* nvarsingoodconss; - SCIP_CALL(SCIPallocBufferArray(relaxscip,&nvarsingoodconss,SCIPgetNConss(relaxscip))); //will contain {9,9,9,9,9,9} for the 6f4s problem. + // int* nvarsingoodconss; + // SCIP_CALL(SCIPallocBufferArray(relaxscip,&nvarsingoodconss,SCIPgetNConss(relaxscip))); //will contain {9,9,9,9,9,9} for the 6f4s problem. - int maxnvarsingoodconss = 0; //max number of variables found in a start constraint - int nconsvars = 0; //number of vars in a startconss. + // int maxnvarsingoodconss = 0; //max number of variables found in a start constraint + // int nconsvars = 0; //number of vars in a startconss. - for(int r = 0; r<SCIPgetNConss(relaxscip);r++) - { - SCIP_CONS* cons = SCIPgetConss(relaxscip)[r]; - SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); - if(nconsvars>maxnvarsingoodconss){maxnvarsingoodconss=nconsvars;} - nvarsingoodconss[r]=nconsvars; - } + // for(int r = 0; r<SCIPgetNConss(relaxscip);r++) + // { + // SCIP_CONS* cons = SCIPgetConss(relaxscip)[r]; + // SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); + // if(nconsvars>maxnvarsingoodconss){maxnvarsingoodconss=nconsvars;} + // nvarsingoodconss[r]=nconsvars; + // } - printf("%d \n",maxnvarsingoodconss); + // // printf("%d \n",maxnvarsingoodconss); - SCIP_VAR** VARSinsidegoodconss; //will contain the variable in a start constraint - SCIP_CALL(SCIPallocBufferArray(relaxscip, &VARSinsidegoodconss, maxnvarsingoodconss)); //the size is the max num a start constraint can hold. We do this not to allocate memory over and over again. + // SCIP_VAR** VARSinsidegoodconss; //will contain the variable in a start constraint + // SCIP_CALL(SCIPallocBufferArray(relaxscip, &VARSinsidegoodconss, maxnvarsingoodconss)); //the size is the max num a start constraint can hold. We do this not to allocate memory over and over again. - for(int r = 0; r<SCIPgetNConss(relaxscip);r++) - { - SCIP_CONS* cons = SCIPgetConss(relaxscip)[r]; - SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); - SCIP_CALL(SCIPgetConsVars(relaxscip, cons, VARSinsidegoodconss, nconsvars, &valid)); - if (!valid){abort(); } - printf("\n %s\n",SCIPconsGetName(cons)); - for (int j = 0; j < nconsvars; ++j) /* (8) */ - { - SCIP_VAR* varx = (VARSinsidegoodconss)[j]; - printf("%s\t",SCIPvarGetName(varx)); - int varbufindex = SCIPvarGetIndex(varx); //get the index, which will be used in assigning values to the feassol. - assert(varbufindex != NULL); - // printf("%d\t",varbufindex); + // for(int r = 0; r<SCIPgetNConss(relaxscip);r++) + // { + // SCIP_CONS* cons = SCIPgetConss(relaxscip)[r]; + // SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); + // SCIP_CALL(SCIPgetConsVars(relaxscip, cons, VARSinsidegoodconss, nconsvars, &valid)); + // if (!valid){abort(); } + // // printf("\n %s\n",SCIPconsGetName(cons)); + // for (int j = 0; j < nconsvars; ++j) /* (8) */ + // { + // SCIP_VAR* varx = (VARSinsidegoodconss)[j]; + // // printf("%s\t",SCIPvarGetName(varx)); + // int varbufindex = SCIPvarGetIndex(varx); //get the index, which will be used in assigning values to the feassol. + // assert(varbufindex != NULL); + // // printf("%d\t",varbufindex); - if (feasol[varbufindex]==-1) - { - feasol[varbufindex]=1; - for(int s=j+1; s<nconsvars;++s) - { - SCIP_VAR* varnext = (VARSinsidegoodconss)[s]; - int varnextindex = SCIPvarGetIndex(varnext); - feasol[varnextindex]=0; - } + // if (feasol[varbufindex]==-1) + // { + // feasol[varbufindex]=1; + // for(int s=j+1; s<nconsvars;++s) + // { + // SCIP_VAR* varnext = (VARSinsidegoodconss)[s]; + // int varnextindex = SCIPvarGetIndex(varnext); + // feasol[varnextindex]=0; + // } - vardata=SCIPvarGetData(varx); - int* varids = SCIPvardataGetvarids(vardata); - assert(varids=!NULL); - int NVarInBadConss = SCIPvardataGetNVarInBadConss(vardata); - printf("nvarincons = %d\t",NVarInBadConss); + // vardata=SCIPvarGetData(varx); + // int* varids = SCIPvardataGetvarids(vardata); + // assert(varids=!NULL); + // int NVarInBadConss = SCIPvardataGetNVarInBadConss(vardata); + // // printf("nvarincons = %d\t",NVarInBadConss); - for(int t=0;t<NVarInBadConss;t++) - { - printf("%d \t",varids[t]); - // varids[t] gives the constraint address. There we still would like to find out which variables are found. - for(int p=increasingorder[varids[t]]-listnconsvars[varids[t]]; p<increasingorder[varids[t]]; ++p) - { - - if(SCIPvarGetIndex(vars[listconsvarids[p]])!=varbufindex) - { - printf("var = %s\t",SCIPvarGetName(vars[listconsvarids[p]])); - if(feasol[listconsvarids[p]]==-1) - { - feasol[listconsvarids[p]]=0; - } - } - } - } - // printf("\n"); - } + // for(int t=0;t<NVarInBadConss;t++) + // { + // // printf("%d \t",varids[t]); + // // varids[t] gives the constraint address. There we still would like to find out which variables are found. + // for(int p=increasingorder[varids[t]]-listnconsvars[varids[t]]; p<increasingorder[varids[t]]; ++p) + // { + + // if(SCIPvarGetIndex(vars[listconsvarids[p]])!=varbufindex) + // { + // // printf("var = %s\t",SCIPvarGetName(vars[listconsvarids[p]])); + // if(feasol[listconsvarids[p]]==-1) + // { + // feasol[listconsvarids[p]]=0; + // } + // } + // } + // } + // // printf("\n"); + // } - printf("(%s,%d,%d)\n",SCIPvarGetName(varx), varbufindex,feasol[varbufindex]); + // // printf("(%s,%d,%d)\n",SCIPvarGetName(varx), varbufindex,feasol[varbufindex]); - } - // printf("\n"); - } + // } + // // printf("\n"); + // } - SCIP_Real upperbound=0; - for(int v=0;v<nvars;v++) - { - printf(" (%s %d weight %f) \n ", SCIPvarGetName(vars[v]),feasol[v], weights[v]); - upperbound+=(feasol[v]*SCIPvarGetObj(vars[v])); - - } - printf("upper bound = %f", upperbound); - - + // SCIP_Real upperbound=0; + // for(int v=0;v<nvars;v++) + // { + // fprintf(solutions," (%s %f weight %f) \n ", SCIPvarGetName(vars[v]),feasol[v], weights[v]); + // upperbound+=(feasol[v]*SCIPvarGetObj(vars[v])); + // SCIP_CALL( SCIPsetRelaxSolVal(scip, relax, SCIPgetVars(scip)[i], feasol[v]) ); + // } + // printf("upper bound = %f\n", upperbound); + // SCIP_CALL( SCIPmarkRelaxSolValid(scip, relax, TRUE) ); + @@ -615,18 +615,18 @@ SCIP_DECL_RELAXINIT(relaxInitlagr) // SCIPinfoMessage(relaxscip, TimeCollector, "%f\n", SCIPgetClockTime(relaxscip, totaliteration)); // // if(checker==0){printf("solution found in %d iterations\n",iter); break;} // } - SCIPfreeTransform(relaxscip); - fclose(variableinfo); - fclose(dual); - fclose(subgrad); - fclose(varobjects); - fclose(solutions); - fclose(lower); + // SCIPfreeTransform(relaxscip); + // fclose(variableinfo); + // fclose(dual); + // fclose(subgrad); + // fclose(varobjects); + // fclose(solutions); + // fclose(lower); - /* free memory */ - SCIPhashmapFree(&varmap); - SCIP_CALL( SCIPfree(&relaxscip) ); + // /* free memory */ + // SCIPhashmapFree(&varmap); + // SCIP_CALL( SCIPfree(&relaxscip) ); @@ -692,7 +692,7 @@ SCIP_DECL_RELAXEXEC(relaxExeclagr) SCIP_CONS** conss; SCIP_PROBDATA* probdata; SCIP_VARDATA* vardata; - + SCIP_RELAXDATA* relaxdata; SCIP_Real relaxval; SCIP_Bool valid; int nconss; @@ -701,8 +701,8 @@ SCIP_DECL_RELAXEXEC(relaxExeclagr) int id; - *lowerbound = -SCIPinfinity(scip); - *result = SCIP_DIDNOTRUN; + // *lowerbound = -SCIPinfinity(scip); + // *result = SCIP_DIDNOTRUN; /* we can only run if none of the present constraints expect their variables to be binary or integer during transformation */ conss = SCIPgetConss(scip); @@ -713,134 +713,156 @@ SCIP_DECL_RELAXEXEC(relaxExeclagr) SCIP_CALL( SCIPhashmapCreate(&varmap, SCIPblkmem(relaxscip), SCIPgetNVars(scip)) ); valid = FALSE; SCIP_CALL( SCIPcopy(scip, relaxscip, varmap, consmap, "relaxscip", FALSE, FALSE, FALSE, FALSE, &valid) ); - - // /**************************************************************************************************************/ - // /*First, */ - // //*the probdata: where we get to identify the bad constraint we want to formulate(in our case, the slot conss) */ - // /***************************************************************************************************************/ - // int nvars = SCIPgetNVars(relaxscip); - // SCIP_VAR** vars = SCIPgetVars(relaxscip); - // SCIP_VAR** varbuffers; - // int* badconss; - - // SCIPcreateprobdata(relaxscip,&probdata,SCIPgetConss(relaxscip),vars,&varbuffers,&badconss); /*will be used to identify the # of slot(bad) constraints*/ - // int nSlotConss = SCIPgetNSlotConss(probdata); //number of bad(slot) constraint - // int allnconsvars = SCIPgetallnconsvars(probdata); //sum of all nconsvars, used for creating later on an array to collect the list of varids in each row - // int* listnconsvars = SCIPlistnconsvars(probdata); - // int* listconsvarids = SCIPlistconsvarids(probdata); + + /**************************************************************************************************************/ + /*First, */ + //*the probdata: where we get to identify the bad constraint we want to formulate(in our case, the slot conss) */ + /***************************************************************************************************************/ + int nvars = SCIPgetNVars(relaxscip); + SCIP_VAR** vars = SCIPgetVars(relaxscip); + SCIP_VAR** varbuffers; + int* badconss; - // /* we then create the vardata function for each variable, to see at which constraint the variable is found*/ - // FILE* TimeCollector; - // TimeCollector = fopen("time.txt","w"); - // SCIP_CLOCK* varslottime; //to help us record the time - // SCIP_CALL( SCIPcreateClock(relaxscip, &varslottime) ); //* start time counting* - // SCIP_CALL(SCIPstartClock(relaxscip,varslottime)); + SCIPcreateprobdata(relaxscip,&probdata,SCIPgetConss(relaxscip),vars,&varbuffers,&badconss); /*will be used to identify the # of slot(bad) constraints*/ + int nSlotConss = SCIPgetNSlotConss(probdata); //number of bad(slot) constraint + int allnconsvars = SCIPgetallnconsvars(probdata); //sum of all nconsvars, used for creating later on an array to collect the list of varids in each row + int* listnconsvars = SCIPlistnconsvars(probdata); + int* listconsvarids = SCIPlistconsvarids(probdata); + int* increasingorder = SCIPlistincreasing(probdata); - // // int nconsvars=0; - // int* consids; - // SCIP_Real* weights; - // SCIP_CALL(SCIPallocBufferArray(relaxscip,&weights,nvars)); + /* we then create the vardata function for each variable, to see at which constraint the variable is found*/ + FILE* TimeCollector; + TimeCollector = fopen("time.txt","w"); + FILE* solutions; + solutions = fopen("sol.txt","wr"); + FILE* dual; + dual= fopen("dual.txt","wr"); + FILE* variableinfo; + variableinfo = fopen("var.txt","wr"); + FILE* subgrad; + subgrad = fopen("subgrads.txt","wr"); + FILE* varobjects; + varobjects=fopen("varobjs.txt","wr"); + FILE* lower; + lower=fopen("lowerbounds.txt","wr"); + FILE* iter; + iter=fopen("iter.txt","wr"); - // SCIP_CALL(SCIPallocBufferArray(relaxscip,&consids,nSlotConss)); - // for (int v = 0; v < nvars; v++) - // { - // SCIP_VAR* var = vars[v]; - // weights[v]=SCIPvarGetObj(var); - // } + SCIP_CLOCK* varslottime; //to help us record the time + SCIP_CALL( SCIPcreateClock(relaxscip, &varslottime) ); //* start time counting* + SCIP_CALL(SCIPstartClock(relaxscip,varslottime)); - // for (int v = 0; v < nvars; v++) - // { - // int* varids; - // int NVarInBadConss=0; - // int nconsvars = 0; - // SCIP_VAR* var = vars[v]; + SCIP_CLOCK* totaliteration; //to help us record the time + SCIP_CALL( SCIPcreateClock(relaxscip, &totaliteration) ); //* start time counting* - // int varindex = SCIPvarGetIndex(var); /* (2) */ - // assert(varindex!= NULL); - // // printf("%s****%d\n",SCIPvarGetName(var),varindex); - // for (int r = 0; r < nSlotConss; ++r) - // { - // id = badconss[r]; - // SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; - // // printf("%s \t",SCIPconsGetName(cons)); - // SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); - // SCIP_CALL(SCIPgetConsVars(relaxscip, cons, varbuffers, nconsvars, &valid)); - // if (!valid){ - // abort(); } - // for (int j = 0; j < nconsvars; ++j) /* (8) */ - // { - // SCIP_VAR* varx = varbuffers[j]; - // int varbufindex = SCIPvarGetIndex(varx); - // assert(varbufindex != NULL); - // // printf("%s\t \t%d",SCIPvarGetName(varx),varbufindex); + int* consids; + + SCIP_Real* weights; + SCIP_CALL(SCIPallocBufferArray(relaxscip,&weights,nvars)); + + SCIP_CALL(SCIPallocBufferArray(relaxscip,&consids,nSlotConss)); + + SCIP_Real maxobj=0; + for (int v = 0; v < nvars; v++) + { + SCIP_VAR* var = SCIPgetVars(scip)[v]; + weights[v]=SCIPvarGetObj(var); + if(maxobj<weights[v]){maxobj=weights[v];} + } + + for (int v = 0; v < nvars; v++) + { + int* varids; + int NVarInBadConss=0; + int nconsvars = 0; + SCIP_VAR* var = vars[v]; + + int varindex = SCIPvarGetIndex(var); /* (2) */ + assert(varindex!= NULL); + + for (int r = 0; r < nSlotConss; ++r) + { + id = badconss[r]; + SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; + //fprintf(solutions,"%s,%d \n",SCIPconsGetName(cons),r); + SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); + SCIP_CALL(SCIPgetConsVars(relaxscip, cons, varbuffers, nconsvars, &valid)); + if (!valid){abort(); } + + for (int j = 0; j < nconsvars; ++j) /* (8) */ + { + SCIP_VAR* varx = varbuffers[j]; + int varbufindex = SCIPvarGetIndex(varx); + assert(varbufindex != NULL); + // printf("%s\t \t%d",SCIPvarGetName(varx),varbufindex); - // /** if var[i] is in cons[c], write conspointer in VarConss and increase nVarConsscounter */ - // if (varindex == varbufindex) /* (9) */ - // { + /** if var[i] is in cons[c], write conspointer in VarConss and increase nVarConsscounter */ + if (varindex == varbufindex) /* (9) */ + { - // // VarSlotConss[NVarInBadConss] = cons; - // consids[NVarInBadConss]=id; - // NVarInBadConss++; - // // printf(" %s \t,",SCIPconsGetName(cons)); - // } - // } - // } - - // SCIP_CALL(SCIPallocBufferArray(relaxscip, &varids, NVarInBadConss)); - // for(int t=0;t<NVarInBadConss;t++) - // { - // varids[t]=consids[t]; - // // printf("%d \t",varids[t]); - // } + // VarSlotConss[NVarInBadConss] = cons; + consids[NVarInBadConss]=r; + NVarInBadConss++; + // printf(" %s \t,",SCIPconsGetName(cons)); + } + } + } + SCIP_CALL(SCIPallocBufferArray(relaxscip, &varids, NVarInBadConss)); + for(int t=0;t<NVarInBadConss;t++) + { + varids[t]=consids[t]; + // printf("%d \t",varids[t]); + } + // printf("\n"); // // vardata=SCIPvarGetData(var); - // SCIP_CALL(SCIPallocBlockMemory(scip , &vardata)); - // SCIP_CALL(SCIPduplicateBlockMemoryArray(scip, &(vardata->varids), varids, NVarInBadConss)); - // vardata->NVarInBadConss = NVarInBadConss; /**copy nVarConss to VarData */ - // vardata->varids = varids; - // // /**set the variable data to the variable*/ - // SCIPvarSetData(var,vardata); - // } + SCIP_CALL(SCIPallocBlockMemory(scip , &vardata)); + SCIP_CALL(SCIPduplicateBlockMemoryArray(scip, &(vardata->varids), varids, NVarInBadConss)); + vardata->NVarInBadConss = NVarInBadConss; /**copy nVarConss to VarData */ + vardata->varids = varids; + // /**set the variable data to the variable*/ + SCIPvarSetData(var,vardata); + } - // // SCIP_CALL(SCIPstopClock(relaxscip,varslottime)); + SCIP_CALL(SCIPstopClock(relaxscip,varslottime)); - // FILE* AfterPreProcessing; - // AfterPreProcessing = fopen("AfterPreProcessing.txt","w+"); + FILE* AfterPreProcessing; + AfterPreProcessing = fopen("AfterPreProcessing.txt","w+"); - // // SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); + SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); - // SCIPinfoMessage(relaxscip, TimeCollector, "\n row and column identified in (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); - // for(int r=0;r<nSlotConss;r++) - // { - // id = badconss[r]; - // SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; - // SCIP_CALL(SCIPdelCons(relaxscip,cons)); - // } + SCIPinfoMessage(relaxscip, TimeCollector, "\n row and column identified in (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); + for(int r=0;r<nSlotConss;r++) + { + id = badconss[r]; + SCIP_CONS* cons = SCIPgetConss(relaxscip)[id]; + SCIP_CALL(SCIPdelCons(relaxscip,cons)); + } - // /******************************************************************************************************************/ - // /*Next, we will do the initial iteration of finding the dual mulpliers of each slot conss, and their sum(dualsum) */ - // /* In the end, we will subtract this sum from the objective of the function. */ - // /* It's initial, because while we would search for more dual multipliers to solve the Lagrangian relaxation */ - // /******************************************************************************************************************/ - // SCIP_Real* dualmultipliers; - // SCIP_CALL(SCIPallocBufferArray(relaxscip,&dualmultipliers,nSlotConss)); + /******************************************************************************************************************/ + /*Next, we will do the initial iteration of finding the dual mulpliers of each slot conss, and their sum(dualsum) */ + /* In the end, we will subtract this sum from the objective of the function. */ + /* It's initial, because while we would search for more dual multipliers to solve the Lagrangian relaxation */ + /******************************************************************************************************************/ + SCIP_Real* dualmultipliers; + SCIP_CALL(SCIPallocBufferArray(relaxscip,&dualmultipliers,nSlotConss)); - // SCIP_Real* subgradients; - // SCIP_CALL(SCIPallocBufferArray(relaxscip,&subgradients,nSlotConss)); - // //initialize subgradients; - // SCIP_Real stepsize = 1.00000; - // SCIP_Real sumofduals=0; - // for ( int r = 0; r < nSlotConss; ++r) - // { - // dualmultipliers[r] = 0; - // sumofduals+=dualmultipliers[r]; //adds the negative of the minimum in each iteration - // } + SCIP_Real* subgradients; + SCIP_CALL(SCIPallocBufferArray(relaxscip,&subgradients,nSlotConss)); + //initialize subgradients; + SCIP_Real stepsize = 15; + SCIP_Real sumofduals=0; + for ( int r = 0; r < nSlotConss; ++r) + { + dualmultipliers[r] = 0; + sumofduals+=dualmultipliers[r]; //adds the negative of the minimum in each iteration + } @@ -854,208 +876,346 @@ SCIP_DECL_RELAXEXEC(relaxExeclagr) // /****************************************************************************************************************/ - // FILE* solutions; - // solutions = fopen("sol.txt","wr"); - // FILE* dual; - // dual= fopen("dual.txt","wr"); - // FILE* variableinfo; - // variableinfo = fopen("var.txt","wr"); - // FILE* subgrad; - // subgrad = fopen("subgrads.txt","wr"); - // FILE* varobjects; - // varobjects=fopen("varobjs.txt","wr"); - // FILE* lower; - // lower=fopen("lowerbounds.txt","wr"); - // FILE* iter; - // lower=fopen("iter.txt","wr"); - // SCIP_Real* solvals; - // SCIP_CALL(SCIPallocBufferArray(relaxscip,&solvals,nvars+2)); - // solvals[nvars+1]=0; //for last solutions - // solvals[nvars]=0; //for best solution - // int maxiter=125; + //fprintf(lower, "hi"); + SCIP_Real* solvals; + SCIP_CALL(SCIPallocBufferArray(relaxscip,&solvals,nvars+2)); + solvals[nvars+1]=0; //for last solutions + solvals[nvars]=0; //for best solution - // int oscilatecounter=0; - // int improvementcounter = 0; - // SCIP_Real oscilator1=0; - // SCIP_Real oscilator2=0; - // SCIP_Real forcompare = 0.000; - // fprintf(lower,"%d\n",maxiter); - // for(int iter=1;iter<=maxiter;iter++) - // { + int oscilatecounter=0; + int improvementcounter = 0; + SCIP_Real oscilator1=0; + SCIP_Real oscilator2=0; + SCIP_Real forcompare = -1000000000000000000; + SCIP_CALL(SCIPstartClock(relaxscip,totaliteration)); + + SCIP_Real* feasol; + SCIP_CALL(SCIPallocBufferArray(relaxscip,&feasol,nvars)); //will containt a feasible solution for our problem. + for(int v=0;v<nvars;v++) + { + feasol[v]=-1; //we assign initial values equal to -1, signifying that the variable's value hasn't been decided yet. + } + + + + int* nvarsingoodconss; + SCIP_CALL(SCIPallocBufferArray(relaxscip,&nvarsingoodconss,SCIPgetNConss(relaxscip))); //will contain {9,9,9,9,9,9} for the 6f4s problem. + + int maxnvarsingoodconss = 0; //max number of variables found in a start constraint + int nconsvars = 0; //number of vars in a startconss. + + for(int r = 0; r<SCIPgetNConss(relaxscip);r++) + { + SCIP_CONS* cons = SCIPgetConss(relaxscip)[r]; + if(SCIPconsGetLhs(relaxscip,cons,&valid)==1) + { + SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); + if(nconsvars>maxnvarsingoodconss){maxnvarsingoodconss=nconsvars;} + nvarsingoodconss[r]=nconsvars; + } + } + // printf("%d \n",maxnvarsingoodconss); + + SCIP_VAR** VARSinsidegoodconss; //will contain the variable in a start constraint + SCIP_CALL(SCIPallocBufferArray(relaxscip, &VARSinsidegoodconss, maxnvarsingoodconss)); //the size is the max num a start constraint can hold. We do this not to allocate memory over and over again. + //initialize this allocation + for(int v=0; v<maxnvarsingoodconss; v++) + { + VARSinsidegoodconss[v]=SCIPgetVars(relaxscip)[0]; + } + + for(int r = 0; r<SCIPgetNConss(relaxscip);r++) + { - // for(int v=0;v<nvars;v++) - // { - // SCIP_VAR* var = vars[v]; - // double sum =0; - - // vardata=SCIPvarGetData(var); - // int* varids = SCIPvardataGetvarids(vardata); - // assert(varids=!NULL); - // int NVarInBadConss = SCIPvardataGetNVarInBadConss(vardata); - // if(NVarInBadConss==0){break;} - // else - // { - // SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); - // fprintf(varobjects,"%s \n",SCIPvarGetName(var)); - // for(int t=0;t<NVarInBadConss;t++) - // { - // sum += dualmultipliers[varids[t]]; - // fprintf(varobjects,"{id = %d, dual = %f, sum = %f\t",varids[t], dualmultipliers[varids[t]],sum); - // } - // fprintf(varobjects,"}\n\n"); - // SCIP_CALL(SCIPaddVarObj(relaxscip,var,sum)); + SCIP_CONS* cons = SCIPgetConss(relaxscip)[r]; + if(SCIPconsGetLhs(relaxscip,cons,&valid)==1) + { + printf(" yes %s ",SCIPconsGetName(cons)); + SCIP_CALL(SCIPgetConsNVars(relaxscip, cons, &nconsvars, &valid)); + SCIP_CALL(SCIPgetConsVars(relaxscip, cons, VARSinsidegoodconss, nconsvars, &valid)); + if (!valid){abort(); } + fprintf(solutions,"\n %s\n",SCIPconsGetName(cons)); + for (int j = 0; j < nconsvars; ++j) /* (8) */ + { + SCIP_VAR* varx = (VARSinsidegoodconss)[j]; + fprintf(solutions,"%s\t",SCIPvarGetName(varx)); + int varbufindex = SCIPvarGetIndex(varx); //get the index, which will be used in assigning values to the feassol. + assert(varbufindex != NULL); + fprintf(solutions,"%d\t",varbufindex); - // } - + if (feasol[varbufindex]==-1) + { + feasol[varbufindex]=1; + for(int s=j+1; s<nconsvars;++s) + { + SCIP_VAR* varnext = (VARSinsidegoodconss)[s]; + int varnextindex = SCIPvarGetIndex(varnext); + feasol[varnextindex]=0; + } + + vardata=SCIPvarGetData(varx); + int* varids = SCIPvardataGetvarids(vardata); + assert(varids=!NULL); + int NVarInBadConss = SCIPvardataGetNVarInBadConss(vardata); + fprintf(solutions,"nvarincons = %d\t",NVarInBadConss); + + for(int t=0;t<NVarInBadConss;t++) + { - // } + // fprintf(solutions,"(sid=%d, order=%d, nconsvars=%d,%d) \t",varids[t],increasingorder[varids[t]],listnconsvars[varids[t]],increasingorder[increasingorder[varids[t]]]); + + // varids[t] gives the constraint address. There we still would like to find out which variables are found. + for(int p=increasingorder[varids[t]]-listnconsvars[varids[t]]; p<increasingorder[varids[t]]; ++p) + { - // SCIPinfoMessage(relaxscip, TimeCollector, "\n finished changing the variable's weight after (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); - - // SCIP_CALL(SCIPaddOrigObjoffset(relaxscip,-1*sumofduals)); - // // SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); - // SCIPsetMessagehdlrQuiet(relaxscip, TRUE); - // // fclose(AfterPreProcessing); + if(SCIPvarGetIndex(vars[listconsvarids[p]])!=varbufindex) + { + fprintf(solutions,"var = %s\t",SCIPvarGetName(vars[listconsvarids[p]])); + if(feasol[listconsvarids[p]]==-1) + { + feasol[listconsvarids[p]]=0; + } + } + } + } + fprintf(solutions,"\n"); + } - // SCIP_CALL( SCIPtransformProb(relaxscip) ); - // SCIP_CALL( SCIPsolve(relaxscip) ); - // relaxval = SCIPgetPrimalbound(relaxscip); - // printf("\ndualbound %f \n",SCIPgetDualbound(relaxscip)); - // fprintf(lower,"%f",SCIPgetPrimalbound(relaxscip)); - // SCIPdebugMessage("relaxation bound = %e status = %d\n", relaxval, SCIPgetStatus(relaxscip)); + + fprintf(solutions,"(%s,%d,%f)\n",SCIPvarGetName(varx), varbufindex,feasol[varbufindex]); - // /*store the highest lower bound*/ - // if(solvals[nvars]<SCIPgetPrimalbound(relaxscip)){solvals[nvars]=SCIPgetPrimalbound(relaxscip);fprintf(variableinfo,} - // fprintf(variableinfo,"%f\n",solvals[nvars]); + + + } + fprintf(solutions,"\n"); + } + + } - // /*make sure we're not oscilating by adding a counter, which checks the absolute value between the difference of the previous few steps and make sure it's not the same. */ - // oscilator2=abs(solvals[nvars+1]-SCIPgetPrimalbound(relaxscip)); - // if(oscilator1==oscilator2){oscilatecounter++;} - // else(oscilator1=oscilator2); - // if(oscilatecounter==5){printf("repetition"); break;} - // printf("dprev.sol=%f, current=%f, difference %f, coutner=%d, ",solvals[nvars+1],SCIPgetPrimalbound(relaxscip), oscilator2, oscilatecounter); + + SCIP_Real upperbound=0; + for(int v=0;v<nvars;v++) + { + SCIP_VAR* var = SCIPgetVars(scip)[v]; + fprintf(solutions," (%s %f weight %f) \n ", SCIPvarGetName(vars[v]),feasol[v], weights[v]); + upperbound+=(feasol[v]*SCIPvarGetObj(vars[v])); + // SCIPsetSolVal(scip,relaxdata->sol,var,feasol[v]); + SCIP_CALL(SCIPsetRelaxSolVal(scip, relax, SCIPgetVars(scip)[i], feasol[v]) ); //setting the solutions found here for the main scip problem. + } + printf("upper bound = %f\n", upperbound); + SCIP_CALL( SCIPmarkRelaxSolValid(scip, relax, TRUE) ); + + + SCIP_Real change=0;//for saving the dual solution of previous. + int maxiter=130; + int stopping = 0; + for(int iter=1;iter<=maxiter;iter++) + { - // /*store the solution on the last entry of solvals, so we can compare it in the next round for repetitions*/ - // solvals[nvars+1]=SCIPgetPrimalbound(relaxscip); + for(int v=0;v<nvars;v++) + { + SCIP_VAR* var = vars[v]; + double sum =0; + + vardata=SCIPvarGetData(var); + int* varids = SCIPvardataGetvarids(vardata); + assert(varids=!NULL); + int NVarInBadConss = SCIPvardataGetNVarInBadConss(vardata); + // if(NVarInBadConss==0){SCIPsetSolVal(relaxscip,) break;} + // else + // { + // SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); + // fprintf(varobjects,"%s \n",SCIPvarGetName(var)); + for(int t=0;t<NVarInBadConss;t++) + { + sum += dualmultipliers[varids[t]]; + // fprintf(varobjects,"{id = %d, dual = %f, sum = %f\t",varids[t], dualmultipliers[varids[t]],sum); + } + // fprintf(varobjects,"}\n\n"); + SCIP_CALL(SCIPaddVarObj(relaxscip,var,sum)); - // /*breaking criteria for iterations*/ - // if(solvals[nvars]>forcompare){forcompare=solvals[nvars];} - // else{improvementcounter++;} - // if(improvementcounter==5){break;} + // } + + + } - // /*get the best solution*/ - // SCIP_SOL* bestsol = SCIPgetBestSol(relaxscip) ; - // SCIP_SOL** sols = SCIPgetSols(relaxscip); - // int nsols = SCIPgetNSols(relaxscip); + SCIPinfoMessage(relaxscip, TimeCollector, "\n finished changing the variable's weight after (sec) : %f\n", SCIPgetClockTime(relaxscip, totaliteration)); + + SCIP_CALL(SCIPaddOrigObjoffset(relaxscip,-1*sumofduals)); + //SCIP_CALL(SCIPprintOrigProblem(relaxscip, AfterPreProcessing, "lp", FALSE)); + SCIPsetMessagehdlrQuiet(relaxscip, TRUE); + // fclose(AfterPreProcessing); + + SCIP_CALL( SCIPtransformProb(relaxscip) ); + SCIP_CALL( SCIPsolve(relaxscip) ); + // relaxval = SCIPgetPrimalbound(relaxscip); + //printf("\ndualbound %f \n",SCIPgetDualbound(relaxscip)); + fprintf(lower,"%f\n",SCIPgetPrimalbound(relaxscip)); + // SCIPdebugMessage("relaxation bound = %e status = %d\n", relaxval, SCIPgetStatus(relaxscip)); + + /*store the highest lower bound*/ + if(solvals[nvars]<SCIPgetPrimalbound(relaxscip)){solvals[nvars]=SCIPgetPrimalbound(relaxscip);} + + + /*make sure we're not oscilating by adding a counter, which checks the absolute value between the difference of the previous few steps and make sure it's not the same. */ + oscilator2=abs(solvals[nvars+1]-SCIPgetPrimalbound(relaxscip)); + if(oscilator1==oscilator2){oscilatecounter++;} + else{oscilator1=oscilator2; oscilatecounter==0;} + //if(oscilatecounter==5){printf("repetition"); break;} + //printf("dprev.sol=%f, current=%f, difference %f, coutner=%d, ",solvals[nvars+1],SCIPgetPrimalbound(relaxscip), oscilator2, oscilatecounter); + + /*store the solution on the last entry of solvals, so we can compare it in the next round for repetitions*/ + solvals[nvars+1]=SCIPgetPrimalbound(relaxscip); + + /*breaking criteria for iterations*/ + if(solvals[nvars]>forcompare){forcompare=solvals[nvars]; improvementcounter=0;} + else{improvementcounter++;} + //if(improvementcounter==10){break; fprintf(variableinfo,"%d\n",iter);} + printf("terminator %d",improvementcounter); + + /*get the best solution*/ + SCIP_SOL* bestsol = SCIPgetBestSol(relaxscip) ; + SCIP_SOL** sols = SCIPgetSols(relaxscip); + int nsols = SCIPgetNSols(relaxscip); + + //fprintf(lower,"%d iteration \n",iter); + for(int n=0; n<nsols; n++) + { + //SCIP_CALL(SCIPprintSol(relaxscip,sols[n],lower,FALSE)); + } - // /*text output*/ - // SCIPinfoMessage(relaxscip, TimeCollector, "\n first iteration: problem solved after (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); - // fprintf(solutions,"number of solutions %d, first iteration \t bound=%f, \t objsol=%f \n",nsols, SCIPgetPrimalbound(relaxscip),relaxval); - // // SCIP_CALL(SCIPprintBestSol(relaxscip,solutions,FALSE)); + /*text output*/ + //SCIPinfoMessage(relaxscip, TimeCollector, "\n first iteration: problem solved after (sec) : %f\n", SCIPgetClockTime(relaxscip, totaliteration)); + //fprintf(solutions,"number of solutions %d, first iteration \t bound=%f, \t objsol=%f \n",nsols, SCIPgetPrimalbound(relaxscip),relaxval); + // SCIP_CALL(SCIPprintBestSol(relaxscip,solutions,FALSE)); - // /*store the solution in solvals so we can later export it to subgradient function*/ - // SCIP_Real lowerbound=0; - // SCIPgetSolVals(relaxscip,bestsol,nvars,vars,solvals); - // SCIP_CALL(SCIPprintSol(relaxscip,bestsol,dual,FALSE)); + /*store the solution in solvals so we can later export it to subgradient function*/ + SCIP_Real lowerbound=0; + SCIPgetSolVals(relaxscip,bestsol,nvars,vars,solvals); + //SCIP_CALL(SCIPprintSol(relaxscip,bestsol,dual,FALSE)); - // SCIP_Real compare=0; - // for (int v = 0; v<nvars; ++v) - // { - // compare += solvals[v]*weights[v]; - // } + SCIP_Real compare=0; + for (int v = 0; v<nvars; ++v) + { + compare += solvals[v]*weights[v]; + } - // // stepsize = 15/double(iter+1); - // // fprintf(solutions, "\niteration %d\n",iter); - // // fprintf(dual, "\niteration %d\n",iter); - // // fprintf(variableinfo, "\niteration %d\n",iter); - // // fprintf(varobjects, "\niteration %d\n",iter); - // SCIP_CALL(SCIPaddOrigObjoffset(relaxscip,sumofduals)); - // // SCIP_CALL( SCIPfreeTransform(relaxscip) ); - // // SCIP_CALL( SCIPtransformProb(relaxscip) ); + //stepsize = (stepsize+iter)/double(iter+1); + // fprintf(solutions, "\niteration %d\n",iter); + // fprintf(dual, "\niteration %d\n",iter); + // fprintf(variableinfo, "\niteration %d\n",iter); + // fprintf(varobjects, "\niteration %d\n",iter); - // counter = 0; - // int checker = 0; - // for(int r=0; r<nSlotConss;++r) - // { - // id = badconss[r]; - // double ax=-1; - // for(int s=counter;s<(counter+listnconsvars[r]);++s) - // { - // // printf("%s->",SCIPvarGetName(vars[listconsvarids[s]])); - // ax+=SCIPgetSolVal(relaxscip,bestsol,vars[listconsvarids[s]]); - // // fprintf(subgrad,"%s\t,%f\t, sum %f",SCIPvarGetName(vars[listconsvarids[s]]),SCIPgetSolVal(relaxscip,bestsol,vars[listconsvarids[s]]),ax); + SCIP_CALL(SCIPaddOrigObjoffset(relaxscip,sumofduals)); + // SCIP_CALL( SCIPfreeTransform(relaxscip) ); + // SCIP_CALL( SCIPtransformProb(relaxscip) ); + + counter = 0; + int checker = 0; + for(int r=0; r<nSlotConss;++r) + { + id = badconss[r]; + double ax=-1; + for(int s=counter;s<(counter+listnconsvars[r]);++s) + { + // printf("%s->",SCIPvarGetName(vars[listconsvarids[s]])); + ax+=SCIPgetSolVal(relaxscip,bestsol,vars[listconsvarids[s]]); + // fprintf(subgrad,"%s\t,%f\t, sum %f",SCIPvarGetName(vars[listconsvarids[s]]),SCIPgetSolVal(relaxscip,bestsol,vars[listconsvarids[s]]),ax); - // } + } - // counter += listnconsvars[r]; - // if(ax>0){checker++;} - // subgradients[r]=ax; - // // fprintf(subgrad, "\n subgrad = %f \t",subgradients[r]); + counter += listnconsvars[r]; + if(ax>0){checker++;} + subgradients[r]=ax; + // fprintf(subgrad, "\n subgrad = %f \t",subgradients[r]); - // } - // /*breaking condition on finding a feasible solution*/ - // if(checker==0){printf("#*#*#*result found\n"); break;} + } + /*breaking condition on finding a feasible solution*/ + if(checker==0){printf("#*#*#*result found\n"); break;} - // SCIP_CALL( SCIPfreeTransform(relaxscip) ); - // SCIP_CALL( SCIPtransformProb(relaxscip) ); + SCIP_CALL( SCIPfreeTransform(relaxscip) ); + SCIP_CALL( SCIPtransformProb(relaxscip) ); - // for (int v = 0; v<nvars; ++v) - // { - // SCIP_VAR* var = vars[v]; + for (int v = 0; v<nvars; ++v) + { + SCIP_VAR* var = vars[v]; - // SCIP_CALL(SCIPchgVarObj(relaxscip,var,weights[v])); - // // fprintf(variableinfo,"(%s,%f,%f)->%f\n",SCIPvarGetName(var),solvals[v],SCIPvarGetObj(var), weights[v]); - // lowerbound += solvals[v]*weights[v]; - // } - // // fprintf(dual,"dualbound = %f, lowerbound=%f, norm of subgrad %f\t",SCIPgetPrimalbound(relaxscip),lowerbound, getnorm(subgradients,nSlotConss,stepsize)); - // // fprintf(lower,"%f\n",lowerbound); + SCIP_CALL(SCIPchgVarObj(relaxscip,var,weights[v])); + + // fprintf(variableinfo,"(%s,%f,%f)->%f\n",SCIPvarGetName(var),solvals[v],SCIPvarGetObj(var), weights[v]); + lowerbound += solvals[v]*weights[v]; + } + // fprintf(dual,"dualbound = %f, lowerbound=%f, norm of subgrad %f\t",SCIPgetPrimalbound(relaxscip),lowerbound, getnorm(subgradients,nSlotConss,stepsize)); + // fprintf(lower,"%f\n",lowerbound); - // // stepsize = (SCIPgetPrimalbound(relaxscip)-lowerbound)/getnorm(subgradients,nSlotConss,stepsize); - // SCIP_CALL( SCIPfreeTransform(relaxscip) ); - // fprintf(solutions, "lowerbound = %f \n ", lowerbound); - // SCIPinfoMessage(relaxscip, TimeCollector, "\n subgradients found after (sec) : %f\n, lowerbound = %f \n", SCIPgetClockTime(relaxscip, varslottime),lowerbound); - // //add back the sum of the duals we subtracted from the main obj function + SCIP_Real difference = 1500000-SCIPgetPrimalbound(relaxscip); + SCIP_Real progress = SCIPgetPrimalbound(relaxscip)-change; + printf("\t %f\n",progress); + + // if(difference>1) + // { + // if(improvementcounter<5){stepsize = -2*(difference)/(getnorm(subgradients,nSlotConss,stepsize)*getnorm(subgradients,nSlotConss,stepsize));} + // else{stepsize =-1*(difference)/(getnorm(subgradients,nSlotConss,stepsize)*getnorm(subgradients,nSlotConss,stepsize));} + // } + // else{stepsize=1;} + if(progress<0.1){stepsize=stepsize/iter; stopping++;} + stepsize = 1; + if(stopping==3){ break;} + fprintf(dual,"dualbound = %f, lowerbound=%f, norm of subgrad %f\t stepsize= %f \n" ,SCIPgetPrimalbound(relaxscip),lowerbound, getnorm(subgradients,nSlotConss,stepsize), stepsize); + change = SCIPgetPrimalbound(relaxscip); + fprintf(variableinfo,"%f\n",solvals[nvars]); + SCIP_CALL( SCIPfreeTransform(relaxscip) ); + // fprintf(solutions, "lowerbound = %f \n ", lowerbound); + //SCIPinfoMessage(relaxscip, TimeCollector, "\n subgradients found after (sec) : %f\n, lowerbound = %f \n", SCIPgetClockTime(relaxscip, varslottime),lowerbound); + + //add back the sum of the duals we subtracted from the main obj function - // int sum=0; - // sumofduals = 0; + int sum=0; + sumofduals = 0; - // for(int r=0; r<nSlotConss;++r) - // { - // dualmultipliers[r] += subgradients[r]*stepsize; - // if(dualmultipliers[r]<0){dualmultipliers[r]=0;} + for(int r=0; r<nSlotConss;++r) + { + dualmultipliers[r] += subgradients[r]*stepsize; + if(dualmultipliers[r]<0){dualmultipliers[r]=0;} - // sum+=dualmultipliers[r]; - // // fprintf(dual," then %f step size %f \n",dualmultipliers[r], stepsize); - // } - // sumofduals=sum; - // // fprintf(dual,"iteration %d, sumofduals=%f\n",iter, sumofduals); - // SCIPinfoMessage(relaxscip, TimeCollector, "\n new dual found after (sec) : %f\n", SCIPgetClockTime(relaxscip, varslottime)); - // // if(checker==0){printf("solution found in %d iterations\n",iter); break;} - // } - // SCIPfreeTransform(relaxscip); - // fclose(variableinfo); - // fclose(dual); - // fclose(subgrad); - // fclose(varobjects); - // fclose(solutions); - // fclose(lower); + sumofduals+=dualmultipliers[r]; + //fprintf(dual," then dual = %f step size %f, subgradient %f \n",dualmultipliers[r], stepsize,subgradients[r]); + } + // sumofduals=sum; + // fprintf(dual,"iteration %d, sumofduals=%f\n",iter, sumofduals); + SCIPinfoMessage(relaxscip, TimeCollector, "%f\n", SCIPgetClockTime(relaxscip, totaliteration)); + // if(checker==0){printf("solution found in %d iterations\n",iter); break;} + } + SCIPfreeTransform(relaxscip); + fclose(variableinfo); + fclose(dual); + fclose(subgrad); + fclose(varobjects); + fclose(solutions); + fclose(lower); + *lowerbound = solvals[nvars]; + *result = SCIP_SUCCESS; + printf("\nis it solved %d\n",SCIPisRelaxSolValid(scip)); + relaxval = solvals[nvars]; + SCIPdebugMessage("relaxation bound = %e status = %d\n", relaxval, SCIPgetStatus(relaxscip)); + if( SCIPgetStatus(relaxscip) == SCIP_STATUS_OPTIMAL ) { /* store relaxation solution in original SCIP if it improves the best relaxation solution thus far */ diff --git a/time.txt b/time.txt index 91b260f8002e5259d9bc08a50607a2b0e60ae492..144124ab04d0b00af00b6ad13841b2db6eb4dc00 100644 --- a/time.txt +++ b/time.txt @@ -1,2 +1,67 @@ - row and column identified in (sec) : 0.000252 + row and column identified in (sec) : 0.000162 + + finished changing the variable's weight after (sec) : 0.000941 +0.006116 + + finished changing the variable's weight after (sec) : 0.006164 +0.020437 + + finished changing the variable's weight after (sec) : 0.020603 +0.029869 + + finished changing the variable's weight after (sec) : 0.030062 +0.052249 + + finished changing the variable's weight after (sec) : 0.052727 +0.083780 + + finished changing the variable's weight after (sec) : 0.084110 +0.100559 + + finished changing the variable's weight after (sec) : 0.100606 +0.134207 + + finished changing the variable's weight after (sec) : 0.134376 +0.170888 + + finished changing the variable's weight after (sec) : 0.170987 +0.189907 + + finished changing the variable's weight after (sec) : 0.190397 +0.214879 + + finished changing the variable's weight after (sec) : 0.215035 +0.248610 + + finished changing the variable's weight after (sec) : 0.249024 +0.276051 + + finished changing the variable's weight after (sec) : 0.276489 +0.305234 + + finished changing the variable's weight after (sec) : 0.305363 +0.331501 + + finished changing the variable's weight after (sec) : 0.331629 +0.365271 + + finished changing the variable's weight after (sec) : 0.365548 +0.392237 + + finished changing the variable's weight after (sec) : 0.392345 +0.416936 + + finished changing the variable's weight after (sec) : 0.417094 +0.448937 + + finished changing the variable's weight after (sec) : 0.449053 +0.480631 + + finished changing the variable's weight after (sec) : 0.481091 +0.520802 + + finished changing the variable's weight after (sec) : 0.520921 +0.540580 + + finished changing the variable's weight after (sec) : 0.540629 diff --git a/var.txt b/var.txt index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9650a2a3c9f47e4e7195848dd6012ee533078d88 100644 --- a/var.txt +++ b/var.txt @@ -0,0 +1,21 @@ +1.000000 +14.000000 +27.000000 +40.000000 +50.000000 +51.000000 +51.000000 +54.000000 +58.000000 +59.000000 +59.000000 +62.000000 +63.000000 +63.000000 +65.000000 +65.000000 +67.000000 +68.000000 +73.000000 +74.000000 +74.000000