vendor/scs/src/normalize.c in scs-0.3.2 vs vendor/scs/src/normalize.c in scs-0.4.0
- old
+ new
@@ -1,9 +1,58 @@
#include "normalize.h"
#include "linalg.h"
#include "scs.h"
+/* copied from linsys/scs_matrix.c */
+#define MIN_NORMALIZATION_FACTOR (1e-4)
+#define MAX_NORMALIZATION_FACTOR (1e4)
+
+/* Given D, E in scaling normalize b, c and compute primal / dual scales.
+ *
+ * Recall that the normalization routine is performing:
+ *
+ * [P A' c] with [E 0 0] on both sides (D, E diagonal)
+ * [A 0 b] [0 D 0]
+ * [c' b' 0] [0 0 s]
+ *
+ * which results in:
+ *
+ * [ EPE EA'D sEc ]
+ * [ DAE 0 sDb ]
+ * [ sc'E sb'D 0 ]
+ *
+ * `s` is incorporated into dual_scale and primal_scale
+ *
+ */
+void SCS(normalize_b_c)(ScsScaling *scal, scs_float *b, scs_float *c) {
+ scs_int i;
+ scs_float sigma;
+
+ /* scale c */
+ for (i = 0; i < scal->n; ++i) {
+ c[i] *= scal->E[i];
+ }
+ /* scale b */
+ for (i = 0; i < scal->m; ++i) {
+ b[i] *= scal->D[i];
+ }
+
+ /* calculate primal and dual scales */
+ sigma = MAX(SCS(norm_inf)(c, scal->n), SCS(norm_inf)(b, scal->m));
+ sigma = sigma < MIN_NORMALIZATION_FACTOR ? 1.0 : sigma;
+ sigma = sigma > MAX_NORMALIZATION_FACTOR ? MAX_NORMALIZATION_FACTOR : sigma;
+ sigma = SAFEDIV_POS(1.0, sigma);
+
+ /* Scale b, c */
+ SCS(scale_array)(c, sigma, scal->n);
+ SCS(scale_array)(b, sigma, scal->m);
+
+ /* We assume that primal_scale = dual_scale, otherwise need to refactorize */
+ scal->primal_scale = sigma;
+ scal->dual_scale = sigma;
+}
+
/* needed for normalizing the warm-start */
void SCS(normalize_sol)(ScsScaling *scal, ScsSolution *sol) {
scs_int i;
scs_float *D = scal->D;
scs_float *E = scal->E;