ipcomp.cpp 2.3 KB
#include <iostream>
#include <time.h>
#include <cfloat>
#include <tuple>
#include <algorithm>

#include "ipcomp.h"


Ipcomp::Ipcomp(const std::vector < unsigned int > &v,
               const std::vector < float > &w,
               const std::vector < std::vector < unsigned int > > &NvBs,
               unsigned int ncores)
{
    vertices = std::vector < unsigned int > (v);
    weights = std::vector < float > (w);
    NvB = std::vector < std::vector < unsigned int > > (NvBs);
    ip_ = new IP(IP::MIN, int(ncores));

    /*creating variables and objective function*/
    for(size_t i=0, size = vertices.size(); i != size; i++)
    {
        v_.push_back(ip_->make_variable(double(weights[vertices[i]])));
    }
    ip_->update();

    /*creating constraints*/

    /*for each vertice*/
    for (size_t i = 0, size = vertices.size(); i != size; i++)
    {
        //std::cout << "i =  " << i << std::endl;
        int row = ip_->make_constraint(IP::UP, 0, double(NvB[i].size()));
        ip_->add_constraint(row, v_[i], double(NvB[i].size()));

        for (size_t j = 0, size2 = NvB[i].size(); j != size2; j++)
        {
            ip_->add_constraint(row, v_[NvB[i][j]], 1);
        }
    }

}

Ipcomp::~Ipcomp()
{
    delete ip_;
}

void Ipcomp::add_bj_ct(std::vector< unsigned int > c)
{

    int row = ip_->make_constraint(IP::LO, 0, 0);
    int B(0);
    for(size_t i = 0, size = vertices.size(); i != size; i++)
    {
        if(std::find(c.begin(), c.end(), int(i)) != c.end())
        {
            ip_->add_constraint(row, v_[i], 1);
            B++;
        }
        else
        {
            ip_->add_constraint(row, v_[i], -1);
        }
    }
    ip_->chg_constraint(row, IP::UP, -DBL_MAX, B-1);
}

int Ipcomp::solve(std::vector< unsigned int > &c, float &score)
{
    time_t start, end;  /* returns elapsed time in sec */
    double total_time;
    start = clock();

    int status = ip_->solve();

    end = clock();
    total_time = double(end - start)/double(CLOCKS_PER_SEC);

    printf( "\nElapsed time SOLVE IP: %0.3f \n", total_time );

    if(status == 0){

        score = float(ip_->get_obj());

        //recover decision variable values
        for(size_t i=0, size = v_.size(); i != size; i++)
        {
            if(ip_->get_value(v_[i]) > 0.5)
                c.push_back(uint(i));
        }
    }
    return 	status;
}