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
data/vendor/scs/src/rw.c CHANGED
@@ -4,16 +4,20 @@
4
4
  #include <stdio.h>
5
5
  #include <stdlib.h>
6
6
 
7
- #include "amatrix.h"
7
+ #include "linalg.h"
8
8
  #include "scs.h"
9
+ #include "scs_matrix.h"
9
10
  #include "util.h"
10
11
 
11
12
  /* writes/reads problem data to/from filename */
12
13
  /* This is a VERY naive implementation, doesn't care about portability etc */
13
14
 
14
15
  static void write_scs_cone(const ScsCone *k, FILE *fout) {
15
- fwrite(&(k->f), sizeof(scs_int), 1, fout);
16
+ fwrite(&(k->z), sizeof(scs_int), 1, fout);
16
17
  fwrite(&(k->l), sizeof(scs_int), 1, fout);
18
+ fwrite(&(k->bsize), sizeof(scs_int), 1, fout);
19
+ fwrite(k->bl, sizeof(scs_float), MAX(k->bsize - 1, 0), fout);
20
+ fwrite(k->bu, sizeof(scs_float), MAX(k->bsize - 1, 0), fout);
17
21
  fwrite(&(k->qsize), sizeof(scs_int), 1, fout);
18
22
  fwrite(k->q, sizeof(scs_int), k->qsize, fout);
19
23
  fwrite(&(k->ssize), sizeof(scs_int), 1, fout);
@@ -26,18 +30,23 @@ static void write_scs_cone(const ScsCone *k, FILE *fout) {
26
30
 
27
31
  static ScsCone *read_scs_cone(FILE *fin) {
28
32
  ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
29
- fread(&(k->f), sizeof(scs_int), 1, fin);
33
+ fread(&(k->z), sizeof(scs_int), 1, fin);
30
34
  fread(&(k->l), sizeof(scs_int), 1, fin);
35
+ fread(&(k->bsize), sizeof(scs_int), 1, fin);
36
+ k->bl = (scs_float *)scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
37
+ k->bu = (scs_float *)scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
38
+ fread(k->bl, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
39
+ fread(k->bu, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
31
40
  fread(&(k->qsize), sizeof(scs_int), 1, fin);
32
- k->q = scs_calloc(k->qsize, sizeof(scs_int));
41
+ k->q = (scs_int *)scs_calloc(k->qsize, sizeof(scs_int));
33
42
  fread(k->q, sizeof(scs_int), k->qsize, fin);
34
43
  fread(&(k->ssize), sizeof(scs_int), 1, fin);
35
- k->s = scs_calloc(k->ssize, sizeof(scs_int));
44
+ k->s = (scs_int *)scs_calloc(k->ssize, sizeof(scs_int));
36
45
  fread(k->s, sizeof(scs_int), k->ssize, fin);
37
46
  fread(&(k->ep), sizeof(scs_int), 1, fin);
38
47
  fread(&(k->ed), sizeof(scs_int), 1, fin);
39
48
  fread(&(k->psize), sizeof(scs_int), 1, fin);
40
- k->p = scs_calloc(k->psize, sizeof(scs_int));
49
+ k->p = (scs_float *)scs_calloc(k->psize, sizeof(scs_float));
41
50
  fread(k->p, sizeof(scs_float), k->psize, fin);
42
51
  return k;
43
52
  }
@@ -49,13 +58,17 @@ static void write_scs_stgs(const ScsSettings *s, FILE *fout) {
49
58
  fwrite(&(s->scale), sizeof(scs_float), 1, fout);
50
59
  fwrite(&(s->rho_x), sizeof(scs_float), 1, fout);
51
60
  fwrite(&(s->max_iters), sizeof(scs_int), 1, fout);
52
- fwrite(&(s->eps), sizeof(scs_float), 1, fout);
61
+ fwrite(&(s->eps_abs), sizeof(scs_float), 1, fout);
62
+ fwrite(&(s->eps_rel), sizeof(scs_float), 1, fout);
63
+ fwrite(&(s->eps_infeas), sizeof(scs_float), 1, fout);
53
64
  fwrite(&(s->alpha), sizeof(scs_float), 1, fout);
54
- fwrite(&(s->cg_rate), sizeof(scs_float), 1, fout);
55
65
  fwrite(&(s->verbose), sizeof(scs_int), 1, fout);
56
66
  fwrite(&warm_start, sizeof(scs_int), 1, fout);
57
67
  fwrite(&(s->acceleration_lookback), sizeof(scs_int), 1, fout);
68
+ fwrite(&(s->acceleration_interval), sizeof(scs_int), 1, fout);
69
+ fwrite(&(s->adaptive_scale), sizeof(scs_int), 1, fout);
58
70
  /* Do not write the write_data_filename */
71
+ /* Do not write the log_csv_filename */
59
72
  }
60
73
 
61
74
  static ScsSettings *read_scs_stgs(FILE *fin) {
@@ -64,12 +77,15 @@ static ScsSettings *read_scs_stgs(FILE *fin) {
64
77
  fread(&(s->scale), sizeof(scs_float), 1, fin);
65
78
  fread(&(s->rho_x), sizeof(scs_float), 1, fin);
66
79
  fread(&(s->max_iters), sizeof(scs_int), 1, fin);
67
- fread(&(s->eps), sizeof(scs_float), 1, fin);
80
+ fread(&(s->eps_abs), sizeof(scs_float), 1, fin);
81
+ fread(&(s->eps_rel), sizeof(scs_float), 1, fin);
82
+ fread(&(s->eps_infeas), sizeof(scs_float), 1, fin);
68
83
  fread(&(s->alpha), sizeof(scs_float), 1, fin);
69
- fread(&(s->cg_rate), sizeof(scs_float), 1, fin);
70
84
  fread(&(s->verbose), sizeof(scs_int), 1, fin);
71
85
  fread(&(s->warm_start), sizeof(scs_int), 1, fin);
72
86
  fread(&(s->acceleration_lookback), sizeof(scs_int), 1, fin);
87
+ fread(&(s->acceleration_interval), sizeof(scs_int), 1, fin);
88
+ fread(&(s->adaptive_scale), sizeof(scs_int), 1, fin);
73
89
  return s;
74
90
  }
75
91
 
@@ -87,53 +103,70 @@ static ScsMatrix *read_amatrix(FILE *fin) {
87
103
  ScsMatrix *A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
88
104
  fread(&(A->m), sizeof(scs_int), 1, fin);
89
105
  fread(&(A->n), sizeof(scs_int), 1, fin);
90
- A->p = scs_calloc(A->n + 1, sizeof(scs_int));
106
+ A->p = (scs_int *)scs_calloc(A->n + 1, sizeof(scs_int));
91
107
  fread(A->p, sizeof(scs_int), A->n + 1, fin);
92
108
  Anz = A->p[A->n];
93
- A->x = scs_calloc(Anz, sizeof(scs_float));
94
- A->i = scs_calloc(Anz, sizeof(scs_int));
109
+ A->x = (scs_float *)scs_calloc(Anz, sizeof(scs_float));
110
+ A->i = (scs_int *)scs_calloc(Anz, sizeof(scs_int));
95
111
  fread(A->x, sizeof(scs_float), Anz, fin);
96
112
  fread(A->i, sizeof(scs_int), Anz, fin);
97
113
  return A;
98
114
  }
99
115
 
100
116
  static void write_scs_data(const ScsData *d, FILE *fout) {
117
+ scs_int has_p = d->P ? 1 : 0;
101
118
  fwrite(&(d->m), sizeof(scs_int), 1, fout);
102
119
  fwrite(&(d->n), sizeof(scs_int), 1, fout);
103
120
  fwrite(d->b, sizeof(scs_float), d->m, fout);
104
121
  fwrite(d->c, sizeof(scs_float), d->n, fout);
105
- write_scs_stgs(d->stgs, fout);
106
122
  write_amatrix(d->A, fout);
123
+ /* write has P bit */
124
+ fwrite(&has_p, sizeof(scs_int), 1, fout);
125
+ if (d->P) {
126
+ write_amatrix(d->P, fout);
127
+ }
107
128
  }
108
129
 
109
130
  static ScsData *read_scs_data(FILE *fin) {
131
+ scs_int has_p = 0;
110
132
  ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
111
133
  fread(&(d->m), sizeof(scs_int), 1, fin);
112
134
  fread(&(d->n), sizeof(scs_int), 1, fin);
113
- d->b = scs_calloc(d->m, sizeof(scs_float));
114
- d->c = scs_calloc(d->n, sizeof(scs_float));
135
+ d->b = (scs_float *)scs_calloc(d->m, sizeof(scs_float));
136
+ d->c = (scs_float *)scs_calloc(d->n, sizeof(scs_float));
115
137
  fread(d->b, sizeof(scs_float), d->m, fin);
116
138
  fread(d->c, sizeof(scs_float), d->n, fin);
117
- d->stgs = read_scs_stgs(fin);
118
139
  d->A = read_amatrix(fin);
140
+ /* If has_p bit is not set or this hits end of file then has_p = 0 */
141
+ has_p &= fread(&has_p, sizeof(scs_int), 1, fin);
142
+ d->P = has_p ? read_amatrix(fin) : SCS_NULL;
119
143
  return d;
120
144
  }
121
145
 
122
- void SCS(write_data)(const ScsData *d, const ScsCone *k) {
123
- FILE *fout = fopen(d->stgs->write_data_filename, "wb");
146
+ void SCS(write_data)(const ScsData *d, const ScsCone *k,
147
+ const ScsSettings *stgs) {
148
+ FILE *fout = fopen(stgs->write_data_filename, "wb");
124
149
  uint32_t scs_int_sz = (uint32_t)sizeof(scs_int);
125
150
  uint32_t scs_float_sz = (uint32_t)sizeof(scs_float);
126
- scs_printf("writing data to %s\n", d->stgs->write_data_filename);
151
+ const char *scs_version = SCS_VERSION;
152
+ uint32_t scs_version_sz = (uint32_t)strlen(scs_version);
153
+ scs_printf("writing data to %s\n", stgs->write_data_filename);
127
154
  fwrite(&(scs_int_sz), sizeof(uint32_t), 1, fout);
128
155
  fwrite(&(scs_float_sz), sizeof(uint32_t), 1, fout);
156
+ fwrite(&(scs_version_sz), sizeof(uint32_t), 1, fout);
157
+ fwrite(scs_version, 1, scs_version_sz, fout);
129
158
  write_scs_cone(k, fout);
130
159
  write_scs_data(d, fout);
160
+ write_scs_stgs(stgs, fout);
131
161
  fclose(fout);
132
162
  }
133
163
 
134
- scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k) {
164
+ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
165
+ ScsSettings **stgs) {
135
166
  uint32_t file_int_sz;
136
167
  uint32_t file_float_sz;
168
+ uint32_t file_version_sz;
169
+ char file_version[16];
137
170
  FILE *fin = fopen(filename, "rb");
138
171
  if (!fin) {
139
172
  scs_printf("Error reading file %s\n", filename);
@@ -142,26 +175,168 @@ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k) {
142
175
  scs_printf("Reading data from %s\n", filename);
143
176
  fread(&(file_int_sz), sizeof(uint32_t), 1, fin);
144
177
  fread(&(file_float_sz), sizeof(uint32_t), 1, fin);
145
-
146
178
  if (file_int_sz != (uint32_t)sizeof(scs_int)) {
147
179
  scs_printf(
148
- "Error, sizeof(file int) is %lu, but scs expects sizeof(int) "
149
- "%lu, scs should be recompiled with correct flags.\n",
180
+ "Error, sizeof(file int) is %lu, but scs expects sizeof(int) %lu, "
181
+ "scs should be recompiled with correct flags.\n",
150
182
  (unsigned long)file_int_sz, (unsigned long)sizeof(scs_int));
151
183
  fclose(fin);
152
184
  return -1;
153
185
  }
154
186
  if (file_float_sz != (uint32_t)sizeof(scs_float)) {
155
187
  scs_printf(
156
- "Error, sizeof(file float) is %lu, but scs expects "
157
- "sizeof(float) %lu, scs should be recompiled with the correct flags.\n",
188
+ "Error, sizeof(file float) is %lu, but scs expects sizeof(float) %lu, "
189
+ "scs should be recompiled with the correct flags.\n",
158
190
  (unsigned long)file_float_sz, (unsigned long)sizeof(scs_float));
159
191
  fclose(fin);
160
192
  return -1;
161
193
  }
162
-
194
+ fread(&(file_version_sz), sizeof(uint32_t), 1, fin);
195
+ fread(file_version, 1, file_version_sz, fin);
196
+ file_version[file_version_sz] = '\0';
197
+ if (strcmp(file_version, SCS_VERSION) != 0) {
198
+ scs_printf("************************************************************\n"
199
+ "Warning: SCS file version %s, this is SCS version %s.\n"
200
+ "The file reading / writing logic might have changed.\n"
201
+ "************************************************************\n",
202
+ file_version, SCS_VERSION);
203
+ }
163
204
  *k = read_scs_cone(fin);
164
205
  *d = read_scs_data(fin);
206
+ *stgs = read_scs_stgs(fin);
165
207
  fclose(fin);
166
208
  return 0;
167
209
  }
210
+
211
+ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
212
+ const ScsSettings *stgs, const ScsWork *w,
213
+ scs_int iter, SCS(timer) * solve_timer) {
214
+ ScsResiduals *r = w->r_orig;
215
+ ScsResiduals *r_n = w->r_normalized;
216
+ ScsSolution *sol = w->xys_orig;
217
+ ScsSolution *sol_n = w->xys_normalized;
218
+ /* if iter 0 open to write, else open to append */
219
+ FILE *fout = fopen(stgs->log_csv_filename, iter == 0 ? "w" : "a");
220
+ if (!fout) {
221
+ scs_printf("Error: Could not open %s for writing\n",
222
+ stgs->log_csv_filename);
223
+ return;
224
+ }
225
+ scs_int l = w->m + w->n + 1;
226
+ if (iter == 0) {
227
+ /* need to end in comma so that csv parsing is correct */
228
+ fprintf(fout, "iter,"
229
+ "res_pri,"
230
+ "res_dual,"
231
+ "gap,"
232
+ "x_nrm_inf,"
233
+ "y_nrm_inf,"
234
+ "s_nrm_inf,"
235
+ "x_nrm_2,"
236
+ "y_nrm_2,"
237
+ "s_nrm_2,"
238
+ "x_nrm_inf_normalized,"
239
+ "y_nrm_inf_normalized,"
240
+ "s_nrm_inf_normalized,"
241
+ "x_nrm_2_normalized,"
242
+ "y_nrm_2_normalized,"
243
+ "s_nrm_2_normalized,"
244
+ "ax_s_btau_nrm_inf,"
245
+ "px_aty_ctau_nrm_inf,"
246
+ "ax_s_btau_nrm_2,"
247
+ "px_aty_ctau_nrm_2,"
248
+ "res_infeas,"
249
+ "res_unbdd_a,"
250
+ "res_unbdd_p,"
251
+ "pobj,"
252
+ "dobj,"
253
+ "tau,"
254
+ "kap,"
255
+ "res_pri_normalized,"
256
+ "res_dual_normalized,"
257
+ "gap_normalized,"
258
+ "ax_s_btau_nrm_inf_normalized,"
259
+ "px_aty_ctau_nrm_inf_normalized,"
260
+ "ax_s_btau_nrm_2_normalized,"
261
+ "px_aty_ctau_nrm_2_normalized,"
262
+ "res_infeas_normalized,"
263
+ "res_unbdd_a_normalized,"
264
+ "res_unbdd_p_normalized,"
265
+ "pobj_normalized,"
266
+ "dobj_normalized,"
267
+ "tau_normalized,"
268
+ "kap_normalized,"
269
+ "ax_nrm_inf,"
270
+ "px_nrm_inf,"
271
+ "aty_nrm_inf,"
272
+ "b_nrm_inf,"
273
+ "c_nrm_inf,"
274
+ "scale,"
275
+ "diff_u_ut_nrm_2,"
276
+ "diff_v_v_prev_nrm_2,"
277
+ "diff_u_ut_nrm_inf,"
278
+ "diff_v_v_prev_nrm_inf,"
279
+ "aa_norm,"
280
+ "accepted_accel_steps,"
281
+ "rejected_accel_steps,"
282
+ "time,"
283
+ "\n");
284
+ }
285
+ fprintf(fout, "%li,", (long)iter);
286
+ fprintf(fout, "%.16e,", r->res_pri);
287
+ fprintf(fout, "%.16e,", r->res_dual);
288
+ fprintf(fout, "%.16e,", r->gap);
289
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->x, w->n));
290
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->y, w->m));
291
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->s, w->m));
292
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->x, w->n));
293
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->y, w->m));
294
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->s, w->m));
295
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->x, w->n));
296
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->y, w->m));
297
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->s, w->m));
298
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->x, w->n));
299
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->y, w->m));
300
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->s, w->m));
301
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax_s_btau, w->m));
302
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->px_aty_ctau, w->n));
303
+ fprintf(fout, "%.16e,", SCS(norm_2)(r->ax_s_btau, w->m));
304
+ fprintf(fout, "%.16e,", SCS(norm_2)(r->px_aty_ctau, w->n));
305
+ fprintf(fout, "%.16e,", r->res_infeas);
306
+ fprintf(fout, "%.16e,", r->res_unbdd_a);
307
+ fprintf(fout, "%.16e,", r->res_unbdd_p);
308
+ fprintf(fout, "%.16e,", r->pobj);
309
+ fprintf(fout, "%.16e,", r->dobj);
310
+ fprintf(fout, "%.16e,", r->tau);
311
+ fprintf(fout, "%.16e,", r->kap);
312
+ fprintf(fout, "%.16e,", r_n->res_pri);
313
+ fprintf(fout, "%.16e,", r_n->res_dual);
314
+ fprintf(fout, "%.16e,", r_n->gap);
315
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->ax_s_btau, w->m));
316
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->px_aty_ctau, w->n));
317
+ fprintf(fout, "%.16e,", SCS(norm_2)(r_n->ax_s_btau, w->m));
318
+ fprintf(fout, "%.16e,", SCS(norm_2)(r_n->px_aty_ctau, w->n));
319
+ fprintf(fout, "%.16e,", r_n->res_infeas);
320
+ fprintf(fout, "%.16e,", r_n->res_unbdd_a);
321
+ fprintf(fout, "%.16e,", r_n->res_unbdd_p);
322
+ fprintf(fout, "%.16e,", r_n->pobj);
323
+ fprintf(fout, "%.16e,", r_n->dobj);
324
+ fprintf(fout, "%.16e,", r_n->tau);
325
+ fprintf(fout, "%.16e,", r_n->kap);
326
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax, w->m));
327
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->px, w->n));
328
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->aty, w->n));
329
+ fprintf(fout, "%.16e,", SCS(norm_inf)(w->b_orig, w->m));
330
+ fprintf(fout, "%.16e,", SCS(norm_inf)(w->c_orig, w->n));
331
+ fprintf(fout, "%.16e,", w->scale);
332
+ fprintf(fout, "%.16e,", SCS(norm_diff)(w->u, w->u_t, l));
333
+ fprintf(fout, "%.16e,", SCS(norm_diff)(w->v, w->v_prev, l));
334
+ fprintf(fout, "%.16e,", SCS(norm_inf_diff)(w->u, w->u_t, l));
335
+ fprintf(fout, "%.16e,", SCS(norm_inf_diff)(w->v, w->v_prev, l));
336
+ fprintf(fout, "%.16e,", w->aa_norm);
337
+ fprintf(fout, "%li,", (long)w->accepted_accel_steps);
338
+ fprintf(fout, "%li,", (long)w->rejected_accel_steps);
339
+ fprintf(fout, "%.16e,", SCS(tocq)(solve_timer) / 1e3);
340
+ fprintf(fout, "\n");
341
+ fclose(fout);
342
+ }