vendor/scs/src/normalize.c in scs-0.2.3 vs vendor/scs/src/normalize.c in scs-0.3.0
- old
+ new
@@ -1,93 +1,51 @@
#include "normalize.h"
+
#include "linalg.h"
#include "scs.h"
-#define MIN_SCALE (1e-6)
-
-void SCS(normalize_b_c)(ScsWork *w) {
+/* needed for normalizing the warm-start */
+void SCS(normalize_sol)(ScsWork *w, ScsSolution *sol) {
scs_int i;
- scs_float nm, *D = w->scal->D, *E = w->scal->E, *b = w->b, *c = w->c;
- /* scale b */
- for (i = 0; i < w->m; ++i) {
- b[i] /= D[i];
- }
- nm = SCS(norm)(b, w->m);
- w->sc_b = w->scal->mean_norm_col_a / MAX(nm, MIN_SCALE);
- /* scale c */
- for (i = 0; i < w->n; ++i) {
- c[i] /= E[i];
- }
- nm = SCS(norm)(c, w->n);
- w->sc_c = w->scal->mean_norm_row_a / MAX(nm, MIN_SCALE);
- SCS(scale_array)(b, w->sc_b * w->stgs->scale, w->m);
- SCS(scale_array)(c, w->sc_c * w->stgs->scale, w->n);
-}
-
-void SCS(calc_scaled_resids)(ScsWork *w, ScsResiduals *r) {
scs_float *D = w->scal->D;
scs_float *E = w->scal->E;
- scs_float *u = w->u;
- scs_float *u_t = w->u_t;
- scs_float *u_prev = w->u_prev;
- scs_float tmp;
- scs_int i, n = w->n, m = w->m;
-
- r->res_pri = 0;
- for (i = 0; i < n; ++i) {
- tmp = (u[i] - u_t[i]) / (E[i] * w->sc_b);
- r->res_pri += tmp * tmp;
+ for (i = 0; i < w->n; ++i) {
+ sol->x[i] /= (E[i] / w->scal->dual_scale);
}
- for (i = 0; i < m; ++i) {
- tmp = (u[i + n] - u_t[i + n]) / (D[i] * w->sc_c);
- r->res_pri += tmp * tmp;
+ for (i = 0; i < w->m; ++i) {
+ sol->y[i] /= (D[i] / w->scal->primal_scale);
}
- tmp = u[n + m] - u_t[n + m];
- r->res_pri += tmp * tmp;
- r->res_pri = sqrt(r->res_pri);
-
- r->res_dual = 0;
- for (i = 0; i < n; ++i) {
- tmp = (u[i] - u_prev[i]) * E[i] / w->sc_b;
- r->res_dual += tmp * tmp;
+ for (i = 0; i < w->m; ++i) {
+ sol->s[i] *= (D[i] * w->scal->dual_scale);
}
- for (i = 0; i < m; ++i) {
- tmp = (u[i + n] - u_prev[i + n]) * D[i] / w->sc_c;
- r->res_dual += tmp * tmp;
- }
- tmp = u[n + m] - u_t[n + m];
- r->res_dual += tmp * tmp;
- r->res_dual = sqrt(r->res_dual);
}
-void SCS(normalize_warm_start)(ScsWork *w) {
+void SCS(un_normalize_sol)(ScsWork *w, ScsSolution *sol) {
scs_int i;
scs_float *D = w->scal->D;
scs_float *E = w->scal->E;
- scs_float *x = w->u;
- scs_float *y = &(w->u[w->n]);
- scs_float *s = &(w->v[w->n]);
for (i = 0; i < w->n; ++i) {
- x[i] *= (E[i] * w->sc_b);
+ sol->x[i] *= (E[i] / w->scal->dual_scale);
}
for (i = 0; i < w->m; ++i) {
- y[i] *= (D[i] * w->sc_c);
+ sol->y[i] *= (D[i] / w->scal->primal_scale);
}
for (i = 0; i < w->m; ++i) {
- s[i] /= (D[i] / (w->sc_b * w->stgs->scale));
+ sol->s[i] /= (D[i] * w->scal->dual_scale);
}
}
-void SCS(un_normalize_sol)(ScsWork *w, ScsSolution *sol) {
+void SCS(un_normalize_primal)(ScsWork *w, scs_float *r) {
scs_int i;
scs_float *D = w->scal->D;
- scs_float *E = w->scal->E;
- for (i = 0; i < w->n; ++i) {
- sol->x[i] /= (E[i] * w->sc_b);
- }
for (i = 0; i < w->m; ++i) {
- sol->y[i] /= (D[i] * w->sc_c);
+ r[i] /= (D[i] * w->scal->dual_scale);
}
- for (i = 0; i < w->m; ++i) {
- sol->s[i] *= D[i] / (w->sc_b * w->stgs->scale);
+}
+
+void SCS(un_normalize_dual)(ScsWork *w, scs_float *r) {
+ scs_int i;
+ scs_float *E = w->scal->E;
+ for (i = 0; i < w->n; ++i) {
+ r[i] /= (E[i] * w->scal->primal_scale);
}
}