{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## CStree from (Duarte & Solus, 2022)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We create the CStree from Figure 1. of (Duarte & Solus, 2022)." ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "import logging\n", "import sys\n", "\n", "import networkx as nx\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "import cslearn.cstree as ct\n", "import cslearn.stage as st\n", "\n", "%load_ext autoreload\n", "%autoreload 2\n", "# logging.basicConfig(stream=sys.stderr, level=logging.ERROR)\n", "logging.basicConfig(stream=sys.stderr, level=logging.CRITICAL)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Create the CStree" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This CStree has four levels, 0,...,3, which we label as X1,...,X4, each having cardinality 2 (i.e. can take values in the set {0, 1})." ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [], "source": [ "np.random.seed(2)\n", "\n", "tree = ct.CStree([2, 2, 2, 2], labels=[\"X\" + str(i) for i in range(1, 5)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We set/update the stages level-wise, by a dict containing the levels and the values of the contexts.\n", "We also add the color some of the stages by the \"color\" key of the dict. Note that singleton stages will be automatically be colored in black." ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "tree.update_stages(\n", " {\n", " 0: [{\"context\": {0: 0}}, {\"context\": {0: 1}}],\n", " 1: [\n", " {\"context\": {1: 0}, \"color\": \"green\"},\n", " {\"context\": {0: 0, 1: 1}},\n", " {\"context\": {0: 1, 1: 1}},\n", " ],\n", " 2: [\n", " {\"context\": {0: 0, 2: 0}, \"color\": \"blue\"},\n", " {\"context\": {0: 0, 2: 1}, \"color\": \"orange\"},\n", " {\"context\": {0: 1, 2: 0}, \"color\": \"red\"},\n", " {\"context\": {0: 1, 1: 1, 2: 1}},\n", " {\"context\": {0: 1, 1: 0, 2: 1}},\n", " ],\n", " }\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We sample the parameters for each stage from the Beta distribution with parameter alpha (in general, for non-binary variables, this will be the Dirichlet distribution). " ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [], "source": [ "tree.sample_stage_parameters(alpha=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below we plot full CStree by using the full flag of the plot method. Note that the parameter full defaults to False in which case it will only plot the part of the tree that was used for sampling data. This is to prevent from plotting and building very large trees. The plot method returns an AGraph, which is a pygraphviz object that represents a graph. It can eiter be drawn in the notebook or saved to file (commented out)." ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "()\n", "\n", "ø\n", "\n", "\n", "\n", "(1,)\n", "\n", "1\n", "\n", "\n", "\n", "()->(1,)\n", "\n", "\n", "0.09\n", "\n", "\n", "\n", "(0,)\n", "\n", "0\n", "\n", "\n", "\n", "()->(0,)\n", "\n", "\n", "0.91\n", "\n", "\n", "\n", "(1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1,)->(1, 1)\n", "\n", "\n", "0.42\n", "\n", "\n", "\n", "(1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1,)->(1, 0)\n", "\n", "\n", "0.58\n", "\n", "\n", "\n", "(0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0,)->(0, 1)\n", "\n", "\n", "0.04\n", "\n", "\n", "\n", "(0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0,)->(0, 0)\n", "\n", "\n", "0.96\n", "\n", "\n", "\n", "(1, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 1)->(1, 1, 1)\n", "\n", "\n", "0.47\n", "\n", "\n", "\n", "(1, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 1)->(1, 1, 0)\n", "\n", "\n", "0.53\n", "\n", "\n", "\n", "(1, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 0)->(1, 0, 1)\n", "\n", "\n", "0.42\n", "\n", "\n", "\n", "(1, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 0)->(1, 0, 0)\n", "\n", "\n", "0.58\n", "\n", "\n", "\n", "(0, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 1)->(0, 1, 1)\n", "\n", "\n", "0.81\n", "\n", "\n", "\n", "(0, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 1)->(0, 1, 0)\n", "\n", "\n", "0.19\n", "\n", "\n", "\n", "(0, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 0)->(0, 0, 1)\n", "\n", "\n", "0.42\n", "\n", "\n", "\n", "(0, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 0)->(0, 0, 0)\n", "\n", "\n", "0.58\n", "\n", "\n", "\n", "(1, 1, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 1, 1)->(1, 1, 1, 1)\n", "\n", "\n", "0.26\n", "\n", "\n", "\n", "(1, 1, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 1, 1)->(1, 1, 1, 0)\n", "\n", "\n", "0.74\n", "\n", "\n", "\n", "(1, 1, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 1, 0)->(1, 1, 0, 1)\n", "\n", "\n", "0.88\n", "\n", "\n", "\n", "(1, 1, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 1, 0)->(1, 1, 0, 0)\n", "\n", "\n", "0.12\n", "\n", "\n", "\n", "(1, 0, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 0, 1)->(1, 0, 1, 1)\n", "\n", "\n", "0.04\n", "\n", "\n", "\n", "(1, 0, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 0, 1)->(1, 0, 1, 0)\n", "\n", "\n", "0.96\n", "\n", "\n", "\n", "(1, 0, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 0, 0)->(1, 0, 0, 1)\n", "\n", "\n", "0.88\n", "\n", "\n", "\n", "(1, 0, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 0, 0)->(1, 0, 0, 0)\n", "\n", "\n", "0.12\n", "\n", "\n", "\n", "(0, 1, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 1, 1)->(0, 1, 1, 1)\n", "\n", "\n", "0.83\n", "\n", "\n", "\n", "(0, 1, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 1, 1)->(0, 1, 1, 0)\n", "\n", "\n", "0.17\n", "\n", "\n", "\n", "(0, 1, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 1, 0)->(0, 1, 0, 1)\n", "\n", "\n", "0.44\n", "\n", "\n", "\n", "(0, 1, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 1, 0)->(0, 1, 0, 0)\n", "\n", "\n", "0.56\n", "\n", "\n", "\n", "(0, 0, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 0, 1)->(0, 0, 1, 1)\n", "\n", "\n", "0.83\n", "\n", "\n", "\n", "(0, 0, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 0, 1)->(0, 0, 1, 0)\n", "\n", "\n", "0.17\n", "\n", "\n", "\n", "(0, 0, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 0, 0)->(0, 0, 0, 1)\n", "\n", "\n", "0.44\n", "\n", "\n", "\n", "(0, 0, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 0, 0)->(0, 0, 0, 0)\n", "\n", "\n", "0.56\n", "\n", "\n", "\n", "X1\n", "\n", "X1\n", "\n", "\n", "\n", "X2\n", "\n", "X2\n", "\n", "\n", "\n", "X1->X2\n", "\n", "\n", "\n", "\n", "\n", "X3\n", "\n", "X3\n", "\n", "\n", "\n", "X2->X3\n", "\n", "\n", "\n", "\n", "\n", "X4\n", "\n", "X4\n", "\n", "\n", "\n", "X3->X4\n", "\n", "\n", "\n", "\n", "\n", "-\n", "\n", "-\n", "\n", "\n", "\n", "-->X1\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ ">" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = tree.plot(full=True)\n", "a\n", "# a.draw(\"fig1_demo.png\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### The CSI relations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One can print the CSI relations (groupted by context) that the CStree encode, using the csi_relations() method." ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X1 ⊥ X3 | X2=0\n", "X2 ⊥ X4 | X1=0, X3=0\n", "X2 ⊥ X4 | X1=0, X3=1\n", "X2 ⊥ X4 | X1=1, X3=0\n" ] } ], "source": [ "rels = tree.csi_relations()\n", "for cont, rels in rels.items():\n", " for rel in rels:\n", " print(rel)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### The minimal context CSI relations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may also plot the minimal CSI relations as below. See the paper for definition of a minimal CSI." ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X1 ⊥ X3 | X2=0\n", "X2 ⊥ X4 | X1, X3=0\n", "X2 ⊥ X4 | X3, X1=0\n" ] } ], "source": [ "minl_csis = tree.to_minimal_context_csis()\n", "for cont, csis in minl_csis.items():\n", " for csi in csis:\n", " print(csi)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### The minimal context DAGs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also plot the minimal context DAGs based on the minimal context CSIs.\n", "These are grouped by the minimal contexts and represented by pygraphviz graphs." ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [], "source": [ "# Get Graphviz graphs for plotting\n", "agraphs = tree.to_minimal_context_agraphs()\n", "keys = list(agraphs.keys())" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X2=0\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "X1\n", "\n", "X1\n", "\n", "\n", "\n", "X4\n", "\n", "X4\n", "\n", "\n", "\n", "X1->X4\n", "\n", "\n", "\n", "\n", "\n", "X3\n", "\n", "X3\n", "\n", "\n", "\n", "X3->X4\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ ">" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(keys[0])\n", "agraphs[keys[0]]" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X3=0\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "X1\n", "\n", "X1\n", "\n", "\n", "\n", "X2\n", "\n", "X2\n", "\n", "\n", "\n", "X1->X2\n", "\n", "\n", "\n", "\n", "\n", "X4\n", "\n", "X4\n", "\n", "\n", "\n", "X1->X4\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ ">" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(keys[1])\n", "agraphs[keys[1]]" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X1=0\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "X2\n", "\n", "X2\n", "\n", "\n", "\n", "X3\n", "\n", "X3\n", "\n", "\n", "\n", "X2->X3\n", "\n", "\n", "\n", "\n", "\n", "X4\n", "\n", "X4\n", "\n", "\n", "\n", "X3->X4\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ ">" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(keys[2])\n", "agraphs[keys[2]]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Sampling data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data sampled from a CStree is stored as a Pandas dataframe, with labels inherited from the CStree level labels. The second row contains the cardinalities of variables." ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X1X2X3X4
02222
10011
20011
30000
40000
50000
60001
70000
80010
90111
100000
\n", "
" ], "text/plain": [ " X1 X2 X3 X4\n", "0 2 2 2 2\n", "1 0 0 1 1\n", "2 0 0 1 1\n", "3 0 0 0 0\n", "4 0 0 0 0\n", "5 0 0 0 0\n", "6 0 0 0 1\n", "7 0 0 0 0\n", "8 0 0 1 0\n", "9 0 1 1 1\n", "10 0 0 0 0" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = tree.sample(10)\n", "df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Write the CStree structure to a Pandas dataframe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may save/serialize a CStree to a Pandas dataframe. The first row shows tha cardinalities of the variables. Each other row represent a stage, where the last columns of each row represent the distribution for each stage." ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X1X2X3X4PROB_0PROB_1
02222NaNNaN
10---0.9561440.043856
21---0.5826210.417379
3*0--0.5762860.423714
401--0.1916660.808334
511--0.5343620.465638
60*0-0.5630520.436948
70*1-0.1670560.832944
81*0-0.1170010.882999
9111-0.7383830.261617
10101-0.9576000.042400
11----0.9124550.087545
\n", "
" ], "text/plain": [ " X1 X2 X3 X4 PROB_0 PROB_1\n", "0 2 2 2 2 NaN NaN\n", "1 0 - - - 0.956144 0.043856\n", "2 1 - - - 0.582621 0.417379\n", "3 * 0 - - 0.576286 0.423714\n", "4 0 1 - - 0.191666 0.808334\n", "5 1 1 - - 0.534362 0.465638\n", "6 0 * 0 - 0.563052 0.436948\n", "7 0 * 1 - 0.167056 0.832944\n", "8 1 * 0 - 0.117001 0.882999\n", "9 1 1 1 - 0.738383 0.261617\n", "10 1 0 1 - 0.957600 0.042400\n", "11 - - - - 0.912455 0.087545" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "treedf = tree.to_df(write_probs=True)\n", "treedf" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Read CStree from a Pandas dataframe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may easily read a CStree from a Pandas dataframe. A CStree can thus be saved to file as a usual Pandas dataframe." ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X1X2X3X4PROB_0PROB_1
02222NaNNaN
10---0.9561440.043856
21---0.5826210.417379
3*0--0.5762860.423714
401--0.1916660.808334
511--0.5343620.465638
60*0-0.5630520.436948
70*1-0.1670560.832944
81*0-0.1170010.882999
9111-0.7383830.261617
10101-0.9576000.042400
11----0.9124550.087545
\n", "
" ], "text/plain": [ " X1 X2 X3 X4 PROB_0 PROB_1\n", "0 2 2 2 2 NaN NaN\n", "1 0 - - - 0.956144 0.043856\n", "2 1 - - - 0.582621 0.417379\n", "3 * 0 - - 0.576286 0.423714\n", "4 0 1 - - 0.191666 0.808334\n", "5 1 1 - - 0.534362 0.465638\n", "6 0 * 0 - 0.563052 0.436948\n", "7 0 * 1 - 0.167056 0.832944\n", "8 1 * 0 - 0.117001 0.882999\n", "9 1 1 1 - 0.738383 0.261617\n", "10 1 0 1 - 0.957600 0.042400\n", "11 - - - - 0.912455 0.087545" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = ct.df_to_cstree(treedf)\n", "t.to_df(write_probs=True)" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Use plot(full=True) to draw the full tree.\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "()\n", "\n", "ø\n", "\n", "\n", "\n", "(1,)\n", "\n", "1\n", "\n", "\n", "\n", "()->(1,)\n", "\n", "\n", "0.09\n", "\n", "\n", "\n", "(0,)\n", "\n", "0\n", "\n", "\n", "\n", "()->(0,)\n", "\n", "\n", "0.91\n", "\n", "\n", "\n", "(1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1,)->(1, 1)\n", "\n", "\n", "0.42\n", "\n", "\n", "\n", "(1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1,)->(1, 0)\n", "\n", "\n", "0.58\n", "\n", "\n", "\n", "(0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0,)->(0, 1)\n", "\n", "\n", "0.04\n", "\n", "\n", "\n", "(0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0,)->(0, 0)\n", "\n", "\n", "0.96\n", "\n", "\n", "\n", "(1, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 1)->(1, 1, 1)\n", "\n", "\n", "0.47\n", "\n", "\n", "\n", "(1, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 1)->(1, 1, 0)\n", "\n", "\n", "0.53\n", "\n", "\n", "\n", "(1, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 0)->(1, 0, 1)\n", "\n", "\n", "0.42\n", "\n", "\n", "\n", "(1, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 0)->(1, 0, 0)\n", "\n", "\n", "0.58\n", "\n", "\n", "\n", "(0, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 1)->(0, 1, 1)\n", "\n", "\n", "0.81\n", "\n", "\n", "\n", "(0, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 1)->(0, 1, 0)\n", "\n", "\n", "0.19\n", "\n", "\n", "\n", "(0, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 0)->(0, 0, 1)\n", "\n", "\n", "0.42\n", "\n", "\n", "\n", "(0, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 0)->(0, 0, 0)\n", "\n", "\n", "0.58\n", "\n", "\n", "\n", "(1, 1, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 1, 1)->(1, 1, 1, 1)\n", "\n", "\n", "0.26\n", "\n", "\n", "\n", "(1, 1, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 1, 1)->(1, 1, 1, 0)\n", "\n", "\n", "0.74\n", "\n", "\n", "\n", "(1, 1, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 1, 0)->(1, 1, 0, 1)\n", "\n", "\n", "0.88\n", "\n", "\n", "\n", "(1, 1, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 1, 0)->(1, 1, 0, 0)\n", "\n", "\n", "0.12\n", "\n", "\n", "\n", "(1, 0, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 0, 1)->(1, 0, 1, 1)\n", "\n", "\n", "0.04\n", "\n", "\n", "\n", "(1, 0, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 0, 1)->(1, 0, 1, 0)\n", "\n", "\n", "0.96\n", "\n", "\n", "\n", "(1, 0, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(1, 0, 0)->(1, 0, 0, 1)\n", "\n", "\n", "0.88\n", "\n", "\n", "\n", "(1, 0, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(1, 0, 0)->(1, 0, 0, 0)\n", "\n", "\n", "0.12\n", "\n", "\n", "\n", "(0, 1, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 1, 1)->(0, 1, 1, 1)\n", "\n", "\n", "0.83\n", "\n", "\n", "\n", "(0, 1, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 1, 1)->(0, 1, 1, 0)\n", "\n", "\n", "0.17\n", "\n", "\n", "\n", "(0, 1, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 1, 0)->(0, 1, 0, 1)\n", "\n", "\n", "0.44\n", "\n", "\n", "\n", "(0, 1, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 1, 0)->(0, 1, 0, 0)\n", "\n", "\n", "0.56\n", "\n", "\n", "\n", "(0, 0, 1, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 0, 1)->(0, 0, 1, 1)\n", "\n", "\n", "0.83\n", "\n", "\n", "\n", "(0, 0, 1, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 0, 1)->(0, 0, 1, 0)\n", "\n", "\n", "0.17\n", "\n", "\n", "\n", "(0, 0, 0, 1)\n", "\n", "1\n", "\n", "\n", "\n", "(0, 0, 0)->(0, 0, 0, 1)\n", "\n", "\n", "0.44\n", "\n", "\n", "\n", "(0, 0, 0, 0)\n", "\n", "0\n", "\n", "\n", "\n", "(0, 0, 0)->(0, 0, 0, 0)\n", "\n", "\n", "0.56\n", "\n", "\n", "\n", "X1\n", "\n", "X1\n", "\n", "\n", "\n", "X2\n", "\n", "X2\n", "\n", "\n", "\n", "X1->X2\n", "\n", "\n", "\n", "\n", "\n", "X3\n", "\n", "X3\n", "\n", "\n", "\n", "X2->X3\n", "\n", "\n", "\n", "\n", "\n", "X4\n", "\n", "X4\n", "\n", "\n", "\n", "X3->X4\n", "\n", "\n", "\n", "\n", "\n", "-\n", "\n", "-\n", "\n", "\n", "\n", "-->X1\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ ">" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.plot()" ] } ], "metadata": { "kernelspec": { "display_name": "cstree_env", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.3" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }