static Work * initWork(Data *d, Cone * k) { Work * w = scs_calloc(1, sizeof(Work)); idxint l = d->n + d->m + 1; if (d->VERBOSE) { printInitHeader(d, w, k); } if (!w) { scs_printf("ERROR: allocating work failure\n"); return NULL; } /* allocate workspace: */ w->u = scs_malloc(l * sizeof(pfloat)); w->v = scs_malloc(l * sizeof(pfloat)); w->u_t = scs_malloc(l * sizeof(pfloat)); w->u_prev = scs_malloc(l * sizeof(pfloat)); w->h = scs_malloc((l - 1) * sizeof(pfloat)); w->g = scs_malloc((l - 1) * sizeof(pfloat)); w->pr = scs_malloc(d->m * sizeof(pfloat)); w->dr = scs_malloc(d->n * sizeof(pfloat)); if (!w->u || !w->v || !w->u_t || !w->u_prev || !w->h || !w->g || !w->pr || !w->dr) { scs_printf("ERROR: work memory allocation failure\n"); scs_finish(d, w); return NULL; } if (d->NORMALIZE) { normalizeA(d, w, k); #ifdef EXTRAVERBOSE printArray(w->D, d->m, "D"); scs_printf("norm D = %4f\n", calcNorm(w->D, d->m)); printArray(w->E, d->n, "E"); scs_printf("norm E = %4f\n", calcNorm(w->E, d->n)); #endif } else { w->D = NULL; w->E = NULL; } if (initCone(k) < 0) { scs_printf("ERROR: initCone failure\n"); scs_finish(d, w); return NULL; } w->p = initPriv(d); if (!w->p) { scs_printf("ERROR: initPriv failure\n"); scs_finish(d, w); return NULL; } return w; }
int main(int argc, char **argv) { FILE * fp; Cone * k; Data * d; Work * w; Sol * sol; Info info = { 0 }; scs_int i; if (openFile(argc, argv, 1, DEMO_PATH, &fp) < 0) return -1; k = scs_calloc(1, sizeof(Cone)); d = scs_calloc(1, sizeof(Data)); sol = scs_calloc(1, sizeof(Sol)); if (readInData(fp, d, k) == -1) { printf("Error reading in data, aborting.\n"); return -1; } fclose(fp); scs_printf("solve once using scs\n"); scs(d, k, sol, &info); if (TEST_WARM_START) { scs_printf("solve %i times with warm-start and (if applicable) factorization caching.\n", NUM_TRIALS); /* warm starts stored in Sol */ w = scs_init(d, k, &info); if (w) { for (i = 0; i < NUM_TRIALS; i++) { /* perturb b and c */ perturbVector(d->b, d->m); perturbVector(d->c, d->n); d->stgs->warm_start = 1; d->stgs->cg_rate = 4; scs_solve(w, d, k, sol, &info); d->stgs->warm_start = 0; d->stgs->cg_rate = 2; scs_solve(w, d, k, sol, &info); } } scs_printf("finished\n"); scs_finish(w); } freeData(d, k); freeSol(sol); return 0; }
/* this just calls scs_init, scs_solve, and scs_finish */ idxint scs(Data * d, Cone * k, Sol * sol, Info * info) { #if ( defined _WIN32 || defined _WIN64 ) && !defined MATLAB_MEX_FILE && !defined PYTHON /* sets width of exponent for floating point numbers to 2 instead of 3 */ unsigned int old_output_format = _set_output_format(_TWO_DIGIT_EXPONENT); #endif Work * w = scs_init(d, k, info); #ifdef EXTRAVERBOSE scs_printf("size of idxint = %lu, size of pfloat = %lu\n", sizeof(idxint), sizeof(pfloat)); #endif if (!w) { return failureDefaultReturn(d, NULL, sol, info, "could not initialize work"); } scs_solve(w, d, k, sol, info); scs_finish(d, w); return info->statusVal; }