scs 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/LICENSE.txt +18 -18
  4. data/README.md +28 -9
  5. data/ext/scs/extconf.rb +29 -0
  6. data/lib/scs/ffi.rb +30 -13
  7. data/lib/scs/solver.rb +32 -14
  8. data/lib/scs/version.rb +1 -1
  9. data/vendor/scs/CITATION.cff +39 -0
  10. data/vendor/scs/CMakeLists.txt +272 -0
  11. data/vendor/scs/Makefile +24 -15
  12. data/vendor/scs/README.md +8 -216
  13. data/vendor/scs/include/aa.h +67 -23
  14. data/vendor/scs/include/cones.h +17 -17
  15. data/vendor/scs/include/glbopts.h +98 -32
  16. data/vendor/scs/include/linalg.h +2 -4
  17. data/vendor/scs/include/linsys.h +58 -44
  18. data/vendor/scs/include/normalize.h +3 -3
  19. data/vendor/scs/include/rw.h +8 -2
  20. data/vendor/scs/include/scs.h +293 -133
  21. data/vendor/scs/include/util.h +3 -15
  22. data/vendor/scs/linsys/cpu/direct/private.c +220 -224
  23. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  24. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  25. data/vendor/scs/linsys/cpu/indirect/private.c +177 -110
  26. data/vendor/scs/linsys/cpu/indirect/private.h +8 -4
  27. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  28. data/vendor/scs/linsys/csparse.c +87 -0
  29. data/vendor/scs/linsys/csparse.h +34 -0
  30. data/vendor/scs/linsys/csparse.o +0 -0
  31. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +1 -1
  32. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  33. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  34. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  35. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  36. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  37. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  38. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  39. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  40. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  41. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  42. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  43. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  44. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  45. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  46. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  47. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  48. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  49. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  50. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  51. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  52. data/vendor/scs/linsys/gpu/gpu.c +58 -21
  53. data/vendor/scs/linsys/gpu/gpu.h +66 -28
  54. data/vendor/scs/linsys/gpu/indirect/private.c +368 -154
  55. data/vendor/scs/linsys/gpu/indirect/private.h +26 -12
  56. data/vendor/scs/linsys/scs_matrix.c +498 -0
  57. data/vendor/scs/linsys/scs_matrix.h +70 -0
  58. data/vendor/scs/linsys/scs_matrix.o +0 -0
  59. data/vendor/scs/scs.mk +13 -9
  60. data/vendor/scs/src/aa.c +384 -109
  61. data/vendor/scs/src/aa.o +0 -0
  62. data/vendor/scs/src/cones.c +440 -353
  63. data/vendor/scs/src/cones.o +0 -0
  64. data/vendor/scs/src/ctrlc.c +15 -5
  65. data/vendor/scs/src/ctrlc.o +0 -0
  66. data/vendor/scs/src/linalg.c +84 -28
  67. data/vendor/scs/src/linalg.o +0 -0
  68. data/vendor/scs/src/normalize.c +22 -64
  69. data/vendor/scs/src/normalize.o +0 -0
  70. data/vendor/scs/src/rw.c +161 -22
  71. data/vendor/scs/src/rw.o +0 -0
  72. data/vendor/scs/src/scs.c +768 -561
  73. data/vendor/scs/src/scs.o +0 -0
  74. data/vendor/scs/src/scs_indir.o +0 -0
  75. data/vendor/scs/src/scs_version.c +9 -3
  76. data/vendor/scs/src/scs_version.o +0 -0
  77. data/vendor/scs/src/util.c +37 -106
  78. data/vendor/scs/src/util.o +0 -0
  79. data/vendor/scs/test/minunit.h +17 -8
  80. data/vendor/scs/test/problem_utils.h +176 -14
  81. data/vendor/scs/test/problems/degenerate.h +130 -0
  82. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  83. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  84. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  85. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  86. data/vendor/scs/test/problems/random_prob +0 -0
  87. data/vendor/scs/test/problems/random_prob.h +45 -0
  88. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  89. data/vendor/scs/test/problems/small_lp.h +13 -14
  90. data/vendor/scs/test/problems/test_fails.h +43 -0
  91. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  92. data/vendor/scs/test/random_socp_prob.c +54 -53
  93. data/vendor/scs/test/rng.h +109 -0
  94. data/vendor/scs/test/run_from_file.c +19 -10
  95. data/vendor/scs/test/run_tests.c +27 -3
  96. metadata +30 -73
  97. data/ext/scs/Rakefile +0 -11
  98. data/vendor/scs/linsys/amatrix.c +0 -305
  99. data/vendor/scs/linsys/amatrix.h +0 -36
  100. data/vendor/scs/linsys/amatrix.o +0 -0
  101. data/vendor/scs/test/data/small_random_socp +0 -0
  102. data/vendor/scs/test/problems/small_random_socp.h +0 -33
  103. data/vendor/scs/test/run_tests +0 -2
