scs 0.3.2 → 0.4.1

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