Ticket #597: 597-1-120b9031eada-merge-tests.patch
File 597-1-120b9031eada-merge-tests.patch, 22.7 KB (added by , 7 years ago) |
---|
-
test/CMakeLists.txt
# HG changeset patch # User Peter Kovacs <kpeter@inf.elte.hu> # Date 1507328045 -7200 # Node ID 120b9031eadac340f6078b85d9bcb43c9342bc93 # Parent 3feba0ea1bdac112e99996191ebe7760d5480f1b Merge tests of VF2 and VF2++ (#597) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
a b 55 55 tsp_test 56 56 unionfind_test 57 57 vf2_test 58 vf2pp_test59 58 ) 60 59 61 60 IF(LEMON_HAVE_LP) -
test/vf2_test.cc
diff --git a/test/vf2_test.cc b/test/vf2_test.cc
a b 16 16 */ 17 17 18 18 #include <lemon/vf2.h> 19 #include <lemon/vf2pp.h> 19 20 #include <lemon/concepts/digraph.h> 20 21 #include <lemon/smart_graph.h> 21 22 #include <lemon/lgf_reader.h> … … 152 153 void make_graphs() { 153 154 std::stringstream ss(petersen_lgf); 154 155 graphReader(petersen, ss) 155 .nodeMap("col1", petersen_col1)156 .nodeMap("col2", petersen_col2)156 .nodeMap("col1", petersen_col1) 157 .nodeMap("col2", petersen_col2) 157 158 .run(); 158 159 159 160 ss.clear(); 160 161 ss.str(""); 161 ss <<c5_lgf;162 ss << c5_lgf; 162 163 //std::stringstream ss2(c5_lgf); 163 164 graphReader(c5, ss) 164 .nodeMap("col", c5_col)165 .nodeMap("col", c5_col) 165 166 .run(); 166 167 167 168 ss.clear(); 168 169 ss.str(""); 169 ss <<c7_lgf;170 ss << c7_lgf; 170 171 graphReader(c7, ss).run(); 171 172 172 173 ss.clear(); 173 174 ss.str(""); 174 ss <<c10_lgf;175 ss << c10_lgf; 175 176 graphReader(c10, ss).run(); 176 177 177 178 ss.clear(); 178 179 ss.str(""); 179 ss <<p10_lgf;180 ss << p10_lgf; 180 181 graphReader(p10, ss).run(); 181 182 182 183 } … … 196 197 } 197 198 }; 198 199 200 class IntConvertible1 { 201 public: 202 operator int() { 203 return 0; 204 } 205 }; 206 207 class IntConvertible2 { 208 public: 209 operator int() { 210 return 0; 211 } 212 }; 213 199 214 template<class G1,class G2> 200 215 void checkVf2Compile() { 201 216 G1 g; … … 224 239 .mapping(r).run(); 225 240 } 226 241 227 void justCompile() {242 void vf2Compile() { 228 243 checkVf2Compile<concepts::Graph,concepts::Graph>(); 229 244 checkVf2Compile<concepts::Graph,SmartGraph>(); 230 245 checkVf2Compile<SmartGraph,concepts::Graph>(); 231 246 } 232 247 233 template<class G1, class G2, class I> 234 void checkSub(const G1 &g1, const G2 &g2, const I &i) { 235 { 236 std::set<typename G2::Node> image; 237 for(typename G1::NodeIt n(g1);n!=INVALID;++n){ 238 check(i[n]!=INVALID, "Wrong isomorphism: incomplete mapping."); 239 check(image.count(i[n])==0,"Wrong isomorphism: not injective."); 240 image.insert(i[n]); 241 } 242 } 243 for(typename G1::EdgeIt e(g1);e!=INVALID;++e) 244 check(findEdge(g2,i[g1.u(e)],i[g1.v(e)])!=INVALID, 245 "Wrong isomorphism: missing edge(checkSub)."); 248 template<class G1,class G2> 249 void checkVf2ppCompile() { 250 G1 g; 251 G2 h; 252 concepts::ReadWriteMap<typename G1::Node, typename G2::Node> r; 253 bool succ; 254 ::lemon::ignore_unused_variable_warning(succ); 255 256 succ = vf2pp(g,h).run(); 257 succ = vf2pp(g,h).induced().run(); 258 succ = vf2pp(g,h).iso().run(); 259 succ = vf2pp(g,h).mapping(r).run(); 260 succ = vf2pp(g,h).induced().mapping(r).run(); 261 succ = vf2pp(g,h).iso().mapping(r).run(); 262 263 concepts::ReadMap<typename G1::Node, int> c1; 264 concepts::ReadMap<typename G2::Node, int> c2; 265 Vf2pp<G1,G2,concepts::ReadWriteMap<typename G1::Node, typename G2::Node>, 266 concepts::ReadMap<typename G1::Node, int>, 267 concepts::ReadMap<typename G2::Node, int> > 268 myVf2pp(g,h,r,c1,c2); 269 myVf2pp.find(); 270 271 succ = vf2pp(g,h).nodeLabels(c1,c2).mapping(r).run(); 272 succ = vf2pp(g,h).nodeLabels(c1,c2).mapping(r).run(); 273 274 concepts::ReadMap<typename G1::Node, char> c1_c; 275 concepts::ReadMap<typename G2::Node, char> c2_c; 276 Vf2pp<G1,G2,concepts::ReadWriteMap<typename G1::Node, typename G2::Node>, 277 concepts::ReadMap<typename G1::Node, char>, 278 concepts::ReadMap<typename G2::Node, char> > 279 myVf2pp_c(g,h,r,c1_c,c2_c); 280 myVf2pp_c.find(); 281 282 succ = vf2pp(g,h).nodeLabels(c1_c,c2_c).mapping(r).run(); 283 succ = vf2pp(g,h).nodeLabels(c1_c,c2_c).mapping(r).run(); 284 285 concepts::ReadMap<typename G1::Node, IntConvertible1> c1_IntConv; 286 concepts::ReadMap<typename G2::Node, IntConvertible2> c2_IntConv; 287 Vf2pp<G1,G2,concepts::ReadWriteMap<typename G1::Node, typename G2::Node>, 288 concepts::ReadMap<typename G1::Node, IntConvertible1>, 289 concepts::ReadMap<typename G2::Node, IntConvertible2> > 290 myVf2pp_IntConv(g,h,r,c1_IntConv,c2_IntConv); 291 myVf2pp_IntConv.find(); 292 293 succ = vf2pp(g,h).nodeLabels(c1_IntConv,c2_IntConv).mapping(r).run(); 294 succ = vf2pp(g,h).nodeLabels(c1_IntConv,c2_IntConv).mapping(r).run(); 295 } 296 297 void vf2ppCompile() { 298 checkVf2ppCompile<concepts::Graph,concepts::Graph>(); 299 checkVf2ppCompile<concepts::Graph,SmartGraph>(); 300 checkVf2ppCompile<SmartGraph,concepts::Graph>(); 246 301 } 247 302 248 303 template<class G1, class G2, class I> 249 void check Ind(const G1 &g1, const G2 &g2, const I &i) {304 void checkSubIso(const G1 &g1, const G2 &g2, const I &i) { 250 305 std::set<typename G2::Node> image; 251 for (typename G1::NodeIt n(g1);n!=INVALID;++n){306 for (typename G1::NodeIt n(g1);n!=INVALID;++n){ 252 307 check(i[n]!=INVALID, "Wrong isomorphism: incomplete mapping."); 253 308 check(image.count(i[n])==0,"Wrong isomorphism: not injective."); 254 309 image.insert(i[n]); 255 310 } 256 for(typename G1::NodeIt n(g1); n!=INVALID; ++n) 257 for(typename G1::NodeIt m(g1); m!=INVALID; ++m) 311 for (typename G1::EdgeIt e(g1);e!=INVALID;++e) { 312 check(findEdge(g2,i[g1.u(e)],i[g1.v(e)])!=INVALID, 313 "Wrong isomorphism: missing edge(checkSub)."); 314 } 315 } 316 317 template<class G1, class G2, class I> 318 void checkIndIso(const G1 &g1, const G2 &g2, const I &i) { 319 std::set<typename G2::Node> image; 320 for (typename G1::NodeIt n(g1);n!=INVALID;++n) { 321 check(i[n]!=INVALID, "Wrong isomorphism: incomplete mapping."); 322 check(image.count(i[n])==0,"Wrong isomorphism: not injective."); 323 image.insert(i[n]); 324 } 325 for (typename G1::NodeIt n(g1); n!=INVALID; ++n) { 326 for (typename G1::NodeIt m(g1); m!=INVALID; ++m) { 258 327 if((findEdge(g1,n,m)==INVALID) != (findEdge(g2,i[n],i[m])==INVALID)) { 259 328 std::cout << "Wrong isomorphism: edge mismatch"; 260 329 exit(1); 261 330 } 331 } 332 } 262 333 } 263 334 264 template<class G1,class G2 >265 int checkSub(const G1 &g1, const G2 &g2) {335 template<class G1,class G2,class T> 336 bool checkSub(const G1 &g1, const G2 &g2, const T &vf2) { 266 337 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID); 267 if (vf2(g1,g2).mapping(iso).run()) {268 checkSub (g1,g2,iso);338 if (const_cast<T&>(vf2).mapping(iso).run()) { 339 checkSubIso(g1,g2,iso); 269 340 return true; 270 341 } 271 else 272 return false; 342 return false; 273 343 } 274 344 275 template<class G1,class G2 >276 int checkInd(const G1 &g1, const G2 &g2) {345 template<class G1,class G2,class T> 346 bool checkInd(const G1 &g1, const G2 &g2, const T &vf2) { 277 347 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID); 278 if (vf2(g1,g2).induced().mapping(iso).run()) {279 checkInd (g1,g2,iso);348 if (const_cast<T&>(vf2).induced().mapping(iso).run()) { 349 checkIndIso(g1,g2,iso); 280 350 return true; 281 351 } 282 else 283 return false; 352 return false; 284 353 } 285 354 286 template<class G1,class G2 >287 int checkIso(const G1 &g1, const G2 &g2) {355 template<class G1,class G2,class T> 356 bool checkIso(const G1 &g1, const G2 &g2, const T &vf2) { 288 357 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID); 289 if (vf2(g1,g2).iso().mapping(iso).run()) {358 if (const_cast<T&>(vf2).iso().mapping(iso).run()) { 290 359 check(countNodes(g1)==countNodes(g2), 291 360 "Wrong iso alg.: they are not isomophic."); 292 checkInd (g1,g2,iso);361 checkIndIso(g1,g2,iso); 293 362 return true; 294 363 } 295 else 296 return false; 364 return false; 297 365 } 298 366 299 367 template<class G1, class G2, class L1, class L2, class I> 300 368 void checkLabel(const G1 &g1, const G2 &, 301 const L1 &l1, const L2 &l2, const I &i) {302 for (typename G1::NodeIt n(g1);n!=INVALID;++n)369 const L1 &l1, const L2 &l2, const I &i) { 370 for (typename G1::NodeIt n(g1);n!=INVALID;++n) { 303 371 check(l1[n]==l2[i[n]],"Wrong isomorphism: label mismatch."); 372 } 373 } 374 375 template<class G1,class G2,class L1,class L2,class T> 376 bool checkSub(const G1 &g1, const G2 &g2, const L1 &l1, const L2 &l2, const T &vf2) { 377 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID); 378 if (const_cast<T&>(vf2).nodeLabels(l1,l2).mapping(iso).run()){ 379 checkSubIso(g1,g2,iso); 380 checkLabel(g1,g2,l1,l2,iso); 381 return true; 382 } 383 return false; 384 } 385 386 template<class G1,class G2> 387 void checkSub(const G1 &g1, const G2 &g2, bool expected, const char* msg) { 388 check(checkSub(g1,g2,vf2(g1,g2)) == expected, msg); 389 check(checkSub(g1,g2,vf2pp(g1,g2)) == expected, msg); 390 } 391 392 template<class G1,class G2> 393 void checkInd(const G1 &g1, const G2 &g2, bool expected, const char* msg) { 394 check(checkInd(g1,g2,vf2(g1,g2)) == expected, msg); 395 check(checkInd(g1,g2,vf2pp(g1,g2)) == expected, msg); 396 } 397 398 template<class G1,class G2> 399 void checkIso(const G1 &g1, const G2 &g2, bool expected, const char* msg) { 400 check(checkIso(g1,g2,vf2(g1,g2)) == expected, msg); 401 check(checkIso(g1,g2,vf2pp(g1,g2)) == expected, msg); 304 402 } 305 403 306 404 template<class G1,class G2,class L1,class L2> 307 int checkSub(const G1 &g1, const G2 &g2, const L1 &l1, const L2 &l2) { 308 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID); 309 if(vf2(g1,g2).nodeLabels(l1,l2).mapping(iso).run()){ 310 checkSub(g1,g2,iso); 311 checkLabel(g1,g2,l1,l2,iso); 312 return true; 313 } 314 else 315 return false; 405 void checkSub(const G1 &g1, const G2 &g2, const L1 &l1, const L2 &l2, bool expected, const char* msg) { 406 check(checkSub(g1,g2,l1,l2,vf2(g1,g2)) == expected, msg); 407 check(checkSub(g1,g2,l1,l2,vf2pp(g1,g2)) == expected, msg); 316 408 } 317 409 318 410 int main() { 319 411 make_graphs(); 320 // justCompile();321 check(checkSub(c5,petersen), "There should exist a C5->Petersen mapping.");322 check(!checkSub(c7,petersen),323 "There should not exist a C7->Petersen mapping.");324 check(checkSub(p10,petersen), "There should exist a P10->Petersen mapping.");325 check(!checkSub(c10,petersen),326 "There should not exist a C10->Petersen mapping.");327 check(checkSub(petersen,petersen),328 "There should exist a Petersen->Petersen mapping.");329 412 330 check(checkInd(c5,petersen), 331 "There should exist a C5->Petersen spanned mapping."); 332 check(!checkInd(c7,petersen), 333 "There should exist a C7->Petersen spanned mapping."); 334 check(!checkInd(p10,petersen), 335 "There should not exist a P10->Petersen spanned mapping."); 336 check(!checkInd(c10,petersen), 337 "There should not exist a C10->Petersen spanned mapping."); 338 check(checkInd(petersen,petersen), 413 checkSub(c5,petersen,true, 414 "There should exist a C5->Petersen mapping."); 415 checkSub(c7,petersen,false, 416 "There should not exist a C7->Petersen mapping."); 417 checkSub(p10,petersen,true, 418 "There should exist a P10->Petersen mapping."); 419 checkSub(c10,petersen,false, 420 "There should not exist a C10->Petersen mapping."); 421 checkSub(petersen,petersen,true, 422 "There should exist a Petersen->Petersen mapping."); 423 424 checkInd(c5,petersen,true, 425 "There should exist a C5->Petersen spanned mapping."); 426 checkInd(c7,petersen,false, 427 "There should exist a C7->Petersen spanned mapping."); 428 checkInd(p10,petersen,false, 429 "There should not exist a P10->Petersen spanned mapping."); 430 checkInd(c10,petersen,false, 431 "There should not exist a C10->Petersen spanned mapping."); 432 checkInd(petersen,petersen,true, 339 433 "There should exist a Petersen->Petersen spanned mapping."); 340 434 341 check (!checkSub(petersen,c10),342 343 check (checkSub(p10,c10),344 345 check (!checkInd(p10,c10),346 347 check (!checkSub(c10,p10),348 435 checkSub(petersen,c10,false, 436 "There should not exist a Petersen->C10 mapping."); 437 checkSub(p10,c10,true, 438 "There should exist a P10->C10 mapping."); 439 checkInd(p10,c10,false, 440 "There should not exist a P10->C10 spanned mapping."); 441 checkSub(c10,p10,false, 442 "There should not exist a C10->P10 mapping."); 349 443 350 check (!checkIso(p10,c10),351 352 check (checkIso(c10,c10),353 444 checkIso(p10,c10,false, 445 "P10 and C10 are not isomorphic."); 446 checkIso(c10,c10,true, 447 "C10 and C10 are isomorphic."); 354 448 355 check (!vf2(p10,c10).iso().run(),356 "P10 and C10 are not isomorphic.");357 check (vf2(c10,c10).iso().run(),358 "C10 and C10 are isomorphic.");449 checkSub(c5,petersen,c5_col,petersen_col1,false, 450 "There should exist a C5->Petersen mapping."); 451 checkSub(c5,petersen,c5_col,petersen_col2,true, 452 "There should exist a C5->Petersen mapping."); 359 453 360 check(!checkSub(c5,petersen,c5_col,petersen_col1), 361 "There should exist a C5->Petersen mapping."); 362 check(checkSub(c5,petersen,c5_col,petersen_col2), 363 "There should exist a C5->Petersen mapping."); 454 check(!vf2(p10,c10).iso().run(), "P10 and C10 are not isomorphic."); 455 check(!vf2pp(p10,c10).iso().run(), "P10 and C10 are not isomorphic."); 456 457 check(vf2(c10,c10).iso().run(), "C10 and C10 are isomorphic."); 458 check(vf2pp(c10,c10).iso().run(), "C10 and C10 are isomorphic."); 364 459 } -
deleted file test/vf2pp_test.cc
diff --git a/test/vf2pp_test.cc b/test/vf2pp_test.cc deleted file mode 100644
+ - 1 /* -*- mode: C++; indent-tabs-mode: nil; -*-2 *3 * This file is a part of LEMON, a generic C++ optimization library.4 *5 * Copyright (C) 2015-20176 * EMAXA Kutato-fejleszto Kft. (EMAXA Research Ltd.)7 *8 * Permission to use, modify and distribute this software is granted9 * provided that this copyright notice appears in all copies. For10 * precise terms see the accompanying LICENSE file.11 *12 * This software is provided "AS IS" with no warranty of any kind,13 * express or implied, and with no claim as to its suitability for any14 * purpose.15 *16 */17 18 #include <lemon/vf2pp.h>19 #include <lemon/concepts/digraph.h>20 #include <lemon/smart_graph.h>21 #include <lemon/lgf_reader.h>22 #include <lemon/concepts/maps.h>23 #include <lemon/maps.h>24 #include <lemon/list_graph.h>25 26 #include <test/test_tools.h>27 #include <sstream>28 29 using namespace lemon;30 31 char petersen_lgf[] =32 "@nodes\n"33 "label col1 col2\n"34 "0 1 1\n"35 "1 1 2\n"36 "2 1 3\n"37 "3 1 4\n"38 "4 2 5\n"39 "5 2 1\n"40 "6 2 2\n"41 "7 2 3\n"42 "8 2 4\n"43 "9 2 5\n"44 "@arcs\n"45 " -\n"46 "0 1\n"47 "1 2\n"48 "2 3\n"49 "3 4\n"50 "4 0\n"51 "0 5\n"52 "1 6\n"53 "2 7\n"54 "3 8\n"55 "4 9\n"56 "5 8\n"57 "5 7\n"58 "9 6\n"59 "9 7\n"60 "6 8\n";61 62 char c5_lgf[] =63 "@nodes\n"64 "label col\n"65 "0 1\n"66 "1 2\n"67 "2 3\n"68 "3 4\n"69 "4 5\n"70 "@arcs\n"71 " -\n"72 "0 1\n"73 "1 2\n"74 "2 3\n"75 "3 4\n"76 "4 0\n";77 78 char c7_lgf[] =79 "@nodes\n"80 "label\n"81 "0\n"82 "1\n"83 "2\n"84 "3\n"85 "4\n"86 "5\n"87 "6\n"88 "@arcs\n"89 " -\n"90 "0 1\n"91 "1 2\n"92 "2 3\n"93 "3 4\n"94 "4 5\n"95 "5 6\n"96 "6 0\n";97 98 char c10_lgf[] =99 "@nodes\n"100 "label\n"101 "0\n"102 "1\n"103 "2\n"104 "3\n"105 "4\n"106 "5\n"107 "6\n"108 "7\n"109 "8\n"110 "9\n"111 "@arcs\n"112 " -\n"113 "0 1\n"114 "1 2\n"115 "2 3\n"116 "3 4\n"117 "4 5\n"118 "5 6\n"119 "6 7\n"120 "7 8\n"121 "8 9\n"122 "9 0\n";123 124 char p10_lgf[] =125 "@nodes\n"126 "label\n"127 "0\n"128 "1\n"129 "2\n"130 "3\n"131 "4\n"132 "5\n"133 "6\n"134 "7\n"135 "8\n"136 "9\n"137 "@arcs\n"138 " -\n"139 "0 1\n"140 "1 2\n"141 "2 3\n"142 "3 4\n"143 "4 5\n"144 "5 6\n"145 "6 7\n"146 "7 8\n"147 "8 9\n";148 149 SmartGraph petersen, c5, c7, c10, p10;150 SmartGraph::NodeMap<int> petersen_col1(petersen);151 SmartGraph::NodeMap<int> petersen_col2(petersen);152 SmartGraph::NodeMap<int> c5_col(c5);153 154 void make_graphs(){155 std::stringstream ss(petersen_lgf);156 graphReader(petersen, ss)157 .nodeMap("col1",petersen_col1)158 .nodeMap("col2",petersen_col2)159 .run();160 161 ss.clear();162 ss.str("");163 ss<<c5_lgf;164 165 graphReader(c5, ss)166 .nodeMap("col",c5_col)167 .run();168 169 ss.clear();170 ss.str("");171 ss<<c7_lgf;172 graphReader(c7, ss).run();173 174 ss.clear();175 ss.str("");176 ss<<c10_lgf;177 graphReader(c10, ss).run();178 179 ss.clear();180 ss.str("");181 ss<<p10_lgf;182 graphReader(p10, ss).run();183 184 }185 186 class IntConvertible1{187 public:188 operator int(){189 return 0;190 }191 };192 193 class IntConvertible2{194 public:195 operator int(){196 return 0;197 }198 };199 200 template<class G1,class G2>201 void checkVf2Compile() {202 G1 g;203 G2 h;204 concepts::ReadWriteMap<typename G1::Node, typename G2::Node> r;205 bool succ;206 ::lemon::ignore_unused_variable_warning(succ);207 208 succ = vf2pp(g,h).run();209 succ = vf2pp(g,h).induced().run();210 succ = vf2pp(g,h).iso().run();211 succ = vf2pp(g,h).mapping(r).run();212 succ = vf2pp(g,h).induced().mapping(r).run();213 succ = vf2pp(g,h).iso().mapping(r).run();214 215 216 concepts::ReadMap<typename G1::Node, int> c1;217 concepts::ReadMap<typename G2::Node, int> c2;218 Vf2pp<G1,G2,concepts::ReadWriteMap<typename G1::Node, typename G2::Node>,219 concepts::ReadMap<typename G1::Node, int>,220 concepts::ReadMap<typename G2::Node, int> >221 myVf2pp(g,h,r,c1,c2);222 myVf2pp.find();223 224 succ = vf2pp(g,h).nodeLabels(c1,c2).mapping(r).run();225 succ = vf2pp(g,h).nodeLabels(c1,c2)226 .mapping(r).run();227 228 229 concepts::ReadMap<typename G1::Node, char> c1_c;230 concepts::ReadMap<typename G2::Node, char> c2_c;231 Vf2pp<G1,G2,concepts::ReadWriteMap<typename G1::Node, typename G2::Node>,232 concepts::ReadMap<typename G1::Node, char>,233 concepts::ReadMap<typename G2::Node, char> >234 myVf2pp_c(g,h,r,c1_c,c2_c);235 myVf2pp_c.find();236 237 succ = vf2pp(g,h).nodeLabels(c1_c,c2_c).mapping(r).run();238 succ = vf2pp(g,h).nodeLabels(c1_c,c2_c)239 .mapping(r).run();240 241 242 concepts::ReadMap<typename G1::Node, IntConvertible1> c1_IntConv;243 concepts::ReadMap<typename G2::Node, IntConvertible2> c2_IntConv;244 Vf2pp<G1,G2,concepts::ReadWriteMap<typename G1::Node, typename G2::Node>,245 concepts::ReadMap<typename G1::Node, IntConvertible1>,246 concepts::ReadMap<typename G2::Node, IntConvertible2> >247 myVf2pp_IntConv(g,h,r,c1_IntConv,c2_IntConv);248 myVf2pp_IntConv.find();249 250 succ = vf2pp(g,h).nodeLabels(c1_IntConv,c2_IntConv).mapping(r).run();251 succ = vf2pp(g,h).nodeLabels(c1_IntConv,c2_IntConv)252 .mapping(r).run();253 }254 255 void justCompile() {256 checkVf2Compile<concepts::Graph,concepts::Graph>();257 checkVf2Compile<concepts::Graph,SmartGraph>();258 checkVf2Compile<SmartGraph,concepts::Graph>();259 }260 261 template<class G1, class G2, class I>262 void checkSub(const G1 &g1, const G2 &g2, const I &i) {263 {264 std::set<typename G2::Node> image;265 for(typename G1::NodeIt n(g1);n!=INVALID;++n){266 check(i[n]!=INVALID, "Wrong isomorphism: incomplete mapping.");267 check(image.count(i[n])==0,"Wrong isomorphism: not injective.");268 image.insert(i[n]);269 }270 }271 for(typename G1::EdgeIt e(g1);e!=INVALID;++e)272 check(findEdge(g2,i[g1.u(e)],i[g1.v(e)])!=INVALID,273 "Wrong isomorphism: missing edge(checkSub).");274 }275 276 template<class G1, class G2, class I>277 void checkInd(const G1 &g1, const G2 &g2, const I &i) {278 std::set<typename G2::Node> image;279 for(typename G1::NodeIt n(g1);n!=INVALID;++n) {280 check(i[n]!=INVALID, "Wrong isomorphism: incomplete mapping.");281 check(image.count(i[n])==0,"Wrong isomorphism: not injective.");282 image.insert(i[n]);283 }284 for(typename G1::NodeIt n(g1); n!=INVALID; ++n)285 for(typename G1::NodeIt m(g1); m!=INVALID; ++m)286 if((findEdge(g1,n,m)==INVALID) != (findEdge(g2,i[n],i[m])==INVALID)) {287 std::cout << "Wrong isomorphism: edge mismatch";288 exit(1);289 }290 }291 292 template<class G1,class G2>293 int checkSub(const G1 &g1, const G2 &g2) {294 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID);295 if(vf2pp(g1,g2).mapping(iso).run()){296 checkSub(g1,g2,iso);297 return true;298 }299 else300 return false;301 }302 303 template<class G1,class G2>304 int checkInd(const G1 &g1, const G2 &g2) {305 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID);306 if(vf2pp(g1,g2).induced().mapping(iso).run()) {307 checkInd(g1,g2,iso);308 return true;309 }310 else311 return false;312 }313 314 template<class G1,class G2>315 int checkIso(const G1 &g1, const G2 &g2) {316 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID);317 if(vf2pp(g1,g2).iso().mapping(iso).run()) {318 check(countNodes(g1)==countNodes(g2),319 "Wrong iso alg.: they are not isomophic.");320 checkInd(g1,g2,iso);321 return true;322 }323 else324 return false;325 }326 327 template<class G1, class G2, class L1, class L2, class I>328 void checkLabel(const G1 &g1, const G2 &,329 const L1 &l1, const L2 &l2,const I &i) {330 for(typename G1::NodeIt n(g1);n!=INVALID;++n)331 check(l1[n]==l2[i[n]],"Wrong isomorphism: label mismatch.");332 }333 334 template<class G1,class G2,class L1,class L2>335 int checkSub(const G1 &g1, const G2 &g2, const L1 &l1, const L2 &l2) {336 typename G1:: template NodeMap<typename G2::Node> iso(g1,INVALID);337 if(vf2pp(g1,g2).nodeLabels(l1,l2).mapping(iso).run()) {338 checkSub(g1,g2,iso);339 checkLabel(g1,g2,l1,l2,iso);340 return true;341 }342 else343 return false;344 }345 346 int main() {347 make_graphs();348 // justCompile();349 check(checkSub(c5,petersen), "There should exist a C5->Petersen mapping.");350 check(!checkSub(c7,petersen),351 "There should not exist a C7->Petersen mapping.");352 check(checkSub(p10,petersen), "There should exist a P10->Petersen mapping.");353 check(!checkSub(c10,petersen),354 "There should not exist a C10->Petersen mapping.");355 check(checkSub(petersen,petersen),356 "There should exist a Petersen->Petersen mapping.");357 358 check(checkInd(c5,petersen),359 "There should exist a C5->Petersen spanned mapping.");360 check(!checkInd(c7,petersen),361 "There should exist a C7->Petersen spanned mapping.");362 check(!checkInd(p10,petersen),363 "There should not exist a P10->Petersen spanned mapping.");364 check(!checkInd(c10,petersen),365 "There should not exist a C10->Petersen spanned mapping.");366 check(checkInd(petersen,petersen),367 "There should exist a Petersen->Petersen spanned mapping.");368 369 check(!checkSub(petersen,c10),370 "There should not exist a Petersen->C10 mapping.");371 check(checkSub(p10,c10),372 "There should exist a P10->C10 mapping.");373 check(!checkInd(p10,c10),374 "There should not exist a P10->C10 spanned mapping.");375 check(!checkSub(c10,p10),376 "There should not exist a C10->P10 mapping.");377 378 check(!checkIso(p10,c10),379 "P10 and C10 are not isomorphic.");380 check(checkIso(c10,c10),381 "C10 and C10 are isomorphic.");382 383 check(!vf2pp(p10,c10).iso().run(),384 "P10 and C10 are not isomorphic.");385 check(vf2pp(c10,c10).iso().run(),386 "C10 and C10 are isomorphic.");387 388 check(!checkSub(c5,petersen,c5_col,petersen_col1),389 "There should exist a C5->Petersen mapping.");390 check(checkSub(c5,petersen,c5_col,petersen_col2),391 "There should exist a C5->Petersen mapping.");392 }