From 96f44b91f486717f3d165f1b220b86cee92d9132 Mon Sep 17 00:00:00 2001 From: Devesh Date: Wed, 1 Nov 2023 21:07:19 -0500 Subject: [PATCH] Added in pandas converter tests --- .../preprocessing/test_torch_converter.py | 236 +++- test/test_data/train_edges_weights.txt | 1000 +++++++++++++++++ 2 files changed, 1233 insertions(+), 3 deletions(-) create mode 100644 test/test_data/train_edges_weights.txt diff --git a/test/python/preprocessing/test_torch_converter.py b/test/python/preprocessing/test_torch_converter.py index 3d760a23..3ab83fe4 100644 --- a/test/python/preprocessing/test_torch_converter.py +++ b/test/python/preprocessing/test_torch_converter.py @@ -14,11 +14,11 @@ import torch # isort:skip -test_files = ["train_edges.txt", "valid_edges.txt", "test_edges.txt"] +test_files = ["train_edges.txt", "train_edges_weights.txt", "valid_edges.txt", "test_edges.txt"] def validate_partitioned_output_dir( - output_dir: Path, expected_stats: DatasetConfig, num_partitions, dtype=np.int32, partitioned_eval=False + output_dir: Path, expected_stats: DatasetConfig, num_partitions, dtype=np.int32, partitioned_eval=False, has_weights = False, ): validate_output_dir(output_dir, expected_stats, dtype, remap_ids=True) @@ -56,6 +56,14 @@ def validate_partitioned_output_dir( offset += bucket_size assert offset == expected_stats.num_train + + if has_weights: + weights_file_path = output_dir / Path(PathConstants.train_edges_weights_path) + assert weights_file_path.exists() + values = np.memmap(weights_file_path, dtype=np.float32, mode='r') + values = np.sort(values) + for i in range(len(values)): + assert values[i] == float(i) def validate_output_dir(output_dir: Path, expected_stats: DatasetConfig, dtype=np.int32, remap_ids=True, has_weights = False): @@ -435,6 +443,32 @@ def test_torch_no_relation_no_remap(self): validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val) + def test_pandas_no_relation_no_remap(self): + remap_val = False + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + remap_ids = remap_val, + columns = [0, 2], + num_nodes = 100, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 1 + expected_stats.num_train = 1000 + + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val) + def test_torch_no_relation_remap(self): remap_val = True output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") @@ -465,6 +499,32 @@ def test_torch_no_relation_remap(self): validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val) + def test_pandas_no_relation_remap(self): + remap_val = True + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + remap_ids = remap_val, + columns = [0, 2], + num_nodes = 100, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 1 + expected_stats.num_train = 1000 + + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val) + def test_torch_only_weights_no_remap(self): remap_val = False output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") @@ -496,6 +556,33 @@ def test_torch_only_weights_no_remap(self): validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + def test_pandas_only_weights_no_remap(self): + remap_val = False + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + remap_ids = remap_val, + columns = [0, 2], + edge_weight_column = 3, + num_nodes = 100, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 1 + expected_stats.num_train = 1000 + + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + def test_torch_only_weights_remap(self): remap_val = True output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") @@ -527,6 +614,33 @@ def test_torch_only_weights_remap(self): validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + def test_pandas_only_weights_remap(self): + remap_val = True + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + remap_ids = remap_val, + columns = [0, 2], + edge_weight_column = 3, + num_nodes = 100, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 1 + expected_stats.num_train = 1000 + + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + def test_torch_relationship_weights_no_remap(self): remap_val = False output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") @@ -559,6 +673,34 @@ def test_torch_relationship_weights_no_remap(self): validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + def test_pandas_relationship_weights_no_remap(self): + remap_val = False + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + remap_ids = remap_val, + columns = [0, 1, 2], + edge_weight_column = 3, + num_nodes = 100, + num_rels = 10, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 10 + expected_stats.num_train = 1000 + + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + def test_torch_relationship_weights_remap(self): remap_val = True output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") @@ -588,4 +730,92 @@ def test_torch_relationship_weights_remap(self): expected_stats.num_relations = 10 expected_stats.num_train = 1000 - validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) \ No newline at end of file + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + + def test_pandas_relationship_weights_remap(self): + remap_val = True + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + remap_ids = remap_val, + columns = [0, 1, 2], + edge_weight_column = 3, + num_nodes = 100, + num_rels = 10, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 10 + expected_stats.num_train = 1000 + + validate_output_dir(output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, remap_ids = remap_val, has_weights = True) + + def test_torch_relationship_weights_remap_partioned(self): + num_paritions = 10 + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_df = pd.read_csv(Path(TMP_TEST_DIR) / Path("train_edges.txt"), header=None, sep=" ") + train_edges = torch.tensor(train_edges_df.to_numpy()) + + num_rows = train_edges.size(0) + train_edges = torch.column_stack((train_edges, torch.arange(num_rows))) + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges=train_edges, + columns = [0, 1, 2], + edge_weight_column = 3, + num_partitions = num_paritions, + format="pytorch" + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 10 + expected_stats.num_train = 1000 + + validate_partitioned_output_dir( + output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, num_partitions = num_paritions, has_weights = True, + ) + + def test_pandas_relationship_weights_remap_partioned(self): + num_paritions = 10 + output_dir = Path(TMP_TEST_DIR) / Path("test_torch_defaults") + output_dir.mkdir() + + train_edges_file = Path(TMP_TEST_DIR) / Path("train_edges_weights.txt") + + converter = TorchEdgeListConverter( + output_dir=output_dir, + train_edges = train_edges_file, + delim=" ", + columns = [0, 1, 2], + edge_weight_column = 3, + num_partitions = num_paritions, + ) + converter.convert() + + expected_stats = DatasetConfig() + expected_stats.dataset_dir = output_dir.__str__() + expected_stats.num_edges = 1000 + expected_stats.num_nodes = 100 + expected_stats.num_relations = 10 + expected_stats.num_train = 1000 + + validate_partitioned_output_dir( + output_dir=output_dir, expected_stats=expected_stats, dtype=np.int32, num_partitions = num_paritions, has_weights = True, + ) \ No newline at end of file diff --git a/test/test_data/train_edges_weights.txt b/test/test_data/train_edges_weights.txt new file mode 100644 index 00000000..5baa0644 --- /dev/null +++ b/test/test_data/train_edges_weights.txt @@ -0,0 +1,1000 @@ +80 6 73 0 +83 8 2 1 +50 8 66 2 +64 5 42 3 +31 5 91 4 +40 8 92 5 +18 2 32 6 +21 5 64 7 +47 8 19 8 +71 2 71 9 +12 5 11 10 +76 6 58 11 +12 6 24 12 +69 9 11 13 +12 3 55 14 +77 4 14 15 +12 8 8 16 +29 5 14 17 +46 8 8 18 +30 0 60 19 +46 6 7 20 +51 6 69 21 +0 2 52 22 +81 9 26 23 +50 0 78 24 +59 9 93 25 +62 5 12 26 +93 0 14 27 +72 7 31 28 +46 2 12 29 +44 3 67 30 +45 1 46 31 +0 2 56 32 +68 7 49 33 +51 2 21 34 +66 9 99 35 +93 2 74 36 +59 9 9 37 +12 6 3 38 +26 6 11 39 +8 7 13 40 +46 8 70 41 +50 8 2 42 +10 8 5 43 +20 1 3 44 +43 3 46 45 +51 5 70 46 +73 4 74 47 +95 7 50 48 +59 8 12 49 +46 4 99 50 +20 3 55 51 +39 3 24 52 +28 8 8 53 +31 5 22 54 +84 3 95 55 +48 3 50 56 +81 4 10 57 +66 7 4 58 +15 2 78 59 +68 6 23 60 +55 0 0 61 +58 0 48 62 +75 4 50 63 +9 4 20 64 +48 9 87 65 +97 3 94 66 +44 9 83 67 +87 8 37 68 +74 6 33 69 +10 9 8 70 +81 3 18 71 +42 0 7 72 +74 3 37 73 +37 7 33 74 +35 7 47 75 +19 4 8 76 +19 4 78 77 +87 4 2 78 +39 2 21 79 +79 8 74 80 +21 1 24 81 +25 5 33 82 +24 2 33 83 +12 6 98 84 +47 8 6 85 +30 2 94 86 +61 1 78 87 +80 0 83 88 +91 1 97 89 +24 6 5 90 +32 8 82 91 +40 7 34 92 +68 6 98 93 +76 8 19 94 +90 3 40 95 +90 1 77 96 +11 4 49 97 +10 3 82 98 +39 9 2 99 +15 0 85 100 +85 3 81 101 +67 2 80 102 +0 8 58 103 +77 9 48 104 +93 6 20 105 +67 4 62 106 +51 9 36 107 +74 3 76 108 +7 4 94 109 +23 9 46 110 +2 5 32 111 +48 7 49 112 +35 6 19 113 +52 2 33 114 +31 1 2 115 +54 3 26 116 +63 3 85 117 +40 1 43 118 +57 7 51 119 +74 3 59 120 +11 1 82 121 +13 9 23 122 +70 5 83 123 +6 2 25 124 +86 7 59 125 +71 0 62 126 +77 0 82 127 +63 8 88 128 +4 7 10 129 +36 6 73 130 +77 5 58 131 +6 2 4 132 +89 8 84 133 +8 8 80 134 +27 3 32 135 +22 1 96 136 +58 0 45 137 +62 8 19 138 +10 4 67 139 +5 7 21 140 +18 7 3 141 +59 0 96 142 +17 6 49 143 +82 3 39 144 +41 2 24 145 +43 0 22 146 +4 5 79 147 +76 7 29 148 +13 7 3 149 +2 9 52 150 +65 9 37 151 +46 1 65 152 +72 0 67 153 +42 8 83 154 +92 3 72 155 +46 4 97 156 +7 1 35 157 +10 5 23 158 +39 4 28 159 +78 3 7 160 +23 0 94 161 +86 1 22 162 +13 6 47 163 +15 4 8 164 +63 4 73 165 +63 7 54 166 +51 8 22 167 +74 7 90 168 +55 9 68 169 +55 8 89 170 +95 4 86 171 +70 8 34 172 +11 1 42 173 +74 8 32 174 +90 9 33 175 +25 8 65 176 +60 1 59 177 +34 9 45 178 +59 8 53 179 +1 2 75 180 +8 5 63 181 +79 9 30 182 +21 9 32 183 +4 5 2 184 +40 1 94 185 +3 2 20 186 +20 5 11 187 +52 9 77 188 +60 4 38 189 +22 8 68 190 +64 4 26 191 +44 7 32 192 +82 7 62 193 +58 8 55 194 +7 3 18 195 +15 6 53 196 +21 6 62 197 +99 0 22 198 +37 1 51 199 +1 6 46 200 +68 5 78 201 +34 0 92 202 +9 4 41 203 +8 5 46 204 +43 1 87 205 +96 5 78 206 +84 7 43 207 +72 3 60 208 +59 7 57 209 +28 0 83 210 +93 5 34 211 +78 2 36 212 +15 2 89 213 +68 3 71 214 +51 1 26 215 +67 2 67 216 +68 2 79 217 +85 3 66 218 +68 3 74 219 +21 3 28 220 +25 8 87 221 +82 3 67 222 +36 5 2 223 +38 9 12 224 +30 1 25 225 +89 7 45 226 +31 1 7 227 +22 8 72 228 +30 4 56 229 +14 7 60 230 +26 4 74 231 +74 0 1 232 +42 3 70 233 +91 0 85 234 +74 5 87 235 +83 0 0 236 +14 0 33 237 +48 4 18 238 +47 7 3 239 +34 8 74 240 +91 7 3 241 +13 6 56 242 +5 6 19 243 +43 5 80 244 +45 5 68 245 +41 2 29 246 +88 3 83 247 +39 4 42 248 +31 1 4 249 +51 6 13 250 +49 0 59 251 +0 0 37 252 +28 6 41 253 +58 0 94 254 +86 1 86 255 +96 0 22 256 +11 7 91 257 +61 2 5 258 +93 6 55 259 +17 5 63 260 +47 2 17 261 +93 6 42 262 +96 5 4 263 +73 1 35 264 +41 6 46 265 +8 3 69 266 +5 7 9 267 +38 3 27 268 +7 9 61 269 +10 9 75 270 +55 9 37 271 +53 1 18 272 +9 8 19 273 +58 1 56 274 +10 7 90 275 +15 2 13 276 +47 3 45 277 +74 6 60 278 +38 5 40 279 +32 4 30 280 +9 2 74 281 +85 5 37 282 +74 9 13 283 +4 5 37 284 +17 5 20 285 +88 8 11 286 +5 5 70 287 +71 2 74 288 +88 7 4 289 +71 4 89 290 +50 7 50 291 +3 2 77 292 +8 6 83 293 +30 9 74 294 +87 7 3 295 +58 3 32 296 +48 4 1 297 +93 5 99 298 +15 4 48 299 +59 6 18 300 +13 5 14 301 +42 0 4 302 +97 0 55 303 +41 7 7 304 +45 1 70 305 +47 1 49 306 +72 9 73 307 +73 6 18 308 +12 4 57 309 +65 6 2 310 +7 9 52 311 +76 3 78 312 +60 4 70 313 +69 2 17 314 +65 9 25 315 +44 7 7 316 +59 9 15 317 +39 4 7 318 +91 9 26 319 +82 9 51 320 +70 2 28 321 +29 3 38 322 +52 9 35 323 +22 5 83 324 +5 7 5 325 +61 7 98 326 +12 9 65 327 +44 7 89 328 +62 9 6 329 +87 4 26 330 +66 4 10 331 +84 9 49 332 +68 9 39 333 +56 0 52 334 +26 6 22 335 +42 6 64 336 +61 9 90 337 +78 5 39 338 +71 7 19 339 +1 0 89 340 +87 4 23 341 +23 0 52 342 +94 4 57 343 +7 0 85 344 +98 4 89 345 +87 7 39 346 +94 8 4 347 +45 1 93 348 +99 8 45 349 +21 1 79 350 +65 9 97 351 +85 5 14 352 +45 0 65 353 +41 5 12 354 +58 3 27 355 +88 4 86 356 +13 1 8 357 +71 4 39 358 +66 2 22 359 +89 6 53 360 +13 7 66 361 +61 5 91 362 +99 0 73 363 +76 3 3 364 +7 3 51 365 +61 6 93 366 +63 0 13 367 +33 7 96 368 +6 2 69 369 +68 2 65 370 +76 4 9 371 +66 0 37 372 +4 4 63 373 +76 2 26 374 +28 5 63 375 +92 9 82 376 +1 1 49 377 +43 5 20 378 +34 0 18 379 +38 7 2 380 +74 3 72 381 +71 5 76 382 +53 8 58 383 +61 7 45 384 +57 9 55 385 +79 7 87 386 +55 5 95 387 +10 1 54 388 +83 1 32 389 +74 6 61 390 +50 1 1 391 +89 5 87 392 +54 7 40 393 +83 7 48 394 +20 1 76 395 +57 2 80 396 +18 7 54 397 +56 2 13 398 +9 4 15 399 +76 7 48 400 +20 8 29 401 +34 3 95 402 +80 0 85 403 +79 4 17 404 +94 2 23 405 +46 2 94 406 +13 8 70 407 +31 2 28 408 +63 8 49 409 +83 2 97 410 +51 6 28 411 +64 0 5 412 +19 9 52 413 +69 0 27 414 +80 7 4 415 +39 9 81 416 +98 9 82 417 +28 9 81 418 +73 9 58 419 +68 7 40 420 +72 4 48 421 +9 2 65 422 +34 3 35 423 +62 0 3 424 +73 8 54 425 +13 2 38 426 +50 0 29 427 +81 2 96 428 +48 3 4 429 +58 5 97 430 +22 1 91 431 +41 7 14 432 +47 1 0 433 +44 8 58 434 +77 6 92 435 +65 6 73 436 +8 8 61 437 +74 0 2 438 +21 0 83 439 +80 9 92 440 +53 0 34 441 +85 8 55 442 +53 3 83 443 +32 6 33 444 +52 3 14 445 +34 1 14 446 +45 0 55 447 +93 5 79 448 +33 9 65 449 +79 7 27 450 +5 9 4 451 +99 7 26 452 +26 2 78 453 +36 4 9 454 +56 6 92 455 +82 7 21 456 +82 9 46 457 +99 2 90 458 +57 6 25 459 +97 4 4 460 +66 7 53 461 +79 3 23 462 +56 5 16 463 +23 8 88 464 +61 9 36 465 +27 1 51 466 +7 1 93 467 +27 7 38 468 +15 1 60 469 +83 1 5 470 +58 2 6 471 +14 4 95 472 +33 3 90 473 +45 8 88 474 +96 5 24 475 +42 5 94 476 +46 6 80 477 +31 2 65 478 +59 6 4 479 +16 4 13 480 +10 2 41 481 +81 3 73 482 +83 0 68 483 +11 0 26 484 +52 2 11 485 +75 3 81 486 +89 5 29 487 +75 9 66 488 +87 4 15 489 +73 3 10 490 +4 9 67 491 +76 2 35 492 +15 0 43 493 +37 5 93 494 +37 2 55 495 +61 4 12 496 +2 2 81 497 +4 0 69 498 +1 8 95 499 +7 4 72 500 +9 1 16 501 +25 8 88 502 +8 2 74 503 +65 3 30 504 +83 3 67 505 +42 4 1 506 +36 3 30 507 +19 1 23 508 +76 5 90 509 +83 8 13 510 +31 6 79 511 +87 6 36 512 +7 1 74 513 +0 6 69 514 +30 1 52 515 +57 0 89 516 +0 2 62 517 +55 8 25 518 +28 8 13 519 +50 9 20 520 +44 1 33 521 +48 2 77 522 +93 5 56 523 +29 6 97 524 +93 3 21 525 +4 2 94 526 +26 7 43 527 +20 0 28 528 +76 6 63 529 +15 5 66 530 +59 1 60 531 +29 4 7 532 +41 7 27 533 +40 4 97 534 +10 2 43 535 +44 6 76 536 +73 9 38 537 +88 4 89 538 +44 9 21 539 +73 9 17 540 +8 5 21 541 +9 0 85 542 +84 0 48 543 +36 3 89 544 +58 2 25 545 +27 5 5 546 +13 1 90 547 +50 3 51 548 +3 8 41 549 +79 3 69 550 +73 5 75 551 +71 6 32 552 +95 4 65 553 +65 0 98 554 +12 1 46 555 +93 8 60 556 +81 7 95 557 +48 5 30 558 +8 8 14 559 +83 1 47 560 +38 8 37 561 +58 7 12 562 +52 1 89 563 +86 0 0 564 +36 1 69 565 +20 0 56 566 +71 3 2 567 +94 6 92 568 +20 7 14 569 +53 2 1 570 +50 2 77 571 +91 6 57 572 +28 1 15 573 +26 9 97 574 +52 5 73 575 +19 7 32 576 +5 7 63 577 +27 7 73 578 +5 7 13 579 +48 9 89 580 +13 5 84 581 +48 8 11 582 +12 5 66 583 +13 8 39 584 +10 5 35 585 +30 0 79 586 +41 8 79 587 +72 9 70 588 +82 2 93 589 +49 9 5 590 +85 7 48 591 +95 4 22 592 +58 6 7 593 +45 5 87 594 +81 8 46 595 +69 7 99 596 +34 0 29 597 +57 3 57 598 +65 0 84 599 +29 3 78 600 +12 4 10 601 +93 7 5 602 +74 9 99 603 +53 0 77 604 +26 3 87 605 +62 0 99 606 +12 3 73 607 +58 3 92 608 +42 7 46 609 +98 7 15 610 +33 5 82 611 +51 3 66 612 +39 0 18 613 +23 0 14 614 +64 8 22 615 +31 9 42 616 +96 0 91 617 +73 0 21 618 +69 5 15 619 +46 7 47 620 +82 6 87 621 +96 3 79 622 +1 8 69 623 +31 7 5 624 +16 3 90 625 +45 7 94 626 +58 2 82 627 +51 0 44 628 +43 7 34 629 +2 3 26 630 +99 1 48 631 +17 8 45 632 +37 1 38 633 +12 5 81 634 +79 9 35 635 +69 3 76 636 +13 8 21 637 +8 5 67 638 +41 5 30 639 +74 2 53 640 +56 9 70 641 +86 6 8 642 +47 8 44 643 +46 9 82 644 +0 4 14 645 +80 1 47 646 +20 8 18 647 +83 2 22 648 +75 9 82 649 +71 8 55 650 +0 5 46 651 +93 7 11 652 +65 3 22 653 +26 8 88 654 +4 8 18 655 +23 5 6 656 +32 6 22 657 +26 3 94 658 +40 2 16 659 +4 0 77 660 +82 2 71 661 +2 8 74 662 +90 0 9 663 +92 4 98 664 +48 8 44 665 +47 2 53 666 +58 9 2 667 +97 9 12 668 +5 5 67 669 +24 9 56 670 +99 2 85 671 +19 1 14 672 +88 2 47 673 +95 2 49 674 +14 6 57 675 +56 7 94 676 +84 5 31 677 +5 6 96 678 +94 0 0 679 +33 0 38 680 +24 0 83 681 +77 5 62 682 +73 2 28 683 +53 4 21 684 +4 0 46 685 +30 5 34 686 +9 6 4 687 +11 3 31 688 +1 1 3 689 +86 5 42 690 +31 1 13 691 +73 4 13 692 +36 9 13 693 +27 4 2 694 +5 2 48 695 +60 9 19 696 +96 2 52 697 +69 9 96 698 +17 2 2 699 +73 8 67 700 +71 9 58 701 +31 1 54 702 +38 5 82 703 +3 0 67 704 +69 3 25 705 +50 6 98 706 +93 9 4 707 +48 7 47 708 +19 3 13 709 +40 5 77 710 +21 2 42 711 +42 1 23 712 +14 3 29 713 +42 4 38 714 +76 0 34 715 +85 6 0 716 +91 1 79 717 +75 8 58 718 +60 1 44 719 +29 2 4 720 +88 0 37 721 +53 8 28 722 +88 8 10 723 +54 6 24 724 +25 6 56 725 +26 8 79 726 +76 2 87 727 +36 9 84 728 +38 3 68 729 +84 7 50 730 +60 6 84 731 +60 3 24 732 +86 3 49 733 +52 7 56 734 +59 1 77 735 +26 4 19 736 +92 8 94 737 +18 3 6 738 +40 2 56 739 +38 2 49 740 +60 6 11 741 +35 9 30 742 +4 9 17 743 +24 5 51 744 +33 5 2 745 +3 7 82 746 +99 8 57 747 +61 9 28 748 +11 7 28 749 +31 6 73 750 +67 4 68 751 +43 5 56 752 +49 6 57 753 +78 2 87 754 +94 6 93 755 +85 2 47 756 +65 1 99 757 +98 1 63 758 +47 3 2 759 +50 8 4 760 +42 5 30 761 +77 0 85 762 +67 9 65 763 +26 3 65 764 +59 1 24 765 +36 0 76 766 +68 3 95 767 +34 6 96 768 +61 5 7 769 +44 0 59 770 +30 7 15 771 +81 2 14 772 +78 4 30 773 +20 3 65 774 +85 6 42 775 +41 7 43 776 +51 2 6 777 +26 7 25 778 +92 5 49 779 +90 0 61 780 +11 8 15 781 +77 2 31 782 +30 9 48 783 +88 9 93 784 +90 5 70 785 +57 5 17 786 +18 9 23 787 +56 2 82 788 +25 7 34 789 +26 1 9 790 +91 9 30 791 +49 8 99 792 +96 8 88 793 +93 2 65 794 +36 8 67 795 +40 5 76 796 +8 2 31 797 +92 4 66 798 +92 4 28 799 +13 2 73 800 +4 1 30 801 +83 4 6 802 +96 0 3 803 +12 9 45 804 +85 5 29 805 +34 0 39 806 +51 7 97 807 +3 9 85 808 +19 5 73 809 +92 2 38 810 +51 5 83 811 +71 9 79 812 +83 4 60 813 +62 8 77 814 +0 9 32 815 +70 7 95 816 +72 6 0 817 +69 4 95 818 +3 1 43 819 +62 9 20 820 +76 9 85 821 +84 4 79 822 +21 1 3 823 +20 5 83 824 +91 2 22 825 +83 3 21 826 +75 6 25 827 +56 1 74 828 +31 2 30 829 +66 8 3 830 +19 9 37 831 +19 5 11 832 +81 5 93 833 +68 4 38 834 +37 2 39 835 +56 8 97 836 +82 5 58 837 +81 2 65 838 +98 5 40 839 +78 6 53 840 +18 5 45 841 +42 9 29 842 +75 9 93 843 +99 8 14 844 +97 7 35 845 +33 4 41 846 +36 8 85 847 +42 3 54 848 +58 7 50 849 +3 7 53 850 +64 3 80 851 +0 7 23 852 +98 5 30 853 +71 8 86 854 +37 8 11 855 +90 2 12 856 +5 9 41 857 +54 9 58 858 +14 4 96 859 +16 5 97 860 +1 9 15 861 +41 4 9 862 +32 5 17 863 +96 7 71 864 +83 4 61 865 +21 3 81 866 +28 9 31 867 +96 8 39 868 +90 5 46 869 +65 6 63 870 +50 4 7 871 +43 7 21 872 +23 9 76 873 +54 0 47 874 +39 8 11 875 +71 4 90 876 +47 8 99 877 +46 5 71 878 +90 4 57 879 +81 4 89 880 +43 1 90 881 +32 1 72 882 +0 4 70 883 +47 5 34 884 +43 1 28 885 +13 1 69 886 +49 4 9 887 +36 7 38 888 +94 0 24 889 +64 4 11 890 +53 7 12 891 +17 5 12 892 +96 2 69 893 +99 7 75 894 +70 4 85 895 +93 6 64 896 +61 7 2 897 +47 2 50 898 +50 1 58 899 +3 4 18 900 +41 2 31 901 +45 2 49 902 +98 2 83 903 +88 2 40 904 +34 2 59 905 +86 2 99 906 +49 4 28 907 +20 0 24 908 +98 0 0 909 +51 4 78 910 +66 8 50 911 +37 2 77 912 +62 5 53 913 +97 1 20 914 +84 2 15 915 +48 3 95 916 +18 4 17 917 +20 5 9 918 +56 0 24 919 +90 8 64 920 +13 7 5 921 +80 5 19 922 +49 1 33 923 +20 2 12 924 +92 8 4 925 +25 7 28 926 +47 7 24 927 +84 4 61 928 +2 7 84 929 +0 0 25 930 +13 9 62 931 +17 4 4 932 +1 0 96 933 +59 6 6 934 +50 5 76 935 +69 1 60 936 +64 0 82 937 +37 0 96 938 +57 0 77 939 +60 5 89 940 +83 3 1 941 +23 5 86 942 +54 5 87 943 +83 8 76 944 +12 4 15 945 +13 6 86 946 +89 7 97 947 +12 8 2 948 +26 0 13 949 +64 4 48 950 +3 1 12 951 +86 1 68 952 +78 8 4 953 +96 3 14 954 +64 7 71 955 +51 7 72 956 +66 5 73 957 +86 4 17 958 +1 1 82 959 +91 9 71 960 +50 5 88 961 +60 6 81 962 +57 5 45 963 +30 7 6 964 +50 1 11 965 +84 7 30 966 +66 6 86 967 +39 4 47 968 +29 8 1 969 +82 7 30 970 +82 2 54 971 +35 3 74 972 +38 9 9 973 +64 8 88 974 +74 6 51 975 +58 4 30 976 +8 4 6 977 +72 3 63 978 +81 4 44 979 +90 4 1 980 +91 3 62 981 +19 4 53 982 +2 9 78 983 +70 0 84 984 +89 1 74 985 +66 3 0 986 +95 5 73 987 +44 9 94 988 +18 3 87 989 +6 5 90 990 +42 9 45 991 +17 1 41 992 +81 6 70 993 +72 0 42 994 +45 8 43 995 +16 5 31 996 +61 5 69 997 +87 3 6 998 +80 7 33 999