int main(int argc, char *argv[]) { dispstr(0,"Welcome to the HMM program!\n"); #ifndef __STDC_IEC_559__ printf("WARNING: ISO/IEC 60559 not respected!\n"); #endif parse(argc, argv); dispstr(0,"Loading file...\n"); delays_mt input = getinput(); dispstr(0,"Sorting inputs...\n"); mysort(&input); //this offsets the timestamps to zero, and finds the min and max value of the delays. delay_mt ymin = input.delay[0]; delay_mt ymax = ymin; delay_mt current; time_mt tmin = input.time[0]; for(long long i = 0; i<input.length; i++) { input.time[i] = input.time[i] - tmin; current = input.delay[i]; if(current < ymin) ymin = current; if(current > ymax) ymax = current; } //now, we offset the delays to zero for(long long i = 0;i<input.length;i++) { //MINDELAY is an epsilon in order not to bug the algo input.delay[i] = input.delay[i] - ymin + MINDELAY; } struct params p; dispstr(0,"Initializing Markov parameters...\n"); initparams(&p, ymax); input.length = input.length/300; dispstr(0,"Training model...\n"); train(&p, &input, ymax); dispstr(0,"Writing results...\n"); write_results(&p); freeparams(&p); dispstr(0,"Done.\n"); return EXIT_SUCCESS; }
// main function int main(int argc,char *argv[]) { int i; int argc_regular; int argv_type; char *argv_ext; // count regular arguments for (argc_regular=0,i=1; i<argc; i++) if (*argv[i]!='-') argc_regular++; // process command line options for (i=1; i<argc; i++) if (strcmp(argv[i],"-s")==0) sw_stereo=1; else if (strcmp(argv[i],"-a")==0) sw_anaglyph=1; else if (strcmp(argv[i],"-f")==0) sw_full=1; else if (strcmp(argv[i],"-m")==0) sw_multi=1; else if (strcmp(argv[i],"-r")==0) sw_reset=1; else if (strcmp(argv[i],"-c")==0) sw_autos3tc=1; else if (strcmp(argv[i],"-b")==0) sw_bricks=1; else if (strcmp(argv[i],"-B")==0) sw_bricks=sw_mpass=1; // check arguments if ((sw_multi==0 && argc_regular!=1 && argc_regular!=2 && argc_regular!=4) || (sw_multi!=0 && argc_regular<1)) { printf("short usage: %s <url> {<options>}\n",argv[0]); printf("regular usage: %s <elev.ini> <imag.ini> {<options>}\n",argv[0]); printf("long usage: %s <url> <tileset.path> <elevation.subpath> <imagery.subpath> {<options>}\n",argv[0]); printf("multi usage: %s -m {<url> [<detail.db>]} {<options>}\n",argv[0]); printf("options: -s=stereo -a=anaglyph -f=full-screen -r=reset-cache -c=auto-s3tc\n"); exit(1); } // path setup for elevation and imagery if (sw_multi==0) if (argc_regular==4) { if (*argv[1]=='-' || sscanf(argv[1],"%s",baseurl)!=1) exit(1); if (*argv[2]=='-' || sscanf(argv[2],"%s",baseid)!=1) exit(1); if (*argv[3]=='-' || sscanf(argv[3],"%s",basepath1)!=1) exit(1); if (*argv[4]=='-' || sscanf(argv[4],"%s",basepath2)!=1) exit(1); } else if (argc_regular==2) { if (*argv[1]=='-' || sscanf(argv[1],"%s",elev)!=1) exit(1); if (*argv[2]=='-' || sscanf(argv[2],"%s",imag)!=1) exit(1); } else if (*argv[1]=='-' || sscanf(argv[1],"%s",shorturl)!=1) exit(1); // open window with GLUT: winwidth=VIEWER_WINWIDTH; winheight=VIEWER_WINHEIGHT; glutInit(&argc,argv); glutInitWindowSize(winwidth,winheight); if (sw_stereo!=0 && sw_anaglyph==0) glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_STENCIL|GLUT_DOUBLE|GLUT_STEREO); else glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_STENCIL|GLUT_DOUBLE); if (sw_full==0) winid=glutCreateWindow(VIEWER_WINTITLE); else glutEnterGameMode(); glutDisplayFunc(displayfunc); glutReshapeFunc(reshapefunc); glutMouseFunc(NULL); glutMotionFunc(NULL); glutKeyboardFunc(keyboardfunc); glutSpecialFunc(NULL); glutIdleFunc(displayfunc); // print unsupported OpenGL extensions miniOGL::print_unsupported_glexts(); // create the viewer object viewer=new miniview; // initialize the viewing parameters initparams(); // get a reference to the viewing parameters params=viewer->get(); // get a reference to the earth parameters eparams=viewer->getearth()->get(); // get a reference to the terrain parameters tparams=viewer->getearth()->getterrain()->get(); // load tileset (short version) if (sw_multi==0 && argc_regular==1) if (!viewer->getearth()->load(shorturl,TRUE,sw_reset)) { printf("unable to load tileset at url=%s\n",shorturl); exit(1); } // load tileset (regular version) if (sw_multi==0 && argc_regular==2) if (!viewer->getearth()->load(elev,imag,TRUE,sw_reset)) { printf("unable to load tileset from %s (resp. %s)\n",elev,imag); exit(1); } // load tileset (long version) if (sw_multi==0 && argc_regular==4) if (!viewer->getearth()->load(baseurl,baseid,basepath1,basepath2,TRUE,sw_reset)) { printf("unable to load tileset at url=%s%s%s (resp. %s)\n",baseurl,baseid,basepath1,basepath2); exit(1); } // load tileset (multi version) if (sw_multi!=0) for (i=1; i<argc; i++) if (*argv[i]!='-') { argv_type=0; argv_ext=strrchr(argv[i],'.'); if (argv_ext!=NULL) if (strlen(argv_ext)<=4) if (strcmp(argv_ext,".db")==0) argv_type=1; // identified tileset if (argv_type==0) if (!viewer->getearth()->loadLTS(argv[i],TRUE,sw_reset,VIEWER_LEVELS)) { printf("unable to load tileset at url=%s\n",argv[i]); exit(1); } // identified detail if (argv_type==1) viewer->getearth()->loaddetailtex(argv[i]); } // load optional features viewer->getearth()->loadopts(); // initialize VIS bathy map initVISbathymap(); // initialize NPR bathy map initNPRbathymap(); // initialize camera cam=new minicam(viewer->getearth()); // tell actual camera viewer->set_camera(cam); // load settings loadsettings(); // initialize waypoint addons initaddons(); // enter event loop glutMainLoop(); // never reached return(0); }
int main(int argc, char *argv[]) { int i, currentarg; DIR *dir = NULL; struct dirent *di = NULL; PARAMS p; initparams(&p); /* early check for debug and config parameter */ if (argc > 1) { for (currentarg=1; currentarg<argc; currentarg++) { if ((strcmp(argv[currentarg],"-D")==0) || (strcmp(argv[currentarg],"--debug")==0)) { debug = 1; } else if (strcmp(argv[currentarg],"--config")==0) { if (currentarg+1<argc) { strncpy_nt(p.cfgfile, argv[currentarg+1], 512); if (debug) printf("Used config file: %s\n", p.cfgfile); currentarg++; continue; } else { printf("Error: File for --config missing.\n"); return 1; } } } } /* load config if available */ if (!loadcfg(p.cfgfile)) { return 1; } if (!ibwloadcfg(p.cfgfile)) { return 1; } configlocale(); strncpy_nt(p.interface, "default", 32); strncpy_nt(p.definterface, cfg.iface, 32); strncpy_nt(p.nick, "none", 32); /* init dirname */ strncpy_nt(p.dirname, cfg.dbdir, 512); /* parse parameters, maybe not the best way but... */ for (currentarg=1; currentarg<argc; currentarg++) { if (debug) printf("arg %d: \"%s\"\n",currentarg,argv[currentarg]); if (strcmp(argv[currentarg],"--longhelp")==0) { showlonghelp(&p); return 0; } else if ((strcmp(argv[currentarg],"-?")==0) || (strcmp(argv[currentarg],"--help")==0)) { showhelp(&p); return 0; } else if ((strcmp(argv[currentarg],"-i")==0) || (strcmp(argv[currentarg],"--iface")==0)) { if (currentarg+1<argc) { strncpy_nt(p.interface, argv[currentarg+1], 32); p.defaultiface = 0; if (debug) printf("Used interface: %s\n", p.interface); currentarg++; continue; } else { printf("Error: Interface for -i missing.\n"); return 1; } } else if (strcmp(argv[currentarg],"--config")==0) { /* config has already been parsed earlier so nothing to do here */ currentarg++; continue; } else if ((strcmp(argv[currentarg],"--nick"))==0) { if (currentarg+1<argc) { strncpy_nt(p.nick, argv[currentarg+1], 32); if (debug) printf("Used nick: %s\n", p.nick); currentarg++; continue; } else { printf("Error: Nick for --nick missing.\n"); return 1; } } else if ((strcmp(argv[currentarg],"--style"))==0) { if (currentarg+1<argc && isdigit(argv[currentarg+1][0])) { if (cfg.ostyle > 4 || cfg.ostyle < 0) { printf("Error: Invalid style parameter \"%d\" for --style.\n", cfg.ostyle); printf(" Valid parameters:\n"); printf(" 0 - a more narrow output\n"); printf(" 1 - enable bar column if available\n"); printf(" 2 - average traffic rate in summary and weekly outputs\n"); printf(" 3 - average traffic rate in all outputs if available\n"); printf(" 4 - disable terminal control characters in -l / --live\n"); return 1; } cfg.ostyle = atoi(argv[currentarg+1]); if (debug) printf("Style changed: %d\n", cfg.ostyle); currentarg++; continue; } else { printf("Error: Style parameter for --style missing.\n"); printf(" Valid parameters:\n"); printf(" 0 - a more narrow output\n"); printf(" 1 - enable bar column if available\n"); printf(" 2 - average traffic rate in summary and weekly outputs\n"); printf(" 3 - average traffic rate in all outputs if available\n"); printf(" 4 - disable terminal control characters in -l / --live\n"); return 1; } } else if ((strcmp(argv[currentarg],"--dbdir"))==0) { if (currentarg+1<argc) { strncpy_nt(p.dirname, argv[currentarg+1], 512); if (debug) printf("DatabaseDir: \"%s\"\n", p.dirname); currentarg++; continue; } else { printf("Error: Directory for --dbdir missing.\n"); return 1; } } else if ((strcmp(argv[currentarg],"--locale"))==0) { if (currentarg+1<argc) { setlocale(LC_ALL, argv[currentarg+1]); if (debug) printf("Locale: \"%s\"\n", argv[currentarg+1]); currentarg++; continue; } else { printf("Error: Locale for --locale missing.\n"); return 1; } } else if (strcmp(argv[currentarg],"--create")==0) { p.create=1; p.query=0; if (debug) printf("Creating database...\n"); } else if ((strcmp(argv[currentarg],"-u")==0) || (strcmp(argv[currentarg],"--update")==0)) { p.update=1; p.query=0; if (debug) printf("Updating database...\n"); } else if (strcmp(argv[currentarg],"--importdb")==0) { if (currentarg+1<argc) { p.import=1; strncpy_nt(p.filename, argv[currentarg+1], 512); if (debug) printf("Used import file: %s\n", p.filename); currentarg++; continue; } else { printf("Error: File parameter for --importdb missing.\n"); return 1; } } else if ((strcmp(argv[currentarg],"-q")==0) || (strcmp(argv[currentarg],"--query")==0)) { p.query=1; } else if ((strcmp(argv[currentarg],"-D")==0) || (strcmp(argv[currentarg],"--debug")==0)) { debug=1; } else if ((strcmp(argv[currentarg],"-d")==0) || (strcmp(argv[currentarg],"--days")==0)) { cfg.qmode=1; } else if ((strcmp(argv[currentarg],"-m")==0) || (strcmp(argv[currentarg],"--months")==0)) { cfg.qmode=2; } else if ((strcmp(argv[currentarg],"-t")==0) || (strcmp(argv[currentarg],"--top10")==0)) { cfg.qmode=3; } else if ((strcmp(argv[currentarg],"-s")==0) || (strcmp(argv[currentarg],"--short")==0)) { cfg.qmode=5; } else if ((strcmp(argv[currentarg],"-w")==0) || (strcmp(argv[currentarg],"--weeks")==0)) { cfg.qmode=6; } else if ((strcmp(argv[currentarg],"-h")==0) || (strcmp(argv[currentarg],"--hours")==0)) { cfg.qmode=7; } else if ((strcmp(argv[currentarg],"--exportdb")==0) || (strcmp(argv[currentarg],"--dumpdb")==0)) { cfg.qmode=4; } else if (strcmp(argv[currentarg],"--oneline")==0) { cfg.qmode=9; } else if (strcmp(argv[currentarg],"--xml")==0) { if (currentarg+1<argc && argv[currentarg+1][0]!='-') { p.xmlmode = argv[currentarg+1][0]; if (strlen(argv[currentarg+1])!=1 || strchr("ahdmt", p.xmlmode)==NULL) { printf("Error: Invalid mode parameter \"%s\" for --xml.\n", argv[currentarg+1]); printf(" Valid parameters:\n"); printf(" a - all (default)\n"); printf(" h - only hours\n"); printf(" d - only days\n"); printf(" m - only months\n"); printf(" t - only top 10\n"); return 1; } currentarg++; } cfg.qmode=8; } else if (strcmp(argv[currentarg],"--json")==0) { if (currentarg+1<argc && argv[currentarg+1][0]!='-') { p.jsonmode = argv[currentarg+1][0]; if (strlen(argv[currentarg+1])!=1 || strchr("ahdmt", p.jsonmode)==NULL) { printf("Error: Invalid mode parameter \"%s\" for --json.\n", argv[currentarg+1]); printf(" Valid parameters:\n"); printf(" a - all (default)\n"); printf(" h - only hours\n"); printf(" d - only days\n"); printf(" m - only months\n"); printf(" t - only top 10\n"); return 1; } currentarg++; } cfg.qmode=10; } else if (strcmp(argv[currentarg],"--savemerged")==0) { p.savemerged=1; } else if ((strcmp(argv[currentarg],"-ru")==0) || (strcmp(argv[currentarg],"--rateunit"))==0) { if (currentarg+1<argc && isdigit(argv[currentarg+1][0])) { if (cfg.rateunit > 1 || cfg.rateunit < 0) { printf("Error: Invalid parameter \"%d\" for --rateunit.\n", cfg.rateunit); printf(" Valid parameters:\n"); printf(" 0 - bytes\n"); printf(" 1 - bits\n"); return 1; } cfg.rateunit = atoi(argv[currentarg+1]); if (debug) printf("Rateunit changed: %d\n", cfg.rateunit); currentarg++; continue; } else { cfg.rateunit = !cfg.rateunit; if (debug) printf("Rateunit changed: %d\n", cfg.rateunit); } } else if (strcmp(argv[currentarg],"--enable")==0) { p.active=1; p.query=0; } else if ((strcmp(argv[currentarg],"-tr")==0) || (strcmp(argv[currentarg],"--traffic")==0)) { if (currentarg+1<argc && isdigit(argv[currentarg+1][0])) { cfg.sampletime=atoi(argv[currentarg+1]); currentarg++; p.traffic=1; p.query=0; continue; } p.traffic=1; p.query=0; } else if ((strcmp(argv[currentarg],"-l")==0) || (strcmp(argv[currentarg],"--live")==0)) { if (currentarg+1<argc && argv[currentarg+1][0]!='-') { if (!isdigit(argv[currentarg+1][0]) || p.livemode > 1 || p.livemode < 0) { printf("Error: Invalid mode parameter \"%s\" for -l / --live.\n", argv[currentarg+1]); printf(" Valid parameters:\n"); printf(" 0 - show packets per second (default)\n"); printf(" 1 - show transfer counters\n"); return 1; } p.livemode = atoi(argv[currentarg+1]); currentarg++; } p.livetraffic=1; p.query=0; } else if (strcmp(argv[currentarg],"--force")==0) { p.force=1; } else if (strcmp(argv[currentarg],"--cleartop")==0) { p.cleartop=1; } else if (strcmp(argv[currentarg],"--rebuildtotal")==0) { p.rebuildtotal=1; } else if (strcmp(argv[currentarg],"--disable")==0) { p.active=0; p.query=0; } else if (strcmp(argv[currentarg],"--testkernel")==0) { i=kerneltest(); return i; } else if (strcmp(argv[currentarg],"--showconfig")==0) { printcfgfile(); return 0; } else if (strcmp(argv[currentarg],"--delete")==0) { p.delete=1; p.query=0; } else if (strcmp(argv[currentarg],"--iflist")==0) {
//Main Function void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { //Input Args double *f, *blin = NULL, *lb = NULL, *ub = NULL, *y0 = NULL; //Return Args double *x, *pval, *dval, *exitflag, *iter, *pinf, *dinf, *realgap, *xzgap; //Options (most get defaults written in) int maxiter = 1500; //Internal Vars size_t ndec = 0, nlincon = 0, lincon_nz = 0, total_dim = 0, ncones = 0; size_t i, j; const char *onames[2] = {"pval","dval"}; const char *fnames[5] = {"iter","pinf","dinf","realgap","xzgap"}; double evaltime; int status = -1, nb = 0, linoffset = 0, indlb = 1, indub = 1, nLB = 0, nUB = 0; mwIndex *jc; //CSDP Problem Data struct blockmatrix C; double *b, *y, *xx, objconstant = 0.0; struct constraintmatrix *constraints; struct blockmatrix X, Z; struct sparseblock *blockptr; struct paramstruc params; //Version Return if(nrhs < 1) { if(nlhs < 1) printSolverInfo(); else plhs[0] = mxCreateString(CSDP_VERSION); return; } //Check Inputs checkInputs(prhs,nrhs); //Get pointers to Input variables f = mxGetPr(pF); ndec = mxGetNumberOfElements(pF); if(!mxIsEmpty(pA)) { blin = mxGetPr(pB); nlincon = mxGetM(pA); jc = mxGetJc(pA); lincon_nz = jc[ndec]; } if(nrhs > eLB && !mxIsEmpty(pLB)) { lb = mxGetPr(pLB); //Ensure we have at least one finite bound for(i=0,j=0;i<ndec;i++) if(mxIsInf(lb[i])) j++; if(j==ndec) lb = NULL; } if(nrhs > eUB && !mxIsEmpty(pUB)) { ub = mxGetPr(pUB); //Ensure we have at least one finite bound for(i=0,j=0;i<ndec;i++) if(mxIsInf(ub[i])) j++; if(j==ndec) ub = NULL; } if(nrhs > eSDP && !mxIsEmpty(pSDP)) { if(mxIsCell(pSDP)) ncones = mxGetNumberOfElements(pSDP); else ncones = 1; } if(nrhs > eY0 && !mxIsEmpty(pY0)) y0 = mxGetPr(pY0); //Create Outputs plhs[0] = mxCreateDoubleMatrix(ndec,1, mxREAL); plhs[1] = mxCreateStructMatrix(1,1,2,onames); mxSetField(plhs[1],0,onames[0],mxCreateDoubleMatrix(1,1, mxREAL)); mxSetField(plhs[1],0,onames[1],mxCreateDoubleMatrix(1,1, mxREAL)); plhs[2] = mxCreateDoubleMatrix(1,1, mxREAL); x = mxGetPr(plhs[0]); pval = mxGetPr(mxGetField(plhs[1],0,onames[0])); dval = mxGetPr(mxGetField(plhs[1],0,onames[1])); exitflag = mxGetPr(plhs[2]); //Info Output plhs[3] = mxCreateStructMatrix(1,1,5,fnames); mxSetField(plhs[3],0,fnames[0],mxCreateDoubleMatrix(1,1, mxREAL)); mxSetField(plhs[3],0,fnames[1],mxCreateDoubleMatrix(1,1, mxREAL)); mxSetField(plhs[3],0,fnames[2],mxCreateDoubleMatrix(1,1, mxREAL)); mxSetField(plhs[3],0,fnames[3],mxCreateDoubleMatrix(1,1, mxREAL)); mxSetField(plhs[3],0,fnames[4],mxCreateDoubleMatrix(1,1, mxREAL)); iter = mxGetPr(mxGetField(plhs[3],0,fnames[0])); pinf = mxGetPr(mxGetField(plhs[3],0,fnames[1])); dinf = mxGetPr(mxGetField(plhs[3],0,fnames[2])); realgap = mxGetPr(mxGetField(plhs[3],0,fnames[3])); xzgap = mxGetPr(mxGetField(plhs[3],0,fnames[4])); //Set Defaults citer = 0; maxtime = 1000; printLevel = 0; //Allocate Initial Storage for the Problem b = (double*)malloc((ndec+1)*sizeof(double)); //objective vector //C matrices [LB UB LIN SD] nb = (int)ncones+(int)(nlincon>0)+(int)(lb!=NULL)+(int)(ub!=NULL); #ifdef DEBUG mexPrintf("Number of blocks (including bounds, linear and sdcones): %d\n",nb); #endif C.nblocks = nb; C.blocks = (struct blockrec*)malloc((nb+1)*sizeof(struct blockrec)); //+1 due to fortran index if(C.blocks == NULL) mexErrMsgTxt("Error allocating memory for C matrices"); //Constraints (i.e. 1 per decision variable) constraints = (struct constraintmatrix*)malloc((ndec+1)*sizeof(struct constraintmatrix)); //+1 due to fortran index if(constraints == NULL) { free(C.blocks); mexErrMsgTxt("Error allocating memory for A matrices"); } for(i=1;i<=ndec;i++) constraints[i].blocks=NULL; //initially set as NULL //Copy in and negate objective vector for(i=0;i<ndec;i++) b[i+1] = -f[i]; //Create Bounds if Present if(lb || ub) linoffset += addBounds(C,lb,ub,ndec,&nLB,&nUB); //Create Linear Cone (diagonal) if present if(nlincon) { //Initialize C C.blocks[linoffset+1].blockcategory = DIAG; C.blocks[linoffset+1].blocksize = (int)nlincon; C.blocks[linoffset+1].data.vec = (double*)malloc((nlincon+1)*sizeof(double)); if(C.blocks[linoffset+1].data.vec == NULL) mexErrMsgTxt("Error allocating memory for LP C diagonal"); #ifdef DEBUG mexPrintf("LP C[%d] Vector size: %d\n",linoffset+1,nlincon); #endif //Copy Elements for(i=0;i<nlincon;i++) { C.blocks[linoffset+1].data.vec[i+1] = -blin[i]; #ifdef DEBUG mexPrintf(" C vec[%d] = %f\n",i+1,-blin[i]); #endif } linoffset++; } #ifdef DEBUG mexPrintf("\nBlock offset after bounds + linear con: %d\n\n",linoffset); #endif //Setup Semidefinite C matrices (note all full matrices, dense, in order from 1) for(i=1;i<=ncones;i++) { //Single Cone if(ncones == 1 && !mxIsCell(pSDP)) total_dim += addCMatrix(C,pSDP,(int)i+linoffset); //Multiple Cones else total_dim += addCMatrix(C,mxGetCell(pSDP,i-1),(int)i+linoffset); } //Add Linear Dims total_dim += nLB+nUB+nlincon; #ifdef DEBUG mexPrintf("\nTotal dimension of all cones: %d\n\n",total_dim); #endif //Setup Each Constraint (for each decision var) (in order from 1) indlb = 1; indub = 1; for(i=1;i<=ndec;i++) { //For each Semidefinte A matrix (sparse triu, in reverse order, i.e. [SD, LP, UB, LB]) for(j=ncones;j>0;j--) { //Create an A matrix blockptr=(struct sparseblock*)malloc(sizeof(struct sparseblock)); if(blockptr==NULL) { sprintf(msgbuf,"Error allocating memory for Semidefinite A[%d,%d]",i,j+linoffset); mexErrMsgTxt(msgbuf); } //Single Cone if(ncones == 1 && !mxIsCell(pSDP)) addAMatrix(blockptr,pSDP,(int)i,(int)j+linoffset); //Multiple Cones else addAMatrix(blockptr,mxGetCell(pSDP,j-1),(int)i,(int)j+linoffset); //Insert A matrix into constraint list blockptr->next=constraints[i].blocks; constraints[i].blocks=blockptr; } //Linear Inequality Constraints if(nlincon) { //Create an A matrix blockptr=(struct sparseblock*)malloc(sizeof(struct sparseblock)); if(blockptr==NULL) { sprintf(msgbuf,"Error allocating memory for LP A[%d]",i); mexErrMsgTxt(msgbuf); } //Insert LP A entries j = 1 + (int)(nUB > 0) + (int)(nLB > 0); insertLPVector(blockptr, pA, (int)i, (int)j); //Insert A matrix into constraint list blockptr->next=constraints[i].blocks; constraints[i].blocks=blockptr; } //Upper Bounds if(nUB) { //Create an A matrix blockptr=(struct sparseblock*)malloc(sizeof(struct sparseblock)); if(blockptr==NULL) { sprintf(msgbuf,"Error allocating memory for UB A[%d]",i); mexErrMsgTxt(msgbuf); } //Insert Bound A matrix entries if(nLB > 0) indub += insertBound(blockptr,ub,nUB,(int)i,2,indub,1.0); //block 2 ([LB,UB,..] 1.0 for ub) else indub += insertBound(blockptr,ub,nUB,(int)i,1,indub,1.0); //block 1 (first block, 1.0 for ub) //Insert A matrix into constraint list blockptr->next=constraints[i].blocks; constraints[i].blocks=blockptr; } //Lower Bounds if(nLB) { //Create an A matrix blockptr=(struct sparseblock*)malloc(sizeof(struct sparseblock)); if(blockptr==NULL) { sprintf(msgbuf,"Error allocating memory for LB A[%d]",i); mexErrMsgTxt(msgbuf); } //Insert Bound A matrix entries indlb += insertBound(blockptr,lb,nLB,(int)i,1,indlb,-1.0); //block 1 (always first block, -1.0 for lb) //Insert A matrix into constraint list blockptr->next=constraints[i].blocks; constraints[i].blocks=blockptr; } } // //Set y0 // if (y0) // for (i=0;i<ndec;i++) { // DSDP_ERR( DSDPSetY0(dsdp,(int)i+1,y0[i]), "Error setting Y0"); // } // //Get CSDP Default Options initparams(¶ms,&printLevel); //Set OPTI default printLevel (none) printLevel = 0; //Get User Options (overwrites defaults above) if(nrhs > eOPTS && !mxIsEmpty(pOPTS)) { //OPTI Options GetIntegerOption(pOPTS,"maxiter",¶ms.maxiter); GetDoubleOption(pOPTS,"maxtime",&maxtime); GetIntegerOption(pOPTS,"display",&printLevel); GetDoubleOption(pOPTS,"objconstant",&objconstant); //CSDP Options GetDoubleOption(pOPTS,"axtol",¶ms.axtol); GetDoubleOption(pOPTS,"atytol",¶ms.atytol); GetDoubleOption(pOPTS,"objtol",¶ms.objtol); GetDoubleOption(pOPTS,"pinftol",¶ms.pinftol); GetDoubleOption(pOPTS,"dinftol",¶ms.dinftol); GetDoubleOption(pOPTS,"minstepfrac",¶ms.minstepfrac); GetDoubleOption(pOPTS,"maxstepfrac",¶ms.maxstepfrac); GetDoubleOption(pOPTS,"minstepp",¶ms.minstepp); GetDoubleOption(pOPTS,"minstepd",¶ms.minstepd); GetIntegerOption(pOPTS,"usexzgap",¶ms.usexzgap); GetIntegerOption(pOPTS,"tweakgap",¶ms.tweakgap); GetIntegerOption(pOPTS,"affine",¶ms.affine); GetDoubleOption(pOPTS,"perturbobj",¶ms.perturbobj); //Optionally write problem to a SDPA sparse file if(mxGetField(pOPTS,0,"writeprob") && !mxIsEmpty(mxGetField(pOPTS,0,"writeprob")) && mxIsChar(mxGetField(pOPTS,0,"writeprob"))) { mxGetString(mxGetField(pOPTS,0,"writeprob"),msgbuf,1024); write_prob(msgbuf,(int)total_dim,(int)ndec,C,b,constraints); } } //Print Header if(printLevel) { mexPrintf("\n------------------------------------------------------------------\n"); mexPrintf(" This is CSDP v%s\n",CSDP_VERSION); mexPrintf(" Author: Brian Borchers\n MEX Interface J. Currie 2013\n\n"); mexPrintf(" Problem Properties:\n"); mexPrintf(" # Decision Variables: %4d\n",ndec); mexPrintf(" # Linear Inequalities: %4d ",nlincon); if(nlincon) mexPrintf("[%d nz]\n",lincon_nz); else mexPrintf("\n"); mexPrintf(" # Semidefinite Cones: %4d\n",ncones); mexPrintf("------------------------------------------------------------------\n"); } //Start timer start = clock(); //Find Initial Solution initsoln((int)total_dim,(int)ndec,C,b,constraints,&X,&y,&Z); //Solve the problem status=easy_sdp((int)total_dim,(int)ndec,C,b,constraints,objconstant,params,&X,&y,&Z,pval,dval,pinf,dinf,realgap,xzgap); //Stop Timer end = clock(); evaltime = ((double)(end-start))/CLOCKS_PER_SEC; //Copy and negate solution for(i=0;i<ndec;i++) x[i] = -y[i+1]; //Assign other MATLAB outputs *iter = (double)citer-1; *exitflag = (double)status; //Print Header if(printLevel){ //Detail termination reason switch(status) { //Success case 0: mexPrintf("\n *** CSDP CONVERGED ***\n"); break; //Infeasible case 1: mexPrintf("\n *** TERMINATION: Primal Infeasible ***\n"); break; case 2: mexPrintf("\n *** TERMINATION: Dual Infeasible ***\n"); break; //Partial Success case 3: mexPrintf("\n *** TERMINATION: PARTIAL SUCESS ***\n *** A Solution is found but full accuracy was not achieved ***\n"); break; //Error case 4: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Maximum Iterations Reached ***\n"); break; case CSDP_MAX_TIME: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Maximum Time Reached ***\n"); break; case 5: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Stuck at edge of primal feasibility ***\n"); break; case 6: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Stuck at edge of dual infeasibility ***\n"); break; case 7: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Lack of progress ***\n"); break; case 8: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: X, Z, or O was singular ***\n"); break; case 9: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Detected NaN or Inf values ***\n"); break; case 10: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Easy-SDP General Failure ***\n"); break; case 11: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Failed C Check - Check Symmetry! ***\n"); break; case 12: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: Failed Constraints Check ***\n"); break; case CSDP_USER_TERMINATION: mexPrintf("\n *** TERMINATION: EARLY EXIT ***\n *** CAUSE: User Exited ***\n"); break; //Here is ok too? default: mexPrintf("\n *** CSDP FINISHED ***\n"); break; } if(status==0 || status==3) mexPrintf("\n Final Primal Objective: %2.5g\n Final Dual Objective: %2.5g\n In %5d iterations\n %5.2f seconds\n",*pval,*dval,citer-1,evaltime); mexPrintf("------------------------------------------------------------------\n\n"); } //Optionally write solution to a SDPA sparse file if(nrhs > eOPTS && !mxIsEmpty(pOPTS) && mxGetField(pOPTS,0,"writesol") && !mxIsEmpty(mxGetField(pOPTS,0,"writesol")) && mxIsChar(mxGetField(pOPTS,0,"writesol"))) { mxGetString(mxGetField(pOPTS,0,"writesol"),msgbuf,1024); write_sol(msgbuf,(int)total_dim,(int)ndec,X,y,Z); } //Optionally retrieve X if(nlhs > 4) { plhs[4] = mxCreateCellMatrix(X.nblocks,1); for(i=0;i<X.nblocks;i++) { //Set Block Values if(X.blocks[i+1].blockcategory == DIAG) { mxSetCell(plhs[4],i,mxCreateDoubleMatrix(X.blocks[i+1].blocksize,1,mxREAL)); //create vector xx = mxGetPr(mxGetCell(plhs[4],i)); for(j=0;j<X.blocks[i+1].blocksize;j++) xx[j] = X.blocks[i+1].data.vec[j+1]; } else { mxSetCell(plhs[4],i,mxCreateDoubleMatrix(X.blocks[i+1].blocksize,X.blocks[i+1].blocksize,mxREAL)); //create matrix xx = mxGetPr(mxGetCell(plhs[4],i)); for(j=0;j<(X.blocks[i+1].blocksize*X.blocks[i+1].blocksize);j++) xx[j] = X.blocks[i+1].data.mat[j]; } } } //Free CSDP Problem (including all allocated memory) free_prob((int)total_dim,(int)ndec,C,b,constraints,X,y,Z); }