scs 0.3.2 → 0.4.1

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +35 -6
  5. data/lib/scs/matrix.rb +72 -0
  6. data/lib/scs/solver.rb +19 -26
  7. data/lib/scs/version.rb +1 -1
  8. data/lib/scs.rb +1 -0
  9. data/vendor/scs/CITATION.cff +2 -2
  10. data/vendor/scs/CMakeLists.txt +285 -169
  11. data/vendor/scs/Makefile +43 -18
  12. data/vendor/scs/README.md +3 -1
  13. data/vendor/scs/include/cones.h +5 -3
  14. data/vendor/scs/include/glbopts.h +35 -17
  15. data/vendor/scs/include/linsys.h +8 -8
  16. data/vendor/scs/include/normalize.h +1 -0
  17. data/vendor/scs/include/rw.h +3 -3
  18. data/vendor/scs/include/scs.h +51 -24
  19. data/vendor/scs/include/scs_types.h +3 -1
  20. data/vendor/scs/include/scs_work.h +13 -15
  21. data/vendor/scs/include/util.h +4 -2
  22. data/vendor/scs/linsys/cpu/direct/private.c +32 -153
  23. data/vendor/scs/linsys/cpu/direct/private.h +6 -6
  24. data/vendor/scs/linsys/cpu/indirect/private.c +9 -22
  25. data/vendor/scs/linsys/cpu/indirect/private.h +4 -2
  26. data/vendor/scs/linsys/csparse.c +140 -12
  27. data/vendor/scs/linsys/csparse.h +10 -17
  28. data/vendor/scs/linsys/external/amd/LICENSE.txt +0 -897
  29. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +4 -2
  30. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +0 -5
  31. data/vendor/scs/linsys/gpu/gpu.c +4 -4
  32. data/vendor/scs/linsys/gpu/gpu.h +1 -1
  33. data/vendor/scs/linsys/gpu/indirect/private.c +15 -26
  34. data/vendor/scs/linsys/mkl/direct/private.c +182 -0
  35. data/vendor/scs/linsys/mkl/direct/private.h +38 -0
  36. data/vendor/scs/linsys/scs_matrix.c +49 -72
  37. data/vendor/scs/linsys/scs_matrix.h +4 -3
  38. data/vendor/scs/scs.mk +39 -30
  39. data/vendor/scs/src/aa.c +0 -4
  40. data/vendor/scs/src/cones.c +78 -184
  41. data/vendor/scs/src/exp_cone.c +399 -0
  42. data/vendor/scs/src/normalize.c +51 -0
  43. data/vendor/scs/src/rw.c +139 -76
  44. data/vendor/scs/src/scs.c +275 -202
  45. data/vendor/scs/src/util.c +36 -13
  46. data/vendor/scs/test/minunit.h +2 -1
  47. data/vendor/scs/test/problem_utils.h +5 -4
  48. data/vendor/scs/test/problems/degenerate.h +1 -0
  49. data/vendor/scs/test/problems/hs21_tiny_qp.h +2 -1
  50. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +13 -4
  51. data/vendor/scs/test/problems/infeasible_tiny_qp.h +1 -0
  52. data/vendor/scs/test/problems/max_ent +0 -0
  53. data/vendor/scs/test/problems/max_ent.h +8 -0
  54. data/vendor/scs/test/problems/qafiro_tiny_qp.h +2 -1
  55. data/vendor/scs/test/problems/random_prob.h +2 -39
  56. data/vendor/scs/test/problems/rob_gauss_cov_est.h +15 -3
  57. data/vendor/scs/test/problems/small_lp.h +4 -1
  58. data/vendor/scs/test/problems/small_qp.h +42 -7
  59. data/vendor/scs/test/problems/test_exp_cone.h +84 -0
  60. data/vendor/scs/test/problems/test_prob_from_data_file.h +57 -0
  61. data/vendor/scs/test/problems/test_validation.h +4 -1
  62. data/vendor/scs/test/problems/unbounded_tiny_qp.h +3 -3
  63. data/vendor/scs/test/random_socp_prob.c +3 -1
  64. data/vendor/scs/test/run_from_file.c +22 -4
  65. data/vendor/scs/test/run_tests.c +22 -9
  66. metadata +12 -4
data/vendor/scs/src/rw.c CHANGED
@@ -1,5 +1,6 @@
1
1
  #include "rw.h"
