Esempio n. 1
0
//Add SDP Constraint
int addSDPCone(SDPCone sdpcone, const mxArray *cone, int block, double *X)
{
    int i;
    double *SDP_pr  = mxGetPr(cone);
    mwIndex *SDP_ir = mxGetIr(cone);    
    mwIndex *SDP_jc = mxGetJc(cone);
    int *iSDP_ir    = NULL;
    int SDP_M       = (int)mxGetM(cone);
    int SDP_N       = (int)mxGetN(cone); //remember [C A0 A1 A2...] so non-square    
    int SDP_C_nnz   = 0; //nnz in C
    int SDP_A_nnz   = 0; //nnz in current A 
    int SDP_A_index = 0; //start index of pr and ir within current A
    int SDP_DIM     = (int)(sqrt(2*(double)SDP_M + 0.25) - 0.5); //calculate dimension based on rows (lower tri)
    
    #if DEBUG
        mexPrintf("SDP_DIM: %d, M: %d, N: %d\n",SDP_DIM,SDP_M,SDP_N);
    #endif
    //Copy cast ir
    iSDP_ir = (int*)mxCalloc(SDP_jc[SDP_N],sizeof(int));
    for(i=0;i<(int)SDP_jc[SDP_N];i++)
        iSDP_ir[i] = (int)SDP_ir[i];
        
    //Set Cone Size
    DSDP_ERR( SDPConeSetBlockSize(sdpcone,block,(int)SDP_DIM), "Error setting cone dimensions"); 
    DSDP_ERR( SDPConeUsePackedFormat(sdpcone, block), "Error setting cone packed format");
    DSDP_ERR( SDPConeSetSparsity(sdpcone,block,(int)SDP_jc[SDP_N]), "Error setting cone sparsity nnz");
    //Add C
    SDP_C_nnz = (int)(SDP_jc[1]-SDP_jc[0]); 
    #if DEBUG
        mexPrintf("C nnz: %d\n",SDP_C_nnz);
    #endif
    DSDP_ERR( SDPConeSetASparseVecMat(sdpcone,block,0,SDP_DIM,1.0,0,iSDP_ir,SDP_pr,SDP_C_nnz), "Error setting cone C matrix");
    //Add Each A
    SDP_A_index = SDP_C_nnz; //set index to elements after C
    for(i=1;i<SDP_N;i++) {
        SDP_A_nnz = (int)(SDP_jc[i+1]-SDP_jc[i]);  
        #if DEBUG
            mexPrintf("A[%d] nnz: %d, A index: %d, pr[0] =  %f ir[0] = %d\n",i-1,SDP_A_nnz,SDP_A_index,SDP_pr[SDP_A_index],iSDP_ir[SDP_A_index]);
        #endif
        DSDP_ERR( SDPConeSetASparseVecMat(sdpcone,block,i,SDP_DIM,1.0,0,&iSDP_ir[SDP_A_index],&SDP_pr[SDP_A_index],SDP_A_nnz), "Error setting cone A matrix");
        SDP_A_index += SDP_A_nnz; //shift index forward
    }
    //Add X Vector if supplied
    if(X != NULL)
        DSDP_ERR( SDPConeSetXArray(sdpcone,block, SDP_DIM, X, SDP_M), "Error Setting SDPCone X Array" );
    return SDP_DIM;
    //Do not free memory here, MATLAB will take care of it once MEX completes (DSDP will use it during solving)  [See MATLAB/User's Guide/C/C++ and Fortran API Reference/mxFree] 
}
Esempio n. 2
0
void DSDPInternal::evaluate(int nfdir, int nadir) {
    int info;

    // Copy b vector
    for (int i=0; i<m_; ++i) {
        info = DSDPSetDualObjective(dsdp_, i+1, -input(SDP_B).at(i));
    }

    // Get Ai from supplied A
    mapping_.setInput(input(SDP_C),0);
    mapping_.setInput(input(SDP_A),1);
    // Negate because the standard form in PSDP is different
    std::transform(mapping_.input(0).begin(), mapping_.input(0).end(), mapping_.input(0).begin(), std::negate<double>());
    std::transform(mapping_.input(1).begin(), mapping_.input(1).end(), mapping_.input(1).begin(), std::negate<double>());
    mapping_.evaluate();

    for (int i=0; i<m_+1; ++i) {
        for (int j=0; j<nb_; ++j) {
            mapping_.output(i*nb_+j).get(values_[i][j],SPARSESYM);
            info = SDPConeSetASparseVecMat(sdpcone_, j, i, block_sizes_[j], 1, 0, &pattern_[i][j][0], &values_[i][j][0], pattern_[i][j].size() );
        }
    }

    info = DSDPSetup(dsdp_);
    info = DSDPSolve(dsdp_);

    casadi_assert_message(info==0,"DSDPSolver failed");


    DSDPTerminationReason reason;
    DSDPStopReason(dsdp_, &reason);
    std::cout << "Termination reason: " << (*terminationReason_.find(reason)).second << std::endl;

    DSDPSolutionType pdfeasible;
    DSDPGetSolutionType(dsdp_,&pdfeasible);
    std::cout << "Solution type: " << (*solutionType_.find(pdfeasible)).second << std::endl;

    info = DSDPGetY(dsdp_,&output(SDP_PRIMAL).at(0),m_);

    double temp;
    DSDPGetDDObjective(dsdp_, &temp);
    output(SDP_PRIMAL_COST).set(-temp);
    DSDPGetPPObjective(dsdp_, &temp);
    output(SDP_DUAL_COST).set(-temp);

    if (calc_dual_) {
        for (int j=0; j<nb_; ++j) {
            info = SDPConeComputeX(sdpcone_, j, block_sizes_[j], &store_X_[j][0], store_X_[j].size());
            Pmapper_.input(j).set(store_X_[j],SPARSESYM);
        }
        Pmapper_.evaluate();
        std::copy(Pmapper_.output().data().begin(),Pmapper_.output().data().end(),output(SDP_DUAL).data().begin());
    }

    if (calc_p_) {
        for (int j=0; j<nb_; ++j) {
            info = SDPConeComputeS(sdpcone_, j, 1.0,  &output(SDP_PRIMAL).at(0), m_, 0, block_sizes_[j] , &store_P_[j][0], store_P_[j].size());
            Pmapper_.input(j).set(store_P_[j],SPARSESYM);
        }
        Pmapper_.evaluate();
        std::copy(Pmapper_.output().data().begin(),Pmapper_.output().data().end(),output(SDP_PRIMAL_P).data().begin());
    }



}