From 73b2b7d27977eb8806b567a486e2a7e30e66ed19 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Fri, 24 May 2019 16:35:56 +0200 Subject: [PATCH] 1. add wl subtree kernel. 2. update datasets. --- README.md | 4 + datasets/MUTAG/MUTAG.mat | Bin 37655 -> 0 bytes datasets/MUTAG/MUTAG.zip | Bin 0 -> 18394 bytes datasets/MUTAG/MUTAG_A.txt | 7442 +++++++++++++++++++++++++++ datasets/MUTAG/MUTAG_edge_labels.txt | 7442 +++++++++++++++++++++++++++ datasets/MUTAG/MUTAG_graph_indicator.txt | 3371 ++++++++++++ datasets/MUTAG/MUTAG_graph_labels.txt | 188 + datasets/MUTAG/MUTAG_node_labels.txt | 3371 ++++++++++++ datasets/MUTAG/README | 68 - datasets/MUTAG/README.txt | 85 + notebooks/run_commonwalkkernel.ipynb | 12 +- notebooks/run_commonwalkkernel.py | 14 +- notebooks/run_marginalizedkernel.ipynb | 12 +- notebooks/run_marginalizedkernel.py | 12 +- notebooks/run_randomwalkkernel.ipynb | 12 +- notebooks/run_randomwalkkernel.py | 15 +- notebooks/run_spkernel.ipynb | 13 +- notebooks/run_spkernel.py | 15 +- notebooks/run_structuralspkernel.ipynb | 12 +- notebooks/run_structuralspkernel.py | 14 +- notebooks/run_treeletkernel.ipynb | 12 +- notebooks/run_treeletkernel.py | 20 +- notebooks/run_untilhpathkernel.ipynb | 20 +- notebooks/run_untilhpathkernel.py | 14 +- notebooks/run_weisfeilerlehmankernel.ipynb | 144 + notebooks/run_weisfeilerlehmankernel.py | 81 + preimage/iam.py | 20 +- pygraph/kernels/marginalizedKernel.py | 43 +- pygraph/kernels/randomWalkKernel.py | 1 + pygraph/kernels/spKernel.py | 1 + pygraph/kernels/structuralspKernel.py | 1 + pygraph/kernels/treeletKernel.py | 11 +- pygraph/kernels/unfinished/treeletKernel.py | 382 -- pygraph/kernels/untilHPathKernel.py | 1 + pygraph/kernels/weisfeilerLehmanKernel.py | 549 ++ pygraph/utils/kernels.py | 23 +- pygraph/utils/utils.py | 20 +- 37 files changed, 22835 insertions(+), 610 deletions(-) delete mode 100644 datasets/MUTAG/MUTAG.mat create mode 100644 datasets/MUTAG/MUTAG.zip create mode 100644 datasets/MUTAG/MUTAG_A.txt create mode 100644 datasets/MUTAG/MUTAG_edge_labels.txt create mode 100644 datasets/MUTAG/MUTAG_graph_indicator.txt create mode 100644 datasets/MUTAG/MUTAG_graph_labels.txt create mode 100644 datasets/MUTAG/MUTAG_node_labels.txt delete mode 100644 datasets/MUTAG/README create mode 100644 datasets/MUTAG/README.txt create mode 100644 notebooks/run_weisfeilerlehmankernel.ipynb create mode 100644 notebooks/run_weisfeilerlehmankernel.py delete mode 100644 pygraph/kernels/unfinished/treeletKernel.py create mode 100644 pygraph/kernels/weisfeilerLehmanKernel.py diff --git a/README.md b/README.md index 67a82d4..d1345c6 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,8 @@ Simply clone this repository and voilà! Then check [`notebooks`](https://github * The MinMax kernel * Non-linear kernels * The treelet kernel [10] + * Weisfeiler-Lehman kernel [11] + * Subtree ## Computation optimization methods @@ -92,6 +94,8 @@ Linlin Jia, Benoit Gaüzère, and Paul Honeine. Graph Kernels Based on Linear Pa [10] Gaüzere, B., Brun, L., Villemin, D., 2012. Two new graphs kernels in chemoinformatics. Pattern Recognition Letters 33, 2038–2047. +[11] Shervashidze, N., Schweitzer, P., Leeuwen, E.J.v., Mehlhorn, K., Borgwardt, K.M., 2011. Weisfeiler-lehman graph kernels. Journal of Machine Learning Research 12, 2539–2561. + ## Authors * [Linlin Jia](https://github.com/jajupmochi), LITIS, INSA Rouen Normandie diff --git a/datasets/MUTAG/MUTAG.mat b/datasets/MUTAG/MUTAG.mat deleted file mode 100644 index 750209d55c9163e7429657cc1079b899735643ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 KcmV+b0RR6000031 literal 37655 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 literal 0 KcmV+b0RR6000031 diff --git a/datasets/MUTAG/MUTAG_A.txt b/datasets/MUTAG/MUTAG_A.txt new file mode 100644 index 0000000..b5cabc1 --- /dev/null +++ b/datasets/MUTAG/MUTAG_A.txt @@ -0,0 +1,7442 @@ +2, 1 +1, 2 +3, 2 +2, 3 +4, 3 +3, 4 +5, 4 +4, 5 +6, 5 +5, 6 +6, 1 +1, 6 +7, 5 +5, 7 +8, 7 +7, 8 +9, 8 +8, 9 +10, 9 +9, 10 +10, 4 +4, 10 +11, 10 +10, 11 +12, 11 +11, 12 +13, 12 +12, 13 +14, 13 +13, 14 +14, 9 +9, 14 +15, 13 +13, 15 +16, 15 +15, 16 +17, 15 +15, 17 +19, 18 +18, 19 +20, 19 +19, 20 +21, 20 +20, 21 +22, 21 +21, 22 +23, 22 +22, 23 +24, 23 +23, 24 +25, 24 +24, 25 +25, 20 +20, 25 +26, 25 +25, 26 +27, 26 +26, 27 +27, 18 +18, 27 +28, 26 +26, 28 +29, 28 +28, 29 +30, 28 +28, 30 +32, 31 +31, 32 +33, 32 +32, 33 +34, 33 +33, 34 +35, 34 +34, 35 +36, 35 +35, 36 +37, 36 +36, 37 +38, 37 +37, 38 +38, 33 +33, 38 +39, 34 +34, 39 +40, 39 +39, 40 +40, 31 +31, 40 +41, 39 +39, 41 +42, 41 +41, 42 +43, 41 +41, 43 +45, 44 +44, 45 +46, 45 +45, 46 +47, 46 +46, 47 +48, 47 +47, 48 +49, 48 +48, 49 +49, 44 +44, 49 +50, 48 +48, 50 +51, 50 +50, 51 +52, 51 +51, 52 +53, 52 +52, 53 +54, 53 +53, 54 +55, 54 +54, 55 +55, 50 +50, 55 +56, 55 +55, 56 +56, 47 +47, 56 +57, 56 +56, 57 +58, 57 +57, 58 +59, 58 +58, 59 +59, 54 +54, 59 +60, 57 +57, 60 +61, 60 +60, 61 +62, 60 +60, 62 +64, 63 +63, 64 +65, 64 +64, 65 +66, 65 +65, 66 +67, 66 +66, 67 +68, 67 +67, 68 +68, 63 +63, 68 +69, 68 +68, 69 +70, 66 +66, 70 +71, 70 +70, 71 +72, 70 +70, 72 +73, 65 +65, 73 +75, 74 +74, 75 +76, 75 +75, 76 +77, 76 +76, 77 +78, 77 +77, 78 +79, 78 +78, 79 +80, 79 +79, 80 +81, 80 +80, 81 +81, 76 +76, 81 +82, 81 +81, 82 +83, 82 +82, 83 +83, 74 +74, 83 +84, 83 +83, 84 +85, 84 +84, 85 +86, 85 +85, 86 +87, 86 +86, 87 +87, 82 +82, 87 +88, 87 +87, 88 +89, 88 +88, 89 +89, 80 +80, 89 +90, 86 +86, 90 +91, 90 +90, 91 +92, 90 +90, 92 +93, 84 +84, 93 +94, 93 +93, 94 +95, 93 +93, 95 +96, 79 +79, 96 +97, 96 +96, 97 +98, 96 +96, 98 +99, 77 +77, 99 +100, 99 +99, 100 +101, 99 +99, 101 +103, 102 +102, 103 +104, 103 +103, 104 +105, 104 +104, 105 +106, 105 +105, 106 +107, 106 +106, 107 +108, 107 +107, 108 +108, 103 +103, 108 +109, 108 +108, 109 +110, 109 +109, 110 +111, 109 +109, 111 +112, 105 +105, 112 +113, 112 +112, 113 +114, 113 +113, 114 +115, 114 +114, 115 +116, 115 +115, 116 +117, 116 +116, 117 +117, 112 +112, 117 +119, 118 +118, 119 +120, 119 +119, 120 +121, 119 +119, 121 +122, 121 +121, 122 +123, 122 +122, 123 +124, 123 +123, 124 +125, 124 +124, 125 +126, 125 +125, 126 +127, 126 +126, 127 +127, 122 +122, 127 +128, 126 +126, 128 +129, 128 +128, 129 +130, 129 +129, 130 +130, 125 +125, 130 +131, 130 +130, 131 +132, 131 +131, 132 +133, 132 +132, 133 +134, 133 +133, 134 +134, 129 +129, 134 +135, 133 +133, 135 +136, 135 +135, 136 +137, 135 +135, 137 +139, 138 +138, 139 +140, 139 +139, 140 +141, 140 +140, 141 +142, 141 +141, 142 +143, 142 +142, 143 +144, 143 +143, 144 +144, 140 +140, 144 +145, 144 +144, 145 +146, 145 +145, 146 +146, 138 +138, 146 +147, 146 +146, 147 +148, 147 +147, 148 +149, 147 +147, 149 +151, 150 +150, 151 +152, 151 +151, 152 +153, 152 +152, 153 +154, 153 +153, 154 +155, 154 +154, 155 +156, 155 +155, 156 +156, 151 +151, 156 +157, 155 +155, 157 +158, 157 +157, 158 +159, 158 +158, 159 +159, 154 +154, 159 +160, 159 +159, 160 +161, 160 +160, 161 +162, 161 +161, 162 +163, 162 +162, 163 +163, 158 +158, 163 +164, 162 +162, 164 +165, 164 +164, 165 +166, 164 +164, 166 +168, 167 +167, 168 +169, 168 +168, 169 +170, 169 +169, 170 +171, 170 +170, 171 +172, 171 +171, 172 +172, 167 +167, 172 +173, 171 +171, 173 +174, 173 +173, 174 +175, 174 +174, 175 +176, 175 +175, 176 +176, 170 +170, 176 +177, 176 +176, 177 +178, 177 +177, 178 +179, 178 +178, 179 +180, 179 +179, 180 +180, 175 +175, 180 +181, 174 +174, 181 +182, 181 +181, 182 +183, 181 +181, 183 +185, 184 +184, 185 +186, 185 +185, 186 +187, 186 +186, 187 +188, 187 +187, 188 +189, 188 +188, 189 +190, 189 +189, 190 +191, 190 +190, 191 +191, 186 +186, 191 +192, 191 +191, 192 +193, 192 +192, 193 +193, 184 +184, 193 +194, 193 +193, 194 +195, 194 +194, 195 +196, 195 +195, 196 +197, 196 +196, 197 +197, 192 +192, 197 +198, 197 +197, 198 +199, 198 +198, 199 +199, 190 +190, 199 +200, 196 +196, 200 +201, 189 +189, 201 +202, 201 +201, 202 +203, 201 +201, 203 +205, 204 +204, 205 +206, 205 +205, 206 +207, 206 +206, 207 +208, 207 +207, 208 +209, 208 +208, 209 +209, 204 +204, 209 +210, 208 +208, 210 +211, 210 +210, 211 +212, 211 +211, 212 +213, 212 +212, 213 +214, 213 +213, 214 +215, 214 +214, 215 +215, 210 +210, 215 +216, 215 +215, 216 +216, 207 +207, 216 +217, 216 +216, 217 +218, 217 +217, 218 +219, 218 +218, 219 +219, 214 +214, 219 +220, 218 +218, 220 +221, 220 +220, 221 +222, 220 +220, 222 +223, 213 +213, 223 +224, 223 +223, 224 +225, 223 +223, 225 +227, 226 +226, 227 +228, 227 +227, 228 +229, 228 +228, 229 +230, 229 +229, 230 +231, 230 +230, 231 +232, 231 +231, 232 +233, 232 +232, 233 +233, 228 +228, 233 +234, 233 +233, 234 +235, 234 +234, 235 +235, 227 +227, 235 +236, 230 +230, 236 +237, 236 +236, 237 +238, 236 +236, 238 +240, 239 +239, 240 +241, 240 +240, 241 +242, 241 +241, 242 +243, 242 +242, 243 +244, 243 +243, 244 +245, 244 +244, 245 +246, 245 +245, 246 +247, 246 +246, 247 +248, 247 +247, 248 +249, 248 +248, 249 +249, 244 +244, 249 +250, 249 +249, 250 +250, 241 +241, 250 +251, 250 +250, 251 +252, 251 +251, 252 +252, 239 +239, 252 +253, 251 +251, 253 +254, 253 +253, 254 +254, 248 +248, 254 +255, 247 +247, 255 +256, 255 +255, 256 +257, 255 +255, 257 +259, 258 +258, 259 +260, 259 +259, 260 +261, 260 +260, 261 +262, 261 +261, 262 +263, 262 +262, 263 +263, 258 +258, 263 +264, 262 +262, 264 +265, 264 +264, 265 +266, 265 +265, 266 +267, 266 +266, 267 +268, 267 +267, 268 +269, 268 +268, 269 +269, 264 +264, 269 +270, 269 +269, 270 +270, 261 +261, 270 +271, 270 +270, 271 +272, 271 +271, 272 +273, 272 +272, 273 +273, 268 +268, 273 +274, 273 +273, 274 +275, 274 +274, 275 +276, 274 +274, 276 +277, 267 +267, 277 +278, 277 +277, 278 +279, 277 +277, 279 +281, 280 +280, 281 +282, 281 +281, 282 +283, 282 +282, 283 +284, 283 +283, 284 +285, 284 +284, 285 +285, 280 +280, 285 +286, 284 +284, 286 +287, 283 +283, 287 +288, 287 +287, 288 +289, 287 +287, 289 +290, 282 +282, 290 +292, 291 +291, 292 +293, 292 +292, 293 +294, 293 +293, 294 +295, 294 +294, 295 +296, 295 +295, 296 +296, 291 +291, 296 +297, 295 +295, 297 +298, 297 +297, 298 +299, 298 +298, 299 +300, 299 +299, 300 +301, 300 +300, 301 +302, 301 +301, 302 +302, 297 +297, 302 +303, 302 +302, 303 +303, 294 +294, 303 +304, 303 +303, 304 +305, 299 +299, 305 +306, 305 +305, 306 +307, 305 +305, 307 +309, 308 +308, 309 +310, 309 +309, 310 +311, 310 +310, 311 +312, 311 +311, 312 +313, 312 +312, 313 +314, 313 +313, 314 +315, 314 +314, 315 +315, 310 +310, 315 +316, 315 +315, 316 +317, 316 +316, 317 +317, 308 +308, 317 +318, 312 +312, 318 +319, 318 +318, 319 +320, 318 +318, 320 +322, 321 +321, 322 +323, 322 +322, 323 +324, 323 +323, 324 +325, 324 +324, 325 +326, 325 +325, 326 +326, 321 +321, 326 +327, 326 +326, 327 +328, 327 +327, 328 +329, 324 +324, 329 +330, 329 +329, 330 +331, 330 +330, 331 +331, 323 +323, 331 +332, 331 +331, 332 +333, 332 +332, 333 +334, 333 +333, 334 +335, 334 +334, 335 +335, 330 +330, 335 +336, 334 +334, 336 +337, 336 +336, 337 +338, 336 +336, 338 +340, 339 +339, 340 +341, 340 +340, 341 +342, 341 +341, 342 +343, 342 +342, 343 +344, 343 +343, 344 +344, 339 +339, 344 +345, 343 +343, 345 +346, 345 +345, 346 +347, 345 +345, 347 +348, 341 +341, 348 +349, 348 +348, 349 +350, 349 +349, 350 +351, 350 +350, 351 +352, 351 +351, 352 +353, 352 +352, 353 +353, 348 +348, 353 +354, 351 +351, 354 +355, 354 +354, 355 +356, 354 +354, 356 +358, 357 +357, 358 +359, 358 +358, 359 +360, 359 +359, 360 +361, 360 +360, 361 +362, 361 +361, 362 +362, 357 +357, 362 +363, 362 +362, 363 +364, 363 +363, 364 +365, 363 +363, 365 +366, 360 +360, 366 +367, 366 +366, 367 +368, 367 +367, 368 +368, 359 +359, 368 +369, 368 +368, 369 +370, 369 +369, 370 +371, 370 +370, 371 +372, 371 +371, 372 +372, 367 +367, 372 +373, 371 +371, 373 +375, 374 +374, 375 +376, 375 +375, 376 +377, 376 +376, 377 +378, 377 +377, 378 +379, 378 +378, 379 +379, 374 +374, 379 +380, 378 +378, 380 +381, 380 +380, 381 +382, 381 +381, 382 +383, 382 +382, 383 +383, 377 +377, 383 +384, 383 +383, 384 +385, 384 +384, 385 +386, 385 +385, 386 +387, 386 +386, 387 +388, 387 +387, 388 +389, 388 +388, 389 +390, 389 +389, 390 +390, 385 +385, 390 +391, 390 +390, 391 +391, 382 +382, 391 +392, 391 +391, 392 +393, 392 +392, 393 +393, 389 +389, 393 +394, 393 +393, 394 +395, 394 +394, 395 +396, 394 +394, 396 +398, 397 +397, 398 +399, 398 +398, 399 +400, 399 +399, 400 +401, 400 +400, 401 +402, 401 +401, 402 +403, 402 +402, 403 +404, 403 +403, 404 +405, 404 +404, 405 +406, 405 +405, 406 +407, 406 +406, 407 +408, 407 +407, 408 +409, 408 +408, 409 +410, 409 +409, 410 +411, 410 +410, 411 +412, 411 +411, 412 +413, 412 +412, 413 +414, 413 +413, 414 +414, 397 +397, 414 +415, 414 +414, 415 +416, 415 +415, 416 +416, 399 +399, 416 +417, 416 +416, 417 +417, 402 +402, 417 +418, 417 +417, 418 +418, 405 +405, 418 +419, 418 +418, 419 +419, 408 +408, 419 +420, 419 +419, 420 +420, 411 +411, 420 +420, 415 +415, 420 +421, 406 +406, 421 +422, 421 +421, 422 +423, 421 +421, 423 +425, 424 +424, 425 +426, 425 +425, 426 +427, 426 +426, 427 +428, 427 +427, 428 +429, 428 +428, 429 +429, 424 +424, 429 +430, 429 +429, 430 +431, 430 +430, 431 +432, 430 +430, 432 +433, 427 +427, 433 +434, 433 +433, 434 +435, 434 +434, 435 +435, 426 +426, 435 +436, 435 +435, 436 +437, 436 +436, 437 +438, 437 +437, 438 +439, 438 +438, 439 +439, 434 +434, 439 +440, 438 +438, 440 +442, 441 +441, 442 +443, 442 +442, 443 +444, 443 +443, 444 +445, 444 +444, 445 +446, 445 +445, 446 +446, 441 +441, 446 +447, 446 +446, 447 +448, 447 +447, 448 +449, 447 +447, 449 +450, 444 +444, 450 +451, 450 +450, 451 +452, 450 +450, 452 +453, 443 +443, 453 +455, 454 +454, 455 +456, 455 +455, 456 +457, 456 +456, 457 +458, 457 +457, 458 +459, 458 +458, 459 +459, 454 +454, 459 +460, 458 +458, 460 +461, 460 +460, 461 +462, 461 +461, 462 +463, 462 +462, 463 +464, 463 +463, 464 +465, 464 +464, 465 +466, 465 +465, 466 +467, 466 +466, 467 +468, 467 +467, 468 +469, 468 +468, 469 +469, 464 +464, 469 +470, 469 +469, 470 +470, 461 +461, 470 +471, 470 +470, 471 +471, 457 +457, 471 +472, 471 +471, 472 +473, 472 +472, 473 +473, 468 +468, 473 +474, 467 +467, 474 +475, 474 +474, 475 +476, 474 +474, 476 +478, 477 +477, 478 +479, 478 +478, 479 +480, 479 +479, 480 +481, 480 +480, 481 +482, 481 +481, 482 +482, 477 +477, 482 +483, 482 +482, 483 +484, 483 +483, 484 +485, 483 +483, 485 +486, 480 +480, 486 +487, 486 +486, 487 +488, 487 +487, 488 +488, 479 +479, 488 +489, 488 +488, 489 +490, 489 +489, 490 +491, 490 +490, 491 +492, 491 +491, 492 +492, 487 +487, 492 +493, 491 +491, 493 +495, 494 +494, 495 +496, 495 +495, 496 +497, 496 +496, 497 +498, 497 +497, 498 +499, 498 +498, 499 +499, 494 +494, 499 +500, 499 +499, 500 +501, 500 +500, 501 +502, 500 +500, 502 +503, 497 +497, 503 +504, 503 +503, 504 +505, 503 +503, 505 +506, 505 +505, 506 +506, 496 +496, 506 +507, 506 +506, 507 +508, 507 +507, 508 +509, 508 +508, 509 +510, 509 +509, 510 +510, 505 +505, 510 +511, 509 +509, 511 +512, 511 +511, 512 +513, 511 +511, 513 +514, 507 +507, 514 +515, 514 +514, 515 +516, 514 +514, 516 +518, 517 +517, 518 +519, 518 +518, 519 +520, 519 +519, 520 +521, 520 +520, 521 +522, 521 +521, 522 +523, 522 +522, 523 +524, 523 +523, 524 +525, 524 +524, 525 +526, 525 +525, 526 +527, 526 +526, 527 +528, 527 +527, 528 +528, 523 +523, 528 +529, 528 +528, 529 +530, 529 +529, 530 +531, 530 +530, 531 +531, 522 +522, 531 +532, 531 +531, 532 +533, 532 +532, 533 +533, 520 +520, 533 +534, 533 +533, 534 +534, 517 +517, 534 +535, 529 +529, 535 +536, 535 +535, 536 +536, 527 +527, 536 +537, 536 +536, 537 +538, 537 +537, 538 +539, 537 +537, 539 +541, 540 +540, 541 +542, 541 +541, 542 +543, 542 +542, 543 +544, 543 +543, 544 +545, 544 +544, 545 +545, 540 +540, 545 +546, 544 +544, 546 +547, 546 +546, 547 +548, 547 +547, 548 +549, 548 +548, 549 +550, 549 +549, 550 +551, 550 +550, 551 +551, 546 +546, 551 +552, 551 +551, 552 +552, 543 +543, 552 +553, 552 +552, 553 +554, 553 +553, 554 +555, 554 +554, 555 +555, 550 +550, 555 +556, 554 +554, 556 +557, 556 +556, 557 +558, 556 +556, 558 +559, 553 +553, 559 +560, 559 +559, 560 +561, 559 +559, 561 +563, 562 +562, 563 +564, 563 +563, 564 +565, 564 +564, 565 +566, 565 +565, 566 +567, 566 +566, 567 +567, 562 +562, 567 +568, 567 +567, 568 +569, 568 +568, 569 +570, 569 +569, 570 +571, 570 +570, 571 +572, 571 +571, 572 +573, 572 +572, 573 +573, 568 +568, 573 +574, 573 +573, 574 +575, 574 +574, 575 +576, 574 +574, 576 +577, 571 +571, 577 +578, 577 +577, 578 +579, 577 +577, 579 +580, 565 +565, 580 +581, 580 +580, 581 +582, 580 +580, 582 +583, 564 +564, 583 +584, 583 +583, 584 +585, 583 +583, 585 +587, 586 +586, 587 +588, 587 +587, 588 +589, 588 +588, 589 +590, 589 +589, 590 +591, 590 +590, 591 +591, 586 +586, 591 +592, 591 +591, 592 +593, 592 +592, 593 +594, 593 +593, 594 +595, 593 +593, 595 +596, 595 +595, 596 +597, 595 +595, 597 +598, 595 +595, 598 +599, 589 +589, 599 +600, 599 +599, 600 +601, 600 +600, 601 +601, 588 +588, 601 +602, 601 +601, 602 +603, 602 +602, 603 +604, 603 +603, 604 +605, 604 +604, 605 +605, 600 +600, 605 +606, 604 +604, 606 +607, 606 +606, 607 +608, 606 +606, 608 +610, 609 +609, 610 +611, 610 +610, 611 +612, 611 +611, 612 +613, 612 +612, 613 +614, 613 +613, 614 +615, 614 +614, 615 +616, 615 +615, 616 +617, 616 +616, 617 +617, 612 +612, 617 +618, 617 +617, 618 +618, 609 +609, 618 +619, 614 +614, 619 +620, 619 +619, 620 +621, 619 +619, 621 +623, 622 +622, 623 +624, 623 +623, 624 +625, 624 +624, 625 +626, 625 +625, 626 +627, 626 +626, 627 +627, 622 +622, 627 +628, 627 +627, 628 +629, 625 +625, 629 +630, 629 +629, 630 +631, 630 +630, 631 +631, 624 +624, 631 +632, 631 +631, 632 +633, 632 +632, 633 +634, 633 +633, 634 +635, 634 +634, 635 +635, 630 +630, 635 +636, 634 +634, 636 +637, 636 +636, 637 +638, 636 +636, 638 +640, 639 +639, 640 +641, 640 +640, 641 +642, 641 +641, 642 +643, 642 +642, 643 +644, 643 +643, 644 +645, 644 +644, 645 +646, 645 +645, 646 +647, 646 +646, 647 +647, 642 +642, 647 +648, 647 +647, 648 +649, 648 +648, 649 +649, 640 +640, 649 +650, 649 +649, 650 +651, 650 +650, 651 +652, 650 +650, 652 +654, 653 +653, 654 +655, 654 +654, 655 +656, 655 +655, 656 +657, 656 +656, 657 +658, 657 +657, 658 +658, 653 +653, 658 +659, 656 +656, 659 +660, 659 +659, 660 +661, 660 +660, 661 +662, 661 +661, 662 +663, 662 +662, 663 +664, 663 +663, 664 +665, 664 +664, 665 +666, 665 +665, 666 +666, 661 +661, 666 +667, 664 +664, 667 +668, 667 +667, 668 +669, 667 +667, 669 +671, 670 +670, 671 +672, 671 +671, 672 +673, 672 +672, 673 +674, 673 +673, 674 +675, 674 +674, 675 +675, 670 +670, 675 +676, 673 +673, 676 +677, 676 +676, 677 +678, 677 +677, 678 +679, 678 +678, 679 +680, 679 +679, 680 +681, 680 +680, 681 +681, 676 +676, 681 +682, 679 +679, 682 +683, 682 +682, 683 +684, 682 +682, 684 +686, 685 +685, 686 +687, 686 +686, 687 +688, 687 +687, 688 +689, 688 +688, 689 +690, 689 +689, 690 +691, 690 +690, 691 +692, 691 +691, 692 +693, 692 +692, 693 +694, 693 +693, 694 +694, 689 +689, 694 +695, 694 +694, 695 +696, 695 +695, 696 +696, 687 +687, 696 +697, 695 +695, 697 +698, 697 +697, 698 +699, 697 +697, 699 +701, 700 +700, 701 +702, 701 +701, 702 +703, 702 +702, 703 +704, 703 +703, 704 +705, 704 +704, 705 +705, 700 +700, 705 +706, 704 +704, 706 +707, 706 +706, 707 +708, 707 +707, 708 +709, 708 +708, 709 +709, 703 +703, 709 +710, 709 +709, 710 +711, 710 +710, 711 +712, 710 +710, 712 +714, 713 +713, 714 +715, 714 +714, 715 +716, 715 +715, 716 +717, 716 +716, 717 +718, 717 +717, 718 +718, 713 +713, 718 +719, 718 +718, 719 +720, 719 +719, 720 +721, 719 +719, 721 +722, 716 +716, 722 +723, 722 +722, 723 +724, 723 +723, 724 +724, 715 +715, 724 +725, 724 +724, 725 +726, 725 +725, 726 +727, 726 +726, 727 +728, 727 +727, 728 +728, 723 +723, 728 +729, 727 +727, 729 +731, 730 +730, 731 +732, 731 +731, 732 +733, 732 +732, 733 +734, 733 +733, 734 +735, 734 +734, 735 +736, 735 +735, 736 +737, 736 +736, 737 +738, 737 +737, 738 +738, 733 +733, 738 +739, 738 +738, 739 +739, 731 +731, 739 +740, 735 +735, 740 +741, 740 +740, 741 +742, 740 +740, 742 +744, 743 +743, 744 +745, 744 +744, 745 +746, 745 +745, 746 +747, 746 +746, 747 +748, 747 +747, 748 +748, 743 +743, 748 +749, 747 +747, 749 +750, 749 +749, 750 +751, 750 +750, 751 +752, 751 +751, 752 +753, 752 +752, 753 +754, 753 +753, 754 +754, 749 +749, 754 +755, 754 +754, 755 +755, 746 +746, 755 +756, 755 +755, 756 +757, 756 +756, 757 +758, 757 +757, 758 +758, 753 +753, 758 +759, 757 +757, 759 +760, 759 +759, 760 +761, 759 +759, 761 +763, 762 +762, 763 +764, 763 +763, 764 +765, 764 +764, 765 +766, 765 +765, 766 +767, 766 +766, 767 +767, 762 +762, 767 +768, 766 +766, 768 +769, 768 +768, 769 +770, 769 +769, 770 +771, 770 +770, 771 +771, 765 +765, 771 +772, 771 +771, 772 +773, 772 +772, 773 +774, 773 +773, 774 +775, 774 +774, 775 +775, 770 +770, 775 +776, 774 +774, 776 +777, 776 +776, 777 +778, 776 +776, 778 +780, 779 +779, 780 +781, 780 +780, 781 +782, 781 +781, 782 +783, 782 +782, 783 +784, 783 +783, 784 +784, 779 +779, 784 +785, 784 +784, 785 +786, 785 +785, 786 +787, 785 +785, 787 +788, 781 +781, 788 +789, 788 +788, 789 +790, 788 +788, 790 +792, 791 +791, 792 +793, 792 +792, 793 +794, 793 +793, 794 +795, 794 +794, 795 +796, 795 +795, 796 +797, 796 +796, 797 +798, 797 +797, 798 +798, 793 +793, 798 +799, 798 +798, 799 +800, 799 +799, 800 +800, 791 +791, 800 +801, 800 +800, 801 +802, 801 +801, 802 +803, 802 +802, 803 +804, 803 +803, 804 +804, 799 +799, 804 +805, 804 +804, 805 +806, 805 +805, 806 +806, 797 +797, 806 +807, 803 +803, 807 +808, 807 +807, 808 +809, 807 +807, 809 +810, 796 +796, 810 +811, 810 +810, 811 +812, 811 +811, 812 +813, 812 +812, 813 +813, 795 +795, 813 +815, 814 +814, 815 +816, 815 +815, 816 +817, 816 +816, 817 +818, 817 +817, 818 +819, 818 +818, 819 +819, 814 +814, 819 +820, 819 +819, 820 +821, 820 +820, 821 +822, 821 +821, 822 +823, 822 +822, 823 +823, 818 +818, 823 +824, 823 +823, 824 +825, 824 +824, 825 +826, 825 +825, 826 +827, 826 +826, 827 +827, 822 +822, 827 +828, 826 +826, 828 +829, 828 +828, 829 +830, 828 +828, 830 +831, 824 +824, 831 +832, 831 +831, 832 +832, 817 +817, 832 +833, 815 +815, 833 +834, 833 +833, 834 +835, 833 +833, 835 +837, 836 +836, 837 +838, 837 +837, 838 +839, 838 +838, 839 +840, 839 +839, 840 +841, 840 +840, 841 +842, 841 +841, 842 +843, 842 +842, 843 +844, 843 +843, 844 +845, 844 +844, 845 +846, 845 +845, 846 +846, 841 +841, 846 +847, 846 +846, 847 +848, 847 +847, 848 +848, 839 +839, 848 +849, 848 +848, 849 +849, 836 +836, 849 +850, 843 +843, 850 +851, 850 +850, 851 +852, 850 +850, 852 +854, 853 +853, 854 +855, 854 +854, 855 +856, 855 +855, 856 +857, 856 +856, 857 +858, 857 +857, 858 +858, 853 +853, 858 +859, 858 +858, 859 +860, 859 +859, 860 +861, 859 +859, 861 +862, 856 +856, 862 +863, 862 +862, 863 +864, 863 +863, 864 +865, 864 +864, 865 +866, 865 +865, 866 +867, 866 +866, 867 +868, 867 +867, 868 +868, 863 +863, 868 +869, 868 +868, 869 +869, 855 +855, 869 +870, 865 +865, 870 +871, 870 +870, 871 +872, 870 +870, 872 +874, 873 +873, 874 +875, 874 +874, 875 +876, 875 +875, 876 +877, 876 +876, 877 +878, 877 +877, 878 +879, 878 +878, 879 +880, 879 +879, 880 +880, 875 +875, 880 +881, 880 +880, 881 +882, 881 +881, 882 +883, 881 +881, 883 +884, 876 +876, 884 +885, 884 +884, 885 +885, 873 +873, 885 +886, 884 +884, 886 +887, 886 +886, 887 +888, 886 +886, 888 +890, 889 +889, 890 +891, 890 +890, 891 +892, 891 +891, 892 +893, 892 +892, 893 +894, 893 +893, 894 +895, 894 +894, 895 +896, 895 +895, 896 +896, 891 +891, 896 +897, 896 +896, 897 +898, 897 +897, 898 +898, 889 +889, 898 +899, 898 +898, 899 +900, 899 +899, 900 +901, 900 +900, 901 +902, 901 +901, 902 +902, 897 +897, 902 +903, 902 +902, 903 +904, 903 +903, 904 +904, 895 +895, 904 +905, 904 +904, 905 +906, 905 +905, 906 +907, 906 +906, 907 +908, 907 +907, 908 +908, 903 +903, 908 +909, 901 +901, 909 +910, 909 +909, 910 +911, 909 +909, 911 +912, 892 +892, 912 +913, 912 +912, 913 +914, 912 +912, 914 +916, 915 +915, 916 +917, 916 +916, 917 +918, 917 +917, 918 +919, 918 +918, 919 +920, 919 +919, 920 +921, 920 +920, 921 +922, 921 +921, 922 +923, 922 +922, 923 +924, 923 +923, 924 +925, 924 +924, 925 +925, 920 +920, 925 +926, 925 +925, 926 +926, 917 +917, 926 +927, 926 +926, 927 +928, 927 +927, 928 +928, 915 +915, 928 +929, 927 +927, 929 +930, 929 +929, 930 +930, 924 +924, 930 +931, 930 +930, 931 +932, 931 +931, 932 +933, 932 +932, 933 +934, 933 +933, 934 +934, 929 +929, 934 +935, 923 +923, 935 +936, 935 +935, 936 +937, 935 +935, 937 +938, 921 +921, 938 +939, 938 +938, 939 +940, 938 +938, 940 +942, 941 +941, 942 +943, 942 +942, 943 +944, 943 +943, 944 +945, 944 +944, 945 +946, 945 +945, 946 +946, 941 +941, 946 +947, 946 +946, 947 +948, 947 +947, 948 +949, 947 +947, 949 +950, 944 +944, 950 +951, 950 +950, 951 +952, 951 +951, 952 +952, 943 +943, 952 +953, 952 +952, 953 +954, 953 +953, 954 +955, 954 +954, 955 +956, 955 +955, 956 +956, 951 +951, 956 +957, 955 +955, 957 +958, 957 +957, 958 +959, 957 +957, 959 +961, 960 +960, 961 +962, 961 +961, 962 +963, 962 +962, 963 +964, 963 +963, 964 +965, 964 +964, 965 +965, 960 +960, 965 +966, 965 +965, 966 +967, 966 +966, 967 +968, 966 +966, 968 +969, 963 +963, 969 +970, 969 +969, 970 +971, 970 +970, 971 +972, 971 +971, 972 +973, 972 +972, 973 +974, 973 +973, 974 +975, 974 +974, 975 +975, 970 +970, 975 +976, 975 +975, 976 +976, 962 +962, 976 +977, 973 +973, 977 +978, 972 +972, 978 +980, 979 +979, 980 +981, 980 +980, 981 +982, 981 +981, 982 +983, 982 +982, 983 +984, 983 +983, 984 +985, 984 +984, 985 +986, 985 +985, 986 +986, 981 +981, 986 +987, 986 +986, 987 +988, 987 +987, 988 +989, 988 +988, 989 +989, 980 +980, 989 +990, 989 +989, 990 +991, 990 +990, 991 +992, 990 +990, 992 +994, 993 +993, 994 +995, 994 +994, 995 +996, 995 +995, 996 +997, 996 +996, 997 +998, 997 +997, 998 +998, 993 +993, 998 +999, 997 +997, 999 +1000, 999 +999, 1000 +1001, 1000 +1000, 1001 +1002, 1001 +1001, 1002 +1003, 1002 +1002, 1003 +1004, 1003 +1003, 1004 +1005, 1004 +1004, 1005 +1005, 1000 +1000, 1005 +1006, 1005 +1005, 1006 +1006, 996 +996, 1006 +1007, 1003 +1003, 1007 +1008, 1007 +1007, 1008 +1009, 1007 +1007, 1009 +1011, 1010 +1010, 1011 +1012, 1011 +1011, 1012 +1013, 1012 +1012, 1013 +1014, 1013 +1013, 1014 +1015, 1014 +1014, 1015 +1015, 1010 +1010, 1015 +1016, 1015 +1015, 1016 +1017, 1016 +1016, 1017 +1018, 1017 +1017, 1018 +1019, 1018 +1018, 1019 +1020, 1019 +1019, 1020 +1021, 1020 +1020, 1021 +1021, 1016 +1016, 1021 +1022, 1021 +1021, 1022 +1023, 1022 +1022, 1023 +1024, 1022 +1022, 1024 +1025, 1019 +1019, 1025 +1026, 1025 +1025, 1026 +1027, 1025 +1025, 1027 +1028, 1012 +1012, 1028 +1029, 1028 +1028, 1029 +1030, 1028 +1028, 1030 +1032, 1031 +1031, 1032 +1033, 1032 +1032, 1033 +1034, 1033 +1033, 1034 +1035, 1034 +1034, 1035 +1036, 1035 +1035, 1036 +1037, 1036 +1036, 1037 +1038, 1037 +1037, 1038 +1039, 1038 +1038, 1039 +1039, 1034 +1034, 1039 +1040, 1039 +1039, 1040 +1040, 1031 +1031, 1040 +1041, 1040 +1040, 1041 +1042, 1041 +1041, 1042 +1043, 1042 +1042, 1043 +1043, 1038 +1038, 1043 +1044, 1043 +1043, 1044 +1045, 1044 +1044, 1045 +1046, 1044 +1044, 1046 +1047, 1035 +1035, 1047 +1048, 1047 +1047, 1048 +1049, 1048 +1048, 1049 +1049, 1033 +1033, 1049 +1050, 1049 +1049, 1050 +1051, 1050 +1050, 1051 +1052, 1051 +1051, 1052 +1053, 1052 +1052, 1053 +1053, 1048 +1048, 1053 +1054, 1051 +1051, 1054 +1055, 1050 +1050, 1055 +1057, 1056 +1056, 1057 +1058, 1057 +1057, 1058 +1059, 1058 +1058, 1059 +1060, 1059 +1059, 1060 +1061, 1060 +1060, 1061 +1061, 1056 +1056, 1061 +1062, 1060 +1060, 1062 +1063, 1062 +1062, 1063 +1064, 1063 +1063, 1064 +1065, 1064 +1064, 1065 +1065, 1059 +1059, 1065 +1066, 1065 +1065, 1066 +1067, 1066 +1066, 1067 +1068, 1067 +1067, 1068 +1069, 1068 +1068, 1069 +1069, 1064 +1064, 1069 +1070, 1068 +1068, 1070 +1071, 1070 +1070, 1071 +1072, 1071 +1071, 1072 +1073, 1072 +1072, 1073 +1073, 1067 +1067, 1073 +1074, 1073 +1073, 1074 +1075, 1074 +1074, 1075 +1075, 1066 +1066, 1075 +1076, 1074 +1074, 1076 +1077, 1076 +1076, 1077 +1078, 1076 +1076, 1078 +1080, 1079 +1079, 1080 +1081, 1080 +1080, 1081 +1082, 1081 +1081, 1082 +1083, 1082 +1082, 1083 +1084, 1083 +1083, 1084 +1085, 1084 +1084, 1085 +1086, 1085 +1085, 1086 +1086, 1081 +1081, 1086 +1087, 1086 +1086, 1087 +1088, 1087 +1087, 1088 +1088, 1079 +1079, 1088 +1089, 1087 +1087, 1089 +1090, 1089 +1089, 1090 +1091, 1089 +1089, 1091 +1092, 1085 +1085, 1092 +1093, 1092 +1092, 1093 +1094, 1092 +1092, 1094 +1095, 1083 +1083, 1095 +1096, 1095 +1095, 1096 +1097, 1095 +1095, 1097 +1099, 1098 +1098, 1099 +1100, 1099 +1099, 1100 +1101, 1100 +1100, 1101 +1102, 1101 +1101, 1102 +1103, 1102 +1102, 1103 +1103, 1098 +1098, 1103 +1104, 1103 +1103, 1104 +1105, 1104 +1104, 1105 +1106, 1104 +1104, 1106 +1107, 1101 +1101, 1107 +1108, 1107 +1107, 1108 +1109, 1108 +1108, 1109 +1109, 1100 +1100, 1109 +1110, 1109 +1109, 1110 +1111, 1110 +1110, 1111 +1112, 1111 +1111, 1112 +1113, 1112 +1112, 1113 +1113, 1108 +1108, 1113 +1114, 1112 +1112, 1114 +1116, 1115 +1115, 1116 +1117, 1116 +1116, 1117 +1118, 1117 +1117, 1118 +1119, 1118 +1118, 1119 +1120, 1119 +1119, 1120 +1120, 1115 +1115, 1120 +1121, 1120 +1120, 1121 +1122, 1121 +1121, 1122 +1123, 1121 +1121, 1123 +1124, 1118 +1118, 1124 +1125, 1117 +1117, 1125 +1127, 1126 +1126, 1127 +1128, 1127 +1127, 1128 +1129, 1128 +1128, 1129 +1130, 1129 +1129, 1130 +1130, 1126 +1126, 1130 +1131, 1130 +1130, 1131 +1132, 1131 +1131, 1132 +1133, 1132 +1132, 1133 +1134, 1133 +1133, 1134 +1135, 1133 +1133, 1135 +1136, 1135 +1135, 1136 +1137, 1136 +1136, 1137 +1138, 1137 +1137, 1138 +1139, 1138 +1138, 1139 +1140, 1139 +1139, 1140 +1141, 1140 +1140, 1141 +1142, 1141 +1141, 1142 +1142, 1138 +1138, 1142 +1143, 1141 +1141, 1143 +1144, 1143 +1143, 1144 +1145, 1143 +1143, 1145 +1146, 1128 +1128, 1146 +1147, 1146 +1146, 1147 +1148, 1146 +1146, 1148 +1150, 1149 +1149, 1150 +1151, 1150 +1150, 1151 +1152, 1151 +1151, 1152 +1153, 1152 +1152, 1153 +1154, 1153 +1153, 1154 +1154, 1149 +1149, 1154 +1155, 1154 +1154, 1155 +1156, 1155 +1155, 1156 +1157, 1155 +1155, 1157 +1158, 1152 +1152, 1158 +1159, 1158 +1158, 1159 +1160, 1158 +1158, 1160 +1161, 1160 +1160, 1161 +1161, 1151 +1151, 1161 +1162, 1161 +1161, 1162 +1163, 1162 +1162, 1163 +1164, 1163 +1163, 1164 +1165, 1164 +1164, 1165 +1165, 1160 +1160, 1165 +1166, 1164 +1164, 1166 +1167, 1166 +1166, 1167 +1168, 1166 +1166, 1168 +1170, 1169 +1169, 1170 +1171, 1170 +1170, 1171 +1172, 1171 +1171, 1172 +1173, 1172 +1172, 1173 +1174, 1173 +1173, 1174 +1174, 1169 +1169, 1174 +1175, 1173 +1173, 1175 +1176, 1175 +1175, 1176 +1177, 1176 +1176, 1177 +1178, 1177 +1177, 1178 +1178, 1172 +1172, 1178 +1179, 1178 +1178, 1179 +1180, 1179 +1179, 1180 +1181, 1179 +1179, 1181 +1182, 1176 +1176, 1182 +1183, 1182 +1182, 1183 +1184, 1182 +1182, 1184 +1186, 1185 +1185, 1186 +1187, 1186 +1186, 1187 +1188, 1187 +1187, 1188 +1189, 1188 +1188, 1189 +1190, 1189 +1189, 1190 +1190, 1185 +1185, 1190 +1191, 1189 +1189, 1191 +1192, 1191 +1191, 1192 +1193, 1191 +1191, 1193 +1194, 1187 +1187, 1194 +1195, 1194 +1194, 1195 +1196, 1195 +1195, 1196 +1197, 1196 +1196, 1197 +1198, 1197 +1197, 1198 +1199, 1198 +1198, 1199 +1199, 1194 +1194, 1199 +1200, 1197 +1197, 1200 +1202, 1201 +1201, 1202 +1203, 1202 +1202, 1203 +1204, 1203 +1203, 1204 +1205, 1204 +1204, 1205 +1206, 1205 +1205, 1206 +1206, 1201 +1201, 1206 +1207, 1205 +1205, 1207 +1208, 1207 +1207, 1208 +1209, 1208 +1208, 1209 +1210, 1209 +1209, 1210 +1211, 1210 +1210, 1211 +1212, 1211 +1211, 1212 +1212, 1207 +1207, 1212 +1213, 1212 +1212, 1213 +1213, 1204 +1204, 1213 +1214, 1213 +1213, 1214 +1215, 1214 +1214, 1215 +1216, 1215 +1215, 1216 +1216, 1211 +1211, 1216 +1217, 1215 +1215, 1217 +1218, 1214 +1214, 1218 +1219, 1218 +1218, 1219 +1220, 1218 +1218, 1220 +1222, 1221 +1221, 1222 +1223, 1222 +1222, 1223 +1224, 1223 +1223, 1224 +1225, 1224 +1224, 1225 +1226, 1225 +1225, 1226 +1226, 1221 +1221, 1226 +1227, 1225 +1225, 1227 +1228, 1227 +1227, 1228 +1229, 1228 +1228, 1229 +1230, 1229 +1229, 1230 +1231, 1230 +1230, 1231 +1232, 1231 +1231, 1232 +1233, 1232 +1232, 1233 +1234, 1233 +1233, 1234 +1235, 1234 +1234, 1235 +1236, 1235 +1235, 1236 +1236, 1231 +1231, 1236 +1237, 1236 +1236, 1237 +1237, 1228 +1228, 1237 +1238, 1237 +1237, 1238 +1238, 1224 +1224, 1238 +1239, 1238 +1238, 1239 +1240, 1239 +1239, 1240 +1240, 1235 +1235, 1240 +1241, 1232 +1232, 1241 +1242, 1241 +1241, 1242 +1243, 1241 +1241, 1243 +1245, 1244 +1244, 1245 +1246, 1245 +1245, 1246 +1247, 1246 +1246, 1247 +1248, 1247 +1247, 1248 +1249, 1248 +1248, 1249 +1249, 1244 +1244, 1249 +1250, 1248 +1248, 1250 +1251, 1250 +1250, 1251 +1252, 1250 +1250, 1252 +1253, 1247 +1247, 1253 +1254, 1253 +1253, 1254 +1255, 1254 +1254, 1255 +1256, 1255 +1255, 1256 +1257, 1256 +1256, 1257 +1258, 1257 +1257, 1258 +1258, 1253 +1253, 1258 +1259, 1258 +1258, 1259 +1259, 1246 +1246, 1259 +1260, 1256 +1256, 1260 +1261, 1260 +1260, 1261 +1262, 1260 +1260, 1262 +1264, 1263 +1263, 1264 +1265, 1264 +1264, 1265 +1266, 1265 +1265, 1266 +1267, 1266 +1266, 1267 +1268, 1267 +1267, 1268 +1268, 1263 +1263, 1268 +1269, 1268 +1268, 1269 +1270, 1269 +1269, 1270 +1271, 1269 +1269, 1271 +1272, 1266 +1266, 1272 +1273, 1272 +1272, 1273 +1274, 1272 +1272, 1274 +1275, 1274 +1274, 1275 +1276, 1274 +1274, 1276 +1276, 1265 +1265, 1276 +1278, 1277 +1277, 1278 +1279, 1278 +1278, 1279 +1280, 1279 +1279, 1280 +1281, 1280 +1280, 1281 +1282, 1281 +1281, 1282 +1283, 1282 +1282, 1283 +1284, 1283 +1283, 1284 +1284, 1279 +1279, 1284 +1285, 1284 +1284, 1285 +1286, 1285 +1285, 1286 +1286, 1277 +1277, 1286 +1287, 1286 +1286, 1287 +1288, 1287 +1287, 1288 +1289, 1288 +1288, 1289 +1290, 1289 +1289, 1290 +1290, 1285 +1285, 1290 +1291, 1290 +1290, 1291 +1292, 1291 +1291, 1292 +1292, 1283 +1283, 1292 +1293, 1292 +1292, 1293 +1294, 1293 +1293, 1294 +1295, 1294 +1294, 1295 +1296, 1295 +1295, 1296 +1296, 1291 +1291, 1296 +1297, 1289 +1289, 1297 +1298, 1297 +1297, 1298 +1299, 1297 +1297, 1299 +1300, 1282 +1282, 1300 +1301, 1300 +1300, 1301 +1302, 1300 +1300, 1302 +1304, 1303 +1303, 1304 +1305, 1304 +1304, 1305 +1306, 1305 +1305, 1306 +1307, 1306 +1306, 1307 +1308, 1307 +1307, 1308 +1308, 1303 +1303, 1308 +1309, 1307 +1307, 1309 +1310, 1309 +1309, 1310 +1311, 1310 +1310, 1311 +1311, 1306 +1306, 1311 +1312, 1311 +1311, 1312 +1313, 1312 +1312, 1313 +1314, 1313 +1313, 1314 +1315, 1314 +1314, 1315 +1315, 1310 +1310, 1315 +1316, 1314 +1314, 1316 +1317, 1316 +1316, 1317 +1318, 1316 +1316, 1318 +1320, 1319 +1319, 1320 +1321, 1320 +1320, 1321 +1322, 1321 +1321, 1322 +1323, 1322 +1322, 1323 +1324, 1323 +1323, 1324 +1324, 1319 +1319, 1324 +1325, 1323 +1323, 1325 +1326, 1325 +1325, 1326 +1327, 1326 +1326, 1327 +1328, 1327 +1327, 1328 +1329, 1328 +1328, 1329 +1330, 1329 +1329, 1330 +1330, 1325 +1325, 1330 +1331, 1329 +1329, 1331 +1332, 1322 +1322, 1332 +1333, 1332 +1332, 1333 +1334, 1332 +1332, 1334 +1336, 1335 +1335, 1336 +1337, 1336 +1336, 1337 +1338, 1337 +1337, 1338 +1339, 1338 +1338, 1339 +1340, 1339 +1339, 1340 +1341, 1340 +1340, 1341 +1342, 1341 +1341, 1342 +1342, 1337 +1337, 1342 +1343, 1342 +1342, 1343 +1344, 1343 +1343, 1344 +1344, 1335 +1335, 1344 +1345, 1343 +1343, 1345 +1346, 1345 +1345, 1346 +1346, 1341 +1341, 1346 +1347, 1346 +1346, 1347 +1348, 1347 +1347, 1348 +1349, 1348 +1348, 1349 +1350, 1349 +1349, 1350 +1351, 1350 +1350, 1351 +1352, 1351 +1351, 1352 +1353, 1352 +1352, 1353 +1353, 1348 +1348, 1353 +1354, 1353 +1353, 1354 +1354, 1345 +1345, 1354 +1355, 1350 +1350, 1355 +1356, 1355 +1355, 1356 +1357, 1355 +1355, 1357 +1359, 1358 +1358, 1359 +1360, 1359 +1359, 1360 +1361, 1360 +1360, 1361 +1362, 1361 +1361, 1362 +1363, 1362 +1362, 1363 +1363, 1358 +1358, 1363 +1364, 1363 +1363, 1364 +1365, 1364 +1364, 1365 +1366, 1365 +1365, 1366 +1367, 1366 +1366, 1367 +1368, 1367 +1367, 1368 +1369, 1368 +1368, 1369 +1369, 1364 +1364, 1369 +1370, 1367 +1367, 1370 +1371, 1370 +1370, 1371 +1372, 1370 +1370, 1372 +1373, 1360 +1360, 1373 +1374, 1373 +1373, 1374 +1375, 1373 +1373, 1375 +1377, 1376 +1376, 1377 +1378, 1377 +1377, 1378 +1379, 1378 +1378, 1379 +1380, 1379 +1379, 1380 +1381, 1380 +1380, 1381 +1381, 1376 +1376, 1381 +1382, 1380 +1380, 1382 +1383, 1382 +1382, 1383 +1384, 1382 +1382, 1384 +1385, 1379 +1379, 1385 +1387, 1386 +1386, 1387 +1388, 1387 +1387, 1388 +1389, 1388 +1388, 1389 +1390, 1389 +1389, 1390 +1391, 1390 +1390, 1391 +1391, 1386 +1386, 1391 +1392, 1390 +1390, 1392 +1393, 1392 +1392, 1393 +1394, 1393 +1393, 1394 +1395, 1394 +1394, 1395 +1396, 1395 +1395, 1396 +1397, 1396 +1396, 1397 +1397, 1392 +1392, 1397 +1398, 1396 +1396, 1398 +1399, 1398 +1398, 1399 +1400, 1398 +1398, 1400 +1401, 1389 +1389, 1401 +1403, 1402 +1402, 1403 +1404, 1403 +1403, 1404 +1405, 1404 +1404, 1405 +1406, 1405 +1405, 1406 +1407, 1406 +1406, 1407 +1408, 1407 +1407, 1408 +1408, 1403 +1403, 1408 +1409, 1408 +1408, 1409 +1410, 1409 +1409, 1410 +1411, 1410 +1410, 1411 +1412, 1411 +1411, 1412 +1413, 1412 +1412, 1413 +1414, 1413 +1413, 1414 +1414, 1409 +1409, 1414 +1415, 1412 +1412, 1415 +1416, 1415 +1415, 1416 +1417, 1415 +1415, 1417 +1419, 1418 +1418, 1419 +1420, 1419 +1419, 1420 +1421, 1420 +1420, 1421 +1422, 1421 +1421, 1422 +1423, 1422 +1422, 1423 +1423, 1418 +1418, 1423 +1424, 1422 +1422, 1424 +1425, 1424 +1424, 1425 +1426, 1425 +1425, 1426 +1427, 1426 +1426, 1427 +1428, 1427 +1427, 1428 +1429, 1428 +1428, 1429 +1430, 1429 +1429, 1430 +1430, 1425 +1425, 1430 +1431, 1430 +1430, 1431 +1431, 1421 +1421, 1431 +1432, 1428 +1428, 1432 +1433, 1432 +1432, 1433 +1434, 1432 +1432, 1434 +1436, 1435 +1435, 1436 +1437, 1436 +1436, 1437 +1438, 1437 +1437, 1438 +1439, 1438 +1438, 1439 +1440, 1439 +1439, 1440 +1441, 1440 +1440, 1441 +1442, 1441 +1441, 1442 +1442, 1437 +1437, 1442 +1443, 1442 +1442, 1443 +1444, 1443 +1443, 1444 +1444, 1435 +1435, 1444 +1445, 1443 +1443, 1445 +1446, 1445 +1445, 1446 +1446, 1441 +1441, 1446 +1447, 1446 +1446, 1447 +1448, 1447 +1447, 1448 +1449, 1448 +1448, 1449 +1450, 1449 +1449, 1450 +1450, 1445 +1445, 1450 +1451, 1447 +1447, 1451 +1452, 1451 +1451, 1452 +1453, 1451 +1451, 1453 +1455, 1454 +1454, 1455 +1456, 1455 +1455, 1456 +1457, 1456 +1456, 1457 +1458, 1457 +1457, 1458 +1459, 1458 +1458, 1459 +1459, 1454 +1454, 1459 +1460, 1458 +1458, 1460 +1461, 1460 +1460, 1461 +1462, 1460 +1460, 1462 +1463, 1456 +1456, 1463 +1464, 1463 +1463, 1464 +1465, 1463 +1463, 1465 +1467, 1466 +1466, 1467 +1468, 1467 +1467, 1468 +1469, 1468 +1468, 1469 +1470, 1469 +1469, 1470 +1471, 1470 +1470, 1471 +1471, 1466 +1466, 1471 +1472, 1470 +1470, 1472 +1473, 1472 +1472, 1473 +1474, 1473 +1473, 1474 +1475, 1474 +1474, 1475 +1476, 1475 +1475, 1476 +1477, 1476 +1476, 1477 +1477, 1472 +1472, 1477 +1478, 1477 +1477, 1478 +1478, 1469 +1469, 1478 +1479, 1478 +1478, 1479 +1480, 1479 +1479, 1480 +1481, 1480 +1480, 1481 +1481, 1476 +1476, 1481 +1482, 1480 +1480, 1482 +1483, 1482 +1482, 1483 +1484, 1482 +1482, 1484 +1485, 1479 +1479, 1485 +1486, 1485 +1485, 1486 +1487, 1485 +1485, 1487 +1488, 1475 +1475, 1488 +1489, 1488 +1488, 1489 +1490, 1488 +1488, 1490 +1492, 1491 +1491, 1492 +1493, 1492 +1492, 1493 +1494, 1493 +1493, 1494 +1495, 1494 +1494, 1495 +1496, 1495 +1495, 1496 +1497, 1496 +1496, 1497 +1498, 1497 +1497, 1498 +1499, 1498 +1498, 1499 +1500, 1499 +1499, 1500 +1501, 1500 +1500, 1501 +1501, 1496 +1496, 1501 +1502, 1501 +1501, 1502 +1502, 1494 +1494, 1502 +1503, 1502 +1502, 1503 +1503, 1491 +1491, 1503 +1504, 1498 +1498, 1504 +1505, 1504 +1504, 1505 +1506, 1504 +1504, 1506 +1508, 1507 +1507, 1508 +1509, 1508 +1508, 1509 +1510, 1509 +1509, 1510 +1511, 1510 +1510, 1511 +1512, 1511 +1511, 1512 +1513, 1512 +1512, 1513 +1514, 1513 +1513, 1514 +1514, 1509 +1509, 1514 +1515, 1512 +1512, 1515 +1516, 1515 +1515, 1516 +1517, 1515 +1515, 1517 +1519, 1518 +1518, 1519 +1520, 1519 +1519, 1520 +1521, 1520 +1520, 1521 +1522, 1521 +1521, 1522 +1523, 1522 +1522, 1523 +1523, 1518 +1518, 1523 +1524, 1522 +1522, 1524 +1525, 1524 +1524, 1525 +1526, 1525 +1525, 1526 +1527, 1526 +1526, 1527 +1528, 1527 +1527, 1528 +1529, 1528 +1528, 1529 +1530, 1529 +1529, 1530 +1531, 1530 +1530, 1531 +1531, 1526 +1526, 1531 +1532, 1531 +1531, 1532 +1533, 1532 +1532, 1533 +1534, 1533 +1533, 1534 +1534, 1525 +1525, 1534 +1535, 1534 +1534, 1535 +1535, 1521 +1521, 1535 +1536, 1535 +1535, 1536 +1537, 1536 +1536, 1537 +1537, 1533 +1533, 1537 +1538, 1537 +1537, 1538 +1539, 1538 +1538, 1539 +1540, 1538 +1538, 1540 +1542, 1541 +1541, 1542 +1543, 1542 +1542, 1543 +1544, 1543 +1543, 1544 +1545, 1544 +1544, 1545 +1546, 1545 +1545, 1546 +1547, 1546 +1546, 1547 +1548, 1547 +1547, 1548 +1549, 1548 +1548, 1549 +1550, 1549 +1549, 1550 +1551, 1550 +1550, 1551 +1552, 1551 +1551, 1552 +1552, 1547 +1547, 1552 +1553, 1552 +1552, 1553 +1554, 1553 +1553, 1554 +1555, 1554 +1554, 1555 +1555, 1546 +1546, 1555 +1556, 1555 +1555, 1556 +1557, 1556 +1556, 1557 +1557, 1544 +1544, 1557 +1558, 1557 +1557, 1558 +1558, 1541 +1541, 1558 +1559, 1553 +1553, 1559 +1560, 1559 +1559, 1560 +1560, 1551 +1551, 1560 +1561, 1559 +1559, 1561 +1562, 1561 +1561, 1562 +1563, 1561 +1561, 1563 +1565, 1564 +1564, 1565 +1566, 1565 +1565, 1566 +1567, 1566 +1566, 1567 +1568, 1567 +1567, 1568 +1569, 1568 +1568, 1569 +1569, 1564 +1564, 1569 +1570, 1568 +1568, 1570 +1571, 1570 +1570, 1571 +1572, 1571 +1571, 1572 +1573, 1572 +1572, 1573 +1574, 1573 +1573, 1574 +1575, 1574 +1574, 1575 +1575, 1570 +1570, 1575 +1576, 1575 +1575, 1576 +1576, 1567 +1567, 1576 +1577, 1572 +1572, 1577 +1578, 1577 +1577, 1578 +1579, 1577 +1577, 1579 +1581, 1580 +1580, 1581 +1582, 1581 +1581, 1582 +1583, 1581 +1581, 1583 +1584, 1583 +1583, 1584 +1585, 1584 +1584, 1585 +1586, 1585 +1585, 1586 +1587, 1586 +1586, 1587 +1588, 1587 +1587, 1588 +1588, 1583 +1583, 1588 +1589, 1586 +1586, 1589 +1590, 1589 +1589, 1590 +1591, 1589 +1589, 1591 +1593, 1592 +1592, 1593 +1594, 1593 +1593, 1594 +1595, 1594 +1594, 1595 +1596, 1595 +1595, 1596 +1597, 1596 +1596, 1597 +1598, 1597 +1597, 1598 +1599, 1598 +1598, 1599 +1599, 1594 +1594, 1599 +1600, 1599 +1599, 1600 +1601, 1600 +1600, 1601 +1602, 1600 +1600, 1602 +1603, 1595 +1595, 1603 +1604, 1603 +1603, 1604 +1604, 1593 +1593, 1604 +1606, 1605 +1605, 1606 +1607, 1606 +1606, 1607 +1608, 1607 +1607, 1608 +1609, 1608 +1608, 1609 +1610, 1609 +1609, 1610 +1610, 1605 +1605, 1610 +1611, 1609 +1609, 1611 +1612, 1611 +1611, 1612 +1613, 1612 +1612, 1613 +1614, 1613 +1613, 1614 +1615, 1614 +1614, 1615 +1616, 1615 +1615, 1616 +1616, 1611 +1611, 1616 +1617, 1616 +1616, 1617 +1618, 1617 +1617, 1618 +1618, 1608 +1608, 1618 +1619, 1618 +1618, 1619 +1620, 1619 +1619, 1620 +1621, 1620 +1620, 1621 +1622, 1621 +1621, 1622 +1622, 1617 +1617, 1622 +1623, 1622 +1622, 1623 +1624, 1623 +1623, 1624 +1624, 1615 +1615, 1624 +1625, 1619 +1619, 1625 +1626, 1625 +1625, 1626 +1627, 1625 +1625, 1627 +1629, 1628 +1628, 1629 +1630, 1629 +1629, 1630 +1631, 1630 +1630, 1631 +1632, 1631 +1631, 1632 +1633, 1632 +1632, 1633 +1634, 1633 +1633, 1634 +1635, 1634 +1634, 1635 +1635, 1630 +1630, 1635 +1636, 1635 +1635, 1636 +1637, 1636 +1636, 1637 +1637, 1628 +1628, 1637 +1638, 1637 +1637, 1638 +1639, 1638 +1638, 1639 +1640, 1639 +1639, 1640 +1641, 1640 +1640, 1641 +1641, 1636 +1636, 1641 +1642, 1641 +1641, 1642 +1643, 1642 +1642, 1643 +1643, 1634 +1634, 1643 +1644, 1640 +1640, 1644 +1645, 1644 +1644, 1645 +1646, 1644 +1644, 1646 +1647, 1632 +1632, 1647 +1648, 1647 +1647, 1648 +1649, 1648 +1648, 1649 +1650, 1649 +1649, 1650 +1650, 1631 +1631, 1650 +1651, 1648 +1648, 1651 +1652, 1647 +1647, 1652 +1654, 1653 +1653, 1654 +1655, 1654 +1654, 1655 +1656, 1655 +1655, 1656 +1657, 1656 +1656, 1657 +1658, 1657 +1657, 1658 +1658, 1653 +1653, 1658 +1659, 1657 +1657, 1659 +1660, 1659 +1659, 1660 +1661, 1660 +1660, 1661 +1662, 1661 +1661, 1662 +1662, 1656 +1656, 1662 +1663, 1662 +1662, 1663 +1664, 1663 +1663, 1664 +1665, 1664 +1664, 1665 +1666, 1665 +1665, 1666 +1666, 1661 +1661, 1666 +1667, 1665 +1665, 1667 +1668, 1667 +1667, 1668 +1669, 1667 +1667, 1669 +1670, 1663 +1663, 1670 +1671, 1670 +1670, 1671 +1671, 1655 +1655, 1671 +1673, 1672 +1672, 1673 +1674, 1673 +1673, 1674 +1675, 1674 +1674, 1675 +1676, 1675 +1675, 1676 +1677, 1676 +1676, 1677 +1677, 1672 +1672, 1677 +1678, 1676 +1676, 1678 +1679, 1678 +1678, 1679 +1680, 1679 +1679, 1680 +1681, 1680 +1680, 1681 +1682, 1681 +1681, 1682 +1683, 1682 +1682, 1683 +1683, 1678 +1678, 1683 +1684, 1683 +1683, 1684 +1685, 1684 +1684, 1685 +1685, 1675 +1675, 1685 +1686, 1685 +1685, 1686 +1687, 1686 +1686, 1687 +1688, 1687 +1687, 1688 +1689, 1688 +1688, 1689 +1689, 1684 +1684, 1689 +1690, 1689 +1689, 1690 +1691, 1690 +1690, 1691 +1691, 1682 +1682, 1691 +1692, 1688 +1688, 1692 +1693, 1692 +1692, 1693 +1694, 1692 +1692, 1694 +1696, 1695 +1695, 1696 +1697, 1696 +1696, 1697 +1698, 1697 +1697, 1698 +1699, 1698 +1698, 1699 +1700, 1699 +1699, 1700 +1701, 1700 +1700, 1701 +1702, 1701 +1701, 1702 +1703, 1702 +1702, 1703 +1704, 1703 +1703, 1704 +1705, 1704 +1704, 1705 +1705, 1700 +1700, 1705 +1706, 1705 +1705, 1706 +1706, 1697 +1697, 1706 +1707, 1706 +1706, 1707 +1708, 1707 +1707, 1708 +1708, 1695 +1695, 1708 +1709, 1707 +1707, 1709 +1710, 1709 +1709, 1710 +1710, 1704 +1704, 1710 +1711, 1710 +1710, 1711 +1712, 1711 +1711, 1712 +1713, 1711 +1711, 1713 +1715, 1714 +1714, 1715 +1716, 1715 +1715, 1716 +1717, 1716 +1716, 1717 +1718, 1717 +1717, 1718 +1719, 1718 +1718, 1719 +1720, 1719 +1719, 1720 +1721, 1720 +1720, 1721 +1721, 1716 +1716, 1721 +1722, 1721 +1721, 1722 +1723, 1722 +1722, 1723 +1723, 1714 +1714, 1723 +1724, 1722 +1722, 1724 +1725, 1724 +1724, 1725 +1726, 1724 +1724, 1726 +1727, 1719 +1719, 1727 +1728, 1727 +1727, 1728 +1729, 1727 +1727, 1729 +1730, 1718 +1718, 1730 +1731, 1730 +1730, 1731 +1732, 1730 +1730, 1732 +1734, 1733 +1733, 1734 +1735, 1734 +1734, 1735 +1736, 1735 +1735, 1736 +1737, 1736 +1736, 1737 +1738, 1737 +1737, 1738 +1739, 1738 +1738, 1739 +1740, 1739 +1739, 1740 +1740, 1735 +1735, 1740 +1741, 1740 +1740, 1741 +1742, 1741 +1741, 1742 +1742, 1733 +1733, 1742 +1743, 1742 +1742, 1743 +1744, 1743 +1743, 1744 +1745, 1744 +1744, 1745 +1746, 1745 +1745, 1746 +1746, 1741 +1741, 1746 +1747, 1746 +1746, 1747 +1748, 1747 +1747, 1748 +1748, 1739 +1739, 1748 +1749, 1745 +1745, 1749 +1750, 1749 +1749, 1750 +1751, 1749 +1749, 1751 +1752, 1738 +1738, 1752 +1753, 1752 +1752, 1753 +1754, 1752 +1752, 1754 +1755, 1736 +1736, 1755 +1756, 1755 +1755, 1756 +1757, 1755 +1755, 1757 +1759, 1758 +1758, 1759 +1760, 1759 +1759, 1760 +1761, 1760 +1760, 1761 +1762, 1761 +1761, 1762 +1763, 1762 +1762, 1763 +1764, 1763 +1763, 1764 +1765, 1764 +1764, 1765 +1765, 1760 +1760, 1765 +1766, 1764 +1764, 1766 +1767, 1766 +1766, 1767 +1768, 1767 +1767, 1768 +1768, 1763 +1763, 1768 +1769, 1768 +1768, 1769 +1770, 1769 +1769, 1770 +1771, 1770 +1770, 1771 +1772, 1771 +1771, 1772 +1772, 1767 +1767, 1772 +1773, 1771 +1771, 1773 +1774, 1773 +1773, 1774 +1775, 1773 +1773, 1775 +1777, 1776 +1776, 1777 +1778, 1777 +1777, 1778 +1779, 1778 +1778, 1779 +1780, 1779 +1779, 1780 +1781, 1780 +1780, 1781 +1782, 1781 +1781, 1782 +1783, 1782 +1782, 1783 +1783, 1778 +1778, 1783 +1784, 1783 +1783, 1784 +1785, 1784 +1784, 1785 +1785, 1776 +1776, 1785 +1786, 1784 +1784, 1786 +1787, 1786 +1786, 1787 +1788, 1786 +1786, 1788 +1790, 1789 +1789, 1790 +1791, 1790 +1790, 1791 +1792, 1791 +1791, 1792 +1793, 1792 +1792, 1793 +1794, 1793 +1793, 1794 +1795, 1794 +1794, 1795 +1796, 1795 +1795, 1796 +1796, 1791 +1791, 1796 +1797, 1796 +1796, 1797 +1798, 1797 +1797, 1798 +1798, 1789 +1789, 1798 +1799, 1797 +1797, 1799 +1800, 1799 +1799, 1800 +1800, 1795 +1795, 1800 +1801, 1800 +1800, 1801 +1802, 1801 +1801, 1802 +1803, 1801 +1801, 1803 +1805, 1804 +1804, 1805 +1806, 1805 +1805, 1806 +1807, 1806 +1806, 1807 +1808, 1807 +1807, 1808 +1809, 1808 +1808, 1809 +1809, 1804 +1804, 1809 +1810, 1808 +1808, 1810 +1811, 1806 +1806, 1811 +1812, 1811 +1811, 1812 +1813, 1812 +1812, 1813 +1814, 1813 +1813, 1814 +1815, 1814 +1814, 1815 +1816, 1815 +1815, 1816 +1816, 1811 +1811, 1816 +1817, 1815 +1815, 1817 +1818, 1817 +1817, 1818 +1819, 1817 +1817, 1819 +1821, 1820 +1820, 1821 +1822, 1821 +1821, 1822 +1823, 1822 +1822, 1823 +1824, 1823 +1823, 1824 +1825, 1824 +1824, 1825 +1826, 1825 +1825, 1826 +1827, 1826 +1826, 1827 +1828, 1827 +1827, 1828 +1829, 1828 +1828, 1829 +1830, 1829 +1829, 1830 +1830, 1825 +1825, 1830 +1831, 1830 +1830, 1831 +1831, 1822 +1822, 1831 +1832, 1831 +1831, 1832 +1833, 1832 +1832, 1833 +1833, 1820 +1820, 1833 +1834, 1832 +1832, 1834 +1835, 1834 +1834, 1835 +1835, 1829 +1829, 1835 +1836, 1835 +1835, 1836 +1837, 1836 +1836, 1837 +1838, 1837 +1837, 1838 +1839, 1838 +1838, 1839 +1839, 1834 +1834, 1839 +1840, 1826 +1826, 1840 +1841, 1840 +1840, 1841 +1842, 1840 +1840, 1842 +1844, 1843 +1843, 1844 +1845, 1844 +1844, 1845 +1846, 1845 +1845, 1846 +1847, 1846 +1846, 1847 +1848, 1847 +1847, 1848 +1848, 1843 +1843, 1848 +1849, 1848 +1848, 1849 +1850, 1849 +1849, 1850 +1851, 1849 +1849, 1851 +1852, 1851 +1851, 1852 +1852, 1847 +1847, 1852 +1853, 1852 +1852, 1853 +1854, 1853 +1853, 1854 +1855, 1854 +1854, 1855 +1856, 1855 +1855, 1856 +1856, 1851 +1851, 1856 +1857, 1855 +1855, 1857 +1858, 1857 +1857, 1858 +1859, 1857 +1857, 1859 +1860, 1853 +1853, 1860 +1861, 1860 +1860, 1861 +1862, 1860 +1860, 1862 +1863, 1846 +1846, 1863 +1864, 1863 +1863, 1864 +1865, 1863 +1863, 1865 +1866, 1844 +1844, 1866 +1867, 1866 +1866, 1867 +1868, 1866 +1866, 1868 +1870, 1869 +1869, 1870 +1871, 1870 +1870, 1871 +1872, 1871 +1871, 1872 +1873, 1872 +1872, 1873 +1874, 1873 +1873, 1874 +1875, 1874 +1874, 1875 +1876, 1875 +1875, 1876 +1877, 1876 +1876, 1877 +1878, 1877 +1877, 1878 +1879, 1878 +1878, 1879 +1879, 1874 +1874, 1879 +1880, 1879 +1879, 1880 +1880, 1871 +1871, 1880 +1881, 1880 +1880, 1881 +1882, 1881 +1881, 1882 +1882, 1869 +1869, 1882 +1883, 1881 +1881, 1883 +1884, 1883 +1883, 1884 +1884, 1878 +1878, 1884 +1885, 1876 +1876, 1885 +1886, 1885 +1885, 1886 +1887, 1885 +1885, 1887 +1889, 1888 +1888, 1889 +1890, 1889 +1889, 1890 +1891, 1890 +1890, 1891 +1892, 1891 +1891, 1892 +1893, 1892 +1892, 1893 +1894, 1893 +1893, 1894 +1895, 1894 +1894, 1895 +1896, 1895 +1895, 1896 +1897, 1896 +1896, 1897 +1898, 1897 +1897, 1898 +1898, 1893 +1893, 1898 +1899, 1898 +1898, 1899 +1899, 1890 +1890, 1899 +1900, 1899 +1899, 1900 +1901, 1900 +1900, 1901 +1901, 1888 +1888, 1901 +1902, 1900 +1900, 1902 +1903, 1902 +1902, 1903 +1903, 1897 +1897, 1903 +1904, 1903 +1903, 1904 +1905, 1904 +1904, 1905 +1906, 1905 +1905, 1906 +1907, 1906 +1906, 1907 +1907, 1902 +1902, 1907 +1908, 1896 +1896, 1908 +1909, 1908 +1908, 1909 +1910, 1908 +1908, 1910 +1912, 1911 +1911, 1912 +1913, 1912 +1912, 1913 +1914, 1913 +1913, 1914 +1915, 1914 +1914, 1915 +1916, 1915 +1915, 1916 +1917, 1916 +1916, 1917 +1918, 1917 +1917, 1918 +1919, 1918 +1918, 1919 +1920, 1919 +1919, 1920 +1921, 1920 +1920, 1921 +1921, 1916 +1916, 1921 +1922, 1921 +1921, 1922 +1922, 1913 +1913, 1922 +1923, 1922 +1922, 1923 +1924, 1923 +1923, 1924 +1924, 1911 +1911, 1924 +1925, 1915 +1915, 1925 +1926, 1925 +1925, 1926 +1927, 1925 +1925, 1927 +1929, 1928 +1928, 1929 +1930, 1929 +1929, 1930 +1931, 1930 +1930, 1931 +1932, 1931 +1931, 1932 +1933, 1932 +1932, 1933 +1934, 1933 +1933, 1934 +1935, 1934 +1934, 1935 +1936, 1935 +1935, 1936 +1937, 1936 +1936, 1937 +1938, 1937 +1937, 1938 +1938, 1933 +1933, 1938 +1939, 1938 +1938, 1939 +1939, 1930 +1930, 1939 +1940, 1939 +1939, 1940 +1941, 1940 +1940, 1941 +1941, 1928 +1928, 1941 +1942, 1940 +1940, 1942 +1943, 1942 +1942, 1943 +1943, 1937 +1937, 1943 +1944, 1943 +1943, 1944 +1945, 1936 +1936, 1945 +1946, 1945 +1945, 1946 +1947, 1945 +1945, 1947 +1949, 1948 +1948, 1949 +1950, 1949 +1949, 1950 +1951, 1950 +1950, 1951 +1952, 1951 +1951, 1952 +1953, 1952 +1952, 1953 +1953, 1948 +1948, 1953 +1954, 1952 +1952, 1954 +1955, 1954 +1954, 1955 +1956, 1955 +1955, 1956 +1957, 1956 +1956, 1957 +1958, 1957 +1957, 1958 +1959, 1958 +1958, 1959 +1959, 1954 +1954, 1959 +1960, 1959 +1959, 1960 +1960, 1951 +1951, 1960 +1961, 1960 +1960, 1961 +1962, 1961 +1961, 1962 +1963, 1962 +1962, 1963 +1963, 1958 +1958, 1963 +1964, 1963 +1963, 1964 +1965, 1964 +1964, 1965 +1966, 1964 +1964, 1966 +1967, 1962 +1962, 1967 +1968, 1967 +1967, 1968 +1969, 1967 +1967, 1969 +1970, 1956 +1956, 1970 +1971, 1970 +1970, 1971 +1972, 1970 +1970, 1972 +1974, 1973 +1973, 1974 +1975, 1974 +1974, 1975 +1976, 1975 +1975, 1976 +1977, 1976 +1976, 1977 +1978, 1977 +1977, 1978 +1978, 1973 +1973, 1978 +1979, 1977 +1977, 1979 +1980, 1979 +1979, 1980 +1981, 1980 +1980, 1981 +1982, 1981 +1981, 1982 +1983, 1982 +1982, 1983 +1984, 1983 +1983, 1984 +1984, 1979 +1979, 1984 +1985, 1984 +1984, 1985 +1985, 1976 +1976, 1985 +1986, 1985 +1985, 1986 +1987, 1986 +1986, 1987 +1988, 1987 +1987, 1988 +1988, 1983 +1983, 1988 +1989, 1988 +1988, 1989 +1990, 1989 +1989, 1990 +1991, 1989 +1989, 1991 +1993, 1992 +1992, 1993 +1994, 1993 +1993, 1994 +1995, 1994 +1994, 1995 +1996, 1995 +1995, 1996 +1997, 1996 +1996, 1997 +1998, 1997 +1997, 1998 +1999, 1998 +1998, 1999 +2000, 1999 +1999, 2000 +2001, 2000 +2000, 2001 +2002, 2001 +2001, 2002 +2002, 1997 +1997, 2002 +2003, 2002 +2002, 2003 +2003, 1994 +1994, 2003 +2004, 2003 +2003, 2004 +2005, 2004 +2004, 2005 +2005, 1992 +1992, 2005 +2006, 2005 +2005, 2006 +2007, 2006 +2006, 2007 +2008, 2007 +2007, 2008 +2009, 2008 +2008, 2009 +2009, 2004 +2004, 2009 +2010, 2009 +2009, 2010 +2010, 2001 +2001, 2010 +2011, 2010 +2010, 2011 +2012, 2011 +2011, 2012 +2013, 2012 +2012, 2013 +2013, 2008 +2008, 2013 +2014, 2013 +2013, 2014 +2015, 2014 +2014, 2015 +2016, 2014 +2014, 2016 +2017, 1998 +1998, 2017 +2018, 2017 +2017, 2018 +2019, 2017 +2017, 2019 +2021, 2020 +2020, 2021 +2022, 2021 +2021, 2022 +2023, 2022 +2022, 2023 +2024, 2023 +2023, 2024 +2025, 2024 +2024, 2025 +2025, 2020 +2020, 2025 +2026, 2024 +2024, 2026 +2027, 2026 +2026, 2027 +2028, 2026 +2026, 2028 +2029, 2023 +2023, 2029 +2030, 2029 +2029, 2030 +2031, 2030 +2030, 2031 +2032, 2031 +2031, 2032 +2033, 2032 +2032, 2033 +2034, 2033 +2033, 2034 +2034, 2029 +2029, 2034 +2035, 2034 +2034, 2035 +2036, 2035 +2035, 2036 +2037, 2035 +2035, 2037 +2038, 2032 +2032, 2038 +2039, 2038 +2038, 2039 +2040, 2038 +2038, 2040 +2041, 2022 +2022, 2041 +2042, 2041 +2041, 2042 +2043, 2041 +2041, 2043 +2045, 2044 +2044, 2045 +2046, 2045 +2045, 2046 +2047, 2046 +2046, 2047 +2048, 2047 +2047, 2048 +2049, 2048 +2048, 2049 +2049, 2044 +2044, 2049 +2050, 2049 +2049, 2050 +2051, 2050 +2050, 2051 +2052, 2046 +2046, 2052 +2053, 2052 +2052, 2053 +2054, 2052 +2052, 2054 +2056, 2055 +2055, 2056 +2057, 2056 +2056, 2057 +2058, 2057 +2057, 2058 +2059, 2058 +2058, 2059 +2060, 2059 +2059, 2060 +2061, 2060 +2060, 2061 +2062, 2061 +2061, 2062 +2062, 2057 +2057, 2062 +2063, 2062 +2062, 2063 +2064, 2063 +2063, 2064 +2064, 2055 +2055, 2064 +2065, 2063 +2063, 2065 +2066, 2065 +2065, 2066 +2066, 2061 +2061, 2066 +2067, 2060 +2060, 2067 +2068, 2067 +2067, 2068 +2069, 2067 +2067, 2069 +2071, 2070 +2070, 2071 +2072, 2071 +2071, 2072 +2073, 2072 +2072, 2073 +2074, 2073 +2073, 2074 +2075, 2074 +2074, 2075 +2075, 2070 +2070, 2075 +2076, 2075 +2075, 2076 +2077, 2076 +2076, 2077 +2078, 2076 +2076, 2078 +2079, 2073 +2073, 2079 +2080, 2079 +2079, 2080 +2081, 2079 +2079, 2081 +2082, 2072 +2072, 2082 +2084, 2083 +2083, 2084 +2085, 2084 +2084, 2085 +2086, 2085 +2085, 2086 +2087, 2086 +2086, 2087 +2088, 2087 +2087, 2088 +2088, 2083 +2083, 2088 +2089, 2087 +2087, 2089 +2090, 2089 +2089, 2090 +2091, 2090 +2090, 2091 +2092, 2091 +2091, 2092 +2093, 2092 +2092, 2093 +2094, 2093 +2093, 2094 +2094, 2089 +2089, 2094 +2095, 2092 +2092, 2095 +2096, 2095 +2095, 2096 +2097, 2095 +2095, 2097 +2098, 2086 +2086, 2098 +2100, 2099 +2099, 2100 +2101, 2100 +2100, 2101 +2102, 2101 +2101, 2102 +2103, 2102 +2102, 2103 +2104, 2103 +2103, 2104 +2104, 2099 +2099, 2104 +2105, 2104 +2104, 2105 +2106, 2105 +2105, 2106 +2107, 2105 +2105, 2107 +2108, 2102 +2102, 2108 +2109, 2108 +2108, 2109 +2110, 2109 +2109, 2110 +2110, 2101 +2101, 2110 +2112, 2111 +2111, 2112 +2113, 2112 +2112, 2113 +2114, 2113 +2113, 2114 +2115, 2114 +2114, 2115 +2116, 2115 +2115, 2116 +2116, 2111 +2111, 2116 +2117, 2116 +2116, 2117 +2118, 2117 +2117, 2118 +2119, 2117 +2117, 2119 +2120, 2113 +2113, 2120 +2122, 2121 +2121, 2122 +2123, 2122 +2122, 2123 +2124, 2123 +2123, 2124 +2125, 2124 +2124, 2125 +2126, 2125 +2125, 2126 +2126, 2121 +2121, 2126 +2127, 2125 +2125, 2127 +2128, 2127 +2127, 2128 +2129, 2127 +2127, 2129 +2130, 2123 +2123, 2130 +2131, 2130 +2130, 2131 +2132, 2131 +2131, 2132 +2133, 2132 +2132, 2133 +2134, 2133 +2133, 2134 +2135, 2134 +2134, 2135 +2135, 2130 +2130, 2135 +2136, 2135 +2135, 2136 +2137, 2136 +2136, 2137 +2138, 2136 +2136, 2138 +2139, 2133 +2133, 2139 +2140, 2139 +2139, 2140 +2141, 2139 +2139, 2141 +2143, 2142 +2142, 2143 +2144, 2143 +2143, 2144 +2145, 2144 +2144, 2145 +2146, 2145 +2145, 2146 +2147, 2146 +2146, 2147 +2148, 2147 +2147, 2148 +2149, 2148 +2148, 2149 +2149, 2144 +2144, 2149 +2150, 2149 +2149, 2150 +2151, 2150 +2150, 2151 +2151, 2142 +2142, 2151 +2152, 2151 +2151, 2152 +2153, 2152 +2152, 2153 +2154, 2153 +2153, 2154 +2155, 2154 +2154, 2155 +2155, 2150 +2150, 2155 +2156, 2155 +2155, 2156 +2157, 2156 +2156, 2157 +2157, 2148 +2148, 2157 +2158, 2154 +2154, 2158 +2159, 2158 +2158, 2159 +2160, 2158 +2158, 2160 +2161, 2146 +2146, 2161 +2162, 2161 +2161, 2162 +2163, 2162 +2162, 2163 +2164, 2163 +2163, 2164 +2164, 2145 +2145, 2164 +2166, 2165 +2165, 2166 +2167, 2166 +2166, 2167 +2168, 2167 +2167, 2168 +2169, 2168 +2168, 2169 +2170, 2169 +2169, 2170 +2170, 2165 +2165, 2170 +2171, 2169 +2169, 2171 +2172, 2171 +2171, 2172 +2173, 2172 +2172, 2173 +2174, 2173 +2173, 2174 +2175, 2174 +2174, 2175 +2176, 2175 +2175, 2176 +2176, 2171 +2171, 2176 +2177, 2176 +2176, 2177 +2178, 2177 +2177, 2178 +2179, 2177 +2177, 2179 +2180, 2174 +2174, 2180 +2181, 2180 +2180, 2181 +2182, 2180 +2180, 2182 +2183, 2168 +2168, 2183 +2184, 2183 +2183, 2184 +2185, 2183 +2183, 2185 +2187, 2186 +2186, 2187 +2188, 2187 +2187, 2188 +2189, 2188 +2188, 2189 +2190, 2189 +2189, 2190 +2191, 2190 +2190, 2191 +2192, 2191 +2191, 2192 +2193, 2192 +2192, 2193 +2193, 2188 +2188, 2193 +2194, 2193 +2193, 2194 +2195, 2194 +2194, 2195 +2195, 2187 +2187, 2195 +2196, 2191 +2191, 2196 +2197, 2196 +2196, 2197 +2198, 2196 +2196, 2198 +2200, 2199 +2199, 2200 +2201, 2200 +2200, 2201 +2202, 2201 +2201, 2202 +2203, 2202 +2202, 2203 +2204, 2203 +2203, 2204 +2204, 2199 +2199, 2204 +2205, 2203 +2203, 2205 +2206, 2205 +2205, 2206 +2207, 2206 +2206, 2207 +2208, 2207 +2207, 2208 +2209, 2208 +2208, 2209 +2210, 2209 +2209, 2210 +2210, 2205 +2205, 2210 +2211, 2210 +2210, 2211 +2211, 2202 +2202, 2211 +2212, 2211 +2211, 2212 +2213, 2212 +2212, 2213 +2214, 2213 +2213, 2214 +2214, 2209 +2209, 2214 +2215, 2213 +2213, 2215 +2216, 2215 +2215, 2216 +2217, 2215 +2215, 2217 +2218, 2212 +2212, 2218 +2219, 2218 +2218, 2219 +2220, 2218 +2218, 2220 +2221, 2207 +2207, 2221 +2222, 2221 +2221, 2222 +2223, 2221 +2221, 2223 +2225, 2224 +2224, 2225 +2226, 2225 +2225, 2226 +2227, 2226 +2226, 2227 +2228, 2227 +2227, 2228 +2229, 2228 +2228, 2229 +2229, 2224 +2224, 2229 +2230, 2228 +2228, 2230 +2231, 2230 +2230, 2231 +2232, 2231 +2231, 2232 +2233, 2232 +2232, 2233 +2233, 2227 +2227, 2233 +2234, 2233 +2233, 2234 +2235, 2234 +2234, 2235 +2236, 2235 +2235, 2236 +2237, 2236 +2236, 2237 +2237, 2232 +2232, 2237 +2238, 2237 +2237, 2238 +2239, 2238 +2238, 2239 +2240, 2239 +2239, 2240 +2241, 2240 +2240, 2241 +2241, 2236 +2236, 2241 +2242, 2235 +2235, 2242 +2243, 2242 +2242, 2243 +2244, 2242 +2242, 2244 +2246, 2245 +2245, 2246 +2247, 2246 +2246, 2247 +2248, 2247 +2247, 2248 +2249, 2248 +2248, 2249 +2250, 2249 +2249, 2250 +2251, 2250 +2250, 2251 +2251, 2246 +2246, 2251 +2252, 2251 +2251, 2252 +2253, 2252 +2252, 2253 +2254, 2253 +2253, 2254 +2255, 2254 +2254, 2255 +2256, 2255 +2255, 2256 +2257, 2256 +2256, 2257 +2257, 2252 +2252, 2257 +2258, 2256 +2256, 2258 +2259, 2255 +2255, 2259 +2260, 2259 +2259, 2260 +2261, 2259 +2259, 2261 +2263, 2262 +2262, 2263 +2264, 2263 +2263, 2264 +2265, 2264 +2264, 2265 +2266, 2265 +2265, 2266 +2267, 2266 +2266, 2267 +2267, 2262 +2262, 2267 +2268, 2267 +2267, 2268 +2269, 2265 +2265, 2269 +2270, 2264 +2264, 2270 +2271, 2270 +2270, 2271 +2272, 2270 +2270, 2272 +2274, 2273 +2273, 2274 +2275, 2274 +2274, 2275 +2276, 2275 +2275, 2276 +2277, 2276 +2276, 2277 +2278, 2277 +2277, 2278 +2279, 2278 +2278, 2279 +2280, 2279 +2279, 2280 +2281, 2280 +2280, 2281 +2282, 2281 +2281, 2282 +2283, 2282 +2282, 2283 +2283, 2278 +2278, 2283 +2284, 2283 +2283, 2284 +2284, 2275 +2275, 2284 +2285, 2284 +2284, 2285 +2286, 2285 +2285, 2286 +2286, 2273 +2273, 2286 +2287, 2285 +2285, 2287 +2288, 2287 +2287, 2288 +2288, 2282 +2282, 2288 +2289, 2280 +2280, 2289 +2290, 2289 +2289, 2290 +2291, 2289 +2289, 2291 +2293, 2292 +2292, 2293 +2294, 2293 +2293, 2294 +2295, 2294 +2294, 2295 +2296, 2295 +2295, 2296 +2297, 2296 +2296, 2297 +2297, 2292 +2292, 2297 +2298, 2296 +2296, 2298 +2299, 2298 +2298, 2299 +2300, 2298 +2298, 2300 +2301, 2295 +2295, 2301 +2302, 2301 +2301, 2302 +2303, 2302 +2302, 2303 +2304, 2303 +2303, 2304 +2305, 2304 +2304, 2305 +2306, 2305 +2305, 2306 +2307, 2306 +2306, 2307 +2307, 2302 +2302, 2307 +2308, 2307 +2307, 2308 +2308, 2294 +2294, 2308 +2309, 2305 +2305, 2309 +2310, 2309 +2309, 2310 +2311, 2309 +2309, 2311 +2313, 2312 +2312, 2313 +2314, 2313 +2313, 2314 +2315, 2314 +2314, 2315 +2316, 2315 +2315, 2316 +2317, 2316 +2316, 2317 +2317, 2312 +2312, 2317 +2318, 2316 +2316, 2318 +2319, 2318 +2318, 2319 +2320, 2318 +2318, 2320 +2321, 2314 +2314, 2321 +2322, 2321 +2321, 2322 +2323, 2322 +2322, 2323 +2324, 2323 +2323, 2324 +2325, 2324 +2324, 2325 +2326, 2325 +2325, 2326 +2326, 2321 +2321, 2326 +2327, 2325 +2325, 2327 +2328, 2327 +2327, 2328 +2329, 2327 +2327, 2329 +2330, 2324 +2324, 2330 +2331, 2330 +2330, 2331 +2332, 2330 +2330, 2332 +2334, 2333 +2333, 2334 +2335, 2334 +2334, 2335 +2336, 2335 +2335, 2336 +2337, 2336 +2336, 2337 +2338, 2337 +2337, 2338 +2339, 2338 +2338, 2339 +2340, 2339 +2339, 2340 +2341, 2340 +2340, 2341 +2341, 2336 +2336, 2341 +2342, 2341 +2341, 2342 +2342, 2333 +2333, 2342 +2343, 2340 +2340, 2343 +2344, 2343 +2343, 2344 +2345, 2343 +2343, 2345 +2346, 2337 +2337, 2346 +2347, 2346 +2346, 2347 +2347, 2335 +2335, 2347 +2349, 2348 +2348, 2349 +2350, 2349 +2349, 2350 +2351, 2350 +2350, 2351 +2352, 2351 +2351, 2352 +2353, 2352 +2352, 2353 +2353, 2348 +2348, 2353 +2354, 2353 +2353, 2354 +2355, 2354 +2354, 2355 +2356, 2354 +2354, 2356 +2357, 2351 +2351, 2357 +2358, 2357 +2357, 2358 +2359, 2357 +2357, 2359 +2360, 2350 +2350, 2360 +2361, 2360 +2360, 2361 +2363, 2362 +2362, 2363 +2364, 2363 +2363, 2364 +2365, 2364 +2364, 2365 +2366, 2365 +2365, 2366 +2367, 2366 +2366, 2367 +2368, 2367 +2367, 2368 +2369, 2368 +2368, 2369 +2369, 2364 +2364, 2369 +2370, 2369 +2369, 2370 +2371, 2370 +2370, 2371 +2372, 2370 +2370, 2372 +2374, 2373 +2373, 2374 +2375, 2374 +2374, 2375 +2376, 2375 +2375, 2376 +2377, 2376 +2376, 2377 +2378, 2377 +2377, 2378 +2378, 2373 +2373, 2378 +2379, 2376 +2376, 2379 +2380, 2379 +2379, 2380 +2381, 2380 +2380, 2381 +2382, 2381 +2381, 2382 +2383, 2381 +2381, 2383 +2384, 2383 +2383, 2384 +2385, 2384 +2384, 2385 +2386, 2385 +2385, 2386 +2387, 2386 +2386, 2387 +2388, 2387 +2387, 2388 +2388, 2383 +2383, 2388 +2389, 2386 +2386, 2389 +2390, 2389 +2389, 2390 +2391, 2389 +2389, 2391 +2393, 2392 +2392, 2393 +2394, 2393 +2393, 2394 +2395, 2394 +2394, 2395 +2396, 2395 +2395, 2396 +2397, 2396 +2396, 2397 +2397, 2392 +2392, 2397 +2398, 2396 +2396, 2398 +2399, 2398 +2398, 2399 +2400, 2395 +2395, 2400 +2401, 2400 +2400, 2401 +2402, 2400 +2400, 2402 +2404, 2403 +2403, 2404 +2405, 2404 +2404, 2405 +2406, 2405 +2405, 2406 +2407, 2406 +2406, 2407 +2408, 2407 +2407, 2408 +2408, 2403 +2403, 2408 +2409, 2408 +2408, 2409 +2410, 2407 +2407, 2410 +2411, 2405 +2405, 2411 +2412, 2411 +2411, 2412 +2413, 2412 +2412, 2413 +2414, 2413 +2413, 2414 +2415, 2414 +2414, 2415 +2416, 2415 +2415, 2416 +2417, 2416 +2416, 2417 +2417, 2412 +2412, 2417 +2418, 2417 +2417, 2418 +2419, 2416 +2416, 2419 +2420, 2419 +2419, 2420 +2421, 2419 +2419, 2421 +2422, 2415 +2415, 2422 +2423, 2413 +2413, 2423 +2423, 2404 +2404, 2423 +2425, 2424 +2424, 2425 +2426, 2425 +2425, 2426 +2427, 2426 +2426, 2427 +2428, 2427 +2427, 2428 +2429, 2428 +2428, 2429 +2430, 2429 +2429, 2430 +2431, 2430 +2430, 2431 +2431, 2426 +2426, 2431 +2432, 2431 +2431, 2432 +2433, 2432 +2432, 2433 +2433, 2424 +2424, 2433 +2434, 2433 +2433, 2434 +2435, 2434 +2434, 2435 +2436, 2435 +2435, 2436 +2437, 2436 +2436, 2437 +2437, 2432 +2432, 2437 +2438, 2437 +2437, 2438 +2439, 2438 +2438, 2439 +2439, 2430 +2430, 2439 +2440, 2435 +2435, 2440 +2441, 2440 +2440, 2441 +2442, 2440 +2440, 2442 +2443, 2428 +2428, 2443 +2444, 2443 +2443, 2444 +2445, 2443 +2443, 2445 +2447, 2446 +2446, 2447 +2448, 2447 +2447, 2448 +2449, 2448 +2448, 2449 +2450, 2449 +2449, 2450 +2451, 2450 +2450, 2451 +2451, 2446 +2446, 2451 +2452, 2451 +2451, 2452 +2453, 2452 +2452, 2453 +2454, 2452 +2452, 2454 +2455, 2449 +2449, 2455 +2456, 2448 +2448, 2456 +2458, 2457 +2457, 2458 +2459, 2458 +2458, 2459 +2460, 2459 +2459, 2460 +2461, 2460 +2460, 2461 +2462, 2461 +2461, 2462 +2463, 2462 +2462, 2463 +2464, 2463 +2463, 2464 +2465, 2464 +2464, 2465 +2466, 2465 +2465, 2466 +2467, 2466 +2466, 2467 +2467, 2462 +2462, 2467 +2468, 2467 +2467, 2468 +2468, 2459 +2459, 2468 +2469, 2468 +2468, 2469 +2470, 2469 +2469, 2470 +2470, 2457 +2457, 2470 +2471, 2469 +2469, 2471 +2472, 2471 +2471, 2472 +2472, 2466 +2466, 2472 +2473, 2465 +2465, 2473 +2474, 2463 +2463, 2474 +2475, 2474 +2474, 2475 +2476, 2474 +2474, 2476 +2478, 2477 +2477, 2478 +2479, 2478 +2478, 2479 +2480, 2479 +2479, 2480 +2481, 2480 +2480, 2481 +2482, 2481 +2481, 2482 +2482, 2477 +2477, 2482 +2483, 2481 +2481, 2483 +2484, 2483 +2483, 2484 +2485, 2484 +2484, 2485 +2486, 2485 +2485, 2486 +2487, 2486 +2486, 2487 +2488, 2487 +2487, 2488 +2488, 2483 +2483, 2488 +2489, 2488 +2488, 2489 +2489, 2480 +2480, 2489 +2490, 2489 +2489, 2490 +2491, 2490 +2490, 2491 +2492, 2491 +2491, 2492 +2492, 2487 +2487, 2492 +2493, 2492 +2492, 2493 +2494, 2493 +2493, 2494 +2495, 2493 +2493, 2495 +2496, 2491 +2491, 2496 +2497, 2496 +2496, 2497 +2498, 2496 +2496, 2498 +2500, 2499 +2499, 2500 +2501, 2500 +2500, 2501 +2502, 2501 +2501, 2502 +2503, 2502 +2502, 2503 +2504, 2503 +2503, 2504 +2505, 2504 +2504, 2505 +2506, 2505 +2505, 2506 +2507, 2506 +2506, 2507 +2507, 2502 +2502, 2507 +2508, 2507 +2507, 2508 +2508, 2500 +2500, 2508 +2509, 2504 +2504, 2509 +2510, 2509 +2509, 2510 +2511, 2509 +2509, 2511 +2513, 2512 +2512, 2513 +2514, 2513 +2513, 2514 +2515, 2514 +2514, 2515 +2516, 2515 +2515, 2516 +2517, 2516 +2516, 2517 +2517, 2512 +2512, 2517 +2518, 2517 +2517, 2518 +2519, 2515 +2515, 2519 +2520, 2519 +2519, 2520 +2521, 2519 +2519, 2521 +2522, 2514 +2514, 2522 +2524, 2523 +2523, 2524 +2525, 2524 +2524, 2525 +2526, 2525 +2525, 2526 +2527, 2526 +2526, 2527 +2528, 2527 +2527, 2528 +2529, 2528 +2528, 2529 +2530, 2529 +2529, 2530 +2530, 2525 +2525, 2530 +2531, 2530 +2530, 2531 +2532, 2531 +2531, 2532 +2532, 2523 +2523, 2532 +2533, 2531 +2531, 2533 +2534, 2533 +2533, 2534 +2535, 2533 +2533, 2535 +2536, 2529 +2529, 2536 +2537, 2536 +2536, 2537 +2538, 2536 +2536, 2538 +2540, 2539 +2539, 2540 +2541, 2540 +2540, 2541 +2542, 2541 +2541, 2542 +2543, 2542 +2542, 2543 +2544, 2543 +2543, 2544 +2544, 2539 +2539, 2544 +2545, 2543 +2543, 2545 +2546, 2542 +2542, 2546 +2547, 2541 +2541, 2547 +2548, 2547 +2547, 2548 +2549, 2547 +2547, 2549 +2551, 2550 +2550, 2551 +2552, 2551 +2551, 2552 +2553, 2552 +2552, 2553 +2554, 2553 +2553, 2554 +2555, 2554 +2554, 2555 +2555, 2550 +2550, 2555 +2556, 2555 +2555, 2556 +2557, 2556 +2556, 2557 +2558, 2557 +2557, 2558 +2559, 2558 +2558, 2559 +2560, 2559 +2559, 2560 +2561, 2560 +2560, 2561 +2562, 2561 +2561, 2562 +2562, 2557 +2557, 2562 +2563, 2562 +2562, 2563 +2563, 2554 +2554, 2563 +2564, 2560 +2560, 2564 +2565, 2559 +2559, 2565 +2566, 2552 +2552, 2566 +2567, 2551 +2551, 2567 +2568, 2567 +2567, 2568 +2569, 2567 +2567, 2569 +2571, 2570 +2570, 2571 +2572, 2571 +2571, 2572 +2573, 2572 +2572, 2573 +2574, 2573 +2573, 2574 +2575, 2574 +2574, 2575 +2576, 2575 +2575, 2576 +2577, 2576 +2576, 2577 +2578, 2577 +2577, 2578 +2578, 2573 +2573, 2578 +2579, 2578 +2578, 2579 +2580, 2579 +2579, 2580 +2581, 2579 +2579, 2581 +2583, 2582 +2582, 2583 +2584, 2583 +2583, 2584 +2585, 2584 +2584, 2585 +2586, 2585 +2585, 2586 +2587, 2586 +2586, 2587 +2587, 2582 +2582, 2587 +2588, 2587 +2587, 2588 +2589, 2585 +2585, 2589 +2590, 2589 +2589, 2590 +2591, 2589 +2589, 2591 +2592, 2584 +2584, 2592 +2594, 2593 +2593, 2594 +2595, 2594 +2594, 2595 +2596, 2595 +2595, 2596 +2597, 2596 +2596, 2597 +2598, 2597 +2597, 2598 +2598, 2593 +2593, 2598 +2599, 2597 +2597, 2599 +2600, 2595 +2595, 2600 +2601, 2600 +2600, 2601 +2602, 2601 +2601, 2602 +2603, 2602 +2602, 2603 +2604, 2603 +2603, 2604 +2605, 2604 +2604, 2605 +2605, 2600 +2600, 2605 +2606, 2603 +2603, 2606 +2607, 2606 +2606, 2607 +2608, 2606 +2606, 2608 +2610, 2609 +2609, 2610 +2611, 2610 +2610, 2611 +2612, 2611 +2611, 2612 +2613, 2612 +2612, 2613 +2614, 2613 +2613, 2614 +2614, 2609 +2609, 2614 +2615, 2614 +2614, 2615 +2616, 2615 +2615, 2616 +2617, 2616 +2616, 2617 +2618, 2617 +2617, 2618 +2619, 2618 +2618, 2619 +2620, 2619 +2619, 2620 +2620, 2615 +2615, 2620 +2621, 2618 +2618, 2621 +2622, 2621 +2621, 2622 +2623, 2621 +2621, 2623 +2624, 2611 +2611, 2624 +2626, 2625 +2625, 2626 +2627, 2626 +2626, 2627 +2628, 2627 +2627, 2628 +2629, 2628 +2628, 2629 +2630, 2629 +2629, 2630 +2631, 2630 +2630, 2631 +2632, 2631 +2631, 2632 +2633, 2632 +2632, 2633 +2633, 2628 +2628, 2633 +2634, 2633 +2633, 2634 +2634, 2626 +2626, 2634 +2635, 2630 +2630, 2635 +2636, 2635 +2635, 2636 +2637, 2635 +2635, 2637 +2639, 2638 +2638, 2639 +2640, 2639 +2639, 2640 +2641, 2640 +2640, 2641 +2642, 2641 +2641, 2642 +2643, 2642 +2642, 2643 +2644, 2643 +2643, 2644 +2645, 2644 +2644, 2645 +2645, 2640 +2640, 2645 +2646, 2645 +2645, 2646 +2647, 2646 +2646, 2647 +2647, 2638 +2638, 2647 +2648, 2646 +2646, 2648 +2649, 2648 +2648, 2649 +2649, 2644 +2644, 2649 +2650, 2643 +2643, 2650 +2651, 2650 +2650, 2651 +2652, 2650 +2650, 2652 +2654, 2653 +2653, 2654 +2655, 2654 +2654, 2655 +2656, 2655 +2655, 2656 +2657, 2656 +2656, 2657 +2658, 2657 +2657, 2658 +2658, 2653 +2653, 2658 +2659, 2658 +2658, 2659 +2660, 2659 +2659, 2660 +2661, 2659 +2659, 2661 +2662, 2656 +2656, 2662 +2663, 2662 +2662, 2663 +2664, 2663 +2663, 2664 +2665, 2664 +2664, 2665 +2666, 2665 +2665, 2666 +2667, 2666 +2666, 2667 +2668, 2667 +2667, 2668 +2668, 2663 +2663, 2668 +2669, 2668 +2668, 2669 +2669, 2655 +2655, 2669 +2670, 2666 +2666, 2670 +2671, 2670 +2670, 2671 +2672, 2670 +2670, 2672 +2674, 2673 +2673, 2674 +2675, 2674 +2674, 2675 +2676, 2675 +2675, 2676 +2677, 2676 +2676, 2677 +2678, 2677 +2677, 2678 +2678, 2674 +2674, 2678 +2679, 2678 +2678, 2679 +2680, 2679 +2679, 2680 +2681, 2680 +2680, 2681 +2682, 2677 +2677, 2682 +2683, 2682 +2682, 2683 +2684, 2682 +2682, 2684 +2686, 2685 +2685, 2686 +2687, 2686 +2686, 2687 +2688, 2687 +2687, 2688 +2689, 2688 +2688, 2689 +2690, 2689 +2689, 2690 +2691, 2690 +2690, 2691 +2691, 2687 +2687, 2691 +2692, 2691 +2691, 2692 +2693, 2692 +2692, 2693 +2693, 2685 +2685, 2693 +2694, 2692 +2692, 2694 +2695, 2694 +2694, 2695 +2696, 2694 +2694, 2696 +2698, 2697 +2697, 2698 +2699, 2698 +2698, 2699 +2700, 2699 +2699, 2700 +2701, 2700 +2700, 2701 +2702, 2701 +2701, 2702 +2702, 2697 +2697, 2702 +2703, 2701 +2701, 2703 +2704, 2703 +2703, 2704 +2705, 2704 +2704, 2705 +2706, 2705 +2705, 2706 +2707, 2706 +2706, 2707 +2708, 2707 +2707, 2708 +2708, 2703 +2703, 2708 +2709, 2708 +2708, 2709 +2709, 2700 +2700, 2709 +2710, 2709 +2709, 2710 +2711, 2710 +2710, 2711 +2712, 2711 +2711, 2712 +2712, 2707 +2707, 2712 +2713, 2711 +2711, 2713 +2714, 2713 +2713, 2714 +2715, 2713 +2713, 2715 +2716, 2705 +2705, 2716 +2717, 2716 +2716, 2717 +2718, 2716 +2716, 2718 +2720, 2719 +2719, 2720 +2721, 2720 +2720, 2721 +2722, 2721 +2721, 2722 +2723, 2722 +2722, 2723 +2724, 2723 +2723, 2724 +2725, 2724 +2724, 2725 +2726, 2725 +2725, 2726 +2727, 2726 +2726, 2727 +2727, 2722 +2722, 2727 +2728, 2727 +2727, 2728 +2728, 2719 +2719, 2728 +2729, 2726 +2726, 2729 +2730, 2729 +2729, 2730 +2731, 2729 +2729, 2731 +2732, 2723 +2723, 2732 +2733, 2732 +2732, 2733 +2733, 2721 +2721, 2733 +2735, 2734 +2734, 2735 +2736, 2735 +2735, 2736 +2737, 2736 +2736, 2737 +2738, 2737 +2737, 2738 +2739, 2738 +2738, 2739 +2740, 2739 +2739, 2740 +2740, 2736 +2736, 2740 +2741, 2739 +2739, 2741 +2742, 2741 +2741, 2742 +2743, 2741 +2741, 2743 +2744, 2737 +2737, 2744 +2745, 2744 +2744, 2745 +2745, 2734 +2734, 2745 +2747, 2746 +2746, 2747 +2748, 2747 +2747, 2748 +2749, 2748 +2748, 2749 +2750, 2749 +2749, 2750 +2751, 2750 +2750, 2751 +2752, 2751 +2751, 2752 +2753, 2752 +2752, 2753 +2753, 2748 +2748, 2753 +2754, 2753 +2753, 2754 +2755, 2754 +2754, 2755 +2756, 2754 +2754, 2756 +2757, 2751 +2751, 2757 +2758, 2757 +2757, 2758 +2759, 2757 +2757, 2759 +2761, 2760 +2760, 2761 +2762, 2761 +2761, 2762 +2763, 2762 +2762, 2763 +2764, 2763 +2763, 2764 +2765, 2764 +2764, 2765 +2765, 2760 +2760, 2765 +2766, 2765 +2765, 2766 +2767, 2766 +2766, 2767 +2768, 2766 +2766, 2768 +2769, 2763 +2763, 2769 +2770, 2769 +2769, 2770 +2771, 2770 +2770, 2771 +2771, 2762 +2762, 2771 +2773, 2772 +2772, 2773 +2774, 2773 +2773, 2774 +2775, 2774 +2774, 2775 +2776, 2775 +2775, 2776 +2777, 2776 +2776, 2777 +2778, 2777 +2777, 2778 +2779, 2778 +2778, 2779 +2779, 2774 +2774, 2779 +2780, 2779 +2779, 2780 +2781, 2780 +2780, 2781 +2781, 2772 +2772, 2781 +2782, 2781 +2781, 2782 +2783, 2782 +2782, 2783 +2784, 2783 +2783, 2784 +2785, 2784 +2784, 2785 +2785, 2780 +2780, 2785 +2786, 2785 +2785, 2786 +2787, 2786 +2786, 2787 +2787, 2778 +2778, 2787 +2788, 2784 +2784, 2788 +2789, 2775 +2775, 2789 +2790, 2789 +2789, 2790 +2791, 2789 +2789, 2791 +2793, 2792 +2792, 2793 +2794, 2793 +2793, 2794 +2795, 2793 +2793, 2795 +2796, 2795 +2795, 2796 +2797, 2796 +2796, 2797 +2798, 2797 +2797, 2798 +2799, 2798 +2798, 2799 +2800, 2799 +2799, 2800 +2801, 2800 +2800, 2801 +2801, 2796 +2796, 2801 +2802, 2800 +2800, 2802 +2803, 2802 +2802, 2803 +2804, 2803 +2803, 2804 +2804, 2799 +2799, 2804 +2805, 2804 +2804, 2805 +2806, 2805 +2805, 2806 +2807, 2806 +2806, 2807 +2808, 2807 +2807, 2808 +2808, 2803 +2803, 2808 +2809, 2807 +2807, 2809 +2810, 2809 +2809, 2810 +2811, 2809 +2809, 2811 +2813, 2812 +2812, 2813 +2814, 2813 +2813, 2814 +2815, 2814 +2814, 2815 +2816, 2815 +2815, 2816 +2817, 2816 +2816, 2817 +2818, 2817 +2817, 2818 +2819, 2818 +2818, 2819 +2819, 2814 +2814, 2819 +2820, 2819 +2819, 2820 +2821, 2820 +2820, 2821 +2821, 2812 +2812, 2821 +2822, 2821 +2821, 2822 +2823, 2822 +2822, 2823 +2824, 2823 +2823, 2824 +2825, 2824 +2824, 2825 +2825, 2820 +2820, 2825 +2826, 2825 +2825, 2826 +2827, 2826 +2826, 2827 +2827, 2818 +2818, 2827 +2828, 2824 +2824, 2828 +2829, 2828 +2828, 2829 +2830, 2828 +2828, 2830 +2831, 2817 +2817, 2831 +2833, 2832 +2832, 2833 +2834, 2833 +2833, 2834 +2835, 2834 +2834, 2835 +2836, 2835 +2835, 2836 +2837, 2836 +2836, 2837 +2837, 2832 +2832, 2837 +2838, 2837 +2837, 2838 +2839, 2838 +2838, 2839 +2840, 2838 +2838, 2840 +2841, 2836 +2836, 2841 +2842, 2835 +2835, 2842 +2843, 2833 +2833, 2843 +2844, 2843 +2843, 2844 +2845, 2843 +2843, 2845 +2847, 2846 +2846, 2847 +2848, 2847 +2847, 2848 +2849, 2848 +2848, 2849 +2850, 2849 +2849, 2850 +2851, 2850 +2850, 2851 +2851, 2846 +2846, 2851 +2852, 2850 +2850, 2852 +2853, 2852 +2852, 2853 +2854, 2853 +2853, 2854 +2855, 2854 +2854, 2855 +2856, 2855 +2855, 2856 +2857, 2856 +2856, 2857 +2857, 2852 +2852, 2857 +2858, 2857 +2857, 2858 +2859, 2858 +2858, 2859 +2859, 2849 +2849, 2859 +2860, 2859 +2859, 2860 +2861, 2860 +2860, 2861 +2862, 2861 +2861, 2862 +2863, 2862 +2862, 2863 +2863, 2858 +2858, 2863 +2864, 2863 +2863, 2864 +2865, 2864 +2864, 2865 +2865, 2856 +2856, 2865 +2866, 2860 +2860, 2866 +2867, 2866 +2866, 2867 +2868, 2866 +2866, 2868 +2869, 2855 +2855, 2869 +2870, 2869 +2869, 2870 +2871, 2869 +2869, 2871 +2873, 2872 +2872, 2873 +2874, 2873 +2873, 2874 +2875, 2874 +2874, 2875 +2876, 2875 +2875, 2876 +2877, 2876 +2876, 2877 +2877, 2872 +2872, 2877 +2878, 2877 +2877, 2878 +2879, 2878 +2878, 2879 +2880, 2879 +2879, 2880 +2881, 2880 +2880, 2881 +2882, 2881 +2881, 2882 +2883, 2882 +2882, 2883 +2883, 2878 +2878, 2883 +2884, 2882 +2882, 2884 +2885, 2884 +2884, 2885 +2886, 2884 +2884, 2886 +2887, 2881 +2881, 2887 +2888, 2887 +2887, 2888 +2889, 2887 +2887, 2889 +2890, 2875 +2875, 2890 +2891, 2890 +2890, 2891 +2892, 2890 +2890, 2892 +2893, 2874 +2874, 2893 +2894, 2893 +2893, 2894 +2895, 2893 +2893, 2895 +2897, 2896 +2896, 2897 +2898, 2897 +2897, 2898 +2899, 2898 +2898, 2899 +2900, 2899 +2899, 2900 +2901, 2900 +2900, 2901 +2902, 2901 +2901, 2902 +2903, 2902 +2902, 2903 +2903, 2898 +2898, 2903 +2904, 2903 +2903, 2904 +2905, 2904 +2904, 2905 +2905, 2896 +2896, 2905 +2906, 2905 +2905, 2906 +2907, 2906 +2906, 2907 +2908, 2907 +2907, 2908 +2909, 2908 +2908, 2909 +2909, 2904 +2904, 2909 +2910, 2909 +2909, 2910 +2911, 2910 +2910, 2911 +2911, 2902 +2902, 2911 +2912, 2907 +2907, 2912 +2913, 2912 +2912, 2913 +2914, 2912 +2912, 2914 +2915, 2900 +2900, 2915 +2916, 2915 +2915, 2916 +2917, 2915 +2915, 2917 +2919, 2918 +2918, 2919 +2920, 2919 +2919, 2920 +2921, 2920 +2920, 2921 +2922, 2921 +2921, 2922 +2923, 2922 +2922, 2923 +2924, 2923 +2923, 2924 +2925, 2924 +2924, 2925 +2926, 2925 +2925, 2926 +2927, 2926 +2926, 2927 +2928, 2927 +2927, 2928 +2928, 2923 +2923, 2928 +2929, 2928 +2928, 2929 +2929, 2920 +2920, 2929 +2930, 2929 +2929, 2930 +2931, 2930 +2930, 2931 +2931, 2918 +2918, 2931 +2932, 2930 +2930, 2932 +2933, 2932 +2932, 2933 +2933, 2927 +2927, 2933 +2934, 2926 +2926, 2934 +2935, 2934 +2934, 2935 +2936, 2934 +2934, 2936 +2937, 2924 +2924, 2937 +2938, 2937 +2937, 2938 +2939, 2937 +2937, 2939 +2941, 2940 +2940, 2941 +2942, 2941 +2941, 2942 +2943, 2942 +2942, 2943 +2944, 2943 +2943, 2944 +2945, 2944 +2944, 2945 +2946, 2945 +2945, 2946 +2947, 2946 +2946, 2947 +2947, 2942 +2942, 2947 +2948, 2947 +2947, 2948 +2949, 2948 +2948, 2949 +2949, 2940 +2940, 2949 +2950, 2948 +2948, 2950 +2951, 2950 +2950, 2951 +2951, 2946 +2946, 2951 +2952, 2951 +2951, 2952 +2953, 2952 +2952, 2953 +2954, 2953 +2953, 2954 +2955, 2954 +2954, 2955 +2955, 2950 +2950, 2955 +2956, 2953 +2953, 2956 +2957, 2956 +2956, 2957 +2958, 2956 +2956, 2958 +2960, 2959 +2959, 2960 +2961, 2960 +2960, 2961 +2962, 2960 +2960, 2962 +2963, 2962 +2962, 2963 +2964, 2963 +2963, 2964 +2965, 2964 +2964, 2965 +2966, 2965 +2965, 2966 +2967, 2966 +2966, 2967 +2968, 2967 +2967, 2968 +2969, 2968 +2968, 2969 +2970, 2969 +2969, 2970 +2971, 2970 +2970, 2971 +2972, 2971 +2971, 2972 +2973, 2972 +2972, 2973 +2974, 2973 +2973, 2974 +2974, 2969 +2969, 2974 +2975, 2974 +2974, 2975 +2975, 2966 +2966, 2975 +2976, 2975 +2975, 2976 +2976, 2963 +2963, 2976 +2977, 2976 +2976, 2977 +2978, 2977 +2977, 2978 +2978, 2973 +2973, 2978 +2979, 2965 +2965, 2979 +2980, 2979 +2979, 2980 +2981, 2979 +2979, 2981 +2983, 2982 +2982, 2983 +2984, 2983 +2983, 2984 +2985, 2984 +2984, 2985 +2986, 2985 +2985, 2986 +2987, 2986 +2986, 2987 +2988, 2987 +2987, 2988 +2989, 2988 +2988, 2989 +2989, 2984 +2984, 2989 +2990, 2989 +2989, 2990 +2991, 2990 +2990, 2991 +2991, 2982 +2982, 2991 +2992, 2991 +2991, 2992 +2993, 2992 +2992, 2993 +2994, 2993 +2993, 2994 +2995, 2994 +2994, 2995 +2995, 2990 +2990, 2995 +2996, 2995 +2995, 2996 +2997, 2996 +2996, 2997 +2997, 2988 +2988, 2997 +2998, 2994 +2994, 2998 +2999, 2998 +2998, 2999 +3000, 2998 +2998, 3000 +3001, 2985 +2985, 3001 +3002, 3001 +3001, 3002 +3003, 3001 +3001, 3003 +3005, 3004 +3004, 3005 +3006, 3005 +3005, 3006 +3007, 3006 +3006, 3007 +3008, 3007 +3007, 3008 +3009, 3008 +3008, 3009 +3010, 3009 +3009, 3010 +3011, 3010 +3010, 3011 +3011, 3006 +3006, 3011 +3012, 3009 +3009, 3012 +3013, 3012 +3012, 3013 +3014, 3012 +3012, 3014 +3016, 3015 +3015, 3016 +3017, 3016 +3016, 3017 +3018, 3017 +3017, 3018 +3019, 3018 +3018, 3019 +3020, 3019 +3019, 3020 +3020, 3015 +3015, 3020 +3021, 3020 +3020, 3021 +3022, 3021 +3021, 3022 +3023, 3021 +3021, 3023 +3024, 3018 +3018, 3024 +3025, 3024 +3024, 3025 +3026, 3024 +3024, 3026 +3027, 3017 +3017, 3027 +3029, 3028 +3028, 3029 +3030, 3029 +3029, 3030 +3031, 3030 +3030, 3031 +3032, 3031 +3031, 3032 +3033, 3032 +3032, 3033 +3033, 3028 +3028, 3033 +3034, 3032 +3032, 3034 +3035, 3034 +3034, 3035 +3036, 3035 +3035, 3036 +3037, 3036 +3036, 3037 +3038, 3037 +3037, 3038 +3039, 3038 +3038, 3039 +3040, 3039 +3039, 3040 +3040, 3035 +3035, 3040 +3041, 3040 +3040, 3041 +3041, 3031 +3031, 3041 +3042, 3039 +3039, 3042 +3043, 3042 +3042, 3043 +3044, 3042 +3042, 3044 +3046, 3045 +3045, 3046 +3047, 3046 +3046, 3047 +3048, 3047 +3047, 3048 +3049, 3048 +3048, 3049 +3050, 3049 +3049, 3050 +3050, 3045 +3045, 3050 +3051, 3050 +3050, 3051 +3052, 3051 +3051, 3052 +3053, 3051 +3051, 3053 +3054, 3048 +3048, 3054 +3055, 3054 +3054, 3055 +3056, 3054 +3054, 3056 +3057, 3047 +3047, 3057 +3058, 3057 +3057, 3058 +3059, 3058 +3058, 3059 +3060, 3059 +3059, 3060 +3061, 3060 +3060, 3061 +3062, 3061 +3061, 3062 +3062, 3057 +3057, 3062 +3063, 3062 +3062, 3063 +3064, 3063 +3063, 3064 +3065, 3063 +3063, 3065 +3066, 3060 +3060, 3066 +3067, 3066 +3066, 3067 +3068, 3066 +3066, 3068 +3070, 3069 +3069, 3070 +3071, 3070 +3070, 3071 +3072, 3071 +3071, 3072 +3073, 3072 +3072, 3073 +3074, 3073 +3073, 3074 +3075, 3074 +3074, 3075 +3076, 3075 +3075, 3076 +3077, 3076 +3076, 3077 +3077, 3073 +3073, 3077 +3077, 3069 +3069, 3077 +3078, 3071 +3071, 3078 +3079, 3078 +3078, 3079 +3080, 3078 +3078, 3080 +3082, 3081 +3081, 3082 +3083, 3082 +3082, 3083 +3084, 3083 +3083, 3084 +3085, 3084 +3084, 3085 +3086, 3085 +3085, 3086 +3086, 3081 +3081, 3086 +3087, 3086 +3086, 3087 +3088, 3087 +3087, 3088 +3089, 3088 +3088, 3089 +3090, 3089 +3089, 3090 +3091, 3090 +3090, 3091 +3092, 3091 +3091, 3092 +3092, 3087 +3087, 3092 +3093, 3091 +3091, 3093 +3094, 3093 +3093, 3094 +3095, 3093 +3093, 3095 +3096, 3090 +3090, 3096 +3097, 3096 +3096, 3097 +3098, 3096 +3096, 3098 +3099, 3083 +3083, 3099 +3100, 3099 +3099, 3100 +3101, 3099 +3099, 3101 +3103, 3102 +3102, 3103 +3104, 3103 +3103, 3104 +3105, 3104 +3104, 3105 +3106, 3105 +3105, 3106 +3107, 3106 +3106, 3107 +3108, 3107 +3107, 3108 +3109, 3108 +3108, 3109 +3109, 3104 +3104, 3109 +3110, 3109 +3109, 3110 +3111, 3110 +3110, 3111 +3111, 3102 +3102, 3111 +3112, 3110 +3110, 3112 +3113, 3112 +3112, 3113 +3113, 3108 +3108, 3113 +3114, 3113 +3113, 3114 +3115, 3114 +3114, 3115 +3116, 3115 +3115, 3116 +3117, 3116 +3116, 3117 +3117, 3112 +3112, 3117 +3118, 3115 +3115, 3118 +3119, 3118 +3118, 3119 +3120, 3118 +3118, 3120 +3121, 3105 +3105, 3121 +3122, 3121 +3121, 3122 +3123, 3121 +3121, 3123 +3125, 3124 +3124, 3125 +3126, 3125 +3125, 3126 +3127, 3126 +3126, 3127 +3128, 3127 +3127, 3128 +3129, 3128 +3128, 3129 +3129, 3124 +3124, 3129 +3130, 3129 +3129, 3130 +3131, 3128 +3128, 3131 +3132, 3126 +3126, 3132 +3133, 3132 +3132, 3133 +3134, 3133 +3133, 3134 +3135, 3134 +3134, 3135 +3136, 3135 +3135, 3136 +3137, 3136 +3136, 3137 +3138, 3137 +3137, 3138 +3138, 3133 +3133, 3138 +3139, 3138 +3138, 3139 +3140, 3137 +3137, 3140 +3141, 3136 +3136, 3141 +3142, 3141 +3141, 3142 +3143, 3141 +3141, 3143 +3144, 3135 +3135, 3144 +3145, 3134 +3134, 3145 +3145, 3125 +3125, 3145 +3147, 3146 +3146, 3147 +3148, 3147 +3147, 3148 +3149, 3148 +3148, 3149 +3150, 3149 +3149, 3150 +3151, 3150 +3150, 3151 +3151, 3146 +3146, 3151 +3152, 3151 +3151, 3152 +3153, 3152 +3152, 3153 +3154, 3152 +3152, 3154 +3155, 3149 +3149, 3155 +3156, 3155 +3155, 3156 +3157, 3156 +3156, 3157 +3157, 3148 +3148, 3157 +3159, 3158 +3158, 3159 +3160, 3159 +3159, 3160 +3161, 3160 +3160, 3161 +3162, 3161 +3161, 3162 +3163, 3162 +3162, 3163 +3163, 3158 +3158, 3163 +3164, 3162 +3162, 3164 +3165, 3164 +3164, 3165 +3166, 3164 +3164, 3166 +3167, 3161 +3161, 3167 +3168, 3167 +3167, 3168 +3169, 3168 +3168, 3169 +3170, 3169 +3169, 3170 +3170, 3160 +3160, 3170 +3171, 3169 +3169, 3171 +3172, 3171 +3171, 3172 +3173, 3172 +3172, 3173 +3174, 3173 +3173, 3174 +3174, 3168 +3168, 3174 +3175, 3174 +3174, 3175 +3176, 3175 +3175, 3176 +3177, 3175 +3175, 3177 +3179, 3178 +3178, 3179 +3180, 3179 +3179, 3180 +3181, 3180 +3180, 3181 +3182, 3181 +3181, 3182 +3183, 3182 +3182, 3183 +3183, 3179 +3179, 3183 +3184, 3182 +3182, 3184 +3185, 3184 +3184, 3185 +3186, 3185 +3185, 3186 +3187, 3186 +3186, 3187 +3187, 3181 +3181, 3187 +3188, 3187 +3187, 3188 +3189, 3188 +3188, 3189 +3190, 3188 +3188, 3190 +3192, 3191 +3191, 3192 +3193, 3192 +3192, 3193 +3194, 3193 +3193, 3194 +3195, 3194 +3194, 3195 +3196, 3195 +3195, 3196 +3196, 3191 +3191, 3196 +3197, 3196 +3196, 3197 +3198, 3197 +3197, 3198 +3199, 3198 +3198, 3199 +3200, 3199 +3199, 3200 +3201, 3199 +3199, 3201 +3202, 3201 +3201, 3202 +3203, 3202 +3202, 3203 +3204, 3203 +3203, 3204 +3205, 3204 +3204, 3205 +3206, 3205 +3205, 3206 +3206, 3201 +3201, 3206 +3207, 3204 +3204, 3207 +3208, 3207 +3207, 3208 +3209, 3207 +3207, 3209 +3210, 3193 +3193, 3210 +3211, 3210 +3210, 3211 +3212, 3210 +3210, 3212 +3214, 3213 +3213, 3214 +3215, 3214 +3214, 3215 +3216, 3215 +3215, 3216 +3217, 3216 +3216, 3217 +3218, 3217 +3217, 3218 +3219, 3218 +3218, 3219 +3220, 3219 +3219, 3220 +3221, 3220 +3220, 3221 +3222, 3221 +3221, 3222 +3223, 3222 +3222, 3223 +3223, 3218 +3218, 3223 +3224, 3223 +3223, 3224 +3224, 3215 +3215, 3224 +3225, 3224 +3224, 3225 +3226, 3225 +3225, 3226 +3226, 3213 +3213, 3226 +3227, 3226 +3226, 3227 +3228, 3227 +3227, 3228 +3229, 3228 +3228, 3229 +3230, 3229 +3229, 3230 +3230, 3225 +3225, 3230 +3231, 3230 +3230, 3231 +3231, 3222 +3222, 3231 +3232, 3231 +3231, 3232 +3233, 3232 +3232, 3233 +3234, 3233 +3233, 3234 +3234, 3229 +3229, 3234 +3235, 3232 +3232, 3235 +3236, 3235 +3235, 3236 +3237, 3235 +3235, 3237 +3238, 3219 +3219, 3238 +3239, 3238 +3238, 3239 +3240, 3238 +3238, 3240 +3242, 3241 +3241, 3242 +3243, 3242 +3242, 3243 +3244, 3243 +3243, 3244 +3245, 3244 +3244, 3245 +3246, 3245 +3245, 3246 +3246, 3241 +3241, 3246 +3247, 3246 +3246, 3247 +3248, 3244 +3244, 3248 +3249, 3248 +3248, 3249 +3250, 3248 +3248, 3250 +3251, 3243 +3243, 3251 +3253, 3252 +3252, 3253 +3254, 3253 +3253, 3254 +3255, 3254 +3254, 3255 +3256, 3255 +3255, 3256 +3257, 3256 +3256, 3257 +3258, 3257 +3257, 3258 +3259, 3258 +3258, 3259 +3260, 3259 +3259, 3260 +3261, 3260 +3260, 3261 +3261, 3256 +3256, 3261 +3262, 3261 +3261, 3262 +3262, 3253 +3253, 3262 +3263, 3260 +3260, 3263 +3264, 3263 +3263, 3264 +3265, 3263 +3263, 3265 +3267, 3266 +3266, 3267 +3268, 3267 +3267, 3268 +3269, 3268 +3268, 3269 +3270, 3269 +3269, 3270 +3271, 3270 +3270, 3271 +3272, 3271 +3271, 3272 +3273, 3272 +3272, 3273 +3273, 3268 +3268, 3273 +3274, 3273 +3273, 3274 +3275, 3274 +3274, 3275 +3275, 3266 +3266, 3275 +3276, 3275 +3275, 3276 +3277, 3276 +3276, 3277 +3278, 3277 +3277, 3278 +3279, 3278 +3278, 3279 +3279, 3274 +3274, 3279 +3280, 3279 +3279, 3280 +3281, 3280 +3280, 3281 +3281, 3272 +3272, 3281 +3282, 3278 +3278, 3282 +3283, 3282 +3282, 3283 +3284, 3282 +3282, 3284 +3285, 3271 +3271, 3285 +3286, 3285 +3285, 3286 +3287, 3285 +3285, 3287 +3289, 3288 +3288, 3289 +3290, 3289 +3289, 3290 +3291, 3290 +3290, 3291 +3292, 3291 +3291, 3292 +3293, 3292 +3292, 3293 +3294, 3293 +3293, 3294 +3295, 3294 +3294, 3295 +3295, 3290 +3290, 3295 +3296, 3295 +3295, 3296 +3297, 3296 +3296, 3297 +3297, 3288 +3288, 3297 +3298, 3296 +3296, 3298 +3299, 3298 +3298, 3299 +3299, 3294 +3294, 3299 +3300, 3299 +3299, 3300 +3301, 3300 +3300, 3301 +3302, 3301 +3301, 3302 +3303, 3302 +3302, 3303 +3303, 3298 +3298, 3303 +3304, 3303 +3303, 3304 +3305, 3304 +3304, 3305 +3306, 3304 +3304, 3306 +3307, 3291 +3291, 3307 +3308, 3307 +3307, 3308 +3309, 3307 +3307, 3309 +3311, 3310 +3310, 3311 +3312, 3311 +3311, 3312 +3313, 3312 +3312, 3313 +3314, 3313 +3313, 3314 +3315, 3314 +3314, 3315 +3315, 3310 +3310, 3315 +3316, 3315 +3315, 3316 +3317, 3313 +3313, 3317 +3318, 3317 +3317, 3318 +3319, 3317 +3317, 3319 +3320, 3312 +3312, 3320 +3321, 3320 +3320, 3321 +3322, 3320 +3320, 3322 +3324, 3323 +3323, 3324 +3325, 3324 +3324, 3325 +3326, 3325 +3325, 3326 +3327, 3326 +3326, 3327 +3328, 3327 +3327, 3328 +3328, 3323 +3323, 3328 +3329, 3328 +3328, 3329 +3330, 3329 +3329, 3330 +3331, 3329 +3329, 3331 +3332, 3326 +3326, 3332 +3333, 3332 +3332, 3333 +3334, 3333 +3333, 3334 +3334, 3325 +3325, 3334 +3336, 3335 +3335, 3336 +3337, 3336 +3336, 3337 +3338, 3337 +3337, 3338 +3339, 3338 +3338, 3339 +3340, 3339 +3339, 3340 +3340, 3335 +3335, 3340 +3341, 3339 +3339, 3341 +3342, 3341 +3341, 3342 +3343, 3342 +3342, 3343 +3344, 3343 +3343, 3344 +3345, 3344 +3344, 3345 +3346, 3345 +3345, 3346 +3346, 3341 +3341, 3346 +3347, 3346 +3346, 3347 +3348, 3347 +3347, 3348 +3348, 3338 +3338, 3348 +3349, 3348 +3348, 3349 +3350, 3349 +3349, 3350 +3351, 3350 +3350, 3351 +3352, 3351 +3351, 3352 +3352, 3347 +3347, 3352 +3353, 3351 +3351, 3353 +3354, 3353 +3353, 3354 +3355, 3353 +3353, 3355 +3357, 3356 +3356, 3357 +3358, 3357 +3357, 3358 +3359, 3358 +3358, 3359 +3360, 3359 +3359, 3360 +3361, 3360 +3360, 3361 +3362, 3361 +3361, 3362 +3363, 3362 +3362, 3363 +3364, 3363 +3363, 3364 +3365, 3364 +3364, 3365 +3366, 3365 +3365, 3366 +3366, 3361 +3361, 3366 +3367, 3366 +3366, 3367 +3367, 3359 +3359, 3367 +3368, 3367 +3367, 3368 +3368, 3356 +3356, 3368 +3369, 3364 +3364, 3369 +3370, 3369 +3369, 3370 +3371, 3369 +3369, 3371 diff --git a/datasets/MUTAG/MUTAG_edge_labels.txt b/datasets/MUTAG/MUTAG_edge_labels.txt new file mode 100644 index 0000000..66a74dc --- /dev/null +++ b/datasets/MUTAG/MUTAG_edge_labels.txt @@ -0,0 +1,7442 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +3 +3 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +2 +2 +1 +1 +1 +1 +2 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +1 +1 diff --git a/datasets/MUTAG/MUTAG_graph_indicator.txt b/datasets/MUTAG/MUTAG_graph_indicator.txt new file mode 100644 index 0000000..74f6d67 --- /dev/null +++ b/datasets/MUTAG/MUTAG_graph_indicator.txt @@ -0,0 +1,3371 @@ +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +9 +9 +9 +9 +9 +9 +9 +9 +9 +9 +9 +9 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +16 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +21 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +22 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +25 +26 +26 +26 +26 +26 +26 +26 +26 +26 +26 +26 +26 +26 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +29 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +31 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +32 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +34 +34 +34 +34 +34 +34 +34 +34 +34 +34 +34 +34 +34 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +35 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +37 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +39 +39 +39 +39 +39 +39 +39 +39 +39 +39 +39 +39 +39 +39 +39 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +44 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +46 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +55 +55 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +56 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +57 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +58 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +59 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +61 +62 +62 +62 +62 +62 +62 +62 +62 +62 +62 +62 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +63 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +64 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +65 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +67 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +68 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +69 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +71 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +74 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +76 +76 +76 +76 +76 +76 +76 +76 +76 +76 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +77 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +79 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +83 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +87 +88 +88 +88 +88 +88 +88 +88 +88 +88 +88 +88 +88 +89 +89 +89 +89 +89 +89 +89 +89 +89 +89 +89 +89 +89 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +91 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +93 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +95 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +96 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +97 +98 +98 +98 +98 +98 +98 +98 +98 +98 +98 +98 +98 +98 +99 +99 +99 +99 +99 +99 +99 +99 +99 +99 +99 +99 +99 +99 +99 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +101 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +102 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +103 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +104 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +105 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +106 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +107 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +108 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +109 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +110 +111 +111 +111 +111 +111 +111 +111 +111 +111 +111 +111 +112 +112 +112 +112 +112 +112 +112 +112 +112 +112 +112 +112 +112 +112 +112 +113 +113 +113 +113 +113 +113 +113 +113 +113 +113 +113 +113 +113 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +115 +115 +115 +115 +115 +115 +115 +115 +115 +115 +115 +115 +116 +116 +116 +116 +116 +116 +116 +116 +116 +116 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +118 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +119 +120 +120 +120 +120 +120 +120 +120 +120 +120 +120 +120 +120 +120 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +121 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +122 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +123 +124 +124 +124 +124 +124 +124 +124 +124 +124 +124 +124 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +125 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +126 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +127 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +129 +129 +129 +129 +129 +129 +129 +129 +129 +129 +129 +129 +129 +129 +130 +130 +130 +130 +130 +130 +130 +130 +130 +130 +130 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +131 +132 +132 +132 +132 +132 +132 +132 +132 +132 +132 +132 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +133 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +134 +135 +135 +135 +135 +135 +135 +135 +135 +135 +135 +135 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +136 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +137 +138 +138 +138 +138 +138 +138 +138 +138 +138 +138 +138 +138 +138 +139 +139 +139 +139 +139 +139 +139 +139 +139 +139 +139 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +140 +141 +141 +141 +141 +141 +141 +141 +141 +141 +141 +141 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +142 +143 +143 +143 +143 +143 +143 +143 +143 +143 +143 +143 +143 +144 +144 +144 +144 +144 +144 +144 +144 +144 +144 +144 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +145 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +146 +147 +147 +147 +147 +147 +147 +147 +147 +147 +147 +147 +147 +147 +148 +148 +148 +148 +148 +148 +148 +148 +148 +148 +148 +148 +148 +148 +148 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +149 +150 +150 +150 +150 +150 +150 +150 +150 +150 +150 +150 +150 +151 +151 +151 +151 +151 +151 +151 +151 +151 +151 +151 +151 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +152 +153 +153 +153 +153 +153 +153 +153 +153 +153 +153 +153 +153 +153 +153 +153 +154 +154 +154 +154 +154 +154 +154 +154 +154 +154 +154 +154 +155 +155 +155 +155 +155 +155 +155 +155 +155 +155 +155 +155 +155 +155 +156 +156 +156 +156 +156 +156 +156 +156 +156 +156 +156 +156 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +157 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +158 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +159 +160 +160 +160 +160 +160 +160 +160 +160 +160 +160 +160 +160 +160 +160 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +161 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +162 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +163 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +164 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +165 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +166 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +167 +168 +168 +168 +168 +168 +168 +168 +168 +168 +168 +168 +169 +169 +169 +169 +169 +169 +169 +169 +169 +169 +169 +169 +169 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +170 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +171 +172 +172 +172 +172 +172 +172 +172 +172 +172 +172 +172 +172 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +173 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +174 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +175 +176 +176 +176 +176 +176 +176 +176 +176 +176 +176 +176 +176 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +177 +178 +178 +178 +178 +178 +178 +178 +178 +178 +178 +178 +178 +178 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +179 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +183 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +184 +185 +185 +185 +185 +185 +185 +185 +185 +185 +185 +185 +185 +185 +186 +186 +186 +186 +186 +186 +186 +186 +186 +186 +186 +186 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 diff --git a/datasets/MUTAG/MUTAG_graph_labels.txt b/datasets/MUTAG/MUTAG_graph_labels.txt new file mode 100644 index 0000000..cd9a9c8 --- /dev/null +++ b/datasets/MUTAG/MUTAG_graph_labels.txt @@ -0,0 +1,188 @@ +1 +-1 +-1 +1 +-1 +1 +-1 +1 +-1 +1 +1 +1 +1 +-1 +1 +1 +-1 +1 +-1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +-1 +1 +-1 +1 +-1 +-1 +-1 +1 +-1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +-1 +1 +1 +1 +1 +1 +1 +-1 +1 +1 +-1 +-1 +1 +1 +1 +-1 +1 +1 +-1 +1 +1 +-1 +-1 +-1 +1 +1 +1 +1 +1 +-1 +1 +1 +1 +-1 +-1 +1 +1 +1 +1 +1 +1 +1 +1 +-1 +1 +-1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +-1 +-1 +1 +-1 +-1 +1 +-1 +1 +1 +-1 +-1 +1 +1 +-1 +-1 +1 +1 +1 +1 +-1 +-1 +-1 +-1 +-1 +1 +-1 +1 +1 +-1 +-1 +1 +-1 +-1 +-1 +-1 +1 +1 +-1 +1 +1 +-1 +1 +1 +1 +-1 +-1 +-1 +1 +1 +1 +-1 +1 +1 +1 +1 +1 +1 +1 +-1 +1 +1 +1 +1 +1 +1 +-1 +1 +1 +1 +-1 +1 +-1 +-1 +1 +1 +-1 +-1 +1 +-1 diff --git a/datasets/MUTAG/MUTAG_node_labels.txt b/datasets/MUTAG/MUTAG_node_labels.txt new file mode 100644 index 0000000..cc11ed9 --- /dev/null +++ b/datasets/MUTAG/MUTAG_node_labels.txt @@ -0,0 +1,3371 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +3 +1 +2 +2 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +1 +0 +1 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +3 +3 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +6 +0 +1 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +2 +0 +0 +0 +0 +0 +0 +2 +5 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +5 +0 +0 +0 +0 +0 +0 +1 +2 +2 +2 +1 +0 +0 +0 +2 +0 +0 +0 +0 +2 +1 +1 +0 +0 +0 +0 +0 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +2 +0 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +1 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +3 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +3 +3 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +1 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +5 +5 +2 +0 +0 +0 +0 +0 +0 +5 +1 +2 +2 +5 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +5 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +5 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +5 +5 +1 +2 +2 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +2 +5 +5 +5 +1 +2 +2 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +5 +1 +2 +2 +5 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +1 +0 +0 +1 +0 +0 +2 +1 +2 +2 +0 +0 +0 +0 +1 +1 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +0 +1 +1 +2 +2 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +2 +2 +0 +0 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +6 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +3 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +5 +5 +2 +0 +0 +0 +0 +0 +0 +5 +5 +1 +2 +2 +5 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +0 +0 +1 +0 +0 +0 +0 +1 +2 +2 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +3 +1 +2 +2 +1 +2 +2 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 diff --git a/datasets/MUTAG/README b/datasets/MUTAG/README deleted file mode 100644 index e2b0766..0000000 --- a/datasets/MUTAG/README +++ /dev/null @@ -1,68 +0,0 @@ -=== Introduction === - -This folder contains 6 data sets of undirected labeled graphs in Matlab format for graph -classification: MUTAG, PTC, NCI1, NCI109, ENZYMES, and D&D. - -=== Usage === - -For each data set X, the Matlab command - load X -loads into the memory a struct array containing graphs, and a column vector lx containing -a class label for each graph. -X(i).am is the adjacency matrix of the i'th graph, -X(i).al is the adjacency list of the i'th graph, -X(i).nl.values is a column vector of node labels for the i'th graph, -X(i).el (not always available) contains edge labels for the i'th graph. - -Example: -typing "load MUTAG" in MATLAB -loads a 188 element array of graph structures, called MUTAG, and a column of 188 numbers, -each of which indicates the class that the corresponding graph belongs to. - -=== Description === - -MUTAG (Debnath et al., 1991) is a data set of 188 mutagenic aromatic and heteroaromatic -nitro compounds labeled according to whether or not they have a mutagenic effect on the -Gram-negative bacterium Salmonella typhimurium. - -PTC (Toivonen et al., 2003) contains 344 chemical compounds tested for carcinogenicity -in mice and rats. The classification task is to predict the carcinogenicity of compounds. - -NCI1 and NCI109 represent two balanced subsets of data sets of chemical compounds screened -for activity against non-small cell lung cancer and ovarian cancer cell lines respectively -(Wale and Karypis (2006) and http://pubchem.ncbi.nlm.nih.gov). - -ENZYMES is a data set of protein tertiary structures obtained from (Borgwardt et al., -2005) consisting of 600 enzymes from the BRENDA enzyme database (Schomburg et al., 2004). -In this case the task is to correctly assign each enzyme to one of the 6 EC top-level -classes. - -D&D is a data set of 1178 protein structures (Dobson and Doig, 2003). Each protein is -represented by a graph, in which the nodes are amino acids and two nodes are connected -by an edge if they are less than 6 Angstroms apart. The prediction task is to classify -the protein structures into enzymes and non-enzymes. - -=== References === - -K. M. Borgwardt, C. S. Ong, S. Schoenauer, S. V. N. Vishwanathan, A. J. Smola, and H. P. -Kriegel. Protein function prediction via graph kernels. Bioinformatics, 21(Suppl 1):i47–i56, -Jun 2005. - -A. K. Debnath, R. L. Lopez de Compadre, G. Debnath, A. J. Shusterman, and C. Hansch. -Structure-activity relationship of mutagenic aromatic and heteroaromatic nitro compounds. -Correlation with molecular orbital energies and hydrophobicity. J Med Chem, 34: 786–797, -1991. - -P. D. Dobson and A. J. Doig. Distinguishing enzyme structures from non-enzymes without -alignments. J Mol Biol, 330(4):771–783, Jul 2003. - -I. Schomburg, A. Chang, C. Ebeling, M. Gremse, C. Heldt, G. Huhn, and D. Schomburg. Brenda, -the enzyme database: updates and major new developments. Nucleic Acids Research, 32D:431–433, -2004. - -H. Toivonen, A. Srinivasan, R.D. King, S. Kramer, and C. Helma (2003). Statistical -evaluation of the predictive toxicology challenge 2000-2001. Bioinformatics, 19(10):1183–1193. - -N. Wale and G. Karypis. Comparison of descriptor spaces for chemical compound retrieval and -classification. In Proc. of ICDM, pages 678–689, Hong Kong, 2006. - diff --git a/datasets/MUTAG/README.txt b/datasets/MUTAG/README.txt new file mode 100644 index 0000000..7c1cafa --- /dev/null +++ b/datasets/MUTAG/README.txt @@ -0,0 +1,85 @@ +README for dataset MUTAG + + +=== Usage === + +This folder contains the following comma separated text files +(replace DS by the name of the dataset): + +n = total number of nodes +m = total number of edges +N = number of graphs + +(1) DS_A.txt (m lines) + sparse (block diagonal) adjacency matrix for all graphs, + each line corresponds to (row, col) resp. (node_id, node_id) + +(2) DS_graph_indicator.txt (n lines) + column vector of graph identifiers for all nodes of all graphs, + the value in the i-th line is the graph_id of the node with node_id i + +(3) DS_graph_labels.txt (N lines) + class labels for all graphs in the dataset, + the value in the i-th line is the class label of the graph with graph_id i + +(4) DS_node_labels.txt (n lines) + column vector of node labels, + the value in the i-th line corresponds to the node with node_id i + +There are OPTIONAL files if the respective information is available: + +(5) DS_edge_labels.txt (m lines; same size as DS_A_sparse.txt) + labels for the edges in DD_A_sparse.txt + +(6) DS_edge_attributes.txt (m lines; same size as DS_A.txt) + attributes for the edges in DS_A.txt + +(7) DS_node_attributes.txt (n lines) + matrix of node attributes, + the comma seperated values in the i-th line is the attribute vector of the node with node_id i + +(8) DS_graph_attributes.txt (N lines) + regression values for all graphs in the dataset, + the value in the i-th line is the attribute of the graph with graph_id i + + +=== Description of the dataset === + +The MUTAG dataset consists of 188 chemical compounds divided into two +classes according to their mutagenic effect on a bacterium. + +The chemical data was obtained form http://cdb.ics.uci.edu and converted +to graphs, where vertices represent atoms and edges represent chemical +bonds. Explicit hydrogen atoms have been removed and vertices are labeled +by atom type and edges by bond type (single, double, triple or aromatic). +Chemical data was processed using the Chemistry Development Kit (v1.4). + +Node labels: + + 0 C + 1 N + 2 O + 3 F + 4 I + 5 Cl + 6 Br + +Edge labels: + + 0 aromatic + 1 single + 2 double + 3 triple + + +=== Previous Use of the Dataset === + +Kriege, N., Mutzel, P.: Subgraph matching kernels for attributed graphs. In: Proceedings +of the 29th International Conference on Machine Learning (ICML-2012) (2012). + + +=== References === + +Debnath, A.K., Lopez de Compadre, R.L., Debnath, G., Shusterman, A.J., and Hansch, C. +Structure-activity relationship of mutagenic aromatic and heteroaromatic nitro compounds. +Correlation with molecular orbital energies and hydrophobicity. J. Med. Chem. 34(2):786-797 (1991). diff --git a/notebooks/run_commonwalkkernel.ipynb b/notebooks/run_commonwalkkernel.ipynb index ea416cf..470ae1c 100644 --- a/notebooks/run_commonwalkkernel.ipynb +++ b/notebooks/run_commonwalkkernel.ipynb @@ -73,20 +73,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", " # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "\n", " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_commonwalkkernel.py b/notebooks/run_commonwalkkernel.py index a3245de..4e7fd46 100644 --- a/notebooks/run_commonwalkkernel.py +++ b/notebooks/run_commonwalkkernel.py @@ -15,20 +15,18 @@ dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb @@ -82,4 +80,4 @@ for ds in dslist: n_jobs=multiprocessing.cpu_count(), read_gm_from_file=False, verbose=True) - print() \ No newline at end of file + print() diff --git a/notebooks/run_marginalizedkernel.ipynb b/notebooks/run_marginalizedkernel.ipynb index 1a9748d..724f18b 100644 --- a/notebooks/run_marginalizedkernel.ipynb +++ b/notebooks/run_marginalizedkernel.ipynb @@ -104,20 +104,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", " # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "\n", " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_marginalizedkernel.py b/notebooks/run_marginalizedkernel.py index 93e3724..e8ef6b7 100644 --- a/notebooks/run_marginalizedkernel.py +++ b/notebooks/run_marginalizedkernel.py @@ -15,20 +15,18 @@ dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb diff --git a/notebooks/run_randomwalkkernel.ipynb b/notebooks/run_randomwalkkernel.ipynb index 0841d6c..c30c0ff 100644 --- a/notebooks/run_randomwalkkernel.ipynb +++ b/notebooks/run_randomwalkkernel.ipynb @@ -219,20 +219,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", " # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "\n", " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_randomwalkkernel.py b/notebooks/run_randomwalkkernel.py index 381ba80..4c258ba 100644 --- a/notebooks/run_randomwalkkernel.py +++ b/notebooks/run_randomwalkkernel.py @@ -20,20 +20,18 @@ dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb @@ -65,6 +63,7 @@ dslist = [ estimator = randomwalkkernel param_grid = [{'C': np.logspace(-10, 10, num=41, base=10)}, {'alpha': np.logspace(-10, 10, num=41, base=10)}] +gaussiankernel = functools.partial(gaussiankernel, gamma=0.5) for ds in dslist: print() @@ -108,4 +107,4 @@ for ds in dslist: n_jobs=multiprocessing.cpu_count(), read_gm_from_file=False, verbose=True) - print() \ No newline at end of file + print() diff --git a/notebooks/run_spkernel.ipynb b/notebooks/run_spkernel.ipynb index ad866f6..b0d0eb2 100644 --- a/notebooks/run_spkernel.ipynb +++ b/notebooks/run_spkernel.ipynb @@ -171,21 +171,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", " # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", - "\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "#\n", "# {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", "# {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_spkernel.py b/notebooks/run_spkernel.py index a8634d4..583fb0a 100644 --- a/notebooks/run_spkernel.py +++ b/notebooks/run_spkernel.py @@ -11,21 +11,18 @@ dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb - # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb @@ -79,4 +76,4 @@ for ds in dslist: n_jobs=multiprocessing.cpu_count(), read_gm_from_file=False, verbose=True) - print() \ No newline at end of file + print() diff --git a/notebooks/run_structuralspkernel.ipynb b/notebooks/run_structuralspkernel.ipynb index 43f7c1c..c34fb1f 100644 --- a/notebooks/run_structuralspkernel.ipynb +++ b/notebooks/run_structuralspkernel.ipynb @@ -124,20 +124,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", " # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "\n", " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_structuralspkernel.py b/notebooks/run_structuralspkernel.py index 1ceb07c..836f0a6 100644 --- a/notebooks/run_structuralspkernel.py +++ b/notebooks/run_structuralspkernel.py @@ -17,20 +17,18 @@ dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb @@ -86,4 +84,4 @@ for ds in dslist: n_jobs=multiprocessing.cpu_count(), read_gm_from_file=False, verbose=True) - print() \ No newline at end of file + print() diff --git a/notebooks/run_treeletkernel.ipynb b/notebooks/run_treeletkernel.ipynb index 2d7d2a2..413a627 100644 --- a/notebooks/run_treeletkernel.ipynb +++ b/notebooks/run_treeletkernel.ipynb @@ -100,20 +100,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", "# {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", "# # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "\n", " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_treeletkernel.py b/notebooks/run_treeletkernel.py index ab0f678..1078eb2 100644 --- a/notebooks/run_treeletkernel.py +++ b/notebooks/run_treeletkernel.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Created on Fri Oct 5 19:19:33 2018 +Created on Mon Mar 21 11:19:33 2019 @author: ljia """ @@ -10,26 +10,24 @@ from libs import * import multiprocessing from pygraph.kernels.treeletKernel import treeletkernel -from pygraph.utils.kernels import gaussiankernel, polynomialkernel +from pygraph.utils.kernels import gaussiankernel, linearkernel, polynomialkernel dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb # {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb @@ -59,7 +57,7 @@ dslist = [ # {'name': 'PTC_MR', 'dataset': '../datasets/PTC/Train/MR.ds',}, ] estimator = treeletkernel -param_grid_precomputed = {'sub_kernel': [gaussiankernel, polynomialkernel]} +param_grid_precomputed = {'sub_kernel': [gaussiankernel, linearkernel, polynomialkernel]} param_grid = [{'C': np.logspace(-10, 10, num=41, base=10)}, {'alpha': np.logspace(-10, 10, num=41, base=10)}] @@ -80,4 +78,4 @@ for ds in dslist: n_jobs=multiprocessing.cpu_count(), read_gm_from_file=False, verbose=True) - print() \ No newline at end of file + print() diff --git a/notebooks/run_untilhpathkernel.ipynb b/notebooks/run_untilhpathkernel.ipynb index 694d632..265c3de 100644 --- a/notebooks/run_untilhpathkernel.ipynb +++ b/notebooks/run_untilhpathkernel.ipynb @@ -227,13 +227,7 @@ "the gram matrix with parameters {'compute_method': 'trie', 'depth': 1.0, 'k_func': 'tanimoto', 'n_jobs': 8, 'verbose': True} is: \n", "\n", "\n", - "getting paths: 150it [00:00, 27568.71it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "getting paths: 150it [00:00, 27568.71it/s]\n", "calculating kernels: 11325it [00:00, 780628.98it/s]\n", "\n", " --- kernel matrix of path kernel up to 2 of size 150 built in 0.2590019702911377 seconds ---\n", @@ -265,20 +259,18 @@ " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", " 'task': 'regression'}, # node symb\n", " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", - " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, \n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", " # contains single node graph, node symb\n", - " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb\n", - " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled\n", - " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", - " 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", " # node nsymb\n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", " # node symb/nsymb\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", "# # node/edge symb\n", - "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", - "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb\n", + "# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", "\n", " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", diff --git a/notebooks/run_untilhpathkernel.py b/notebooks/run_untilhpathkernel.py index c7992b4..867a8a7 100644 --- a/notebooks/run_untilhpathkernel.py +++ b/notebooks/run_untilhpathkernel.py @@ -15,20 +15,18 @@ dslist = [ {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node symb {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', - 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt', }, + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, # contains single node graph, node symb - {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds', }, # node/edge symb - {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds', }, # unlabeled - {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}}, # node/edge symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, # node nsymb {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, # node symb/nsymb # {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # # node/edge symb -# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat', -# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}}, # node symb +# {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb @@ -81,4 +79,4 @@ for ds in dslist: n_jobs=multiprocessing.cpu_count(), read_gm_from_file=False, verbose=True) - print() \ No newline at end of file + print() diff --git a/notebooks/run_weisfeilerlehmankernel.ipynb b/notebooks/run_weisfeilerlehmankernel.ipynb new file mode 100644 index 0000000..6b3f515 --- /dev/null +++ b/notebooks/run_weisfeilerlehmankernel.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "MUTAG\n", + "\n", + "--- This is a classification problem ---\n", + "\n", + "\n", + "1. Loading dataset from file...\n", + "\n", + "2. Calculating gram matrices. This could take a while...\n", + "\n", + " --- Weisfeiler-Lehman subtree kernel matrix of size 188 built in 0.14636015892028809 seconds ---\n", + "\n", + "the gram matrix with parameters {'base_kernel': 'subtree', 'height': 0.0, 'n_jobs': 8, 'verbose': True} is: \n", + "\n", + "\n", + "\n", + " --- Weisfeiler-Lehman subtree kernel matrix of size 188 built in 0.2917311191558838 seconds ---\n", + "\n", + "the gram matrix with parameters {'base_kernel': 'subtree', 'height': 1.0, 'n_jobs': 8, 'verbose': True} is: \n", + "\n", + "\n" + ] + } + ], + "source": [ + "#!/usr/bin/env python3\n", + "# -*- coding: utf-8 -*-\n", + "\"\"\"\n", + "Created on Mon Mar 21 11:19:33 2019\n", + "\n", + "@author: ljia\n", + "\"\"\"\n", + "\n", + "from libs import *\n", + "import multiprocessing\n", + "\n", + "from pygraph.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel\n", + "from pygraph.utils.kernels import gaussiankernel, polynomialkernel\n", + "\n", + "\n", + "dslist = [\n", + " {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds',\n", + " 'task': 'regression'}, # node symb\n", + " {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression',\n", + " 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, \n", + " # contains single node graph, node symb\n", + " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb\n", + " {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled\n", + " {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb\n", + " {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'},\n", + " # node nsymb\n", + " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", + " # node symb/nsymb\n", + "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'},\n", + "# # node/edge symb\n", + " {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb\n", + "\n", + " # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb\n", + " # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb\n", + " # # # {'name': 'COX2', 'dataset': '../datasets/COX2_txt/COX2_A_sparse.txt'}, # node symb/nsymb\n", + " # {'name': 'Fingerprint', 'dataset': '../datasets/Fingerprint/Fingerprint_A.txt'},\n", + " #\n", + " # # {'name': 'DHFR', 'dataset': '../datasets/DHFR_txt/DHFR_A_sparse.txt'}, # node symb/nsymb\n", + " # # {'name': 'SYNTHETIC', 'dataset': '../datasets/SYNTHETIC_txt/SYNTHETIC_A_sparse.txt'}, # node symb/nsymb\n", + " # # {'name': 'MSRC9', 'dataset': '../datasets/MSRC_9_txt/MSRC_9_A.txt'}, # node symb\n", + " # # {'name': 'MSRC21', 'dataset': '../datasets/MSRC_21_txt/MSRC_21_A.txt'}, # node symb\n", + " # # {'name': 'FIRSTMM_DB', 'dataset': '../datasets/FIRSTMM_DB/FIRSTMM_DB_A.txt'}, # node symb/nsymb ,edge nsymb\n", + "\n", + " # # {'name': 'PROTEINS', 'dataset': '../datasets/PROTEINS_txt/PROTEINS_A_sparse.txt'}, # node symb/nsymb\n", + " # # {'name': 'PROTEINS_full', 'dataset': '../datasets/PROTEINS_full_txt/PROTEINS_full_A_sparse.txt'}, # node symb/nsymb\n", + "# {'name': 'AIDS', 'dataset': '../datasets/AIDS/AIDS_A.txt'}, # node symb/nsymb, edge symb\n", + " {'name': 'NCI1', 'dataset': '../datasets/NCI1/NCI1.mat',\n", + " 'extra_params': {'am_sp_al_nl_el': [1, 1, 2, 0, -1]}}, # node symb\n", + " {'name': 'NCI109', 'dataset': '../datasets/NCI109/NCI109.mat',\n", + " 'extra_params': {'am_sp_al_nl_el': [1, 1, 2, 0, -1]}}, # node symb\n", + " # {'name': 'NCI-HIV', 'dataset': '../datasets/NCI-HIV/AIDO99SD.sdf',\n", + " # 'dataset_y': '../datasets/NCI-HIV/aids_conc_may04.txt',}, # node/edge symb\n", + "\n", + " # # not working below\n", + " # {'name': 'PTC_FM', 'dataset': '../datasets/PTC/Train/FM.ds',},\n", + " # {'name': 'PTC_FR', 'dataset': '../datasets/PTC/Train/FR.ds',},\n", + " # {'name': 'PTC_MM', 'dataset': '../datasets/PTC/Train/MM.ds',},\n", + " # {'name': 'PTC_MR', 'dataset': '../datasets/PTC/Train/MR.ds',},\n", + "]\n", + "estimator = weisfeilerlehmankernel\n", + "param_grid_precomputed = {'base_kernel': ['subtree'], \n", + " 'height': np.linspace(0, 10, 11)}\n", + "param_grid = [{'C': np.logspace(-10, 4, num=29, base=10)},\n", + " {'alpha': np.logspace(-10, 10, num=41, base=10)}]\n", + "\n", + "for ds in dslist:\n", + " print()\n", + " print(ds['name'])\n", + " model_selection_for_precomputed_kernel(\n", + " ds['dataset'],\n", + " estimator,\n", + " param_grid_precomputed,\n", + " (param_grid[1] if ('task' in ds and ds['task']\n", + " == 'regression') else param_grid[0]),\n", + " (ds['task'] if 'task' in ds else 'classification'),\n", + " NUM_TRIALS=30,\n", + " datafile_y=(ds['dataset_y'] if 'dataset_y' in ds else None),\n", + " extra_params=(ds['extra_params'] if 'extra_params' in ds else None),\n", + " ds_name=ds['name'],\n", + " n_jobs=multiprocessing.cpu_count(),\n", + " read_gm_from_file=False,\n", + " verbose=True)\n", + " print()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/run_weisfeilerlehmankernel.py b/notebooks/run_weisfeilerlehmankernel.py new file mode 100644 index 0000000..7b8d942 --- /dev/null +++ b/notebooks/run_weisfeilerlehmankernel.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Mar 21 11:19:33 2019 + +@author: ljia +""" + +from libs import * +import multiprocessing + +from pygraph.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel +from pygraph.utils.kernels import gaussiankernel, polynomialkernel + + +dslist = [ + {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', + 'task': 'regression'}, # node symb + {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', + 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt'}, + # contains single node graph, node symb + {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds'}, # node/edge symb + {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds'}, # unlabeled + {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt'}, # node/edge symb + {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt'}, + # node nsymb + {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'}, + # node symb/nsymb +# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, +# # node/edge symb + {'name': 'D&D', 'dataset': '../datasets/DD/DD_A.txt'}, # node symb +# + # {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge symb, node nsymb + # # # {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'}, # node symb/nsymb + # # # {'name': 'COX2', 'dataset': '../datasets/COX2_txt/COX2_A_sparse.txt'}, # node symb/nsymb + # {'name': 'Fingerprint', 'dataset': '../datasets/Fingerprint/Fingerprint_A.txt'}, + # + # # {'name': 'DHFR', 'dataset': '../datasets/DHFR_txt/DHFR_A_sparse.txt'}, # node symb/nsymb + # # {'name': 'SYNTHETIC', 'dataset': '../datasets/SYNTHETIC_txt/SYNTHETIC_A_sparse.txt'}, # node symb/nsymb + # # {'name': 'MSRC9', 'dataset': '../datasets/MSRC_9_txt/MSRC_9_A.txt'}, # node symb + # # {'name': 'MSRC21', 'dataset': '../datasets/MSRC_21_txt/MSRC_21_A.txt'}, # node symb + # # {'name': 'FIRSTMM_DB', 'dataset': '../datasets/FIRSTMM_DB/FIRSTMM_DB_A.txt'}, # node symb/nsymb ,edge nsymb + + # # {'name': 'PROTEINS', 'dataset': '../datasets/PROTEINS_txt/PROTEINS_A_sparse.txt'}, # node symb/nsymb + # # {'name': 'PROTEINS_full', 'dataset': '../datasets/PROTEINS_full_txt/PROTEINS_full_A_sparse.txt'}, # node symb/nsymb +# {'name': 'AIDS', 'dataset': '../datasets/AIDS/AIDS_A.txt'}, # node symb/nsymb, edge symb + {'name': 'NCI1', 'dataset': '../datasets/NCI1/NCI1_A.txt'}, # node symb + {'name': 'NCI109', 'dataset': '../datasets/NCI109/NCI109_A.txt'}, # node symb + # {'name': 'NCI-HIV', 'dataset': '../datasets/NCI-HIV/AIDO99SD.sdf', + # 'dataset_y': '../datasets/NCI-HIV/aids_conc_may04.txt',}, # node/edge symb + + # # not working below + # {'name': 'PTC_FM', 'dataset': '../datasets/PTC/Train/FM.ds',}, + # {'name': 'PTC_FR', 'dataset': '../datasets/PTC/Train/FR.ds',}, + # {'name': 'PTC_MM', 'dataset': '../datasets/PTC/Train/MM.ds',}, + # {'name': 'PTC_MR', 'dataset': '../datasets/PTC/Train/MR.ds',}, +] +estimator = weisfeilerlehmankernel +param_grid_precomputed = {'base_kernel': ['subtree'], + 'height': np.linspace(0, 10, 11)} +param_grid = [{'C': np.logspace(-10, 4, num=29, base=10)}, + {'alpha': np.logspace(-10, 10, num=41, base=10)}] + +for ds in dslist: + print() + print(ds['name']) + model_selection_for_precomputed_kernel( + ds['dataset'], + estimator, + param_grid_precomputed, + (param_grid[1] if ('task' in ds and ds['task'] + == 'regression') else param_grid[0]), + (ds['task'] if 'task' in ds else 'classification'), + NUM_TRIALS=30, + datafile_y=(ds['dataset_y'] if 'dataset_y' in ds else None), + extra_params=(ds['extra_params'] if 'extra_params' in ds else None), + ds_name=ds['name'], + n_jobs=multiprocessing.cpu_count(), + read_gm_from_file=False, + verbose=True) + print() \ No newline at end of file diff --git a/preimage/iam.py b/preimage/iam.py index 646dc6a..8eddda9 100644 --- a/preimage/iam.py +++ b/preimage/iam.py @@ -16,7 +16,7 @@ import librariesImport, script sys.path.insert(0, "../") from pygraph.utils.graphfiles import saveDataset from pygraph.utils.graphdataset import get_dataset_attributes -from pygraph.utils.utils import graph_isIdentical +from pygraph.utils.utils import graph_isIdentical, get_node_labels, get_edge_labels #from pygraph.utils.utils import graph_deepcopy @@ -158,9 +158,9 @@ def GED(g1, g2, lib='gedlib'): script.PyRestartEnv() script.PyLoadGXLGraph('ged_tmp/', 'ged_tmp/tmp.xml') listID = script.PyGetGraphIds() - script.PySetEditCost("CHEM_2") + script.PySetEditCost("CHEM_1") script.PyInitEnv() - script.PySetMethod("BIPARTITE", "") + script.PySetMethod("IPFP", "") script.PyInitMethod() g = listID[0] h = listID[1] @@ -173,20 +173,6 @@ def GED(g1, g2, lib='gedlib'): return dis, pi_forward, pi_backward -def get_node_labels(Gn, node_label): - nl = set() - for G in Gn: - nl = nl | set(nx.get_node_attributes(G, node_label).values()) - return nl - - -def get_edge_labels(Gn, edge_label): - el = set() - for G in Gn: - el = el | set(nx.get_edge_attributes(G, edge_label).values()) - return el - - # --------------------------- These are tests --------------------------------# def test_iam_with_more_graphs_as_init(Gn, G_candidate, c_ei=3, c_er=3, c_es=1, diff --git a/pygraph/kernels/marginalizedKernel.py b/pygraph/kernels/marginalizedKernel.py index a00850a..53b8517 100644 --- a/pygraph/kernels/marginalizedKernel.py +++ b/pygraph/kernels/marginalizedKernel.py @@ -65,6 +65,7 @@ def marginalizedkernel(*args, # pre-process n_iteration = int(n_iteration) Gn = args[0][:] if len(args) == 1 else [args[0].copy(), args[1].copy()] + Gn = [g.copy() for g in Gn] ds_attrs = get_dataset_attributes( Gn, @@ -215,37 +216,37 @@ def _marginalizedkernel_do(g1, g2, node_label, edge_label, p_quit, n_iteration): R_inf = {} # dict to save all the R_inf for all pairs of nodes # initial R_inf, the 1st iteration. - for node1 in g1.nodes(data=True): - for node2 in g2.nodes(data=True): + for node1 in g1.nodes(): + for node2 in g2.nodes(): # R_inf[(node1[0], node2[0])] = r1 - if len(g1[node1[0]]) > 0: - if len(g2[node2[0]]) > 0: - R_inf[(node1[0], node2[0])] = r1 + if len(g1[node1]) > 0: + if len(g2[node2]) > 0: + R_inf[(node1, node2)] = r1 else: - R_inf[(node1[0], node2[0])] = p_quit + R_inf[(node1, node2)] = p_quit else: - if len(g2[node2[0]]) > 0: - R_inf[(node1[0], node2[0])] = p_quit + if len(g2[node2]) > 0: + R_inf[(node1, node2)] = p_quit else: - R_inf[(node1[0], node2[0])] = 1 + R_inf[(node1, node2)] = 1 # compute all transition probability first. t_dict = {} if n_iteration > 1: - for node1 in g1.nodes(data=True): - neighbor_n1 = g1[node1[0]] + for node1 in g1.nodes(): + neighbor_n1 = g1[node1] # the transition probability distribution in the random walks # generating step (uniform distribution over the vertices adjacent # to the current vertex) if len(neighbor_n1) > 0: p_trans_n1 = (1 - p_quit) / len(neighbor_n1) - for node2 in g2.nodes(data=True): - neighbor_n2 = g2[node2[0]] + for node2 in g2.nodes(): + neighbor_n2 = g2[node2] if len(neighbor_n2) > 0: p_trans_n2 = (1 - p_quit) / len(neighbor_n2) for neighbor1 in neighbor_n1: for neighbor2 in neighbor_n2: - t_dict[(node1[0], node2[0], neighbor1, neighbor2)] = \ + t_dict[(node1, node2, neighbor1, neighbor2)] = \ p_trans_n1 * p_trans_n2 * \ deltakernel(g1.node[neighbor1][node_label], g2.node[neighbor2][node_label]) * \ @@ -258,20 +259,20 @@ def _marginalizedkernel_do(g1, g2, node_label, edge_label, p_quit, n_iteration): R_inf_old = R_inf.copy() # calculate R_inf for each pair of nodes - for node1 in g1.nodes(data=True): - neighbor_n1 = g1[node1[0]] + for node1 in g1.nodes(): + neighbor_n1 = g1[node1] # the transition probability distribution in the random walks # generating step (uniform distribution over the vertices adjacent # to the current vertex) if len(neighbor_n1) > 0: - for node2 in g2.nodes(data=True): - neighbor_n2 = g2[node2[0]] + for node2 in g2.nodes(): + neighbor_n2 = g2[node2] if len(neighbor_n2) > 0: - R_inf[(node1[0], node2[0])] = r1 + R_inf[(node1, node2)] = r1 for neighbor1 in neighbor_n1: for neighbor2 in neighbor_n2: - R_inf[(node1[0], node2[0])] += \ - (t_dict[(node1[0], node2[0], neighbor1, neighbor2)] * \ + R_inf[(node1, node2)] += \ + (t_dict[(node1, node2, neighbor1, neighbor2)] * \ R_inf_old[(neighbor1, neighbor2)]) # ref [1] equation (8) # add elements of R_inf up and calculate kernel diff --git a/pygraph/kernels/randomWalkKernel.py b/pygraph/kernels/randomWalkKernel.py index 9424994..4540e3c 100644 --- a/pygraph/kernels/randomWalkKernel.py +++ b/pygraph/kernels/randomWalkKernel.py @@ -58,6 +58,7 @@ def randomwalkkernel(*args, """ compute_method = compute_method.lower() Gn = args[0] if len(args) == 1 else [args[0], args[1]] + Gn = [g.copy() for g in Gn] eweight = None if edge_weight == None: diff --git a/pygraph/kernels/spKernel.py b/pygraph/kernels/spKernel.py index 34724e2..d9a7397 100644 --- a/pygraph/kernels/spKernel.py +++ b/pygraph/kernels/spKernel.py @@ -54,6 +54,7 @@ def spkernel(*args, """ # pre-process Gn = args[0] if len(args) == 1 else [args[0], args[1]] + Gn = [g.copy() for g in Gn] weight = None if edge_weight is None: if verbose: diff --git a/pygraph/kernels/structuralspKernel.py b/pygraph/kernels/structuralspKernel.py index 574b524..2661f24 100644 --- a/pygraph/kernels/structuralspKernel.py +++ b/pygraph/kernels/structuralspKernel.py @@ -74,6 +74,7 @@ def structuralspkernel(*args, """ # pre-process Gn = args[0] if len(args) == 1 else [args[0], args[1]] + Gn = [g.copy() for g in Gn] weight = None if edge_weight is None: if verbose: diff --git a/pygraph/kernels/treeletKernel.py b/pygraph/kernels/treeletKernel.py index 799d2d9..738c4fd 100644 --- a/pygraph/kernels/treeletKernel.py +++ b/pygraph/kernels/treeletKernel.py @@ -1,6 +1,8 @@ """ @author: linlin -@references: Gaüzère B, Brun L, Villemin D. Two new graphs kernels in chemoinformatics. Pattern Recognition Letters. 2012 Nov 1;33(15):2038-47. +@references: + [1] Gaüzère B, Brun L, Villemin D. Two new graphs kernels in + chemoinformatics. Pattern Recognition Letters. 2012 Nov 1;33(15):2038-47. """ import sys @@ -50,6 +52,7 @@ def treeletkernel(*args, """ # pre-process Gn = args[0] if len(args) == 1 else [args[0], args[1]] + Gn = [g.copy() for g in Gn] Kmatrix = np.zeros((len(Gn), len(Gn))) ds_attrs = get_dataset_attributes(Gn, attr_names=['node_labeled', 'edge_labeled', 'is_directed'], @@ -76,13 +79,13 @@ def treeletkernel(*args, else: chunksize = 100 canonkeys = [[] for _ in range(len(Gn))] - getps_partial = partial(wrapper_get_canonkeys, node_label, edge_label, + get_partial = partial(wrapper_get_canonkeys, node_label, edge_label, labeled, ds_attrs['is_directed']) if verbose: - iterator = tqdm(pool.imap_unordered(getps_partial, itr, chunksize), + iterator = tqdm(pool.imap_unordered(get_partial, itr, chunksize), desc='getting canonkeys', file=sys.stdout) else: - iterator = pool.imap_unordered(getps_partial, itr, chunksize) + iterator = pool.imap_unordered(get_partial, itr, chunksize) for i, ck in iterator: canonkeys[i] = ck pool.close() diff --git a/pygraph/kernels/unfinished/treeletKernel.py b/pygraph/kernels/unfinished/treeletKernel.py deleted file mode 100644 index d364cc3..0000000 --- a/pygraph/kernels/unfinished/treeletKernel.py +++ /dev/null @@ -1,382 +0,0 @@ -""" -@author: linlin -@references: Gaüzère B, Brun L, Villemin D. Two new graphs kernels in chemoinformatics. Pattern Recognition Letters. 2012 Nov 1;33(15):2038-47. -""" - -import sys -import pathlib -sys.path.insert(0, "../") -import time - -from collections import Counter -from itertools import chain - -import networkx as nx -import numpy as np - - -def treeletkernel(*args, node_label = 'atom', edge_label = 'bond_type', labeled = True): - """Calculate treelet graph kernels between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - / - G1, G2 : NetworkX graphs - 2 graphs between which the kernel is calculated. - node_label : string - node attribute used as label. The default node label is atom. - edge_label : string - edge attribute used as label. The default edge label is bond_type. - labeled : boolean - Whether the graphs are labeled. The default is True. - - Return - ------ - Kmatrix/kernel : Numpy matrix/float - Kernel matrix, each element of which is the treelet kernel between 2 praphs. / Treelet kernel between 2 graphs. - """ - if len(args) == 1: # for a list of graphs - Gn = args[0] - Kmatrix = np.zeros((len(Gn), len(Gn))) - - start_time = time.time() - - # get all canonical keys of all graphs before calculating kernels to save time, but this may cost a lot of memory for large dataset. - canonkeys = [ get_canonkeys(Gn[i], node_label = node_label, edge_label = edge_label, labeled = labeled) \ - for i in range(0, len(Gn)) ] - - for i in range(0, len(Gn)): - for j in range(i, len(Gn)): - Kmatrix[i][j] = _treeletkernel_do(canonkeys[i], canonkeys[j], node_label = node_label, edge_label = edge_label, labeled = labeled) - Kmatrix[j][i] = Kmatrix[i][j] - - run_time = time.time() - start_time - print("\n --- treelet kernel matrix of size %d built in %s seconds ---" % (len(Gn), run_time)) - - return Kmatrix, run_time - - else: # for only 2 graphs - - start_time = time.time() - - canonkey1 = get_canonkeys(args[0], node_label = node_label, edge_label = edge_label, labeled = labeled) - canonkey2 = get_canonkeys(args[1], node_label = node_label, edge_label = edge_label, labeled = labeled) - - kernel = _treeletkernel_do(canonkey1, canonkey2, node_label = node_label, edge_label = edge_label, labeled = labeled) - - run_time = time.time() - start_time - print("\n --- treelet kernel built in %s seconds ---" % (run_time)) - - return kernel, run_time - - -def _treeletkernel_do(canonkey1, canonkey2, node_label = 'atom', edge_label = 'bond_type', labeled = True): - """Calculate treelet graph kernel between 2 graphs. - - Parameters - ---------- - canonkey1, canonkey2 : list - List of canonical keys in 2 graphs, where each key is represented by a string. - node_label : string - Node attribute used as label. The default node label is atom. - edge_label : string - Edge attribute used as label. The default edge label is bond_type. - labeled : boolean - Whether the graphs are labeled. The default is True. - - Return - ------ - kernel : float - Treelet Kernel between 2 graphs. - """ - keys = set(canonkey1.keys()) & set(canonkey2.keys()) # find same canonical keys in both graphs - vector1 = np.array([ (canonkey1[key] if (key in canonkey1.keys()) else 0) for key in keys ]) - vector2 = np.array([ (canonkey2[key] if (key in canonkey2.keys()) else 0) for key in keys ]) - kernel = np.sum(np.exp(- np.square(vector1 - vector2) / 2)) - - return kernel - - -def get_canonkeys(G, node_label = 'atom', edge_label = 'bond_type', labeled = True): - """Generate canonical keys of all treelets in a graph. - - Parameters - ---------- - G : NetworkX graphs - The graph in which keys are generated. - node_label : string - node attribute used as label. The default node label is atom. - edge_label : string - edge attribute used as label. The default edge label is bond_type. - labeled : boolean - Whether the graphs are labeled. The default is True. - - Return - ------ - canonkey/canonkey_l : dict - For unlabeled graphs, canonkey is a dictionary which records amount of every tree pattern. For labeled graphs, canonkey_l is one which keeps track of amount of every treelet. - """ - patterns = {} # a dictionary which consists of lists of patterns for all graphlet. - canonkey = {} # canonical key, a dictionary which records amount of every tree pattern. - - ### structural analysis ### - ### In this section, a list of patterns is generated for each graphlet, where every pattern is represented by nodes ordered by - ### Morgan's extended labeling. - # linear patterns - patterns['0'] = G.nodes() - canonkey['0'] = nx.number_of_nodes(G) - for i in range(1, 6): # for i in range(1, 6): - patterns[str(i)] = find_all_paths(G, i) - canonkey[str(i)] = len(patterns[str(i)]) - - # n-star patterns - patterns['3star'] = [ [node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 3 ] - patterns['4star'] = [ [node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 4 ] - patterns['5star'] = [ [node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 5 ] - # n-star patterns - canonkey['6'] = len(patterns['3star']) - canonkey['8'] = len(patterns['4star']) - canonkey['d'] = len(patterns['5star']) - - # pattern 7 - patterns['7'] = [] # the 1st line of Table 1 in Ref [1] - for pattern in patterns['3star']: - for i in range(1, len(pattern)): # for each neighbor of node 0 - if G.degree(pattern[i]) >= 2: - pattern_t = pattern[:] - pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] # set the node with degree >= 2 as the 4th node - for neighborx in G[pattern[i]]: - if neighborx != pattern[0]: - new_pattern = pattern_t + [ neighborx ] - patterns['7'].append(new_pattern) - canonkey['7'] = len(patterns['7']) - - # pattern 11 - patterns['11'] = [] # the 4th line of Table 1 in Ref [1] - for pattern in patterns['4star']: - for i in range(1, len(pattern)): - if G.degree(pattern[i]) >= 2: - pattern_t = pattern[:] - pattern_t[i], pattern_t[4] = pattern_t[4], pattern_t[i] - for neighborx in G[pattern[i]]: - if neighborx != pattern[0]: - new_pattern = pattern_t + [ neighborx ] - patterns['11'].append(new_pattern) - canonkey['b'] = len(patterns['11']) - - # pattern 12 - patterns['12'] = [] # the 5th line of Table 1 in Ref [1] - rootlist = [] # a list of root nodes, whose extended labels are 3 - for pattern in patterns['3star']: - if pattern[0] not in rootlist: # prevent to count the same pattern twice from each of the two root nodes - rootlist.append(pattern[0]) - for i in range(1, len(pattern)): - if G.degree(pattern[i]) >= 3: - rootlist.append(pattern[i]) - pattern_t = pattern[:] - pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] - for neighborx1 in G[pattern[i]]: - if neighborx1 != pattern[0]: - for neighborx2 in G[pattern[i]]: - if neighborx1 > neighborx2 and neighborx2 != pattern[0]: - new_pattern = pattern_t + [neighborx1] + [neighborx2] -# new_patterns = [ pattern + [neighborx1] + [neighborx2] for neighborx1 in G[pattern[i]] if neighborx1 != pattern[0] for neighborx2 in G[pattern[i]] if (neighborx1 > neighborx2 and neighborx2 != pattern[0]) ] - patterns['12'].append(new_pattern) - canonkey['c'] = int(len(patterns['12']) / 2) - - # pattern 9 - patterns['9'] = [] # the 2nd line of Table 1 in Ref [1] - for pattern in patterns['3star']: - for pairs in [ [neighbor1, neighbor2] for neighbor1 in G[pattern[0]] if G.degree(neighbor1) >= 2 \ - for neighbor2 in G[pattern[0]] if G.degree(neighbor2) >= 2 if neighbor1 > neighbor2 ]: - pattern_t = pattern[:] - # move nodes with extended labels 4 to specific position to correspond to their children - pattern_t[pattern_t.index(pairs[0])], pattern_t[2] = pattern_t[2], pattern_t[pattern_t.index(pairs[0])] - pattern_t[pattern_t.index(pairs[1])], pattern_t[3] = pattern_t[3], pattern_t[pattern_t.index(pairs[1])] - for neighborx1 in G[pairs[0]]: - if neighborx1 != pattern[0]: - for neighborx2 in G[pairs[1]]: - if neighborx2 != pattern[0]: - new_pattern = pattern_t + [neighborx1] + [neighborx2] - patterns['9'].append(new_pattern) - canonkey['9'] = len(patterns['9']) - - # pattern 10 - patterns['10'] = [] # the 3rd line of Table 1 in Ref [1] - for pattern in patterns['3star']: - for i in range(1, len(pattern)): - if G.degree(pattern[i]) >= 2: - for neighborx in G[pattern[i]]: - if neighborx != pattern[0] and G.degree(neighborx) >= 2: - pattern_t = pattern[:] - pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] - new_patterns = [ pattern_t + [neighborx] + [neighborxx] for neighborxx in G[neighborx] if neighborxx != pattern[i] ] - patterns['10'].extend(new_patterns) - canonkey['a'] = len(patterns['10']) - - ### labeling information ### - ### In this section, a list of canonical keys is generated for every pattern obtained in the structural analysis - ### section above, which is a string corresponding to a unique treelet. A dictionary is built to keep track of - ### the amount of every treelet. - if labeled == True: - canonkey_l = {} # canonical key, a dictionary which keeps track of amount of every treelet. - - # linear patterns - canonkey_t = Counter(list(nx.get_node_attributes(G, node_label).values())) - for key in canonkey_t: - canonkey_l['0' + key] = canonkey_t[key] - - for i in range(1, 6): # for i in range(1, 6): - treelet = [] - for pattern in patterns[str(i)]: - canonlist = list(chain.from_iterable((G.node[node][node_label], \ - G[node][pattern[idx+1]][edge_label]) for idx, node in enumerate(pattern[:-1]))) - canonlist.append(G.node[pattern[-1]][node_label]) - canonkey_t = ''.join(canonlist) - canonkey_t = canonkey_t if canonkey_t < canonkey_t[::-1] else canonkey_t[::-1] - treelet.append(str(i) + canonkey_t) - canonkey_l.update(Counter(treelet)) - - # n-star patterns - for i in range(3, 6): - treelet = [] - for pattern in patterns[str(i) + 'star']: - canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:] ] - canonlist.sort() - canonkey_t = ('d' if i == 5 else str(i * 2)) + G.node[pattern[0]][node_label] + ''.join(canonlist) - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 7 - treelet = [] - for pattern in patterns['7']: - canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:3] ] - canonlist.sort() - canonkey_t = '7' + G.node[pattern[0]][node_label] + ''.join(canonlist) \ - + G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label] \ - + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[3]][edge_label] - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 11 - treelet = [] - for pattern in patterns['11']: - canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:4] ] - canonlist.sort() - canonkey_t = 'b' + G.node[pattern[0]][node_label] + ''.join(canonlist) \ - + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[0]][edge_label] \ - + G.node[pattern[5]][node_label] + G[pattern[5]][pattern[4]][edge_label] - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 10 - treelet = [] - for pattern in patterns['10']: - canonkey4 = G.node[pattern[5]][node_label] + G[pattern[5]][pattern[4]][edge_label] - canonlist = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:3] ] - canonlist.sort() - canonkey0 = ''.join(canonlist) - canonkey_t = 'a' + G.node[pattern[3]][node_label] \ - + G.node[pattern[4]][node_label] + G[pattern[4]][pattern[3]][edge_label] \ - + G.node[pattern[0]][node_label] + G[pattern[0]][pattern[3]][edge_label] \ - + canonkey4 + canonkey0 - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 12 - treelet = [] - for pattern in patterns['12']: - canonlist0 = [ G.node[leaf][node_label] + G[leaf][pattern[0]][edge_label] for leaf in pattern[1:3] ] - canonlist0.sort() - canonlist3 = [ G.node[leaf][node_label] + G[leaf][pattern[3]][edge_label] for leaf in pattern[4:6] ] - canonlist3.sort() - - # 2 possible key can be generated from 2 nodes with extended label 3, select the one with lower lexicographic order. - canonkey_t1 = 'c' + G.node[pattern[0]][node_label] \ - + ''.join(canonlist0) \ - + G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label] \ - + ''.join(canonlist3) - - canonkey_t2 = 'c' + G.node[pattern[3]][node_label] \ - + ''.join(canonlist3) \ - + G.node[pattern[0]][node_label] + G[pattern[0]][pattern[3]][edge_label] \ - + ''.join(canonlist0) - - treelet.append(canonkey_t1 if canonkey_t1 < canonkey_t2 else canonkey_t2) - canonkey_l.update(Counter(treelet)) - - # pattern 9 - treelet = [] - for pattern in patterns['9']: - canonkey2 = G.node[pattern[4]][node_label] + G[pattern[4]][pattern[2]][edge_label] - canonkey3 = G.node[pattern[5]][node_label] + G[pattern[5]][pattern[3]][edge_label] - prekey2 = G.node[pattern[2]][node_label] + G[pattern[2]][pattern[0]][edge_label] - prekey3 = G.node[pattern[3]][node_label] + G[pattern[3]][pattern[0]][edge_label] - if prekey2 + canonkey2 < prekey3 + canonkey3: - canonkey_t = G.node[pattern[1]][node_label] + G[pattern[1]][pattern[0]][edge_label] \ - + prekey2 + prekey3 + canonkey2 + canonkey3 - else: - canonkey_t = G.node[pattern[1]][node_label] + G[pattern[1]][pattern[0]][edge_label] \ - + prekey3 + prekey2 + canonkey3 + canonkey2 - treelet.append('9' + G.node[pattern[0]][node_label] + canonkey_t) - canonkey_l.update(Counter(treelet)) - - return canonkey_l - - return canonkey - - -def find_paths(G, source_node, length): - """Find all paths with a certain length those start from a source node. A recursive depth first search is applied. - - Parameters - ---------- - G : NetworkX graphs - The graph in which paths are searched. - source_node : integer - The number of the node from where all paths start. - length : integer - The length of paths. - - Return - ------ - path : list of list - List of paths retrieved, where each path is represented by a list of nodes. - """ - if length == 0: - return [[source_node]] - path = [ [source_node] + path for neighbor in G[source_node] \ - for path in find_paths(G, neighbor, length - 1) if source_node not in path ] - return path - - -def find_all_paths(G, length): - """Find all paths with a certain length in a graph. A recursive depth first search is applied. - - Parameters - ---------- - G : NetworkX graphs - The graph in which paths are searched. - length : integer - The length of paths. - - Return - ------ - path : list of list - List of paths retrieved, where each path is represented by a list of nodes. - """ - all_paths = [] - for node in G: - all_paths.extend(find_paths(G, node, length)) - all_paths_r = [ path[::-1] for path in all_paths ] - - # For each path, two presentation are retrieved from its two extremities. Remove one of them. - for idx, path in enumerate(all_paths[:-1]): - for path2 in all_paths_r[idx+1::]: - if path == path2: - all_paths[idx] = [] - break - - return list(filter(lambda a: a != [], all_paths)) diff --git a/pygraph/kernels/untilHPathKernel.py b/pygraph/kernels/untilHPathKernel.py index 3b10d05..abc2273 100644 --- a/pygraph/kernels/untilHPathKernel.py +++ b/pygraph/kernels/untilHPathKernel.py @@ -60,6 +60,7 @@ def untilhpathkernel(*args, # pre-process depth = int(depth) Gn = args[0] if len(args) == 1 else [args[0], args[1]] + Gn = [g.copy() for g in Gn] Kmatrix = np.zeros((len(Gn), len(Gn))) ds_attrs = get_dataset_attributes( Gn, diff --git a/pygraph/kernels/weisfeilerLehmanKernel.py b/pygraph/kernels/weisfeilerLehmanKernel.py new file mode 100644 index 0000000..fe15113 --- /dev/null +++ b/pygraph/kernels/weisfeilerLehmanKernel.py @@ -0,0 +1,549 @@ +""" +@author: linlin +@references: + [1] Shervashidze N, Schweitzer P, Leeuwen EJ, Mehlhorn K, Borgwardt KM. + Weisfeiler-lehman graph kernels. Journal of Machine Learning Research. + 2011;12(Sep):2539-61. +""" + +import sys +from collections import Counter +sys.path.insert(0, "../") +from functools import partial +import time +#from multiprocessing import Pool +from tqdm import tqdm + +import networkx as nx +import numpy as np + +#from pygraph.kernels.pathKernel import pathkernel +from pygraph.utils.graphdataset import get_dataset_attributes +from pygraph.utils.parallel import parallel_gm + +# @todo: support edge kernel, sp kernel, user-defined kernel. +def weisfeilerlehmankernel(*args, + node_label='atom', + edge_label='bond_type', + height=0, + base_kernel='subtree', + parallel=None, + n_jobs=None, + verbose=True): + """Calculate Weisfeiler-Lehman kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + / + G1, G2 : NetworkX graphs + 2 graphs between which the kernel is calculated. + node_label : string + node attribute used as label. The default node label is atom. + edge_label : string + edge attribute used as label. The default edge label is bond_type. + height : int + subtree height + base_kernel : string + base kernel used in each iteration of WL kernel. The default base kernel is subtree kernel. For user-defined kernel, base_kernel is the name of the base kernel function used in each iteration of WL kernel. This function returns a Numpy matrix, each element of which is the user-defined Weisfeiler-Lehman kernel between 2 praphs. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + + Notes + ----- + This function now supports WL subtree kernel only. + """ + # pre-process + base_kernel = base_kernel.lower() + Gn = args[0] if len(args) == 1 else [args[0], args[1]] # arrange all graphs in a list + Gn = [g.copy() for g in Gn] + ds_attrs = get_dataset_attributes(Gn, attr_names=['node_labeled'], + node_label=node_label) + if not ds_attrs['node_labeled']: + for G in Gn: + nx.set_node_attributes(G, '0', 'atom') + + start_time = time.time() + + # for WL subtree kernel + if base_kernel == 'subtree': + Kmatrix = _wl_kernel_do(Gn, node_label, edge_label, height, parallel, n_jobs, verbose) + + # for WL shortest path kernel + elif base_kernel == 'sp': + Kmatrix = _wl_spkernel_do(Gn, node_label, edge_label, height) + + # for WL edge kernel + elif base_kernel == 'edge': + Kmatrix = _wl_edgekernel_do(Gn, node_label, edge_label, height) + + # for user defined base kernel + else: + Kmatrix = _wl_userkernel_do(Gn, node_label, edge_label, height, base_kernel) + + run_time = time.time() - start_time + if verbose: + print("\n --- Weisfeiler-Lehman %s kernel matrix of size %d built in %s seconds ---" + % (base_kernel, len(args[0]), run_time)) + + return Kmatrix, run_time + + +def _wl_kernel_do(Gn, node_label, edge_label, height, parallel, n_jobs, verbose): + """Calculate Weisfeiler-Lehman kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + wl height. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) + + # initial for height = 0 + all_num_of_each_label = [] # number of occurence of each label in each graph in this iteration + + # for each graph + for G in Gn: + # get the set of original labels + labels_ori = list(nx.get_node_attributes(G, node_label).values()) + # number of occurence of each label in G + all_num_of_each_label.append(dict(Counter(labels_ori))) + + # calculate subtree kernel with the 0th iteration and add it to the final kernel + compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, False) + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs +# all_labels_ori = set() # all unique orignal labels in all graphs in this iteration + all_num_of_each_label = [] # number of occurence of each label in G + +# # for each graph +# # ---- use pool.imap_unordered to parallel and track progress. ---- +# pool = Pool(n_jobs) +# itr = zip(Gn, range(0, len(Gn))) +# if len(Gn) < 100 * n_jobs: +# chunksize = int(len(Gn) / n_jobs) + 1 +# else: +# chunksize = 100 +# all_multisets_list = [[] for _ in range(len(Gn))] +## set_unique_list = [[] for _ in range(len(Gn))] +# get_partial = partial(wrapper_wl_iteration, node_label) +## if verbose: +## iterator = tqdm(pool.imap_unordered(get_partial, itr, chunksize), +## desc='wl iteration', file=sys.stdout) +## else: +# iterator = pool.imap_unordered(get_partial, itr, chunksize) +# for i, all_multisets in iterator: +# all_multisets_list[i] = all_multisets +## set_unique_list[i] = set_unique +## all_set_unique = all_set_unique | set(set_unique) +# pool.close() +# pool.join() + +# all_set_unique = set() +# for uset in all_multisets_list: +# all_set_unique = all_set_unique | set(uset) +# +# all_set_unique = list(all_set_unique) +## # a dictionary mapping original labels to new ones. +## set_compressed = {} +## for idx, uset in enumerate(all_set_unique): +## set_compressed.update({uset: idx}) +# +# for ig, G in enumerate(Gn): +# +## # a dictionary mapping original labels to new ones. +## set_compressed = {} +## # if a label occured before, assign its former compressed label, +## # else assign the number of labels occured + 1 as the compressed label. +## for value in set_unique_list[i]: +## if uset in all_set_unique: +## set_compressed.update({uset: all_set_compressed[value]}) +## else: +## set_compressed.update({value: str(num_of_labels_occured + 1)}) +## num_of_labels_occured += 1 +# +## all_set_compressed.update(set_compressed) +# +# # relabel nodes +# for idx, node in enumerate(G.nodes()): +# G.nodes[node][node_label] = all_set_unique.index(all_multisets_list[ig][idx]) +# +# # get the set of compressed labels +# labels_comp = list(nx.get_node_attributes(G, node_label).values()) +## all_labels_ori.update(labels_comp) +# all_num_of_each_label[ig] = dict(Counter(labels_comp)) + + + + +# all_set_unique = list(all_set_unique) + + + # @todo: parallel this part. + for idx, G in enumerate(Gn): + + all_multisets = [] + for node, attrs in G.nodes(data=True): + # Multiset-label determination. + multiset = [G.nodes[neighbors][node_label] for neighbors in G[node]] + # sorting each multiset + multiset.sort() + multiset = [attrs[node_label]] + multiset # add the prefix + all_multisets.append(tuple(multiset)) + + # label compression + set_unique = list(set(all_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, + # else assign the number of labels occured + 1 as the compressed label. + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({value: all_set_compressed[value]}) + else: + set_compressed.update({value: str(num_of_labels_occured + 1)}) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for idx, node in enumerate(G.nodes()): + G.nodes[node][node_label] = set_compressed[all_multisets[idx]] + + # get the set of compressed labels + labels_comp = list(nx.get_node_attributes(G, node_label).values()) +# all_labels_ori.update(labels_comp) + all_num_of_each_label.append(dict(Counter(labels_comp))) + + # calculate subtree kernel with h iterations and add it to the final kernel + compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, False) + + return Kmatrix + + +def wl_iteration(G, node_label): + all_multisets = [] + for node, attrs in G.nodes(data=True): + # Multiset-label determination. + multiset = [G.nodes[neighbors][node_label] for neighbors in G[node]] + # sorting each multiset + multiset.sort() + multiset = [attrs[node_label]] + multiset # add the prefix + all_multisets.append(tuple(multiset)) +# # label compression +# set_unique = list(set(all_multisets)) # set of unique multiset labels + return all_multisets + +# # a dictionary mapping original labels to new ones. +# set_compressed = {} +# # if a label occured before, assign its former compressed label, +# # else assign the number of labels occured + 1 as the compressed label. +# for value in set_unique: +# if value in all_set_compressed.keys(): +# set_compressed.update({value: all_set_compressed[value]}) +# else: +# set_compressed.update({value: str(num_of_labels_occured + 1)}) +# num_of_labels_occured += 1 +# +# all_set_compressed.update(set_compressed) +# +# # relabel nodes +# for idx, node in enumerate(G.nodes()): +# G.nodes[node][node_label] = set_compressed[all_multisets[idx]] +# +# # get the set of compressed labels +# labels_comp = list(nx.get_node_attributes(G, node_label).values()) +# all_labels_ori.update(labels_comp) +# all_num_of_each_label.append(dict(Counter(labels_comp))) +# return + + +def wrapper_wl_iteration(node_label, itr_item): + g = itr_item[0] + i = itr_item[1] + all_multisets = wl_iteration(g, node_label) + return i, all_multisets + + +def compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, verbose): + """Compute kernel matrix using the base kernel. + """ + if parallel == 'imap_unordered': + # compute kernels. + def init_worker(alllabels_toshare): + global G_alllabels + G_alllabels = alllabels_toshare + do_partial = partial(wrapper_compute_subtree_kernel, Kmatrix) + parallel_gm(do_partial, Kmatrix, Gn, init_worker=init_worker, + glbv=(all_num_of_each_label,), n_jobs=n_jobs, verbose=verbose) + elif parallel == None: + for i in range(len(Kmatrix)): + for j in range(i, len(Kmatrix)): + Kmatrix[i][j] = compute_subtree_kernel(all_num_of_each_label[i], + all_num_of_each_label[j], Kmatrix[i][j]) + Kmatrix[j][i] = Kmatrix[i][j] + + +def compute_subtree_kernel(num_of_each_label1, num_of_each_label2, kernel): + """Compute the subtree kernel. + """ + labels = set(list(num_of_each_label1.keys()) + list(num_of_each_label2.keys())) + vector1 = np.array([(num_of_each_label1[label] + if (label in num_of_each_label1.keys()) else 0) + for label in labels]) + vector2 = np.array([(num_of_each_label2[label] + if (label in num_of_each_label2.keys()) else 0) + for label in labels]) + kernel += np.dot(vector1, vector2) + return kernel + + +def wrapper_compute_subtree_kernel(Kmatrix, itr): + i = itr[0] + j = itr[1] + return i, j, compute_subtree_kernel(G_alllabels[i], G_alllabels[j], Kmatrix[i][j]) + + +def _wl_spkernel_do(Gn, node_label, edge_label, height): + """Calculate Weisfeiler-Lehman shortest path kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + from pygraph.utils.utils import getSPGraph + + # init. + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel + + Gn = [ getSPGraph(G, edge_weight = edge_label) for G in Gn ] # get shortest path graphs of Gn + + # initial for height = 0 + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate subtree kernel with h iterations and add it to the final kernel + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + return Kmatrix + + + +def _wl_edgekernel_do(Gn, node_label, edge_label, height): + """Calculate Weisfeiler-Lehman edge kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + # init. + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel + + # initial for height = 0 + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate subtree kernel with h iterations and add it to the final kernel + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + return Kmatrix + + +def _wl_userkernel_do(Gn, node_label, edge_label, height, base_kernel): + """Calculate Weisfeiler-Lehman kernels based on user-defined kernel between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + base_kernel : string + Name of the base kernel function used in each iteration of WL kernel. This function returns a Numpy matrix, each element of which is the user-defined Weisfeiler-Lehman kernel between 2 praphs. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + # init. + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel + + # initial for height = 0 + Kmatrix = base_kernel(Gn, node_label, edge_label) + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate kernel with h iterations and add it to the final kernel + Kmatrix += base_kernel(Gn, node_label, edge_label) + + return Kmatrix diff --git a/pygraph/utils/kernels.py b/pygraph/utils/kernels.py index a89274f..1e9e44d 100644 --- a/pygraph/utils/kernels.py +++ b/pygraph/utils/kernels.py @@ -61,7 +61,7 @@ def polynomialkernel(x, y, d=1, c=0): """Polynomial kernel. Compute the polynomial kernel between x and y: - K(x, y) = (x^Ty)^d + c. + K(x, y) = ^d + c. Parameters ---------- @@ -78,6 +78,27 @@ def polynomialkernel(x, y, d=1, c=0): return np.dot(x, y) ** d + c +def linearkernel(x, y): + """Polynomial kernel. + Compute the polynomial kernel between x and y: + + K(x, y) = . + + Parameters + ---------- + x, y : array + + d : integer, default 1 + + c : float, default 0 + + Returns + ------- + kernel : float + """ + return np.dot(x, y) + + def kernelsum(k1, k2, d11, d12, d21=None, d22=None, lamda1=1, lamda2=1): """Sum of a pair of kernels. diff --git a/pygraph/utils/utils.py b/pygraph/utils/utils.py index b252007..b15ce94 100644 --- a/pygraph/utils/utils.py +++ b/pygraph/utils/utils.py @@ -241,4 +241,22 @@ def graph_isIdentical(G1, G2): return False # check graph attributes. - return True \ No newline at end of file + return True + + +def get_node_labels(Gn, node_label): + """Get node labels of dataset Gn. + """ + nl = set() + for G in Gn: + nl = nl | set(nx.get_node_attributes(G, node_label).values()) + return nl + + +def get_edge_labels(Gn, edge_label): + """Get edge labels of dataset Gn. + """ + el = set() + for G in Gn: + el = el | set(nx.get_edge_attributes(G, edge_label).values()) + return el \ No newline at end of file