def add_label(self, graph: PGM, text: str, x: float, y: float, label_id: str = None, color: str = None, size: str = None, weight: str = None): if label_id is None: label_id = str(uuid.uuid4()) graph.add_node( Node(label_id, text, x, y, plot_params={ 'fill': False, 'linewidth': 0.0 }, label_params={ 'color': color or 'black', 'size': size or 'small', 'weight': weight or 'normal' }))
def layer(self, graph: PGM, node_texts: List[str], x: float, y: float, spacing: float = 1, spacing_pow: float = 1, **other_node_params) -> List[Node]: nodes = [ Node(str(uuid.uuid4()), node_texts[i], x, y - (spacing * float(i)), **other_node_params) for i in range(len(node_texts)) ] for node in nodes: graph.add_node(node) return nodes
def convoluted_hierarchical_p(): G = PGM() G.add_node("likes", content="$l_{j, i}$", x=1, y=1, scale=1.2, observed=True) G.add_node("p_shop", content="$p_{j, i}$", x=1, y=2, scale=1.2) G.add_node("alpha_owner", content=r"$\alpha_{j}$", x=0, y=3, scale=1.2) G.add_node("beta_owner", content=r"$\beta_{j}$", x=2, y=3, scale=1.2) G.add_node("lambda_a_pop", content=r"$\lambda_{\alpha}$", x=0, y=4, scale=1.2) G.add_node("lambda_b_pop", content=r"$\lambda_{\beta}$", x=2, y=4, scale=1.2) G.add_node( "tau_lambda_a", content=r"$\tau_{\lambda_{\alpha}}$", x=0, y=5, fixed=True, ) G.add_node( "tau_lambda_b", content=r"$\tau_{\lambda_{\beta}}$", x=2, y=5, fixed=True, ) G.add_edge("alpha_owner", "p_shop") G.add_edge("beta_owner", "p_shop") G.add_edge("p_shop", "likes") G.add_edge("lambda_a_pop", "alpha_owner") G.add_edge("lambda_b_pop", "beta_owner") G.add_edge("tau_lambda_a", "lambda_a_pop") G.add_edge("tau_lambda_b", "lambda_b_pop") G.add_plate(plate=[0.5, 0.2, 1, 2.3], label=r"shop $i$") G.add_plate(plate=[-0.5, 0, 3, 3.5], label=r"owner $j$") G.render()
def hierarchical_pgm(): G = PGM() tfm_plot_params = {"ec": "red"} G.add_node("likes", content=r"$l_{j,i}$", x=0, y=0, scale=1.2, observed=True) G.add_node( "p_shop", content=r"$p_{j,i}$", x=0, y=1, scale=1.2, plot_params=tfm_plot_params, ) G.add_node("mu_shop", content=r"$\mu_{j,i}$", x=1, y=1, scale=1.2) G.add_node("mu_owner", content=r"$\mu_{j}$", x=1, y=2, scale=1.2) G.add_node("sigma_owner", content=r"$\sigma_{j}$", x=2, y=2, scale=1.2) G.add_node( "p_owner", content=r"$p_{j}$", x=0, y=2, scale=1.2, plot_params=tfm_plot_params, ) G.add_node("mu_population", content=r"$\mu$", x=1, y=3, scale=1.2) G.add_node( "sigma_population", content=r"$\sigma$", x=2, y=3, scale=1.2, fixed=True, ) G.add_node( "p_population", content="p", x=0, y=3, scale=1.2, plot_params=tfm_plot_params, ) G.add_node("lambda", content=r"$\lambda$", x=3, y=2, scale=1.2, fixed=True) G.add_node("mean_population", content="mean", x=1, y=4, scale=1.2, fixed=True) G.add_node( "variance_population", content="variance", x=2, y=4, scale=1.2, fixed=True, ) G.add_edge("mu_shop", "p_shop") G.add_edge("p_shop", "likes") G.add_edge("mu_owner", "mu_shop") G.add_edge("sigma_owner", "mu_shop") G.add_edge("mu_owner", "p_owner") G.add_edge("mu_population", "mu_owner") G.add_edge("sigma_population", "mu_owner") G.add_edge("mu_population", "p_population") G.add_edge("lambda", "sigma_owner") G.add_edge("mean_population", "mu_population") G.add_edge("variance_population", "mu_population") G.add_plate([-0.5, -0.5, 2, 2], label="shop $i$", position="bottom right") G.add_plate([-0.7, -0.7, 3.2, 3.2], label="owner $j$", position="bottom right") G.render()
def pgm(): from daft import PGM, Node, Plate from matplotlib import rc rc("font", family="serif", size=8) rc("text", usetex=True) pgm = PGM([9.5, 8.5], origin=[0., 0.2], observed_style='inner') #pgm.add_node(Node('dispersion',r"\center{$\sigma_{Ia}$ \newline $\sigma_{!Ia}$}", 1,6,scale=1.2,aspect=1.8)) pgm.add_node(Node('Rate_Ia', r"{SNIa Rate}", 1, 8, fixed=1)) pgm.add_node(Node('Rate_II', r"{SNII Rate}", 2, 8, scale=1.6, aspect=1.2)) pgm.add_node(Node('L_Ia', r"{SNIa L, $\sigma_L$}", 3, 8, scale=1.6, aspect=1.2)) pgm.add_node(Node('L_II', r"{SNII L, $\sigma_L$}", 4, 8, scale=1.6, aspect=1.2)) pgm.add_node(Node('Cosmology', r"Cosmology", 7, 8, scale=1.6, aspect=1.2)) pgm.add_node(Node('Calibration', r"Calibration", 8, 8, scale=1.6, aspect=1.2)) # pgm.add_node(Node('Neighbors',r"\centering{Neighbor \newline Redshifts}", 5,7, scale=1.6,aspect=1.2)) pgm.add_node(Node('Redshift', r"{Redshift}", 6, 7, scale=1.6, aspect=1.2)) pgm.add_node(Node('Type_prob', r"Type prob", 1, 6, fixed=1, offset=(20, -10))) pgm.add_node(Node('Distance', r"$L_D$", 7, 6, fixed=1, offset=(10, 10))) pgm.add_node(Node('Type', r"Type", 1, 5, scale=1.6, aspect=1.2)) pgm.add_node(Node('Luminosity', r"Luminosity", 4, 4, scale=1.6, aspect=1.2)) pgm.add_node(Node('Flux', r"Flux", 7, 3, scale=1.2, fixed=True, offset=(-20, -20))) pgm.add_node(Node('Obs_Type', r"Obs type", 1, 1, scale=1.6, aspect=1.2, observed=1)) pgm.add_node(Node('Obs_Redshift', r"Obs redshift", 6, 1, scale=1.6, aspect=1.2, observed=1)) pgm.add_node(Node('Counts', r"Counts", 8, 1, scale=1.2, observed=1)) pgm.add_edge("Rate_Ia","Type_prob") pgm.add_edge("Rate_II","Type_prob") pgm.add_edge("Cosmology","Distance") pgm.add_edge("Redshift","Distance") pgm.add_edge("Type_prob", "Type") pgm.add_edge("Type","Luminosity") pgm.add_edge("L_Ia", "Luminosity") pgm.add_edge("L_II", "Luminosity") pgm.add_edge("Luminosity","Flux") pgm.add_edge("Redshift","Flux") pgm.add_edge("Distance","Flux") pgm.add_edge("Type","Obs_Type") # pgm.add_edge("Neighbors","Obs_Redshift") pgm.add_edge("Redshift","Obs_Redshift") pgm.add_edge("Flux","Counts") pgm.add_edge("Calibration","Counts") # Big Plate: Galaxy pgm.add_plate(Plate([0.4, 0.5, 8.2, 7.], label=r"SNe $i = 1, \cdots, N_{SN}$", shift=-0.2,label_offset=[20,2])) pgm.add_plate(Plate([0.5, 3.5, 4., 2.], label=r"Type $\in \{Ia, II\}$", shift=-0.2,label_offset=[20,2])) # Render and save. pgm.render() # pgm.figure.text(0.01,0.9,r'\underline{UNIVERSAL}',size='large') # pgm.figure.text(0.01,0.55,r'{\centering \underline{INDIVIDUAL} \newline \underline{SN}}',size='large') # pgm.figure.text(0.01,0.2,r'\underline{OBSERVATORY}',size='large') # pgm.figure.text(0.01,0.1,r'\underline{DATA}',size='large') pgm.figure.savefig("../results/nodes_pgm.pdf")
def korea_pgm(): G = PGM() G.add_node("s_mean", r"$\mu_{s}$", x=0, y=1) G.add_node("s_scale", r"$\sigma_{s}$", x=1, y=1) G.add_node("s_height", r"$h_s$", x=0.5, y=0) G.add_edge("s_mean", "s_height") G.add_edge("s_scale", "s_height") G.add_node("n_mean", r"$\mu_{n}$", x=2, y=1) G.add_node("n_scale", r"$\sigma_{n}$", x=3, y=1) G.add_node("n_height", r"$h_n$", x=2.5, y=0) G.add_edge("n_mean", "n_height") G.add_edge("n_scale", "n_height") G.show()
def coin_flip_pgm(): G = PGM() G.add_node("alpha", content=r"$\alpha$", x=-1, y=1, scale=1.2, fixed=True) G.add_node("beta", content=r"$\beta$", x=1, y=1, scale=1.2, fixed=True) G.add_node("p", content="p", x=0, y=1, scale=1.2) G.add_node("result", content="result", x=0, y=0, scale=1.2, observed=True) G.add_edge("alpha", "p") G.add_edge("beta", "p") G.add_edge("p", "result") G.show()
def car_crash_pgm(): G = PGM() G.add_node("crashes", content="crashes", x=0, y=0, scale=1.5) G.add_node("rate", content="rate", x=0, y=1, scale=1.5) G.add_edge("rate", "crashes") G.show()
#!/usr/bin/env python from matplotlib import rc from daft import PGM, Node, Plate rc("font", family="serif", size=12) rc("text", usetex=True) pgm = PGM([6, 4.2], origin=[0., 0.2], observed_style='inner') # x_1 and c distributions on top line pgm.add_node(Node("sigdist", r"$\sigma_{\mathrm{int}}^{\mathrm{dist}}$", 3, 4)) pgm.add_node(Node("x1dist", r"$x_1^{\mathrm{dist}}$", 4, 4)) pgm.add_node(Node("cdist", r"$c^{\mathrm{dist}}$", 5, 4)) # Per-SN parameters: top line in the plate pgm.add_node(Node("x1itrue", r"$x_{1,i}^\mathrm{true}$", 4, 3)) pgm.add_node(Node("citrue", r"$c_i^\mathrm{true}$", 5, 3)) # Per-SN parameters: second line in the plate pgm.add_node(Node("x0itrue", r"$x_{0,i}^\mathrm{true}$", 3, 2)) #pgm.add_node(Node("mui", r"$\mu_i$", 2, 2)) # Per-SN parameters: third line in the plate pgm.add_node(Node("zi", r"$z_i$", 2, 1, observed=True)) # Observed photometry pgm.add_node(Node("fij", r"$f_{i,j}$", 4, 1, observed=True)) pgm.add_node(Node("t0true", r"$t_0^{\mathrm{true}}$", 5, 1))
#!/usr/bin/env python from matplotlib import rc import matplotlib from daft import PGM, Node, Plate rc("font", family="serif", size=8) rc("text", usetex=True) pgm = PGM([9.5, 8.5], origin=[0.0, 0.2], observed_style="inner") # pgm.add_node(Node('dispersion',r"\center{$\sigma_{Ia}$ \newline $\sigma_{!Ia}$}", 1,6,scale=1.2,aspect=1.8)) # pgm.add_node(Node('rate',r"{\center Relative \newline Rates}", 2,8,scale=1.6,aspect=1.2)) # pgm.add_node(Node('theta_T',r"\center{$\alpha_{Ia}$, $\alpha_{!Ia}$ \newline $\beta_{Ia}$, $\beta_{!Ia}$}", 4,6,scale=1.4,aspect=1.8)) pgm.add_node(Node("theta_T", r"\center{SNe~Ia, Non-Ia Populations \newline Rates}", 3, 8, scale=1.8, aspect=3)) pgm.add_node(Node("Global Transmission", r"\centering{Global \newline Throughput}", 8, 8, scale=1.6, aspect=1.2)) pgm.add_node(Node("Transmission", r"Throughput", 8, 4, scale=1.6, aspect=1.2)) # pgm.add_node(Node('theta_T2',r"{Non-Ia}", 4,8,scale=1.6,aspect=1.2)) pgm.add_node(Node("mu", r"{\center Cosmology}", 7, 8, scale=1.6, aspect=1.2)) # pgm.add_node(Node('G_Ni',r"$g_{Ni}$", 8,5)) # pgm.add_node(Node('Flux_g',r"$f_{gi}(\lambda)$", 8, 3)) # pgm.add_node(Node('z',r"$z_i$", 3, 3, fixed=True,offset=(-10,-5))) # pgm.add_node(Node('Counts',r"$\overline{n}_i$", 7, 2,scale=1.2,fixed=True,offset=(-15,0))) # pgm.add_node(Node('Counts_g',r"$\overline{\mathit{ADU}}_{gi}$", 8, 2,scale=1.2,fixed=True,offset=(20,0)))
def ice_cream_n_group_pgm(): G = PGM() G.add_node("alpha", content=r"$\alpha$", x=-1, y=1, scale=1.2, fixed=True) G.add_node("beta", content=r"$\beta$", x=1, y=1, scale=1.2, fixed=True) G.add_node("p", content=r"$p_{i}$", x=0, y=1, scale=1.2) G.add_node("likes", content=r"$l_{i}$", x=0, y=0, scale=1.2, observed=True) G.add_edge("alpha", "p") G.add_edge("beta", "p") G.add_edge("p", "likes") G.add_plate([-0.5, -0.8, 1, 2.3], label=r"shop $i$") G.show()
def ice_cream_one_group_pgm(): G = PGM() G.add_node("alpha", content=r"$\alpha$", x=-1, y=1, scale=1.2, fixed=True) G.add_node("beta", content=r"$\beta$", x=1, y=1, scale=1.2, fixed=True) G.add_node("p", content="p", x=0, y=1, scale=1.2) G.add_node("likes", content="l", x=0, y=0, scale=1.2, observed=True) G.add_edge("alpha", "p") G.add_edge("beta", "p") G.add_edge("p", "likes") G.show()
def fully_connect(self, graph: PGM, layer1: List[Node], layer2: List[Node]): for l1_node in layer1: for l2_node in layer2: graph.add_edge(l1_node.name, l2_node.name)
#!/usr/bin/env python from matplotlib import rc from daft import PGM, Node, Plate rc("font", family="serif", size=10) rc("text", usetex=True) pgm = PGM([4.5, 4.5], origin=[0., 0.2], observed_style='inner') pgm.add_node(Node('Pars',r"$\theta_G$", 1, 3)) pgm.add_node(Node('mu',r"$\mu_G$", 1, 1)) pgm.add_node(Node('SNpars',r"$\theta^{dist}$", 1, 4)) pgm.add_node(Node('^z',r"$\hat{z_i}$", 3,1)) pgm.add_node(Node('Spars',r"$\hat{T}_{Si}$,$\hat{z_{Si}},\hat{\theta}_{Si}$", 3, 2, scale=1.8,observed=True)) pgm.add_node(Node('^Counts',r"$\hat{f_i}$", 2, 2, observed=True)) pgm.add_node(Node('^Host',r"$\hat{z_{Hi}},\hat{\theta}_{Hi}$", 3, 3, observed=True,scale=1.5)) pgm.add_node(Node('^mu',r"$\hat{\mu_i}$", 2, 1)) pgm.add_node(Node('SNpars_i',r"$\theta^{true}_i$", 2, 3)) pgm.add_node(Node('^Type',r"$\hat{T_i}$", 2, 4))
def hierarchical_p(): """A naive representation of the hierarchical p that we desire.""" G = PGM() G.add_node("p_shop", content=r"$p_{j, i}$", x=1, y=2, scale=1.2) G.add_node("likes", content="$l_{j, i}$", x=1, y=1, scale=1.2, observed=True) G.add_node("p_owner", content=r"$p_{j}$", x=1, y=3, scale=1.2) G.add_node("p_pop", content=r"$p$", x=1, y=4, scale=1.2) G.add_edge("p_pop", "p_owner") G.add_edge("p_owner", "p_shop") G.add_edge("p_shop", "likes") G.add_plate(plate=[0.3, 0.3, 1.5, 2.2], label=r"shop $i$") G.add_plate(plate=[0, -0.1, 2.1, 3.6], label=r"owner $j$") G.render()
#!/usr/bin/env python from matplotlib import rc from daft import PGM, Node, Plate rc("font", family="serif", size=12) rc("text", usetex=True) pgm = PGM([8.5, 6.5], origin=[0., 0.2], observed_style='inner') #pgm.add_node(Node('dispersion',r"\center{$\sigma_{Ia}$ \newline $\sigma_{!Ia}$}", 1,6,scale=1.2,aspect=1.8)) pgm.add_node(Node('rate',r"$r$",2,6)) #pgm.add_node(Node('theta_T',r"\center{$\alpha_{Ia}$, $\alpha_{!Ia}$ \newline $\beta_{Ia}$, $\beta_{!Ia}$}", 4,6,scale=1.4,aspect=1.8)) pgm.add_node(Node('theta_T',r"\center{$\Theta_{Ia}$ \newline $\Theta_{!Ia}$}", 4,6,scale=1.5,aspect=1.2)) pgm.add_node(Node('mu',r"$\Omega_M$, $w$", 5,6, scale=1.4)) pgm.add_node(Node('Transmission',r"$Z$", 7, 6)) pgm.add_node(Node('G_i',r"$g_i$", 3,5)) #pgm.add_node(Node('G_Ni',r"$g_{Ni}$", 8,5)) pgm.add_node(Node('theta_Ti',r"\center{$\theta_{Ia,i}$ \newline $\theta_{!Ia,i}$}", 1,4,scale=1.5,aspect=1.2)) pgm.add_node(Node('Type',r"$T_i$", 2, 4)) pgm.add_node(Node('Gals',r"$G$", 8,4, observed=True)) pgm.add_node(Node('Luminosity',r"$L_i(t,\lambda)$", 4, 3, scale=1.4)) pgm.add_node(Node('HD',r"$\mu_i$", 5,3,fixed=True,offset=(10,-5))) #pgm.add_node(Node('Flux_g',r"$f_{gi}(\lambda)$", 8, 3)) #pgm.add_node(Node('z',r"$z_i$", 3, 3, fixed=True,offset=(-10,-5)))
#!/usr/bin/env python from matplotlib import rc from daft import PGM, Node, Plate rc("font", family="serif", size=12) rc("text", usetex=True) pgm = PGM([6.5, 4.5], origin=[0., 0.2], observed_style='inner') #pgm.add_node(Node('G',r"$G$", 3,1)) #pgm.add_node(Node('Coords',r"${RA}_i$/${Dec}_i$", 2,1,fixed=True)) pgm.add_node(Node('G_i',r"$z_i, z_{Ni}$", 2,2, scale=1.2)) pgm.add_node(Node('mu',r"$\Omega_M$, $w$", 3,4, scale=1.4)) pgm.add_node(Node('rate',r"$\theta_{r1}$, $\theta_{r2}$", 5,4,scale=1.4)) pgm.add_node(Node('HD',r"$\mu_i$", 3,2,fixed=True,offset=(0,-22))) pgm.add_node(Node('theta_T',r"\center{$\alpha_{Ia}$, $\alpha_{non-Ia}$ \newline $\sigma_{Ia}$, $\sigma_{non-Ia}$}", 4,4,scale=1.65,aspect=1.5)) #pgm.add_node(Node('theta_Ti',r"$\theta_{Ti}^{Ia}$, $\theta_{Ti}^{non-Ia}$", 2,6,scale=1.5,aspect=1.5)) #pgm.add_node(Node('Host',r"$\theta_{gi}$", 2, 3, fixed=True,offset=(-10,-5))) #pgm.add_node(Node('z',r"$z_i$", 2, 2, fixed=True,offset=(-10,-5))) pgm.add_node(Node('Type',r"$T_i$", 5,3)) pgm.add_node(Node('Luminosity',r"$L_i(t,\lambda)$", 4,3, scale=1.4)) #pgm.add_node(Node('Flux',r"$n_i(t,\lambda)$", 5, 5, scale=1.2,fixed=True,offset=(15,0))) #pgm.add_node(Node('Flux_g',r"$n_{gi}(\lambda)$", 5, 2,fixed=True,offset=(0,-20))) #pgm.add_node(Node('Transmission',r"$\phi(\lambda)$", 7, 7)) #pgm.add_node(Node('Counts',r"$\overline{f}_i$", 8, 5,scale=1.2,fixed=True,offset=(15,0))) #pgm.add_node(Node('Counts_g',r"$\overline{f}_{gi}$", 8, 4,scale=1.2,fixed=True,offset=(10,-25))) #pgm.add_node(Node('Zeropoints',r"${Z}$", 9, 7, observed=True))
from daft import PGM pgm = PGM(directed=True) pgm.add_node('G', content='G', observed=False, x=0, y=0) pgm.add_node('rho', content='rho', observed=False, x=1, y=0, alternate=True) pgm.add_node('R', content='R', observed=True, x=.25 + .75 / 2, y=1.2) pgm.add_node('tau', content='tau', observed=True, x=1.5, y=.8) pgm.add_node('f', content='f', observed=False, x=1.75, y=2, shape='rectangle') pgm.add_node('beta', content='beta', observed=False, x=1.75, y=3, alternate=True) pgm.add_node('ITI', content='ITI', observed=True, x=2.5, y=2) pgm.add_node('k', content='k', observed=False, x=1, y=2, alternate=True) pgm.add_node('B', content='B', observed=False, x=-0.5, y=2) pgm.add_node('p_omega', content='Pom', observed=False, x=.25, y=3, alternate=True) pgm.add_node('omega', content='om', observed=False, x=.25, y=2.25, shape='rectangle') pgm.add_node('a', content='a', observed=False, x=-1.25, y=2.5)