36 #ifndef GCG_HYPERGRAPH_DEF_H_
37 #define GCG_HYPERGRAPH_DEF_H_
39 #include "scip/scip.h"
47 ) : name(
"hypergraph"),scip_(scip),graph(NULL),lastnode(0),dummynodes(0)
49 SCIPdebugMessage(
"Creating graph\n");
65 if( i < (
int) nodes.size())
70 SCIPdebugMessage(
"Nodeid %d is %d\n", i, nodeid);
77 int nodeid = lastnode;
78 SCIPdebugMessage(
"Adding node %d (id=%d)\n", i, nodeid);
79 SCIP_CALL( graph->addNode(nodeid, weight) );
80 nodes.push_back(nodeid);
81 mapping.resize(nodeid+1);
91 int edgenodeid = lastnode;
93 SCIPdebugMessage(
"Adding hyperedge %lu (id=%d)\n", hedges.size(), edgenodeid);
94 SCIP_CALL( graph->addNode(edgenodeid, weight) );
96 for(
size_t i = 0; i < edge.size(); ++i )
98 SCIP_CALL( graph->addEdge(edgenodeid, computeNodeId(edge[i])) );
100 hedges.push_back(edgenodeid);
101 mapping.resize(edgenodeid+1);
102 mapping[edgenodeid] = hedges.size()-1;
110 int edgenodeid = hedges[hedge];
111 int nodeid = nodes[node];
112 SCIP_CALL( graph->addEdge(edgenodeid, nodeid) );
125 return hedges.size();
131 return graph->getNNeighbors(i);
137 int nodeid = computeNodeId(i);
138 std::vector<int> edges = graph->getNeighbors(nodeid);
140 std::set<int> neighbors;
141 for(
size_t j = 0; j < edges.size(); ++j )
143 std::vector<int> tempneighbors = graph->getNeighbors(edges[j]);
144 neighbors.insert(tempneighbors.begin(), tempneighbors.end());
146 std::vector<int> r(neighbors.begin(), neighbors.end());
147 for(
size_t j = 0; j < r.size(); ++j)
149 r[j] = mapping[r[j]];
151 std::vector<int>::iterator it = std::remove(r.begin(), r.end(), nodeid);
153 return std::vector<int>(r.begin(), it);
161 std::vector<int> hnodes = graph->getNeighbors(hedges[i]);
162 for(
size_t j = 0; j < hnodes.size(); ++j)
164 hnodes[j] = computeNodeId(hnodes[j]);
174 return graph->getNNeighbors(hedges[i]);
187 SCIP_Bool writeweights
191 file = fdopen(fd,
"w");
193 return SCIP_FILECREATEERROR;
195 SCIPinfoMessage(scip_, file,
"%ld %ld\n", nodes.size()+dummynodes, hedges.size());
197 for(
size_t i = 0; i < hedges.size(); ++i )
199 int nneighbors = graph->getNNeighbors(hedges[i]);
200 std::vector<int> neighbors = graph->getNeighbors(hedges[i]);
204 SCIPinfoMessage(scip_, file,
"%d ", graph->getWeight(i));
206 for(
int j = 0; j < nneighbors; ++j )
208 SCIPinfoMessage(scip_, file,
"%d ", computeNodeId(neighbors[j])+1);
210 SCIPinfoMessage(scip_, file,
"\n");
222 ifstream input(filename);
225 SCIPerrorMessage(
"Could not open file <%s> for reading\n", filename);
226 return SCIP_READERROR;
229 for(
int i = 0; i < getNNodes(); ++i )
232 if( !(input >> part) )
234 SCIPerrorMessage(
"Could not read from file <%s>. It may be in the wrong format\n", filename);
235 return SCIP_READERROR;
250 return graph->getWeight(i);
259 int edgenodeid = hedges[i];
261 return graph->getWeight(edgenodeid);
267 SCIP_CALL( graph->flush() );