Source code for experiments.align_narrow_DDs

"""Trying to figure if the heuristic performs worse for narrow DDs."""
import numpy as np
from BDD import BDD, intersect
from varseq import VarSeq
from BB_search import BBSearch

[docs]def main(): print("p=pA/pB: N, A_width, B_width, sim_AB, intVS_size, intA_size") N = 20 pA = 0.80 pB = 0.15 for _ in range(15): A = BDD.random(N=N, p=pA, weighted=True) B = BDD.random(N=N, p=pB, weighted=True) B.rename_vars(dict(zip([i for i in range(1, N+1)], np.random.permutation([i for i in range(1, N+1)])))) A.make_reduced() B.make_reduced() Bpp = B.align_to(A.vars, inplace=False) intA = intersect(A, Bpp) intA.make_reduced() vs_A = VarSeq(A.vars, [len(L) for L in A.layers[:-1]]) vs_B = VarSeq(B.vars, [len(L) for L in B.layers[:-1]]) assert set(vs_A.layer_var) == set( vs_B.layer_var), f"A:{vs_A.layer_var}, B:{vs_B.layer_var}" b = BBSearch(vs_A, vs_B) # bb.TIMEOUT_ITERATIONS=5000 status = b.search() assert status == "optimal" or status == "timeout", f"status: {status}" Ap = A.align_to(b.Ap_cand.layer_var, inplace=False) Bp = B.align_to(b.Ap_cand.layer_var, inplace=False) intVS = intersect(Ap, Bp) intVS.make_reduced() print(f"p={pA:.2f}/{pB:.2f}: {N}, {A.width()}, {B.width()}, {A.simscore(B):.2f}, {intVS.size()}, {intA.size()}")
if __name__ == '__main__': main()