vendor/scs/test/random_socp_prob.c in scs-0.2.3 vs vendor/scs/test/random_socp_prob.c in scs-0.3.0
- old
+ new
@@ -1,101 +1,99 @@
-#include <time.h> /* to seed random */
-#include "amatrix.h"
#include "problem_utils.h"
#include "scs.h"
+#include "scs_matrix.h"
+#include <time.h> /* to seed random */
/*
create data for problem:
minimize c'*x
subject to Ax <=_K b
where K is a product of zero, linear, and second-order cones. A is a sparse
matrix in
- CSC format. A is 3n by n with about sqrt(n) nonzeros per column.
+ CSC format. A is factor * n by n with about sqrt(n) nonzeros per column.
Construct data in such a way that the problem is primal and dual
feasible and thus bounded.
*/
int main(int argc, char **argv) {
scs_int n, m, col_nnz, nnz, i, q_total, q_num_rows, max_q;
ScsCone *k;
ScsData *d;
+ ScsSettings *stgs;
ScsSolution *sol, *opt_sol;
ScsInfo info = {0};
scs_float p_f, p_l;
+ scs_int factor = 4;
int seed = 0;
/* default parameters */
p_f = 0.1;
p_l = 0.3;
seed = time(SCS_NULL);
switch (argc) {
- case 5:
- seed = atoi(argv[4]);
- /* no break */
- case 4:
- p_f = atof(argv[2]);
- p_l = atof(argv[3]);
- /* no break */
- case 2:
- n = atoi(argv[1]);
- break;
- default:
- scs_printf(
- "usage:\t%s n p_f p_l s\n"
- "\tcreates an SOCP with n variables where p_f fraction of "
- "rows correspond\n"
- "\tto equality constraints, p_l fraction of rows correspond "
- "to LP constraints,\n"
- "\tand the remaining percentage of rows are involved in "
- "second-order\n"
- "\tcone constraints. the random number generator is seeded "
- "with s.\n"
- "\tnote that p_f + p_l should be less than or equal to 1, "
- "and that\n"
- "\tp_f should be less than .33, since that corresponds to "
- "as many equality\n"
- "\tconstraints as variables.\n",
- argv[0]);
- scs_printf(
- "\nusage:\t%s n p_f p_l\n"
- "\tdefaults the seed to the system time\n",
- argv[0]);
- scs_printf(
- "\nusage:\t%s n\n"
- "\tdefaults to using p_f = 0.1 and p_l = 0.3\n",
- argv[0]);
- return 0;
+ case 5:
+ seed = atoi(argv[4]);
+ /* no break */
+ case 4:
+ p_f = atof(argv[2]);
+ p_l = atof(argv[3]);
+ /* no break */
+ case 2:
+ n = atoi(argv[1]);
+ break;
+ default:
+ scs_printf("usage:\t%s n p_f p_l s\n"
+ "\tcreates an SOCP with n variables where p_f fraction of "
+ "rows correspond\n"
+ "\tto equality constraints, p_l fraction of rows correspond "
+ "to LP constraints,\n"
+ "\tand the remaining percentage of rows are involved in "
+ "second-order\n"
+ "\tcone constraints. the random number generator is seeded "
+ "with s.\n"
+ "\tnote that p_f + p_l should be less than or equal to 1, "
+ "and that\n"
+ "\tp_f should be less than .33, since that corresponds to "
+ "as many equality\n"
+ "\tconstraints as variables.\n",
+ argv[0]);
+ scs_printf("\nusage:\t%s n p_f p_l\n"
+ "\tdefaults the seed to the system time\n",
+ argv[0]);
+ scs_printf("\nusage:\t%s n\n"
+ "\tdefaults to using p_f = 0.1 and p_l = 0.3\n",
+ argv[0]);
+ return 0;
}
- srand(seed);
scs_printf("seed : %i\n", seed);
k = (ScsCone *)scs_calloc(1, sizeof(ScsCone));
d = (ScsData *)scs_calloc(1, sizeof(ScsData));
- d->stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
+ stgs = (ScsSettings *)scs_calloc(1, sizeof(ScsSettings));
sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
opt_sol = (ScsSolution *)scs_calloc(1, sizeof(ScsSolution));
- m = 3 * n;
+ m = factor * n;
col_nnz = (int)ceil(sqrt(n));
nnz = n * col_nnz;
- max_q = (scs_int)ceil(3 * n / log(3 * n));
+ max_q = (scs_int)ceil(factor * n / log(factor * n));
if (p_f + p_l > 1.0) {
printf("error: p_f + p_l > 1.0!\n");
return 1;
}
- k->f = (scs_int)floor(3 * n * p_f);
- k->l = (scs_int)floor(3 * n * p_l);
+ k->z = (scs_int)floor(factor * n * p_f);
+ k->l = (scs_int)floor(factor * n * p_l);
k->qsize = 0;
- q_num_rows = 3 * n - k->f - k->l;
+ q_num_rows = factor * n - k->z - k->l;
k->q = (scs_int *)scs_malloc(q_num_rows * sizeof(scs_int));
while (q_num_rows > max_q) {
int size;
size = (rand() % max_q) + 1;
@@ -115,10 +113,13 @@
k->s = SCS_NULL;
k->ssize = 0;
k->ep = 0;
k->ed = 0;
+ k->bsize = 0;
+ k->bu = SCS_NULL;
+ k->bl = SCS_NULL;
scs_printf("\nA is %ld by %ld, with %ld nonzeros per column.\n", (long)m,
(long)n, (long)col_nnz);
scs_printf("A has %ld nonzeros (%f%% dense).\n", (long)nnz,
100 * (scs_float)col_nnz / m);
@@ -128,43 +129,43 @@
((scs_float)nnz * sizeof(scs_int)) / POWF(2, 30));
scs_printf("Col ptrs of A take %f GB of storage.\n\n",
((scs_float)n * sizeof(scs_int)) / POWF(2, 30));
printf("ScsCone information:\n");
- printf("Zero cone rows: %ld\n", (long)k->f);
+ printf("Zero cone rows: %ld\n", (long)k->z);
printf("LP cone rows: %ld\n", (long)k->l);
printf("Number of second-order cones: %ld, covering %ld rows, with sizes\n[",
(long)k->qsize, (long)q_total);
for (i = 0; i < k->qsize; i++) {
printf("%ld, ", (long)k->q[i]);
}
printf("]\n");
printf("Number of rows covered is %ld out of %ld.\n\n",
- (long)(q_total + k->f + k->l), (long)m);
+ (long)(q_total + k->z + k->l), (long)m);
/* set up SCS structures */
d->m = m;
d->n = n;
- gen_random_prob_data(nnz, col_nnz, d, k, opt_sol);
- SCS(set_default_settings)(d);
+ gen_random_prob_data(nnz, col_nnz, d, k, opt_sol, seed);
+ SCS(set_default_settings)(stgs);
- /* d->stgs->write_data_filename = "random_socp_prob"; */
+ /* stgs->write_data_filename = "random_socp_prob"; */
scs_printf("true pri opt = %4f\n", SCS(dot)(d->c, opt_sol->x, d->n));
scs_printf("true dua opt = %4f\n", -SCS(dot)(d->b, opt_sol->y, d->m));
/* solve! */
- scs(d, k, sol, &info);
+ scs(d, k, stgs, sol, &info);
scs_printf("true pri opt = %4f\n", SCS(dot)(d->c, opt_sol->x, d->n));
scs_printf("true dua opt = %4f\n", -SCS(dot)(d->b, opt_sol->y, d->m));
if (sol->x) {
scs_printf("scs pri obj= %4f\n", SCS(dot)(d->c, sol->x, d->n));
}
if (sol->y) {
scs_printf("scs dua obj = %4f\n", -SCS(dot)(d->b, sol->y, d->m));
}
- SCS(free_data)(d, k);
+ SCS(free_data)(d, k, stgs);
SCS(free_sol)(sol);
SCS(free_sol)(opt_sol);
return 0;
}