scs 0.5.1 → 0.5.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/scs/ffi.rb +2 -0
  4. data/lib/scs/version.rb +1 -1
  5. data/vendor/scs/CITATION.cff +2 -2
  6. data/vendor/scs/CMakeLists.txt +136 -6
  7. data/vendor/scs/Makefile +53 -3
  8. data/vendor/scs/README.md +1 -1
  9. data/vendor/scs/include/cones.h +47 -2
  10. data/vendor/scs/include/glbopts.h +1 -1
  11. data/vendor/scs/include/scs.h +29 -0
  12. data/vendor/scs/include/scs_blas.h +4 -0
  13. data/vendor/scs/include/scs_types.h +3 -1
  14. data/vendor/scs/include/util_spectral_cones.h +45 -0
  15. data/vendor/scs/linsys/cpu/direct/private.c +3 -3
  16. data/vendor/scs/linsys/cpu/direct/private.h +2 -1
  17. data/vendor/scs/linsys/csparse.c +1 -1
  18. data/vendor/scs/linsys/cudss/direct/private.c +279 -0
  19. data/vendor/scs/linsys/cudss/direct/private.h +63 -0
  20. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +1 -1
  21. data/vendor/scs/linsys/gpu/indirect/private.c +14 -21
  22. data/vendor/scs/scs.mk +17 -2
  23. data/vendor/scs/src/aa.c +8 -12
  24. data/vendor/scs/src/cones.c +783 -12
  25. data/vendor/scs/src/rw.c +15 -1
  26. data/vendor/scs/src/scs.c +4 -0
  27. data/vendor/scs/src/spectral_cones/logdeterminant/log_cone_IPM.c +660 -0
  28. data/vendor/scs/src/spectral_cones/logdeterminant/log_cone_Newton.c +279 -0
  29. data/vendor/scs/src/spectral_cones/logdeterminant/log_cone_wrapper.c +205 -0
  30. data/vendor/scs/src/spectral_cones/logdeterminant/logdet_cone.c +143 -0
  31. data/vendor/scs/src/spectral_cones/nuclear/ell1_cone.c +221 -0
  32. data/vendor/scs/src/spectral_cones/nuclear/nuclear_cone.c +99 -0
  33. data/vendor/scs/src/spectral_cones/sum-largest/sum_largest_cone.c +196 -0
  34. data/vendor/scs/src/spectral_cones/sum-largest/sum_largest_eval_cone.c +140 -0
  35. data/vendor/scs/src/spectral_cones/util_spectral_cones.c +52 -0
  36. data/vendor/scs/test/problems/complex_PSD.h +83 -0
  37. data/vendor/scs/test/rng.h +4 -4
  38. data/vendor/scs/test/run_tests.c +25 -0
  39. data/vendor/scs/test/spectral_cones_problems/exp_design.h +141 -0
  40. data/vendor/scs/test/spectral_cones_problems/graph_partitioning.h +275 -0
  41. data/vendor/scs/test/spectral_cones_problems/robust_pca.h +253 -0
  42. data/vendor/scs/test/spectral_cones_problems/several_logdet_cones.h +222 -0
  43. data/vendor/scs/test/spectral_cones_problems/several_nuc_cone.h +285 -0
  44. data/vendor/scs/test/spectral_cones_problems/several_sum_largest.h +420 -0
  45. metadata +21 -2