2
2
 
3
+ #include <errno.h>
3
4
  #include <stdint.h>
4
5
  #include <stdio.h>
5
6
  #include <stdlib.h>
@@ -9,6 +10,25 @@
9
10
  #include "scs_matrix.h"
10
11
  #include "util.h"
11
12
 
13
+ #if NO_READ_WRITE > 0 /* Disables all read / write functionality */
14
+
15
+ void SCS(write_data)(const ScsData *d, const ScsCone *k,
16
+ const ScsSettings *stgs) {
17
+ /* Do nothing */
18
+ }
19
+ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
20
+ ScsSettings **stgs) {
21
+ /* Failure */
22
+ return -1;
23
+ }
24
+ void SCS(log_data_to_csv)(const ScsCone *k, const ScsSettings *stgs,
25
+ const ScsWork *w, scs_int iter,
26
+ SCS(timer) * solve_timer) {
27
+ /* Do nothing */
28
+ }
29
+
30
+ #else
31
+
12
32
  /* writes/reads problem data to/from filename */
13
33
  /* This is a VERY naive implementation, doesn't care about portability etc */
14
34
 
@@ -28,26 +48,65 @@ static void write_scs_cone(const ScsCone *k, FILE *fout) {
28
48
  fwrite(k->p, sizeof(scs_float), k->psize, fout);
29
49
  }
30
50
 
