|
2 | 2 | import pytest |
3 | 3 |
|
4 | 4 | import pywhy_graphs |
5 | | -from pywhy_graphs import ADMG |
| 5 | +from pywhy_graphs import ADMG, PAG |
6 | 6 | from pywhy_graphs.algorithms import all_vstructures |
7 | 7 |
|
8 | 8 |
|
@@ -496,3 +496,182 @@ def test_all_vstructures(): |
496 | 496 | # Assert that the returned values are as expected |
497 | 497 | assert len(v_structs_edges) == 0 |
498 | 498 | assert len(v_structs_tuples) == 0 |
| 499 | + |
| 500 | + |
| 501 | +def test_proper_possibly_directed(): |
| 502 | + # X <- Y <-> Z <-> H; Z -> X |
| 503 | + |
| 504 | + admg = ADMG() |
| 505 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 506 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 507 | + admg.add_edge("Z", "H", admg.directed_edge_name) |
| 508 | + |
| 509 | + Y = {"H"} |
| 510 | + X = {"Y"} |
| 511 | + |
| 512 | + correct = {("Y", "X", "Z", "H")} |
| 513 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 514 | + assert correct == out |
| 515 | + |
| 516 | + admg = ADMG() |
| 517 | + admg.add_edge("A", "X", admg.directed_edge_name) |
| 518 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 519 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 520 | + admg.add_edge("Z", "H", admg.directed_edge_name) |
| 521 | + |
| 522 | + Y = {"H"} |
| 523 | + X = {"Y", "A"} |
| 524 | + |
| 525 | + correct = {("Y", "X", "Z", "H"), ("A", "X", "Z", "H")} |
| 526 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 527 | + assert correct == out |
| 528 | + |
| 529 | + admg = ADMG() |
| 530 | + admg.add_edge("X", "A", admg.directed_edge_name) |
| 531 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 532 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 533 | + admg.add_edge("Z", "H", admg.directed_edge_name) |
| 534 | + |
| 535 | + Y = {"H"} |
| 536 | + X = {"Y", "A"} |
| 537 | + |
| 538 | + correct = {("Y", "X", "Z", "H")} |
| 539 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 540 | + assert correct == out |
| 541 | + |
| 542 | + admg = ADMG() |
| 543 | + admg.add_edge("X", "A", admg.directed_edge_name) |
| 544 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 545 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 546 | + admg.add_edge("Z", "H", admg.directed_edge_name) |
| 547 | + admg.add_edge("K", "Z", admg.directed_edge_name) |
| 548 | + |
| 549 | + Y = {"H", "K"} |
| 550 | + X = {"Y", "A"} |
| 551 | + |
| 552 | + correct = {("Y", "X", "Z", "H")} |
| 553 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 554 | + assert correct == out |
| 555 | + |
| 556 | + admg = ADMG() |
| 557 | + admg.add_edge("A", "X", admg.directed_edge_name) |
| 558 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 559 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 560 | + admg.add_edge("Z", "H", admg.directed_edge_name) |
| 561 | + admg.add_edge("Z", "K", admg.directed_edge_name) |
| 562 | + |
| 563 | + Y = {"H", "K"} |
| 564 | + X = {"Y", "A"} |
| 565 | + |
| 566 | + correct = { |
| 567 | + ("Y", "X", "Z", "K"), |
| 568 | + ("A", "X", "Z", "K"), |
| 569 | + ("Y", "X", "Z", "H"), |
| 570 | + ("A", "X", "Z", "H"), |
| 571 | + } |
| 572 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 573 | + assert correct == out |
| 574 | + |
| 575 | + admg = ADMG() |
| 576 | + admg.add_edge("A", "G", admg.directed_edge_name) |
| 577 | + admg.add_edge("G", "C", admg.directed_edge_name) |
| 578 | + admg.add_edge("C", "H", admg.directed_edge_name) |
| 579 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 580 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 581 | + admg.add_edge("Z", "K", admg.directed_edge_name) |
| 582 | + |
| 583 | + Y = {"H", "K"} |
| 584 | + X = {"Y", "A"} |
| 585 | + |
| 586 | + correct = {("Y", "X", "Z", "K"), ("A", "G", "C", "H")} |
| 587 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 588 | + assert correct == out |
| 589 | + |
| 590 | + admg = ADMG() |
| 591 | + admg.add_edge("A", "G", admg.directed_edge_name) |
| 592 | + admg.add_edge("G", "C", admg.directed_edge_name) |
| 593 | + admg.add_edge("C", "H", admg.directed_edge_name) |
| 594 | + admg.add_edge("Z", "C", admg.directed_edge_name) |
| 595 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 596 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 597 | + admg.add_edge("Z", "K", admg.directed_edge_name) |
| 598 | + |
| 599 | + Y = {"H", "K"} |
| 600 | + X = {"Y", "A"} |
| 601 | + |
| 602 | + correct = {("Y", "X", "Z", "K"), ("Y", "X", "Z", "C", "H"), ("A", "G", "C", "H")} |
| 603 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 604 | + assert correct == out |
| 605 | + |
| 606 | + admg = ADMG() |
| 607 | + admg.add_edge("A", "G", admg.directed_edge_name) |
| 608 | + admg.add_edge("A", "H", admg.directed_edge_name) |
| 609 | + admg.add_edge("K", "G", admg.directed_edge_name) |
| 610 | + admg.add_edge("K", "H", admg.directed_edge_name) |
| 611 | + |
| 612 | + Y = {"G", "H"} |
| 613 | + X = {"A", "K"} |
| 614 | + |
| 615 | + correct = {("K", "H"), ("K", "G"), ("A", "G"), ("A", "H")} |
| 616 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 617 | + assert correct == out |
| 618 | + |
| 619 | + admg = ADMG() |
| 620 | + admg.add_edge("A", "G", admg.directed_edge_name) |
| 621 | + admg.add_edge("G", "C", admg.directed_edge_name) |
| 622 | + admg.add_edge("C", "H", admg.directed_edge_name) |
| 623 | + admg.add_edge("Z", "C", admg.bidirected_edge_name) |
| 624 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 625 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 626 | + admg.add_edge("Z", "K", admg.directed_edge_name) |
| 627 | + |
| 628 | + Y = {"H", "K"} |
| 629 | + X = {"Y", "A"} |
| 630 | + |
| 631 | + correct = { |
| 632 | + ("A", "G", "C", "H"), |
| 633 | + ("Y", "X", "Z", "K"), |
| 634 | + } |
| 635 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 636 | + assert correct == out |
| 637 | + |
| 638 | + admg = ADMG() |
| 639 | + admg.add_edge("A", "G", admg.directed_edge_name) |
| 640 | + admg.add_edge("G", "C", admg.directed_edge_name) |
| 641 | + admg.add_edge("C", "H", admg.directed_edge_name) |
| 642 | + admg.add_edge("Z", "C", admg.bidirected_edge_name) |
| 643 | + admg.add_edge("Y", "X", admg.directed_edge_name) |
| 644 | + admg.add_edge("X", "Z", admg.directed_edge_name) |
| 645 | + admg.add_edge("Z", "K", admg.directed_edge_name) |
| 646 | + |
| 647 | + Y = {"H", "K"} |
| 648 | + X = {"Y", "A"} |
| 649 | + |
| 650 | + correct = {("Y", "X", "Z", "K"), ("A", "G", "C", "H")} |
| 651 | + out = pywhy_graphs.proper_possibly_directed_path(admg, X, Y) |
| 652 | + assert correct == out |
| 653 | + |
| 654 | + |
| 655 | +def test_ppdp_PAG(): |
| 656 | + |
| 657 | + pag = PAG() |
| 658 | + pag.add_edge("A", "G", pag.directed_edge_name) |
| 659 | + pag.add_edge("G", "C", pag.directed_edge_name) |
| 660 | + pag.add_edge("C", "H", pag.directed_edge_name) |
| 661 | + pag.add_edge("Z", "C", pag.circle_edge_name) |
| 662 | + pag.add_edge("C", "Z", pag.circle_edge_name) |
| 663 | + pag.add_edge("Y", "X", pag.directed_edge_name) |
| 664 | + pag.add_edge("X", "Z", pag.directed_edge_name) |
| 665 | + pag.add_edge("Z", "K", pag.directed_edge_name) |
| 666 | + |
| 667 | + Y = {"H", "K"} |
| 668 | + X = {"Y", "A"} |
| 669 | + |
| 670 | + correct = { |
| 671 | + ("Y", "X", "Z", "K"), |
| 672 | + ("Y", "X", "Z", "C", "H"), |
| 673 | + ("A", "G", "C", "H"), |
| 674 | + ("A", "G", "C", "Z", "K"), |
| 675 | + } |
| 676 | + out = pywhy_graphs.proper_possibly_directed_path(pag, X, Y) |
| 677 | + assert correct == out |
0 commit comments