3 #ifndef ILP_CONTIG_JUMPS_HPP
4 #define ILP_CONTIG_JUMPS_HPP
6 #include "solv/ilp_common.hpp"
9 namespace scaffold {
namespace solv {
namespace ilp {
12 void respect_jump_dependencies(IloModel& model,
const IloEnv& env, var_collection_multi& vars,
const ScafVPairDependencyMap& dependencies)
17 DEBUG5(std::cout <<
"adding contig-jump-shortcut constraints: if we take an added shortcut, we should also take its dependency"<<std::endl);
18 for(
const auto& dlist: dependencies){
19 const ScafVertexPair& uv = dlist.first;
20 const auto& uv_dep_list = dlist.second;
23 IloExpr rev_expr(env);
24 for(
const auto& uv_dep_edge: uv_dep_list){
25 expr += vars.times_used.at(uv_dep_edge);
26 rev_expr += vars.times_used.at(
reverse(uv_dep_edge));
29 expr -= vars.times_used.at(uv);
30 rev_expr -= vars.times_used.at(
reverse(uv));
38 void construct_jumps_for_VPair(IloModel& model,
40 var_collection_multi& vars,
41 const ScafVertexPair& uv,
43 const ScafVertexPairSet& target_set)
45 const Instance& I = vars.I;
46 assert(uv_length != NO_LENGTH);
47 assert(!target_set.empty());
48 assert(!I.is_matching_edge(uv));
51 const ScafVertex& u = uv.first;
52 const ScafVertex& v = uv.second;
53 const unsigned uv_multi = I[uv].multiplicity;
54 DEBUG5(std::cout <<
"constructing jump for "<<I[u].name<<
"->"<<I[v].name<<std::endl;)
58 IloExpr overall_uv_jumps(env);
59 for(
const ScafVertexPair& xy: target_set){
60 const ScafVertex& x = xy.first;
61 const ScafVertex& y = xy.second;
62 const unsigned xy_multi = I[xy].multiplicity;
65 IloNumVar uv_jumps_xy(env, 0, xy_multi, IloNumVar::Int);
68 used_ux += vars.times_used.at(ScafVertexPair(u, x));
69 used_ux -= uv_jumps_xy;
73 used_yv += vars.times_used.at(ScafVertexPair(y, v));
74 used_yv -= uv_jumps_xy;
78 overall_uv_jumps += uv_jumps_xy;
81 const std::string uv_jump_name((std::string)
"jump_" + I[u].name +
"," + I[v].name);
82 const auto uv_jump_var_iter = vars.contig_jumps.emplace(std::piecewise_construct, std::make_tuple(u,v), std::make_tuple(env, 0, uv_multi, IloNumVar::Int, uv_jump_name.c_str())).first;
83 overall_uv_jumps -= uv_jump_var_iter->second;
84 c.add(overall_uv_jumps >= 0);
Definition: read_adj_list.hpp:22
std::pair< B, A > reverse(const std::pair< A, B > &p)
reverse a pair of things, that is, turn (x,y) into (y,x)
Definition: utils.hpp:213