scs 0.2.2 → 0.3.2

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 +16 -0
  3. data/LICENSE.txt +18 -18
  4. data/README.md +19 -14
  5. data/lib/scs/ffi.rb +31 -20
  6. data/lib/scs/solver.rb +32 -9
  7. data/lib/scs/version.rb +1 -1
  8. data/vendor/scs/CITATION.cff +39 -0
  9. data/vendor/scs/CMakeLists.txt +320 -0
  10. data/vendor/scs/Makefile +32 -23
  11. data/vendor/scs/README.md +9 -218
  12. data/vendor/scs/include/aa.h +67 -23
  13. data/vendor/scs/include/cones.h +22 -19
  14. data/vendor/scs/include/glbopts.h +107 -79
  15. data/vendor/scs/include/linalg.h +3 -4
  16. data/vendor/scs/include/linsys.h +58 -44
  17. data/vendor/scs/include/normalize.h +6 -5
  18. data/vendor/scs/include/rw.h +8 -2
  19. data/vendor/scs/include/scs.h +257 -141
  20. data/vendor/scs/include/scs_types.h +34 -0
  21. data/vendor/scs/include/scs_work.h +83 -0
  22. data/vendor/scs/include/util.h +3 -15
  23. data/vendor/scs/linsys/cpu/direct/private.c +241 -232
  24. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  25. data/vendor/scs/linsys/cpu/indirect/private.c +194 -118
  26. data/vendor/scs/linsys/cpu/indirect/private.h +7 -4
  27. data/vendor/scs/linsys/csparse.c +87 -0
  28. data/vendor/scs/linsys/csparse.h +34 -0
  29. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +6 -6
  30. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +6 -1
  31. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  32. data/vendor/scs/linsys/external/amd/amd_order.c +5 -5
  33. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  34. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  35. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  36. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  37. data/vendor/scs/linsys/gpu/gpu.c +58 -21
  38. data/vendor/scs/linsys/gpu/gpu.h +70 -35
  39. data/vendor/scs/linsys/gpu/indirect/private.c +394 -157
  40. data/vendor/scs/linsys/gpu/indirect/private.h +27 -12
  41. data/vendor/scs/linsys/scs_matrix.c +478 -0
  42. data/vendor/scs/linsys/scs_matrix.h +70 -0
  43. data/vendor/scs/scs.mk +14 -10
  44. data/vendor/scs/src/aa.c +394 -110
  45. data/vendor/scs/src/cones.c +497 -359
  46. data/vendor/scs/src/ctrlc.c +15 -5
  47. data/vendor/scs/src/linalg.c +107 -26
  48. data/vendor/scs/src/normalize.c +30 -72
  49. data/vendor/scs/src/rw.c +202 -27
  50. data/vendor/scs/src/scs.c +769 -571
  51. data/vendor/scs/src/scs_version.c +11 -3
  52. data/vendor/scs/src/util.c +37 -106
  53. data/vendor/scs/test/minunit.h +22 -8
  54. data/vendor/scs/test/problem_utils.h +180 -25
  55. data/vendor/scs/test/problems/degenerate.h +130 -0
  56. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  57. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  58. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  59. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  60. data/vendor/scs/test/problems/random_prob +0 -0
  61. data/vendor/scs/test/problems/random_prob.h +45 -0
  62. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  63. data/vendor/scs/test/problems/small_lp.h +14 -13
  64. data/vendor/scs/test/problems/small_qp.h +352 -0
  65. data/vendor/scs/test/problems/test_validation.h +43 -0
  66. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  67. data/vendor/scs/test/random_socp_prob.c +54 -53
  68. data/vendor/scs/test/rng.h +109 -0
  69. data/vendor/scs/test/run_from_file.c +20 -11
  70. data/vendor/scs/test/run_tests.c +35 -2
  71. metadata +29 -98
  72. data/vendor/scs/linsys/amatrix.c +0 -305
  73. data/vendor/scs/linsys/amatrix.h +0 -36
  74. data/vendor/scs/linsys/amatrix.o +0 -0
  75. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  76. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  77. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  78. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  79. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  80. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  81. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  82. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  83. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  84. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  85. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  86. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  87. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  88. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  89. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  90. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  91. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  92. data/vendor/scs/src/aa.o +0 -0
  93. data/vendor/scs/src/cones.o +0 -0
  94. data/vendor/scs/src/ctrlc.o +0 -0
  95. data/vendor/scs/src/linalg.o +0 -0
  96. data/vendor/scs/src/normalize.o +0 -0
  97. data/vendor/scs/src/rw.o +0 -0
  98. data/vendor/scs/src/scs.o +0 -0
  99. data/vendor/scs/src/scs_version.o +0 -0
  100. data/vendor/scs/src/util.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-7;
123
+ stgs->eps_rel = 1e-7;
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 = (ScsSolution *)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
+ }