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 750209d..0000000 Binary files a/datasets/MUTAG/MUTAG.mat and /dev/null differ diff --git a/datasets/MUTAG/MUTAG.zip b/datasets/MUTAG/MUTAG.zip new file mode 100644 index 0000000..7ef4e71 Binary files /dev/null and b/datasets/MUTAG/MUTAG.zip differ 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