dependence
- class cslearn.dependence.CI(a: set, b: set, sep: set, labels: list[str] | None = None)[source]
Bases:
objectThis is a conditional independence relation on the form a ⊥ b | sep.
- Parameters:
a (set) – The first set of variables.
b (set) – The second set of variables.
sep (set) – The set of variables that separate a and b.
Examples
>>> from cslearn.csi_relation import CI >>> ci = CI({1}, {2}, {4, 0}, labels=["X"+str(i) for i in range(1, 6)]) >>> print(ci) X2 ⊥ X3 | X1, X5
- class cslearn.dependence.CSI(ci: CI, context: Context, cards=None)[source]
Bases:
objectThis is a context specific relation on the form a ⊥ b | sep, context=something. :param ci: The CI relation. :type ci: CI :param context: The context. :type context: Context :param cards: The list of cardinalities of the variables. :type cards: list
Examples
>>> from cslearn.dependence import Context, CI, CSI >>> labels = ["X"+str(i) for i in range(0, 7)] >>> c = Context({6:0, 3:1}, labels=labels) >>> ci = CI({1}, {2}, {4, 5}, labels=labels) >>> csi = CSI(ci, c) >>> print(csi) X1 ⊥ X2 | X4, X5, X6=0, X3=1
- as_list()[source]
List representation. Important: only for pairwise CSIs, i.e. something like Xi ⊥ Xj | …
- Returns:
List representation of the CSI. The indices in the list represents the levels. The None values encode the CI variables. The singleton sets encode the context variables values. The sets with full cardinalities encode the sep variables.
- Return type:
list
Examples
>>> from cslearn.dependence import Context, CI, CSI >>> c = Context({0:0, 3:1}) >>> ci = CI({1}, {2}, {4, 5}) >>> csi = CSI(ci, c, cards=[2]*6) >>> csi.as_list() [{0}, None, None, {1}, {0, 1}, {0, 1}]
- class cslearn.dependence.Context(context: dict, labels: list | None = None)[source]
Bases:
objectA class for the context of a CSI.
- Parameters:
context (dict) – A dictionary of the context. The keys are the levels and the values are the values of the (context) variables at the same level.
labels (list, optional) – A list of labels for the keys in the dict. Defaults to None.
Examples
>>> from cslearn.csi_relation import Context >>> c = Context({0:0, 3:1}) >>> print(c) >>> c = Context({0:0, 3:1}, labels=["X"+str(i) for i in range(0, 4)]) >>> print(c) 0=0, 3=1 X1=0, X4=1
- cslearn.dependence.csi_relations_to_dags(csi_relations, p, labels=None)[source]
Converts the CSI relations to dags.
- Parameters:
csi_relations (dict) – A dictionary with contexts as keys and lists of csi relations as values.
p (int) – The number of variables.
labels (list, optional) – A list of labels for the variables. Defaults to None.
- Returns:
A dictionary with contexts as keys and dags as values.
- Return type:
dict
Examples
>>> # Figure 1. from (Duarte & Solus 2022) >>> import cslearn.cstree as ct >>> import cslearn.stage as st >>> from cslearn import dependence >>> tree = ct.CStree([2, 2, 2, 2], labels=["X"+str(i) for i in range(1, 5)]) >>> tree.update_stages({ >>> 0: [{"context": {0: 0}}, >>> {"context": {0: 1}}], >>> 1: [{"context": {1: 0}, "color": "green"}, >>> {"context": {0: 0, 1: 1}}, >>> {"context": {0: 1, 1: 1}}], >>> 2: [{"context": {0: 0, 2: 0}, "color": "blue"}, >>> {"context": {0: 0, 2: 1}, "color": "orange"}, >>> {"context": {0: 1, 2: 0}, "color": "red"}, >>> {"context": {0: 1, 1: 1, 2: 1}}, >>> {"context": {0: 1, 1: 0, 2: 1}}]}) >>> minl_csis = tree.to_minimal_context_csis() >>> cdags = dependence.csi_relations_to_dags(minl_csis, tree.p, labels=tree.labels) >>> for key, dag in cdags.items(): >>> print("{}:".format(key)) >>> print("Nodes: {}".format(dag.nodes())) >>> print("Edges: {}".format(dag.edges())) X2=0: Nodes: ['X1', 'X3', 'X4'] Edges: [('X1', 'X4'), ('X3', 'X4')] X3=0: Nodes: ['X1', 'X2', 'X4'] Edges: [('X1', 'X2'), ('X1', 'X4')] X1=0: Nodes: ['X2', 'X3', 'X4'] Edges: [('X2', 'X3'), ('X3', 'X4')]
- cslearn.dependence.decomposition(ci: CI)[source]
Generate all possible pairwise CI relations that are implied by decomposition rule.
- Parameters:
ci (CI) – A CI relation.
- Returns:
List of pairwise CI relations.
- Return type:
list
Examples
>>> from cslearn.dependence import CI, decomposition >>> ci = CI({1,2}, {3,4},{0}) >>> print(ci) >>> dec = decomposition(ci) >>> for d in dec: >>> print(d) 1, 2 ⊥ 3, 4 | 0 1 ⊥ 3 | 0 1 ⊥ 4 | 0 2 ⊥ 3 | 0 2 ⊥ 4 | 0
- cslearn.dependence.minimal_csis(paired_csis, cards)[source]
Find the minimal CSIs from the pairwise CSIs.
- Parameters:
paired_csis (dict) – Dict of csis grouped by pairwise indep rels as Xi ⊥ Xj | …
cards (list) – Cardinalities of the levels.
Example
>>> # Figure 1. from (Duarte & Solus 2022) >>> import cslearn.cstree as ct >>> import cslearn.stage as st >>> tree = ct.CStree([2, 2, 2, 2], labels=["X"+str(i) for i in range(1, 5)]) >>> tree.update_stages({ >>> 0: [{"context": {0: 0}}, >>> {"context": {0: 1}}], >>> 1: [{"context": {1: 0}, "color": "green"}, >>> {"context": {0: 0, 1: 1}}, >>> {"context": {0: 1, 1: 1}}], >>> 2: [{"context": {0: 0, 2: 0}, "color": "blue"}, >>> {"context": {0: 0, 2: 1}, "color": "orange"}, >>> {"context": {0: 1, 2: 0}, "color": "red"}, >>> {"context": {0: 1, 1: 1, 2: 1}}, >>> {"context": {0: 1, 1: 0, 2: 1}}]}) >>> rels = tree.csi_relations() >>> minl_csis = tree.to_minimal_context_csis() >>> for cont, csis in minl_csis.items(): >>> for csi in csis: >>> print(csi) X1 ⊥ X3 | X2=0 X2 ⊥ X4 | X1, X3=0 X2 ⊥ X4 | X3, X1=0
- Returns:
dict of minimal CSIs grouped by contexts.
- Return type:
dict
- cslearn.dependence.mix(csilist_tuple, level, cards)[source]
Mix two pairwise CI relations represented as lists. A mix is the intersection at each level except for the current level l where the values are joined.
- Parameters:
csilist_tuple (tuple) – Two pairwise CSI lists
level (int) – the level
cards (list) – cardinalities of the levels.
- Returns:
A mixed CSI list.
- Return type:
list
Example
>>> from cslearn.dependence import mix >>> a = [0, None, None, {0,1}, {1}] >>> b = [1, None, None, {0}, {1}] >>> c = mix((a,b), 0, [2,2,2,2,2]) >>> c [{0, 1}, None, None, {0}, {1}]
- cslearn.dependence.pairwise_cis(ci: CI)[source]
Using weak union just to get pairwise independence relations from a CI.
- Parameters:
ci (CI) – CI relation
- Returns:
List of pairwise CI relations.
- Return type:
list
Examples
>>> from cslearn.dependence import CI, pairwise_cis >>> >>> ci = CI({1,2}, {3,4},{0}) >>> pw = pairwise_cis(ci) >>> print("Original CI: ", ci) >>> print("Pairwise CIs:") >>> for x in pw: >>> print(x) Original CI: 1, 2 ⊥ 3, 4 | 0 Pairwise CIs: 1 ⊥ 3 | 0, 2, 4 1 ⊥ 4 | 0, 2, 3 2 ⊥ 3 | 0, 1, 4 2 ⊥ 4 | 0, 1, 3
- cslearn.dependence.pairwise_csis(csi: CSI, cards=None)[source]
Using weak union just to get pairwise indep relations from a CSI.
- Parameters:
csi (CSI) – CSI relation
- Returns:
List of pairwise CSI relations.
- Return type:
list
Examples
>>> from cslearn.dependence import CI, pairwise_cis, Context, CSI, pairwise_csis >>> >>> ci = CI({1,2}, {3,4},{0}) >>> c = Context({5:0}) >>> csi = CSI(ci, c) >>> print("Original CSI: ", csi) >>> pw = pairwise_csis(csi) >>> print("Pairwise CSIs:") >>> for x in pw: >>> print(x) Original CSI: 1, 2 ⊥ 3, 4 | 0, 5=0 Pairwise CSIs: 1 ⊥ 3 | 0, 2, 4, 5=0 1 ⊥ 4 | 0, 2, 3, 5=0 2 ⊥ 3 | 0, 1, 4, 5=0 2 ⊥ 4 | 0, 1, 3, 5=0
- cslearn.dependence.partition_csis(csilist_list, level, cards)[source]
Put the CSIs in different sets that can possibly be mixed to create new CSIs. It is assumed that all are pairwise CSIs and has the same “indepedent” variables, e.g. 1 and 3 in the example below.
- Parameters:
csilist_list (list) – List of pairwise CSI lists.
level (int) – The level up to which the mixing is done.
cards (list) – Cardinalities of the levels.
- Returns:
list of disjoint lists of pairwise CSI lists that can possibly be mixed.
- Return type:
list
Example
>>> from cslearn.dependence import CI, pairwise_cis, Context, CSI, pairwise_csis, partition_csis >>> cards = [2]*5 >>> csi1 = CSI(CI({1}, {3},{4}), Context({0:0, 2:0}), cards=cards) >>> csi2 = CSI(CI({1}, {3},{4}), Context({0:0, 2:1}), cards=cards) >>> csi3 = CSI(CI({1}, {3},{4}), Context({0:1, 2:0}), cards=cards) >>> >>> print("CSIs:") >>> for x in [csi1, csi2, csi3]: >>> print(x) >>> >>> print("CSIs list representations:") >>> for x in [csi1, csi2, csi3]: >>> print(x.as_list()) >>> >>> pairwise_csis = [csi1.as_list() , csi2.as_list(), csi3.as_list()] >>> partitioned_csis = partition_csis(pairwise_csis, 0, cards) >>> >>> print("CSI partitioned bases on values at level 0:") >>> for i, csis in enumerate(partitioned_csis): >>> print("{}: {}".format(i, csis)) CSIs: 1 ⊥ 3 | 4, 0=0, 2=0 1 ⊥ 3 | 4, 0=0, 2=1 1 ⊥ 3 | 4, 0=1, 2=0 CSIs list representations: [{0}, None, {0}, None, {0, 1}] [{0}, None, {1}, None, {0, 1}] [{1}, None, {0}, None, {0, 1}] CSI partitioned bases on values at level 0: 0: [[{0}, None, {0}, None, {0, 1}], [{0}, None, {1}, None, {0, 1}]] 1: [[{1}, None, {0}, None, {0, 1}]]
- cslearn.dependence.weak_union(ci: CI)[source]
Using weak union just to get pairwise independence relations from a CSI. :param ci: CI relation :type ci: CI
- Returns:
List of pairwise CI relations.
- Return type:
list
Examples
>>> from cslearn import dependence >>> ci = dependence.CI({1,2}, {3,4},{0}) >>> print("Original CI:") >>> print(ci) >>> dec = dependence.weak_union(ci) >>> print("CI relations extrracted by WU:") >>> for d in dec: >>> print(d) Original CI: 1, 2 ⊥ 3, 4 | 0 CI relations extrracted by WU: 1, 2 ⊥ 4 | 0, 3 1, 2 ⊥ 3 | 0, 4 2 ⊥ 3, 4 | 0, 1 1 ⊥ 3, 4 | 0, 2