13 #ifndef __defined_libdai_bipgraph_h
14 #define __defined_libdai_bipgraph_h
48 std::vector<Neighbors>
_nb1;
51 std::vector<Neighbors>
_nb2;
78 template<
typename EdgeInputIterator>
80 construct( nrNodes1, nrNodes2, begin, end, check );
103 return _nb2[i2][_i1];
109 return _nb2[i2][_i1];
145 template<
typename EdgeInputIterator>
162 template <
typename NodeInputIterator>
163 size_t addNode1( NodeInputIterator begin, NodeInputIterator end,
size_t sizeHint = 0 ) {
165 nbs1new.reserve( sizeHint );
167 for( NodeInputIterator it = begin; it != end; ++it ) {
171 nbs1new.push_back( nb1new );
172 nb2( *it ).push_back( nb2new );
174 _nb1.push_back( nbs1new );
175 return _nb1.size() - 1;
185 template <
typename NodeInputIterator>
186 size_t addNode2( NodeInputIterator begin, NodeInputIterator end,
size_t sizeHint = 0 ) {
188 nbs2new.reserve( sizeHint );
190 for( NodeInputIterator it = begin; it != end; ++it ) {
194 nbs2new.push_back( nb2new );
195 nb1( *it ).push_back( nb1new );
197 _nb2.push_back( nbs2new );
198 return _nb2.size() - 1;
229 for(
size_t i1 = 0; i1 <
nrNodes1(); i1++ )
230 sum +=
nb1(i1).size();
238 if(
nb1(n1).size() <
nb2(n2).size() ) {
239 for(
size_t _n2 = 0; _n2 <
nb1(n1).size(); _n2++ )
240 if(
nb1( n1, _n2 ) == n2 )
243 for(
size_t _n1 = 0; _n1 <
nb2(n2).size(); _n1++ )
244 if(
nb2( n2, _n1 ) == n1 )
255 for(
size_t _n2 = 0; _n2 <
nb1(n1).size(); _n2++ )
256 if(
nb1( n1, _n2 ) == n2 )
258 DAI_THROW(OBJECT_NOT_FOUND);
259 return nb1(n1).size();
267 for(
size_t _n1 = 0; _n1 <
nb2(n2).size(); _n1++ )
268 if(
nb2( n2, _n1 ) == n1 )
270 DAI_THROW(OBJECT_NOT_FOUND);
271 return nb2(n2).size();
308 for(
size_t n1 = 0; n1 <
nrNodes1(); n1++ ) {
309 if(
nb1(n1).size() != x.
nb1(n1).size() )
328 void printDot( std::ostream& os )
const;
339 template<
typename EdgeInputIterator>
342 _nb1.resize( nrNodes1 );
344 _nb2.resize( nrNodes2 );
346 for( EdgeInputIterator e = begin; e != end; e++ )
347 addEdge( e->first, e->second, check );