scs 0.2.3 → 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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +11 -6
  4. data/lib/scs/ffi.rb +30 -13
  5. data/lib/scs/solver.rb +32 -9
  6. data/lib/scs/version.rb +1 -1
  7. data/vendor/scs/CITATION.cff +39 -0
  8. data/vendor/scs/CMakeLists.txt +7 -8
  9. data/vendor/scs/Makefile +24 -15
  10. data/vendor/scs/README.md +5 -263
  11. data/vendor/scs/include/aa.h +67 -23
  12. data/vendor/scs/include/cones.h +17 -17
  13. data/vendor/scs/include/glbopts.h +98 -32
  14. data/vendor/scs/include/linalg.h +2 -4
  15. data/vendor/scs/include/linsys.h +58 -44
  16. data/vendor/scs/include/normalize.h +3 -3
  17. data/vendor/scs/include/rw.h +8 -2
  18. data/vendor/scs/include/scs.h +293 -133
  19. data/vendor/scs/include/util.h +3 -15
  20. data/vendor/scs/linsys/cpu/direct/private.c +220 -224
  21. data/vendor/scs/linsys/cpu/direct/private.h +13 -7
  22. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  23. data/vendor/scs/linsys/cpu/indirect/private.c +177 -110
  24. data/vendor/scs/linsys/cpu/indirect/private.h +8 -4
  25. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  26. data/vendor/scs/linsys/csparse.c +87 -0
  27. data/vendor/scs/linsys/csparse.h +34 -0
  28. data/vendor/scs/linsys/csparse.o +0 -0
  29. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +1 -1
  30. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  31. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  32. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  33. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  34. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  35. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  36. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  37. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  38. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  39. data/vendor/scs/linsys/external/amd/amd_internal.h +1 -1
  40. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  41. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  42. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  43. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  44. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  45. data/vendor/scs/linsys/external/qdldl/changes +2 -0
  46. data/vendor/scs/linsys/external/qdldl/qdldl.c +29 -46
  47. data/vendor/scs/linsys/external/qdldl/qdldl.h +33 -41
  48. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  49. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +11 -3
  50. data/vendor/scs/linsys/gpu/gpu.c +31 -33
  51. data/vendor/scs/linsys/gpu/gpu.h +48 -31
  52. data/vendor/scs/linsys/gpu/indirect/private.c +338 -232
  53. data/vendor/scs/linsys/gpu/indirect/private.h +23 -14
  54. data/vendor/scs/linsys/scs_matrix.c +498 -0
  55. data/vendor/scs/linsys/scs_matrix.h +70 -0
  56. data/vendor/scs/linsys/scs_matrix.o +0 -0
  57. data/vendor/scs/scs.mk +13 -9
  58. data/vendor/scs/src/aa.c +384 -109
  59. data/vendor/scs/src/aa.o +0 -0
  60. data/vendor/scs/src/cones.c +440 -353
  61. data/vendor/scs/src/cones.o +0 -0
  62. data/vendor/scs/src/ctrlc.c +15 -5
  63. data/vendor/scs/src/ctrlc.o +0 -0
  64. data/vendor/scs/src/linalg.c +84 -28
  65. data/vendor/scs/src/linalg.o +0 -0
  66. data/vendor/scs/src/normalize.c +22 -64
  67. data/vendor/scs/src/normalize.o +0 -0
  68. data/vendor/scs/src/rw.c +160 -21
  69. data/vendor/scs/src/rw.o +0 -0
  70. data/vendor/scs/src/scs.c +767 -563
  71. data/vendor/scs/src/scs.o +0 -0
  72. data/vendor/scs/src/scs_indir.o +0 -0
  73. data/vendor/scs/src/scs_version.c +9 -3
  74. data/vendor/scs/src/scs_version.o +0 -0
  75. data/vendor/scs/src/util.c +37 -106
  76. data/vendor/scs/src/util.o +0 -0
  77. data/vendor/scs/test/minunit.h +17 -8
  78. data/vendor/scs/test/problem_utils.h +176 -14
  79. data/vendor/scs/test/problems/degenerate.h +130 -0
  80. data/vendor/scs/test/problems/hs21_tiny_qp.h +124 -0
  81. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +116 -0
  82. data/vendor/scs/test/problems/infeasible_tiny_qp.h +100 -0
  83. data/vendor/scs/test/problems/qafiro_tiny_qp.h +199 -0
  84. data/vendor/scs/test/problems/random_prob +0 -0
  85. data/vendor/scs/test/problems/random_prob.h +45 -0
  86. data/vendor/scs/test/problems/rob_gauss_cov_est.h +188 -31
  87. data/vendor/scs/test/problems/small_lp.h +13 -14
  88. data/vendor/scs/test/problems/test_fails.h +43 -0
  89. data/vendor/scs/test/problems/unbounded_tiny_qp.h +82 -0
  90. data/vendor/scs/test/random_socp_prob.c +54 -53
  91. data/vendor/scs/test/rng.h +109 -0
  92. data/vendor/scs/test/run_from_file.c +19 -10
  93. data/vendor/scs/test/run_tests.c +27 -3
  94. metadata +20 -8
  95. data/vendor/scs/linsys/amatrix.c +0 -305
  96. data/vendor/scs/linsys/amatrix.h +0 -36
  97. data/vendor/scs/linsys/amatrix.o +0 -0
  98. data/vendor/scs/test/data/small_random_socp +0 -0
  99. data/vendor/scs/test/problems/small_random_socp.h +0 -33
  100. 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
+ }