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 /* test degenerate cones */
degenerate(void)9 static const char *degenerate(void) {
10   ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
11   ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
12   ScsSettings *stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
13   ScsSolution *sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
14   ScsInfo info = {0};
15   scs_int exitflag, success;
16   scs_float tpobj, tdobj, perr, derr;
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., -1., 2., -0.5};
29   scs_float c[] = {1., 2.};
30 
31   scs_int m = 4;
32   scs_int n = 2;
33 
34   /* used later: */
35   scs_int sq[] = {1};
36 
37   /* end data */
38 
39   d->m = m;
40   d->n = n;
41   d->b = b;
42   d->c = c;
43 
44   d->A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
45   d->P = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
46 
47   d->A->m = m;
48   d->A->n = n;
49 
50   d->A->x = Ax;
51   d->A->i = Ai;
52   d->A->p = Ap;
53 
54   d->P->m = n;
55   d->P->n = n;
56 
57   d->P->x = Px;
58   d->P->i = Pi;
59   d->P->p = Pp;
60 
61   SCS(set_default_settings)(stgs);
62   stgs->eps_abs = 1e-6;
63   stgs->eps_rel = 1e-6;
64   stgs->eps_infeas = 1e-9;
65 
66   /* positive orthants */
67   k->l = 4;
68   exitflag = scs(d, k, stgs, sol, &info);
69   fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
70   if (fail) {
71     return fail;
72   }
73   mu_assert("bsize: SCS failed to produce outputflag SCS_SOLVED",
74             exitflag == SCS_SOLVED);
75 
76   tpobj = info.pobj;
77   tdobj = info.dobj;
78 
79   /* degenerate box cone */
80   k->bsize = 1;
81   k->l = 3;
82   exitflag = scs(d, k, stgs, sol, &info);
83   fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
84   if (fail) {
85     return fail;
86   }
87   perr = info.pobj - tpobj;
88   derr = info.dobj - tdobj;
89   success = ABS(perr) < 1e-8 && ABS(derr) < 1e-8 && exitflag == SCS_SOLVED;
90   mu_assert("degenerate box cone failure", success);
91 
92   /* degenerate SOC cone */
93   k->bsize = 0;
94   k->q = sq;
95   k->qsize = 1;
96   k->l = 3;
97   exitflag = scs(d, k, stgs, sol, &info);
98   fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
99   if (fail) {
100     return fail;
101   }
102   perr = info.pobj - tpobj;
103   derr = info.dobj - tdobj;
104   success = ABS(perr) < 1e-8 && ABS(derr) < 1e-8 && exitflag == SCS_SOLVED;
105   mu_assert("degenerate SOC cone failure", success);
106 
107   /* degenerate PSD cone */
108   k->q = 0;
109   k->qsize = 0;
110   k->s = sq;
111   k->ssize = 1;
112   k->l = 3;
113   exitflag = scs(d, k, stgs, sol, &info);
114   fail = verify_solution_correct(d, k, stgs, &info, sol, exitflag);
115   if (fail) {
116     return fail;
117   }
118   perr = info.pobj - tpobj;
119   derr = info.dobj - tdobj;
120   success = ABS(perr) < 1e-8 && ABS(derr) < 1e-8 && exitflag == SCS_SOLVED;
121   mu_assert("degenerate PSD cone failure", success);
122 
123   SCS(free_sol)(sol);
124   scs_free(d->A);
125   scs_free(d->P);
126   scs_free(k);
127   scs_free(stgs);
128   scs_free(d);
129   return fail;
130 }
131