@@ -0,0 +1,124 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "scs.h"
5
+ #include "scs_matrix.h"
6
+ #include "util.h"
7
+
8
+ static const char *hs21_tiny_qp(void) {
9
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
10
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
11
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
12
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
13
+ ScsInfo info = {0};
14
+ scs_int exitflag;
15
+ scs_float perr, derr;
16
+ scs_int success;
17
+ const char *fail;
18
+
19
+ /* data */
20
+ scs_float Ax[] = {-10., -1., 1., -1.};
21
+ scs_int Ai[] = {1, 2, 1, 3};
22
+ scs_int Ap[] = {0, 2, 4};
23
+
24
+ scs_float Px[] = {0.02, 2.};
25
+ scs_int Pi[] = {0, 1};
26
+ scs_int Pp[] = {0, 1, 2};
27
+
28
+ scs_float b[] = {1., 0., 0., 0.};
29
+ scs_float c[] = {0., 0.};
30
+
31
+ scs_int m = 4;
32
+ scs_int n = 2;
33
+
34
+ scs_float bl[] = {10.0, 2.0, -50.0};
35
+ scs_float bu[] = {1e+20, 50.0, 50.0};
36
+ scs_int bsize = 4;
37
+
38
+ scs_float opt = 0.04000000000000625;
39
+ /* end data */
40
+
41
+ d->m = m;
42
+ d->n = n;
43
+ d->b = b;
44
+ d->c = c;
45
+
46
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
47
+ d->P = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
48
+
49
+ d->A->m = m;
50
+ d->A->n = n;
51
+
52
+ d->A->x = Ax;
53
+ d->A->i = Ai;
54
+ d->A->p = Ap;
55
+
56
+ d->P->m = n;
57
+ d->P->n = n;
58
+
59
+ d->P->x = Px;
60
+ d->P->i = Pi;
61
+ d->P->p = Pp;
62
+
63
+ k->bsize = bsize;
64
+ k->bl = bl;
65
+ k->bu = bu;
66
+
67
+ SCS(set_default_settings)(stgs);
68
+ stgs->eps_abs = 1e-6;
69
+ stgs->eps_rel = 1e-6;
70
+ stgs->eps_infeas = 1e-9;
71
+
72
+ exitflag = scs(d, k, stgs, sol, &info);
73
+
74
+ perr = info.pobj - opt;
75
+ derr = info.dobj - opt;
76
+
77
+ scs_printf("primal obj error %4e\n", perr);
78
+ scs_printf("dual obj error %4e\n", derr);
79
+
80
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
81
+
82
+ mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
83
+ success);
84
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
85
+
86
+ /* test warm-starting */
87
+ stgs->warm_start = 1;
88
+ exitflag = scs(d, k, stgs, sol, &info);
89
+ /* 25 iters should be enough if warm-started */
90
+ mu_assert("hs21_tiny_qp: warm-start failure", info.iter <= 25);
91
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
92
+
93
+ mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
94
+ success);
95
+
96
+ /* test other settings */
97
+ stgs->warm_start = 0;
98
+ stgs->normalize = 0;
99
+ stgs->adaptive_scale = 0;
100
+ stgs->acceleration_lookback = 10;
101
+ stgs->acceleration_interval = 10;
102
+ stgs->log_csv_filename = "hs21_tiny_qp.csv";
103
+
104
+ exitflag = scs(d, k, stgs, sol, &info);
105
+
106
+ perr = info.pobj - opt;
107
+ derr = info.dobj - opt;
108
+
109
+ scs_printf("primal obj error %4e\n", perr);
110
+ scs_printf("dual obj error %4e\n", derr);
111
+
112
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
113
+
114
+ mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
115
+ success);
116
+
117
+ SCS(free_sol)(sol);
118
+ scs_free(d->A);
119
+ scs_free(d->P);
120
+ scs_free(k);
121
+ scs_free(stgs);
122
+ scs_free(d);
123
+ return fail;
124
+ }
@@ -0,0 +1,116 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "rw.h"
5
+ #include "scs.h"
6
+ #include "scs_matrix.h"
7
+ #include "util.h"
8
+
9
+ /* test read / write logic */
10
+ static const char *hs21_tiny_qp_rw(void) {
11
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
12
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
13
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
14
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
15
+ ScsInfo info = {0};
16
+ scs_int exitflag;
17
+ scs_float perr, derr;
18
+ scs_int success;
19
+ const char *fail;
20
+
21
+ /* data */
22
+ scs_float Ax[] = {-10., -1., 1., -1.};
23
+ scs_int Ai[] = {1, 2, 1, 3};
24
+ scs_int Ap[] = {0, 2, 4};
25
+
26
+ scs_float Px[] = {0.02, 2.};
27
+ scs_int Pi[] = {0, 1};
28
+ scs_int Pp[] = {0, 1, 2};
29
+
30
+ scs_float b[] = {1., 0., 0., 0.};
31
+ scs_float c[] = {0., 0.};
32
+
33
+ scs_int m = 4;
34
+ scs_int n = 2;
35
+
36
+ scs_float bl[] = {10.0, 2.0, -50.0};
37
+ scs_float bu[] = {1e+20, 50.0, 50.0};
38
+ scs_int bsize = 4;
39
+
40
+ scs_float opt = 0.04000000000000625;
41
+ /* end data */
42
+
43
+ d->m = m;
44
+ d->n = n;
45
+ d->b = b;
46
+ d->c = c;
47
+
48
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
49
+ d->P = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
50
+
51
+ d->A->m = m;
52
+ d->A->n = n;
53
+
54
+ d->A->x = Ax;
55
+ d->A->i = Ai;
56
+ d->A->p = Ap;
57
+
58
+ d->P->m = n;
59
+ d->P->n = n;
60
+
61
+ d->P->x = Px;
62
+ d->P->i = Pi;
63
+ d->P->p = Pp;
64
+
65
+ k->bsize = bsize;
66
+ k->bl = bl;
67
+ k->bu = bu;
68
+
69
+ SCS(set_default_settings)(stgs);
70
+ stgs->eps_abs = 1e-6;
71
+ stgs->eps_rel = 1e-6;
72
+ stgs->eps_infeas = 1e-9;
73
+
74
+ stgs->write_data_filename = "hs21_tiny_qp";
75
+ stgs->max_iters = 1;
76
+
77
+ exitflag = scs(d, k, stgs, sol, &info);
78
+
79
+ /* kill the data */
80
+ scs_free(d->A);
81
+ scs_free(d->P);
82
+ scs_free(k);
83
+ scs_free(stgs);
84
+ scs_free(d);
85
+
86
+ SCS(read_data)("hs21_tiny_qp", &d, &k, &stgs);
87
+ stgs->max_iters = 1000;
88
+ /* solve with read data */
89
+ exitflag = scs(d, k, stgs, sol, &info);
90
+
91
+ perr = info.pobj - opt;
92
+ derr = info.dobj - opt;
93
+
94
+ scs_printf("primal obj error %4e\n", perr);
95
+ scs_printf("dual obj error %4e\n", derr);
96
+
97
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
98
+
99
+ mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
100
+ success);
101
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
102
+
103
+ /* test warm-starting */
104
+ stgs->warm_start = 1;
105
+ exitflag = scs(d, k, stgs, sol, &info);
106
+ /* 25 iters should be enough if warm-started */
107
+ mu_assert("hs21_tiny_qp: warm-start failure", info.iter <= 25);
108
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
109
+
110
+ mu_assert("hs21_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
111
+ success);
112
+
113
+ SCS(free_sol)(sol);
114
+ SCS(free_data)(d, k, stgs);
115
+ return fail;
116
+ }
@@ -0,0 +1,100 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "scs.h"
5
+ #include "scs_matrix.h"
6
+ #include "util.h"
7
+
8
+ static const char *infeasible_tiny_qp(void) {
9
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
10
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
11
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
12
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
13
+ ScsInfo info = {0};
14
+ scs_int exitflag;
15
+ const char *fail;
16
+
17
+ /* data */
18
+ scs_float Ax[] = {
19
+ 4.51689976e-01, 3.06592046e-03, 5.17304192e-01, -3.03038477e+00,
20
+ -1.40509892e+00, 7.94277342e-04, 2.39454841e+00, -7.60957360e-01,
21
+ -1.18946302e+00, 3.98797701e-01, 1.01386914e+00, -2.53921734e+00,
22
+ -3.21202445e-01, 9.25735134e-01, -2.54046934e-01, 1.28211442e-01,
23
+ -1.65155072e-01, -4.53308401e-01, -4.66709068e-01, -2.24298562e-01,
24
+ -4.92029627e-01, 8.05750411e-01, -1.72920210e+00, -1.45633836e-01,
25
+ 6.39086786e-01, 1.20509649e-01, 4.19672104e-01, -2.29274817e-01,
26
+ 3.30125838e-01, 4.12874191e-01, 1.05357823e+00, 2.10587878e+00,
27
+ 5.54934230e-01, 2.42617608e+00, -8.33596918e-01, -6.83444334e-01,
28
+ 8.23856780e-01, -4.14240741e-01, -7.24051659e-01, 1.06144329e-01,
29
+ 6.92857027e-01, 1.64822980e+00, 1.94603528e-01, -7.58318366e-01,
30
+ 1.42948833e+00, -2.49039902e-01, 2.15319490e-01, -1.52651434e+00,
31
+ -3.94761305e-01, -5.24305949e-01};
32
+ scs_int Ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6,
33
+ 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
34
+ 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
35
+ scs_int Ap[] = {0, 10, 20, 30, 40, 50};
36
+
37
+ scs_float Px[] = {0.40113649, 0.15897142, 0.37369516, -0.05899464,
38
+ 0.0772996, 0.37333677, -0.02994108, 0.04870077,
39
+ 0.32221413, 0.28665235, -0.27383424, 0.04842465,
40
+ 0.07832219, 0.0660133, 0.49993284};
41
+ scs_int Pi[] = {0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4};
42
+ scs_int Pp[] = {0, 1, 3, 6, 10, 15};
43
+
44
+ scs_float b[] = {-0.057279, 0.10451534, -0.10459346, -0.18452294,
45
+ 0.18609658, 0.15795524, -0.00562746, -0.85852899,
46
+ -0.48271335, 0.61951655};
47
+ scs_float c[] = {-0.16566256, -1.33116808, -0.1767858, -1.0940148,
48
+ 1.15348983};
49
+
50
+ scs_int m = 10;
51
+ scs_int n = 5;
52
+
53
+ scs_int l = m;
54
+
55
+ /* end data */
56
+
57
+ d->m = m;
58
+ d->n = n;
59
+ d->b = b;
60
+ d->c = c;
61
+
62
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
63
+ d->P = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
64
+
65
+ d->A->m = m;
66
+ d->A->n = n;
67
+
68
+ d->A->x = Ax;
69
+ d->A->i = Ai;
70
+ d->A->p = Ap;
71
+
72
+ d->P->m = n;
73
+ d->P->n = n;
74
+
75
+ d->P->x = Px;
76
+ d->P->i = Pi;
77
+ d->P->p = Pp;
78
+
79
+ k->l = l;
80
+
81
+ SCS(set_default_settings)(stgs);
82
+ stgs->eps_abs = 1e-6;
83
+ stgs->eps_rel = 1e-6;
84
+ stgs->eps_infeas = 1e-9;
85
+
86
+ exitflag = scs(d, k, stgs, sol, &info);
87
+
88
+ mu_assert(
89
+ "infeasible_tiny_qp: SCS failed to produce outputflag SCS_INFEASIBLE",
90
+ exitflag == SCS_INFEASIBLE);
91
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
92
+
93
+ SCS(free_sol)(sol);
94
+ scs_free(d->A);
95
+ scs_free(d->P);
96
+ scs_free(k);
97
+ scs_free(stgs);
98
+ scs_free(d);
99
+ return fail;
100
+ }
@@ -0,0 +1,199 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "scs.h"
5
+ #include "scs_matrix.h"
6
+ #include "util.h"
7
+
8
+ static const char *qafiro_tiny_qp(void) {
9
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
10
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
11
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
12
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
13
+ ScsInfo info = {0};
14
+ scs_int exitflag;
15
+ scs_float perr, derr;
16
+ scs_int success;
17
+ const char *fail;
18
+
19
+ /* data */
20
+ scs_float Ax[] = {
21
+ -1., -1.06, -1., -0.301, -1., 1., 1., -1., 1.,
22
+ 1., -1., 1., -1., -1., -1., -1.06, -1., -0.301,
23
+ -1., -1., -1.06, -1., -0.313, -1., -1., -0.96, -1.,
24
+ -0.313, -1., -1., -0.86, -1., -0.326, -1., 1., -2.364,
25
+ -1., 1., -2.386, -1., 1., -2.408, -1., 1., -2.429,
26
+ -1., 1., -1.4, -1., 1., 1., -1., 1., -1.,
27
+ -1., -0.43, -1., -1., -0.109, -1., 1., 1., -1.,
28
+ 1., 1., -1., 1., 1., -1., 1., -1., -1.,
29
+ 1., -0.43, -1., -0.109, -1., 1., -0.43, -1., -0.108,
30
+ -1., 1., -0.39, -1., -0.108, -1., 1., -0.37, -1.,
31
+ -0.107, -1., 1., -2.191, -1., 1., -2.219, -1., 1.,
32
+ -2.249, -1., 1., -2.279, -1., -1., -1.4, -1., 1.,
33
+ 1., -1., 1., -1., -1., 1., -1.};
34
+ scs_int Ai[] = {0, 1, 16, 24, 28, 0, 15, 29, 0, 22, 30, 1, 26, 31, 4,
35
+ 5, 12, 25, 32, 4, 5, 11, 25, 33, 4, 5, 9, 25, 34, 4,
36
+ 5, 10, 25, 35, 12, 21, 36, 11, 21, 37, 9, 21, 38, 10, 21,
37
+ 39, 4, 15, 40, 4, 23, 41, 5, 27, 42, 6, 7, 13, 22, 43,
38
+ 7, 14, 44, 7, 24, 45, 7, 21, 46, 6, 26, 47, 2, 3, 17,
39
+ 23, 48, 2, 3, 18, 23, 49, 2, 3, 19, 23, 50, 2, 3, 20,
40
+ 23, 51, 17, 21, 52, 18, 21, 53, 19, 21, 54, 20, 21, 55, 2,
41
+ 14, 56, 2, 25, 57, 3, 27, 58, 2, 59};
42
+ scs_int Ap[] = {0, 5, 8, 11, 14, 19, 24, 29, 34, 37, 40,
43
+ 43, 46, 49, 52, 55, 60, 63, 66, 69, 72, 77,
44
+ 82, 87, 92, 95, 98, 101, 104, 107, 110, 113, 115};
45
+
46
+ scs_float Px[] = {10., 1., 10., 1., 1., 10.};
47
+ scs_int Pi[] = {0, 0, 1, 0, 1, 2};
48
+ scs_int Pp[] = {0, 1, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
49
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
50
+
51
+ scs_float b[] = {
52
+ 0.00000000e+00, 0.00000000e+00, 4.40000000e+01, -2.22044605e-16,
53
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
54
+ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
55
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
56
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
57
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
58
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
59
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
60
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
61
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
62
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
63
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
64
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
65
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
66
+ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00};
67
+ scs_float c[] = {0., -0.4, 0., 0., 0., 0., 0., 0., 0., 0., 0.,
68
+ 0., -0.32, 0., 0., 0., -0.6, 0., 0., 0., 0., 0.,
69
+ 0., 0., 0., 0., 0., 0., -0.48, 0., 0., 10.};
70
+
71
+ scs_int m = 60;
72
+ scs_int n = 32;
73
+
74
+ scs_float bl[] = {
75
+ -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20,
76
+ -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20, -1e+20,
77
+ -1e+20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
78
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
79
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
80
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
81
+ scs_float bu[] = {0.0, 0.0, 0.0, 80.0, 500.0, 0.0, 0.0, 80.0,
82
+ 500.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
83
+ 0.0, 310.0, 300.0, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20,
84
+ 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20,
85
+ 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20,
86
+ 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20, 1e+20,
87
+ 1e+20, 1e+20, 1e+20};
88
+ scs_int bsize = 52;
89
+ scs_int z = 8;
90
+
91
+ scs_float opt = -1.5907818;
92
+ /* end data */
93
+
94
+ d->m = m;
95
+ d->n = n;
96
+ d->b = b;
97
+ d->c = c;
98
+
99
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
100
+ d->P = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
101
+
102
+ d->A->m = m;
103
+ d->A->n = n;
104
+
105
+ d->A->x = Ax;
106
+ d->A->i = Ai;
107
+ d->A->p = Ap;
108
+
109
+ d->P->m = n;
110
+ d->P->n = n;
111
+
112
+ d->P->x = Px;
113
+ d->P->i = Pi;
114
+ d->P->p = Pp;
115
+
116
+ k->bsize = bsize;
117
+ k->bl = bl;
118
+ k->bu = bu;
119
+ k->z = z;
120
+
121
+ SCS(set_default_settings)(stgs);
122
+ stgs->eps_abs = 1e-6;
123
+ stgs->eps_rel = 1e-6;
124
+ stgs->eps_infeas = 1e-9;
125
+
126
+ exitflag = scs(d, k, stgs, sol, &info);
127
+
128
+ perr = info.pobj - opt;
129
+ derr = info.dobj - opt;
130
+
131
+ scs_printf("primal obj error %4e\n", perr);
132
+ scs_printf("dual obj error %4e\n", derr);
133
+
134
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
135
+
136
+ mu_assert("qafiro_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
137
+ success);
138
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
139
+
140
+ /* test warm-starting */
141
+ stgs->warm_start = 1;
142
+ exitflag = scs(d, k, stgs, sol, &info);
143
+ /* 25 iters should be enough if warm-started */
144
+ mu_assert("qafiro_tiny_qp: warm-start failure", info.iter <= 50);
145
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
146
+
147
+ mu_assert("qafiro_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
148
+ success);
149
+
150
+ /* test other settings */
151
+ stgs->warm_start = 0;
152
+ stgs->normalize = 0;
153
+ stgs->adaptive_scale = 0;
154
+ stgs->acceleration_lookback = 10;
155
+ stgs->acceleration_interval = 10;
156
+ stgs->log_csv_filename = "qafiro_tiny_qp.csv";
157
+
158
+ exitflag = scs(d, k, stgs, sol, &info);
159
+
160
+ perr = info.pobj - opt;
161
+ derr = info.dobj - opt;
162
+
163
+ scs_printf("primal obj error %4e\n", perr);
164
+ scs_printf("dual obj error %4e\n", derr);
165
+
166
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
167
+
168
+ mu_assert("qafiro_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
169
+ success);
170
+
171
+ /* test other settings */
172
+ stgs->warm_start = 0;
173
+ stgs->normalize = 0;
174
+ stgs->adaptive_scale = 0;
175
+ stgs->acceleration_lookback = -10;
176
+ stgs->acceleration_interval = 10;
177
+ stgs->log_csv_filename = "qafiro_tiny_qp.csv";
178
+
179
+ exitflag = scs(d, k, stgs, sol, &info);
180
+
181
+ perr = info.pobj - opt;
182
+ derr = info.dobj - opt;
183
+
184
+ scs_printf("primal obj error %4e\n", perr);
185
+ scs_printf("dual obj error %4e\n", derr);
186
+
187
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
188
+
189
+ mu_assert("qafiro_tiny_qp: SCS failed to produce outputflag SCS_SOLVED",
190
+ success);
191
+
192
+ SCS(free_sol)(sol);
193
+ scs_free(d->A);
194
+ scs_free(d->P);
195
+ scs_free(k);
196
+ scs_free(stgs);
197
+ scs_free(d);
198
+ return fail;
199
+ }
@@ -0,0 +1,45 @@
1
+ #include "glbopts.h"
2
+ #include "minunit.h"
3
+ #include "problem_utils.h"
4
+ #include "scs.h"
5
+ #include "util.h"
6
+
7
+ static const char *random_prob(void) {
8
+ scs_int read_status;
9
+ ScsData *d;
10
+ ScsCone *k;
11
+ ScsSettings *stgs;
12
+ ScsSolution *sol;
13
+ ScsInfo info = {0};
14
+ scs_int exitflag;
15
+ scs_float perr, derr;
16
+ scs_int success;
17
+ const char *fail;
18
+
19
+ scs_float OPT = 5.751458006385587;
20
+
21
+ read_status = SCS(read_data)("test/problems/random_prob", &d, &k, &stgs);
22
+
23
+ if (read_status < 0) {
24
+ return "Data read failure, exit.\n";
25
+ }
26
+
27
+ stgs->eps_abs = 1e-6;
28
+ stgs->eps_rel = 1e-6;
29
+
30
+ sol = scs_calloc(1, sizeof(ScsSolution));
31
+ exitflag = scs(d, k, stgs, sol, &info);
32
+
33
+ perr = SCS(dot)(d->c, sol->x, d->n) - OPT;
34
+ derr = -SCS(dot)(d->b, sol->y, d->m) - OPT;
35
+ scs_printf("primal obj error %4e\n", perr);
36
+ scs_printf("dual obj error %4e\n", derr);
37
+
38
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
39
+
40
+ mu_assert("random_prob: SCS failed to produce SCS_SOLVED", success);
41
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
42
+ SCS(free_data)(d, k, stgs);
43
+ SCS(free_sol)(sol);
44
+ return fail;
45
+ }