From 73b2b7d27977eb8806b567a486e2a7e30e66ed19 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Fri, 24 May 2019 16:35:56 +0200 Subject: [PATCH] 1. add wl subtree kernel. 2. update datasets. --- README.md | 4 + datasets/MUTAG/MUTAG.mat | Bin 37655 -> 0 bytes datasets/MUTAG/MUTAG.zip | Bin 0 -> 18394 bytes datasets/MUTAG/MUTAG_A.txt | 7442 +++++++++++++++++++ datasets/MUTAG/MUTAG_edge_labels.txt | 7442 +++++++++++++++++++ datasets/MUTAG/MUTAG_graph_indicator.txt | 3371 +++++++++ datasets/MUTAG/MUTAG_graph_labels.txt | 188 + datasets/MUTAG/MUTAG_node_labels.txt | 3371 +++++++++ datasets/MUTAG/README | 68 - datasets/MUTAG/README.txt | 85 + notebooks/run_commonwalkkernel.ipynb | 12 +- notebooks/run_commonwalkkernel.py | 14 +- notebooks/run_marginalizedkernel.ipynb | 12 +- notebooks/run_marginalizedkernel.py | 12 +- notebooks/run_randomwalkkernel.ipynb | 12 +- notebooks/run_randomwalkkernel.py | 15 +- notebooks/run_spkernel.ipynb | 13 +- notebooks/run_spkernel.py | 15 +- notebooks/run_structuralspkernel.ipynb | 12 +- notebooks/run_structuralspkernel.py | 14 +- notebooks/run_treeletkernel.ipynb | 12 +- notebooks/run_treeletkernel.py | 20 +- notebooks/run_untilhpathkernel.ipynb | 20 +- notebooks/run_untilhpathkernel.py | 14 +- notebooks/run_weisfeilerlehmankernel.ipynb | 144 + notebooks/run_weisfeilerlehmankernel.py | 81 + preimage/iam.py | 20 +- pygraph/kernels/marginalizedKernel.py | 43 +- pygraph/kernels/randomWalkKernel.py | 1 + pygraph/kernels/spKernel.py | 1 + pygraph/kernels/structuralspKernel.py | 1 + pygraph/kernels/treeletKernel.py | 11 +- pygraph/kernels/unfinished/treeletKernel.py | 382 - pygraph/kernels/untilHPathKernel.py | 1 + pygraph/kernels/weisfeilerLehmanKernel.py | 549 ++ pygraph/utils/kernels.py | 23 +- pygraph/utils/utils.py | 20 +- 37 files changed, 22835 insertions(+), 610 deletions(-) delete mode 100644 datasets/MUTAG/MUTAG.mat create mode 100644 datasets/MUTAG/MUTAG.zip create mode 100644 datasets/MUTAG/MUTAG_A.txt create mode 100644 datasets/MUTAG/MUTAG_edge_labels.txt create mode 100644 datasets/MUTAG/MUTAG_graph_indicator.txt create mode 100644 datasets/MUTAG/MUTAG_graph_labels.txt create mode 100644 datasets/MUTAG/MUTAG_node_labels.txt delete mode 100644 datasets/MUTAG/README create mode 100644 datasets/MUTAG/README.txt create mode 100644 notebooks/run_weisfeilerlehmankernel.ipynb create mode 100644 notebooks/run_weisfeilerlehmankernel.py delete mode 100644 pygraph/kernels/unfinished/treeletKernel.py create mode 100644 pygraph/kernels/weisfeilerLehmanKernel.py diff --git a/README.md b/README.md index 67a82d4..d1345c6 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,8 @@ Simply clone this repository and voilà! Then check [`notebooks`](https://github * The MinMax kernel * Non-linear kernels * The treelet kernel [10] + * Weisfeiler-Lehman kernel [11] + * Subtree ## Computation optimization methods @@ -92,6 +94,8 @@ Linlin Jia, Benoit Gaüzère, and Paul Honeine. Graph Kernels Based on Linear Pa [10] Gaüzere, B., Brun, L., Villemin, D., 2012. Two new graphs kernels in chemoinformatics. Pattern Recognition Letters 33, 2038–2047. +[11] Shervashidze, N., Schweitzer, P., Leeuwen, E.J.v., Mehlhorn, K., Borgwardt, K.M., 2011. Weisfeiler-lehman graph kernels. Journal of Machine Learning Research 12, 2539–2561. + ## Authors * [Linlin Jia](https://github.com/jajupmochi), LITIS, INSA Rouen Normandie diff --git a/datasets/MUTAG/MUTAG.mat b/datasets/MUTAG/MUTAG.mat deleted file mode 100644 index 750209d55c9163e7429657cc1079b899735643ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37655 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�#1+dHb5$kp4d9^k6B* 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 DkoUr` diff --git a/datasets/MUTAG/MUTAG.zip b/datasets/MUTAG/MUTAG.zip new file mode 100644 index 0000000000000000000000000000000000000000..7ef4e7195405861518ebc88679e6d654eb66dc63 GIT binary patch literal 18394 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

ywU}ZHZOpO&+M^=nIG8M~;7d)Ed6tIJP^#eIUSW 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 BITru` literal 0 HcmV?d00001 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