31
- static ScsCone *read_scs_cone(FILE *fin) {
51
+ /*
52
+ * Read integer data from file. If the integer width on file is
53
+ * different to scs_int then it will cast the ints after reading
54
+ * to be compatible with the SCS data types.
55
+ */
56
+ static size_t read_int(scs_int *dest, size_t file_int_sz, size_t nitems,
57
+ FILE *fin) {
58
+ if (file_int_sz == sizeof(scs_int)) {
59
+ return fread(dest, sizeof(scs_int), nitems, fin);
60
+ }
61
+ void *ptr = scs_calloc(nitems, file_int_sz);
62
+ size_t val = fread(ptr, file_int_sz, nitems, fin);
63
+ scs_int i;
64
+ switch (file_int_sz) {
65
+ case 4:
66
+ for (i = 0; i < nitems; ++i) {
67
+ dest[i] = (scs_int)(((int *)ptr)[i]);
68
+ }
69
+ break;
70
+ case 8:
71
+ for (i = 0; i < nitems; ++i) {
72
+ dest[i] = (scs_int)(((long long *)ptr)[i]);
73
+ }
74
+ break;
75
+ }
76
+ if (ptr) {
77
+ scs_free(ptr);
78
+ }
79
+ return val;
80
+ }
81
+
82
+ static ScsCone *read_scs_cone(FILE *fin, size_t file_int_sz) {
32
83
  ScsCone *k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
33
- fread(&(k->z), sizeof(scs_int), 1, fin);
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);
40
- fread(&(k->qsize), sizeof(scs_int), 1, fin);
41
- k->q = (scs_int *)scs_calloc(k->qsize, sizeof(scs_int));
42
- fread(k->q, sizeof(scs_int), k->qsize, fin);
43
- fread(&(k->ssize), sizeof(scs_int), 1, fin);
44
- k->s = (scs_int *)scs_calloc(k->ssize, sizeof(scs_int));
45
- fread(k->s, sizeof(scs_int), k->ssize, fin);
46
- fread(&(k->ep), sizeof(scs_int), 1, fin);
47
- fread(&(k->ed), sizeof(scs_int), 1, fin);
48
- fread(&(k->psize), sizeof(scs_int), 1, fin);
49
- k->p = (scs_float *)scs_calloc(k->psize, sizeof(scs_float));
50
- fread(k->p, sizeof(scs_float), k->psize, fin);
84
+ read_int(&(k->z), file_int_sz, 1, fin);
85
+ read_int(&(k->l), file_int_sz, 1, fin);
86
+ read_int(&(k->bsize), file_int_sz, 1, fin);
87
+ if (k->bsize > 1) {
88
+ k->bl = (scs_float *)scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
89
+ k->bu = (scs_float *)scs_calloc(MAX(k->bsize - 1, 0), sizeof(scs_float));
90
+ fread(k->bl, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
91
+ fread(k->bu, sizeof(scs_float), MAX(k->bsize - 1, 0), fin);
92
+ }
93
+ read_int(&(k->qsize), file_int_sz, 1, fin);
94
+ if (k->qsize) {
95
+ k->q = (scs_int *)scs_calloc(k->qsize, sizeof(scs_int));
96
+ read_int(k->q, file_int_sz, k->qsize, fin);
97
+ }
98
+ read_int(&(k->ssize), file_int_sz, 1, fin);
99
+ if (k->ssize) {
100
+ k->s = (scs_int *)scs_calloc(k->ssize, sizeof(scs_int));
101
+ read_int(k->s, file_int_sz, k->ssize, fin);
102
+ }
103
+ read_int(&(k->ep), file_int_sz, 1, fin);
104
+ read_int(&(k->ed), file_int_sz, 1, fin);
105
+ read_int(&(k->psize), file_int_sz, 1, fin);
106
+ if (k->psize) {
107
+ k->p = (scs_float *)scs_calloc(k->psize, sizeof(scs_float));
108
+ fread(k->p, sizeof(scs_float), k->psize, fin);
109
+ }
51
110
  return k;
52
111
  }
53
112
 
@@ -71,21 +130,21 @@ static void write_scs_stgs(const ScsSettings *s, FILE *fout) {
71
130
  /* Do not write the log_csv_filename */
72
131
  }
73
132
 
74
- static ScsSettings *read_scs_stgs(FILE *fin) {
133
+ static ScsSettings *read_scs_stgs(FILE *fin, size_t file_int_sz) {
75
134
  ScsSettings *s = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
76
- fread(&(s->normalize), sizeof(scs_int), 1, fin);
135
+ read_int(&(s->normalize), file_int_sz, 1, fin);
77
136
  fread(&(s->scale), sizeof(scs_float), 1, fin);
78
137
  fread(&(s->rho_x), sizeof(scs_float), 1, fin);
79
- fread(&(s->max_iters), sizeof(scs_int), 1, fin);
138
+ read_int(&(s->max_iters), file_int_sz, 1, fin);
80
139
  fread(&(s->eps_abs), sizeof(scs_float), 1, fin);
81
140
  fread(&(s->eps_rel), sizeof(scs_float), 1, fin);
82
141
  fread(&(s->eps_infeas), sizeof(scs_float), 1, fin);
83
142
  fread(&(s->alpha), sizeof(scs_float), 1, fin);
84
- fread(&(s->verbose), sizeof(scs_int), 1, fin);
85
- fread(&(s->warm_start), sizeof(scs_int), 1, fin);
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);
143
+ read_int(&(s->verbose), file_int_sz, 1, fin);
144
+ read_int(&(s->warm_start), file_int_sz, 1, fin);
145
+ read_int(&(s->acceleration_lookback), file_int_sz, 1, fin);
146
+ read_int(&(s->acceleration_interval), file_int_sz, 1, fin);
147
+ read_int(&(s->adaptive_scale), file_int_sz, 1, fin);
89
148
  return s;
90
149
  }
91
150
 
@@ -98,18 +157,18 @@ static void write_amatrix(const ScsMatrix *A, FILE *fout) {
98
157
  fwrite(A->i, sizeof(scs_int), Anz, fout);
99
158
  }
100
159
 
101
- static ScsMatrix *read_amatrix(FILE *fin) {
160
+ static ScsMatrix *read_amatrix(FILE *fin, size_t file_int_sz) {
102
161
  scs_int Anz;
103
162
  ScsMatrix *A = (ScsMatrix *)scs_calloc(1, sizeof(ScsMatrix));
104
- fread(&(A->m), sizeof(scs_int), 1, fin);
105
- fread(&(A->n), sizeof(scs_int), 1, fin);
163
+ read_int(&(A->m), file_int_sz, 1, fin);
164
+ read_int(&(A->n), file_int_sz, 1, fin);
106
165
  A->p = (scs_int *)scs_calloc(A->n + 1, sizeof(scs_int));
107
- fread(A->p, sizeof(scs_int), A->n + 1, fin);
166
+ read_int(A->p, file_int_sz, A->n + 1, fin);
108
167
  Anz = A->p[A->n];
109
168
  A->x = (scs_float *)scs_calloc(Anz, sizeof(scs_float));
110
169
  A->i = (scs_int *)scs_calloc(Anz, sizeof(scs_int));
111
170
  fread(A->x, sizeof(scs_float), Anz, fin);
112
- fread(A->i, sizeof(scs_int), Anz, fin);
171
+ read_int(A->i, file_int_sz, Anz, fin);
113
172
  return A;
114
173
  }
115
174
 
@@ -127,19 +186,20 @@ static void write_scs_data(const ScsData *d, FILE *fout) {
127
186
  }
128
187
  }
129
188
 
130
- static ScsData *read_scs_data(FILE *fin) {
189
+ static ScsData *read_scs_data(FILE *fin, size_t file_int_sz) {
131
190
  scs_int has_p = 0;
132
191
  ScsData *d = (ScsData *)scs_calloc(1, sizeof(ScsData));
133
- fread(&(d->m), sizeof(scs_int), 1, fin);
134
- fread(&(d->n), sizeof(scs_int), 1, fin);
192
+
193
+ read_int(&(d->m), file_int_sz, 1, fin);
194
+ read_int(&(d->n), file_int_sz, 1, fin);
135
195
  d->b = (scs_float *)scs_calloc(d->m, sizeof(scs_float));
136
196
  d->c = (scs_float *)scs_calloc(d->n, sizeof(scs_float));
137
197
  fread(d->b, sizeof(scs_float), d->m, fin);
138
198
  fread(d->c, sizeof(scs_float), d->n, fin);
139
- d->A = read_amatrix(fin);
199
+ d->A = read_amatrix(fin, file_int_sz);
140
200
  /* 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;
201
+ has_p &= read_int(&has_p, file_int_sz, 1, fin);
202
+ d->P = has_p ? read_amatrix(fin, file_int_sz) : SCS_NULL;
143
203
  return d;
144
204
  }
145
205
 
@@ -150,7 +210,6 @@ void SCS(write_data)(const ScsData *d, const ScsCone *k,
150
210
  uint32_t scs_float_sz = (uint32_t)sizeof(scs_float);
151
211
  const char *scs_version = SCS_VERSION;
152
212
  uint32_t scs_version_sz = (uint32_t)strlen(scs_version);
153
- scs_printf("writing data to %s\n", stgs->write_data_filename);
154
213
  fwrite(&(scs_int_sz), sizeof(uint32_t), 1, fout);
155
214
  fwrite(&(scs_float_sz), sizeof(uint32_t), 1, fout);
156
215
  fwrite(&(scs_version_sz), sizeof(uint32_t), 1, fout);
@@ -167,9 +226,11 @@ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
167
226
  uint32_t file_float_sz;
168
227
  uint32_t file_version_sz;
169
228
  char file_version[16];
229
+ errno = 0;
170
230
  FILE *fin = fopen(filename, "rb");
171
231
  if (!fin) {
172
232
  scs_printf("Error reading file %s\n", filename);
233
+ scs_printf("errno:%i:%s\n", errno, strerror(errno));
173
234
  return -1;
174
235
  }
175
236
  scs_printf("Reading data from %s\n", filename);
@@ -177,11 +238,10 @@ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
177
238
  fread(&(file_float_sz), sizeof(uint32_t), 1, fin);
178
239
  if (file_int_sz != (uint32_t)sizeof(scs_int)) {
179
240
  scs_printf(
180
- "Error, sizeof(file int) is %lu, but scs expects sizeof(int) %lu, "
181
- "scs should be recompiled with correct flags.\n",
241
+ "Warning, sizeof(file int) is %lu, but scs expects sizeof(int) %lu. "
242
+ "SCS will attempt to cast the data, which may be slow. "
243
+ "This message can be avoided by recompiling with the correct flags.\n",
182
244
  (unsigned long)file_int_sz, (unsigned long)sizeof(scs_int));
183
- fclose(fin);
184
- return -1;
185
245
  }
186
246
  if (file_float_sz != (uint32_t)sizeof(scs_float)) {
187
247
  scs_printf(
@@ -201,16 +261,17 @@ scs_int SCS(read_data)(const char *filename, ScsData **d, ScsCone **k,
201
261
  "************************************************************\n",
202
262
  file_version, SCS_VERSION);
203
263
  }
204
- *k = read_scs_cone(fin);
205
- *d = read_scs_data(fin);
206
- *stgs = read_scs_stgs(fin);
264
+ *k = read_scs_cone(fin, file_int_sz);
265
+ *d = read_scs_data(fin, file_int_sz);
266
+ *stgs = read_scs_stgs(fin, file_int_sz);
267
+ scs_printf("Finished reading data.\n");
207
268
  fclose(fin);
208
269
  return 0;
209
270
  }
210
271
 
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) {
272
+ void SCS(log_data_to_csv)(const ScsCone *k, const ScsSettings *stgs,
273
+ const ScsWork *w, scs_int iter,
274
+ SCS(timer) * solve_timer) {
214
275
  ScsResiduals *r = w->r_orig;
215
276
  ScsResiduals *r_n = w->r_normalized;
216
277
  ScsSolution *sol = w->xys_orig;
@@ -222,7 +283,7 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
222
283
  stgs->log_csv_filename);
223
284
  return;
224
285
  }
225
- scs_int l = w->m + w->n + 1;
286
+ scs_int l = w->d->m + w->d->n + 1;
226
287
  if (iter == 0) {
227
288
  /* need to end in comma so that csv parsing is correct */
228
289
  fprintf(fout, "iter,"
@@ -286,22 +347,22 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
286
347
  fprintf(fout, "%.16e,", r->res_pri);
287
348
  fprintf(fout, "%.16e,", r->res_dual);
288
349
  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));
350
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->x, w->d->n));
351
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->y, w->d->m));
352
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol->s, w->d->m));
353
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->x, w->d->n));
354
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->y, w->d->m));
355
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol->s, w->d->m));
356
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->x, w->d->n));
357
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->y, w->d->m));
358
+ fprintf(fout, "%.16e,", SCS(norm_inf)(sol_n->s, w->d->m));
359
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->x, w->d->n));
360
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->y, w->d->m));
361
+ fprintf(fout, "%.16e,", SCS(norm_2)(sol_n->s, w->d->m));
362
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax_s_btau, w->d->m));
363
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->px_aty_ctau, w->d->n));
364
+ fprintf(fout, "%.16e,", SCS(norm_2)(r->ax_s_btau, w->d->m));
365
+ fprintf(fout, "%.16e,", SCS(norm_2)(r->px_aty_ctau, w->d->n));
305
366
  fprintf(fout, "%.16e,", r->res_infeas);
