15 #ifndef MAD_QUALEX_INCLUDED
16 #define MAD_QUALEX_INCLUDED
29 #include "bool_vector.h"
30 #include "preproc_clique.h"
31 #include "greedy_clique.h"
59 m_graphOrig->add_edge(u,v);
67 m_graphOrig->remove_edge(u,v);
78 for(i = 0; i < m_graph->n; i++){
82 vector<bool_vector>::iterator bi = m_graph->mates.begin() + i;
83 for(j = 0; j < m_graph->n; j++){
85 m_graph->remove_edge(i,j);
101 m_preselected.clear();
103 m_cliqueWeight = 0.0;
108 m_graph =
new Graph(m_graphOrig->n);
116 u_long * dataSrc = NULL;
117 u_long * dataDst = NULL;
120 for(i = 0; i < m_graphOrig->mates.size(); i++){
121 dataSrc = m_graphOrig->mates[i].data;
122 dataDst = m_graph->mates[i].data;
123 dataSize = m_graph->mates[i].data_size;
124 memcpy(dataDst, dataSrc, dataSize *
sizeof(u_long));
131 vertexWeight + m_graph->n,
132 m_graph->weights.begin());
136 bool forClique =
true){
151 m_preselected_weight = preproc_clique(*m_graph,
158 m_residual.resize(m_graph->n);
159 for(i = 0; i < m_graph->n; i++)
164 printf(
"\npreselected = %d", m_preselected.size());
165 printf(
"\nresidual size = %d", m_residual.size());
166 UtilPrintVector<int>(m_residual);
169 if(!m_residual.empty()){
173 m_info =
new MaxCliqueInfo(*m_graph, forClique);
179 meta_greedy_clique(*m_info);
184 list<int>::iterator it;
185 if(m_info->lower_clique_bound > m_cliqueWeight) {
186 m_cliqueWeight = m_info->lower_clique_bound;
187 m_clique.erase(m_clique.begin(), m_clique.end());
188 for(it = m_info->clique.begin(); it != m_info->clique.end(); it++)
189 m_clique.push_back(m_residual[*it]);
196 m_clique.splice(m_clique.begin(), m_preselected);
197 m_cliqueWeight += m_preselected_weight;
200 printf(
"\npreselected = %d", m_preselected.size());
201 printf(
"\nresidual size = %d", m_residual.size());
202 printf(
"\nm_clique size = %d, wt = %g",
203 m_clique.size(), m_cliqueWeight);
204 UtilPrintVector<int>(m_residual);
205 UtilPrintList<int>(m_clique);
214 if(!m_residual.empty()){
215 printf(
"==== START findMaxIndSetQualexMS\n");
221 double * sqrtw = m_info->sqrtw;
223 memset(m_ijMatrix, 0,
sizeof(
double) * n * n);
224 for(i = 0; i < n; i++) {
225 m_ijMatrix[i*(n+1)] = m_graph->weights[i] - m_info->w_min;
226 bit_iterator bi(m_graph->mates[i]);
227 while((j = bi.next()) > -1) {
230 m_ijMatrix[i*n+j] = m_ijMatrix[j*n+i] = sqrtw[i] * sqrtw[j];
233 qualex_ms(*m_info, m_ijMatrix);
238 list<int>::iterator it;
239 if(m_info->lower_clique_bound > m_cliqueWeight) {
240 m_cliqueWeight = m_info->lower_clique_bound;
241 m_clique.erase(m_clique.begin(), m_clique.end());
242 for(it = m_info->clique.begin(); it != m_info->clique.end(); it++)
243 m_clique.push_back(m_residual[*it]);
249 m_clique.splice(m_clique.begin(), m_preselected);
250 m_cliqueWeight += m_preselected_weight;
253 printf(
"\npreselected = %d", m_preselected.size());
254 printf(
"\nresidual size = %d", m_residual.size());
255 printf(
"\nm_clique size = %d, wt = %g",
256 m_clique.size(), m_cliqueWeight);
257 UtilPrintVector<int>(m_residual);
258 UtilPrintList<int>(m_clique);
261 printf(
"==== END findMaxIndSetQualexMS\n");
270 vector<bool_vector> & mates = G->mates;
271 for(i = 0; i < n; i ++){
272 printf(
"%2d -> ", i);
273 bool_vector & matesI = mates[i];
274 assert(matesI.size == n);
275 for(j = 0; j < matesI.size; j++){
293 m_preselected_weight(0.0),
299 m_ijMatrix =
new double[nVertices * nVertices];
302 m_graphOrig =
new Graph(nVertices);
list< int > m_preselected
void printGraph(Graph *G)
MAD_Qualex(const int nVertices)
adjacency_list< vecS, vecS, undirectedS, no_property, edge_prop > Graph
#define CoinAssertHint(expression, hint)
void findMaxIndSetGreedy(const double *vertexWeight, bool forClique=true)
void findMaxIndSetQualexMS()
void addEdge(const int u, const int v)
void removeEdge(const int u, const int v)
#define CoinAssert(expression)
double m_preselected_weight
void removeNonNegVertices(const double *weights)
void setUpForSolve(const double *vertexWeight)