scs 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }