Ignore:
Timestamp:
Sep 21, 2006 11:29:23 AM (13 years ago)
Author:
pbonami
Message:

Can add linear cut to nonlinear formulation in Ipopt

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/devel/Bonmin/src/IpoptInterface/TMINLP2TNLP.cpp

    r26 r44  
    227227  void TMINLP2TNLP::setDualsInit(Index n, const Number* duals_init)
    228228  {
    229     DBG_ASSERT(n == m_ + 2 * n_);
     229    DBG_ASSERT(n == m_ );
    230230
    231231    if(!duals_init_)
     
    256256      Index& nnz_h_lag, TNLP::IndexStyleEnum& index_style)
    257257  {
    258     return tminlp_->get_nlp_info(n, m, nnz_jac_g, nnz_h_lag, index_style);
     258    bool return_code = tminlp_->get_nlp_info(n, m, nnz_jac_g, nnz_h_lag, index_style);
     259    m += tminlp_->nLinearCuts_;
     260    nnz_jac_g += tminlp_->linearCutsNnz_;
     261    return return_code;
    259262  }
    260263
     
    264267    IpBlasDcopy(n, x_l_, 1, x_l, 1);
    265268    IpBlasDcopy(n, x_u_, 1, x_u, 1);
    266     IpBlasDcopy(m, g_l_, 1, g_l, 1);
    267     IpBlasDcopy(m, g_u_, 1, g_u, 1);
    268 
     269    IpBlasDcopy(m_, g_l_, 1, g_l, 1);
     270    IpBlasDcopy(m_, g_u_, 1, g_u, 1);
     271    IpBlasDcopy(tminlp_->nLinearCuts_, tminlp_->lower_, 1, &g_l[m_],1);
     272    IpBlasDcopy(tminlp_->nLinearCuts_, tminlp_->upper_, 1, &g_u[m_],1);
    269273    return true;
    270274  }
     
    275279      Number* lambda)
    276280  {
    277     assert(m==m_);
     281    assert(m==m_ + tminlp_->nLinearCuts_);
    278282    assert(n==n_);
    279283    if (init_x == true) {
     
    292296      if(duals_init_ == NULL)
    293297        return false;
    294       IpBlasDcopy(m, duals_init_, 1, lambda, 1);
     298      IpBlasDcopy(m_, duals_init_, 1, lambda, 1);
     299      for(int i = 0 ; i < tminlp_->nLinearCuts_; i++)
     300      {
     301        lambda [i + m_ ] = 0.;
     302      }
    295303    }
    296304
     
    327335      Index m, Number* g)
    328336  {
    329     return tminlp_->eval_g(n, x, new_x, m, g);
     337    int return_code = tminlp_->eval_g(n, x, new_x, m_, g);
     338    // Add the linear cuts
     339    int nnz = 0;
     340    for(int i = 0 ; i < tminlp_->nLinearCuts_ ; i++)
     341    {
     342      int iplusm = m_ + i;
     343      g[iplusm] = 0;
     344      while(tminlp_->iRow_[nnz]==i) { g[iplusm] += tminlp_->elems_[nnz] * x[tminlp_->jCol_[nnz]]; nnz++;}
     345    }
     346    return return_code;
    330347  }
    331348
     
    334351      Index *jCol, Number* values)
    335352  {
    336     return tminlp_->eval_jac_g(n, x, new_x, m, nele_jac, iRow, jCol, values);
     353    int return_code = tminlp_->eval_jac_g(n, x, new_x, m_ , nele_jac - tminlp_->nLinearCuts_,
     354                                          iRow, jCol, values);
     355    bool isFortran = index_style_ == TNLP::FORTRAN_STYLE;
     356    if(iRow != NULL)
     357    {
     358      DBG_ASSERT(iCol != NULL);
     359      DBG_ASSERT(values == NULL)
     360     
     361      int nnz = nele_jac - tminlp_->linearCutsNnz_ ;
     362      for(int i = 0; i < tminlp_->linearCutsNnz_ ; i++ , nnz++)
     363      {
     364         iRow[nnz] = tminlp_->iRow_[i] + m_ + isFortran;
     365         jCol[nnz] = tminlp_->jCol_[i] + isFortran;
     366      }
     367    }
     368    else
     369    {
     370      DBG_ASSERT(iCol == NULL);
     371      DBG_ASSERT(values != NULL);
     372      IpBlasDcopy(tminlp_->linearCutsNnz_ , tminlp_->elems_, 1, &values[nele_jac - tminlp_->linearCutsNnz_],1);
     373    }
     374  return return_code;
    337375  }
    338376
     
    353391  {
    354392    assert(n==n_);
    355     assert(m==m_);
     393    assert(m==m_ + tminlp_->nLinearCuts_);
    356394    if (!x_sol_) {
    357395      x_sol_ = new Number[n];
     
    550588// namespace Ipopt
    551589
    552 
    553 
    554 
    555 
    556 
Note: See TracChangeset for help on using the changeset viewer.