Ejemplo n.º 1
0
def directed_erdos(nnodes,
                   density=None,
                   exp_nbrs=None,
                   size=1,
                   as_list=False,
                   random_order=True) -> Union[DAG, List[DAG]]:
    """
    Generate random Erdos-Renyi DAG(s) on `nnodes` nodes with density `density`.

    Parameters
    ----------
    nnodes:
        Number of nodes in each graph.
    density:
        Probability of any edge.
    size:
        Number of graphs.
    as_list:
        If True, always return as a list, even if only one DAG is generated.

    Examples
    --------
    >>> import causaldag as cd
    >>> d = cd.rand.directed_erdos(5, .5)
    """
    assert density is not None or exp_nbrs is not None
    density = density if density is not None else exp_nbrs / (nnodes - 1)
    if size == 1:
        # if density < .01:
        #     print('here')
        #     random_nx = fast_gnp_random_graph(nnodes, density, directed=True)
        #     d = DAG(nodes=set(range(nnodes)), arcs=random_nx.edges)
        #     return [d] if as_list else d
        bools = _coin(density, size=int(nnodes * (nnodes - 1) / 2))
        arcs = {(i, j)
                for (i, j), b in zip(itr.combinations(range(nnodes), 2), bools)
                if b}
        d = DAG(nodes=set(range(nnodes)), arcs=arcs)
        if random_order:
            nodes = list(range(nnodes))
            d = d.rename_nodes(dict(enumerate(np.random.permutation(nodes))))
        return [d] if as_list else d
    else:
        return [
            directed_erdos(nnodes, density, random_order=random_order)
            for _ in range(size)
        ]
Ejemplo n.º 2
0
def directed_erdos_with_confounders(
        nnodes: int,
        density: Optional[float] = None,
        exp_nbrs: Optional[float] = None,
        num_confounders: int = 1,
        confounder_pervasiveness: float = 1,
        size=1,
        as_list=False,
        random_order=True) -> Union[DAG, List[DAG]]:
    assert density is not None or exp_nbrs is not None
    density = density if density is not None else exp_nbrs / (nnodes - 1)

    if size == 1:
        confounders = list(range(num_confounders))
        nonconfounders = list(range(num_confounders, nnodes + num_confounders))
        bools = _coin(confounder_pervasiveness,
                      size=int(num_confounders * nnodes))
        confounder_arcs = {
            (i, j)
            for (i,
                 j), b in zip(itr.product(confounders, nonconfounders), bools)
            if b
        }
        bools = _coin(density, size=int(nnodes * (nnodes - 1) / 2))
        local_arcs = {
            (i, j)
            for (i, j), b in zip(itr.combinations(nonconfounders, 2), bools)
            if b
        }
        d = DAG(nodes=set(range(nnodes)), arcs=confounder_arcs | local_arcs)

        if random_order:
            nodes = list(range(nnodes + num_confounders))
            d = d.rename_nodes(dict(enumerate(np.random.permutation(nodes))))

        return [d] if as_list else d
    else:
        return [
            directed_erdos_with_confounders(
                nnodes,
                density,
                num_confounders=num_confounders,
                confounder_pervasiveness=confounder_pervasiveness,
                random_order=random_order) for _ in range(size)
        ]