Coverage for causalspyne/data_gen.py: 100%
25 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-19 14:58 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-19 14:58 +0000
1"""
2generate Linear Gaussian
3"""
5import numpy as np
6from numpy.random import default_rng
8from causalspyne.noise_idiosyncratic import Idiosyncratic
9from causalspyne.edge_models import EdgeModelLinear
12class DataGen:
13 def __init__(self, dag, edge_model=None, idiosynchratic=None, rng=default_rng(0)):
14 self.dag = dag
15 self.idiosyncratic = idiosynchratic
16 if idiosynchratic is None:
17 self.idiosyncratic = Idiosyncratic(rng)
18 self.edge_model = edge_model
19 if edge_model is None:
20 self.edge_model = EdgeModelLinear(self.dag)
22 def gen(self, num_samples):
23 """
24 Generate linear Gaussian data from a given DAG.
26 Parameters:
27 - num_samples: int, number of samples to generate.
28 - noise_std: float, standard deviation of the Gaussian noise.
30 Returns:
31 - data: np.ndarray, generated data of shape (num_samples, num_nodes).
32 """
33 list_ind_nodes_topo_order = self.dag.topological_sort()
35 # Number of nodes
36 num_nodes = len(list_ind_nodes_topo_order)
38 # Initialize the data matrix
39 data = np.zeros((num_samples, num_nodes))
41 # Generate data for each node in topological order
42 for node in list_ind_nodes_topo_order:
43 list_parents_inds = self.dag.get_list_parents_inds(node)
44 noise = self.idiosyncratic.gen(num_samples)
45 data[:, node] = noise
46 if list_parents_inds:
47 bias = self.edge_model.run(node, data[:, list_parents_inds])
48 data[:, node] += bias
49 return data