@@ -0,0 +1,83 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "problem_utils.h"
5
+ #include "rw.h"
6
+ #include "scs.h"
7
+ #include "scs_matrix.h"
8
+ #include "util.h"
9
+
10
+ static const char *complex_PSD(void)
11
+ {
12
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
13
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
14
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
15
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
16
+ ScsInfo info = {0};
17
+ scs_int exitflag;
18
+ scs_float perr, derr;
19
+ scs_int success;
20
+ const char *fail;
21
+
22
+ /* data */
23
+ scs_float Ax[] = {1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0};
24
+ scs_int Ai[] = {0, 1, 2, 3, 4, 5, 0, 6, 7, 8, 0, 9};
25
+ scs_int Ap[] = {0, 2, 3, 4, 5, 6, 8, 9, 10, 12};
26
+ scs_float b[] = {1.0, 0., 0., 0., 0., 0., 0., 0., 0., 0.};
27
+ scs_float c[] = {1, 2 * sqrt(2), 3 * sqrt(2), 4 * sqrt(2), 5 * sqrt(2), 6,
28
+ 7 * sqrt(2), -8 * sqrt(2), 9};
29
+
30
+ scs_int m = 10;
31
+ scs_int n = 9;
32
+ scs_int cs[] = {3};
33
+ scs_int cssize = 1;
34
+ k->z = 1;
35
+ k->cs = cs;
36
+ k->cssize = cssize;
37
+
38
+ // computed offline
39
+ scs_float opt = -5.228930;
40
+ /* end data */
41
+
42
+ d->m = m;
43
+ d->n = n;
44
+ d->b = b;
45
+ d->c = c;
46
+
47
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
48
+ d->A->m = m;
49
+ d->A->n = n;
50
+ d->A->x = Ax;
51
+ d->A->i = Ai;
52
+ d->A->p = Ap;
53
+
54
+ scs_set_default_settings(stgs);
55
+ stgs->eps_abs = 1e-7;
56
+ stgs->eps_rel = 1e-7;
57
+ stgs->eps_infeas = 1e-9;
58
+
59
+ exitflag = scs(d, k, stgs, sol, &info);
60
+
61
+ perr = SCS(dot)(d->c, sol->x, d->n) - opt;
62
+ derr = -SCS(dot)(d->b, sol->y, d->m) - opt;
63
+
64
+ scs_printf("primal obj error %4e\n", perr);
65
+ scs_printf("dual obj error %4e\n", derr);
66
+
67
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
68
+
69
+ mu_assert("complex_PSD: SCS failed to produce outputflag SCS_SOLVED", success);
70
+
71
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
72
+ if (fail)
73
+ return fail;
74
+
75
+ /* kill data */
76
+ scs_free(d->A);
77
+ scs_free(k);
78
+ scs_free(stgs);
79
+ scs_free(d);
80
+ SCS(free_sol)(sol);
81
+
82
+ return fail;
83
+ }
@@ -52,14 +52,14 @@ long ran_arr_buf[QUALITY];
52
52
  long ran_arr_dummy = -1, ran_arr_started = -1;
53
53
  long *ran_arr_ptr = &ran_arr_dummy; /* the next random number, or -1 */
54
54
 
55
- #define TT 70 /* guaranteed separation between streams */
56
- #define is_odd(x) ((x)&1) /* units bit of x */
55
+ #define TT 70 /* guaranteed separation between streams */
56
+ #define is_odd(x) ((x) & 1) /* units bit of x */
57
57
 
58
58
  #ifdef __STDC__
59
59
  void ran_start(long seed)
60
60
  #else
61
- void ran_start(seed) /* do this before using ran_array */
62
- long seed; /* selector for different streams */
61
+ void ran_start(seed) /* do this before using ran_array */
62
+ long seed; /* selector for different streams */
63
63
  #endif
