94 uint32_t vertex_num = boost::num_vertices(this->
m_graph);
95 uint32_t edge_num = boost::num_edges(this->
m_graph);
96 uint32_t vertex_variable_num = vertex_num<<1;
98 boost::unordered_map<graph_edge_type, uint32_t, edge_hash_type> hEdgeIdx;
101 edge_iterator_type ei, eie;
102 for (boost::tie(ei, eie) = boost::edges(this->
m_graph); ei != eie; ++ei, ++cnt)
106 model_type opt_model;
111 std::vector<model_type::variable_type> vVertexBit;
112 std::vector<model_type::variable_type> vEdgeBit;
121 vVertexBit.reserve(vertex_variable_num);
122 for (uint32_t i = 0; i != vertex_variable_num; ++i)
124 uint32_t vertex_idx = (i>>1);
125 std::ostringstream oss;
130 if ((i&1) == 0) color_bit = (this->
m_vColor[vertex_idx]>>1)&1;
131 else color_bit = this->
m_vColor[vertex_idx]&1;
139 vEdgeBit.reserve(edge_num);
140 for (uint32_t i = 0; i != edge_num; ++i)
142 std::ostringstream oss;
149 for (boost::tie(ei, eie) = edges(this->
m_graph); ei != eie; ++ei)
151 edge_weight_type w = boost::get(boost::edge_weight, this->
m_graph, *ei);
153 obj += w*vEdgeBit[hEdgeIdx[*ei]];
161 uint32_t constr_num = 0;
162 for (boost::tie(ei, eie) = boost::edges(this->
m_graph); ei != eie; ++ei)
164 graph_vertex_type s = boost::source(*ei, this->
m_graph);
165 graph_vertex_type t = boost::target(*ei, this->
m_graph);
167 uint32_t vertex_idx1 = s<<1;
168 uint32_t vertex_idx2 = t<<1;
170 edge_weight_type w = boost::get(boost::edge_weight, this->
m_graph, *ei);
171 uint32_t edge_idx = hEdgeIdx[*ei];
174 string tmpConstr_name;
177 sprintf(buf,
"R%u", constr_num++);
179 vVertexBit[vertex_idx1] + vVertexBit[vertex_idx1+1]
180 + vVertexBit[vertex_idx2] + vVertexBit[vertex_idx2+1]
181 + vEdgeBit[edge_idx] >= 1
184 sprintf(buf,
"R%u", constr_num++);
186 - vVertexBit[vertex_idx1] + vVertexBit[vertex_idx1+1]
187 - vVertexBit[vertex_idx2] + vVertexBit[vertex_idx2+1]
188 + vEdgeBit[edge_idx] >= -1
191 sprintf(buf,
"R%u", constr_num++);
193 vVertexBit[vertex_idx1] - vVertexBit[vertex_idx1+1]
194 + vVertexBit[vertex_idx2] - vVertexBit[vertex_idx2+1]
195 + vEdgeBit[edge_idx] >= -1
198 sprintf(buf,
"R%u", constr_num++);
200 - vVertexBit[vertex_idx1] - vVertexBit[vertex_idx1+1]
201 - vVertexBit[vertex_idx2] - vVertexBit[vertex_idx2+1]
202 + vEdgeBit[edge_idx] >= -3
208 sprintf(buf,
"R%u", constr_num++);
210 vVertexBit[vertex_idx1] - vVertexBit[vertex_idx2] - vEdgeBit[edge_idx] <= 0
213 sprintf(buf,
"R%u", constr_num++);
215 vVertexBit[vertex_idx2] - vVertexBit[vertex_idx1] - vEdgeBit[edge_idx] <= 0
218 sprintf(buf,
"R%u", constr_num++);
220 vVertexBit[vertex_idx1+1] - vVertexBit[vertex_idx2+1] - vEdgeBit[edge_idx] <= 0
223 sprintf(buf,
"R%u", constr_num++);
225 vVertexBit[vertex_idx2+1] - vVertexBit[vertex_idx1+1] - vEdgeBit[edge_idx] <= 0
234 for(uint32_t k = 0; k != vertex_variable_num; k += 2)
236 sprintf(buf,
"R%u", constr_num++);
237 opt_model.
addConstraint(vVertexBit[k] + vVertexBit[k+1] <= 1, buf);
242 solver_type solver (&opt_model);
243 int32_t opt_status = solver(&gurobiParams);
244#ifdef DEBUG_ILPCOLORING
245 opt_model.
print(
"graph.lp");
250 cout <<
"ERROR: The model is infeasible... EXIT" << endl;
254#ifdef DEBUG_ILPCOLORING
259 for (uint32_t k = 0; k != vertex_variable_num; k += 2)
262 uint32_t vertex_idx = (k>>1);
265 if (this->
m_vColor[vertex_idx] >= 0 && this->
m_vColor[vertex_idx] < this->m_color_num)
279 std::ofstream out((filename+
".gv").c_str());
280 out <<
"graph D { \n"
282 <<
" size=\"4, 3\"\n"
283 <<
" ratio=\"fill\"\n"
284 <<
" edge[style=\"bold\",fontsize=200]\n"
285 <<
" node[shape=\"circle\",fontsize=200]\n";
288 uint32_t vertex_num = boost::num_vertices(this->
m_graph);
289 for(uint32_t k = 0; k < vertex_num; ++k)
291 out <<
" " << k <<
"[shape=\"circle\"";
298 edge_iterator_type ei, eie;
299 for (boost::tie(ei, eie) = boost::edges(this->
m_graph); ei != eie; ++ei)
301 edge_weight_type w = boost::get(boost::edge_weight, this->
m_graph, *ei);
302 graph_vertex_type s = boost::source(*ei, this->
m_graph);
303 graph_vertex_type t = boost::target(*ei, this->
m_graph);
310 out <<
" " << s <<
"--" << t <<
"[color=\"red\",style=\"solid\",penwidth=3]\n";
312 out <<
" " << s <<
"--" << t <<
"[color=\"black\",style=\"solid\",penwidth=3]\n";
315 out <<
" " << s <<
"--" << t <<
"[color=\"blue\",style=\"dotted\",penwidth=3]\n";
319 la::graphviz2pdf(filename);