def test_cap_of_every_interval_pair_is_empty_or_an_interval_with_natural_bounds(
):
    counterexamples = set()
    for i, intervalLeftWrapped in enumerate(all3VecIntervals):
        intervalLeft = fv.hashableArrays_to_stack(intervalLeftWrapped)
        maxLeft, minLeft = fv.max_of(intervalLeft), fv.min_of(intervalLeft)
        for j, intervalRightWrapped in enumerate(all3VecIntervals):
            intervalRight = fv.hashableArrays_to_stack(intervalRightWrapped)
            maxRight, minRight = fv.max_of(intervalRight), fv.min_of(
                intervalRight)

            capSet = intervalLeftWrapped.intersection(intervalRightWrapped)
            capStack = fv.hashableArrays_to_stack(capSet)

            est_cap_max = fv.meet_specification(maxLeft, maxRight)
            est_cap_min = fv.join_specification(minLeft, minRight)
            if len(capSet) > 0:
                est_cap = fv.interval(est_cap_min, est_cap_max)
                est_capSet = fv.stack_to_set(est_cap)
                if not est_capSet == capSet:
                    counterexamples.add(
                        ((i, intervalLeftWrapped), (j, intervalRightWrapped),
                         (capSet, est_capSet)))
            else:
                assert est_cap_max is None or est_cap_min is None or not fv.lte_specification(
                    est_cap_min, est_cap_max), f"{est_cap_max}, {est_cap_min}"
    assert len(counterexamples) == 0, f"Counterexamples:\n{counterexamples}"
def test_right_inverse_is_associative():
    counterexamples = set()
    for xWrapped, yWrapped, zWrapped in all3VecTriplesSet:
        x, y, z = xWrapped.unwrap(), yWrapped.unwrap(), zWrapped.unwrap()
        xy = fv.right_inv_priority_union(x, y)
        xyWrapped = None if xy is None else fv.stack_to_set(xy)
        if xy is None:
            xy_z = None
        else:
            xy_zWrapped = set()
            for xyPrimeWrapped in xyWrapped:
                xyPrime = xyPrimeWrapped.unwrap()
                if fv.right_inv_priority_union(xyPrime, z) is not None:
                    xy_zWrapped.union(
                        fv.stack_to_set(fv.right_inv_priority_union(
                            xyPrime, z)))
            xy_z = fv.hashableArrays_to_stack(
                xy_zWrapped) if len(xy_zWrapped) > 0 else None
            # xy_z  = np.unique(fv.hashableArrays_to_stack(
            #     grand_union([
            #         fv.stack_to_set(fv.right_inv_priority_union(xyPrime, z))
            #         for xyPrime in xyWrapped if fv.right_inv_priority_union(xyPrime, z) is not None])
            # ), axis=0)
        yz = fv.right_inv_priority_union(y, z)
        yzWrapped = None if yz is None else fv.stack_to_set(yz)
        if yz is None:
            x_yz = None
        else:
            x_yzWrapped = set()
            for yzPrimeWrapped in yzWrapped:
                yzPrime = yzPrimeWrapped.unwrap()
                if fv.right_inv_priority_union(x, yzPrime) is not None:
                    x_yzWrapped.union(
                        fv.stack_to_set(fv.right_inv_priority_union(
                            x, yzPrime)))
            x_yz = fv.hashableArrays_to_stack(
                x_yzWrapped) if len(x_yzWrapped) > 0 else None
            # x_yz  = np.unique(fv.hashableArrays_to_stack(
            #     grand_union([
            #         fv.stack_to_set(fv.right_inv_priority_union(x, yzPrime))
            #         for yzPrime in yzWrapped if fv.right_inv_priority_union(x, yzPrime) is not None])
            # ), axis=0)
        # x_yz = None if yz is None else fv.right_inv_priority_union(x, yz)
        if xy_z is None and not x_yz is None:
            counterexamples.add((xWrapped, yWrapped, zWrapped))
        elif xy_z is not None and x_yz is None:
            counterexamples.add((xWrapped, yWrapped, zWrapped))
        elif xy_z is not None and x_yz is not None:
            if not np.array_equal(xy_z, x_yz):
                counterexamples.add((xWrapped, yWrapped, zWrapped))
        else:
            pass
    assert len(counterexamples) == 0, f"{counterexamples}"
def test_every_interval_is_a_bounded_lattice():
    counterexamples = set()
    for i, intervalWrapped in enumerate(all3VecIntervals):
        interval = fv.hashableArrays_to_stack(intervalWrapped)
        if not fv.is_bounded_lattice(interval):
            counterexamples.add(intervalWrapped)
    assert len(counterexamples) == 0, f"Counterexamples:\n{counterexamples}"
def test_complement_implementations_eq_on_LCs():
    counterexamples = set()
    for lcS in allLC3sCompressed:
        lc = fv.hashableArrays_to_stack(lcS)
        for xWrapped in lcS:
            x = xWrapped.unwrap()
            cStack = fv.complement_search(x, lc)
            c = np.expand_dims(fv.complement_exact(x, lc), axis=0)
            if not np.array_equal(cStack, c):
                counterexamples.add(
                    (lc, x, cStack, c, f"{lc}, {x} | {cStack} ≠ {c}"))
    assert len(counterexamples) == 0, f"Counterexamples:\n{counterexamples}"
def test_the_intersection_of_every_pair_of_intervals_is_empty_or_an_interval():
    counterexamples = set()
    for i, intervalLeftWrapped in enumerate(all3VecIntervals):
        # intervalLeft = fv.hashableArrays_to_stack(intervalLeftWrapped)
        for j, intervalRightWrapped in enumerate(all3VecIntervals):
            # intervalRight = fv.hashableArrays_to_stack(intervalRightWrapped)
            capSet = intervalLeftWrapped.intersection(intervalRightWrapped)
            capStack = fv.hashableArrays_to_stack(capSet)
            if len(capSet) > 0:
                # if not fv.is_bounded_lattice(capStack):
                if not capSet in all3VecIntervals:
                    counterexamples.add(
                        ((i, intervalLeftWrapped), (j, intervalRightWrapped)))
    assert len(counterexamples) == 0, f"Counterexamples:\n{counterexamples}"