64
64
  {
65
65
  register int t, j;
@@ -33,11 +33,29 @@ _SKIP(test_validation)
33
33
 
34
34
  /* solve SDPs, requires blas / lapack */
35
35
  #if defined(USE_LAPACK) && NO_READ_WRITE == 0
36
+ #include "problems/complex_PSD.h"
36
37
  #include "problems/random_prob.h"
37
38
  #include "problems/rob_gauss_cov_est.h"
38
39
  #else
39
40
  _SKIP(rob_gauss_cov_est)
40
41
  _SKIP(random_prob)
42
+ _SKIP(complex_PSD)
43
+ #endif
44
+
45
+ #if defined(USE_SPECTRAL_CONES) && NO_READ_WRITE == 0
46
+ #include "spectral_cones_problems/exp_design.h"
47
+ #include "spectral_cones_problems/graph_partitioning.h"
48
+ #include "spectral_cones_problems/robust_pca.h"
49
+ #include "spectral_cones_problems/several_logdet_cones.h"
50
+ #include "spectral_cones_problems/several_nuc_cone.h"
51
+ #include "spectral_cones_problems/several_sum_largest.h"
52
+ #else
53
+ _SKIP(exp_design)
54
+ _SKIP(robust_pca)
55
+ _SKIP(graph_partitioning)
56
+ _SKIP(several_sum_largest)
57
+ _SKIP(several_nuc_cone)
58
+ _SKIP(several_logdet_cones)
41
59
  #endif
42
60
 
43
61
  #if NO_READ_WRITE == 0 /* reads / writes */
@@ -56,6 +74,7 @@ static const char *all_tests(void) {
56
74
  mu_run_test(small_lp);
57
75
  mu_run_test(small_qp);
58
76
  mu_run_test(rob_gauss_cov_est);
77
+ mu_run_test(complex_PSD);
59
78
  mu_run_test(hs21_tiny_qp);
60
79
  mu_run_test(hs21_tiny_qp_rw);
61
80
  mu_run_test(qafiro_tiny_qp);
@@ -65,6 +84,12 @@ static const char *all_tests(void) {
65
84
  mu_run_test(max_ent);
66
85
  mu_run_test(mpc_bug);
67
86
  mu_run_test(test_exp_cone);
87
+ mu_run_test(exp_design);
88
+ mu_run_test(robust_pca);
89
+ mu_run_test(graph_partitioning);
90
+ mu_run_test(several_sum_largest);
91
+ mu_run_test(several_nuc_cone);
92
+ mu_run_test(several_logdet_cones);
68
93
  return 0;
69
94
  }
70
95
  int main(void) {
@@ -0,0 +1,141 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "problem_utils.h"
5
+ #include "rw.h"
6
+ #include "scs.h"
7
+ #include "scs_matrix.h"
8
+ #include "util.h"
9
+
10
+ // for SpectralSCS
11
+ static const char *exp_design(void) {
12
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
13
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
14
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
15
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
16
+ ScsInfo info = {0};
17
+ scs_int exitflag;
18
+ scs_float perr, derr;
19
+ scs_int success;
20
+ const char *fail;
21
+
22
+ /* data */
23
+ scs_float Ax[] = {
24
+ -1., 1., -1., 3.24, 0.16,
25
+ 1., 4.84, 3.61, 1., -1.,
26
+ 2.54558441, -0.11313708, -0.14142136, 1.24450793, 0.26870058,
27
+ -2.12132034, -1., 2.03646753, 0.05656854, 0.56568542,
28
+ 0.93338095, 4.03050865, 0.28284271, -1., 1.,
29
+ 0.04, 0.01, 0.16, 0.01, 2.25,
30
+ -1., 1.13137085, -0.02828427, -0.05656854, 0.16970563,
31
+ 0.21213203, -0.42426407, -1., 0.64, 0.01,
32
+ 0.16, 0.09, 2.25, 0.04, -1.};
33
+ scs_int Ai[] = {7, 0, 8, 1, 2, 3, 4, 5, 6, 9, 1, 2, 3, 4, 5,
34
+ 6, 10, 1, 2, 3, 4, 5, 6, 11, 1, 2, 3, 4, 5, 6,
35
+ 12, 1, 2, 3, 4, 5, 6, 13, 1, 2, 3, 4, 5, 6, 14};
36
+ scs_int Ap[] = {0, 1, 3, 10, 17, 24, 31, 38, 45};
37
+
38
+ scs_float b[] = {1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.};
39
+ scs_float c[] = {1., 0., 0., 0., 0., 0., 0., 0.};
40
+
41
+ scs_int m = 15;
42
+ scs_int n = 8;
43
+
44
+ scs_int z = 1;
45
+ scs_int l = 6;
46
+ scs_int *q = SCS_NULL;
47
+ scs_int qsize = 0;
48
+ scs_int *s = SCS_NULL;
49
+ scs_int ssize = 0;
50
+ scs_int ep = 0;
51
+ scs_int ed = 0;
52
+ scs_float *p = SCS_NULL;
53
+ scs_int psize = 0;
54
+ scs_int d_array[] = {3};
55
+ scs_int dsize = 1;
56
+ scs_int *nuc_m = SCS_NULL;
57
+ scs_int *nuc_n = SCS_NULL;
58
+ scs_int nucsize = 0;
59
+ scs_int *ell1 = SCS_NULL;
60
+ scs_int ell1_size = 0;
61
+ scs_int *sl_n = SCS_NULL;
62
+ scs_int *sl_k = SCS_NULL;
63
+ scs_int sl_size = 0;
64
+
65
+ // computed using mosek (the input of Ax is truncated, and mosek solved
66
+ // the problem with the non-truncated data)
67
+ scs_float opt = 3.0333290743428574;
68
+ /* end data */
69
+
70
+ d->m = m;
71
+ d->n = n;
72
+ d->b = b;
73
+ d->c = c;
74
+
75
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
76
+
77
+ d->A->m = m;
78
+ d->A->n = n;
79
+ d->A->x = Ax;
80
+ d->A->i = Ai;
81
+ d->A->p = Ap;
82
+
83
+ k->z = z;
84
+ k->l = l;
85
+ k->q = q;
86
+ k->qsize = qsize;
87
+ k->s = s;
88
+ k->ssize = ssize;
89
+ k->ep = ep;
90
+ k->ed = ed;
91
+ k->p = p;
92
+ k->psize = psize;
93
+ k->d = d_array;
94
+ k->dsize = dsize;
95
+ k->nuc_m = nuc_m;
96
+ k->nuc_n = nuc_n;
97
+ k->nucsize = nucsize;
98
+ k->ell1 = ell1;
99
+ k->ell1_size = ell1_size;
100
+ k->sl_n = sl_n;
101
+ k->sl_k = sl_k;
102
+ k->sl_size = sl_size;
103
+
104
+ scs_set_default_settings(stgs);
105
+ stgs->eps_abs = 1e-7;
106
+ stgs->eps_rel = 1e-7;
107
+ stgs->eps_infeas = 1e-9;
108
+
109
+ stgs->log_csv_filename = "test_exp_design.csv";
110
+ exitflag = scs(d, k, stgs, sol, &info);
111
+
112
+ perr = SCS(dot)(d->c, sol->x, d->n) - opt;
113
+ derr = -SCS(dot)(d->b, sol->y, d->m) - opt;
114
+
115
+ scs_printf("primal obj error %4e\n", perr);
116
+ scs_printf("dual obj error %4e\n", derr);
117
+
118
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
119
+
120
+ mu_assert("exp_design: SCS failed to produce outputflag SCS_SOLVED", success);
121
+
122
+ fail = 0;
123
+ // TODO: This test fails because of the complementary slackness check.
124
+ // The complementary slackness tolerance is a bit too tight.
125
+ // fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
126
+ // if (fail)
127
+ // return fail;
128
+
129
+ mu_assert("exp_design: primal feas error: ", ABS(info.res_pri) < 1e-6);
130
+ mu_assert("exp_design: dual feas error: ", ABS(info.res_dual) < 1e-6);
131
+ mu_assert("exp_design: duality gap error: ", ABS(info.gap) < 1e-6);
132
+
133
+ /* kill data */
134
+ scs_free(d->A);
135
+ scs_free(k);
136
+ scs_free(stgs);
137
+ scs_free(d);
138
+ SCS(free_sol)(sol);
139
+
140
+ return fail;
141
+ }
@@ -0,0 +1,275 @@
1
+ #include "glbopts.h"
2
+ #include "linalg.h"
3
+ #include "minunit.h"
4
+ #include "problem_utils.h"
5
+ #include "rw.h"
6
+ #include "scs.h"
7
+ #include "scs_matrix.h"
8
+ #include "util.h"
9
+
10
+ // for SpectralSCS
11
+ static const char *graph_partitioning(void) {
12
+ ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
13
+ ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
14
+ ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
15
+ ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
16
+ ScsInfo info = {0};
17
+ scs_int exitflag;
18
+ scs_float perr, derr;
19
+ scs_int success;
20
+ const char *fail;
21
+
22
+ /* data */
23
+ scs_float Ax[] = {-1., 1., -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.,
24
+ -1., 1., -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.,
25
+ -1., 1., -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.,
26
+ -1., 1., -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.,
27
+ -1., 1., -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.,
28
+ -1., 1., -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.,
29
+ -1., 1., -1., 1., -1., 1., -1., 1., -1.};
30
+ scs_int Ai[] = {1, 0, 2, 0, 42, 0, 81, 0, 119, 0, 156, 0, 192, 0,
31
+ 227, 0, 261, 0, 294, 0, 326, 0, 357, 0, 387, 0, 416, 0,
32
+ 444, 0, 471, 0, 497, 0, 522, 0, 546, 0, 569, 0, 591, 0,
33
+ 612, 0, 632, 0, 651, 0, 669, 0, 686, 0, 702, 0, 717, 0,
34
+ 731, 0, 744, 0, 756, 0, 767, 0, 777, 0, 786, 0, 794, 0,
35
+ 801, 0, 807, 0, 812, 0, 816, 0, 819, 0, 821};
36
+ scs_int Ap[] = {0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25,
37
+ 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53,
38
+ 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81};
39
+
40
+ scs_float b[] = {
41
+ 0., 0., -1., -0., -0., -0.,
42
+ -0., -0., -0., -0., -0., -0.,
43
+ -0., -0., -0., -0., -0., -0.,
44
+ -0., -0., -0., -0., -0., -0.,
45
+ -0., -0., -0., -0., -0., -0.,
46
+ -0., -0., -0., -0., -0., -0.,
47
+ -0., -0., 1.41421356, -0., -0., -0.,
48
+ -1., -0., 1.41421356, -0., -0., -0.,
49
+ -0., -0., -0., -0., -0., -0.,
50
+ -0., -0., -0., -0., -0., -0.,
51
+ -0., -0., -0., -0., -0., -0.,
52
+ -0., -0., -0., -0., -0., -0.,
53
+ -0., -0., -0., -0., -0., -0.,
54
+ -0., -0., -0., -1., -0., -0.,
55
+ -0., -0., -0., -0., -0., -0.,
56
+ -0., -0., -0., -0., -0., -0.,
57
+ -0., -0., -0., -0., -0., -0.,
58
+ -0., -0., -0., -0., -0., -0.,
59
+ -0., -0., -0., -0., -0., -0.,
60
+ -0., -0., -0., 1.41421356, -0., -6.,
61
+ -0., -0., -0., 1.41421356, -0., -0.,
62
+ -0., -0., -0., -0., 1.41421356, 1.41421356,
63
+ -0., -0., -0., -0., -0., -0.,
64
+ 1.41421356, -0., -0., -0., -0., -0.,
65
+ -0., -0., -0., 1.41421356, -0., -0.,
66
+ -0., -0., -0., -0., -0., -0.,
67
+ -2., -0., -0., -0., -0., -0.,
68
+ -0., -0., -0., -0., -0., -0.,
69
+ -0., -0., -0., -0., -0., -0.,
70
+ -0., -0., 1.41421356, -0., -0., 1.41421356,
71
+ -0., -0., -0., -0., -0., -0.,
72
+ -0., -0., -0., -0., -0., -0.,
73
+ -2., -0., 1.41421356, -0., -0., -0.,
74
+ -0., -0., -0., -0., -0., -0.,
75
+ -0., -0., -0., 1.41421356, -0., -0.,
76
+ -0., -0., -0., -0., -0., -0.,
77
+ -0., -0., -0., -0., -0., -0.,
78
+ -0., -0., -0., -0., -0., -3.,
79
+ -0., -0., -0., -0., -0., -0.,
80
+ 1.41421356, -0., -0., -0., -0., -0.,
81
+ -0., -0., -0., -0., -0., -0.,
82
+ -0., -0., -0., -0., -0., -0.,
83
+ -0., -0., -0., -0., -0., 1.41421356,
84
+ 1.41421356, -0., -0., -6., -0., -0.,
85
+ -0., 1.41421356, -0., -0., -0., -0.,
86
+ -0., -0., -0., -0., -0., -0.,
87
+ 1.41421356, -0., -0., -0., -0., -0.,
88
+ -0., 1.41421356, -0., -0., -0., -0.,
89
+ -0., -0., -0., -0., 1.41421356, -0.,
90
+ -1., -0., -0., -0., -0., -0.,
91
+ -0., -0., -0., -0., -0., -0.,
92
+ -0., -0., -0., -0., -0., -0.,
93
+ -0., -0., -0., -0., -0., -0.,
94
+ -0., -0., -0., 1.41421356, -0., -0.,
95
+ -0., -0., -1., -0., -0., -0.,
96
+ -0., -0., -0., -0., -0., -0.,
97
+ -0., -0., -0., -0., -0., -0.,
98
+ -0., -0., -0., 1.41421356, -0., -0.,
99
+ -0., -0., -0., -0., -0., -0.,
100
+ -0., -0., -0., -3., -0., -0.,
101
+ -0., -0., -0., -0., -0., -0.,
102
+ -0., -0., -0., -0., -0., -0.,
103
+ -0., 1.41421356, -0., -0., -0., -0.,
104
+ -0., -0., -0., -0., -0., -0.,
105
+ 1.41421356, -0., 1.41421356, -2., 1.41421356, -0.,
106
+ -0., -0., -0., -0., -0., -0.,
107
+ -0., -0., -0., -0., -0., -0.,
108
+ -0., -0., -0., -0., -0., -0.,
109
+ -0., -0., -0., -0., -0., -0.,
110
+ -0., -0., -3., 1.41421356, -0., -0.,
111
+ -0., -0., -0., -0., -0., -0.,
112
+ -0., -0., -0., -0., -0., -0.,
113
+ -0., 1.41421356, -0., -0., -0., -0.,
114
+ -0., -0., -0., -0., -0., -0.,
115
+ -4., 1.41421356, -0., -0., 1.41421356, -0.,
116
+ -0., -0., -0., -0., -0., -0.,
117
+ -0., -0., -0., -0., -0., -0.,
118
+ -0., -0., -0., -0., -0., -0.,
119
+ -0., -0., -0., -3., -0., -0.,
120
+ -0., -0., -0., -0., -0., -0.,
121
+ -0., -0., -0., 1.41421356, -0., -0.,
122
+ -0., -0., -0., -0., -0., -0.,
123
+ -0., -0., -0., -0., -0., -5.,
124
+ -0., -0., -0., -0., -0., -0.,
125
+ -0., -0., -0., -0., 1.41421356, -0.,
126
+ -0., 1.41421356, -0., -0., -0., -0.,
127
+ -0., -0., 1.41421356, -0., 1.41421356, -0.,
128
+ -2., -0., -0., -0., -0., -0.,
129
+ -0., -0., -0., 1.41421356, -0., 1.41421356,
130
+ -0., -0., -0., -0., -0., -0.,
131
+ -0., -0., -0., -0., -0., -0.,
132
+ -3., -0., -0., -0., -0., -0.,
133
+ -0., -0., -0., -0., -0., -0.,
134
+ -0., -0., -0., -0., 1.41421356, -0.,
135
+ 1.41421356, -0., -0., -0., -0., -0.,
136
+ -0., -0., -0., -0., -0., -0.,
137
+ -0., -0., -0., -0., -0., -0.,
138
+ -0., -0., -0., -0., -0., -0.,
139
+ -0., -0., -0., -2., -0., -0.,
140
+ -0., -0., -0., -0., -0., -0.,
141
+ -0., -0., -0., -0., -0., 1.41421356,
142
+ -0., -0., 1.41421356, -0., -0., -0.,
143
+ -2., -0., -0., -0., -0., -0.,
144
+ -0., -0., -0., -0., -0., -0.,
145
+ -0., 1.41421356, -0., -0., -0., -0.,
146
+ -0., -0., -1., -0., -0., -0.,
147
+ -0., 1.41421356, -0., -0., -0., -0.,
148
+ -0., -0., -0., -0., -0., -0.,
149
+ -0., -0., -0., -2., -0., -0.,
150
+ -0., -0., -0., -0., -0., -0.,
151
+ -0., -0., -0., -0., -0., -0.,
152
+ -0., -0., -0., -2., -0., -0.,
153
+ -0., -0., -0., -0., -0., -0.,
154
+ -0., 1.41421356, -0., -0., 1.41421356, -0.,
155
+ -0., -0., -3., -0., -0., -0.,
156
+ 1.41421356, 1.41421356, -0., -0., -0., -0.,
157
+ -0., -0., -0., -0., -0., -0.,
158
+ -1., -0., -0., -0., -0., -0.,
159
+ -0., -0., -0., -0., -0., -0.,
160
+ -0., -0., -0., -5., -0., -0.,
161
+ -0., -0., -0., 1.41421356, -0., -0.,
162
+ -0., -0., -0., -0., -0., -2.,
163
+ -0., -0., -0., -0., -0., -0.,
164
+ -0., -0., -0., -0., -0., -0.,
165
+ -4., -0., -0., -0., -0., -0.,
166
+ -0., -0., 1.41421356, -0., 1.41421356, -0.,
167
+ -4., -0., -0., -0., -0., -0.,
168
+ -0., -0., -0., -0., -0., -2.,
169
+ -0., -0., -0., -0., 1.41421356, 1.41421356,
170
+ -0., -0., -0., -1., -0., -0.,
171
+ -0., -0., -0., -0., -0., -0.,
172
+ -3., -0., 1.41421356, -0., -0., -0.,
173
+ -0., 1.41421356, -4., -0., -0., -0.,
174
+ -0., -0., -0., -1., -0., -0.,
175
+ -0., -0., -0., -4., -0., -0.,
176
+ -0., 1.41421356, -7., -0., -0., -0.,
177
+ -2., -0., -0., -4., -0., -3.};
178
+ scs_float c[] = {1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
179
+ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
180
+ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
181
+
182
+ scs_int m = 822;
183
+ scs_int n = 41;
184
+
185
+ scs_int z = 1;
186
+ scs_int l = 0;
187
+ scs_int *q = SCS_NULL;
188
+ scs_int qsize = 0;
189
+ scs_int *s = SCS_NULL;
190
+ scs_int ssize = 0;
191
+ scs_int ep = 0;
192
+ scs_int ed = 0;
193
+ scs_float *p = SCS_NULL;
194
+ scs_int psize = 0;
195
+ scs_int *d_array = SCS_NULL;
196
+ scs_int dsize = 0;
197
+ scs_int *nuc_m = SCS_NULL;
198
+ scs_int *nuc_n = SCS_NULL;
199
+ scs_int nucsize = 0;
200
+ scs_int *ell1 = SCS_NULL;
201
+ scs_int ell1_size = 0;
202
+ scs_int sl_n[] = {40};
203
+ scs_int sl_k[] = {3};
204
+ scs_int sl_size = 1;
205
+
206
+ // computed using mosek (the input of Ax is truncated, and mosek solved
207
+ // the problem with the non-truncated data)
208
+ scs_float opt = -0.7736762265822145;
209
+ /* end data */
210
+
211
+ d->m = m;
212
+ d->n = n;
213
+ d->b = b;
214
+ d->c = c;
215
+
216
+ d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
217
+
218
+ d->A->m = m;
219
+ d->A->n = n;
220
+ d->A->x = Ax;
221
+ d->A->i = Ai;
222
+ d->A->p = Ap;
223
+
224
+ k->z = z;
225
+ k->l = l;
226
+ k->q = q;
227
+ k->qsize = qsize;
228
+ k->s = s;
229
+ k->ssize = ssize;
230
+ k->ep = ep;
231
+ k->ed = ed;
232
+ k->p = p;
233
+ k->psize = psize;
234
+ k->d = d_array;
235
+ k->dsize = dsize;
236
+ k->nuc_m = nuc_m;
237
+ k->nuc_n = nuc_n;
238
+ k->nucsize = nucsize;
239
+ k->ell1 = ell1;
240
+ k->ell1_size = ell1_size;
241
+ k->sl_n = sl_n;
242
+ k->sl_k = sl_k;
243
+ k->sl_size = sl_size;
244
+
245
+ scs_set_default_settings(stgs);
246
+ stgs->eps_abs = 1e-7;
247
+ stgs->eps_rel = 1e-7;
248
+ stgs->eps_infeas = 1e-9;
249
+
250
+ exitflag = scs(d, k, stgs, sol, &info);
251
+
252
+ perr = SCS(dot)(d->c, sol->x, d->n) - opt;
253
+ derr = -SCS(dot)(d->b, sol->y, d->m) - opt;
254
+
255
+ scs_printf("primal obj error %4e\n", perr);
256
+ scs_printf("dual obj error %4e\n", derr);
257
+
258
+ success = ABS(perr) < 1e-4 && ABS(derr) < 1e-4 && exitflag == SCS_SOLVED;
259
+
260
+ mu_assert("graph partitioning: SCS failed to produce outputflag SCS_SOLVED",
261
+ success);
262
+
263
+ fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
264
+ if (fail)
265
+ return fail;
266
+
267
+ /* kill data */
268
+ scs_free(d->A);
269
+ scs_free(k);
270
+ scs_free(stgs);
271
+ scs_free(d);
272
+ SCS(free_sol)(sol);
273
+
274
+ return fail;
275
+ }