├── .gitignore ├── README.md ├── emb └── barbell.emb ├── graph ├── barbell.edgelist ├── brazil-airports.edgelist ├── europe-airports.edgelist ├── facebook348.edgelist ├── karate-mirrored.edgelist ├── labels-brazil-airports.txt ├── labels-europe-airports.txt ├── labels-usa-airports.txt └── usa-airports.edgelist ├── license.md ├── pickles └── README.txt └── src ├── algorithms.py ├── algorithms_distances.py ├── graph.py ├── main.py ├── struc2vec.py └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.pickle 3 | *.log 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # struc2vec 2 | 3 | This repository provides a reference implementation of *struc2vec* as described in the paper:
4 | > struc2vec: Learning Node Representations from Structural Identity.
5 | > Leonardo F. R. Ribeiro, Pedro H. P. Saverese, Daniel R. Figueiredo.
6 | > Knowledge Discovery and Data Mining, SigKDD, 2017.
7 | 8 | The *struc2vec* algorithm learns continuous representations for nodes in any graph. *struc2vec* captures structural equivalence between nodes. 9 | 10 | Before to execute *struc2vec*, it is necessary to install the following packages: 11 |
12 | ``pip install futures`` 13 |
14 | ``pip install fastdtw`` 15 |
16 | ``pip install gensim`` 17 | 18 | ### Update 19 | Python 3 version: https://github.com/sebkaz/struc2vec/tree/master 20 | 21 | ### Basic Usage 22 | 23 | #### Example 24 | To run *struc2vec* on Mirrored Zachary's karate club network, execute the following command from the project home directory:
25 | ``python src/main.py --input graph/karate-mirrored.edgelist --output emb/karate-mirrored.emb`` 26 | 27 | #### Options 28 | 29 | To activate optimization 1, use the following option: 30 | ``--OPT1 true`` 31 |
32 | To activate optimization 2: 33 | ``--OPT2 true`` 34 |
35 | To activate optimization 3: 36 | ``--OPT3 true`` 37 |
38 | 39 | To run *struc2vec* on Barbell network, using all optimizations, execute the following command from the project home directory: 40 |
41 | ``python src/main.py --input graph/barbell.edgelist --output emb/barbell.emb --num-walks 20 --walk-length 80 --window-size 5 --dimensions 2 --OPT1 True --OPT2 True --OPT3 True --until-layer 6`` 42 | 43 | 44 | You can check out the other options available to use with *struc2vec* using:
45 | ``python src/main.py --help`` 46 | 47 | #### Input 48 | The supported input format is an edgelist: 49 | 50 | node1_id_int node2_id_int 51 | 52 | 53 | #### Output 54 | The output file has *n+1* lines for a graph with *n* vertices. 55 | The first line has the following format: 56 | 57 | num_of_nodes dim_of_representation 58 | 59 | The next *n* lines are as follows: 60 | 61 | node_id dim1 dim2 ... dimd 62 | 63 | where dim1, ... , dimd is the *d*-dimensional representation learned by *struc2vec*. 64 | 65 | 66 | ### Miscellaneous 67 | 68 | Please send any questions you might have about the code and/or the algorithm to . 69 | 70 | *Note:* This is only a reference implementation of the framework *struc2vec*. 71 | -------------------------------------------------------------------------------- /emb/barbell.emb: -------------------------------------------------------------------------------- 1 | 30 2 2 | 16 1.057548 -0.714364 3 | 13 1.066484 -0.699606 4 | 3 -1.408463 -2.204291 5 | 28 -1.444034 -2.231023 6 | 2 -1.413900 -2.188163 7 | 21 -1.408935 -2.175978 8 | 0 -1.430054 -2.183571 9 | 29 -1.431663 -2.207020 10 | 8 -1.403906 -2.158764 11 | 24 -1.369093 -2.143198 12 | 22 -1.377656 -2.136738 13 | 26 -1.374443 -2.125185 14 | 4 -1.385802 -2.147764 15 | 6 -1.433763 -2.222033 16 | 14 0.859722 -0.833089 17 | 5 -1.441403 -2.192810 18 | 27 -1.406257 -2.126390 19 | 25 -1.455383 -2.228332 20 | 7 -1.403924 -2.144958 21 | 23 -1.389340 -2.203717 22 | 15 0.837734 -0.850568 23 | 1 -1.444214 -2.171537 24 | 12 4.050539 -2.764455 25 | 17 4.027019 -2.838438 26 | 10 5.040916 -2.672271 27 | 19 4.933919 -2.635895 28 | 11 4.636244 -2.958682 29 | 18 5.003135 -3.172229 30 | 9 -0.879191 -1.622228 31 | 20 -0.925583 -1.660006 32 | -------------------------------------------------------------------------------- /graph/barbell.edgelist: -------------------------------------------------------------------------------- 1 | 0 1 2 | 0 2 3 | 0 3 4 | 0 4 5 | 0 5 6 | 0 6 7 | 0 7 8 | 0 8 9 | 0 9 10 | 1 2 11 | 1 3 12 | 1 4 13 | 1 5 14 | 1 6 15 | 1 7 16 | 1 8 17 | 1 9 18 | 2 3 19 | 2 4 20 | 2 5 21 | 2 6 22 | 2 7 23 | 2 8 24 | 2 9 25 | 3 4 26 | 3 5 27 | 3 6 28 | 3 7 29 | 3 8 30 | 3 9 31 | 4 5 32 | 4 6 33 | 4 7 34 | 4 8 35 | 4 9 36 | 5 6 37 | 5 7 38 | 5 8 39 | 5 9 40 | 6 7 41 | 6 8 42 | 6 9 43 | 7 8 44 | 7 9 45 | 8 9 46 | 9 10 47 | 10 11 48 | 11 12 49 | 12 13 50 | 13 14 51 | 14 15 52 | 15 16 53 | 16 17 54 | 17 18 55 | 18 19 56 | 19 20 57 | 20 21 58 | 20 22 59 | 20 23 60 | 20 24 61 | 20 25 62 | 20 26 63 | 20 27 64 | 20 28 65 | 20 29 66 | 21 22 67 | 21 23 68 | 21 24 69 | 21 25 70 | 21 26 71 | 21 27 72 | 21 28 73 | 21 29 74 | 22 23 75 | 22 24 76 | 22 25 77 | 22 26 78 | 22 27 79 | 22 28 80 | 22 29 81 | 23 24 82 | 23 25 83 | 23 26 84 | 23 27 85 | 23 28 86 | 23 29 87 | 24 25 88 | 24 26 89 | 24 27 90 | 24 28 91 | 24 29 92 | 25 26 93 | 25 27 94 | 25 28 95 | 25 29 96 | 26 27 97 | 26 28 98 | 26 29 99 | 27 28 100 | 27 29 101 | 28 29 102 | -------------------------------------------------------------------------------- /graph/brazil-airports.edgelist: -------------------------------------------------------------------------------- 1 | 7 77 2 | 29 50 3 | 3 35 4 | 9 84 5 | 25 82 6 | 6 28 7 | 64 51 8 | 108 74 9 | 19 4 10 | 2 84 11 | 7 25 12 | 56 25 13 | 24 66 14 | 23 26 15 | 30 51 16 | 10 61 17 | 50 84 18 | 65 84 19 | 53 53 20 | 9 0 21 | 30 15 22 | 45 35 23 | 10 7 24 | 87 52 25 | 106 19 26 | 70 53 27 | 58 130 28 | 6 98 29 | 103 80 30 | 7 19 31 | 36 40 32 | 25 15 33 | 15 4 34 | 4 50 35 | 2 27 36 | 7 98 37 | 9 123 38 | 1 54 39 | 58 65 40 | 4 5 41 | 96 77 42 | 9 127 43 | 50 27 44 | 1 120 45 | 55 2 46 | 79 1 47 | 3 40 48 | 36 67 49 | 75 15 50 | 67 7 51 | 0 67 52 | 61 69 53 | 9 39 54 | 6 41 55 | 36 41 56 | 49 71 57 | 31 51 58 | 46 2 59 | 49 67 60 | 9 9 61 | 57 7 62 | 6 67 63 | 36 5 64 | 34 3 65 | 58 4 66 | 30 69 67 | 80 25 68 | 61 25 69 | 10 66 70 | 15 71 71 | 36 29 72 | 97 25 73 | 2 18 74 | 69 58 75 | 71 71 76 | 9 124 77 | 51 5 78 | 54 54 79 | 43 91 80 | 38 51 81 | 29 4 82 | 40 51 83 | 30 27 84 | 4 42 85 | 34 70 86 | 7 15 87 | 22 45 88 | 61 94 89 | 3 55 90 | 18 5 91 | 0 84 92 | 25 70 93 | 4 48 94 | 117 71 95 | 15 70 96 | 9 50 97 | 66 37 98 | 3 68 99 | 54 64 100 | 58 15 101 | 106 5 102 | 45 47 103 | 10 19 104 | 25 25 105 | 49 52 106 | 63 66 107 | 0 5 108 | 24 2 109 | 98 25 110 | 83 87 111 | 27 31 112 | 21 77 113 | 54 21 114 | 38 40 115 | 2 7 116 | 74 30 117 | 29 29 118 | 3 22 119 | 77 3 120 | 10 71 121 | 8 8 122 | 6 1 123 | 30 30 124 | 87 87 125 | 9 121 126 | 7 4 127 | 65 5 128 | 5 20 129 | 3 60 130 | 24 87 131 | 6 27 132 | 54 33 133 | 112 24 134 | 129 9 135 | 61 49 136 | 5 71 137 | 74 75 138 | 75 75 139 | 6 61 140 | 36 37 141 | 2 117 142 | 108 108 143 | 125 125 144 | 87 49 145 | 9 29 146 | 80 80 147 | 6 87 148 | 36 3 149 | 1 103 150 | 27 52 151 | 127 42 152 | 61 5 153 | 41 71 154 | 74 63 155 | 69 69 156 | 25 4 157 | 36 8 158 | 78 25 159 | 2 30 160 | 0 50 161 | 74 25 162 | 3 31 163 | 1 51 164 | 58 68 165 | 30 5 166 | 40 5 167 | 2 56 168 | 50 30 169 | 9 90 170 | 66 29 171 | 87 74 172 | 42 43 173 | 15 84 174 | 7 27 175 | 50 50 176 | 29 42 177 | 18 17 178 | 32 50 179 | 70 70 180 | 6 52 181 | 36 44 182 | 6 21 183 | 8 7 184 | 50 82 185 | 122 126 186 | 61 36 187 | 56 40 188 | 36 10 189 | 10 5 190 | 65 65 191 | 63 50 192 | 61 30 193 | 0 19 194 | 94 117 195 | 97 6 196 | 2 25 197 | 94 94 198 | 74 0 199 | 98 5 200 | 74 74 201 | 3 4 202 | 18 84 203 | 95 4 204 | 25 55 205 | 67 120 206 | 54 25 207 | 28 4 208 | 77 15 209 | 51 36 210 | 40 31 211 | 4 45 212 | 1 46 213 | 3 48 214 | 9 37 215 | 24 75 216 | 36 43 217 | 2 71 218 | 9 128 219 | 22 2 220 | 37 42 221 | 61 61 222 | 27 117 223 | 42 39 224 | 25 101 225 | 3 65 226 | 69 45 227 | 2 97 228 | 15 97 229 | 54 27 230 | 80 27 231 | 45 0 232 | 63 15 233 | 36 25 234 | 45 52 235 | 36 50 236 | 15 15 237 | 63 1 238 | 7 49 239 | 0 0 240 | 50 41 241 | 3 13 242 | 51 7 243 | 15 53 244 | 28 3 245 | 122 124 246 | 31 61 247 | 5 24 248 | 101 27 249 | 2 36 250 | 36 38 251 | 65 2 252 | 79 54 253 | 3 57 254 | 27 84 255 | 24 82 256 | 25 68 257 | 47 25 258 | 36 82 259 | 43 9 260 | 41 41 261 | 0 2 262 | 79 92 263 | 33 26 264 | 58 120 265 | 50 102 266 | 25 110 267 | 33 84 268 | 3 70 269 | 36 56 270 | 60 45 271 | 2 120 272 | 67 58 273 | 7 61 274 | 68 61 275 | 24 30 276 | 5 68 277 | 6 82 278 | 45 45 279 | 25 31 280 | 37 91 281 | 0 7 282 | 74 50 283 | 9 82 284 | 51 9 285 | 25 1 286 | 15 50 287 | 21 75 288 | 2 5 289 | 7 22 290 | 83 83 291 | 3 24 292 | 77 1 293 | 10 69 294 | 6 7 295 | 123 123 296 | 88 7 297 | 8 51 298 | 2 63 299 | 31 5 300 | 79 63 301 | 3 62 302 | 77 27 303 | 92 21 304 | 25 77 305 | 6 25 306 | 1 84 307 | 84 99 308 | 63 67 309 | 6 83 310 | 94 7 311 | 127 127 312 | 23 25 313 | 0 71 314 | 3 79 315 | 36 39 316 | 1 67 317 | 8 2 318 | 120 50 319 | 44 39 320 | 89 89 321 | 62 4 322 | 45 2 323 | 72 5 324 | 54 97 325 | 53 87 326 | 1 31 327 | 49 5 328 | 97 3 329 | 93 93 330 | 7 97 331 | 74 7 332 | 66 91 333 | 79 30 334 | 3 1 335 | 49 49 336 | 102 2 337 | 85 74 338 | 31 42 339 | 5 27 340 | 79 4 341 | 3 39 342 | 101 23 343 | 96 51 344 | 120 84 345 | 36 0 346 | 58 53 347 | 0 64 348 | 53 48 349 | 29 40 350 | 51 68 351 | 6 42 352 | 45 5 353 | 1 68 354 | 2 74 355 | 8 9 356 | 50 80 357 | 64 21 358 | 9 4 359 | 24 108 360 | 66 42 361 | 60 25 362 | 108 3 363 | 30 70 364 | 61 28 365 | 76 84 366 | 7 64 367 | 54 63 368 | 25 19 369 | 21 93 370 | 53 45 371 | 6 120 372 | 77 51 373 | 25 53 374 | 15 46 375 | 21 71 376 | 50 5 377 | 67 51 378 | 113 51 379 | 9 65 380 | 0 30 381 | 46 71 382 | 10 42 383 | 8 42 384 | 7 18 385 | 3 50 386 | 29 39 387 | 24 77 388 | 25 65 389 | 81 108 390 | 4 53 391 | 1 93 392 | 2 69 393 | 15 69 394 | 7 40 395 | 22 0 396 | 29 91 397 | 33 24 398 | 25 107 399 | 6 71 400 | 3 67 401 | 54 77 402 | 10 10 403 | 24 25 404 | 3 105 405 | 45 50 406 | 58 77 407 | 68 15 408 | 58 108 409 | 80 51 410 | 7 87 411 | 24 63 412 | 53 5 413 | 3 15 414 | 10 38 415 | 75 4 416 | 58 84 417 | 28 29 418 | 76 7 419 | 5 13 420 | 79 10 421 | 3 21 422 | 9 74 423 | 6 2 424 | 30 31 425 | 41 5 426 | 29 58 427 | 3 59 428 | 7 130 429 | 24 84 430 | 6 36 431 | 60 49 432 | 50 66 433 | 94 2 434 | 9 41 435 | 74 76 436 | 122 66 437 | 3 72 438 | 36 58 439 | 93 55 440 | 7 63 441 | 75 63 442 | 2 61 443 | 23 15 444 | 10 31 445 | 64 64 446 | 26 26 447 | 0 25 448 | 36 71 449 | 1 4 450 | 66 74 451 | 103 21 452 | 2 3 453 | 0 63 454 | 29 25 455 | 25 41 456 | 6 5 457 | 21 51 458 | 65 130 459 | 65 27 460 | 84 87 461 | 40 9 462 | 56 50 463 | 5 16 464 | 113 7 465 | 25 83 466 | 6 31 467 | 64 50 468 | 36 91 469 | 19 5 470 | 67 31 471 | 7 30 472 | 63 77 473 | 113 25 474 | 94 5 475 | 18 18 476 | 23 27 477 | 6 49 478 | 21 7 479 | 2 113 480 | 58 18 481 | 0 97 482 | 79 77 483 | 122 122 484 | 77 77 485 | 121 122 486 | 71 27 487 | 45 36 488 | 130 84 489 | 23 23 490 | 7 69 491 | 42 91 492 | 62 30 493 | 99 76 494 | 69 65 495 | 15 5 496 | 97 1 497 | 7 99 498 | 24 51 499 | 3 3 500 | 51 61 501 | 25 50 502 | 58 64 503 | 46 46 504 | 95 69 505 | 22 51 506 | 3 41 507 | 67 2 508 | 25 84 509 | 6 22 510 | 45 105 511 | 58 51 512 | 76 33 513 | 22 21 514 | 64 1 515 | 68 7 516 | 66 51 517 | 6 40 518 | 30 53 519 | 45 3 520 | 32 24 521 | 80 2 522 | 9 10 523 | 25 96 524 | 81 3 525 | 119 66 526 | 10 1 527 | 58 7 528 | 21 113 529 | 22 97 530 | 10 94 531 | 7 66 532 | 32 58 533 | 38 4 534 | 96 27 535 | 2 21 536 | 39 65 537 | 24 58 538 | 9 125 539 | 51 2 540 | 2 15 541 | 9 126 542 | 33 75 543 | 46 55 544 | 79 15 545 | 9 71 546 | 10 95 547 | 25 93 548 | 6 9 549 | 4 41 550 | 7 106 551 | 84 67 552 | 58 58 553 | 41 2 554 | 46 25 555 | 3 52 556 | 18 4 557 | 24 79 558 | 25 71 559 | 34 35 560 | 8 50 561 | 7 42 562 | 46 3 563 | 94 25 564 | 18 30 565 | 74 67 566 | 66 36 567 | 6 69 568 | 3 69 569 | 84 23 570 | 67 57 571 | 106 4 572 | 24 27 573 | 66 82 574 | 3 107 575 | 45 48 576 | 25 26 577 | 0 4 578 | 24 1 579 | 123 125 580 | 1 1 581 | 64 97 582 | 41 39 583 | 28 31 584 | 120 120 585 | 0 58 586 | 5 11 587 | 77 4 588 | 1 71 589 | 54 84 590 | 6 0 591 | 7 5 592 | 65 6 593 | 5 21 594 | 79 50 595 | 3 61 596 | 77 30 597 | 24 86 598 | 15 1 599 | 23 6 600 | 10 41 601 | 67 24 602 | 22 25 603 | 7 80 604 | 94 0 605 | 18 25 606 | 42 42 607 | 47 3 608 | 70 2 609 | 36 36 610 | 10 51 611 | 58 9 612 | 45 21 613 | 18 51 614 | 10 120 615 | 10 29 616 | 41 28 617 | 8 25 618 | 0 27 619 | 57 51 620 | 98 19 621 | 25 5 622 | 98 2 623 | 2 1 624 | 74 24 625 | 6 130 626 | 58 71 627 | 30 4 628 | 4 31 629 | 84 111 630 | 50 97 631 | 63 97 632 | 59 48 633 | 9 91 634 | 57 49 635 | 6 29 636 | 21 27 637 | 36 69 638 | 0 77 639 | 0 75 640 | 29 43 641 | 127 123 642 | 65 51 643 | 4 67 644 | 10 58 645 | 32 3 646 | 79 79 647 | 9 7 648 | 5 73 649 | 38 41 650 | 36 4 651 | 36 9 652 | 10 4 653 | 71 84 654 | 52 58 655 | 30 67 656 | 69 1 657 | 9 63 658 | 7 71 659 | 24 15 660 | 5 83 661 | 71 51 662 | 120 3 663 | 51 25 664 | 79 71 665 | 125 89 666 | 7 93 667 | 24 53 668 | 98 4 669 | 3 5 670 | 9 122 671 | 51 63 672 | 25 48 673 | 75 51 674 | 21 58 675 | 90 129 676 | 2 50 677 | 0 46 678 | 61 106 679 | 1 47 680 | 57 58 681 | 43 123 682 | 41 31 683 | 50 51 684 | 69 67 685 | 3 49 686 | 59 60 687 | 83 27 688 | 6 46 689 | 36 42 690 | 38 106 691 | 58 27 692 | 7 47 693 | 37 43 694 | 98 98 695 | 25 102 696 | 6 64 697 | 3 94 698 | 29 53 699 | 10 15 700 | 2 96 701 | 58 5 702 | 70 45 703 | 42 64 704 | 48 51 705 | 43 125 706 | 119 82 707 | 9 1 708 | 87 5 709 | 0 15 710 | 66 0 711 | 74 3 712 | 3 10 713 | 75 3 714 | 21 67 715 | 88 25 716 | 28 2 717 | 45 15 718 | 51 42 719 | 75 25 720 | 6 15 721 | 64 2 722 | 17 5 723 | 31 29 724 | 24 81 725 | 25 69 726 | 40 43 727 | 123 89 728 | 74 71 729 | 50 71 730 | 79 93 731 | 94 31 732 | 24 4 733 | 3 71 734 | 79 23 735 | 5 69 736 | 45 46 737 | 51 84 738 | 15 21 739 | 39 56 740 | 22 80 741 | 7 83 742 | 74 53 743 | 6 119 744 | 15 51 745 | 75 77 746 | 28 25 747 | 71 4 748 | 6 51 749 | 79 22 750 | 3 25 751 | 77 2 752 | 51 51 753 | 6 6 754 | 23 3 755 | 84 84 756 | 76 25 757 | 7 7 758 | 71 30 759 | 3 63 760 | 6 24 761 | 45 115 762 | 108 87 763 | 10 82 764 | 27 130 765 | 42 40 766 | 6 50 767 | 45 13 768 | 119 10 769 | 0 23 770 | 37 39 771 | 89 90 772 | 6 84 773 | 3 82 774 | 1 102 775 | 15 18 776 | 30 94 777 | 61 4 778 | 24 10 779 | 5 104 780 | 77 33 781 | 8 65 782 | 27 33 783 | 19 61 784 | 2 31 785 | 0 51 786 | 96 96 787 | 3 30 788 | 1 50 789 | 21 63 790 | 54 7 791 | 2 57 792 | 50 31 793 | 45 116 794 | 79 5 795 | 9 89 796 | 25 87 797 | 6 19 798 | 21 25 799 | 88 51 800 | 75 67 801 | 0 79 802 | 5 38 803 | 57 25 804 | 6 53 805 | 45 6 806 | 66 127 807 | 58 30 808 | 7 48 809 | 9 5 810 | 25 99 811 | 6 79 812 | 10 2 813 | 15 27 814 | 4 4 815 | 45 1 816 | 81 32 817 | 75 54 818 | 24 9 819 | 127 125 820 | 50 60 821 | 74 1 822 | 41 69 823 | 126 66 824 | 3 7 825 | 66 123 826 | 99 27 827 | 30 13 828 | 28 5 829 | 2 48 830 | 85 84 831 | 31 8 832 | 5 5 833 | 79 2 834 | 9 66 835 | 51 39 836 | 6 10 837 | 19 41 838 | 36 119 839 | 2 42 840 | 4 69 841 | 3 51 842 | 25 66 843 | 10 98 844 | 19 19 845 | 2 68 846 | 58 25 847 | 7 41 848 | 56 9 849 | 7 84 850 | 33 25 851 | 25 100 852 | 90 90 853 | 3 64 854 | 45 25 855 | 31 71 856 | 24 24 857 | 62 5 858 | 45 51 859 | 45 27 860 | 0 1 861 | 51 120 862 | 53 26 863 | 27 27 864 | 25 63 865 | 58 87 866 | 6 18 867 | 66 4 868 | 5 14 869 | 70 84 870 | 3 18 871 | 97 84 872 | 82 82 873 | 45 78 874 | 66 66 875 | 31 31 876 | 55 50 877 | 3 56 878 | 27 87 879 | 24 83 880 | 66 6 881 | 6 39 882 | 21 21 883 | 4 51 884 | 60 48 885 | 84 53 886 | 46 7 887 | 59 45 888 | 25 109 889 | 6 57 890 | 3 73 891 | 60 46 892 | 67 71 893 | 28 71 894 | 9 25 895 | 5 67 896 | 7 102 897 | 36 7 898 | 10 30 899 | 25 30 900 | 114 25 901 | 68 28 902 | 70 60 903 | 0 24 904 | 74 51 905 | 70 48 906 | 7 120 907 | 1 5 908 | 80 79 909 | 2 2 910 | 7 107 911 | 48 24 912 | 3 27 913 | 51 53 914 | 6 4 915 | 30 1 916 | 2 60 917 | 76 27 918 | 7 1 919 | 53 55 920 | 92 22 921 | 66 1 922 | 6 30 923 | 19 2 924 | 7 31 925 | 97 92 926 | 94 4 927 | 83 84 928 | 51 69 929 | 23 24 930 | 40 58 931 | 10 63 932 | 7 53 933 | 37 37 934 | 59 24 935 | 69 27 936 | 6 74 937 | 3 84 938 | 10 25 939 | 2 106 940 | 0 31 941 | 74 58 942 | 96 3 943 | 53 28 944 | 49 4 945 | 61 45 946 | 7 96 947 | 24 50 948 | 79 25 949 | 3 0 950 | 10 77 951 | 127 89 952 | 42 5 953 | 4 27 954 | 79 7 955 | 3 38 956 | 125 121 957 | 36 65 958 | 58 50 959 | 79 45 960 | 21 1 961 | 76 76 962 | 60 60 963 | 58 28 964 | 7 50 965 | 97 79 966 | 80 1 967 | 79 75 968 | 57 1 969 | 45 84 970 | 89 124 971 | 10 0 972 | 58 6 973 | 39 40 974 | 63 63 975 | 124 123 976 | 23 7 977 | 48 48 978 | 54 76 979 | 1 23 980 | 122 89 981 | 74 15 982 | 3 9 983 | 77 50 984 | 15 41 985 | 4 2 986 | 28 7 987 | 84 32 988 | 22 53 989 | 91 91 990 | 58 31 991 | 51 41 992 | 6 8 993 | 53 27 994 | 4 40 995 | 2 40 996 | 55 55 997 | 3 53 998 | 9 42 999 | 25 64 1000 | 40 40 1001 | 21 10 1002 | 1 92 1003 | 2 66 1004 | 22 1 1005 | 55 45 1006 | 61 58 1007 | 6 68 1008 | 3 66 1009 | 69 71 1010 | 58 1 1011 | 64 84 1012 | 42 58 1013 | 90 66 1014 | 45 49 1015 | 25 27 1016 | 22 93 1017 | 50 53 1018 | 36 31 1019 | 75 7 1020 | 4 84 1021 | 28 30 1022 | 2 9 1023 | 5 12 1024 | 79 21 1025 | 53 2 1026 | 27 51 1027 | 25 39 1028 | 6 3 1029 | 4 23 1030 | 65 7 1031 | 66 58 1032 | 79 51 1033 | 3 58 1034 | 77 31 1035 | 24 85 1036 | 25 73 1037 | 38 69 1038 | 45 118 1039 | 10 40 1040 | 2 93 1041 | 67 25 1042 | 50 67 1043 | 46 5 1044 | 74 77 1045 | 3 29 1046 | 119 9 1047 | 52 5 1048 | 97 51 1049 | 78 79 1050 | 27 70 1051 | 9 31 1052 | 0 21 1053 | 53 71 1054 | 10 28 1055 | 66 81 1056 | 67 67 1057 | 41 42 1058 | 26 27 1059 | 41 65 1060 | 24 7 1061 | 6 38 1062 | 1 27 1063 | 29 37 1064 | 29 5 1065 | 78 27 1066 | 45 7 1067 | 74 27 1068 | 111 3 1069 | 25 40 1070 | 49 27 1071 | 21 50 1072 | 54 0 1073 | 28 51 1074 | 2 58 1075 | -------------------------------------------------------------------------------- /graph/europe-airports.edgelist: -------------------------------------------------------------------------------- 1 | 252 36 2 | 57 50 3 | 43 3 4 | 90 42 5 | 143 36 6 | 147 33 7 | 204 22 8 | 133 30 9 | 9 0 10 | 143 85 11 | 184 26 12 | 355 19 13 | 63 33 14 | 52 17 15 | 146 42 16 | 113 37 17 | 156 119 18 | 341 61 19 | 65 11 20 | 179 63 21 | 155 38 22 | 216 56 23 | 131 49 24 | 192 33 25 | 141 88 26 | 131 94 27 | 50 18 28 | 107 79 29 | 292 43 30 | 40 4 31 | 154 20 32 | 46 30 33 | 103 27 34 | 130 13 35 | 22 7 36 | 83 23 37 | 69 40 38 | 73 45 39 | 173 122 40 | 106 47 41 | 96 9 42 | 25 3 43 | 82 52 44 | 196 60 45 | 7 4 46 | 196 67 47 | 125 99 48 | 54 33 49 | 58 44 50 | 138 68 51 | 266 17 52 | 105 15 53 | 34 21 54 | 162 94 55 | 111 33 56 | 280 141 57 | 158 146 58 | 87 24 59 | 77 34 60 | 161 15 61 | 53 9 62 | 110 90 63 | 114 41 64 | 19 6 65 | 66 55 66 | 56 47 67 | 184 54 68 | 142 115 69 | 270 36 70 | 213 38 71 | 75 13 72 | 65 23 73 | 51 36 74 | 179 27 75 | 364 101 76 | 165 20 77 | 279 12 78 | 131 45 79 | 23 11 80 | 84 11 81 | 70 34 82 | 198 119 83 | 74 33 84 | 168 38 85 | 60 12 86 | 247 182 87 | 107 43 88 | 292 79 89 | 130 126 90 | 83 66 91 | 340 339 92 | 197 54 93 | 79 54 94 | 83 51 95 | 163 75 96 | 55 41 97 | 183 20 98 | 352 16 99 | 116 41 100 | 244 102 101 | 45 19 102 | 173 94 103 | 391 43 104 | 126 70 105 | 82 24 106 | 135 38 107 | 139 35 108 | 72 30 109 | 78 20 110 | 172 41 111 | 134 117 112 | 138 120 113 | 91 8 114 | 20 4 115 | 67 35 116 | 252 108 117 | 80 69 118 | 29 20 119 | 214 16 120 | 204 94 121 | 66 27 122 | 274 44 123 | 32 6 124 | 142 79 125 | 132 33 126 | 136 36 127 | 14 5 128 | 75 41 129 | 189 33 130 | 179 119 131 | 108 55 132 | 165 8 133 | 317 221 134 | 122 119 135 | 131 9 136 | 64 36 137 | 212 100 138 | 178 20 139 | 259 237 140 | 117 33 141 | 121 38 142 | 174 24 143 | 107 23 144 | 201 94 145 | 330 314 146 | 26 19 147 | 103 35 148 | 140 47 149 | 73 20 150 | 159 98 151 | 163 103 152 | 106 103 153 | 253 244 154 | 35 33 155 | 92 54 156 | 139 79 157 | 196 116 158 | 200 79 159 | 162 23 160 | 239 39 161 | 91 20 162 | 157 129 163 | 380 78 164 | 114 30 165 | 43 38 166 | 194 134 167 | 110 18 168 | 15 5 169 | 143 112 170 | 133 74 171 | 284 89 172 | 146 86 173 | 75 68 174 | 65 46 175 | 193 17 176 | 85 35 177 | 179 34 178 | 327 170 179 | 165 91 180 | 169 24 181 | 61 26 182 | 175 22 183 | 37 17 184 | 94 66 185 | 151 9 186 | 27 7 187 | 377 78 188 | 88 23 189 | 60 52 190 | 154 49 191 | 174 52 192 | 231 61 193 | 12 6 194 | 305 20 195 | 153 104 196 | 177 82 197 | 55 17 198 | 82 81 199 | 210 26 200 | 102 20 201 | 139 26 202 | 31 24 203 | 182 156 204 | 21 18 205 | 68 19 206 | 58 9 207 | 243 15 208 | 44 36 209 | 105 18 210 | 158 36 211 | 34 14 212 | 185 138 213 | 101 38 214 | 191 53 215 | 252 37 216 | 208 67 217 | 228 14 218 | 9 7 219 | 86 23 220 | 143 84 221 | 184 27 222 | 170 18 223 | 52 18 224 | 109 31 225 | 146 43 226 | 132 106 227 | 28 11 228 | 45 10 229 | 142 7 230 | 65 10 231 | 179 62 232 | 354 40 233 | 122 60 234 | 98 37 235 | 151 45 236 | 13 12 237 | 245 35 238 | 50 19 239 | 40 5 240 | 150 94 241 | 46 31 242 | 130 10 243 | 22 4 244 | 83 22 245 | 69 23 246 | 187 52 247 | 173 121 248 | 49 43 249 | 106 44 250 | 96 10 251 | 139 6 252 | 89 65 253 | 163 140 254 | 243 122 255 | 172 70 256 | 356 101 257 | 54 38 258 | 58 45 259 | 44 8 260 | 34 18 261 | 91 47 262 | 333 38 263 | 87 27 264 | 171 36 265 | 191 41 266 | 53 8 267 | 265 56 268 | 29 15 269 | 151 148 270 | 19 9 271 | 147 60 272 | 204 138 273 | 322 221 274 | 142 112 275 | 270 37 276 | 303 167 277 | 327 221 278 | 165 130 279 | 4 0 280 | 65 22 281 | 273 33 282 | 41 29 283 | 155 5 284 | 94 26 285 | 23 10 286 | 84 20 287 | 70 35 288 | 74 46 289 | 268 266 290 | 79 49 291 | 376 40 292 | 69 11 293 | 55 40 294 | 130 129 295 | 59 45 296 | 206 172 297 | 244 103 298 | 45 18 299 | 102 77 300 | 230 22 301 | 35 4 302 | 92 83 303 | 149 20 304 | 82 25 305 | 139 34 306 | 196 17 307 | 72 31 308 | 78 21 309 | 286 38 310 | 134 106 311 | 138 121 312 | 195 104 313 | 91 11 314 | 67 34 315 | 87 63 316 | 181 54 317 | 167 71 318 | 63 54 319 | 271 37 320 | 309 146 321 | 39 9 322 | 80 70 323 | 190 143 324 | 29 19 325 | 143 31 326 | 298 20 327 | 119 29 328 | 32 7 329 | 95 20 330 | 136 37 331 | 14 10 332 | 75 40 333 | 169 35 334 | 179 118 335 | 122 116 336 | 306 79 337 | 17 0 338 | 64 37 339 | 192 106 340 | 70 15 341 | 36 26 342 | 168 146 343 | 150 6 344 | 26 16 345 | 211 20 346 | 140 40 347 | 73 27 348 | 292 243 349 | 79 21 350 | 291 61 351 | 173 65 352 | 230 50 353 | 139 78 354 | 196 117 355 | 72 59 356 | 243 50 357 | 48 4 358 | 5 2 359 | 162 20 360 | 239 38 361 | 243 163 362 | 262 27 363 | 195 68 364 | 91 23 365 | 205 35 366 | 67 30 367 | 346 75 368 | 57 20 369 | 185 79 370 | 33 3 371 | 271 57 372 | 312 70 373 | 275 58 374 | 100 45 375 | 194 54 376 | 86 8 377 | 143 115 378 | 204 67 379 | 317 316 380 | 284 90 381 | 89 54 382 | 18 10 383 | 146 87 384 | 169 142 385 | 132 6 386 | 65 45 387 | 344 100 388 | 71 19 389 | 169 31 390 | 61 25 391 | 108 20 392 | 94 67 393 | 222 20 394 | 98 30 395 | 27 6 396 | 74 23 397 | 60 53 398 | 207 55 399 | 132 42 400 | 12 7 401 | 310 292 402 | 221 151 403 | 248 43 404 | 49 14 405 | 55 16 406 | 183 95 407 | 116 98 408 | 78 33 409 | 31 27 410 | 92 27 411 | 129 7 412 | 186 80 413 | 78 34 414 | 334 72 415 | 139 106 416 | 58 22 417 | 78 77 418 | 44 37 419 | 105 17 420 | 34 15 421 | 162 56 422 | 24 9 423 | 134 50 424 | 90 40 425 | 143 38 426 | 110 47 427 | 9 6 428 | 86 20 429 | 143 87 430 | 204 103 431 | 170 19 432 | 392 105 433 | 52 19 434 | 38 26 435 | 99 24 436 | 28 4 437 | 333 72 438 | 65 9 439 | 41 32 440 | 118 54 441 | 192 35 442 | 74 11 443 | 222 131 444 | 40 6 445 | 117 24 446 | 154 18 447 | 73 66 448 | 22 5 449 | 83 25 450 | 188 74 451 | 287 99 452 | 183 50 453 | 106 45 454 | 25 1 455 | 163 143 456 | 7 6 457 | 3 0 458 | 54 39 459 | 58 42 460 | 105 13 461 | 34 19 462 | 148 31 463 | 134 30 464 | 87 26 465 | 191 40 466 | 53 23 467 | 336 82 468 | 100 22 469 | 143 58 470 | 19 8 471 | 275 114 472 | 190 99 473 | 43 35 474 | 156 38 475 | 38 6 476 | 132 79 477 | 99 52 478 | 75 15 479 | 4 1 480 | 65 21 481 | 179 29 482 | 236 26 483 | 387 40 484 | 246 71 485 | 47 18 486 | 88 33 487 | 216 22 488 | 112 103 489 | 94 27 490 | 23 5 491 | 244 132 492 | 84 21 493 | 70 32 494 | 60 14 495 | 107 45 496 | 154 118 497 | 140 5 498 | 325 15 499 | 55 43 500 | 352 18 501 | 116 43 502 | 45 17 503 | 230 23 504 | 35 7 505 | 96 23 506 | 82 22 507 | 196 18 508 | 172 43 509 | 299 168 510 | 87 73 511 | 20 6 512 | 370 78 513 | 271 36 514 | 39 8 515 | 29 18 516 | 210 121 517 | 214 22 518 | 76 19 519 | 318 208 520 | 52 36 521 | 322 318 522 | 240 155 523 | 38 34 524 | 95 23 525 | 132 35 526 | 99 80 527 | 136 38 528 | 65 64 529 | 14 11 530 | 307 63 531 | 189 63 532 | 374 101 533 | 35 5 534 | 88 61 535 | 17 7 536 | 383 78 537 | 330 70 538 | 168 117 539 | 131 11 540 | 227 80 541 | 249 110 542 | 168 4 543 | 282 20 544 | 174 30 545 | 231 27 546 | 325 82 547 | 36 27 548 | 26 17 549 | 73 26 550 | 163 105 551 | 55 15 552 | 149 55 553 | 172 120 554 | 135 4 555 | 139 65 556 | 72 60 557 | 215 171 558 | 162 21 559 | 148 96 560 | 280 88 561 | 138 26 562 | 91 22 563 | 77 23 564 | 161 68 565 | 181 9 566 | 57 27 567 | 110 16 568 | 147 6 569 | 275 61 570 | 80 35 571 | 133 39 572 | 389 77 573 | 137 60 574 | 86 9 575 | 15 7 576 | 133 72 577 | 284 36 578 | 247 175 579 | 18 11 580 | 75 70 581 | 132 7 582 | 85 33 583 | 303 94 584 | 179 36 585 | 169 30 586 | 122 38 587 | 145 37 588 | 37 31 589 | 27 25 590 | 391 79 591 | 178 167 592 | 74 20 593 | 202 33 594 | 121 87 595 | 178 54 596 | 60 54 597 | 154 63 598 | 130 36 599 | 97 63 600 | 207 54 601 | 12 0 602 | 69 49 603 | 73 54 604 | 311 20 605 | 244 41 606 | 173 19 607 | 106 54 608 | 163 5 609 | 183 94 610 | 82 79 611 | 31 26 612 | 200 30 613 | 92 20 614 | 129 6 615 | 21 16 616 | 78 35 617 | 206 20 618 | 125 92 619 | 58 23 620 | 44 38 621 | 105 16 622 | 34 12 623 | 101 36 624 | 309 55 625 | 53 50 626 | 157 20 627 | 275 89 628 | 133 27 629 | 9 5 630 | 308 23 631 | 271 141 632 | 119 87 633 | 66 65 634 | 123 16 635 | 160 6 636 | 146 41 637 | 38 27 638 | 132 84 639 | 99 27 640 | 355 101 641 | 28 5 642 | 240 163 643 | 65 8 644 | 61 60 645 | 236 70 646 | 94 60 647 | 279 90 648 | 13 10 649 | 363 77 650 | 74 8 651 | 131 67 652 | 235 23 653 | 40 7 654 | 154 19 655 | 73 65 656 | 201 20 657 | 130 8 658 | 97 91 659 | 83 24 660 | 130 6 661 | 187 54 662 | 45 44 663 | 49 41 664 | 159 36 665 | 126 41 666 | 254 98 667 | 187 167 668 | 116 71 669 | 82 51 670 | 163 142 671 | 186 117 672 | 78 63 673 | 7 1 674 | 54 36 675 | 58 43 676 | 390 26 677 | 195 142 678 | 158 6 679 | 34 16 680 | 209 94 681 | 195 31 682 | 167 93 683 | 53 22 684 | 110 89 685 | 114 36 686 | 208 33 687 | 29 13 688 | 19 11 689 | 56 4 690 | 199 131 691 | 38 7 692 | 95 50 693 | 132 72 694 | 4 2 695 | 65 20 696 | 236 27 697 | 41 3 698 | 155 7 699 | 122 94 700 | 216 23 701 | 179 141 702 | 94 24 703 | 23 4 704 | 198 106 705 | 168 41 706 | 188 52 707 | 28 21 708 | 154 119 709 | 211 122 710 | 144 65 711 | 177 15 712 | 69 9 713 | 55 42 714 | 352 19 715 | 153 38 716 | 45 16 717 | 35 6 718 | 92 45 719 | 96 40 720 | 149 18 721 | 82 23 722 | 139 36 723 | 310 15 724 | 186 9 725 | 78 27 726 | 280 125 727 | 195 106 728 | 158 98 729 | 20 7 730 | 148 60 731 | 67 36 732 | 167 65 733 | 161 40 734 | 308 169 735 | 39 11 736 | 80 56 737 | 190 141 738 | 318 70 739 | 214 23 740 | 218 218 741 | 133 83 742 | 119 110 743 | 66 22 744 | 56 32 745 | 274 43 746 | 42 31 747 | 142 82 748 | 38 35 749 | 303 69 750 | 89 73 751 | 363 358 752 | 71 41 753 | 169 33 754 | 340 190 755 | 51 5 756 | 141 12 757 | 202 10 758 | 168 118 759 | 70 13 760 | 60 19 761 | 207 172 762 | 174 31 763 | 140 91 764 | 36 4 765 | 349 75 766 | 174 142 767 | 152 146 768 | 292 253 769 | 79 23 770 | 287 58 771 | 126 22 772 | 163 104 773 | 220 79 774 | 183 117 775 | 106 98 776 | 35 34 777 | 172 121 778 | 139 64 779 | 196 119 780 | 72 61 781 | 348 346 782 | 172 8 783 | 215 170 784 | 280 89 785 | 134 84 786 | 172 159 787 | 314 312 788 | 181 8 789 | 104 27 790 | 157 15 791 | 110 17 792 | 147 9 793 | 80 36 794 | 133 38 795 | 15 6 796 | 207 163 797 | 190 56 798 | 284 37 799 | 167 17 800 | 398 337 801 | 227 53 802 | 213 106 803 | 199 75 804 | 65 35 805 | 193 22 806 | 145 139 807 | 61 23 808 | 104 15 809 | 155 94 810 | 145 36 811 | 94 65 812 | 261 39 813 | 88 26 814 | 198 35 815 | 131 102 816 | 107 103 817 | 386 40 818 | 154 60 819 | 46 6 820 | 143 7 821 | 12 1 822 | 150 147 823 | 173 18 824 | 301 93 825 | 49 12 826 | 177 87 827 | 106 55 828 | 159 67 829 | 126 50 830 | 55 18 831 | 277 20 832 | 139 31 833 | 106 70 834 | 129 5 835 | 68 30 836 | 58 20 837 | 243 16 838 | 105 23 839 | 24 11 840 | 172 131 841 | 138 63 842 | 191 54 843 | 53 49 844 | 57 54 845 | 366 40 846 | 167 9 847 | 157 19 848 | 90 54 849 | 143 32 850 | 110 45 851 | 275 88 852 | 204 18 853 | 336 154 854 | 9 4 855 | 66 47 856 | 194 24 857 | 360 101 858 | 123 19 859 | 146 38 860 | 38 24 861 | 136 16 862 | 28 6 863 | 41 38 864 | 175 55 865 | 13 9 866 | 141 84 867 | 70 58 868 | 198 15 869 | 74 9 870 | 249 37 871 | 50 14 872 | 40 8 873 | 154 16 874 | 46 34 875 | 103 23 876 | 197 94 877 | 73 64 878 | 130 9 879 | 69 20 880 | 120 20 881 | 301 65 882 | 106 43 883 | 126 46 884 | 78 60 885 | 334 170 886 | 7 0 887 | 135 79 888 | 105 98 889 | 233 53 890 | 54 37 891 | 58 40 892 | 276 103 893 | 390 27 894 | 138 64 895 | 286 88 896 | 91 32 897 | 10 6 898 | 195 30 899 | 87 20 900 | 185 20 901 | 370 40 902 | 110 94 903 | 114 37 904 | 167 45 905 | 208 34 906 | 261 56 907 | 29 12 908 | 19 10 909 | 133 126 910 | 86 54 911 | 56 5 912 | 44 29 913 | 142 119 914 | 146 10 915 | 38 4 916 | 99 54 917 | 136 12 918 | 156 87 919 | 4 3 920 | 155 105 921 | 51 40 922 | 145 83 923 | 155 6 924 | 88 35 925 | 108 94 926 | 131 17 927 | 23 7 928 | 151 50 929 | 373 78 930 | 246 244 931 | 84 23 932 | 70 38 933 | 198 107 934 | 74 45 935 | 60 8 936 | 121 14 937 | 258 39 938 | 154 116 939 | 231 70 940 | 79 50 941 | 372 40 942 | 83 55 943 | 301 20 944 | 177 14 945 | 69 8 946 | 163 79 947 | 55 37 948 | 244 98 949 | 45 15 950 | 159 27 951 | 35 9 952 | 149 17 953 | 82 20 954 | 78 24 955 | 373 40 956 | 286 37 957 | 91 12 958 | 20 0 959 | 205 60 960 | 67 39 961 | 104 32 962 | 124 35 963 | 308 170 964 | 242 146 965 | 80 57 966 | 137 6 967 | 29 16 968 | 170 70 969 | 190 29 970 | 66 23 971 | 194 64 972 | 86 82 973 | 166 26 974 | 119 30 975 | 32 26 976 | 142 83 977 | 146 110 978 | 95 17 979 | 14 9 980 | 75 45 981 | 189 61 982 | 51 4 983 | 165 52 984 | 202 11 985 | 131 13 986 | 84 43 987 | 198 87 988 | 74 65 989 | 168 6 990 | 36 5 991 | 154 72 992 | 174 143 993 | 103 95 994 | 73 24 995 | 93 69 996 | 79 22 997 | 248 18 998 | 126 23 999 | 328 170 1000 | 55 9 1001 | 92 50 1002 | 277 96 1003 | 172 122 1004 | 68 59 1005 | 182 39 1006 | 243 55 1007 | 172 9 1008 | 390 80 1009 | 162 19 1010 | 148 98 1011 | 205 79 1012 | 333 26 1013 | 280 90 1014 | 172 152 1015 | 276 142 1016 | 314 313 1017 | 208 204 1018 | 204 159 1019 | 43 26 1020 | 323 314 1021 | 147 8 1022 | 80 37 1023 | 137 34 1024 | 86 15 1025 | 109 55 1026 | 166 6 1027 | 142 47 1028 | 18 9 1029 | 146 82 1030 | 65 34 1031 | 240 8 1032 | 61 22 1033 | 189 65 1034 | 246 18 1035 | 175 18 1036 | 344 22 1037 | 126 75 1038 | 98 29 1039 | 88 27 1040 | 141 47 1041 | 64 4 1042 | 84 79 1043 | 255 38 1044 | 46 7 1045 | 130 34 1046 | 97 61 1047 | 79 69 1048 | 12 2 1049 | 69 63 1050 | 244 43 1051 | 173 17 1052 | 139 129 1053 | 106 52 1054 | 163 7 1055 | 224 23 1056 | 106 71 1057 | 129 4 1058 | 243 98 1059 | 334 79 1060 | 172 94 1061 | 361 19 1062 | 125 90 1063 | 158 40 1064 | 34 10 1065 | 185 142 1066 | 24 12 1067 | 101 34 1068 | 138 60 1069 | 318 317 1070 | 208 71 1071 | 157 18 1072 | 143 35 1073 | 327 326 1074 | 275 91 1075 | 86 43 1076 | 123 18 1077 | 38 25 1078 | 166 34 1079 | 136 17 1080 | 28 7 1081 | 89 23 1082 | 65 14 1083 | 61 58 1084 | 155 61 1085 | 239 53 1086 | 145 7 1087 | 94 34 1088 | 98 33 1089 | 192 38 1090 | 13 8 1091 | 74 54 1092 | 167 117 1093 | 131 69 1094 | 292 80 1095 | 40 9 1096 | 154 17 1097 | 46 35 1098 | 221 71 1099 | 335 195 1100 | 83 26 1101 | 59 5 1102 | 244 15 1103 | 106 40 1104 | 159 38 1105 | 163 35 1106 | 206 199 1107 | 139 58 1108 | 78 61 1109 | 334 171 1110 | 7 3 1111 | 158 4 1112 | 91 35 1113 | 219 22 1114 | 148 26 1115 | 87 23 1116 | 91 80 1117 | 208 148 1118 | 63 30 1119 | 53 20 1120 | 110 95 1121 | 208 35 1122 | 171 169 1123 | 104 84 1124 | 308 70 1125 | 86 55 1126 | 56 6 1127 | 142 116 1128 | 38 5 1129 | 95 60 1130 | 99 57 1131 | 136 13 1132 | 320 314 1133 | 155 104 1134 | 340 338 1135 | 273 37 1136 | 118 17 1137 | 47 31 1138 | 178 154 1139 | 202 20 1140 | 94 30 1141 | 131 16 1142 | 23 6 1143 | 373 77 1144 | 70 39 1145 | 60 9 1146 | 188 54 1147 | 121 13 1148 | 154 117 1149 | 248 136 1150 | 103 58 1151 | 231 65 1152 | 221 171 1153 | 79 61 1154 | 83 54 1155 | 159 117 1156 | 55 36 1157 | 311 94 1158 | 153 36 1159 | 210 79 1160 | 391 38 1161 | 159 26 1162 | 103 71 1163 | 35 8 1164 | 96 42 1165 | 334 20 1166 | 82 21 1167 | 78 25 1168 | 206 82 1169 | 172 38 1170 | 196 172 1171 | 162 12 1172 | 54 6 1173 | 115 20 1174 | 87 74 1175 | 91 15 1176 | 88 36 1177 | 67 38 1178 | 370 77 1179 | 63 50 1180 | 285 20 1181 | 39 5 1182 | 80 58 1183 | 208 15 1184 | 47 4 1185 | 153 83 1186 | 170 71 1187 | 194 65 1188 | 109 82 1189 | 274 41 1190 | 166 27 1191 | 227 27 1192 | 284 114 1193 | 322 317 1194 | 38 33 1195 | 71 43 1196 | 169 39 1197 | 189 60 1198 | 246 55 1199 | 51 7 1200 | 32 27 1201 | 245 197 1202 | 122 112 1203 | 202 8 1204 | 247 163 1205 | 64 57 1206 | 60 45 1207 | 106 91 1208 | 207 174 1209 | 154 38 1210 | 121 41 1211 | 36 6 1212 | 292 104 1213 | 311 156 1214 | 103 94 1215 | 140 36 1216 | 73 31 1217 | 79 17 1218 | 135 19 1219 | 254 41 1220 | 55 8 1221 | 183 119 1222 | 244 71 1223 | 267 56 1224 | 96 54 1225 | 72 63 1226 | 152 132 1227 | 266 67 1228 | 162 16 1229 | 148 99 1230 | 195 72 1231 | 347 133 1232 | 276 143 1233 | 81 81 1234 | 114 27 1235 | 242 36 1236 | 90 80 1237 | 110 23 1238 | 80 38 1239 | 394 106 1240 | 15 0 1241 | 76 50 1242 | 216 70 1243 | 109 54 1244 | 89 58 1245 | 142 44 1246 | 18 6 1247 | 146 83 1248 | 193 20 1249 | 165 70 1250 | 61 21 1251 | 189 64 1252 | 108 16 1253 | 94 71 1254 | 98 26 1255 | 151 4 1256 | 27 26 1257 | 198 33 1258 | 74 19 1259 | 222 171 1260 | 64 5 1261 | 84 72 1262 | 60 49 1263 | 335 121 1264 | 46 4 1265 | 79 68 1266 | 12 3 1267 | 69 62 1268 | 311 17 1269 | 187 47 1270 | 234 14 1271 | 163 6 1272 | 120 105 1273 | 102 9 1274 | 139 17 1275 | 31 7 1276 | 92 23 1277 | 129 27 1278 | 68 24 1279 | 125 89 1280 | 243 18 1281 | 148 7 1282 | 134 54 1283 | 138 61 1284 | 208 169 1285 | 143 34 1286 | 275 90 1287 | 66 45 1288 | 86 40 1289 | 119 80 1290 | 247 31 1291 | 52 31 1292 | 345 19 1293 | 146 36 1294 | 38 30 1295 | 166 35 1296 | 53 31 1297 | 136 18 1298 | 65 13 1299 | 179 5 1300 | 236 50 1301 | 41 36 1302 | 98 79 1303 | 61 57 1304 | 118 10 1305 | 201 65 1306 | 88 73 1307 | 94 35 1308 | 131 55 1309 | 70 56 1310 | 363 78 1311 | 202 64 1312 | 80 40 1313 | 50 12 1314 | 40 10 1315 | 103 17 1316 | 73 70 1317 | 93 27 1318 | 221 70 1319 | 207 23 1320 | 103 102 1321 | 59 4 1322 | 45 41 1323 | 190 70 1324 | 49 46 1325 | 106 41 1326 | 391 82 1327 | 310 38 1328 | 239 132 1329 | 243 65 1330 | 7 2 1331 | 210 138 1332 | 366 354 1333 | 58 54 1334 | 152 47 1335 | 158 5 1336 | 91 34 1337 | 134 18 1338 | 10 4 1339 | 91 83 1340 | 208 149 1341 | 171 27 1342 | 232 27 1343 | 346 15 1344 | 29 10 1345 | 163 106 1346 | 237 56 1347 | 156 34 1348 | 146 8 1349 | 166 79 1350 | 71 70 1351 | 165 141 1352 | 179 97 1353 | 88 37 1354 | 94 31 1355 | 131 19 1356 | 23 1 1357 | 282 141 1358 | 249 86 1359 | 70 36 1360 | 60 10 1361 | 117 87 1362 | 174 6 1363 | 107 33 1364 | 349 100 1365 | 97 11 1366 | 207 122 1367 | 221 170 1368 | 79 60 1369 | 358 77 1370 | 55 39 1371 | 187 87 1372 | 116 55 1373 | 45 13 1374 | 248 103 1375 | 159 5 1376 | 126 72 1377 | 92 40 1378 | 220 21 1379 | 82 18 1380 | 300 93 1381 | 196 30 1382 | 72 4 1383 | 186 20 1384 | 390 106 1385 | 266 172 1386 | 233 23 1387 | 286 43 1388 | 215 131 1389 | 54 7 1390 | 138 98 1391 | 20 2 1392 | 299 61 1393 | 63 61 1394 | 104 34 1395 | 275 37 1396 | 39 4 1397 | 80 59 1398 | 137 4 1399 | 194 94 1400 | 86 80 1401 | 56 35 1402 | 274 38 1403 | 294 45 1404 | 351 20 1405 | 119 24 1406 | 345 75 1407 | 169 38 1408 | 341 99 1409 | 51 6 1410 | 165 50 1411 | 202 9 1412 | 131 15 1413 | 64 58 1414 | 84 53 1415 | 118 79 1416 | 292 26 1417 | 168 8 1418 | 60 46 1419 | 140 86 1420 | 36 7 1421 | 292 105 1422 | 97 23 1423 | 154 86 1424 | 197 20 1425 | 73 30 1426 | 311 12 1427 | 79 16 1428 | 173 43 1429 | 177 40 1430 | 126 21 1431 | 163 109 1432 | 55 11 1433 | 183 118 1434 | 300 178 1435 | 206 60 1436 | 172 116 1437 | 300 65 1438 | 159 142 1439 | 72 32 1440 | 172 11 1441 | 162 17 1442 | 310 153 1443 | 172 154 1444 | 367 101 1445 | 77 19 1446 | 67 5 1447 | 181 21 1448 | 57 31 1449 | 366 19 1450 | 242 37 1451 | 157 12 1452 | 110 20 1453 | 241 155 1454 | 80 39 1455 | 15 3 1456 | 119 79 1457 | 52 4 1458 | 355 77 1459 | 89 57 1460 | 142 45 1461 | 18 7 1462 | 85 45 1463 | 61 20 1464 | 189 95 1465 | 94 68 1466 | 98 27 1467 | 316 70 1468 | 118 94 1469 | 198 38 1470 | 64 6 1471 | 121 91 1472 | 60 50 1473 | 46 5 1474 | 130 32 1475 | 79 71 1476 | 207 50 1477 | 361 358 1478 | 69 61 1479 | 73 58 1480 | 183 37 1481 | 311 16 1482 | 281 37 1483 | 376 101 1484 | 304 194 1485 | 106 50 1486 | 163 9 1487 | 82 75 1488 | 210 20 1489 | 391 105 1490 | 139 16 1491 | 267 39 1492 | 106 69 1493 | 186 93 1494 | 78 39 1495 | 233 94 1496 | 125 88 1497 | 105 20 1498 | 34 8 1499 | 239 65 1500 | 152 67 1501 | 81 35 1502 | 134 55 1503 | 195 39 1504 | 208 170 1505 | 299 5 1506 | 252 35 1507 | 110 65 1508 | 242 73 1509 | 157 16 1510 | 143 45 1511 | 147 38 1512 | 298 70 1513 | 190 72 1514 | 143 82 1515 | 241 16 1516 | 62 6 1517 | 160 26 1518 | 146 37 1519 | 38 31 1520 | 99 31 1521 | 136 19 1522 | 45 9 1523 | 179 4 1524 | 240 54 1525 | 61 56 1526 | 47 5 1527 | 94 32 1528 | 131 54 1529 | 151 43 1530 | 13 6 1531 | 74 52 1532 | 202 65 1533 | 31 17 1534 | 121 119 1535 | 212 154 1536 | 50 13 1537 | 40 11 1538 | 154 31 1539 | 46 33 1540 | 103 16 1541 | 140 30 1542 | 325 22 1543 | 201 24 1544 | 130 4 1545 | 69 17 1546 | 382 40 1547 | 220 131 1548 | 183 9 1549 | 59 7 1550 | 187 74 1551 | 45 40 1552 | 106 22 1553 | 126 45 1554 | 257 56 1555 | 224 53 1556 | 25 4 1557 | 82 47 1558 | 139 60 1559 | 267 67 1560 | 105 103 1561 | 333 79 1562 | 44 6 1563 | 229 14 1564 | 158 10 1565 | 91 37 1566 | 134 19 1567 | 10 5 1568 | 91 82 1569 | 309 23 1570 | 29 9 1571 | 394 390 1572 | 214 15 1573 | 90 9 1574 | 241 163 1575 | 56 8 1576 | 184 61 1577 | 62 34 1578 | 105 43 1579 | 146 9 1580 | 132 52 1581 | 136 15 1582 | 156 82 1583 | 71 65 1584 | 95 79 1585 | 388 365 1586 | 175 103 1587 | 128 126 1588 | 179 96 1589 | 236 23 1590 | 165 29 1591 | 98 80 1592 | 155 27 1593 | 122 90 1594 | 88 38 1595 | 131 18 1596 | 282 138 1597 | 155 136 1598 | 47 40 1599 | 70 37 1600 | 198 110 1601 | 74 40 1602 | 168 45 1603 | 60 11 1604 | 50 49 1605 | 97 10 1606 | 278 33 1607 | 26 6 1608 | 83 75 1609 | 197 63 1610 | 55 38 1611 | 59 35 1612 | 45 12 1613 | 248 104 1614 | 230 8 1615 | 159 4 1616 | 35 10 1617 | 220 22 1618 | 206 33 1619 | 139 88 1620 | 72 5 1621 | 54 4 1622 | 101 23 1623 | 138 99 1624 | 266 60 1625 | 20 3 1626 | 67 40 1627 | 205 138 1628 | 171 6 1629 | 104 35 1630 | 360 77 1631 | 275 36 1632 | 80 60 1633 | 171 151 1634 | 147 94 1635 | 5 4 1636 | 298 30 1637 | 119 106 1638 | 66 18 1639 | 194 95 1640 | 56 36 1641 | 104 38 1642 | 119 27 1643 | 32 29 1644 | 169 148 1645 | 99 87 1646 | 136 43 1647 | 85 8 1648 | 303 65 1649 | 14 12 1650 | 71 37 1651 | 350 100 1652 | 122 15 1653 | 51 9 1654 | 202 167 1655 | 104 80 1656 | 292 27 1657 | 168 9 1658 | 60 47 1659 | 353 19 1660 | 192 159 1661 | 231 22 1662 | 292 106 1663 | 97 22 1664 | 244 163 1665 | 154 87 1666 | 140 38 1667 | 311 15 1668 | 324 170 1669 | 362 101 1670 | 126 26 1671 | 163 108 1672 | 55 10 1673 | 224 14 1674 | 116 20 1675 | 244 65 1676 | 120 79 1677 | 21 7 1678 | 72 33 1679 | 158 51 1680 | 276 26 1681 | 243 169 1682 | 101 11 1683 | 195 74 1684 | 215 23 1685 | 70 9 1686 | 299 24 1687 | 67 4 1688 | 181 20 1689 | 114 25 1690 | 167 97 1691 | 43 31 1692 | 104 31 1693 | 80 24 1694 | 214 55 1695 | 15 2 1696 | 204 121 1697 | 45 32 1698 | 193 121 1699 | 156 107 1700 | 18 4 1701 | 132 12 1702 | 65 39 1703 | 71 9 1704 | 392 41 1705 | 345 100 1706 | 189 94 1707 | 122 35 1708 | 108 18 1709 | 94 69 1710 | 98 24 1711 | 151 6 1712 | 118 95 1713 | 141 44 1714 | 131 106 1715 | 188 9 1716 | 64 7 1717 | 121 90 1718 | 255 35 1719 | 60 51 1720 | 279 275 1721 | 174 63 1722 | 292 142 1723 | 150 36 1724 | 69 60 1725 | 73 57 1726 | 183 36 1727 | 311 19 1728 | 187 33 1729 | 159 79 1730 | 163 8 1731 | 139 19 1732 | 163 153 1733 | 75 12 1734 | 139 96 1735 | 182 6 1736 | 115 33 1737 | 243 20 1738 | 78 11 1739 | 105 27 1740 | 34 9 1741 | 162 50 1742 | 24 15 1743 | 195 38 1744 | 91 73 1745 | 208 171 1746 | 191 50 1747 | 232 33 1748 | 309 163 1749 | 167 5 1750 | 228 53 1751 | 237 193 1752 | 147 41 1753 | 275 92 1754 | 80 4 1755 | 9 8 1756 | 194 20 1757 | 241 23 1758 | 294 27 1759 | 199 154 1760 | 99 30 1761 | 179 7 1762 | 240 55 1763 | 61 55 1764 | 122 71 1765 | 145 4 1766 | 94 33 1767 | 302 178 1768 | 13 5 1769 | 74 53 1770 | 131 70 1771 | 164 6 1772 | 292 83 1773 | 140 31 1774 | 130 5 1775 | 207 17 1776 | 254 20 1777 | 59 6 1778 | 120 24 1779 | 106 23 1780 | 254 103 1781 | 25 11 1782 | 82 44 1783 | 102 43 1784 | 310 36 1785 | 319 318 1786 | 105 102 1787 | 125 123 1788 | 253 38 1789 | 200 142 1790 | 58 52 1791 | 158 11 1792 | 91 36 1793 | 87 16 1794 | 242 27 1795 | 208 151 1796 | 63 27 1797 | 161 7 1798 | 114 33 1799 | 208 38 1800 | 171 170 1801 | 298 59 1802 | 66 15 1803 | 56 9 1804 | 241 51 1805 | 42 36 1806 | 62 35 1807 | 119 54 1808 | 265 259 1809 | 146 6 1810 | 104 20 1811 | 247 146 1812 | 75 5 1813 | 39 27 1814 | 41 6 1815 | 118 20 1816 | 155 26 1817 | 94 29 1818 | 23 3 1819 | 155 139 1820 | 141 116 1821 | 70 26 1822 | 60 4 1823 | 282 58 1824 | 121 18 1825 | 50 46 1826 | 97 9 1827 | 278 38 1828 | 26 7 1829 | 103 55 1830 | 272 139 1831 | 234 53 1832 | 55 33 1833 | 59 34 1834 | 116 49 1835 | 153 41 1836 | 45 11 1837 | 248 105 1838 | 220 23 1839 | 96 45 1840 | 206 38 1841 | 159 148 1842 | 72 6 1843 | 286 41 1844 | 162 11 1845 | 54 5 1846 | 156 132 1847 | 30 18 1848 | 299 63 1849 | 194 186 1850 | 360 78 1851 | 39 6 1852 | 80 61 1853 | 137 10 1854 | 214 40 1855 | 76 9 1856 | 5 3 1857 | 66 19 1858 | 116 42 1859 | 113 20 1860 | 166 30 1861 | 119 26 1862 | 32 30 1863 | 217 22 1864 | 38 36 1865 | 166 105 1866 | 95 29 1867 | 132 41 1868 | 303 64 1869 | 14 13 1870 | 71 36 1871 | 169 36 1872 | 61 14 1873 | 51 8 1874 | 70 6 1875 | 60 40 1876 | 140 80 1877 | 272 88 1878 | 221 27 1879 | 154 84 1880 | 173 152 1881 | 197 18 1882 | 2 0 1883 | 187 4 1884 | 79 18 1885 | 49 27 1886 | 159 106 1887 | 126 27 1888 | 55 5 1889 | 263 56 1890 | 230 53 1891 | 182 136 1892 | 21 6 1893 | 381 40 1894 | 186 54 1895 | 280 47 1896 | 125 35 1897 | 299 138 1898 | 101 10 1899 | 30 14 1900 | 215 22 1901 | 67 7 1902 | 114 22 1903 | 242 35 1904 | 208 95 1905 | 323 318 1906 | 170 151 1907 | 143 120 1908 | 76 45 1909 | 119 73 1910 | 52 6 1911 | 199 177 1912 | 146 63 1913 | 132 126 1914 | 18 5 1915 | 132 13 1916 | 65 38 1917 | 374 40 1918 | 61 18 1919 | 179 91 1920 | 37 25 1921 | 94 74 1922 | 98 25 1923 | 175 143 1924 | 88 31 1925 | 188 10 1926 | 84 75 1927 | 27 3 1928 | 46 11 1929 | 231 53 1930 | 292 143 1931 | 79 65 1932 | 73 56 1933 | 311 18 1934 | 244 55 1935 | 173 13 1936 | 163 11 1937 | 139 18 1938 | 163 152 1939 | 314 20 1940 | 78 37 1941 | 206 30 1942 | 139 99 1943 | 148 147 1944 | 243 23 1945 | 105 26 1946 | 34 6 1947 | 111 20 1948 | 24 16 1949 | 243 132 1950 | 134 53 1951 | 195 41 1952 | 87 15 1953 | 309 49 1954 | 208 172 1955 | 114 58 1956 | 191 130 1957 | 143 47 1958 | 110 54 1959 | 80 5 1960 | 66 40 1961 | 184 35 1962 | 62 4 1963 | 146 35 1964 | 213 9 1965 | 89 27 1966 | 142 15 1967 | 179 6 1968 | 61 54 1969 | 189 97 1970 | 118 9 1971 | 94 38 1972 | 131 56 1973 | 13 4 1974 | 74 50 1975 | 121 117 1976 | 235 13 1977 | 278 27 1978 | 103 18 1979 | 144 91 1980 | 201 30 1981 | 93 24 1982 | 221 67 1983 | 97 93 1984 | 207 16 1985 | 130 7 1986 | 163 86 1987 | 310 283 1988 | 281 7 1989 | 45 38 1990 | 177 118 1991 | 106 20 1992 | 159 34 1993 | 35 16 1994 | 163 39 1995 | 82 45 1996 | 102 40 1997 | 206 122 1998 | 152 50 1999 | 148 38 2000 | 134 17 2001 | 158 155 2002 | 342 340 2003 | 347 206 2004 | 232 30 2005 | 161 6 2006 | 167 40 2007 | 379 78 2008 | 90 23 2009 | 66 12 2010 | 194 121 2011 | 392 27 2012 | 42 37 2013 | 142 120 2014 | 199 121 2015 | 146 7 2016 | 378 6 2017 | 132 54 2018 | 99 61 2019 | 136 49 2020 | 320 318 2021 | 135 134 2022 | 75 4 2023 | 246 47 2024 | 273 25 2025 | 165 27 2026 | 41 5 2027 | 226 27 2028 | 155 29 2029 | 47 27 2030 | 88 40 2031 | 131 20 2032 | 23 2 2033 | 70 27 2034 | 60 5 2035 | 121 17 2036 | 50 47 2037 | 272 125 2038 | 97 8 2039 | 174 116 2040 | 79 57 2041 | 83 58 2042 | 120 53 2043 | 230 14 2044 | 159 6 2045 | 315 313 2046 | 126 79 2047 | 183 156 2048 | 72 7 2049 | 253 82 2050 | 78 29 2051 | 390 105 2052 | 233 20 2053 | 54 26 2054 | 101 21 2055 | 20 13 2056 | 299 62 2057 | 87 55 2058 | 213 143 2059 | 80 62 2060 | 137 9 2061 | 170 67 2062 | 190 6 2063 | 66 16 2064 | 288 26 2065 | 52 35 2066 | 56 38 2067 | 274 37 2068 | 351 17 2069 | 136 94 2070 | 264 19 2071 | 318 170 2072 | 38 37 2073 | 169 154 2074 | 332 322 2075 | 307 4 2076 | 71 39 2077 | 75 32 2078 | 61 13 2079 | 155 72 2080 | 51 11 2081 | 131 112 2082 | 263 256 2083 | 64 61 2084 | 278 275 2085 | 168 11 2086 | 154 34 2087 | 174 33 2088 | 272 89 2089 | 93 47 2090 | 26 24 2091 | 154 85 2092 | 248 168 2093 | 197 17 2094 | 93 64 2095 | 187 7 2096 | 248 23 2097 | 49 26 2098 | 163 110 2099 | 201 167 2100 | 55 4 2101 | 96 91 2102 | 129 51 2103 | 21 5 2104 | 72 35 2105 | 243 58 2106 | 172 6 2107 | 276 36 2108 | 245 85 2109 | 101 9 2110 | 30 15 2111 | 158 64 2112 | 162 159 2113 | 67 6 2114 | 53 39 2115 | 181 18 2116 | 185 87 2117 | 114 23 2118 | 43 17 2119 | 356 40 2120 | 194 159 2121 | 157 9 2122 | 110 27 2123 | 39 37 2124 | 80 26 2125 | 375 77 2126 | 170 39 2127 | 247 55 2128 | 284 35 2129 | 341 190 2130 | 288 38 2131 | 136 122 2132 | 355 78 2133 | 18 2 2134 | 146 79 2135 | 65 37 2136 | 283 106 2137 | 71 11 2138 | 151 147 2139 | 354 29 2140 | 246 23 2141 | 283 27 2142 | 122 33 2143 | 198 138 2144 | 175 142 2145 | 178 94 2146 | 74 31 2147 | 222 175 2148 | 292 136 2149 | 83 5 2150 | 174 172 2151 | 73 63 2152 | 187 35 2153 | 173 12 2154 | 49 6 2155 | 159 73 2156 | 163 10 2157 | 183 87 2158 | 116 106 2159 | 82 70 2160 | 139 21 2161 | 163 155 2162 | 243 105 2163 | 206 31 2164 | 68 4 2165 | 334 195 2166 | 229 23 2167 | 34 7 2168 | 153 147 2169 | 111 23 2170 | 24 17 2171 | 101 45 2172 | 204 106 2173 | 77 52 2174 | 208 173 2175 | 208 60 2176 | 191 141 2177 | 147 43 2178 | 80 6 2179 | 190 79 2180 | 143 95 2181 | 184 36 2182 | 241 21 2183 | 294 25 2184 | 170 27 2185 | 247 27 2186 | 38 18 2187 | 166 39 2188 | 75 27 2189 | 354 78 2190 | 179 9 2191 | 41 40 2192 | 61 53 2193 | 47 6 2194 | 340 99 2195 | 13 3 2196 | 70 60 2197 | 350 348 2198 | 282 36 2199 | 50 8 2200 | 40 14 2201 | 207 98 2202 | 154 26 2203 | 46 36 2204 | 325 19 2205 | 93 23 2206 | 79 36 2207 | 103 98 2208 | 362 40 2209 | 254 26 2210 | 183 10 2211 | 187 79 2212 | 244 20 2213 | 120 26 2214 | 248 79 2215 | 177 117 2216 | 163 38 2217 | 314 70 2218 | 25 9 2219 | 82 42 2220 | 300 117 2221 | 102 41 2222 | 196 38 2223 | 78 6 2224 | 138 74 2225 | 195 119 2226 | 158 9 2227 | 134 22 2228 | 10 0 2229 | 87 18 2230 | 63 5 2231 | 232 31 2232 | 151 133 2233 | 208 24 2234 | 29 6 2235 | 90 20 2236 | 147 71 2237 | 56 11 2238 | 142 121 2239 | 136 50 2240 | 320 319 2241 | 193 39 2242 | 199 9 2243 | 158 18 2244 | 250 35 2245 | 165 26 2246 | 320 221 2247 | 47 26 2248 | 152 98 2249 | 88 41 2250 | 202 17 2251 | 131 23 2252 | 297 291 2253 | 151 72 2254 | 155 141 2255 | 84 29 2256 | 141 114 2257 | 255 20 2258 | 168 16 2259 | 60 6 2260 | 50 44 2261 | 164 36 2262 | 278 36 2263 | 26 5 2264 | 272 141 2265 | 234 51 2266 | 201 138 2267 | 55 35 2268 | 221 215 2269 | 59 36 2270 | 244 104 2271 | 120 54 2272 | 267 19 2273 | 106 9 2274 | 35 15 2275 | 92 36 2276 | 96 47 2277 | 206 36 2278 | 72 8 2279 | 172 35 2280 | 233 27 2281 | 162 9 2282 | 54 27 2283 | 152 15 2284 | 101 20 2285 | 138 110 2286 | 30 16 2287 | 87 65 2288 | 20 14 2289 | 205 54 2290 | 366 101 2291 | 67 45 2292 | 87 54 2293 | 238 70 2294 | 181 10 2295 | 80 63 2296 | 137 8 2297 | 143 102 2298 | 5 1 2299 | 247 82 2300 | 56 39 2301 | 294 33 2302 | 119 20 2303 | 146 104 2304 | 95 31 2305 | 132 43 2306 | 99 88 2307 | 71 38 2308 | 75 35 2309 | 61 12 2310 | 155 75 2311 | 179 65 2312 | 121 67 2313 | 178 10 2314 | 70 4 2315 | 168 12 2316 | 154 35 2317 | 174 38 2318 | 140 82 2319 | 272 90 2320 | 36 3 2321 | 168 155 2322 | 26 25 2323 | 154 82 2324 | 389 78 2325 | 103 85 2326 | 187 6 2327 | 234 23 2328 | 254 82 2329 | 291 36 2330 | 55 7 2331 | 187 119 2332 | 116 23 2333 | 120 82 2334 | 126 104 2335 | 21 4 2336 | 68 33 2337 | 159 138 2338 | 72 36 2339 | 86 45 2340 | 172 7 2341 | 162 45 2342 | 239 41 2343 | 276 37 2344 | 333 20 2345 | 134 79 2346 | 101 8 2347 | 158 65 2348 | 128 20 2349 | 191 27 2350 | 67 9 2351 | 57 35 2352 | 114 20 2353 | 43 16 2354 | 336 38 2355 | 33 26 2356 | 218 22 2357 | 110 24 2358 | 147 14 2359 | 39 36 2360 | 190 80 2361 | 137 36 2362 | 184 9 2363 | 204 116 2364 | 190 35 2365 | 146 61 2366 | 166 56 2367 | 204 203 2368 | 156 102 2369 | 18 3 2370 | 65 36 2371 | 85 41 2372 | 71 10 2373 | 165 65 2374 | 169 6 2375 | 61 16 2376 | 118 35 2377 | 283 26 2378 | 216 39 2379 | 329 328 2380 | 94 72 2381 | 35 11 2382 | 98 23 2383 | 27 17 2384 | 178 95 2385 | 188 4 2386 | 64 26 2387 | 192 79 2388 | 121 95 2389 | 329 170 2390 | 40 19 2391 | 46 9 2392 | 79 67 2393 | 78 19 2394 | 183 33 2395 | 49 5 2396 | 334 38 2397 | 82 71 2398 | 139 20 2399 | 163 154 2400 | 182 106 2401 | 243 104 2402 | 68 5 2403 | 138 87 2404 | 195 154 2405 | 179 37 2406 | 275 274 2407 | 276 57 2408 | 24 18 2409 | 243 134 2410 | 134 43 2411 | 138 38 2412 | 87 9 2413 | 208 174 2414 | 167 6 2415 | 80 7 2416 | 251 110 2417 | 143 94 2418 | 142 98 2419 | 166 36 2420 | 136 23 2421 | 75 26 2422 | 203 33 2423 | 95 87 2424 | 175 79 2425 | 179 8 2426 | 61 52 2427 | 155 51 2428 | 94 36 2429 | 131 58 2430 | 151 39 2431 | 13 2 2432 | 70 61 2433 | 282 37 2434 | 50 9 2435 | 329 70 2436 | 174 94 2437 | 103 12 2438 | 268 39 2439 | 16 8 2440 | 22 18 2441 | 207 18 2442 | 376 22 2443 | 254 27 2444 | 59 27 2445 | 352 15 2446 | 153 82 2447 | 45 36 2448 | 106 18 2449 | 35 18 2450 | 163 41 2451 | 116 79 2452 | 82 43 2453 | 300 118 2454 | 395 394 2455 | 78 7 2456 | 384 40 2457 | 138 75 2458 | 343 22 2459 | 91 57 2460 | 134 23 2461 | 87 45 2462 | 208 138 2463 | 63 4 2464 | 161 4 2465 | 308 221 2466 | 238 26 2467 | 39 31 2468 | 29 5 2469 | 143 13 2470 | 140 139 2471 | 275 125 2472 | 298 38 2473 | 194 119 2474 | 86 73 2475 | 180 6 2476 | 42 35 2477 | 62 38 2478 | 307 189 2479 | 327 70 2480 | 193 38 2481 | 213 43 2482 | 71 61 2483 | 75 6 2484 | 165 25 2485 | 169 94 2486 | 47 37 2487 | 178 148 2488 | 344 212 2489 | 202 30 2490 | 131 22 2491 | 297 290 2492 | 151 75 2493 | 192 24 2494 | 155 140 2495 | 70 25 2496 | 60 7 2497 | 282 57 2498 | 50 45 2499 | 311 182 2500 | 278 37 2501 | 174 122 2502 | 220 204 2503 | 79 59 2504 | 391 143 2505 | 305 74 2506 | 163 116 2507 | 55 34 2508 | 97 83 2509 | 244 105 2510 | 45 8 2511 | 92 37 2512 | 11 9 2513 | 72 9 2514 | 233 26 2515 | 162 6 2516 | 54 24 2517 | 310 182 2518 | 239 20 2519 | 152 16 2520 | 209 33 2521 | 101 19 2522 | 138 111 2523 | 266 56 2524 | 195 82 2525 | 162 121 2526 | 20 15 2527 | 57 6 2528 | 299 65 2529 | 194 185 2530 | 173 20 2531 | 39 3 2532 | 76 4 2533 | 5 0 2534 | 298 26 2535 | 190 4 2536 | 86 85 2537 | 56 40 2538 | 119 23 2539 | 213 94 2540 | 146 105 2541 | 169 152 2542 | 132 20 2543 | 99 91 2544 | 85 20 2545 | 71 33 2546 | 368 40 2547 | 61 11 2548 | 189 54 2549 | 179 64 2550 | 165 61 2551 | 259 56 2552 | 279 37 2553 | 88 6 2554 | 84 50 2555 | 377 40 2556 | 70 5 2557 | 74 72 2558 | 168 13 2559 | 60 43 2560 | 117 54 2561 | 306 167 2562 | 36 12 2563 | 93 45 2564 | 103 84 2565 | 220 208 2566 | 79 31 2567 | 173 38 2568 | 376 78 2569 | 305 118 2570 | 163 16 2571 | 55 6 2572 | 96 93 2573 | 126 105 2574 | 92 9 2575 | 21 3 2576 | 68 34 2577 | 105 35 2578 | 158 55 2579 | 243 173 2580 | 191 26 2581 | 67 8 2582 | 53 37 2583 | 208 82 2584 | 265 237 2585 | 133 46 2586 | 86 6 2587 | 143 69 2588 | 76 40 2589 | 204 117 2590 | 119 74 2591 | 123 15 2592 | 132 121 2593 | 160 98 2594 | 142 54 2595 | 18 0 2596 | 132 8 2597 | 179 47 2598 | 240 15 2599 | 61 47 2600 | 155 86 2601 | 193 159 2602 | 175 27 2603 | 216 40 2604 | 94 73 2605 | 98 20 2606 | 27 16 2607 | 340 73 2608 | 64 27 2609 | 121 94 2610 | 325 172 2611 | 40 20 2612 | 97 54 2613 | 73 61 2614 | 244 50 2615 | 49 4 2616 | 234 8 2617 | 254 79 2618 | 139 23 2619 | 243 107 2620 | 176 16 2621 | 68 6 2622 | 72 65 2623 | 182 26 2624 | 384 77 2625 | 115 37 2626 | 157 137 2627 | 158 19 2628 | 215 70 2629 | 24 19 2630 | 152 72 2631 | 87 8 2632 | 285 37 2633 | 309 175 2634 | 114 57 2635 | 147 45 2636 | 369 77 2637 | 241 11 2638 | 62 11 2639 | 142 99 2640 | 109 20 2641 | 38 16 2642 | 104 16 2643 | 142 18 2644 | 65 7 2645 | 179 11 2646 | 114 92 2647 | 98 73 2648 | 61 51 2649 | 122 67 2650 | 88 79 2651 | 178 64 2652 | 70 50 2653 | 74 49 2654 | 168 54 2655 | 50 6 2656 | 278 30 2657 | 211 105 2658 | 103 15 2659 | 140 27 2660 | 16 9 2661 | 73 72 2662 | 22 19 2663 | 97 74 2664 | 79 38 2665 | 376 23 2666 | 395 175 2667 | 244 143 2668 | 187 65 2669 | 45 35 2670 | 253 192 2671 | 35 21 2672 | 254 107 2673 | 116 72 2674 | 243 71 2675 | 319 314 2676 | 44 3 2677 | 308 22 2678 | 138 72 2679 | 195 121 2680 | 158 15 2681 | 148 33 2682 | 134 20 2683 | 248 20 2684 | 309 18 2685 | 63 7 2686 | 161 27 2687 | 238 27 2688 | 167 37 2689 | 208 26 2690 | 29 4 2691 | 143 12 2692 | 190 105 2693 | 66 11 2694 | 180 7 2695 | 56 13 2696 | 62 39 2697 | 123 55 2698 | 95 74 2699 | 246 34 2700 | 47 36 2701 | 88 43 2702 | 306 94 2703 | 146 5 2704 | 202 31 2705 | 155 143 2706 | 84 31 2707 | 193 67 2708 | 168 18 2709 | 192 136 2710 | 121 22 2711 | 174 8 2712 | 302 61 2713 | 304 74 2714 | 26 3 2715 | 248 143 2716 | 79 58 2717 | 391 142 2718 | 8 3 2719 | 187 109 2720 | 244 106 2721 | 138 133 2722 | 11 8 2723 | 305 299 2724 | 243 35 2725 | 334 142 2726 | 54 25 2727 | 239 23 2728 | 152 17 2729 | 243 82 2730 | 91 4 2731 | 20 8 2732 | 205 52 2733 | 390 142 2734 | 57 5 2735 | 299 64 2736 | 114 65 2737 | 80 49 2738 | 143 96 2739 | 76 5 2740 | 204 82 2741 | 133 90 2742 | 190 5 2743 | 52 46 2744 | 237 22 2745 | 240 86 2746 | 392 43 2747 | 142 91 2748 | 169 159 2749 | 99 90 2750 | 89 80 2751 | 169 40 2752 | 61 10 2753 | 365 354 2754 | 175 6 2755 | 51 12 2756 | 165 60 2757 | 94 82 2758 | 202 51 2759 | 60 36 2760 | 121 50 2761 | 36 13 2762 | 221 23 2763 | 97 41 2764 | 207 36 2765 | 174 151 2766 | 140 35 2767 | 197 30 2768 | 187 24 2769 | 248 26 2770 | 305 117 2771 | 96 94 2772 | 116 17 2773 | 254 163 2774 | 135 126 2775 | 68 35 2776 | 72 38 2777 | 105 34 2778 | 239 43 2779 | 243 172 2780 | 162 154 2781 | 299 31 2782 | 67 11 2783 | 53 36 2784 | 332 221 2785 | 43 18 2786 | 191 106 2787 | 194 154 2788 | 39 38 2789 | 80 29 2790 | 375 78 2791 | 86 7 2792 | 15 9 2793 | 204 118 2794 | 119 69 2795 | 132 122 2796 | 142 55 2797 | 18 1 2798 | 132 9 2799 | 65 58 2800 | 85 55 2801 | 71 4 2802 | 165 79 2803 | 169 4 2804 | 61 46 2805 | 118 33 2806 | 155 41 2807 | 175 26 2808 | 94 78 2809 | 98 21 2810 | 27 19 2811 | 353 100 2812 | 107 94 2813 | 292 36 2814 | 40 21 2815 | 302 117 2816 | 83 6 2817 | 73 60 2818 | 248 54 2819 | 234 9 2820 | 163 15 2821 | 139 22 2822 | 106 79 2823 | 182 104 2824 | 243 106 2825 | 68 7 2826 | 182 27 2827 | 384 78 2828 | 243 27 2829 | 105 30 2830 | 158 16 2831 | 162 79 2832 | 24 20 2833 | 243 136 2834 | 134 41 2835 | 285 36 2836 | 241 15 2837 | 275 99 2838 | 137 70 2839 | 66 36 2840 | 194 17 2841 | 86 35 2842 | 241 10 2843 | 204 154 2844 | 170 6 2845 | 62 8 2846 | 119 41 2847 | 160 16 2848 | 146 31 2849 | 38 17 2850 | 132 94 2851 | 99 5 2852 | 199 38 2853 | 354 77 2854 | 65 6 2855 | 179 10 2856 | 307 65 2857 | 61 50 2858 | 131 60 2859 | 151 33 2860 | 84 4 2861 | 178 65 2862 | 74 62 2863 | 168 55 2864 | 245 55 2865 | 50 7 2866 | 311 172 2867 | 267 266 2868 | 140 20 2869 | 157 64 2870 | 16 10 2871 | 292 175 2872 | 22 16 2873 | 69 27 2874 | 183 7 2875 | 244 23 2876 | 45 34 2877 | 49 39 2878 | 106 16 2879 | 35 20 2880 | 163 43 2881 | 96 6 2882 | 82 41 2883 | 172 106 2884 | 139 50 2885 | 152 135 2886 | 54 50 2887 | 172 71 2888 | 138 73 2889 | 195 120 2890 | 158 12 2891 | 286 65 2892 | 101 78 2893 | 67 50 2894 | 242 20 2895 | 63 6 2896 | 124 16 2897 | 167 36 2898 | 208 27 2899 | 29 3 2900 | 143 15 2901 | 241 54 2902 | 62 36 2903 | 123 54 2904 | 184 178 2905 | 166 70 2906 | 169 162 2907 | 99 33 2908 | 71 63 2909 | 199 10 2910 | 75 56 2911 | 246 35 2912 | 344 39 2913 | 165 7 2914 | 41 9 2915 | 246 82 2916 | 47 39 2917 | 192 26 2918 | 155 142 2919 | 70 31 2920 | 30 17 2921 | 174 9 2922 | 50 43 2923 | 107 38 2924 | 83 81 2925 | 174 120 2926 | 103 50 2927 | 201 62 2928 | 79 5 2929 | 83 62 2930 | 363 101 2931 | 244 107 2932 | 45 6 2933 | 310 106 2934 | 96 34 2935 | 304 31 2936 | 72 11 2937 | 206 90 2938 | 172 30 2939 | 105 69 2940 | 162 4 2941 | 346 345 2942 | 54 30 2943 | 148 87 2944 | 367 77 2945 | 152 18 2946 | 138 109 2947 | 20 9 2948 | 390 143 2949 | 57 4 2950 | 208 104 2951 | 161 38 2952 | 241 240 2953 | 80 50 2954 | 194 38 2955 | 76 6 2956 | 190 10 2957 | 123 101 2958 | 109 74 2959 | 274 33 2960 | 242 87 2961 | 119 17 2962 | 146 103 2963 | 95 24 2964 | 85 18 2965 | 71 35 2966 | 75 36 2967 | 61 9 2968 | 189 52 2969 | 51 15 2970 | 165 59 2971 | 118 117 2972 | 122 120 2973 | 168 96 2974 | 84 60 2975 | 178 9 2976 | 127 126 2977 | 207 87 2978 | 60 37 2979 | 207 182 2980 | 302 94 2981 | 221 22 2982 | 73 7 2983 | 79 25 2984 | 248 27 2985 | 116 18 2986 | 244 79 2987 | 210 43 2988 | 21 1 2989 | 206 7 2990 | 196 121 2991 | 72 39 2992 | 58 6 2993 | 162 40 2994 | 148 107 2995 | 333 17 2996 | 191 4 2997 | 53 35 2998 | 181 30 2999 | 33 31 3000 | 90 88 3001 | 110 31 3002 | 15 8 3003 | 143 71 3004 | 136 126 3005 | 132 10 3006 | 310 82 3007 | 65 57 3008 | 85 54 3009 | 71 7 3010 | 169 11 3011 | 61 45 3012 | 179 94 3013 | 198 142 3014 | 145 18 3015 | 37 4 3016 | 94 79 3017 | 98 18 3018 | 27 18 3019 | 178 90 3020 | 141 38 3021 | 131 80 3022 | 249 23 3023 | 325 170 3024 | 40 22 3025 | 395 106 3026 | 95 30 3027 | 79 76 3028 | 83 9 3029 | 304 118 3030 | 69 38 3031 | 73 35 3032 | 338 73 3033 | 106 61 3034 | 126 56 3035 | 263 27 3036 | 139 9 3037 | 163 159 3038 | 182 105 3039 | 129 19 3040 | 176 18 3041 | 72 67 3042 | 182 24 3043 | 243 26 3044 | 138 82 3045 | 195 159 3046 | 34 3 3047 | 152 74 3048 | 134 46 3049 | 91 79 3050 | 191 56 3051 | 184 40 3052 | 241 9 3053 | 298 208 3054 | 119 40 3055 | 247 23 3056 | 123 45 3057 | 270 90 3058 | 109 18 3059 | 38 22 3060 | 136 26 3061 | 213 20 3062 | 142 16 3063 | 199 33 3064 | 209 56 3065 | 65 5 3066 | 112 24 3067 | 229 53 3068 | 61 49 3069 | 155 52 3070 | 216 6 3071 | 94 43 3072 | 84 5 3073 | 74 63 3074 | 245 54 3075 | 121 120 3076 | 50 4 3077 | 70 67 3078 | 311 175 3079 | 46 40 3080 | 16 11 3081 | 130 31 3082 | 97 80 3083 | 83 37 3084 | 69 26 3085 | 244 16 3086 | 372 77 3087 | 49 38 3088 | 106 17 3089 | 35 23 3090 | 96 7 3091 | 206 204 3092 | 82 38 3093 | 102 45 3094 | 361 101 3095 | 78 10 3096 | 347 39 3097 | 367 40 3098 | 152 55 3099 | 138 118 3100 | 91 58 3101 | 148 35 3102 | 365 40 3103 | 101 77 3104 | 394 175 3105 | 87 46 3106 | 346 100 3107 | 309 16 3108 | 171 19 3109 | 214 151 3110 | 53 27 3111 | 181 86 3112 | 214 6 3113 | 133 100 3114 | 66 9 3115 | 56 15 3116 | 62 37 3117 | 32 8 3118 | 184 179 3119 | 169 50 3120 | 202 138 3121 | 165 6 3122 | 41 8 3123 | 169 67 3124 | 155 16 3125 | 47 38 3126 | 88 45 3127 | 94 7 3128 | 131 27 3129 | 368 358 3130 | 192 27 3131 | 155 129 3132 | 326 170 3133 | 255 16 3134 | 168 20 3135 | 117 95 3136 | 121 20 3137 | 50 40 3138 | 272 114 3139 | 26 1 3140 | 154 122 3141 | 174 121 3142 | 103 45 3143 | 201 61 3144 | 311 32 3145 | 79 4 3146 | 177 4 3147 | 45 5 3148 | 159 13 3149 | 96 35 3150 | 149 39 3151 | 11 10 3152 | 72 12 3153 | 310 26 3154 | 172 31 3155 | 54 31 3156 | 295 291 3157 | 308 19 3158 | 138 106 3159 | 266 39 3160 | 30 20 3161 | 91 6 3162 | 20 10 3163 | 185 62 3164 | 90 69 3165 | 238 53 3166 | 275 45 3167 | 133 55 3168 | 143 98 3169 | 271 89 3170 | 274 143 3171 | 147 103 3172 | 190 11 3173 | 52 40 3174 | 166 16 3175 | 294 37 3176 | 32 20 3177 | 89 37 3178 | 99 92 3179 | 71 34 3180 | 364 40 3181 | 75 39 3182 | 61 8 3183 | 155 79 3184 | 108 37 3185 | 27 9 3186 | 122 121 3187 | 88 9 3188 | 131 119 3189 | 192 103 3190 | 121 71 3191 | 84 61 3192 | 60 38 3193 | 325 70 3194 | 182 143 3195 | 130 84 3196 | 168 159 3197 | 97 47 3198 | 207 38 3199 | 154 94 3200 | 69 65 3201 | 73 6 3202 | 173 35 3203 | 126 29 3204 | 163 21 3205 | 96 80 3206 | 153 15 3207 | 102 26 3208 | 186 65 3209 | 196 122 3210 | 72 40 3211 | 105 32 3212 | 148 116 3213 | 243 174 3214 | 101 52 3215 | 138 14 3216 | 299 17 3217 | 53 34 3218 | 181 29 3219 | 295 37 3220 | 90 89 3221 | 39 32 3222 | 137 40 3223 | 15 11 3224 | 190 39 3225 | 247 50 3226 | 156 98 3227 | 65 56 3228 | 71 6 3229 | 189 87 3230 | 155 43 3231 | 175 36 3232 | 45 20 3233 | 37 3 3234 | 151 31 3235 | 27 21 3236 | 141 37 3237 | 198 30 3238 | 168 93 3239 | 64 30 3240 | 40 23 3241 | 36 35 3242 | 22 10 3243 | 244 142 3244 | 83 8 3245 | 69 37 3246 | 73 34 3247 | 183 61 3248 | 263 26 3249 | 102 6 3250 | 139 8 3251 | 31 14 3252 | 163 158 3253 | 129 18 3254 | 210 159 3255 | 176 19 3256 | 196 94 3257 | 291 290 3258 | 58 27 3259 | 44 26 3260 | 347 75 3261 | 24 22 3262 | 101 40 3263 | 87 5 3264 | 91 78 3265 | 208 162 3266 | 191 59 3267 | 53 6 3268 | 110 73 3269 | 185 118 3270 | 104 98 3271 | 90 61 3272 | 133 15 3273 | 308 27 3274 | 241 8 3275 | 119 43 3276 | 160 18 3277 | 142 102 3278 | 146 29 3279 | 38 23 3280 | 193 94 3281 | 213 19 3282 | 142 17 3283 | 203 37 3284 | 189 10 3285 | 65 4 3286 | 350 39 3287 | 216 7 3288 | 84 6 3289 | 141 73 3290 | 70 49 3291 | 74 60 3292 | 282 33 3293 | 50 5 3294 | 207 105 3295 | 154 103 3296 | 103 8 3297 | 103 47 3298 | 79 35 3299 | 207 30 3300 | 83 36 3301 | 177 31 3302 | 116 36 3303 | 372 78 3304 | 120 31 3305 | 106 30 3306 | 159 40 3307 | 35 22 3308 | 163 45 3309 | 277 61 3310 | 25 12 3311 | 82 39 3312 | 304 117 3313 | 196 35 3314 | 200 38 3315 | 129 126 3316 | 239 143 3317 | 186 121 3318 | 243 72 3319 | 172 52 3320 | 276 106 3321 | 138 119 3322 | 195 122 3323 | 392 82 3324 | 67 52 3325 | 185 33 3326 | 242 18 3327 | 171 18 3328 | 228 65 3329 | 232 4 3330 | 124 18 3331 | 53 26 3332 | 114 88 3333 | 80 72 3334 | 137 23 3335 | 104 94 3336 | 143 9 3337 | 204 41 3338 | 66 6 3339 | 56 16 3340 | 32 9 3341 | 288 99 3342 | 95 38 3343 | 99 35 3344 | 136 55 3345 | 242 110 3346 | 75 58 3347 | 283 41 3348 | 307 95 3349 | 165 5 3350 | 41 15 3351 | 122 98 3352 | 306 93 3353 | 269 39 3354 | 131 26 3355 | 84 26 3356 | 326 171 3357 | 117 94 3358 | 121 27 3359 | 50 41 3360 | 107 24 3361 | 36 20 3362 | 225 53 3363 | 278 57 3364 | 26 14 3365 | 211 6 3366 | 103 44 3367 | 301 9 3368 | 45 4 3369 | 173 79 3370 | 267 22 3371 | 159 12 3372 | 183 154 3373 | 96 36 3374 | 139 80 3375 | 72 13 3376 | 243 36 3377 | 172 24 3378 | 295 290 3379 | 299 167 3380 | 138 107 3381 | 20 11 3382 | 147 136 3383 | 185 61 3384 | 242 54 3385 | 208 106 3386 | 63 36 3387 | 104 43 3388 | 133 54 3389 | 321 318 3390 | 271 88 3391 | 365 77 3392 | 190 8 3393 | 318 221 3394 | 237 19 3395 | 42 3 3396 | 32 21 3397 | 89 36 3398 | 142 94 3399 | 378 10 3400 | 293 99 3401 | 169 45 3402 | 61 7 3403 | 122 23 3404 | 303 62 3405 | 112 33 3406 | 27 8 3407 | 306 65 3408 | 202 62 3409 | 178 7 3410 | 60 39 3411 | 121 55 3412 | 174 43 3413 | 231 14 3414 | 36 8 3415 | 221 20 3416 | 154 95 3417 | 174 154 3418 | 103 80 3419 | 197 27 3420 | 73 5 3421 | 159 83 3422 | 163 20 3423 | 220 67 3424 | 187 138 3425 | 206 154 3426 | 102 27 3427 | 182 131 3428 | 21 15 3429 | 58 4 3430 | 84 41 3431 | 390 79 3432 | 162 38 3433 | 148 117 3434 | 309 38 3435 | 77 10 3436 | 208 199 3437 | 191 6 3438 | 252 16 3439 | 53 33 3440 | 57 38 3441 | 295 36 3442 | 43 23 3443 | 39 35 3444 | 86 26 3445 | 15 10 3446 | 398 390 3447 | 76 36 3448 | 190 36 3449 | 119 70 3450 | 284 57 3451 | 251 54 3452 | 146 54 3453 | 113 41 3454 | 156 99 3455 | 142 58 3456 | 65 63 3457 | 169 9 3458 | 118 36 3459 | 151 30 3460 | 141 36 3461 | 198 31 3462 | 131 82 3463 | 121 98 3464 | 40 24 3465 | 207 82 3466 | 282 125 3467 | 268 56 3468 | 22 11 3469 | 79 78 3470 | 83 11 3471 | 69 36 3472 | 183 60 3473 | 173 6 3474 | 177 67 3475 | 159 55 3476 | 116 112 3477 | 139 11 3478 | 86 16 3479 | 58 24 3480 | 390 43 3481 | 158 23 3482 | 239 72 3483 | 24 23 3484 | 81 26 3485 | 138 35 3486 | 91 65 3487 | 124 15 3488 | 53 5 3489 | 185 117 3490 | 208 50 3491 | 171 70 3492 | 228 61 3493 | 147 49 3494 | 66 35 3495 | 379 40 3496 | 76 72 3497 | 119 42 3498 | 247 17 3499 | 160 19 3500 | 109 16 3501 | 146 26 3502 | 38 20 3503 | 99 6 3504 | 95 82 3505 | 189 9 3506 | 65 27 3507 | 112 26 3508 | 41 18 3509 | 155 54 3510 | 216 8 3511 | 112 105 3512 | 99 20 3513 | 98 52 3514 | 84 7 3515 | 70 54 3516 | 74 61 3517 | 70 65 3518 | 140 23 3519 | 130 29 3520 | 79 34 3521 | 154 151 3522 | 83 39 3523 | 301 36 3524 | 305 33 3525 | 244 18 3526 | 173 106 3527 | 49 36 3528 | 106 31 3529 | 35 25 3530 | 183 177 3531 | 25 19 3532 | 82 36 3533 | 135 50 3534 | 139 55 3535 | 78 8 3536 | 310 175 3537 | 134 121 3538 | 390 23 3539 | 138 116 3540 | 185 183 3541 | 87 40 3542 | 181 35 3543 | 124 19 3544 | 61 6 3545 | 39 26 3546 | 167 33 3547 | 80 73 3548 | 208 30 3549 | 190 130 3550 | 137 22 3551 | 342 73 3552 | 32 10 3553 | 142 67 3554 | 95 33 3555 | 189 188 3556 | 199 7 3557 | 246 38 3558 | 307 94 3559 | 165 4 3560 | 222 79 3561 | 169 65 3562 | 88 47 3563 | 141 27 3564 | 108 82 3565 | 151 70 3566 | 64 40 3567 | 155 131 3568 | 84 27 3569 | 178 96 3570 | 306 45 3571 | 70 18 3572 | 255 18 3573 | 174 12 3574 | 302 65 3575 | 50 38 3576 | 107 27 3577 | 144 47 3578 | 36 21 3579 | 221 15 3580 | 26 15 3581 | 177 169 3582 | 173 61 3583 | 159 15 3584 | 310 105 3585 | 96 37 3586 | 82 8 3587 | 139 83 3588 | 148 82 3589 | 367 78 3590 | 30 26 3591 | 67 19 3592 | 57 9 3593 | 242 55 3594 | 104 44 3595 | 124 55 3596 | 275 47 3597 | 80 53 3598 | 100 56 3599 | 137 50 3600 | 147 105 3601 | 298 7 3602 | 190 9 3603 | 137 131 3604 | 123 102 3605 | 56 45 3606 | 166 22 3607 | 136 69 3608 | 32 22 3609 | 89 43 3610 | 142 95 3611 | 199 90 3612 | 203 31 3613 | 169 131 3614 | 132 17 3615 | 99 94 3616 | 151 132 3617 | 122 20 3618 | 51 16 3619 | 165 56 3620 | 273 143 3621 | 202 63 3622 | 207 69 3623 | 121 69 3624 | 255 54 3625 | 121 54 3626 | 302 93 3627 | 107 7 3628 | 36 9 3629 | 221 19 3630 | 97 45 3631 | 73 4 3632 | 177 38 3633 | 159 82 3634 | 163 23 3635 | 55 29 3636 | 102 24 3637 | 31 20 3638 | 58 5 3639 | 105 38 3640 | 162 39 3641 | 134 65 3642 | 77 9 3643 | 53 32 3644 | 57 37 3645 | 167 24 3646 | 43 22 3647 | 104 8 3648 | 147 20 3649 | 39 34 3650 | 137 46 3651 | 86 27 3652 | 143 64 3653 | 190 37 3654 | 119 65 3655 | 284 58 3656 | 52 14 3657 | 146 55 3658 | 204 193 3659 | 132 102 3660 | 298 138 3661 | 65 62 3662 | 165 75 3663 | 169 8 3664 | 155 45 3665 | 175 38 3666 | 216 45 3667 | 145 23 3668 | 94 50 3669 | 27 23 3670 | 141 35 3671 | 74 6 3672 | 40 25 3673 | 46 19 3674 | 22 8 3675 | 79 73 3676 | 69 35 3677 | 183 63 3678 | 159 54 3679 | 197 143 3680 | 163 51 3681 | 82 65 3682 | 120 116 3683 | 129 16 3684 | 78 45 3685 | 172 82 3686 | 135 94 3687 | 176 21 3688 | 72 70 3689 | 58 25 3690 | 158 20 3691 | 34 30 3692 | 185 154 3693 | 134 45 3694 | 195 17 3695 | 87 7 3696 | 191 37 3697 | 53 4 3698 | 143 55 3699 | 133 13 3700 | 119 37 3701 | 247 16 3702 | 160 20 3703 | 307 167 3704 | 109 15 3705 | 146 27 3706 | 38 21 3707 | 142 23 3708 | 199 34 3709 | 75 16 3710 | 343 100 3711 | 95 93 3712 | 189 8 3713 | 65 26 3714 | 142 134 3715 | 41 17 3716 | 155 9 3717 | 216 9 3718 | 112 106 3719 | 94 46 3720 | 175 171 3721 | 70 55 3722 | 202 119 3723 | 207 107 3724 | 140 16 3725 | 197 65 3726 | 22 20 3727 | 83 38 3728 | 116 38 3729 | 120 33 3730 | 173 105 3731 | 35 24 3732 | 96 26 3733 | 25 18 3734 | 82 37 3735 | 139 54 3736 | 72 19 3737 | 182 72 3738 | 78 9 3739 | 125 114 3740 | 134 126 3741 | 138 117 3742 | 148 46 3743 | 134 9 3744 | 87 43 3745 | 242 16 3746 | 171 20 3747 | 299 91 3748 | 104 49 3749 | 53 24 3750 | 110 107 3751 | 39 21 3752 | 80 74 3753 | 208 31 3754 | 137 21 3755 | 90 31 3756 | 204 43 3757 | 66 4 3758 | 56 18 3759 | 274 57 3760 | 119 9 3761 | 247 244 3762 | 32 11 3763 | 99 37 3764 | 193 56 3765 | 199 6 3766 | 146 142 3767 | 75 60 3768 | 283 43 3769 | 41 13 3770 | 155 21 3771 | 47 35 3772 | 192 30 3773 | 155 130 3774 | 84 36 3775 | 178 97 3776 | 70 19 3777 | 383 40 3778 | 168 23 3779 | 121 25 3780 | 50 39 3781 | 107 26 3782 | 36 22 3783 | 258 56 3784 | 26 12 3785 | 154 121 3786 | 197 37 3787 | 244 192 3788 | 159 121 3789 | 163 122 3790 | 221 208 3791 | 391 26 3792 | 103 65 3793 | 82 9 3794 | 139 82 3795 | 68 52 3796 | 243 38 3797 | 206 94 3798 | 286 22 3799 | 54 18 3800 | 205 94 3801 | 101 29 3802 | 91 27 3803 | 360 40 3804 | 181 6 3805 | 57 8 3806 | 63 38 3807 | 104 45 3808 | 80 54 3809 | 271 90 3810 | 147 104 3811 | 204 79 3812 | 137 130 3813 | 345 39 3814 | 166 23 3815 | 294 88 3816 | 32 23 3817 | 203 30 3818 | 95 4 3819 | 132 18 3820 | 99 65 3821 | 378 8 3822 | 71 31 3823 | 169 19 3824 | 61 5 3825 | 51 19 3826 | 165 39 3827 | 94 87 3828 | 98 10 3829 | 27 10 3830 | 273 142 3831 | 192 122 3832 | 121 68 3833 | 107 105 3834 | 60 33 3835 | 36 10 3836 | 221 18 3837 | 173 143 3838 | 174 152 3839 | 103 82 3840 | 306 304 3841 | 187 31 3842 | 244 36 3843 | 116 30 3844 | 176 66 3845 | 102 25 3846 | 106 84 3847 | 206 11 3848 | 68 40 3849 | 125 73 3850 | 186 63 3851 | 115 79 3852 | 78 65 3853 | 78 4 3854 | 125 58 3855 | 162 36 3856 | 148 119 3857 | 276 44 3858 | 309 36 3859 | 77 8 3860 | 53 47 3861 | 181 26 3862 | 57 36 3863 | 167 27 3864 | 370 101 3865 | 208 72 3866 | 228 27 3867 | 232 94 3868 | 90 36 3869 | 110 35 3870 | 147 23 3871 | 80 18 3872 | 137 45 3873 | 143 67 3874 | 202 154 3875 | 247 15 3876 | 160 9 3877 | 52 15 3878 | 136 98 3879 | 89 6 3880 | 166 130 3881 | 65 61 3882 | 61 41 3883 | 27 22 3884 | 3 1 3885 | 192 70 3886 | 40 26 3887 | 278 116 3888 | 117 20 3889 | 154 14 3890 | 174 69 3891 | 93 11 3892 | 130 55 3893 | 22 9 3894 | 79 72 3895 | 73 39 3896 | 183 62 3897 | 301 79 3898 | 197 142 3899 | 126 60 3900 | 277 38 3901 | 120 117 3902 | 391 98 3903 | 31 11 3904 | 163 131 3905 | 210 154 3906 | 358 354 3907 | 72 71 3908 | 54 43 3909 | 58 38 3910 | 390 41 3911 | 138 94 3912 | 34 31 3913 | 162 72 3914 | 148 11 3915 | 243 143 3916 | 134 34 3917 | 87 6 3918 | 228 168 3919 | 191 36 3920 | 252 54 3921 | 289 36 3922 | 110 63 3923 | 133 12 3924 | 86 36 3925 | 365 19 3926 | 119 36 3927 | 288 90 3928 | 146 24 3929 | 194 143 3930 | 28 20 3931 | 140 87 3932 | 203 38 3933 | 65 25 3934 | 293 57 3935 | 41 16 3936 | 155 8 3937 | 216 10 3938 | 131 35 3939 | 387 77 3940 | 175 170 3941 | 117 71 3942 | 235 4 3943 | 326 221 3944 | 164 8 3945 | 207 106 3946 | 154 98 3947 | 335 20 3948 | 16 15 3949 | 22 21 3950 | 69 6 3951 | 244 136 3952 | 45 29 3953 | 248 87 3954 | 130 19 3955 | 35 27 3956 | 92 88 3957 | 96 27 3958 | 25 17 3959 | 72 20 3960 | 239 136 3961 | 233 39 3962 | 247 72 3963 | 291 37 3964 | 357 78 3965 | 10 8 3966 | 87 42 3967 | 171 23 3968 | 104 50 3969 | 346 19 3970 | 39 20 3971 | 167 35 3972 | 80 75 3973 | 208 16 3974 | 147 79 3975 | 298 33 3976 | 66 5 3977 | 56 19 3978 | 341 73 3979 | 62 41 3980 | 362 78 3981 | 184 183 3982 | 95 35 3983 | 132 63 3984 | 391 41 3985 | 99 36 3986 | 213 52 3987 | 146 143 3988 | 169 54 3989 | 155 103 3990 | 175 104 3991 | 41 12 3992 | 155 20 3993 | 47 34 3994 | 94 11 3995 | 131 31 3996 | 23 21 3997 | 64 42 3998 | 155 133 3999 | 84 37 4000 | 212 82 4001 | 70 16 4002 | 60 30 4003 | 192 142 4004 | 211 154 4005 | 50 36 4006 | 107 29 4007 | 36 23 4008 | 26 13 4009 | 197 36 4010 | 201 33 4011 | 301 6 4012 | 348 39 4013 | 153 55 4014 | 300 194 4015 | 159 9 4016 | 277 94 4017 | 82 6 4018 | 333 208 4019 | 243 41 4020 | 172 27 4021 | 152 23 4022 | 134 91 4023 | 172 170 4024 | 138 22 4025 | 91 26 4026 | 67 21 4027 | 167 118 4028 | 228 96 4029 | 90 65 4030 | 80 55 4031 | 184 117 4032 | 204 72 4033 | 133 68 4034 | 190 15 4035 | 137 129 4036 | 237 16 4037 | 166 20 4038 | 193 106 4039 | 95 7 4040 | 132 19 4041 | 8 1 4042 | 284 246 4043 | 61 4 4044 | 189 79 4045 | 122 18 4046 | 51 18 4047 | 108 33 4048 | 98 11 4049 | 27 13 4050 | 198 54 4051 | 202 61 4052 | 64 54 4053 | 107 104 4054 | 343 39 4055 | 60 34 4056 | 117 63 4057 | 36 11 4058 | 97 35 4059 | 244 182 4060 | 154 90 4061 | 173 142 4062 | 153 98 4063 | 173 31 4064 | 55 31 4065 | 183 74 4066 | 31 22 4067 | 129 10 4068 | 21 12 4069 | 280 57 4070 | 209 154 4071 | 105 36 4072 | 125 57 4073 | 205 65 4074 | 172 142 4075 | 195 55 4076 | 77 7 4077 | 285 90 4078 | 39 12 4079 | 53 46 4080 | 228 4 4081 | 194 148 4082 | 33 18 4083 | 90 37 4084 | 133 23 4085 | 336 173 4086 | 160 155 4087 | 294 285 4088 | 143 134 4089 | 190 43 4090 | 160 10 4091 | 344 343 4092 | 208 94 4093 | 264 56 4094 | 166 131 4095 | 65 60 4096 | 273 79 4097 | 61 40 4098 | 145 21 4099 | 151 27 4100 | 198 18 4101 | 74 4 4102 | 168 65 4103 | 272 47 4104 | 164 21 4105 | 40 27 4106 | 349 15 4107 | 154 15 4108 | 140 110 4109 | 93 10 4110 | 14 8 4111 | 73 38 4112 | 120 7 4113 | 106 38 4114 | 277 37 4115 | 300 138 4116 | 139 12 4117 | 163 130 4118 | 78 51 4119 | 196 90 4120 | 54 40 4121 | 182 29 4122 | 58 39 4123 | 367 19 4124 | 138 95 4125 | 148 20 4126 | 243 142 4127 | 134 35 4128 | 138 46 4129 | 195 19 4130 | 185 9 4131 | 191 39 4132 | 208 53 4133 | 104 102 4134 | 90 57 4135 | 143 49 4136 | 137 72 4137 | 375 40 4138 | 392 26 4139 | 247 18 4140 | 146 25 4141 | 38 11 4142 | 193 82 4143 | 75 18 4144 | 142 132 4145 | 236 39 4146 | 273 43 4147 | 41 23 4148 | 118 7 4149 | 155 11 4150 | 47 9 4151 | 37 35 4152 | 94 44 4153 | 168 61 4154 | 249 54 4155 | 164 9 4156 | 349 19 4157 | 154 99 4158 | 46 45 4159 | 140 18 4160 | 16 0 4161 | 79 47 4162 | 207 26 4163 | 154 146 4164 | 177 19 4165 | 69 5 4166 | 120 35 4167 | 301 178 4168 | 106 26 4169 | 159 20 4170 | 35 26 4171 | 92 89 4172 | 187 183 4173 | 25 16 4174 | 82 35 4175 | 139 40 4176 | 182 78 4177 | 105 83 4178 | 357 77 4179 | 239 105 4180 | 134 15 4181 | 10 9 4182 | 67 56 4183 | 195 15 4184 | 87 37 4185 | 171 22 4186 | 275 20 4187 | 39 23 4188 | 208 17 4189 | 137 27 4190 | 214 27 4191 | 365 101 4192 | 242 240 4193 | 194 79 4194 | 86 65 4195 | 56 20 4196 | 351 39 4197 | 119 11 4198 | 156 55 4199 | 105 41 4200 | 378 101 4201 | 105 12 4202 | 273 23 4203 | 169 70 4204 | 155 23 4205 | 47 45 4206 | 202 6 4207 | 94 8 4208 | 23 20 4209 | 64 43 4210 | 84 38 4211 | 178 31 4212 | 60 31 4213 | 192 143 4214 | 121 31 4215 | 174 19 4216 | 50 37 4217 | 36 16 4218 | 292 122 4219 | 97 6 4220 | 26 10 4221 | 154 71 4222 | 140 54 4223 | 197 35 4224 | 134 31 4225 | 183 97 4226 | 120 63 4227 | 391 20 4228 | 230 4 4229 | 254 142 4230 | 92 61 4231 | 277 93 4232 | 210 208 4233 | 72 49 4234 | 149 147 4235 | 172 20 4236 | 105 79 4237 | 286 20 4238 | 162 30 4239 | 54 16 4240 | 172 171 4241 | 101 27 4242 | 195 90 4243 | 158 82 4244 | 67 20 4245 | 185 65 4246 | 63 32 4247 | 104 47 4248 | 170 166 4249 | 133 50 4250 | 143 105 4251 | 184 118 4252 | 147 106 4253 | 76 60 4254 | 288 20 4255 | 237 15 4256 | 274 27 4257 | 136 72 4258 | 89 40 4259 | 142 34 4260 | 240 140 4261 | 336 17 4262 | 8 2 4263 | 155 66 4264 | 51 21 4265 | 165 37 4266 | 98 8 4267 | 226 53 4268 | 27 12 4269 | 198 55 4270 | 104 82 4271 | 60 35 4272 | 117 62 4273 | 150 20 4274 | 211 38 4275 | 73 9 4276 | 159 95 4277 | 126 6 4278 | 163 24 4279 | 55 30 4280 | 183 69 4281 | 153 18 4282 | 210 37 4283 | 106 82 4284 | 129 9 4285 | 21 11 4286 | 72 45 4287 | 200 98 4288 | 186 61 4289 | 280 58 4290 | 195 169 4291 | 162 34 4292 | 298 27 4293 | 134 68 4294 | 195 54 4295 | 77 6 4296 | 6 2 4297 | 299 20 4298 | 53 45 4299 | 185 93 4300 | 228 5 4301 | 33 17 4302 | 110 33 4303 | 204 30 4304 | 62 23 4305 | 52 9 4306 | 248 86 4307 | 85 79 4308 | 199 59 4309 | 65 51 4310 | 61 39 4311 | 354 19 4312 | 122 55 4313 | 98 44 4314 | 151 26 4315 | 192 41 4316 | 74 5 4317 | 202 94 4318 | 50 26 4319 | 335 79 4320 | 93 9 4321 | 311 246 4322 | 22 15 4323 | 79 74 4324 | 287 121 4325 | 73 37 4326 | 187 61 4327 | 244 58 4328 | 248 61 4329 | 106 39 4330 | 159 51 4331 | 362 77 4332 | 126 34 4333 | 78 36 4334 | 139 15 4335 | 163 133 4336 | 129 21 4337 | 314 27 4338 | 54 41 4339 | 58 36 4340 | 44 23 4341 | 162 70 4342 | 148 21 4343 | 195 18 4344 | 191 38 4345 | 110 82 4346 | 208 54 4347 | 90 6 4348 | 147 53 4349 | 137 79 4350 | 76 68 4351 | 216 77 4352 | 119 38 4353 | 142 107 4354 | 274 99 4355 | 38 8 4356 | 189 148 4357 | 378 78 4358 | 112 30 4359 | 240 35 4360 | 41 22 4361 | 226 10 4362 | 155 10 4363 | 47 8 4364 | 37 34 4365 | 94 45 4366 | 117 69 4367 | 221 39 4368 | 349 18 4369 | 207 116 4370 | 79 46 4371 | 177 18 4372 | 69 4 4373 | 116 33 4374 | 45 27 4375 | 173 102 4376 | 177 99 4377 | 106 27 4378 | 159 23 4379 | 35 29 4380 | 92 90 4381 | 96 29 4382 | 116 80 4383 | 102 39 4384 | 72 22 4385 | 182 79 4386 | 105 82 4387 | 290 36 4388 | 54 53 4389 | 310 163 4390 | 58 56 4391 | 280 114 4392 | 138 112 4393 | 162 106 4394 | 239 104 4395 | 134 12 4396 | 87 36 4397 | 185 36 4398 | 228 78 4399 | 157 126 4400 | 161 19 4401 | 275 23 4402 | 39 22 4403 | 208 18 4404 | 137 26 4405 | 29 28 4406 | 204 38 4407 | 56 21 4408 | 119 10 4409 | 160 51 4410 | 142 71 4411 | 146 122 4412 | 203 119 4413 | 95 45 4414 | 99 38 4415 | 71 52 4416 | 75 49 4417 | 169 52 4418 | 118 96 4419 | 155 22 4420 | 47 44 4421 | 141 23 4422 | 94 9 4423 | 320 70 4424 | 70 22 4425 | 292 20 4426 | 168 26 4427 | 60 24 4428 | 210 106 4429 | 121 30 4430 | 97 5 4431 | 150 9 4432 | 103 43 4433 | 140 55 4434 | 170 138 4435 | 305 65 4436 | 190 73 4437 | 254 143 4438 | 11 0 4439 | 139 87 4440 | 72 50 4441 | 182 43 4442 | 243 43 4443 | 125 19 4444 | 54 17 4445 | 101 26 4446 | 266 33 4447 | 162 142 4448 | 20 16 4449 | 67 23 4450 | 147 143 4451 | 63 35 4452 | 194 142 4453 | 133 49 4454 | 194 33 4455 | 220 70 4456 | 247 36 4457 | 375 19 4458 | 56 49 4459 | 156 20 4460 | 284 65 4461 | 89 47 4462 | 142 35 4463 | 146 94 4464 | 99 66 4465 | 223 53 4466 | 85 27 4467 | 378 23 4468 | 89 88 4469 | 71 24 4470 | 122 16 4471 | 51 20 4472 | 108 35 4473 | 112 38 4474 | 165 36 4475 | 98 9 4476 | 27 15 4477 | 64 8 4478 | 117 61 4479 | 154 41 4480 | 93 36 4481 | 189 187 4482 | 211 41 4483 | 73 8 4484 | 49 23 4485 | 159 94 4486 | 126 7 4487 | 163 27 4488 | 55 25 4489 | 106 83 4490 | 200 20 4491 | 129 8 4492 | 21 10 4493 | 371 77 4494 | 337 173 4495 | 72 46 4496 | 78 68 4497 | 162 35 4498 | 145 144 4499 | 233 79 4500 | 6 3 4501 | 285 88 4502 | 309 82 4503 | 167 20 4504 | 104 12 4505 | 33 16 4506 | 110 38 4507 | 80 21 4508 | 76 33 4509 | 62 20 4510 | 190 41 4511 | 119 93 4512 | 160 12 4513 | 52 10 4514 | 113 44 4515 | 99 17 4516 | 229 27 4517 | 65 50 4518 | 283 103 4519 | 216 130 4520 | 240 56 4521 | 368 77 4522 | 169 12 4523 | 61 38 4524 | 246 98 4525 | 283 20 4526 | 148 106 4527 | 179 167 4528 | 145 11 4529 | 94 54 4530 | 98 45 4531 | 198 16 4532 | 202 95 4533 | 3 2 4534 | 64 20 4535 | 50 27 4536 | 178 36 4537 | 292 44 4538 | 40 29 4539 | 117 17 4540 | 46 23 4541 | 174 72 4542 | 93 8 4543 | 73 36 4544 | 311 102 4545 | 59 9 4546 | 187 60 4547 | 106 36 4548 | 183 168 4549 | 102 56 4550 | 206 106 4551 | 176 9 4552 | 196 68 4553 | 54 46 4554 | 182 19 4555 | 58 37 4556 | 266 22 4557 | 195 132 4558 | 34 26 4559 | 134 33 4560 | 91 68 4561 | 366 78 4562 | 309 182 4563 | 208 55 4564 | 124 123 4565 | 19 1 4566 | 294 20 4567 | 355 6 4568 | 119 33 4569 | 146 23 4570 | 38 9 4571 | 166 82 4572 | 306 189 4573 | 199 30 4574 | 75 20 4575 | 189 4 4576 | 213 142 4577 | 273 41 4578 | 240 36 4579 | 122 72 4580 | 94 18 4581 | 131 36 4582 | 387 78 4583 | 192 54 4584 | 74 38 4585 | 168 63 4586 | 137 7 4587 | 164 11 4588 | 207 119 4589 | 282 90 4590 | 16 2 4591 | 184 65 4592 | 177 17 4593 | 183 31 4594 | 116 34 4595 | 244 31 4596 | 45 26 4597 | 177 98 4598 | 12 4 4599 | 25 22 4600 | 82 33 4601 | 102 36 4602 | 72 23 4603 | 163 160 4604 | 290 37 4605 | 54 10 4606 | 58 57 4607 | 134 13 4608 | 380 19 4609 | 167 79 4610 | 299 95 4611 | 161 18 4612 | 208 19 4613 | 29 27 4614 | 90 27 4615 | 143 23 4616 | 147 80 4617 | 313 312 4618 | 190 22 4619 | 45 39 4620 | 180 8 4621 | 109 94 4622 | 56 22 4623 | 189 183 4624 | 193 60 4625 | 85 6 4626 | 163 36 4627 | 250 54 4628 | 118 97 4629 | 178 138 4630 | 94 14 4631 | 23 22 4632 | 64 45 4633 | 192 18 4634 | 306 38 4635 | 70 23 4636 | 168 27 4637 | 60 25 4638 | 174 17 4639 | 50 35 4640 | 107 30 4641 | 36 18 4642 | 97 4 4643 | 26 8 4644 | 335 6 4645 | 396 394 4646 | 55 52 4647 | 385 40 4648 | 159 10 4649 | 129 35 4650 | 96 58 4651 | 82 5 4652 | 11 3 4653 | 233 119 4654 | 159 155 4655 | 182 40 4656 | 314 208 4657 | 172 22 4658 | 286 26 4659 | 125 18 4660 | 54 22 4661 | 276 20 4662 | 134 94 4663 | 390 244 4664 | 162 143 4665 | 91 31 4666 | 20 17 4667 | 67 22 4668 | 57 12 4669 | 63 34 4670 | 365 78 4671 | 104 17 4672 | 194 62 4673 | 214 37 4674 | 143 107 4675 | 246 106 4676 | 56 50 4677 | 166 11 4678 | 105 44 4679 | 146 95 4680 | 132 30 4681 | 8 4 4682 | 85 26 4683 | 71 27 4684 | 169 23 4685 | 151 131 4686 | 122 17 4687 | 51 23 4688 | 198 154 4689 | 165 35 4690 | 98 6 4691 | 27 14 4692 | 141 58 4693 | 64 9 4694 | 121 72 4695 | 141 139 4696 | 154 54 4697 | 231 4 4698 | 292 152 4699 | 207 47 4700 | 187 19 4701 | 153 103 4702 | 281 90 4703 | 248 35 4704 | 234 26 4705 | 126 4 4706 | 163 26 4707 | 55 24 4708 | 116 26 4709 | 153 16 4710 | 391 122 4711 | 106 80 4712 | 129 15 4713 | 21 9 4714 | 139 114 4715 | 195 171 4716 | 347 100 4717 | 239 50 4718 | 24 1 4719 | 134 58 4720 | 77 4 4721 | 6 0 4722 | 356 77 4723 | 232 51 4724 | 346 39 4725 | 57 40 4726 | 167 23 4727 | 43 13 4728 | 171 80 4729 | 265 27 4730 | 104 13 4731 | 147 27 4732 | 80 22 4733 | 133 20 4734 | 160 158 4735 | 184 20 4736 | 76 34 4737 | 369 40 4738 | 260 56 4739 | 136 102 4740 | 231 26 4741 | 203 62 4742 | 378 40 4743 | 216 131 4744 | 179 57 4745 | 368 78 4746 | 61 37 4747 | 118 62 4748 | 37 12 4749 | 98 42 4750 | 151 20 4751 | 192 43 4752 | 246 146 4753 | 50 24 4754 | 178 37 4755 | 207 146 4756 | 46 20 4757 | 177 155 4758 | 130 51 4759 | 22 13 4760 | 69 46 4761 | 187 63 4762 | 163 54 4763 | 102 57 4764 | 328 70 4765 | 78 54 4766 | 371 40 4767 | 172 79 4768 | 300 20 4769 | 68 8 4770 | 253 20 4771 | 54 47 4772 | 58 34 4773 | 152 35 4774 | 138 90 4775 | 34 27 4776 | 152 82 4777 | 134 38 4778 | 67 65 4779 | 195 20 4780 | 91 71 4781 | 77 40 4782 | 214 131 4783 | 143 141 4784 | 110 80 4785 | 143 50 4786 | 173 9 4787 | 19 0 4788 | 254 43 4789 | 66 61 4790 | 170 15 4791 | 146 20 4792 | 156 60 4793 | 75 23 4794 | 175 80 4795 | 179 21 4796 | 142 139 4797 | 293 37 4798 | 226 8 4799 | 131 39 4800 | 23 13 4801 | 151 56 4802 | 178 118 4803 | 70 40 4804 | 326 70 4805 | 168 32 4806 | 278 20 4807 | 154 110 4808 | 267 261 4809 | 16 3 4810 | 130 23 4811 | 79 40 4812 | 83 45 4813 | 301 30 4814 | 177 16 4815 | 201 154 4816 | 183 30 4817 | 8 0 4818 | 187 91 4819 | 120 38 4820 | 159 17 4821 | 35 31 4822 | 116 82 4823 | 82 30 4824 | 102 37 4825 | 139 45 4826 | 72 24 4827 | 182 77 4828 | 206 71 4829 | 105 80 4830 | 233 43 4831 | 54 11 4832 | 253 98 4833 | 148 68 4834 | 209 67 4835 | 67 61 4836 | 87 38 4837 | 181 45 4838 | 299 94 4839 | 63 9 4840 | 194 168 4841 | 252 86 4842 | 39 16 4843 | 208 20 4844 | 29 26 4845 | 90 24 4846 | 237 151 4847 | 184 93 4848 | 76 27 4849 | 204 32 4850 | 170 80 4851 | 190 23 4852 | 194 74 4853 | 180 9 4854 | 56 23 4855 | 113 26 4856 | 241 45 4857 | 62 45 4858 | 247 243 4859 | 239 5 4860 | 71 54 4861 | 354 102 4862 | 273 20 4863 | 202 5 4864 | 23 17 4865 | 141 102 4866 | 70 20 4867 | 60 26 4868 | 174 22 4869 | 50 32 4870 | 36 19 4871 | 97 27 4872 | 26 9 4873 | 177 163 4874 | 73 18 4875 | 248 8 4876 | 177 60 4877 | 234 39 4878 | 173 72 4879 | 267 15 4880 | 205 33 4881 | 11 2 4882 | 139 73 4883 | 72 52 4884 | 182 41 4885 | 129 83 4886 | 186 36 4887 | 243 45 4888 | 394 105 4889 | 286 27 4890 | 125 17 4891 | 54 23 4892 | 30 28 4893 | 20 18 4894 | 57 19 4895 | 43 32 4896 | 63 45 4897 | 104 18 4898 | 110 8 4899 | 238 61 4900 | 194 63 4901 | 143 106 4902 | 190 51 4903 | 247 38 4904 | 284 44 4905 | 251 35 4906 | 166 8 4907 | 89 45 4908 | 142 33 4909 | 132 31 4910 | 8 5 4911 | 193 31 4912 | 71 26 4913 | 327 172 4914 | 169 22 4915 | 354 10 4916 | 122 30 4917 | 37 23 4918 | 165 34 4919 | 27 1 4920 | 141 57 4921 | 178 62 4922 | 40 35 4923 | 349 39 4924 | 154 55 4925 | 104 69 4926 | 292 153 4927 | 97 39 4928 | 173 138 4929 | 12 8 4930 | 173 27 4931 | 234 27 4932 | 163 29 4933 | 55 27 4934 | 116 27 4935 | 244 80 4936 | 120 94 4937 | 230 39 4938 | 21 8 4939 | 68 21 4940 | 243 9 4941 | 195 170 4942 | 152 119 4943 | 81 55 4944 | 172 138 4945 | 138 54 4946 | 6 1 4947 | 299 9 4948 | 356 78 4949 | 43 12 4950 | 336 18 4951 | 100 75 4952 | 33 22 4953 | 90 33 4954 | 110 36 4955 | 147 26 4956 | 80 23 4957 | 133 19 4958 | 214 70 4959 | 308 15 4960 | 392 20 4961 | 52 20 4962 | 89 9 4963 | 213 79 4964 | 61 36 4965 | 118 63 4966 | 155 35 4967 | 145 9 4968 | 37 11 4969 | 98 43 4970 | 151 23 4971 | 192 44 4972 | 212 39 4973 | 64 22 4974 | 50 25 4975 | 117 31 4976 | 18 8 4977 | 371 101 4978 | 93 6 4979 | 69 45 4980 | 59 11 4981 | 159 60 4982 | 243 116 4983 | 172 72 4984 | 176 11 4985 | 58 35 4986 | 152 36 4987 | 44 18 4988 | 229 26 4989 | 266 20 4990 | 148 16 4991 | 195 23 4992 | 87 29 4993 | 208 154 4994 | 63 20 4995 | 191 35 4996 | 285 58 4997 | 53 14 4998 | 19 3 4999 | 66 58 5000 | 62 54 5001 | 355 8 5002 | 119 35 5003 | 142 110 5004 | 146 21 5005 | 38 15 5006 | 166 80 5007 | 156 94 5008 | 75 22 5009 | 175 83 5010 | 240 38 5011 | 293 36 5012 | 118 27 5013 | 155 15 5014 | 47 21 5015 | 94 16 5016 | 131 38 5017 | 23 12 5018 | 178 119 5019 | 141 65 5020 | 74 36 5021 | 207 192 5022 | 282 88 5023 | 174 106 5024 | 130 20 5025 | 59 23 5026 | 102 75 5027 | 106 6 5028 | 159 16 5029 | 13 0 5030 | 25 20 5031 | 135 43 5032 | 310 55 5033 | 243 80 5034 | 206 68 5035 | 125 12 5036 | 253 55 5037 | 54 8 5038 | 239 4 5039 | 286 79 5040 | 87 33 5041 | 104 55 5042 | 252 87 5043 | 110 109 5044 | 39 19 5045 | 80 64 5046 | 190 133 5047 | 143 17 5048 | 76 20 5049 | 204 33 5050 | 190 20 5051 | 375 8 5052 | 180 10 5053 | 237 39 5054 | 42 23 5055 | 104 36 5056 | 119 7 5057 | 142 74 5058 | 95 46 5059 | 132 36 5060 | 14 0 5061 | 146 136 5062 | 155 122 5063 | 47 41 5064 | 88 54 5065 | 141 20 5066 | 17 14 5067 | 23 16 5068 | 151 95 5069 | 64 47 5070 | 192 20 5071 | 84 34 5072 | 178 27 5073 | 70 21 5074 | 198 94 5075 | 60 27 5076 | 117 38 5077 | 121 35 5078 | 50 33 5079 | 26 22 5080 | 154 67 5081 | 103 36 5082 | 187 9 5083 | 79 15 5084 | 173 54 5085 | 55 54 5086 | 173 71 5087 | 103 64 5088 | 92 57 5089 | 186 178 5090 | 334 106 5091 | 11 5 5092 | 72 53 5093 | 68 65 5094 | 162 26 5095 | 54 20 5096 | 101 7 5097 | 195 94 5098 | 20 19 5099 | 247 80 5100 | 67 24 5101 | 208 98 5102 | 336 55 5103 | 104 19 5104 | 110 9 5105 | 76 56 5106 | 204 69 5107 | 137 132 5108 | 166 9 5109 | 227 13 5110 | 156 23 5111 | 284 92 5112 | 160 82 5113 | 89 44 5114 | 142 38 5115 | 203 20 5116 | 132 24 5117 | 8 6 5118 | 65 43 5119 | 193 30 5120 | 216 169 5121 | 71 21 5122 | 165 80 5123 | 189 74 5124 | 374 78 5125 | 122 31 5126 | 37 22 5127 | 240 110 5128 | 279 57 5129 | 88 18 5130 | 131 126 5131 | 178 63 5132 | 40 36 5133 | 395 105 5134 | 359 77 5135 | 12 9 5136 | 305 17 5137 | 49 20 5138 | 126 10 5139 | 55 26 5140 | 183 65 5141 | 102 19 5142 | 31 29 5143 | 371 78 5144 | 334 70 5145 | 68 22 5146 | 196 99 5147 | 182 10 5148 | 78 5 5149 | 195 173 5150 | 310 18 5151 | 138 55 5152 | 138 134 5153 | 242 82 5154 | 43 15 5155 | 171 82 5156 | 284 275 5157 | 357 355 5158 | 124 82 5159 | 110 37 5160 | 142 140 5161 | 80 8 5162 | 133 18 5163 | 86 18 5164 | 241 27 5165 | 62 27 5166 | 160 15 5167 | 109 36 5168 | 113 33 5169 | 99 18 5170 | 136 104 5171 | 146 65 5172 | 65 55 5173 | 236 56 5174 | 61 35 5175 | 155 34 5176 | 179 168 5177 | 94 53 5178 | 151 22 5179 | 192 45 5180 | 141 92 5181 | 64 23 5182 | 121 106 5183 | 50 22 5184 | 178 35 5185 | 272 36 5186 | 117 30 5187 | 46 26 5188 | 174 79 5189 | 140 107 5190 | 93 5 5191 | 22 3 5192 | 301 56 5193 | 305 61 5194 | 59 10 5195 | 173 126 5196 | 106 35 5197 | 126 38 5198 | 163 56 5199 | 82 56 5200 | 182 103 5201 | 78 52 5202 | 176 12 5203 | 253 18 5204 | 54 45 5205 | 182 22 5206 | 152 37 5207 | 176 155 5208 | 158 31 5209 | 34 25 5210 | 91 40 5211 | 111 37 5212 | 148 17 5213 | 333 43 5214 | 195 22 5215 | 366 77 5216 | 63 23 5217 | 285 57 5218 | 161 11 5219 | 53 13 5220 | 110 86 5221 | 19 2 5222 | 398 106 5223 | 119 34 5224 | 199 138 5225 | 146 18 5226 | 132 65 5227 | 156 95 5228 | 75 9 5229 | 179 23 5230 | 307 74 5231 | 145 91 5232 | 47 20 5233 | 94 17 5234 | 131 41 5235 | 23 15 5236 | 141 64 5237 | 117 65 5238 | 130 98 5239 | 207 112 5240 | 154 108 5241 | 282 89 5242 | 140 15 5243 | 16 5 5244 | 130 21 5245 | 83 47 5246 | 55 45 5247 | 59 22 5248 | 244 26 5249 | 45 23 5250 | 102 72 5251 | 106 7 5252 | 159 19 5253 | 139 47 5254 | 196 20 5255 | 243 83 5256 | 93 65 5257 | 233 41 5258 | 54 9 5259 | 314 170 5260 | 111 57 5261 | 191 70 5262 | 238 39 5263 | 39 18 5264 | 80 65 5265 | 104 71 5266 | 143 16 5267 | 204 34 5268 | 190 21 5269 | 123 82 5270 | 180 11 5271 | 119 6 5272 | 156 12 5273 | 32 2 5274 | 160 55 5275 | 169 56 5276 | 155 125 5277 | 364 77 5278 | 122 107 5279 | 141 19 5280 | 94 13 5281 | 23 19 5282 | 151 94 5283 | 186 154 5284 | 60 20 5285 | 121 34 5286 | 174 20 5287 | 36 29 5288 | 292 103 5289 | 26 23 5290 | 154 64 5291 | 211 17 5292 | 244 207 5293 | 59 50 5294 | 92 58 5295 | 96 61 5296 | 206 54 5297 | 262 260 5298 | 11 4 5299 | 139 75 5300 | 68 51 5301 | 72 54 5302 | 310 16 5303 | 105 50 5304 | 125 47 5305 | 162 27 5306 | 54 21 5307 | 239 27 5308 | 101 6 5309 | 91 16 5310 | 299 47 5311 | 67 27 5312 | 43 34 5313 | 194 138 5314 | 80 45 5315 | 194 61 5316 | 143 116 5317 | 119 117 5318 | 52 50 5319 | 109 63 5320 | 274 20 5321 | 156 16 5322 | 18 17 5323 | 365 358 5324 | 378 19 5325 | 71 20 5326 | 169 20 5327 | 316 221 5328 | 354 8 5329 | 145 35 5330 | 118 64 5331 | 141 55 5332 | 235 53 5333 | 272 57 5334 | 40 37 5335 | 60 56 5336 | 201 118 5337 | 97 37 5338 | 12 10 5339 | 244 35 5340 | 248 38 5341 | 55 21 5342 | 183 64 5343 | 187 133 5344 | 244 82 5345 | 31 28 5346 | 182 152 5347 | 129 12 5348 | 206 18 5349 | 334 71 5350 | 195 172 5351 | 256 56 5352 | 276 43 5353 | 333 6 5354 | 191 9 5355 | 53 40 5356 | 57 45 5357 | 185 96 5358 | 336 20 5359 | 393 83 5360 | 33 20 5361 | 275 83 5362 | 204 27 5363 | 80 9 5364 | 133 17 5365 | 184 23 5366 | 167 96 5367 | 170 22 5368 | 190 45 5369 | 109 35 5370 | 136 105 5371 | 99 98 5372 | 65 54 5373 | 179 58 5374 | 61 34 5375 | 118 61 5376 | 88 64 5377 | 37 9 5378 | 296 141 5379 | 98 41 5380 | 141 91 5381 | 198 20 5382 | 50 23 5383 | 325 159 5384 | 272 37 5385 | 154 9 5386 | 46 27 5387 | 80 25 5388 | 130 14 5389 | 97 65 5390 | 69 43 5391 | 73 40 5392 | 311 98 5393 | 126 39 5394 | 349 348 5395 | 163 136 5396 | 78 53 5397 | 253 17 5398 | 54 34 5399 | 182 23 5400 | 152 38 5401 | 280 27 5402 | 34 22 5403 | 162 67 5404 | 111 36 5405 | 148 18 5406 | 205 31 5407 | 134 37 5408 | 87 31 5409 | 91 88 5410 | 313 70 5411 | 299 119 5412 | 63 22 5413 | 191 45 5414 | 53 12 5415 | 110 87 5416 | 19 5 5417 | 147 56 5418 | 45 43 5419 | 241 6 5420 | 204 142 5421 | 298 199 5422 | 119 61 5423 | 160 44 5424 | 142 31 5425 | 199 26 5426 | 75 8 5427 | 95 69 5428 | 65 18 5429 | 213 138 5430 | 165 23 5431 | 226 7 5432 | 47 23 5433 | 390 292 5434 | 94 22 5435 | 131 40 5436 | 188 79 5437 | 151 53 5438 | 84 8 5439 | 168 35 5440 | 117 64 5441 | 107 54 5442 | 83 65 5443 | 16 6 5444 | 130 18 5445 | 79 53 5446 | 301 27 5447 | 177 21 5448 | 163 70 5449 | 55 44 5450 | 183 27 5451 | 244 27 5452 | 45 22 5453 | 159 18 5454 | 126 67 5455 | 75 19 5456 | 82 29 5457 | 25 15 5458 | 72 27 5459 | 149 121 5460 | 152 147 5461 | 172 65 5462 | 91 55 5463 | 67 62 5464 | 87 35 5465 | 205 148 5466 | 208 120 5467 | 191 65 5468 | 194 167 5469 | 39 13 5470 | 242 155 5471 | 80 66 5472 | 137 29 5473 | 29 23 5474 | 285 141 5475 | 143 19 5476 | 184 96 5477 | 76 22 5478 | 190 26 5479 | 56 26 5480 | 136 82 5481 | 142 72 5482 | 146 119 5483 | 132 38 5484 | 99 45 5485 | 14 6 5486 | 354 101 5487 | 364 78 5488 | 165 11 5489 | 169 72 5490 | 47 43 5491 | 340 39 5492 | 141 18 5493 | 23 18 5494 | 64 33 5495 | 155 154 5496 | 141 99 5497 | 70 11 5498 | 60 21 5499 | 117 36 5500 | 121 33 5501 | 107 18 5502 | 26 20 5503 | 103 38 5504 | 73 23 5505 | 79 9 5506 | 173 52 5507 | 96 79 5508 | 96 62 5509 | 206 55 5510 | 11 7 5511 | 68 60 5512 | 361 78 5513 | 324 70 5514 | 72 55 5515 | 129 80 5516 | 186 35 5517 | 280 36 5518 | 105 49 5519 | 215 172 5520 | 239 26 5521 | 134 82 5522 | 138 17 5523 | 87 86 5524 | 91 19 5525 | 191 20 5526 | 67 26 5527 | 285 79 5528 | 171 104 5529 | 63 46 5530 | 110 15 5531 | 80 46 5532 | 133 60 5533 | 143 119 5534 | 190 54 5535 | 52 51 5536 | 56 54 5537 | 166 15 5538 | 156 17 5539 | 341 27 5540 | 142 36 5541 | 169 138 5542 | 99 73 5543 | 65 41 5544 | 85 38 5545 | 71 23 5546 | 211 72 5547 | 169 27 5548 | 51 27 5549 | 145 34 5550 | 165 47 5551 | 118 65 5552 | 88 20 5553 | 141 54 5554 | 178 61 5555 | 272 58 5556 | 40 38 5557 | 140 65 5558 | 93 63 5559 | 168 138 5560 | 97 36 5561 | 375 101 5562 | 69 54 5563 | 311 25 5564 | 173 24 5565 | 159 69 5566 | 126 8 5567 | 163 30 5568 | 55 20 5569 | 315 312 5570 | 172 103 5571 | 182 8 5572 | 105 45 5573 | 172 133 5574 | 6 4 5575 | 318 314 5576 | 138 132 5577 | 181 98 5578 | 147 31 5579 | 204 20 5580 | 242 163 5581 | 80 10 5582 | 133 16 5583 | 9 2 5584 | 194 30 5585 | 160 146 5586 | 170 23 5587 | 189 138 5588 | 136 106 5589 | 28 8 5590 | 156 117 5591 | 65 53 5592 | 179 61 5593 | 155 36 5594 | 175 41 5595 | 37 8 5596 | 98 38 5597 | 377 101 5598 | 141 90 5599 | 249 35 5600 | 50 20 5601 | 292 41 5602 | 189 168 5603 | 46 24 5604 | 201 17 5605 | 130 15 5606 | 22 1 5607 | 207 15 5608 | 73 47 5609 | 183 54 5610 | 187 51 5611 | 281 58 5612 | 177 121 5613 | 106 33 5614 | 183 167 5615 | 82 54 5616 | 139 5 5617 | 125 101 5618 | 253 16 5619 | 54 35 5620 | 182 20 5621 | 138 70 5622 | 34 23 5623 | 148 19 5624 | 205 30 5625 | 333 41 5626 | 134 26 5627 | 138 41 5628 | 87 30 5629 | 63 17 5630 | 53 11 5631 | 19 4 5632 | 62 53 5633 | 216 78 5634 | 119 60 5635 | 109 6 5636 | 203 65 5637 | 95 55 5638 | 75 11 5639 | 95 68 5640 | 189 31 5641 | 51 34 5642 | 273 44 5643 | 112 20 5644 | 165 22 5645 | 118 30 5646 | 47 22 5647 | 269 56 5648 | 112 99 5649 | 94 23 5650 | 23 9 5651 | 84 9 5652 | 306 63 5653 | 74 35 5654 | 168 36 5655 | 117 79 5656 | 107 41 5657 | 311 163 5658 | 154 106 5659 | 174 105 5660 | 16 7 5661 | 221 82 5662 | 79 52 5663 | 177 20 5664 | 55 47 5665 | 221 195 5666 | 59 40 5667 | 187 95 5668 | 45 21 5669 | 102 78 5670 | 234 94 5671 | 35 3 5672 | 116 94 5673 | 82 26 5674 | 1 0 5675 | 78 22 5676 | 105 84 5677 | 54 15 5678 | 363 40 5679 | 134 119 5680 | 262 56 5681 | 138 122 5682 | 266 55 5683 | 162 100 5684 | 91 54 5685 | 148 55 5686 | 67 33 5687 | 87 34 5688 | 380 40 5689 | 167 74 5690 | 171 15 5691 | 104 58 5692 | 161 21 5693 | 308 172 5694 | 114 79 5695 | 80 67 5696 | 29 22 5697 | 214 18 5698 | 143 18 5699 | 76 23 5700 | 298 41 5701 | 190 27 5702 | 56 27 5703 | 113 30 5704 | 42 18 5705 | 32 4 5706 | 142 73 5707 | 95 43 5708 | 193 55 5709 | 14 7 5710 | 71 50 5711 | 75 55 5712 | 189 35 5713 | 198 163 5714 | 165 10 5715 | 169 79 5716 | 88 57 5717 | 273 153 5718 | 64 34 5719 | 84 45 5720 | 70 8 5721 | 60 22 5722 | 140 94 5723 | 26 21 5724 | 140 45 5725 | 73 22 5726 | 55 51 5727 | 96 64 5728 | 59 52 5729 | 301 143 5730 | 96 63 5731 | 11 6 5732 | 361 77 5733 | 72 56 5734 | 182 45 5735 | 314 221 5736 | 333 143 5737 | 280 37 5738 | 172 19 5739 | 195 67 5740 | 91 18 5741 | 299 33 5742 | 191 23 5743 | 57 23 5744 | 43 36 5745 | 104 22 5746 | 33 14 5747 | 90 73 5748 | 275 57 5749 | 80 47 5750 | 137 56 5751 | 76 59 5752 | 56 55 5753 | 132 116 5754 | 227 14 5755 | 156 18 5756 | 341 26 5757 | 132 27 5758 | 65 40 5759 | 213 208 5760 | 71 22 5761 | 354 6 5762 | 155 91 5763 | 374 77 5764 | 175 20 5765 | 331 314 5766 | 279 58 5767 | 27 5 5768 | 212 15 5769 | 141 53 5770 | 84 65 5771 | 40 39 5772 | 121 60 5773 | 144 5 5774 | 93 62 5775 | 130 40 5776 | 103 69 5777 | 69 53 5778 | 183 45 5779 | 153 106 5780 | 49 9 5781 | 126 9 5782 | 55 23 5783 | 102 22 5784 | 31 30 5785 | 200 26 5786 | 266 237 5787 | 182 9 5788 | 195 174 5789 | 162 61 5790 | 134 63 5791 | 195 63 5792 | 6 5 5793 | 319 70 5794 | 336 22 5795 | 90 45 5796 | 80 11 5797 | 194 31 5798 | 170 20 5799 | 52 16 5800 | 109 33 5801 | 146 45 5802 | 113 38 5803 | 99 23 5804 | 136 107 5805 | 28 9 5806 | 41 35 5807 | 61 32 5808 | 155 39 5809 | 141 89 5810 | 397 175 5811 | 40 3 5812 | 174 82 5813 | 197 83 5814 | 130 12 5815 | 22 6 5816 | 69 41 5817 | 96 8 5818 | 349 346 5819 | 277 45 5820 | 82 55 5821 | 102 50 5822 | 139 4 5823 | 7 5 5824 | 176 15 5825 | 182 21 5826 | 58 47 5827 | 334 208 5828 | 390 38 5829 | 138 71 5830 | 195 138 5831 | 34 20 5832 | 91 45 5833 | 152 87 5834 | 195 27 5835 | 87 25 5836 | 309 15 5837 | 63 16 5838 | 161 8 5839 | 53 10 5840 | 110 85 5841 | 167 54 5842 | 249 80 5843 | 19 7 5844 | 66 54 5845 | 86 61 5846 | 398 105 5847 | 121 24 5848 | 133 132 5849 | 146 17 5850 | 38 3 5851 | 199 20 5852 | 189 30 5853 | 307 79 5854 | 165 21 5855 | 118 31 5856 | 246 64 5857 | 122 82 5858 | 94 20 5859 | 23 8 5860 | 84 10 5861 | 141 125 5862 | 70 45 5863 | 325 20 5864 | 189 186 5865 | 278 41 5866 | 154 107 5867 | 231 75 5868 | 130 16 5869 | 79 55 5870 | 177 11 5871 | 287 90 5872 | 187 94 5873 | 120 43 5874 | 102 79 5875 | 183 138 5876 | 96 20 5877 | 149 22 5878 | 277 65 5879 | 116 95 5880 | 82 27 5881 | 200 82 5882 | 182 70 5883 | 78 23 5884 | 206 72 5885 | 148 65 5886 | 91 9 5887 | 134 7 5888 | 158 137 5889 | 87 61 5890 | 336 79 5891 | 161 20 5892 | 248 41 5893 | 39 15 5894 | 29 21 5895 | 214 19 5896 | 275 141 5897 | 66 26 5898 | 153 23 5899 | 136 84 5900 | 355 40 5901 | 156 15 5902 | 32 5 5903 | 132 32 5904 | 99 47 5905 | 136 35 5906 | 14 4 5907 | 71 45 5908 | 169 61 5909 | 283 37 5910 | 271 270 5911 | 165 9 5912 | 88 58 5913 | 141 16 5914 | 17 2 5915 | 383 77 5916 | 131 6 5917 | 64 35 5918 | 192 104 5919 | 144 139 5920 | 198 82 5921 | 60 23 5922 | 278 90 5923 | 207 160 5924 | 174 27 5925 | 107 20 5926 | 36 24 5927 | 292 98 5928 | 130 69 5929 | 26 18 5930 | 174 138 5931 | 73 21 5932 | 93 74 5933 | 311 55 5934 | 177 55 5935 | 159 99 5936 | 96 65 5937 | 206 138 5938 | 315 314 5939 | 310 23 5940 | 186 33 5941 | 105 55 5942 | 162 22 5943 | 209 17 5944 | 138 31 5945 | 87 80 5946 | 91 21 5947 | 63 40 5948 | 104 23 5949 | 157 51 5950 | 147 5 5951 | 80 32 5952 | 133 58 5953 | 133 75 5954 | 119 118 5955 | 156 19 5956 | 284 88 5957 | 65 47 5958 | 179 35 5959 | 71 17 5960 | 61 27 5961 | 354 7 5962 | 175 23 5963 | 51 29 5964 | 37 18 5965 | 94 93 5966 | 151 14 5967 | 27 4 5968 | 178 168 5969 | 192 116 5970 | 121 82 5971 | 292 55 5972 | 60 59 5973 | 353 39 5974 | 207 132 5975 | 174 55 5976 | 93 61 5977 | 97 58 5978 | 12 5 5979 | 153 105 5980 | 173 22 5981 | 339 338 5982 | 234 4 5983 | 55 22 5984 | 153 26 5985 | 82 80 5986 | 102 23 5987 | 139 27 5988 | 21 19 5989 | 206 17 5990 | 361 40 5991 | 58 8 5992 | 243 12 5993 | 105 19 5994 | 148 121 5995 | 84 80 5996 | -------------------------------------------------------------------------------- /graph/karate-mirrored.edgelist: -------------------------------------------------------------------------------- 1 | 24 30 2 | 1 3 3 | 2 18 4 | 9 34 5 | 2 8 6 | 25 28 7 | 21 34 8 | 23 34 9 | 28 34 10 | 25 32 11 | 2 22 12 | 1 6 13 | 24 33 14 | 6 17 15 | 1 11 16 | 1 20 17 | 7 17 18 | 1 2 19 | 3 8 20 | 30 33 21 | 3 29 22 | 6 7 23 | 9 33 24 | 21 33 25 | 26 32 26 | 3 10 27 | 4 8 28 | 1 14 29 | 19 34 30 | 4 13 31 | 1 5 32 | 29 34 33 | 3 14 34 | 20 34 35 | 1 32 36 | 10 34 37 | 32 34 38 | 24 34 39 | 32 33 40 | 30 34 41 | 15 34 42 | 5 11 43 | 2 31 44 | 1 13 45 | 3 33 46 | 6 11 47 | 2 20 48 | 1 4 49 | 4 14 50 | 16 33 51 | 3 9 52 | 2 3 53 | 1 9 54 | 31 34 55 | 2 14 56 | 24 28 57 | 33 34 58 | 19 33 59 | 14 34 60 | 1 22 61 | 1 12 62 | 25 26 63 | 5 7 64 | 16 34 65 | 29 32 66 | 15 33 67 | 1 18 68 | 1 8 69 | 27 30 70 | 1 7 71 | 3 28 72 | 27 34 73 | 31 33 74 | 3 4 75 | 2 4 76 | 24 26 77 | 23 33 78 | 36 42 79 | 46 42 80 | 37 41 81 | 38 43 82 | 60 42 83 | 64 51 84 | 66 42 85 | 38 41 86 | 47 42 87 | 37 59 88 | 37 40 89 | 56 48 90 | 35 51 91 | 37 49 92 | 44 48 93 | 37 60 94 | 38 58 95 | 48 51 96 | 59 43 97 | 38 51 98 | 68 36 99 | 63 53 100 | 37 48 101 | 39 65 102 | 44 45 103 | 50 53 104 | 37 39 105 | 61 42 106 | 46 51 107 | 64 42 108 | 59 62 109 | 39 49 110 | 38 59 111 | 51 42 112 | 54 42 113 | 35 36 114 | 37 67 115 | 37 43 116 | 37 62 117 | 57 48 118 | 37 63 119 | 66 51 120 | 39 54 121 | 61 51 122 | 37 38 123 | 38 60 124 | 58 42 125 | 44 57 126 | 38 45 127 | 55 52 128 | 39 60 129 | 35 57 130 | 38 56 131 | 39 59 132 | 65 42 133 | 39 43 134 | 37 55 135 | 45 42 136 | 63 55 137 | 50 55 138 | 41 42 139 | 68 42 140 | 48 42 141 | 36 51 142 | 39 40 143 | 35 42 144 | 35 45 145 | 37 50 146 | 56 42 147 | 47 51 148 | 65 51 149 | 39 38 150 | 37 54 151 | 41 51 152 | 59 60 153 | 50 52 154 | 37 53 155 | 37 1 156 | -------------------------------------------------------------------------------- /graph/labels-brazil-airports.txt: -------------------------------------------------------------------------------- 1 | node label 2 | 0 0 3 | 1 0 4 | 2 0 5 | 3 0 6 | 4 0 7 | 5 0 8 | 6 0 9 | 7 0 10 | 8 1 11 | 9 0 12 | 10 0 13 | 11 3 14 | 12 3 15 | 13 2 16 | 14 3 17 | 15 0 18 | 16 3 19 | 17 3 20 | 18 1 21 | 19 1 22 | 20 3 23 | 21 0 24 | 22 1 25 | 23 1 26 | 24 0 27 | 25 0 28 | 26 1 29 | 27 0 30 | 28 0 31 | 29 1 32 | 30 0 33 | 31 0 34 | 32 2 35 | 33 1 36 | 34 3 37 | 35 3 38 | 36 0 39 | 37 2 40 | 38 1 41 | 39 1 42 | 40 1 43 | 41 0 44 | 42 1 45 | 43 2 46 | 44 3 47 | 45 1 48 | 46 2 49 | 47 2 50 | 48 1 51 | 49 1 52 | 50 0 53 | 51 0 54 | 52 1 55 | 53 0 56 | 54 1 57 | 55 2 58 | 56 2 59 | 57 2 60 | 58 0 61 | 59 2 62 | 60 1 63 | 61 0 64 | 62 2 65 | 63 1 66 | 64 0 67 | 65 1 68 | 66 0 69 | 67 3 70 | 68 3 71 | 69 0 72 | 70 1 73 | 71 0 74 | 72 3 75 | 73 3 76 | 74 0 77 | 75 1 78 | 76 2 79 | 77 0 80 | 78 2 81 | 79 0 82 | 80 1 83 | 81 2 84 | 82 1 85 | 83 2 86 | 84 1 87 | 85 2 88 | 86 2 89 | 87 1 90 | 88 3 91 | 89 2 92 | 90 2 93 | 91 2 94 | 92 2 95 | 93 1 96 | 94 1 97 | 95 3 98 | 96 1 99 | 97 1 100 | 98 1 101 | 99 2 102 | 100 2 103 | 101 2 104 | 102 2 105 | 103 2 106 | 104 3 107 | 105 3 108 | 106 2 109 | 107 3 110 | 108 3 111 | 109 3 112 | 110 3 113 | 111 3 114 | 112 3 115 | 113 2 116 | 114 3 117 | 115 3 118 | 116 3 119 | 117 3 120 | 118 3 121 | 119 2 122 | 120 3 123 | 121 3 124 | 122 3 125 | 123 2 126 | 124 3 127 | 125 2 128 | 126 3 129 | 127 1 130 | 128 3 131 | 129 3 132 | 130 2 133 | -------------------------------------------------------------------------------- /graph/labels-europe-airports.txt: -------------------------------------------------------------------------------- 1 | node label 2 | 0 1 3 | 1 1 4 | 2 2 5 | 3 1 6 | 4 0 7 | 5 0 8 | 6 0 9 | 7 0 10 | 8 0 11 | 9 0 12 | 10 0 13 | 11 0 14 | 12 0 15 | 13 1 16 | 14 0 17 | 15 0 18 | 16 0 19 | 17 1 20 | 18 0 21 | 19 0 22 | 20 0 23 | 21 0 24 | 22 0 25 | 23 0 26 | 24 1 27 | 25 1 28 | 26 0 29 | 27 0 30 | 28 3 31 | 29 0 32 | 30 1 33 | 31 0 34 | 32 1 35 | 33 0 36 | 34 0 37 | 35 0 38 | 36 0 39 | 37 0 40 | 38 0 41 | 39 0 42 | 40 0 43 | 41 0 44 | 42 3 45 | 43 0 46 | 44 0 47 | 45 0 48 | 46 1 49 | 47 0 50 | 48 3 51 | 49 1 52 | 50 0 53 | 51 0 54 | 52 1 55 | 53 0 56 | 54 0 57 | 55 0 58 | 56 0 59 | 57 0 60 | 58 0 61 | 59 1 62 | 60 0 63 | 61 0 64 | 62 0 65 | 63 0 66 | 64 0 67 | 65 0 68 | 66 0 69 | 67 0 70 | 68 1 71 | 69 1 72 | 70 0 73 | 71 0 74 | 72 0 75 | 73 0 76 | 74 0 77 | 75 0 78 | 76 1 79 | 77 0 80 | 78 0 81 | 79 0 82 | 80 0 83 | 81 2 84 | 82 0 85 | 83 0 86 | 84 1 87 | 85 2 88 | 86 0 89 | 87 0 90 | 88 0 91 | 89 0 92 | 90 0 93 | 91 1 94 | 92 1 95 | 93 0 96 | 94 0 97 | 95 1 98 | 96 0 99 | 97 0 100 | 98 1 101 | 99 0 102 | 100 0 103 | 101 0 104 | 102 1 105 | 103 0 106 | 104 0 107 | 105 0 108 | 106 0 109 | 107 2 110 | 108 3 111 | 109 3 112 | 110 1 113 | 111 2 114 | 112 3 115 | 113 2 116 | 114 1 117 | 115 3 118 | 116 2 119 | 117 1 120 | 118 1 121 | 119 0 122 | 120 1 123 | 121 1 124 | 122 2 125 | 123 3 126 | 124 3 127 | 125 1 128 | 126 3 129 | 127 3 130 | 128 3 131 | 129 1 132 | 130 1 133 | 131 1 134 | 132 1 135 | 133 1 136 | 134 1 137 | 135 2 138 | 136 1 139 | 137 2 140 | 138 1 141 | 139 0 142 | 140 1 143 | 141 0 144 | 142 0 145 | 143 0 146 | 144 2 147 | 145 3 148 | 146 0 149 | 147 1 150 | 148 2 151 | 149 2 152 | 150 3 153 | 151 1 154 | 152 2 155 | 153 1 156 | 154 1 157 | 155 0 158 | 156 3 159 | 157 3 160 | 158 1 161 | 159 1 162 | 160 2 163 | 161 2 164 | 162 1 165 | 163 0 166 | 164 3 167 | 165 1 168 | 166 1 169 | 167 0 170 | 168 1 171 | 169 1 172 | 170 0 173 | 171 0 174 | 172 0 175 | 173 1 176 | 174 1 177 | 175 0 178 | 176 2 179 | 177 1 180 | 178 0 181 | 179 1 182 | 180 3 183 | 181 2 184 | 182 1 185 | 183 0 186 | 184 1 187 | 185 1 188 | 186 2 189 | 187 1 190 | 188 2 191 | 189 2 192 | 190 2 193 | 191 1 194 | 192 2 195 | 193 2 196 | 194 1 197 | 195 1 198 | 196 3 199 | 197 2 200 | 198 2 201 | 199 2 202 | 200 2 203 | 201 2 204 | 202 1 205 | 203 2 206 | 204 2 207 | 205 3 208 | 206 3 209 | 207 2 210 | 208 1 211 | 209 3 212 | 210 3 213 | 211 3 214 | 212 3 215 | 213 2 216 | 214 1 217 | 215 1 218 | 216 2 219 | 217 2 220 | 218 2 221 | 219 3 222 | 220 3 223 | 221 0 224 | 222 3 225 | 223 2 226 | 224 2 227 | 225 3 228 | 226 3 229 | 227 3 230 | 228 1 231 | 229 2 232 | 230 2 233 | 231 1 234 | 232 3 235 | 233 2 236 | 234 3 237 | 235 3 238 | 236 3 239 | 237 1 240 | 238 3 241 | 239 2 242 | 240 0 243 | 241 1 244 | 242 1 245 | 243 1 246 | 244 0 247 | 245 2 248 | 246 1 249 | 247 2 250 | 248 1 251 | 249 1 252 | 250 3 253 | 251 2 254 | 252 1 255 | 253 3 256 | 254 2 257 | 255 3 258 | 256 3 259 | 257 2 260 | 258 3 261 | 259 3 262 | 260 2 263 | 261 3 264 | 262 3 265 | 263 3 266 | 264 2 267 | 265 2 268 | 266 2 269 | 267 2 270 | 268 3 271 | 269 3 272 | 270 3 273 | 271 2 274 | 272 1 275 | 273 2 276 | 274 3 277 | 275 2 278 | 276 3 279 | 277 2 280 | 278 1 281 | 279 3 282 | 280 1 283 | 281 2 284 | 282 2 285 | 283 3 286 | 284 2 287 | 285 1 288 | 286 3 289 | 287 3 290 | 288 3 291 | 289 3 292 | 290 1 293 | 291 1 294 | 292 0 295 | 293 3 296 | 294 2 297 | 295 2 298 | 296 3 299 | 297 2 300 | 298 3 301 | 299 1 302 | 300 3 303 | 301 3 304 | 302 2 305 | 303 2 306 | 304 3 307 | 305 2 308 | 306 3 309 | 307 2 310 | 308 1 311 | 309 2 312 | 310 1 313 | 311 3 314 | 312 2 315 | 313 2 316 | 314 1 317 | 315 3 318 | 316 3 319 | 317 3 320 | 318 1 321 | 319 3 322 | 320 2 323 | 321 3 324 | 322 3 325 | 323 3 326 | 324 3 327 | 325 2 328 | 326 2 329 | 327 2 330 | 328 3 331 | 329 3 332 | 330 3 333 | 331 2 334 | 332 3 335 | 333 2 336 | 334 2 337 | 335 3 338 | 336 3 339 | 337 3 340 | 338 3 341 | 339 3 342 | 340 3 343 | 341 3 344 | 342 3 345 | 343 2 346 | 344 2 347 | 345 2 348 | 346 2 349 | 347 2 350 | 348 3 351 | 349 1 352 | 350 2 353 | 351 2 354 | 352 3 355 | 353 2 356 | 354 0 357 | 355 1 358 | 356 2 359 | 357 3 360 | 358 3 361 | 359 3 362 | 360 1 363 | 361 1 364 | 362 2 365 | 363 1 366 | 364 2 367 | 365 1 368 | 366 1 369 | 367 3 370 | 368 2 371 | 369 3 372 | 370 2 373 | 371 2 374 | 372 3 375 | 373 2 376 | 374 1 377 | 375 1 378 | 376 1 379 | 377 2 380 | 378 1 381 | 379 2 382 | 380 2 383 | 381 3 384 | 382 3 385 | 383 3 386 | 384 3 387 | 385 3 388 | 386 3 389 | 387 3 390 | 388 3 391 | 389 2 392 | 390 1 393 | 391 2 394 | 392 2 395 | 393 3 396 | 394 1 397 | 395 1 398 | 396 3 399 | 397 2 400 | 398 2 401 | -------------------------------------------------------------------------------- /graph/labels-usa-airports.txt: -------------------------------------------------------------------------------- 1 | node label 2 | 10241 1 3 | 10243 2 4 | 10245 0 5 | 16390 1 6 | 10247 1 7 | 12297 2 8 | 16727 3 9 | 10257 0 10 | 12307 2 11 | 16729 3 12 | 12314 3 13 | 12315 2 14 | 10268 1 15 | 10272 1 16 | 12321 1 17 | 12323 0 18 | 12324 3 19 | 12294 2 20 | 10278 2 21 | 10279 0 22 | 11612 0 23 | 16428 1 24 | 16429 2 25 | 12335 1 26 | 12339 0 27 | 12638 2 28 | 12343 1 29 | 16441 3 30 | 10298 1 31 | 10299 0 32 | 12348 2 33 | 14397 2 34 | 10304 1 35 | 15030 3 36 | 16454 3 37 | 12641 2 38 | 10313 2 39 | 11834 2 40 | 12363 1 41 | 14412 3 42 | 12365 1 43 | 16463 3 44 | 10322 2 45 | 14691 3 46 | 10324 2 47 | 10325 2 48 | 12375 1 49 | 14424 3 50 | 10329 2 51 | 10333 1 52 | 14430 3 53 | 16479 2 54 | 15376 0 55 | 14435 3 56 | 12388 3 57 | 12389 0 58 | 12390 2 59 | 12391 0 60 | 12392 3 61 | 12394 3 62 | 16743 3 63 | 10348 3 64 | 12397 0 65 | 14447 3 66 | 16744 3 67 | 12402 0 68 | 14457 0 69 | 12412 1 70 | 16746 3 71 | 16515 3 72 | 10372 0 73 | 14470 1 74 | 15041 0 75 | 16520 3 76 | 14474 1 77 | 14475 2 78 | 10380 3 79 | 14477 2 80 | 16527 3 81 | 10385 3 82 | 12436 3 83 | 14485 1 84 | 14487 0 85 | 14488 1 86 | 12441 0 87 | 14492 0 88 | 10397 0 89 | 16543 3 90 | 12448 0 91 | 12451 0 92 | 10405 1 93 | 12455 1 94 | 10408 0 95 | 10409 1 96 | 10414 1 97 | 15389 0 98 | 14512 0 99 | 14736 2 100 | 10419 3 101 | 15154 2 102 | 10423 0 103 | 14520 1 104 | 12207 1 105 | 14524 0 106 | 14259 1 107 | 12478 0 108 | 10431 0 109 | 12320 2 110 | 10434 0 111 | 15051 1 112 | 12484 3 113 | 14533 2 114 | 14534 1 115 | 16584 2 116 | 11980 0 117 | 14539 1 118 | 12492 1 119 | 12494 1 120 | 14543 1 121 | 14254 0 122 | 10275 0 123 | 14551 2 124 | 14553 2 125 | 16603 2 126 | 10460 3 127 | 14557 3 128 | 12511 1 129 | 10466 0 130 | 12078 3 131 | 10469 0 132 | 12519 1 133 | 14716 0 134 | 14570 0 135 | 12523 0 136 | 14572 2 137 | 14574 0 138 | 15741 0 139 | 14576 0 140 | 14577 2 141 | 12206 0 142 | 15011 2 143 | 14582 1 144 | 16634 3 145 | 14588 0 146 | 15061 2 147 | 12544 0 148 | 16643 3 149 | 12549 1 150 | 11697 0 151 | 16647 1 152 | 12553 0 153 | 16651 3 154 | 11637 0 155 | 16654 3 156 | 10511 3 157 | 14262 0 158 | 14617 3 159 | 14618 2 160 | 12571 2 161 | 16668 3 162 | 11057 0 163 | 12574 2 164 | 12576 3 165 | 10529 0 166 | 14627 1 167 | 14628 2 168 | 14630 2 169 | 10535 2 170 | 16680 3 171 | 14633 0 172 | 16682 3 173 | 14635 0 174 | 10540 1 175 | 12591 2 176 | 13704 2 177 | 15411 0 178 | 14046 2 179 | 12598 3 180 | 10551 0 181 | 14648 1 182 | 15412 0 183 | 16698 3 184 | 16737 3 185 | 10557 1 186 | 10558 1 187 | 10559 1 188 | 14656 2 189 | 10561 0 190 | 10562 2 191 | 16709 3 192 | 16710 3 193 | 12615 1 194 | 10569 2 195 | 16715 3 196 | 12621 2 197 | 12622 3 198 | 14672 2 199 | 10577 0 200 | 14674 0 201 | 16723 3 202 | 16724 3 203 | 10581 0 204 | 14679 0 205 | 16728 3 206 | 12633 2 207 | 16730 3 208 | 14683 0 209 | 14685 0 210 | 10590 0 211 | 10221 1 212 | 16736 3 213 | 14689 0 214 | 16738 3 215 | 16739 3 216 | 16741 3 217 | 16742 3 218 | 10599 0 219 | 14696 0 220 | 12649 1 221 | 14698 0 222 | 12652 1 223 | 12653 2 224 | 14704 0 225 | 14706 3 226 | 14709 0 227 | 14711 0 228 | 14712 2 229 | 10617 3 230 | 10620 0 231 | 14718 1 232 | 12671 2 233 | 14400 3 234 | 10627 0 235 | 12676 2 236 | 10630 2 237 | 10631 1 238 | 15497 1 239 | 14730 0 240 | 10640 1 241 | 14738 1 242 | 10643 1 243 | 10990 0 244 | 10647 1 245 | 14744 3 246 | 14745 1 247 | 14747 0 248 | 15325 2 249 | 10654 1 250 | 14751 3 251 | 12704 1 252 | 12705 2 253 | 12708 1 254 | 12709 1 255 | 14761 0 256 | 10666 0 257 | 10994 0 258 | 10670 2 259 | 12719 1 260 | 12720 2 261 | 12721 1 262 | 14771 0 263 | 10676 0 264 | 14750 3 265 | 11337 0 266 | 12728 1 267 | 10996 2 268 | 14778 3 269 | 10683 1 270 | 10685 0 271 | 14783 0 272 | 12737 2 273 | 10693 0 274 | 12743 2 275 | 14792 3 276 | 12745 2 277 | 14794 0 278 | 12748 2 279 | 14797 1 280 | 11341 3 281 | 14802 1 282 | 12755 2 283 | 14804 1 284 | 14805 1 285 | 12758 0 286 | 10713 0 287 | 10715 3 288 | 14812 3 289 | 14814 0 290 | 10661 0 291 | 14816 2 292 | 10721 0 293 | 14819 1 294 | 12772 2 295 | 12773 2 296 | 12774 3 297 | 10728 1 298 | 10731 1 299 | 14828 0 300 | 12370 2 301 | 12782 2 302 | 14831 0 303 | 12784 2 304 | 12785 2 305 | 10739 1 306 | 10744 1 307 | 14842 0 308 | 10747 0 309 | 10754 0 310 | 14853 2 311 | 16725 2 312 | 12807 1 313 | 14856 1 314 | 10327 2 315 | 12815 1 316 | 10770 2 317 | 12819 0 318 | 14869 0 319 | 12822 1 320 | 10775 1 321 | 10778 3 322 | 10779 1 323 | 10781 0 324 | 10783 1 325 | 14880 2 326 | 10785 0 327 | 14769 3 328 | 10792 0 329 | 12841 1 330 | 12844 1 331 | 14893 0 332 | 14895 1 333 | 10800 0 334 | 14897 2 335 | 14898 2 336 | 12851 1 337 | 12853 1 338 | 10589 1 339 | 12855 1 340 | 14905 0 341 | 12635 2 342 | 14908 0 343 | 10815 2 344 | 10817 3 345 | 12866 2 346 | 10819 1 347 | 12868 2 348 | 10821 0 349 | 12870 3 350 | 14919 1 351 | 14922 3 352 | 12878 1 353 | 13795 0 354 | 12882 2 355 | 12883 2 356 | 12884 0 357 | 10838 3 358 | 12888 1 359 | 12889 0 360 | 14938 3 361 | 12891 0 362 | 12892 0 363 | 15023 0 364 | 14942 1 365 | 14943 1 366 | 14944 3 367 | 10849 0 368 | 12898 0 369 | 12899 1 370 | 12902 1 371 | 14952 0 372 | 10857 3 373 | 14955 0 374 | 15841 1 375 | 14960 0 376 | 12915 0 377 | 10868 0 378 | 12917 0 379 | 13076 0 380 | 10874 0 381 | 10687 3 382 | 14972 3 383 | 10347 3 384 | 12932 1 385 | 12054 3 386 | 12934 3 387 | 14785 3 388 | 14986 0 389 | 14987 2 390 | 10349 1 391 | 12944 2 392 | 12945 0 393 | 11615 1 394 | 12947 3 395 | 14996 2 396 | 12951 0 397 | 12953 0 398 | 12954 0 399 | 12955 3 400 | 12956 3 401 | 10910 2 402 | 12847 1 403 | 15008 1 404 | 11376 2 405 | 15010 3 406 | 14107 0 407 | 15012 2 408 | 12965 2 409 | 10918 1 410 | 15016 0 411 | 11719 1 412 | 15020 3 413 | 10925 1 414 | 10926 1 415 | 10927 3 416 | 15024 0 417 | 13768 1 418 | 10930 1 419 | 15027 0 420 | 10184 1 421 | 10933 2 422 | 12982 0 423 | 12983 2 424 | 16731 3 425 | 12992 0 426 | 10945 3 427 | 10946 3 428 | 15043 2 429 | 15045 2 430 | 10950 1 431 | 14113 1 432 | 15048 1 433 | 15049 1 434 | 13002 1 435 | 13003 1 436 | 11042 0 437 | 15054 3 438 | 11617 0 439 | 13008 3 440 | 10961 1 441 | 10965 2 442 | 10967 1 443 | 13016 2 444 | 15069 3 445 | 15070 0 446 | 13024 2 447 | 15074 1 448 | 10980 0 449 | 13029 0 450 | 10982 3 451 | 13032 1 452 | 13034 0 453 | 10140 0 454 | 15085 1 455 | 15086 2 456 | 15090 3 457 | 15091 2 458 | 13044 3 459 | 15093 3 460 | 13046 3 461 | 10999 3 462 | 15096 0 463 | 11002 3 464 | 11003 0 465 | 13052 3 466 | 14295 2 467 | 13055 2 468 | 15108 3 469 | 11013 1 470 | 11278 0 471 | 11619 2 472 | 13072 2 473 | 15370 0 474 | 11027 1 475 | 15124 1 476 | 13077 2 477 | 14468 1 478 | 11036 2 479 | 13087 2 480 | 11041 2 481 | 15138 1 482 | 10139 1 483 | 10938 2 484 | 11049 0 485 | 11050 3 486 | 11053 2 487 | 15153 1 488 | 11058 3 489 | 13109 1 490 | 13111 2 491 | 15160 2 492 | 13871 0 493 | 11066 0 494 | 13115 3 495 | 13117 3 496 | 11007 2 497 | 13121 1 498 | 15171 3 499 | 11076 1 500 | 13125 3 501 | 12769 1 502 | 15177 2 503 | 16345 2 504 | 12087 2 505 | 11085 1 506 | 11086 3 507 | 13139 0 508 | 11092 1 509 | 11097 0 510 | 11098 2 511 | 13151 3 512 | 11106 3 513 | 11067 0 514 | 11109 0 515 | 13158 0 516 | 11111 0 517 | 15215 0 518 | 15855 1 519 | 11122 0 520 | 11123 1 521 | 13873 0 522 | 11126 1 523 | 13176 1 524 | 15167 1 525 | 13182 1 526 | 11135 3 527 | 13184 0 528 | 15235 3 529 | 15236 2 530 | 13192 3 531 | 10732 0 532 | 11146 0 533 | 13195 3 534 | 13196 1 535 | 15245 1 536 | 11150 0 537 | 15248 2 538 | 15249 0 539 | 15250 2 540 | 13203 2 541 | 13204 0 542 | 14489 0 543 | 15257 1 544 | 13211 1 545 | 15511 3 546 | 11165 3 547 | 13219 3 548 | 13221 2 549 | 11174 3 550 | 11176 3 551 | 10396 1 552 | 13226 3 553 | 13127 0 554 | 15278 2 555 | 14493 2 556 | 13232 0 557 | 15282 1 558 | 11188 3 559 | 13241 1 560 | 11423 0 561 | 13244 0 562 | 11197 1 563 | 13246 3 564 | 15295 0 565 | 11200 2 566 | 10400 3 567 | 11203 0 568 | 13255 2 569 | 15304 0 570 | 13259 3 571 | 11214 1 572 | 13264 0 573 | 14150 1 574 | 15323 0 575 | 13277 0 576 | 11230 3 577 | 11233 1 578 | 13282 1 579 | 14843 0 580 | 10065 2 581 | 13891 0 582 | 11241 2 583 | 13290 0 584 | 15339 2 585 | 13292 3 586 | 11245 2 587 | 14559 2 588 | 13295 2 589 | 15344 3 590 | 13297 3 591 | 11252 0 592 | 13303 0 593 | 11259 0 594 | 15356 0 595 | 11267 0 596 | 10141 1 597 | 13484 1 598 | 11274 0 599 | 12119 1 600 | 11764 1 601 | 15374 1 602 | 11280 2 603 | 11282 3 604 | 11283 1 605 | 15380 0 606 | 15381 1 607 | 11288 1 608 | 15385 2 609 | 13487 0 610 | 11292 0 611 | 13341 1 612 | 13342 0 613 | 13344 1 614 | 10416 1 615 | 11298 0 616 | 13347 0 617 | 13348 1 618 | 11833 1 619 | 15401 1 620 | 14855 2 621 | 11308 0 622 | 15406 1 623 | 13360 0 624 | 13361 3 625 | 11315 1 626 | 13061 0 627 | 11317 2 628 | 13367 0 629 | 13369 1 630 | 15422 3 631 | 11445 1 632 | 13377 0 633 | 15427 2 634 | 13381 2 635 | 12129 1 636 | 11336 1 637 | 15433 3 638 | 13495 0 639 | 13388 1 640 | 13389 3 641 | 11789 2 642 | 15440 3 643 | 10424 3 644 | 16540 2 645 | 15203 3 646 | 13397 2 647 | 15446 2 648 | 15447 2 649 | 15448 2 650 | 14863 2 651 | 11450 3 652 | 15454 1 653 | 10085 2 654 | 15458 3 655 | 14182 2 656 | 14222 1 657 | 13415 2 658 | 13418 2 659 | 13422 0 660 | 11375 2 661 | 13424 2 662 | 13502 0 663 | 15478 1 664 | 15481 2 665 | 13434 1 666 | 11388 3 667 | 11391 2 668 | 11392 1 669 | 13504 1 670 | 13200 1 671 | 11778 0 672 | 11399 1 673 | 11401 1 674 | 13450 3 675 | 14871 2 676 | 14530 2 677 | 15502 1 678 | 15504 2 679 | 11411 1 680 | 13461 1 681 | 13463 3 682 | 13464 2 683 | 13467 1 684 | 11421 2 685 | 16581 2 686 | 14875 1 687 | 13476 0 688 | 15525 3 689 | 11430 3 690 | 11431 2 691 | 11433 0 692 | 15532 2 693 | 13485 0 694 | 13486 0 695 | 14877 1 696 | 11441 1 697 | 13490 1 698 | 15539 3 699 | 13493 3 700 | 11447 1 701 | 15546 3 702 | 12831 1 703 | 15548 3 704 | 11453 2 705 | 15550 3 706 | 14197 2 707 | 11456 2 708 | 13505 3 709 | 15554 1 710 | 13507 2 711 | 11463 2 712 | 16588 2 713 | 11468 1 714 | 11470 0 715 | 11471 1 716 | 13520 1 717 | 15569 1 718 | 15570 1 719 | 14542 2 720 | 11479 2 721 | 11481 0 722 | 15579 1 723 | 11484 2 724 | 15581 1 725 | 15582 1 726 | 11487 2 727 | 13536 2 728 | 13537 3 729 | 11492 1 730 | 13541 0 731 | 13543 1 732 | 13546 3 733 | 11503 0 734 | 15601 2 735 | 11506 3 736 | 13555 3 737 | 10135 0 738 | 11510 2 739 | 15607 0 740 | 11512 2 741 | 15231 2 742 | 13564 2 743 | 11517 2 744 | 13525 3 745 | 15232 3 746 | 15618 2 747 | 11525 1 748 | 13574 2 749 | 10613 1 750 | 15624 0 751 | 13577 0 752 | 15626 0 753 | 13579 1 754 | 15628 1 755 | 11535 1 756 | 12250 1 757 | 11537 0 758 | 15634 3 759 | 13587 3 760 | 11540 0 761 | 11140 0 762 | 11823 0 763 | 11550 1 764 | 13599 2 765 | 15650 3 766 | 11555 0 767 | 11559 2 768 | 15656 2 769 | 11563 0 770 | 10478 2 771 | 13619 3 772 | 11577 0 773 | 10463 3 774 | 13194 1 775 | 13630 3 776 | 10615 2 777 | 11588 1 778 | 12854 2 779 | 15798 1 780 | 11592 3 781 | 16553 3 782 | 12173 0 783 | 11603 0 784 | 15700 2 785 | 13198 0 786 | 13655 2 787 | 13540 3 788 | 15706 3 789 | 15707 2 790 | 15708 2 791 | 15709 1 792 | 14565 2 793 | 15713 3 794 | 11618 0 795 | 13667 3 796 | 12857 2 797 | 11624 0 798 | 15721 1 799 | 13674 2 800 | 11627 3 801 | 13676 2 802 | 15725 2 803 | 11630 0 804 | 11633 3 805 | 13682 3 806 | 15731 2 807 | 13685 3 808 | 11638 0 809 | 11641 0 810 | 11643 2 811 | 13693 2 812 | 11646 2 813 | 11648 0 814 | 11299 3 815 | 11650 3 816 | 12663 2 817 | 13700 3 818 | 11656 3 819 | 10476 2 820 | 15754 2 821 | 11659 3 822 | 11842 2 823 | 13710 1 824 | 11663 3 825 | 12184 0 826 | 13714 2 827 | 13715 2 828 | 11669 3 829 | 14314 0 830 | 11673 2 831 | 11675 2 832 | 10317 3 833 | 15774 3 834 | 12869 3 835 | 13398 1 836 | 11684 1 837 | 13736 3 838 | 15785 1 839 | 11695 0 840 | 15793 2 841 | 15794 1 842 | 11699 0 843 | 11028 2 844 | 13756 2 845 | 11711 2 846 | 11714 3 847 | 14467 3 848 | 13767 1 849 | 11720 2 850 | 11721 0 851 | 13770 1 852 | 11511 2 853 | 13772 3 854 | 11725 1 855 | 11726 1 856 | 11728 2 857 | 15825 2 858 | 15939 3 859 | 11732 3 860 | 13781 3 861 | 13785 3 862 | 13788 3 863 | 15838 3 864 | 13689 2 865 | 14371 3 866 | 15842 3 867 | 15843 2 868 | 13796 0 869 | 14303 0 870 | 15847 3 871 | 11493 2 872 | 11756 3 873 | 15853 2 874 | 13806 2 875 | 15599 2 876 | 15856 2 877 | 13809 2 878 | 11762 1 879 | 11344 2 880 | 15861 1 881 | 15862 1 882 | 15273 3 883 | 11415 3 884 | 15163 3 885 | 10154 0 886 | 11775 0 887 | 16498 2 888 | 13826 2 889 | 15275 3 890 | 13829 1 891 | 13830 0 892 | 15879 3 893 | 13832 1 894 | 15881 3 895 | 15882 3 896 | 15885 2 897 | 11790 3 898 | 15887 1 899 | 13827 3 900 | 13841 3 901 | 13230 0 902 | 14100 0 903 | 15897 1 904 | 13851 0 905 | 11867 1 906 | 11813 3 907 | 13862 1 908 | 13863 2 909 | 13865 3 910 | 13791 3 911 | 15919 0 912 | 11824 3 913 | 11825 3 914 | 11827 2 915 | 11828 3 916 | 14601 3 917 | 13881 3 918 | 15930 3 919 | 10267 3 920 | 13884 2 921 | 15934 2 922 | 11840 3 923 | 12896 0 924 | 13890 3 925 | 11531 1 926 | 11844 1 927 | 11845 1 928 | 13894 1 929 | 14945 1 930 | 12124 1 931 | 13898 2 932 | 13899 3 933 | 13731 2 934 | 15534 3 935 | 11856 3 936 | 14102 1 937 | 11859 2 938 | 11331 3 939 | 11193 0 940 | 11865 1 941 | 15057 2 942 | 12559 1 943 | 11869 0 944 | 11870 3 945 | 11871 3 946 | 15971 3 947 | 15973 3 948 | 11879 1 949 | 10011 1 950 | 14268 2 951 | 13930 0 952 | 13931 0 953 | 11413 0 954 | 13933 0 955 | 13934 2 956 | 15293 1 957 | 13936 3 958 | 11198 3 959 | 13942 1 960 | 15991 1 961 | 11898 0 962 | 11899 2 963 | 13949 2 964 | 11905 1 965 | 13459 0 966 | 11883 3 967 | 11908 1 968 | 13958 2 969 | 11495 2 970 | 11884 0 971 | 13964 1 972 | 13763 3 973 | 11885 3 974 | 11921 0 975 | 13970 0 976 | 11924 2 977 | 15982 3 978 | 11545 2 979 | 11931 1 980 | 13983 1 981 | 13984 2 982 | 11938 3 983 | 13987 2 984 | 11941 1 985 | 11947 3 986 | 12332 3 987 | 11952 1 988 | 13256 0 989 | 14004 2 990 | 12264 0 991 | 14006 1 992 | 11538 3 993 | 12916 2 994 | 14013 2 995 | 14646 3 996 | 14965 3 997 | 12235 2 998 | 11973 0 999 | 11975 3 1000 | 14024 3 1001 | 14025 0 1002 | 14027 0 1003 | 14028 2 1004 | 11982 0 1005 | 11986 0 1006 | 15310 3 1007 | 11992 2 1008 | 12771 2 1009 | 11994 3 1010 | 16091 1 1011 | 11996 0 1012 | 11997 1 1013 | 13105 1 1014 | 14288 1 1015 | 14050 2 1016 | 12003 0 1017 | 16101 0 1018 | 14054 1 1019 | 12007 0 1020 | 14057 0 1021 | 12583 2 1022 | 12012 1 1023 | 14062 2 1024 | 12016 0 1025 | 12018 3 1026 | 16681 3 1027 | 12244 1 1028 | 12028 3 1029 | 16665 3 1030 | 12245 1 1031 | 14081 1 1032 | 14082 0 1033 | 12587 3 1034 | 10923 2 1035 | 16133 0 1036 | 12039 3 1037 | 14088 1 1038 | 15472 2 1039 | 14091 3 1040 | 14092 0 1041 | 15063 3 1042 | 14098 0 1043 | 11977 0 1044 | 10005 2 1045 | 10006 3 1046 | 12055 2 1047 | 10543 3 1048 | 14108 0 1049 | 14109 1 1050 | 10015 3 1051 | 10016 2 1052 | 10017 3 1053 | 11227 1 1054 | 12068 3 1055 | 10886 3 1056 | 11995 0 1057 | 14119 2 1058 | 14120 1 1059 | 10204 1 1060 | 14122 0 1061 | 14125 1 1062 | 10030 3 1063 | 12079 3 1064 | 10033 3 1065 | 14130 1 1066 | 14131 1 1067 | 10039 3 1068 | 10040 3 1069 | 10041 3 1070 | 10042 2 1071 | 12255 1 1072 | 12094 0 1073 | 10050 3 1074 | 10052 3 1075 | 10053 3 1076 | 11367 2 1077 | 12103 3 1078 | 10056 3 1079 | 12599 2 1080 | 12108 2 1081 | 10064 3 1082 | 16696 3 1083 | 14307 0 1084 | 14695 3 1085 | 14167 2 1086 | 16218 0 1087 | 10076 2 1088 | 12222 2 1089 | 12127 3 1090 | 14992 1 1091 | 12131 2 1092 | 12132 3 1093 | 13535 2 1094 | 12134 3 1095 | 14993 2 1096 | 12263 3 1097 | 12141 2 1098 | 13629 3 1099 | 14193 0 1100 | 12147 3 1101 | 12149 2 1102 | 10361 1 1103 | 12155 3 1104 | 12156 0 1105 | 16567 1 1106 | 13771 2 1107 | 14112 0 1108 | 16704 3 1109 | 14044 3 1110 | 14218 2 1111 | 12171 1 1112 | 12610 1 1113 | 12174 1 1114 | 12175 1 1115 | 12177 1 1116 | 11587 1 1117 | 14229 2 1118 | 14231 1 1119 | 10136 0 1120 | 12185 2 1121 | 14234 1 1122 | 12187 2 1123 | 14236 2 1124 | 14237 1 1125 | 12190 1 1126 | 12191 0 1127 | 13296 0 1128 | 10146 1 1129 | 12195 1 1130 | 12197 0 1131 | 14321 0 1132 | 12779 1 1133 | 11522 3 1134 | 10155 0 1135 | 14252 0 1136 | 10157 0 1137 | 10158 0 1138 | 14255 2 1139 | 14256 1 1140 | 13947 3 1141 | 12211 2 1142 | 10165 1 1143 | 12214 1 1144 | 16311 2 1145 | 12217 0 1146 | 10170 0 1147 | 10171 2 1148 | 10172 3 1149 | 14270 3 1150 | 12223 0 1151 | 14273 2 1152 | 14275 1 1153 | 12228 2 1154 | 12232 3 1155 | 10185 0 1156 | 14282 2 1157 | 14283 3 1158 | 11953 0 1159 | 16336 3 1160 | 13501 2 1161 | 10194 1 1162 | 16339 2 1163 | 16340 2 1164 | 14670 3 1165 | 10198 2 1166 | 13433 0 1167 | 11961 2 1168 | 16346 2 1169 | 12252 2 1170 | 12253 1 1171 | 10917 1 1172 | 10208 0 1173 | 16720 3 1174 | 14306 1 1175 | 13307 2 1176 | 14320 2 1177 | 16721 3 1178 | 10216 2 1179 | 12265 0 1180 | 12266 0 1181 | 16363 3 1182 | 12268 1 1183 | 16722 3 1184 | 11702 3 1185 | 10224 3 1186 | 10225 1 1187 | 12278 0 1188 | 12280 0 1189 | 14332 3 1190 | 10237 2 1191 | 16353 2 1192 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Leonardo Filipe Rodrigues Ribeiro 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /pickles/README.txt: -------------------------------------------------------------------------------- 1 | folder used to save pickles generated by struc2vec. 2 | -------------------------------------------------------------------------------- /src/algorithms.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from time import time 3 | from collections import deque 4 | import numpy as np 5 | import math,random,logging 6 | from concurrent.futures import ProcessPoolExecutor, as_completed 7 | import multiprocessing as mp 8 | from collections import defaultdict 9 | 10 | from utils import * 11 | 12 | 13 | def generate_parameters_random_walk(workers): 14 | 15 | logging.info('Loading distances_nets from disk...') 16 | 17 | sum_weights = {} 18 | amount_edges = {} 19 | 20 | layer = 0 21 | while(isPickle('distances_nets_weights-layer-'+str(layer))): 22 | logging.info('Executing layer {}...'.format(layer)) 23 | weights = restoreVariableFromDisk('distances_nets_weights-layer-'+str(layer)) 24 | 25 | for k,list_weights in weights.iteritems(): 26 | if(layer not in sum_weights): 27 | sum_weights[layer] = 0 28 | if(layer not in amount_edges): 29 | amount_edges[layer] = 0 30 | 31 | for w in list_weights: 32 | sum_weights[layer] += w 33 | amount_edges[layer] += 1 34 | 35 | logging.info('Layer {} executed.'.format(layer)) 36 | layer += 1 37 | 38 | average_weight = {} 39 | for layer in sum_weights.keys(): 40 | average_weight[layer] = sum_weights[layer] / amount_edges[layer] 41 | 42 | logging.info("Saving average_weights on disk...") 43 | saveVariableOnDisk(average_weight,'average_weight') 44 | 45 | amount_neighbours = {} 46 | 47 | layer = 0 48 | while(isPickle('distances_nets_weights-layer-'+str(layer))): 49 | logging.info('Executing layer {}...'.format(layer)) 50 | weights = restoreVariableFromDisk('distances_nets_weights-layer-'+str(layer)) 51 | 52 | amount_neighbours[layer] = {} 53 | 54 | for k,list_weights in weights.iteritems(): 55 | cont_neighbours = 0 56 | for w in list_weights: 57 | if(w > average_weight[layer]): 58 | cont_neighbours += 1 59 | amount_neighbours[layer][k] = cont_neighbours 60 | 61 | logging.info('Layer {} executed.'.format(layer)) 62 | layer += 1 63 | 64 | logging.info("Saving amount_neighbours on disk...") 65 | saveVariableOnDisk(amount_neighbours,'amount_neighbours') 66 | 67 | def chooseNeighbor(v,graphs,alias_method_j,alias_method_q,layer): 68 | v_list = graphs[layer][v] 69 | 70 | idx = alias_draw(alias_method_j[layer][v],alias_method_q[layer][v]) 71 | v = v_list[idx] 72 | 73 | return v 74 | 75 | 76 | def exec_random_walk(graphs,alias_method_j,alias_method_q,v,walk_length,amount_neighbours): 77 | original_v = v 78 | t0 = time() 79 | initialLayer = 0 80 | layer = initialLayer 81 | 82 | 83 | path = deque() 84 | path.append(v) 85 | 86 | while len(path) < walk_length: 87 | r = random.random() 88 | 89 | if(r < 0.3): 90 | v = chooseNeighbor(v,graphs,alias_method_j,alias_method_q,layer) 91 | path.append(v) 92 | 93 | else: 94 | r = random.random() 95 | limiar_moveup = prob_moveup(amount_neighbours[layer][v]) 96 | if(r > limiar_moveup): 97 | if(layer > initialLayer): 98 | layer = layer - 1 99 | else: 100 | if((layer + 1) in graphs and v in graphs[layer + 1]): 101 | layer = layer + 1 102 | 103 | t1 = time() 104 | logging.info('RW - vertex {}. Time : {}s'.format(original_v,(t1-t0))) 105 | 106 | return path 107 | 108 | 109 | def exec_ramdom_walks_for_chunck(vertices,graphs,alias_method_j,alias_method_q,walk_length,amount_neighbours): 110 | walks = deque() 111 | for v in vertices: 112 | walks.append(exec_random_walk(graphs,alias_method_j,alias_method_q,v,walk_length,amount_neighbours)) 113 | return walks 114 | 115 | def generate_random_walks_large_graphs(num_walks,walk_length,workers,vertices): 116 | 117 | logging.info('Loading distances_nets from disk...') 118 | 119 | graphs = restoreVariableFromDisk('distances_nets_graphs') 120 | alias_method_j = restoreVariableFromDisk('nets_weights_alias_method_j') 121 | alias_method_q = restoreVariableFromDisk('nets_weights_alias_method_q') 122 | amount_neighbours = restoreVariableFromDisk('amount_neighbours') 123 | 124 | logging.info('Creating RWs...') 125 | t0 = time() 126 | 127 | walks = deque() 128 | initialLayer = 0 129 | 130 | parts = workers 131 | 132 | with ProcessPoolExecutor(max_workers=workers) as executor: 133 | 134 | for walk_iter in range(num_walks): 135 | random.shuffle(vertices) 136 | logging.info("Execution iteration {} ...".format(walk_iter)) 137 | walk = exec_ramdom_walks_for_chunck(vertices,graphs,alias_method_j,alias_method_q,walk_length,amount_neighbours) 138 | walks.extend(walk) 139 | logging.info("Iteration {} executed.".format(walk_iter)) 140 | 141 | 142 | 143 | t1 = time() 144 | logging.info('RWs created. Time : {}m'.format((t1-t0)/60)) 145 | logging.info("Saving Random Walks on disk...") 146 | save_random_walks(walks) 147 | 148 | def generate_random_walks(num_walks,walk_length,workers,vertices): 149 | 150 | logging.info('Loading distances_nets on disk...') 151 | 152 | graphs = restoreVariableFromDisk('distances_nets_graphs') 153 | alias_method_j = restoreVariableFromDisk('nets_weights_alias_method_j') 154 | alias_method_q = restoreVariableFromDisk('nets_weights_alias_method_q') 155 | amount_neighbours = restoreVariableFromDisk('amount_neighbours') 156 | 157 | logging.info('Creating RWs...') 158 | t0 = time() 159 | 160 | walks = deque() 161 | initialLayer = 0 162 | 163 | if(workers > num_walks): 164 | workers = num_walks 165 | 166 | with ProcessPoolExecutor(max_workers=workers) as executor: 167 | futures = {} 168 | for walk_iter in range(num_walks): 169 | random.shuffle(vertices) 170 | job = executor.submit(exec_ramdom_walks_for_chunck,vertices,graphs,alias_method_j,alias_method_q,walk_length,amount_neighbours) 171 | futures[job] = walk_iter 172 | #part += 1 173 | logging.info("Receiving results...") 174 | for job in as_completed(futures): 175 | walk = job.result() 176 | r = futures[job] 177 | logging.info("Iteration {} executed.".format(r)) 178 | walks.extend(walk) 179 | del futures[job] 180 | 181 | 182 | t1 = time() 183 | logging.info('RWs created. Time: {}m'.format((t1-t0)/60)) 184 | logging.info("Saving Random Walks on disk...") 185 | save_random_walks(walks) 186 | 187 | def save_random_walks(walks): 188 | with open('random_walks.txt', 'w') as file: 189 | for walk in walks: 190 | line = '' 191 | for v in walk: 192 | line += str(v)+' ' 193 | line += '\n' 194 | file.write(line) 195 | return 196 | 197 | def prob_moveup(amount_neighbours): 198 | x = math.log(amount_neighbours + math.e) 199 | p = (x / ( x + 1)) 200 | return p 201 | 202 | 203 | 204 | def alias_draw(J, q): 205 | ''' 206 | Draw sample from a non-uniform discrete distribution using alias sampling. 207 | ''' 208 | K = len(J) 209 | 210 | kk = int(np.floor(np.random.rand()*K)) 211 | if np.random.rand() < q[kk]: 212 | return kk 213 | else: 214 | return J[kk] 215 | -------------------------------------------------------------------------------- /src/algorithms_distances.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from time import time 3 | from collections import deque 4 | import numpy as np 5 | import math,logging 6 | from fastdtw import fastdtw 7 | from concurrent.futures import ProcessPoolExecutor, as_completed 8 | from collections import defaultdict 9 | from utils import * 10 | import os 11 | 12 | limiteDist = 20 13 | 14 | def getDegreeListsVertices(g,vertices,calcUntilLayer): 15 | degreeList = {} 16 | 17 | for v in vertices: 18 | degreeList[v] = getDegreeLists(g,v,calcUntilLayer) 19 | 20 | return degreeList 21 | 22 | def getCompactDegreeListsVertices(g,vertices,maxDegree,calcUntilLayer): 23 | degreeList = {} 24 | 25 | for v in vertices: 26 | degreeList[v] = getCompactDegreeLists(g,v,maxDegree,calcUntilLayer) 27 | 28 | return degreeList 29 | 30 | 31 | def getCompactDegreeLists(g, root, maxDegree,calcUntilLayer): 32 | t0 = time() 33 | 34 | listas = {} 35 | vetor_marcacao = [0] * (max(g) + 1) 36 | 37 | # Marcar s e inserir s na fila Q 38 | queue = deque() 39 | queue.append(root) 40 | vetor_marcacao[root] = 1 41 | l = {} 42 | 43 | ## Variáveis de controle de distância 44 | depth = 0 45 | pendingDepthIncrease = 0 46 | timeToDepthIncrease = 1 47 | 48 | while queue: 49 | vertex = queue.popleft() 50 | timeToDepthIncrease -= 1 51 | 52 | d = len(g[vertex]) 53 | if(d not in l): 54 | l[d] = 0 55 | l[d] += 1 56 | 57 | for v in g[vertex]: 58 | if(vetor_marcacao[v] == 0): 59 | vetor_marcacao[v] = 1 60 | queue.append(v) 61 | pendingDepthIncrease += 1 62 | 63 | if(timeToDepthIncrease == 0): 64 | 65 | list_d = [] 66 | for degree,freq in l.iteritems(): 67 | list_d.append((degree,freq)) 68 | list_d.sort(key=lambda x: x[0]) 69 | listas[depth] = np.array(list_d,dtype=np.int32) 70 | 71 | l = {} 72 | 73 | if(calcUntilLayer == depth): 74 | break 75 | 76 | depth += 1 77 | timeToDepthIncrease = pendingDepthIncrease 78 | pendingDepthIncrease = 0 79 | 80 | 81 | t1 = time() 82 | logging.info('BFS vertex {}. Time: {}s'.format(root,(t1-t0))) 83 | 84 | return listas 85 | 86 | 87 | def getDegreeLists(g, root, calcUntilLayer): 88 | t0 = time() 89 | 90 | listas = {} 91 | vetor_marcacao = [0] * (max(g) + 1) 92 | 93 | # Marcar s e inserir s na fila Q 94 | queue = deque() 95 | queue.append(root) 96 | vetor_marcacao[root] = 1 97 | 98 | 99 | l = deque() 100 | 101 | ## Variáveis de controle de distância 102 | depth = 0 103 | pendingDepthIncrease = 0 104 | timeToDepthIncrease = 1 105 | 106 | while queue: 107 | vertex = queue.popleft() 108 | timeToDepthIncrease -= 1 109 | 110 | l.append(len(g[vertex])) 111 | 112 | for v in g[vertex]: 113 | if(vetor_marcacao[v] == 0): 114 | vetor_marcacao[v] = 1 115 | queue.append(v) 116 | pendingDepthIncrease += 1 117 | 118 | if(timeToDepthIncrease == 0): 119 | 120 | lp = np.array(l,dtype='float') 121 | lp = np.sort(lp) 122 | listas[depth] = lp 123 | l = deque() 124 | 125 | if(calcUntilLayer == depth): 126 | break 127 | 128 | depth += 1 129 | timeToDepthIncrease = pendingDepthIncrease 130 | pendingDepthIncrease = 0 131 | 132 | 133 | t1 = time() 134 | logging.info('BFS vertex {}. Time: {}s'.format(root,(t1-t0))) 135 | 136 | 137 | return listas 138 | 139 | def cost(a,b): 140 | ep = 0.5 141 | m = max(a,b) + ep 142 | mi = min(a,b) + ep 143 | return ((m/mi) - 1) 144 | 145 | def cost_min(a,b): 146 | ep = 0.5 147 | m = max(a[0],b[0]) + ep 148 | mi = min(a[0],b[0]) + ep 149 | return ((m/mi) - 1) * min(a[1],b[1]) 150 | 151 | 152 | def cost_max(a,b): 153 | ep = 0.5 154 | m = max(a[0],b[0]) + ep 155 | mi = min(a[0],b[0]) + ep 156 | return ((m/mi) - 1) * max(a[1],b[1]) 157 | 158 | def preprocess_degreeLists(): 159 | 160 | logging.info("Recovering degreeList from disk...") 161 | degreeList = restoreVariableFromDisk('degreeList') 162 | 163 | logging.info("Creating compactDegreeList...") 164 | 165 | dList = {} 166 | dFrequency = {} 167 | for v,layers in degreeList.iteritems(): 168 | dFrequency[v] = {} 169 | for layer,degreeListLayer in layers.iteritems(): 170 | dFrequency[v][layer] = {} 171 | for degree in degreeListLayer: 172 | if(degree not in dFrequency[v][layer]): 173 | dFrequency[v][layer][degree] = 0 174 | dFrequency[v][layer][degree] += 1 175 | for v,layers in dFrequency.iteritems(): 176 | dList[v] = {} 177 | for layer,frequencyList in layers.iteritems(): 178 | list_d = [] 179 | for degree,freq in frequencyList.iteritems(): 180 | list_d.append((degree,freq)) 181 | list_d.sort(key=lambda x: x[0]) 182 | dList[v][layer] = np.array(list_d,dtype='float') 183 | 184 | logging.info("compactDegreeList created!") 185 | 186 | saveVariableOnDisk(dList,'compactDegreeList') 187 | 188 | def verifyDegrees(degrees,degree_v_root,degree_a,degree_b): 189 | 190 | if(degree_b == -1): 191 | degree_now = degree_a 192 | elif(degree_a == -1): 193 | degree_now = degree_b 194 | elif(abs(degree_b - degree_v_root) < abs(degree_a - degree_v_root)): 195 | degree_now = degree_b 196 | else: 197 | degree_now = degree_a 198 | 199 | return degree_now 200 | 201 | def get_vertices(v,degree_v,degrees,a_vertices): 202 | a_vertices_selected = 2 * math.log(a_vertices,2) 203 | #logging.info("Selecionando {} próximos ao vértice {} ...".format(int(a_vertices_selected),v)) 204 | vertices = deque() 205 | 206 | try: 207 | c_v = 0 208 | 209 | for v2 in degrees[degree_v]['vertices']: 210 | if(v != v2): 211 | vertices.append(v2) 212 | c_v += 1 213 | if(c_v > a_vertices_selected): 214 | raise StopIteration 215 | 216 | if('before' not in degrees[degree_v]): 217 | degree_b = -1 218 | else: 219 | degree_b = degrees[degree_v]['before'] 220 | if('after' not in degrees[degree_v]): 221 | degree_a = -1 222 | else: 223 | degree_a = degrees[degree_v]['after'] 224 | if(degree_b == -1 and degree_a == -1): 225 | raise StopIteration 226 | degree_now = verifyDegrees(degrees,degree_v,degree_a,degree_b) 227 | 228 | while True: 229 | for v2 in degrees[degree_now]['vertices']: 230 | if(v != v2): 231 | vertices.append(v2) 232 | c_v += 1 233 | if(c_v > a_vertices_selected): 234 | raise StopIteration 235 | 236 | if(degree_now == degree_b): 237 | if('before' not in degrees[degree_b]): 238 | degree_b = -1 239 | else: 240 | degree_b = degrees[degree_b]['before'] 241 | else: 242 | if('after' not in degrees[degree_a]): 243 | degree_a = -1 244 | else: 245 | degree_a = degrees[degree_a]['after'] 246 | 247 | if(degree_b == -1 and degree_a == -1): 248 | raise StopIteration 249 | 250 | degree_now = verifyDegrees(degrees,degree_v,degree_a,degree_b) 251 | 252 | except StopIteration: 253 | #logging.info("Vértice {} - próximos selecionados.".format(v)) 254 | return list(vertices) 255 | 256 | return list(vertices) 257 | 258 | 259 | def splitDegreeList(part,c,G,compactDegree): 260 | if(compactDegree): 261 | logging.info("Recovering compactDegreeList from disk...") 262 | degreeList = restoreVariableFromDisk('compactDegreeList') 263 | else: 264 | logging.info("Recovering degreeList from disk...") 265 | degreeList = restoreVariableFromDisk('degreeList') 266 | 267 | logging.info("Recovering degree vector from disk...") 268 | degrees = restoreVariableFromDisk('degrees_vector') 269 | 270 | degreeListsSelected = {} 271 | vertices = {} 272 | a_vertices = len(G) 273 | 274 | for v in c: 275 | nbs = get_vertices(v,len(G[v]),degrees,a_vertices) 276 | vertices[v] = nbs 277 | degreeListsSelected[v] = degreeList[v] 278 | for n in nbs: 279 | degreeListsSelected[n] = degreeList[n] 280 | 281 | saveVariableOnDisk(vertices,'split-vertices-'+str(part)) 282 | saveVariableOnDisk(degreeListsSelected,'split-degreeList-'+str(part)) 283 | 284 | 285 | def calc_distances(part, compactDegree = False): 286 | 287 | vertices = restoreVariableFromDisk('split-vertices-'+str(part)) 288 | degreeList = restoreVariableFromDisk('split-degreeList-'+str(part)) 289 | 290 | distances = {} 291 | 292 | if compactDegree: 293 | dist_func = cost_max 294 | else: 295 | dist_func = cost 296 | 297 | for v1,nbs in vertices.iteritems(): 298 | lists_v1 = degreeList[v1] 299 | 300 | for v2 in nbs: 301 | t00 = time() 302 | lists_v2 = degreeList[v2] 303 | 304 | max_layer = min(len(lists_v1),len(lists_v2)) 305 | distances[v1,v2] = {} 306 | 307 | for layer in range(0,max_layer): 308 | dist, path = fastdtw(lists_v1[layer],lists_v2[layer],radius=1,dist=dist_func) 309 | 310 | distances[v1,v2][layer] = dist 311 | 312 | t11 = time() 313 | logging.info('fastDTW between vertices ({}, {}). Time: {}s'.format(v1,v2,(t11-t00))) 314 | 315 | 316 | preprocess_consolides_distances(distances) 317 | saveVariableOnDisk(distances,'distances-'+str(part)) 318 | return 319 | 320 | def calc_distances_all(vertices,list_vertices,degreeList,part, compactDegree = False): 321 | 322 | distances = {} 323 | cont = 0 324 | 325 | if compactDegree: 326 | dist_func = cost_max 327 | else: 328 | dist_func = cost 329 | 330 | for v1 in vertices: 331 | lists_v1 = degreeList[v1] 332 | 333 | for v2 in list_vertices[cont]: 334 | lists_v2 = degreeList[v2] 335 | 336 | max_layer = min(len(lists_v1),len(lists_v2)) 337 | distances[v1,v2] = {} 338 | 339 | for layer in range(0,max_layer): 340 | #t0 = time() 341 | dist, path = fastdtw(lists_v1[layer],lists_v2[layer],radius=1,dist=dist_func) 342 | #t1 = time() 343 | #logging.info('D ({} , {}), Tempo fastDTW da camada {} : {}s . Distância: {}'.format(v1,v2,layer,(t1-t0),dist)) 344 | distances[v1,v2][layer] = dist 345 | 346 | 347 | cont += 1 348 | 349 | preprocess_consolides_distances(distances) 350 | saveVariableOnDisk(distances,'distances-'+str(part)) 351 | return 352 | 353 | 354 | def selectVertices(layer,fractionCalcDists): 355 | previousLayer = layer - 1 356 | 357 | logging.info("Recovering distances from disk...") 358 | distances = restoreVariableFromDisk('distances') 359 | 360 | threshold = calcThresholdDistance(previousLayer,distances,fractionCalcDists) 361 | 362 | logging.info('Selecting vertices...') 363 | 364 | vertices_selected = deque() 365 | 366 | for vertices,layers in distances.iteritems(): 367 | if(previousLayer not in layers): 368 | continue 369 | if(layers[previousLayer] <= threshold): 370 | vertices_selected.append(vertices) 371 | 372 | distances = {} 373 | 374 | logging.info('Vertices selected.') 375 | 376 | return vertices_selected 377 | 378 | 379 | def preprocess_consolides_distances(distances, startLayer = 1): 380 | 381 | logging.info('Consolidating distances...') 382 | 383 | for vertices,layers in distances.iteritems(): 384 | keys_layers = sorted(layers.keys()) 385 | startLayer = min(len(keys_layers),startLayer) 386 | for layer in range(0,startLayer): 387 | keys_layers.pop(0) 388 | 389 | 390 | for layer in keys_layers: 391 | layers[layer] += layers[layer - 1] 392 | 393 | logging.info('Distances consolidated.') 394 | 395 | 396 | def exec_bfs_compact(G,workers,calcUntilLayer): 397 | 398 | futures = {} 399 | degreeList = {} 400 | 401 | t0 = time() 402 | vertices = G.keys() 403 | parts = workers 404 | chunks = partition(vertices,parts) 405 | 406 | logging.info('Capturing larger degree...') 407 | maxDegree = 0 408 | for v in vertices: 409 | if(len(G[v]) > maxDegree): 410 | maxDegree = len(G[v]) 411 | logging.info('Larger degree captured') 412 | 413 | with ProcessPoolExecutor(max_workers=workers) as executor: 414 | 415 | part = 1 416 | for c in chunks: 417 | job = executor.submit(getCompactDegreeListsVertices,G,c,maxDegree,calcUntilLayer) 418 | futures[job] = part 419 | part += 1 420 | 421 | for job in as_completed(futures): 422 | dl = job.result() 423 | v = futures[job] 424 | degreeList.update(dl) 425 | 426 | logging.info("Saving degreeList on disk...") 427 | saveVariableOnDisk(degreeList,'compactDegreeList') 428 | t1 = time() 429 | logging.info('Execution time - BFS: {}m'.format((t1-t0)/60)) 430 | 431 | 432 | return 433 | 434 | def exec_bfs(G,workers,calcUntilLayer): 435 | 436 | futures = {} 437 | degreeList = {} 438 | 439 | t0 = time() 440 | vertices = G.keys() 441 | parts = workers 442 | chunks = partition(vertices,parts) 443 | 444 | with ProcessPoolExecutor(max_workers=workers) as executor: 445 | 446 | part = 1 447 | for c in chunks: 448 | job = executor.submit(getDegreeListsVertices,G,c,calcUntilLayer) 449 | futures[job] = part 450 | part += 1 451 | 452 | for job in as_completed(futures): 453 | dl = job.result() 454 | v = futures[job] 455 | degreeList.update(dl) 456 | 457 | logging.info("Saving degreeList on disk...") 458 | saveVariableOnDisk(degreeList,'degreeList') 459 | t1 = time() 460 | logging.info('Execution time - BFS: {}m'.format((t1-t0)/60)) 461 | 462 | 463 | return 464 | 465 | 466 | def generate_distances_network_part1(workers): 467 | parts = workers 468 | weights_distances = {} 469 | for part in range(1,parts + 1): 470 | 471 | logging.info('Executing part {}...'.format(part)) 472 | distances = restoreVariableFromDisk('distances-'+str(part)) 473 | 474 | for vertices,layers in distances.iteritems(): 475 | for layer,distance in layers.iteritems(): 476 | vx = vertices[0] 477 | vy = vertices[1] 478 | if(layer not in weights_distances): 479 | weights_distances[layer] = {} 480 | weights_distances[layer][vx,vy] = distance 481 | 482 | logging.info('Part {} executed.'.format(part)) 483 | 484 | for layer,values in weights_distances.iteritems(): 485 | saveVariableOnDisk(values,'weights_distances-layer-'+str(layer)) 486 | return 487 | 488 | def generate_distances_network_part2(workers): 489 | parts = workers 490 | graphs = {} 491 | for part in range(1,parts + 1): 492 | 493 | logging.info('Executing part {}...'.format(part)) 494 | distances = restoreVariableFromDisk('distances-'+str(part)) 495 | 496 | for vertices,layers in distances.iteritems(): 497 | for layer,distance in layers.iteritems(): 498 | vx = vertices[0] 499 | vy = vertices[1] 500 | if(layer not in graphs): 501 | graphs[layer] = {} 502 | if(vx not in graphs[layer]): 503 | graphs[layer][vx] = [] 504 | if(vy not in graphs[layer]): 505 | graphs[layer][vy] = [] 506 | graphs[layer][vx].append(vy) 507 | graphs[layer][vy].append(vx) 508 | logging.info('Part {} executed.'.format(part)) 509 | 510 | for layer,values in graphs.iteritems(): 511 | saveVariableOnDisk(values,'graphs-layer-'+str(layer)) 512 | 513 | return 514 | 515 | def generate_distances_network_part3(): 516 | 517 | layer = 0 518 | while(isPickle('graphs-layer-'+str(layer))): 519 | graphs = restoreVariableFromDisk('graphs-layer-'+str(layer)) 520 | weights_distances = restoreVariableFromDisk('weights_distances-layer-'+str(layer)) 521 | 522 | logging.info('Executing layer {}...'.format(layer)) 523 | alias_method_j = {} 524 | alias_method_q = {} 525 | weights = {} 526 | 527 | for v,neighbors in graphs.iteritems(): 528 | e_list = deque() 529 | sum_w = 0.0 530 | 531 | 532 | for n in neighbors: 533 | if (v,n) in weights_distances: 534 | wd = weights_distances[v,n] 535 | else: 536 | wd = weights_distances[n,v] 537 | w = np.exp(-float(wd)) 538 | e_list.append(w) 539 | sum_w += w 540 | 541 | e_list = [x / sum_w for x in e_list] 542 | weights[v] = e_list 543 | J, q = alias_setup(e_list) 544 | alias_method_j[v] = J 545 | alias_method_q[v] = q 546 | 547 | saveVariableOnDisk(weights,'distances_nets_weights-layer-'+str(layer)) 548 | saveVariableOnDisk(alias_method_j,'alias_method_j-layer-'+str(layer)) 549 | saveVariableOnDisk(alias_method_q,'alias_method_q-layer-'+str(layer)) 550 | logging.info('Layer {} executed.'.format(layer)) 551 | layer += 1 552 | 553 | logging.info('Weights created.') 554 | 555 | return 556 | 557 | 558 | def generate_distances_network_part4(): 559 | logging.info('Consolidating graphs...') 560 | graphs_c = {} 561 | layer = 0 562 | while(isPickle('graphs-layer-'+str(layer))): 563 | logging.info('Executing layer {}...'.format(layer)) 564 | graphs = restoreVariableFromDisk('graphs-layer-'+str(layer)) 565 | graphs_c[layer] = graphs 566 | logging.info('Layer {} executed.'.format(layer)) 567 | layer += 1 568 | 569 | 570 | logging.info("Saving distancesNets on disk...") 571 | saveVariableOnDisk(graphs_c,'distances_nets_graphs') 572 | logging.info('Graphs consolidated.') 573 | return 574 | 575 | def generate_distances_network_part5(): 576 | alias_method_j_c = {} 577 | layer = 0 578 | while(isPickle('alias_method_j-layer-'+str(layer))): 579 | logging.info('Executing layer {}...'.format(layer)) 580 | alias_method_j = restoreVariableFromDisk('alias_method_j-layer-'+str(layer)) 581 | alias_method_j_c[layer] = alias_method_j 582 | logging.info('Layer {} executed.'.format(layer)) 583 | layer += 1 584 | 585 | logging.info("Saving nets_weights_alias_method_j on disk...") 586 | saveVariableOnDisk(alias_method_j_c,'nets_weights_alias_method_j') 587 | 588 | return 589 | 590 | def generate_distances_network_part6(): 591 | alias_method_q_c = {} 592 | layer = 0 593 | while(isPickle('alias_method_q-layer-'+str(layer))): 594 | logging.info('Executing layer {}...'.format(layer)) 595 | alias_method_q = restoreVariableFromDisk('alias_method_q-layer-'+str(layer)) 596 | alias_method_q_c[layer] = alias_method_q 597 | logging.info('Layer {} executed.'.format(layer)) 598 | layer += 1 599 | 600 | logging.info("Saving nets_weights_alias_method_q on disk...") 601 | saveVariableOnDisk(alias_method_q_c,'nets_weights_alias_method_q') 602 | 603 | return 604 | 605 | def generate_distances_network(workers): 606 | t0 = time() 607 | logging.info('Creating distance network...') 608 | 609 | os.system("rm "+returnPathStruc2vec()+"/../pickles/weights_distances-layer-*.pickle") 610 | with ProcessPoolExecutor(max_workers=1) as executor: 611 | job = executor.submit(generate_distances_network_part1,workers) 612 | job.result() 613 | t1 = time() 614 | t = t1-t0 615 | logging.info('- Time - part 1: {}s'.format(t)) 616 | 617 | t0 = time() 618 | os.system("rm "+returnPathStruc2vec()+"/../pickles/graphs-layer-*.pickle") 619 | with ProcessPoolExecutor(max_workers=1) as executor: 620 | job = executor.submit(generate_distances_network_part2,workers) 621 | job.result() 622 | t1 = time() 623 | t = t1-t0 624 | logging.info('- Time - part 2: {}s'.format(t)) 625 | logging.info('distance network created.') 626 | 627 | logging.info('Transforming distances into weights...') 628 | 629 | t0 = time() 630 | os.system("rm "+returnPathStruc2vec()+"/../pickles/distances_nets_weights-layer-*.pickle") 631 | os.system("rm "+returnPathStruc2vec()+"/../pickles/alias_method_j-layer-*.pickle") 632 | os.system("rm "+returnPathStruc2vec()+"/../pickles/alias_method_q-layer-*.pickle") 633 | with ProcessPoolExecutor(max_workers=1) as executor: 634 | job = executor.submit(generate_distances_network_part3) 635 | job.result() 636 | t1 = time() 637 | t = t1-t0 638 | logging.info('- Time - part 3: {}s'.format(t)) 639 | 640 | t0 = time() 641 | with ProcessPoolExecutor(max_workers=1) as executor: 642 | job = executor.submit(generate_distances_network_part4) 643 | job.result() 644 | t1 = time() 645 | t = t1-t0 646 | logging.info('- Time - part 4: {}s'.format(t)) 647 | 648 | t0 = time() 649 | with ProcessPoolExecutor(max_workers=1) as executor: 650 | job = executor.submit(generate_distances_network_part5) 651 | job.result() 652 | t1 = time() 653 | t = t1-t0 654 | logging.info('- Time - part 5: {}s'.format(t)) 655 | 656 | t0 = time() 657 | with ProcessPoolExecutor(max_workers=1) as executor: 658 | job = executor.submit(generate_distances_network_part6) 659 | job.result() 660 | t1 = time() 661 | t = t1-t0 662 | logging.info('- Time - part 6: {}s'.format(t)) 663 | 664 | return 665 | 666 | 667 | def alias_setup(probs): 668 | ''' 669 | Compute utility lists for non-uniform sampling from discrete distributions. 670 | Refer to https://hips.seas.harvard.edu/blog/2013/03/03/the-alias-method-efficient-sampling-with-many-discrete-outcomes/ 671 | for details 672 | ''' 673 | K = len(probs) 674 | q = np.zeros(K) 675 | J = np.zeros(K, dtype=np.int) 676 | 677 | smaller = [] 678 | larger = [] 679 | for kk, prob in enumerate(probs): 680 | q[kk] = K*prob 681 | if q[kk] < 1.0: 682 | smaller.append(kk) 683 | else: 684 | larger.append(kk) 685 | 686 | while len(smaller) > 0 and len(larger) > 0: 687 | small = smaller.pop() 688 | large = larger.pop() 689 | 690 | J[small] = large 691 | q[large] = q[large] + q[small] - 1.0 692 | if q[large] < 1.0: 693 | smaller.append(large) 694 | else: 695 | larger.append(large) 696 | 697 | return J, q 698 | -------------------------------------------------------------------------------- /src/graph.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """Graph utilities.""" 5 | 6 | import logging 7 | import sys 8 | import math 9 | from io import open 10 | from os import path 11 | from time import time 12 | from glob import glob 13 | from six.moves import range, zip, zip_longest 14 | from six import iterkeys 15 | from collections import defaultdict, Iterable 16 | from multiprocessing import cpu_count 17 | import random 18 | from random import shuffle 19 | from itertools import product,permutations 20 | import collections 21 | 22 | from concurrent.futures import ProcessPoolExecutor 23 | 24 | from multiprocessing import Pool 25 | from multiprocessing import cpu_count 26 | 27 | #novas importações 28 | import numpy as np 29 | import operator 30 | 31 | 32 | class Graph(defaultdict): 33 | """Efficient basic implementation of nx `Graph' – Undirected graphs with self loops""" 34 | def __init__(self): 35 | super(Graph, self).__init__(list) 36 | 37 | def nodes(self): 38 | return self.keys() 39 | 40 | def adjacency_iter(self): 41 | return self.iteritems() 42 | 43 | def subgraph(self, nodes={}): 44 | subgraph = Graph() 45 | 46 | for n in nodes: 47 | if n in self: 48 | subgraph[n] = [x for x in self[n] if x in nodes] 49 | 50 | return subgraph 51 | 52 | def make_undirected(self): 53 | 54 | t0 = time() 55 | 56 | for v in self.keys(): 57 | for other in self[v]: 58 | if v != other: 59 | self[other].append(v) 60 | 61 | t1 = time() 62 | #logger.info('make_directed: added missing edges {}s'.format(t1-t0)) 63 | 64 | self.make_consistent() 65 | return self 66 | 67 | def make_consistent(self): 68 | t0 = time() 69 | for k in iterkeys(self): 70 | self[k] = list(sorted(set(self[k]))) 71 | 72 | t1 = time() 73 | #logger.info('make_consistent: made consistent in {}s'.format(t1-t0)) 74 | 75 | #self.remove_self_loops() 76 | 77 | return self 78 | 79 | def remove_self_loops(self): 80 | 81 | removed = 0 82 | t0 = time() 83 | 84 | for x in self: 85 | if x in self[x]: 86 | self[x].remove(x) 87 | removed += 1 88 | 89 | t1 = time() 90 | 91 | #logger.info('remove_self_loops: removed {} loops in {}s'.format(removed, (t1-t0))) 92 | return self 93 | 94 | def check_self_loops(self): 95 | for x in self: 96 | for y in self[x]: 97 | if x == y: 98 | return True 99 | 100 | return False 101 | 102 | def has_edge(self, v1, v2): 103 | if v2 in self[v1] or v1 in self[v2]: 104 | return True 105 | return False 106 | 107 | def degree(self, nodes=None): 108 | if isinstance(nodes, Iterable): 109 | return {v:len(self[v]) for v in nodes} 110 | else: 111 | return len(self[nodes]) 112 | 113 | def order(self): 114 | "Returns the number of nodes in the graph" 115 | return len(self) 116 | 117 | def number_of_edges(self): 118 | "Returns the number of nodes in the graph" 119 | return sum([self.degree(x) for x in self.keys()])/2 120 | 121 | def number_of_nodes(self): 122 | "Returns the number of nodes in the graph" 123 | return self.order() 124 | 125 | def gToDict(self): 126 | d = {} 127 | for k,v in self.iteritems(): 128 | d[k] = v 129 | return d 130 | 131 | def printAdjList(self): 132 | for key,value in self.iteritems(): 133 | print (key,":",value) 134 | 135 | 136 | 137 | def clique(size): 138 | return from_adjlist(permutations(range(1,size+1))) 139 | 140 | # http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python 141 | def grouper(n, iterable, padvalue=None): 142 | "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 143 | return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue) 144 | 145 | def parse_adjacencylist(f): 146 | adjlist = [] 147 | for l in f: 148 | if l and l[0] != "#": 149 | introw = [int(x) for x in l.strip().split()] 150 | row = [introw[0]] 151 | row.extend(set(sorted(introw[1:]))) 152 | adjlist.extend([row]) 153 | 154 | return adjlist 155 | 156 | def parse_adjacencylist_unchecked(f): 157 | adjlist = [] 158 | for l in f: 159 | if l and l[0] != "#": 160 | adjlist.extend([[int(x) for x in l.strip().split()]]) 161 | return adjlist 162 | 163 | def load_adjacencylist(file_, undirected=False, chunksize=10000, unchecked=True): 164 | 165 | if unchecked: 166 | parse_func = parse_adjacencylist_unchecked 167 | convert_func = from_adjlist_unchecked 168 | else: 169 | parse_func = parse_adjacencylist 170 | convert_func = from_adjlist 171 | 172 | adjlist = [] 173 | 174 | t0 = time() 175 | 176 | with open(file_) as f: 177 | with ProcessPoolExecutor(max_workers=cpu_count()) as executor: 178 | total = 0 179 | for idx, adj_chunk in enumerate(executor.map(parse_func, grouper(int(chunksize), f))): 180 | adjlist.extend(adj_chunk) 181 | total += len(adj_chunk) 182 | 183 | t1 = time() 184 | 185 | logging.info('Parsed {} edges with {} chunks in {}s'.format(total, idx, t1-t0)) 186 | 187 | t0 = time() 188 | G = convert_func(adjlist) 189 | t1 = time() 190 | 191 | logging.info('Converted edges to graph in {}s'.format(t1-t0)) 192 | 193 | if undirected: 194 | t0 = time() 195 | G = G.make_undirected() 196 | t1 = time() 197 | logging.info('Made graph undirected in {}s'.format(t1-t0)) 198 | 199 | return G 200 | 201 | 202 | def load_edgelist(file_, undirected=True): 203 | G = Graph() 204 | with open(file_) as f: 205 | for l in f: 206 | if(len(l.strip().split()[:2]) > 1): 207 | x, y = l.strip().split()[:2] 208 | x = int(x) 209 | y = int(y) 210 | G[x].append(y) 211 | if undirected: 212 | G[y].append(x) 213 | else: 214 | x = l.strip().split()[:2] 215 | x = int(x[0]) 216 | G[x] = [] 217 | 218 | G.make_consistent() 219 | return G 220 | 221 | 222 | def load_matfile(file_, variable_name="network", undirected=True): 223 | mat_varables = loadmat(file_) 224 | mat_matrix = mat_varables[variable_name] 225 | 226 | return from_numpy(mat_matrix, undirected) 227 | 228 | 229 | def from_networkx(G_input, undirected=True): 230 | G = Graph() 231 | 232 | for idx, x in enumerate(G_input.nodes_iter()): 233 | for y in iterkeys(G_input[x]): 234 | G[x].append(y) 235 | 236 | if undirected: 237 | G.make_undirected() 238 | 239 | return G 240 | 241 | 242 | def from_numpy(x, undirected=True): 243 | G = Graph() 244 | 245 | if issparse(x): 246 | cx = x.tocoo() 247 | for i,j,v in zip(cx.row, cx.col, cx.data): 248 | G[i].append(j) 249 | else: 250 | raise Exception("Dense matrices not yet supported.") 251 | 252 | if undirected: 253 | G.make_undirected() 254 | 255 | G.make_consistent() 256 | return G 257 | 258 | 259 | def from_adjlist(adjlist): 260 | G = Graph() 261 | 262 | for row in adjlist: 263 | node = row[0] 264 | neighbors = row[1:] 265 | G[node] = list(sorted(set(neighbors))) 266 | 267 | return G 268 | 269 | 270 | def from_adjlist_unchecked(adjlist): 271 | G = Graph() 272 | 273 | for row in adjlist: 274 | node = row[0] 275 | neighbors = row[1:] 276 | G[node] = neighbors 277 | 278 | return G 279 | 280 | 281 | def from_dict(d): 282 | G = Graph() 283 | for k,v in d.iteritems(): 284 | G[k] = v 285 | 286 | return G 287 | 288 | -------------------------------------------------------------------------------- /src/main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import argparse, logging 5 | import numpy as np 6 | import struc2vec 7 | from gensim.models import Word2Vec 8 | from gensim.models.word2vec import LineSentence 9 | from time import time 10 | 11 | import graph 12 | 13 | logging.basicConfig(filename='struc2vec.log',filemode='w',level=logging.DEBUG,format='%(asctime)s %(message)s') 14 | 15 | def parse_args(): 16 | ''' 17 | Parses the struc2vec arguments. 18 | ''' 19 | parser = argparse.ArgumentParser(description="Run struc2vec.") 20 | 21 | parser.add_argument('--input', nargs='?', default='graph/karate.edgelist', 22 | help='Input graph path') 23 | 24 | parser.add_argument('--output', nargs='?', default='emb/karate.emb', 25 | help='Embeddings path') 26 | 27 | parser.add_argument('--dimensions', type=int, default=128, 28 | help='Number of dimensions. Default is 128.') 29 | 30 | parser.add_argument('--walk-length', type=int, default=80, 31 | help='Length of walk per source. Default is 80.') 32 | 33 | parser.add_argument('--num-walks', type=int, default=10, 34 | help='Number of walks per source. Default is 10.') 35 | 36 | parser.add_argument('--window-size', type=int, default=10, 37 | help='Context size for optimization. Default is 10.') 38 | 39 | parser.add_argument('--until-layer', type=int, default=None, 40 | help='Calculation until the layer.') 41 | 42 | parser.add_argument('--iter', default=5, type=int, 43 | help='Number of epochs in SGD') 44 | 45 | parser.add_argument('--workers', type=int, default=4, 46 | help='Number of parallel workers. Default is 8.') 47 | 48 | parser.add_argument('--weighted', dest='weighted', action='store_true', 49 | help='Boolean specifying (un)weighted. Default is unweighted.') 50 | parser.add_argument('--unweighted', dest='unweighted', action='store_false') 51 | parser.set_defaults(weighted=False) 52 | 53 | parser.add_argument('--directed', dest='directed', action='store_true', 54 | help='Graph is (un)directed. Default is undirected.') 55 | parser.add_argument('--undirected', dest='undirected', action='store_false') 56 | parser.set_defaults(directed=False) 57 | 58 | parser.add_argument('--OPT1', default=False, type=bool, 59 | help='optimization 1') 60 | parser.add_argument('--OPT2', default=False, type=bool, 61 | help='optimization 2') 62 | parser.add_argument('--OPT3', default=False, type=bool, 63 | help='optimization 3') 64 | return parser.parse_args() 65 | 66 | def read_graph(): 67 | ''' 68 | Reads the input network. 69 | ''' 70 | logging.info(" - Loading graph...") 71 | G = graph.load_edgelist(args.input,undirected=True) 72 | logging.info(" - Graph loaded.") 73 | return G 74 | 75 | def learn_embeddings(): 76 | ''' 77 | Learn embeddings by optimizing the Skipgram objective using SGD. 78 | ''' 79 | logging.info("Initializing creation of the representations...") 80 | walks = LineSentence('random_walks.txt') 81 | model = Word2Vec(walks, size=args.dimensions, window=args.window_size, min_count=0, hs=1, sg=1, workers=args.workers, iter=args.iter) 82 | model.wv.save_word2vec_format(args.output) 83 | logging.info("Representations created.") 84 | 85 | return 86 | 87 | def exec_struc2vec(args): 88 | ''' 89 | Pipeline for representational learning for all nodes in a graph. 90 | ''' 91 | if(args.OPT3): 92 | until_layer = args.until_layer 93 | else: 94 | until_layer = None 95 | 96 | G = read_graph() 97 | G = struc2vec.Graph(G, args.directed, args.workers, untilLayer = until_layer) 98 | 99 | if(args.OPT1): 100 | G.preprocess_neighbors_with_bfs_compact() 101 | else: 102 | G.preprocess_neighbors_with_bfs() 103 | 104 | if(args.OPT2): 105 | G.create_vectors() 106 | G.calc_distances(compactDegree = args.OPT1) 107 | else: 108 | G.calc_distances_all_vertices(compactDegree = args.OPT1) 109 | 110 | 111 | G.create_distances_network() 112 | G.preprocess_parameters_random_walk() 113 | 114 | G.simulate_walks(args.num_walks, args.walk_length) 115 | 116 | 117 | return G 118 | 119 | def main(args): 120 | 121 | G = exec_struc2vec(args) 122 | 123 | learn_embeddings() 124 | 125 | 126 | if __name__ == "__main__": 127 | args = parse_args() 128 | main(args) 129 | 130 | -------------------------------------------------------------------------------- /src/struc2vec.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import numpy as np 4 | import random,sys,logging 5 | from concurrent.futures import ProcessPoolExecutor, as_completed 6 | from multiprocessing import Manager 7 | from time import time 8 | from collections import deque 9 | 10 | from utils import * 11 | from algorithms import * 12 | from algorithms_distances import * 13 | import graph 14 | 15 | 16 | class Graph(): 17 | def __init__(self, g, is_directed, workers, untilLayer = None): 18 | 19 | logging.info(" - Converting graph to dict...") 20 | self.G = g.gToDict() 21 | logging.info("Graph converted.") 22 | 23 | self.num_vertices = g.number_of_nodes() 24 | self.num_edges = g.number_of_edges() 25 | self.is_directed = is_directed 26 | self.workers = workers 27 | self.calcUntilLayer = untilLayer 28 | logging.info('Graph - Number of vertices: {}'.format(self.num_vertices)) 29 | logging.info('Graph - Number of edges: {}'.format(self.num_edges)) 30 | 31 | 32 | def preprocess_neighbors_with_bfs(self): 33 | 34 | with ProcessPoolExecutor(max_workers=self.workers) as executor: 35 | job = executor.submit(exec_bfs,self.G,self.workers,self.calcUntilLayer) 36 | 37 | job.result() 38 | 39 | return 40 | 41 | def preprocess_neighbors_with_bfs_compact(self): 42 | 43 | with ProcessPoolExecutor(max_workers=self.workers) as executor: 44 | job = executor.submit(exec_bfs_compact,self.G,self.workers,self.calcUntilLayer) 45 | 46 | job.result() 47 | 48 | return 49 | 50 | def preprocess_degree_lists(self): 51 | 52 | with ProcessPoolExecutor(max_workers=self.workers) as executor: 53 | job = executor.submit(preprocess_degreeLists) 54 | 55 | job.result() 56 | 57 | return 58 | 59 | 60 | def create_vectors(self): 61 | logging.info("Creating degree vectors...") 62 | degrees = {} 63 | degrees_sorted = set() 64 | G = self.G 65 | for v in G.keys(): 66 | degree = len(G[v]) 67 | degrees_sorted.add(degree) 68 | if(degree not in degrees): 69 | degrees[degree] = {} 70 | degrees[degree]['vertices'] = deque() 71 | degrees[degree]['vertices'].append(v) 72 | degrees_sorted = np.array(list(degrees_sorted),dtype='int') 73 | degrees_sorted = np.sort(degrees_sorted) 74 | 75 | l = len(degrees_sorted) 76 | for index, degree in enumerate(degrees_sorted): 77 | if(index > 0): 78 | degrees[degree]['before'] = degrees_sorted[index - 1] 79 | if(index < (l - 1)): 80 | degrees[degree]['after'] = degrees_sorted[index + 1] 81 | logging.info("Degree vectors created.") 82 | logging.info("Saving degree vectors...") 83 | saveVariableOnDisk(degrees,'degrees_vector') 84 | 85 | 86 | def calc_distances_all_vertices(self,compactDegree = False): 87 | 88 | logging.info("Using compactDegree: {}".format(compactDegree)) 89 | if(self.calcUntilLayer): 90 | logging.info("Calculations until layer: {}".format(self.calcUntilLayer)) 91 | 92 | futures = {} 93 | 94 | count_calc = 0 95 | 96 | vertices = list(reversed(sorted(self.G.keys()))) 97 | 98 | if(compactDegree): 99 | logging.info("Recovering degreeList from disk...") 100 | degreeList = restoreVariableFromDisk('compactDegreeList') 101 | else: 102 | logging.info("Recovering compactDegreeList from disk...") 103 | degreeList = restoreVariableFromDisk('degreeList') 104 | 105 | parts = self.workers 106 | chunks = partition(vertices,parts) 107 | 108 | t0 = time() 109 | 110 | with ProcessPoolExecutor(max_workers = self.workers) as executor: 111 | 112 | part = 1 113 | for c in chunks: 114 | logging.info("Executing part {}...".format(part)) 115 | list_v = [] 116 | for v in c: 117 | list_v.append([vd for vd in degreeList.keys() if vd > v]) 118 | job = executor.submit(calc_distances_all, c, list_v, degreeList,part, compactDegree = compactDegree) 119 | futures[job] = part 120 | part += 1 121 | 122 | 123 | logging.info("Receiving results...") 124 | 125 | for job in as_completed(futures): 126 | job.result() 127 | r = futures[job] 128 | logging.info("Part {} Completed.".format(r)) 129 | 130 | logging.info('Distances calculated.') 131 | t1 = time() 132 | logging.info('Time : {}m'.format((t1-t0)/60)) 133 | 134 | return 135 | 136 | 137 | def calc_distances(self, compactDegree = False): 138 | 139 | logging.info("Using compactDegree: {}".format(compactDegree)) 140 | if(self.calcUntilLayer): 141 | logging.info("Calculations until layer: {}".format(self.calcUntilLayer)) 142 | 143 | futures = {} 144 | #distances = {} 145 | 146 | count_calc = 0 147 | 148 | G = self.G 149 | vertices = G.keys() 150 | 151 | parts = self.workers 152 | chunks = partition(vertices,parts) 153 | 154 | with ProcessPoolExecutor(max_workers = 1) as executor: 155 | 156 | logging.info("Split degree List...") 157 | part = 1 158 | for c in chunks: 159 | job = executor.submit(splitDegreeList,part,c,G,compactDegree) 160 | job.result() 161 | logging.info("degreeList {} completed.".format(part)) 162 | part += 1 163 | 164 | 165 | with ProcessPoolExecutor(max_workers = self.workers) as executor: 166 | 167 | part = 1 168 | for c in chunks: 169 | logging.info("Executing part {}...".format(part)) 170 | job = executor.submit(calc_distances, part, compactDegree = compactDegree) 171 | futures[job] = part 172 | part += 1 173 | 174 | logging.info("Receiving results...") 175 | for job in as_completed(futures): 176 | job.result() 177 | r = futures[job] 178 | logging.info("Part {} completed.".format(r)) 179 | 180 | 181 | return 182 | 183 | def consolide_distances(self): 184 | 185 | distances = {} 186 | 187 | parts = self.workers 188 | for part in range(1,parts + 1): 189 | d = restoreVariableFromDisk('distances-'+str(part)) 190 | preprocess_consolides_distances(distances) 191 | distances.update(d) 192 | 193 | 194 | preprocess_consolides_distances(distances) 195 | saveVariableOnDisk(distances,'distances') 196 | 197 | 198 | def create_distances_network(self): 199 | 200 | with ProcessPoolExecutor(max_workers=1) as executor: 201 | job = executor.submit(generate_distances_network,self.workers) 202 | 203 | job.result() 204 | 205 | return 206 | 207 | def preprocess_parameters_random_walk(self): 208 | 209 | with ProcessPoolExecutor(max_workers=1) as executor: 210 | job = executor.submit(generate_parameters_random_walk,self.workers) 211 | 212 | job.result() 213 | 214 | return 215 | 216 | 217 | def simulate_walks(self,num_walks,walk_length): 218 | 219 | # for large graphs, it is serially executed, because of memory use. 220 | if(len(self.G) > 500000): 221 | 222 | with ProcessPoolExecutor(max_workers=1) as executor: 223 | job = executor.submit(generate_random_walks_large_graphs,num_walks,walk_length,self.workers,self.G.keys()) 224 | 225 | job.result() 226 | 227 | else: 228 | 229 | with ProcessPoolExecutor(max_workers=1) as executor: 230 | job = executor.submit(generate_random_walks,num_walks,walk_length,self.workers,self.G.keys()) 231 | 232 | job.result() 233 | 234 | 235 | return 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | -------------------------------------------------------------------------------- /src/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from time import time 3 | import logging,inspect 4 | import cPickle as pickle 5 | from itertools import islice 6 | import os.path 7 | 8 | dir_f = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 9 | folder_pickles = dir_f+"/../pickles/" 10 | 11 | def returnPathStruc2vec(): 12 | return dir_f 13 | 14 | def isPickle(fname): 15 | return os.path.isfile(dir_f+'/../pickles/'+fname+'.pickle') 16 | 17 | def chunks(data, SIZE=10000): 18 | it = iter(data) 19 | for i in xrange(0, len(data), SIZE): 20 | yield {k:data[k] for k in islice(it, SIZE)} 21 | 22 | def partition(lst, n): 23 | division = len(lst) / float(n) 24 | return [ lst[int(round(division * i)): int(round(division * (i + 1)))] for i in xrange(n) ] 25 | 26 | def restoreVariableFromDisk(name): 27 | logging.info('Recovering variable...') 28 | t0 = time() 29 | val = None 30 | with open(folder_pickles + name + '.pickle', 'rb') as handle: 31 | val = pickle.load(handle) 32 | t1 = time() 33 | logging.info('Variable recovered. Time: {}m'.format((t1-t0)/60)) 34 | 35 | return val 36 | 37 | def saveVariableOnDisk(f,name): 38 | logging.info('Saving variable on disk...') 39 | t0 = time() 40 | with open(folder_pickles + name + '.pickle', 'wb') as handle: 41 | pickle.dump(f, handle, protocol=pickle.HIGHEST_PROTOCOL) 42 | t1 = time() 43 | logging.info('Variable saved. Time: {}m'.format((t1-t0)/60)) 44 | 45 | return 46 | 47 | 48 | 49 | 50 | 51 | --------------------------------------------------------------------------------