306
367
  fprintf(fout, "%.16e,", r->res_unbdd_a);
307
368
  fprintf(fout, "%.16e,", r->res_unbdd_p);
@@ -312,10 +373,10 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
312
373
  fprintf(fout, "%.16e,", r_n->res_pri);
313
374
  fprintf(fout, "%.16e,", r_n->res_dual);
314
375
  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));
376
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->ax_s_btau, w->d->m));
377
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r_n->px_aty_ctau, w->d->n));
378
+ fprintf(fout, "%.16e,", SCS(norm_2)(r_n->ax_s_btau, w->d->m));
379
+ fprintf(fout, "%.16e,", SCS(norm_2)(r_n->px_aty_ctau, w->d->n));
319
380
  fprintf(fout, "%.16e,", r_n->res_infeas);
320
381
  fprintf(fout, "%.16e,", r_n->res_unbdd_a);
321
382
  fprintf(fout, "%.16e,", r_n->res_unbdd_p);
@@ -323,12 +384,12 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
323
384
  fprintf(fout, "%.16e,", r_n->dobj);
324
385
  fprintf(fout, "%.16e,", r_n->tau);
325
386
  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);
387
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->ax, w->d->m));
388
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->px, w->d->n));
389
+ fprintf(fout, "%.16e,", SCS(norm_inf)(r->aty, w->d->n));
390
+ fprintf(fout, "%.16e,", SCS(norm_inf)(w->b_orig, w->d->m));
391
+ fprintf(fout, "%.16e,", SCS(norm_inf)(w->c_orig, w->d->n));
392
+ fprintf(fout, "%.16e,", w->stgs->scale);
332
393
  fprintf(fout, "%.16e,", SCS(norm_diff)(w->u, w->u_t, l));
333
394
  fprintf(fout, "%.16e,", SCS(norm_diff)(w->v, w->v_prev, l));
334
395
  fprintf(fout, "%.16e,", SCS(norm_inf_diff)(w->u, w->u_t, l));
@@ -340,3 +401,5 @@ void SCS(log_data_to_csv)(const ScsData *d, const ScsCone *k,
340
401
  fprintf(fout, "\n");
341
402
  fclose(fout);
342
403
  }
404
+
405
+ #endif