/* * This file is a component of SDPA * Copyright (C) 2004-2013 SDPA Project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * SDPA-M: 7.3 * mexsdpa.cpp */ #include /* * SDPA header files */ #include #include using namespace sdpa; extern void _main(); void sdpasolver(mxArray* At_ptr, mxArray* b_ptr, mxArray* c_ptr, mxArray* K_ptr, mxArray* OPTION_ptr, mxArray* x_ptr, mxArray* y_ptr, mxArray* info_ptr) { time_t ltime; time(<ime); char string_time[1024]; strcpy(string_time,ctime(<ime)); string_time[strlen(string_time)-1]='\0'; SDPA sdpa; int maxIteration = 0; double param = 0.0; /* mxArray pointer */ mxArray *field_ptr = NULL; int nSymmChk = 0; int nDimacs = 0; /* strings for phase value */ const char *szPhase[] = { "noINFO", "pFEAS", "dFEAS", "pdFEAS", "pdINF", "pFEAS_dINF", "pINF_dFEAS", "pdOPT", "pUNBD", "dUNBD"}; /* output file */ char *outfile = NULL; FILE *fp = NULL; FILE *fpResult = NULL; int nOutfile = 0; mwSize mDIM; mwSize nBLOCK; /* temporary variables */ mwIndex k; int size; mwSize mwsize; double *tmp_ptr = NULL; char* tmpPrint = NULL; TimeStart(SDPA_START); TimeStart(SDPA_CONVERT_START); /*** Set SDPA parameters by OPTIONS ***/ /* Max Iteration */ field_ptr = mxGetField(OPTION_ptr, 0, "maxIteration"); if( field_ptr != NULL ){ maxIteration = (int)mxGetScalar(field_ptr); // mexPrintf("maxIteration = %d\n",maxIteration); sdpa.setParameterMaxIteration(maxIteration); } /* epsilonStar */ field_ptr = mxGetField(OPTION_ptr, 0, "epsilonStar"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterEpsilonStar(param); } /* lambdaStar */ field_ptr = mxGetField(OPTION_ptr, 0, "lambdaStar"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterLambdaStar(param); } /* omegaStar */ field_ptr = mxGetField(OPTION_ptr, 0, "omegaStar"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterOmegaStar(param); } /* lowerBound */ field_ptr = mxGetField(OPTION_ptr, 0, "lowerBound"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterLowerBound(param); } /* upperBound */ field_ptr = mxGetField(OPTION_ptr, 0, "upperBound"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterUpperBound(param); } /* betaStar */ field_ptr = mxGetField(OPTION_ptr, 0, "betaStar"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterBetaStar(param); } /* betaBar */ field_ptr = mxGetField(OPTION_ptr, 0, "betaBar"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterBetaBar(param); } /* gammaStar */ field_ptr = mxGetField(OPTION_ptr, 0, "gammaStar"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterGammaStar(param); } /* epsilonDash */ field_ptr = mxGetField(OPTION_ptr, 0, "epsilonDash"); if( field_ptr != NULL ){ param = *mxGetPr(field_ptr); sdpa.setParameterEpsilonDash(param); } /* xPrint */ field_ptr = mxGetField(OPTION_ptr, 0, "xPrint"); if( field_ptr != NULL ){ mwsize = mxGetM(field_ptr) * mxGetN(field_ptr) + 1; tmpPrint = (char*)mxCalloc(mwsize, sizeof(char)); mxGetString(field_ptr, tmpPrint, mwsize); sdpa.setParameterPrintXVec(tmpPrint); mxFree(tmpPrint); } /* XPrint */ field_ptr = mxGetField(OPTION_ptr, 0, "XPrint"); if( field_ptr != NULL ){ mwsize = mxGetM(field_ptr) * mxGetN(field_ptr) + 1; tmpPrint = (char*)mxCalloc(mwsize, sizeof(char)); mxGetString(field_ptr, tmpPrint, mwsize); sdpa.setParameterPrintXMat(tmpPrint); mxFree(tmpPrint); } /* YPrint */ field_ptr = mxGetField(OPTION_ptr, 0, "YPrint"); if( field_ptr != NULL ){ mwsize = mxGetM(field_ptr) * mxGetN(field_ptr) + 1; tmpPrint = (char*)mxCalloc(mwsize, sizeof(char)); mxGetString(field_ptr, tmpPrint, mwsize); sdpa.setParameterPrintYMat(tmpPrint); mxFree(tmpPrint); } /* infPrint */ field_ptr = mxGetField(OPTION_ptr, 0, "infPrint"); if( field_ptr != NULL ){ mwsize = mxGetM(field_ptr) * mxGetN(field_ptr) + 1; tmpPrint = (char*)mxCalloc(mwsize, sizeof(char)); mxGetString(field_ptr, tmpPrint, mwsize); sdpa.setParameterPrintInformation(tmpPrint); mxFree(tmpPrint); } /* isSymmetric */ field_ptr = mxGetField(OPTION_ptr, 0, "isSymmetric"); if( field_ptr != NULL ){ nSymmChk = (int)mxGetScalar(field_ptr); } /* isDimacs */ field_ptr = mxGetField(OPTION_ptr, 0, "isDimacs"); if( field_ptr != NULL ){ nDimacs = (int)mxGetScalar(field_ptr); } /* print */ field_ptr = mxGetField(OPTION_ptr, 0, "print"); if( field_ptr != NULL ){ mwsize = mxGetM(field_ptr) * mxGetN(field_ptr) + 1; if (mwsize == 1) { // mexPrintf("display is NULL\n"); fp = NULL; } else { outfile = (char*)mxCalloc(mwsize, sizeof(char)); mxGetString(field_ptr, outfile, mwsize); if( strncmp("display", outfile, mwsize - 1) == 0 ){ fp = stdout; } else if( strncmp("no", outfile, mwsize - 1) == 0 ){ fp = NULL; } else { fp = fopen(outfile, "at"); if( fp == NULL ){ mexPrintf("Failed to open %s\n", outfile); fp = stdout; } else { nOutfile = 1; } } mxFree(outfile); } } else { /* default setting is displaying information to stdout */ fp = stdout; } sdpa.setDisplay(fp); /* resultFile */ field_ptr = mxGetField(OPTION_ptr, 0, "resultFile"); if( field_ptr != NULL ){ mwsize = mxGetM(field_ptr) * mxGetN(field_ptr) + 1; if (mwsize == 1) { // mexPrintf("resultFile is NULL\n"); } else { outfile = (char*)mxCalloc(mwsize, sizeof(char)); mxGetString(field_ptr, outfile, mwsize); if ( strncmp("no", outfile, mwsize - 1) == 0 ) { mexPrintf("resultFile is NULL\n"); } else { fpResult = fopen(outfile, "w"); if ( fpResult == NULL ) { mexPrintf("Failed to open %s\n", outfile); mexPrintf("Skip the detail file\n"); } else { sdpa.setResultFile(fpResult); } } mxFree(outfile); } } if (fp) { fprintf(fp,"SDPA-C start at [%s]\n",string_time); } if (fpResult) { fprintf(fpResult,"SDPA-C start at [%s]\n",string_time); } if (nDimacs != 0) { if (sdpa.judgeDimacsAvailability() == false) { if (fp) { fprintf(fp, "Dimacs will be skipped by XPrint and YPrint parameter.\n"); } if (fpResult) { fprintf(fpResult, "Dimacs will be skipped by XPrint and YPrint parameter.\n"); } nDimacs = 0; } } /* NumThreads */ field_ptr = mxGetField(OPTION_ptr, 0, "NumThreads"); if( field_ptr != NULL ){ sdpa.setNumThreads((int)mxGetScalar(field_ptr)); } /*** initialize SDPA class members ***/ /* mDIM */ mDIM = mxGetN(At_ptr); sdpa.inputConstraintNumber(mDIM); /* nBLOCK */ nBLOCK = 0; mwSize K_l = 0; int isK_l = 0; // 1 (K_l > 0) or 0 (K_l == 0) field_ptr = mxGetField(K_ptr, 0, "l"); if (field_ptr != NULL) { K_l = (mwSize)((mxGetPr(field_ptr))[0]); #if 0 mexPrintf("K_l = %zd\n", K_l); #endif if (K_l > 0) { isK_l = 1; nBLOCK++; } } mwSize* K_s = NULL; mwSize* K_sdpConeStart = NULL; int K_sdpNoCones = 0; field_ptr = mxGetField(K_ptr, 0, "s"); if (field_ptr != NULL) { K_sdpNoCones = (int) mxGetM(field_ptr); K_s = (mwSize*) mxCalloc(K_sdpNoCones, sizeof(mwSize)); K_sdpConeStart = (mwSize*) mxCalloc(K_sdpNoCones+1, sizeof(mwSize)); K_sdpConeStart[0] = 0; for (int l=0; l 0) { sdpa.inputBlockSize(1, K_l); sdpa.inputBlockType(1, SDPA::LP); } for (int l=0; l 0) { size = sdpa.getBlockSize(1); tmp_ptr = sdpa.getResultYMat(1); for (int index = 0; index < size; ++index) { x[index] = tmp_ptr[index]; } } for (int l=0; l