{ "cells": [ { "cell_type": "markdown", "id": "a9cf5fca", "metadata": {}, "source": [ "# Tutorial for Python Users\n", "\n", "In this tutorial, we will go through CausalBGM workflow under both continous treatment setting and binary treatment setting.\n", "\n", "Users can use CausalBGM by **Python API** or a **single command line** after installation.\n", "\n", "First of all, you need to install python **bayesgm** toolkit, please refer to the [install page](https://bayesgm.readthedocs.io/en/latest/getting-started/installation.html).\n", "\n" ] }, { "cell_type": "markdown", "id": "c449fd8c", "metadata": {}, "source": [ "
\n", "Notes\n", "\n", "- We develop a Python toolkit *[bayesgm](https://pypi.org/project/bayesgm/)* for AI-powered Bayesian generative modeling approaches. *CausalBGM* is one of the models in this package.\n", "\n", "- The use of CausalBGM APIs are detailed in online document [API page](https://bayesgm.readthedocs.io/en/latest/api/models.html#causalbgm-family).\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "id": "b102137f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Currently use version 1.0.1 of bayesgm.\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import yaml\n", "import bayesgm\n", "print(\"Currently use version %s of bayesgm.\"%bayesgm.__version__)" ] }, { "cell_type": "markdown", "id": "157d39c3", "metadata": {}, "source": [ "## Use CausalBGM Python API in continous treatment setting\n", "\n", "We will use `Hirano and Imbens dataset` for an example. " ] }, { "cell_type": "markdown", "id": "3f6412e0", "metadata": {}, "source": [ "### CausalBGM Configuration Parameters\n", "\n", "Before creating a CausalBGM model, a python `dict` object should be created for configing a CausalBGM model, which are described as follows.\n", "\n", "#### General Parameters\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `dataset` | Dataset name to indicate the input data. *Default: 'Sim_Hirano_Imbens'.* |\n", "| `output_dir` | Output directory to save the results during the model training. *Default: '.'.* |\n", "| `save_res` | Whether to save intermediate results. *Default: True.* |\n", "| `save_model` | Whether to save the model after training. *Default: False.* |\n", "| `binary_treatment` | Whether to use binary treatment settings. *Default: False.* |\n", "| `use_bnn` | Whether to use Bayesian neural networks. *Default: True.* |\n", "\n", "#### Parameters for Iterative Updating Algorithm\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `z_dims` | Latent dimensions of `Z`. *Default: [1, 1, 1, 7].* |\n", "| `v_dim` | Dimension of covariates. *Default: 200.* |\n", "| `lr_theta` | Learning rate for updating model parameters. *Default: 0.0001.* |\n", "| `lr_z` | Learning rate for updating latent variables. *Default: 0.0001.* |\n", "| `g_units` | Number of units for covariates generative model. *Default: [64, 64, 64, 64, 64].* |\n", "| `f_units` | Number of units for outcome generative model. *Default: [64, 32, 8].* |\n", "| `h_units` | Number of units for treatment generative model. *Default: [64, 32, 8].* |\n", "\n", "#### Parameters for EGM Initialization\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `kl_weight` | Coefficient for KL divergence term in BNNs. *Default: 0.0001.* |\n", "| `lr` | Learning rate for EGM initialization. *Default: 0.0002.* |\n", "| `g_d_freq` | Frequency for updating discriminators and generators. *Default: 5.* |\n", "| `use_z_rec` | Whether to use reconstruction for latent features. *Default: True.* |\n", "| `e_units` | Number of units for the encoder network. *Default: [64, 64, 64, 64, 64].* |\n", "| `dz_units` | Number of units for the discriminator network in latent space. *Default: [64, 32, 8].* |" ] }, { "cell_type": "markdown", "id": "06118a7d", "metadata": {}, "source": [ "
\n", "Notes\n", "\n", "- Many example config files are provided in the folder *src/configs* ([link](https://github.com/liuq-lab/bayesgm/tree/main/src/configs)) for datasets used in the paper.\n", "\n", "
" ] }, { "cell_type": "markdown", "id": "15245239", "metadata": {}, "source": [ "### Loading config parameters " ] }, { "cell_type": "code", "execution_count": 2, "id": "37f5eaa6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'dataset': 'Sim_Hirano_Imbens', 'output_dir': '.', 'save_res': True, 'save_model': False, 'binary_treatment': False, 'use_bnn': True, 'z_dims': [1, 1, 1, 7], 'v_dim': 200, 'lr_theta': 0.0001, 'lr_z': 0.0001, 'g_units': [64, 64, 64, 64, 64], 'f_units': [64, 32, 8], 'h_units': [64, 32, 8], 'kl_weight': 0.0001, 'lr': 0.0002, 'g_d_freq': 5, 'use_z_rec': True, 'e_units': [64, 64, 64, 64, 64], 'dz_units': [64, 32, 8]}\n" ] } ], "source": [ "params = yaml.safe_load(open('src/configs/Sim_Hirano_Imbens.yaml', 'r'))\n", "print(params)" ] }, { "cell_type": "markdown", "id": "704a67a6", "metadata": {}, "source": [ "### Instantiate a CausalBGM model" ] }, { "cell_type": "code", "execution_count": 3, "id": "a56f4bb8", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2026-03-11 10:40:29.953365: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F AVX512_VNNI AVX512_BF16 AVX_VNNI AMX_TILE AMX_INT8 AMX_BF16 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2026-03-11 10:40:30.165681: I tensorflow/core/util/util.cc:169] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", "2026-03-11 10:40:30.278509: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", "2026-03-11 10:40:32.578548: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/home/ql339/.conda/envs/py3.9/lib/\n", "2026-03-11 10:40:32.579064: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/home/ql339/.conda/envs/py3.9/lib/\n", "2026-03-11 10:40:32.579068: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n", "2026-03-11 10:40:39.357386: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2027] TensorFlow was not built with CUDA kernel binaries compatible with compute capability 9.0. CUDA kernels will be jit-compiled from PTX, which could take 30 minutes or longer.\n", "2026-03-11 10:40:39.357660: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F AVX512_VNNI AVX512_BF16 AVX_VNNI AMX_TILE AMX_INT8 AMX_BF16 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2026-03-11 10:40:39.363478: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2027] TensorFlow was not built with CUDA kernel binaries compatible with compute capability 9.0. CUDA kernels will be jit-compiled from PTX, which could take 30 minutes or longer.\n", "2026-03-11 10:40:44.230986: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 140929 MB memory: -> device: 0, name: NVIDIA H200, pci bus id: 0000:bb:00.0, compute capability: 9.0\n", "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:95: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " loc = add_variable_fn(\n", "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:105: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " untransformed_scale = add_variable_fn(\n", "2026-03-11 10:40:47.589822: I tensorflow/stream_executor/cuda/cuda_blas.cc:1614] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.\n" ] } ], "source": [ "model = bayesgm.models.CausalBGM(params=params, random_seed=None)" ] }, { "cell_type": "markdown", "id": "6d766161", "metadata": {}, "source": [ "### Data preparation \n", "\n", "The input data are organized in a triplet, which contains treatment (*X*), potential outcome (*Y*), and covariates (*V*)." ] }, { "cell_type": "code", "execution_count": 4, "id": "20bbf256", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(20000, 1) (20000, 1) (20000, 200)\n" ] } ], "source": [ "from bayesgm.datasets import Sim_Hirano_Imbens_sampler\n", "x,y,v = Sim_Hirano_Imbens_sampler(N=20000, v_dim=200).load_all()\n", "print(x.shape,y.shape,v.shape)" ] }, { "cell_type": "markdown", "id": "0b4df2ad", "metadata": {}, "source": [ "### Model training\n", "\n", "Train CausalBGM with an optional EGM warm-start. \n", "\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `data` | Tuple of data inputs `(x, y, v)`, *Required.* |\n", "| `batch_size` | Batch size for training. *Default: 32.* |\n", "| `epochs` | Number of epochs for training. *Default: 100.* |\n", "| `epochs_per_eval` | Frequency of evaluations during training (e.g., every 5 epochs). *Default: 5.* |\n", "| `use_egm_init` | Whether to run EGM initialization before iterative training. *Default: True.* |\n", "| `epochs_per_eval` | Frequency of evaluations during training (e.g., every 5 epochs). *Default: 5.* |\n", "| `egm_n_iter` | Number of EGM initialization iterations. *Default: 30000.* |\n", "| `egm_batches_per_eval` | Evaluate EGM initialization every this many iterations. *Default: 500.* |\n", "| `verbose` | Controls verbosity level, showing progress and evaluation metrics. *Default: 1.* |\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "739d58f9-ea68-4c4c-b549-ebf2a800a35a", "metadata": {}, "source": [ "
\n", "Notes\n", " \n", "The training procedure consists of two phases:\n", "- **EGM initialization** (optional) — warm-start to obtain a good starting point for the latent variables and model parameters. This phase is optional and can be skipped by setting *use_egm_init* to False.\n", "- **Stochastic iterative updating** — alternates between updating the generator network parameters \n", " and the per-sample latent variables via stochastic gradient optimization.\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 5, "id": "548f9ca6", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "EGM Initialization Starts ...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:95: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " loc = add_variable_fn(\n", "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:105: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " untransformed_scale = add_variable_fn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "EGM Initialization Iter [0] : e_loss_adv [0.2336], l2_loss_v [1.0228], l2_loss_z [0.9938], l2_loss_x [1.0393], l2_loss_y [4.4029], g_e_loss [7.6924], dz_loss [0.0516], d_loss [0.3271]\n", "EGM Initialization Iter [500] : e_loss_adv [1.7835], l2_loss_v [1.0174], l2_loss_z [0.8902], l2_loss_x [11.1814], l2_loss_y [12.4417], g_e_loss [27.3142], dz_loss [-1.1979], d_loss [-0.7519]\n", "EGM Initialization Iter [1000] : e_loss_adv [0.2142], l2_loss_v [1.0167], l2_loss_z [0.9186], l2_loss_x [0.4651], l2_loss_y [1.7649], g_e_loss [4.3797], dz_loss [-1.5703], d_loss [-1.4926]\n", "EGM Initialization Iter [1500] : e_loss_adv [0.6016], l2_loss_v [1.0229], l2_loss_z [0.8104], l2_loss_x [1.7311], l2_loss_y [1.1285], g_e_loss [5.2944], dz_loss [-1.4662], d_loss [-1.1440]\n", "EGM Initialization Iter [2000] : e_loss_adv [-0.2172], l2_loss_v [0.9818], l2_loss_z [0.7609], l2_loss_x [3.8512], l2_loss_y [1.3351], g_e_loss [6.7121], dz_loss [-0.7049], d_loss [-0.5723]\n", "EGM Initialization Iter [2500] : e_loss_adv [-0.6869], l2_loss_v [0.9955], l2_loss_z [0.7060], l2_loss_x [0.5864], l2_loss_y [1.4249], g_e_loss [3.0260], dz_loss [-0.7184], d_loss [-0.5650]\n", "EGM Initialization Iter [3000] : e_loss_adv [-0.9327], l2_loss_v [0.9780], l2_loss_z [0.7114], l2_loss_x [1.4311], l2_loss_y [1.4923], g_e_loss [3.6802], dz_loss [-0.4438], d_loss [-0.2919]\n", "EGM Initialization Iter [3500] : e_loss_adv [-1.2839], l2_loss_v [1.0583], l2_loss_z [0.7365], l2_loss_x [2.3093], l2_loss_y [1.9179], g_e_loss [4.7381], dz_loss [-0.8263], d_loss [-0.7364]\n", "EGM Initialization Iter [4000] : e_loss_adv [-1.5408], l2_loss_v [1.0294], l2_loss_z [0.6064], l2_loss_x [4.0206], l2_loss_y [1.4722], g_e_loss [5.5880], dz_loss [-0.8158], d_loss [-0.6767]\n", "EGM Initialization Iter [4500] : e_loss_adv [-1.0226], l2_loss_v [0.9935], l2_loss_z [0.6432], l2_loss_x [1.1369], l2_loss_y [1.1873], g_e_loss [2.9384], dz_loss [-0.7635], d_loss [-0.6356]\n", "EGM Initialization Iter [5000] : e_loss_adv [-1.3171], l2_loss_v [1.0850], l2_loss_z [0.5702], l2_loss_x [0.8795], l2_loss_y [1.1124], g_e_loss [2.3301], dz_loss [-0.7465], d_loss [-0.6473]\n", "EGM Initialization Iter [5500] : e_loss_adv [-1.3136], l2_loss_v [1.0697], l2_loss_z [0.6109], l2_loss_x [3.3471], l2_loss_y [1.4369], g_e_loss [5.1511], dz_loss [-0.7818], d_loss [-0.7041]\n", "EGM Initialization Iter [6000] : e_loss_adv [-1.5287], l2_loss_v [1.0135], l2_loss_z [0.5739], l2_loss_x [3.3765], l2_loss_y [2.4388], g_e_loss [5.8741], dz_loss [-0.4657], d_loss [-0.3500]\n", "EGM Initialization Iter [6500] : e_loss_adv [-0.9883], l2_loss_v [1.0253], l2_loss_z [0.4936], l2_loss_x [12.1984], l2_loss_y [1.8050], g_e_loss [14.5340], dz_loss [-1.0290], d_loss [-0.8756]\n", "EGM Initialization Iter [7000] : e_loss_adv [-0.9280], l2_loss_v [1.0170], l2_loss_z [0.5469], l2_loss_x [0.7295], l2_loss_y [1.5921], g_e_loss [2.9574], dz_loss [-1.1066], d_loss [-0.9553]\n", "EGM Initialization Iter [7500] : e_loss_adv [-1.3834], l2_loss_v [0.9478], l2_loss_z [0.5085], l2_loss_x [1.4535], l2_loss_y [0.8933], g_e_loss [2.4197], dz_loss [-1.1365], d_loss [-0.9165]\n", "EGM Initialization Iter [8000] : e_loss_adv [-1.1943], l2_loss_v [1.0483], l2_loss_z [0.4082], l2_loss_x [1.5088], l2_loss_y [1.2450], g_e_loss [3.0161], dz_loss [-0.6851], d_loss [-0.5403]\n", "EGM Initialization Iter [8500] : e_loss_adv [-0.9068], l2_loss_v [0.9925], l2_loss_z [0.5008], l2_loss_x [2.5160], l2_loss_y [1.6454], g_e_loss [4.7481], dz_loss [-0.4941], d_loss [-0.3221]\n", "EGM Initialization Iter [9000] : e_loss_adv [-1.1367], l2_loss_v [1.0227], l2_loss_z [0.4641], l2_loss_x [0.8961], l2_loss_y [1.0888], g_e_loss [2.3350], dz_loss [-1.1502], d_loss [-1.0479]\n", "EGM Initialization Iter [9500] : e_loss_adv [-0.4581], l2_loss_v [1.0066], l2_loss_z [0.4015], l2_loss_x [4.5273], l2_loss_y [1.1357], g_e_loss [6.6130], dz_loss [-0.4729], d_loss [-0.2438]\n", "EGM Initialization Iter [10000] : e_loss_adv [-0.4825], l2_loss_v [1.0119], l2_loss_z [0.3976], l2_loss_x [4.9266], l2_loss_y [1.6185], g_e_loss [7.4722], dz_loss [-0.9087], d_loss [-0.8407]\n", "EGM Initialization Iter [10500] : e_loss_adv [-0.3622], l2_loss_v [0.9236], l2_loss_z [0.3934], l2_loss_x [1.1994], l2_loss_y [0.8895], g_e_loss [3.0437], dz_loss [-0.5223], d_loss [-0.3849]\n", "EGM Initialization Iter [11000] : e_loss_adv [-0.6587], l2_loss_v [1.0022], l2_loss_z [0.3753], l2_loss_x [0.6290], l2_loss_y [2.2966], g_e_loss [3.6443], dz_loss [-0.3311], d_loss [-0.2351]\n", "EGM Initialization Iter [11500] : e_loss_adv [-0.8142], l2_loss_v [0.9219], l2_loss_z [0.3577], l2_loss_x [0.4504], l2_loss_y [0.6233], g_e_loss [1.5392], dz_loss [-0.5330], d_loss [-0.4307]\n", "EGM Initialization Iter [12000] : e_loss_adv [-0.1782], l2_loss_v [0.9856], l2_loss_z [0.4137], l2_loss_x [17.7432], l2_loss_y [1.1676], g_e_loss [20.1319], dz_loss [-0.6628], d_loss [-0.5342]\n", "EGM Initialization Iter [12500] : e_loss_adv [-0.7103], l2_loss_v [1.0942], l2_loss_z [0.3109], l2_loss_x [4.3603], l2_loss_y [0.7972], g_e_loss [5.8523], dz_loss [-0.3978], d_loss [-0.2856]\n", "EGM Initialization Iter [13000] : e_loss_adv [-0.7747], l2_loss_v [1.0407], l2_loss_z [0.3655], l2_loss_x [1.3099], l2_loss_y [0.5965], g_e_loss [2.5379], dz_loss [-0.5982], d_loss [-0.5245]\n", "EGM Initialization Iter [13500] : e_loss_adv [-1.5893], l2_loss_v [0.9822], l2_loss_z [0.3269], l2_loss_x [1.5761], l2_loss_y [1.4505], g_e_loss [2.7463], dz_loss [-0.2089], d_loss [-0.1767]\n", "EGM Initialization Iter [14000] : e_loss_adv [-0.3512], l2_loss_v [0.9724], l2_loss_z [0.3501], l2_loss_x [4.6126], l2_loss_y [1.2828], g_e_loss [6.8669], dz_loss [-0.5639], d_loss [-0.5068]\n", "EGM Initialization Iter [14500] : e_loss_adv [-0.8137], l2_loss_v [1.0103], l2_loss_z [0.4248], l2_loss_x [0.5124], l2_loss_y [1.4730], g_e_loss [2.6068], dz_loss [-0.3226], d_loss [-0.2140]\n", "EGM Initialization Iter [15000] : e_loss_adv [-0.4964], l2_loss_v [0.9213], l2_loss_z [0.2990], l2_loss_x [1.2344], l2_loss_y [0.9027], g_e_loss [2.8611], dz_loss [-0.1730], d_loss [-0.0417]\n", "EGM Initialization Iter [15500] : e_loss_adv [-0.9802], l2_loss_v [1.0312], l2_loss_z [0.3307], l2_loss_x [0.9689], l2_loss_y [1.3733], g_e_loss [2.7239], dz_loss [-0.7252], d_loss [-0.6841]\n", "EGM Initialization Iter [16000] : e_loss_adv [-0.8511], l2_loss_v [0.9647], l2_loss_z [0.3063], l2_loss_x [1.1361], l2_loss_y [1.1887], g_e_loss [2.7447], dz_loss [-0.7088], d_loss [-0.6389]\n", "EGM Initialization Iter [16500] : e_loss_adv [-0.9395], l2_loss_v [1.0061], l2_loss_z [0.3282], l2_loss_x [1.2912], l2_loss_y [1.5184], g_e_loss [3.2045], dz_loss [-0.1869], d_loss [-0.1471]\n", "EGM Initialization Iter [17000] : e_loss_adv [-0.1236], l2_loss_v [1.0263], l2_loss_z [0.3395], l2_loss_x [2.4202], l2_loss_y [0.7661], g_e_loss [4.4285], dz_loss [-0.3217], d_loss [-0.2915]\n", "EGM Initialization Iter [17500] : e_loss_adv [-0.6039], l2_loss_v [1.0110], l2_loss_z [0.2228], l2_loss_x [0.6884], l2_loss_y [1.0420], g_e_loss [2.3603], dz_loss [-0.6893], d_loss [-0.6441]\n", "EGM Initialization Iter [18000] : e_loss_adv [-0.9193], l2_loss_v [1.0120], l2_loss_z [0.2393], l2_loss_x [0.4388], l2_loss_y [0.9639], g_e_loss [1.7347], dz_loss [-0.4117], d_loss [-0.3580]\n", "EGM Initialization Iter [18500] : e_loss_adv [-1.1126], l2_loss_v [0.9904], l2_loss_z [0.2908], l2_loss_x [12.6224], l2_loss_y [1.8989], g_e_loss [14.6900], dz_loss [0.1250], d_loss [0.1782]\n", "EGM Initialization Iter [19000] : e_loss_adv [-0.4944], l2_loss_v [1.0103], l2_loss_z [0.2811], l2_loss_x [0.9594], l2_loss_y [1.4073], g_e_loss [3.1637], dz_loss [-0.7970], d_loss [-0.7325]\n", "EGM Initialization Iter [19500] : e_loss_adv [0.3062], l2_loss_v [0.9363], l2_loss_z [0.2672], l2_loss_x [17.2928], l2_loss_y [1.6232], g_e_loss [20.4258], dz_loss [-0.3881], d_loss [-0.2849]\n", "EGM Initialization Iter [20000] : e_loss_adv [-1.7392], l2_loss_v [1.0347], l2_loss_z [0.2673], l2_loss_x [6.0748], l2_loss_y [1.1972], g_e_loss [6.8348], dz_loss [-0.6097], d_loss [-0.5434]\n", "EGM Initialization Iter [20500] : e_loss_adv [-0.9999], l2_loss_v [0.9217], l2_loss_z [0.2955], l2_loss_x [3.1602], l2_loss_y [1.3958], g_e_loss [4.7734], dz_loss [0.0663], d_loss [0.1290]\n", "EGM Initialization Iter [21000] : e_loss_adv [-0.3025], l2_loss_v [0.9891], l2_loss_z [0.2912], l2_loss_x [3.4434], l2_loss_y [1.3069], g_e_loss [5.7280], dz_loss [-0.2240], d_loss [-0.2015]\n", "EGM Initialization Iter [21500] : e_loss_adv [-0.4693], l2_loss_v [1.0710], l2_loss_z [0.2530], l2_loss_x [0.4649], l2_loss_y [1.3412], g_e_loss [2.6608], dz_loss [-0.6601], d_loss [-0.6297]\n", "EGM Initialization Iter [22000] : e_loss_adv [-1.7933], l2_loss_v [0.9932], l2_loss_z [0.2663], l2_loss_x [1.2690], l2_loss_y [1.4594], g_e_loss [2.1947], dz_loss [-0.0681], d_loss [-0.0063]\n", "EGM Initialization Iter [22500] : e_loss_adv [-0.4883], l2_loss_v [0.9213], l2_loss_z [0.2608], l2_loss_x [0.6639], l2_loss_y [0.6807], g_e_loss [2.0383], dz_loss [-0.1923], d_loss [-0.1554]\n", "EGM Initialization Iter [23000] : e_loss_adv [-0.5152], l2_loss_v [0.9531], l2_loss_z [0.2275], l2_loss_x [0.4341], l2_loss_y [1.0350], g_e_loss [2.1345], dz_loss [-0.2549], d_loss [-0.1995]\n", "EGM Initialization Iter [23500] : e_loss_adv [-0.1655], l2_loss_v [0.9404], l2_loss_z [0.2472], l2_loss_x [0.5480], l2_loss_y [0.6557], g_e_loss [2.2257], dz_loss [-0.1739], d_loss [-0.1279]\n", "EGM Initialization Iter [24000] : e_loss_adv [-0.8649], l2_loss_v [0.9337], l2_loss_z [0.2714], l2_loss_x [1.8735], l2_loss_y [1.4069], g_e_loss [3.6205], dz_loss [-0.2289], d_loss [-0.1504]\n", "EGM Initialization Iter [24500] : e_loss_adv [0.3453], l2_loss_v [0.9769], l2_loss_z [0.2489], l2_loss_x [6.0515], l2_loss_y [0.9008], g_e_loss [8.5234], dz_loss [-0.2344], d_loss [-0.1849]\n", "EGM Initialization Iter [25000] : e_loss_adv [-0.6483], l2_loss_v [0.9621], l2_loss_z [0.2230], l2_loss_x [0.6436], l2_loss_y [1.7994], g_e_loss [2.9798], dz_loss [-0.1736], d_loss [-0.1410]\n", "EGM Initialization Iter [25500] : e_loss_adv [-0.6854], l2_loss_v [1.0132], l2_loss_z [0.2315], l2_loss_x [4.1439], l2_loss_y [2.5138], g_e_loss [7.2171], dz_loss [-0.4864], d_loss [-0.4177]\n", "EGM Initialization Iter [26000] : e_loss_adv [-1.2118], l2_loss_v [1.0288], l2_loss_z [0.2737], l2_loss_x [5.5182], l2_loss_y [1.2290], g_e_loss [6.8380], dz_loss [0.1194], d_loss [0.1722]\n", "EGM Initialization Iter [26500] : e_loss_adv [0.7093], l2_loss_v [1.0771], l2_loss_z [0.2293], l2_loss_x [3.3827], l2_loss_y [1.4104], g_e_loss [6.8087], dz_loss [-0.2914], d_loss [-0.1987]\n", "EGM Initialization Iter [27000] : e_loss_adv [-0.7259], l2_loss_v [0.8823], l2_loss_z [0.2003], l2_loss_x [0.8137], l2_loss_y [0.8930], g_e_loss [2.0634], dz_loss [-0.7017], d_loss [-0.6602]\n", "EGM Initialization Iter [27500] : e_loss_adv [-1.5183], l2_loss_v [0.9569], l2_loss_z [0.1955], l2_loss_x [2.3814], l2_loss_y [1.4743], g_e_loss [3.4897], dz_loss [-0.1165], d_loss [-0.0647]\n", "EGM Initialization Iter [28000] : e_loss_adv [-0.0395], l2_loss_v [1.0021], l2_loss_z [0.2151], l2_loss_x [3.7281], l2_loss_y [0.9516], g_e_loss [5.8575], dz_loss [-0.5957], d_loss [-0.5354]\n", "EGM Initialization Iter [28500] : e_loss_adv [-2.1634], l2_loss_v [1.0258], l2_loss_z [0.1998], l2_loss_x [0.9157], l2_loss_y [0.8383], g_e_loss [0.8162], dz_loss [-0.1053], d_loss [-0.0697]\n", "EGM Initialization Iter [29000] : e_loss_adv [-0.0149], l2_loss_v [0.9536], l2_loss_z [0.2508], l2_loss_x [2.8241], l2_loss_y [1.4126], g_e_loss [5.4262], dz_loss [-0.6389], d_loss [-0.6117]\n", "EGM Initialization Iter [29500] : e_loss_adv [-0.8025], l2_loss_v [0.9960], l2_loss_z [0.2465], l2_loss_x [0.9598], l2_loss_y [1.1993], g_e_loss [2.5991], dz_loss [-0.3781], d_loss [-0.2946]\n", "EGM Initialization Iter [30000] : e_loss_adv [-1.7520], l2_loss_v [0.9474], l2_loss_z [0.2136], l2_loss_x [1.0793], l2_loss_y [0.7894], g_e_loss [1.2777], dz_loss [-0.4842], d_loss [-0.4431]\n", "EGM Initialization Ends.\n", "Initialize latent variables Z with e(V)...\n", "Iterative Updating Starts ...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 0/100: 100%|██████████| 625/625 [00:17<00:00, 34.93batch/s, loss_px_z: [1.0017], loss_mse_x: [0.7962], loss_py_z: [1.7299], loss_mse_y: [1.8524], loss_pv_z: [104.1091], loss_mse_v: [0.9552], loss_postrior_z: [101.2081]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [0/100]: MSE_x: 2.1162, MSE_y: 1.2035, MSE_v: 0.9740\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 1/100: 100%|██████████| 625/625 [00:11<00:00, 55.72batch/s, loss_px_z: [1.0627], loss_mse_x: [0.9919], loss_py_z: [1.3802], loss_mse_y: [1.3957], loss_pv_z: [101.1004], loss_mse_v: [0.9326], loss_postrior_z: [99.0015]] \n", "Epoch 2/100: 100%|██████████| 625/625 [00:11<00:00, 54.91batch/s, loss_px_z: [2.9263], loss_mse_x: [4.9884], loss_py_z: [1.2504], loss_mse_y: [1.2226], loss_pv_z: [104.0898], loss_mse_v: [0.9618], loss_postrior_z: [104.2342]] \n", "Epoch 3/100: 100%|██████████| 625/625 [00:11<00:00, 55.40batch/s, loss_px_z: [1.3514], loss_mse_x: [1.8893], loss_py_z: [1.2817], loss_mse_y: [1.3911], loss_pv_z: [111.9185], loss_mse_v: [1.0400], loss_postrior_z: [111.6363]] \n", "Epoch 4/100: 100%|██████████| 625/625 [00:11<00:00, 54.95batch/s, loss_px_z: [0.8047], loss_mse_x: [0.7948], loss_py_z: [1.1081], loss_mse_y: [1.0806], loss_pv_z: [109.0874], loss_mse_v: [1.0118], loss_postrior_z: [105.9435]] \n", "Epoch 5/100: 100%|██████████| 625/625 [00:11<00:00, 54.52batch/s, loss_px_z: [1.1618], loss_mse_x: [1.1868], loss_py_z: [1.1339], loss_mse_y: [1.0139], loss_pv_z: [110.8662], loss_mse_v: [1.0276], loss_postrior_z: [109.2909]] \n", "Epoch 6/100: 100%|██████████| 625/625 [00:11<00:00, 55.03batch/s, loss_px_z: [0.8462], loss_mse_x: [0.7771], loss_py_z: [1.3909], loss_mse_y: [1.6178], loss_pv_z: [103.7796], loss_mse_v: [0.9596], loss_postrior_z: [101.4011]] \n", "Epoch 7/100: 100%|██████████| 625/625 [00:11<00:00, 54.77batch/s, loss_px_z: [0.9922], loss_mse_x: [1.4759], loss_py_z: [0.9513], loss_mse_y: [0.6665], loss_pv_z: [104.8899], loss_mse_v: [0.9705], loss_postrior_z: [102.6353]] \n", "Epoch 8/100: 100%|██████████| 625/625 [00:11<00:00, 53.82batch/s, loss_px_z: [0.7981], loss_mse_x: [0.6528], loss_py_z: [1.3613], loss_mse_y: [1.5980], loss_pv_z: [109.5272], loss_mse_v: [1.0158], loss_postrior_z: [106.3503]] \n", "Epoch 9/100: 100%|██████████| 625/625 [00:11<00:00, 54.67batch/s, loss_px_z: [0.7962], loss_mse_x: [0.5568], loss_py_z: [1.0703], loss_mse_y: [0.9598], loss_pv_z: [104.8426], loss_mse_v: [0.9710], loss_postrior_z: [101.9698]] \n", "Epoch 10/100: 100%|██████████| 625/625 [00:11<00:00, 54.84batch/s, loss_px_z: [0.5672], loss_mse_x: [0.5001], loss_py_z: [1.3016], loss_mse_y: [1.4453], loss_pv_z: [98.7699], loss_mse_v: [0.9122], loss_postrior_z: [96.4060]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [10/100]: MSE_x: 2.2314, MSE_y: 1.2006, MSE_v: 0.9687\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 11/100: 100%|██████████| 625/625 [00:11<00:00, 54.30batch/s, loss_px_z: [0.5795], loss_mse_x: [0.6802], loss_py_z: [1.1793], loss_mse_y: [1.2066], loss_pv_z: [96.5351], loss_mse_v: [0.8871], loss_postrior_z: [93.4869]] \n", "Epoch 12/100: 100%|██████████| 625/625 [00:11<00:00, 54.78batch/s, loss_px_z: [1.1033], loss_mse_x: [2.4904], loss_py_z: [1.1913], loss_mse_y: [1.2767], loss_pv_z: [98.9891], loss_mse_v: [0.9151], loss_postrior_z: [95.6955]] \n", "Epoch 13/100: 100%|██████████| 625/625 [00:11<00:00, 54.29batch/s, loss_px_z: [1.6449], loss_mse_x: [1.9944], loss_py_z: [1.1341], loss_mse_y: [1.1039], loss_pv_z: [104.2422], loss_mse_v: [0.9682], loss_postrior_z: [103.0387]] \n", "Epoch 14/100: 100%|██████████| 625/625 [00:11<00:00, 54.24batch/s, loss_px_z: [0.6592], loss_mse_x: [2.1695], loss_py_z: [1.0025], loss_mse_y: [0.8883], loss_pv_z: [102.1708], loss_mse_v: [0.9453], loss_postrior_z: [99.7335]] \n", "Epoch 15/100: 100%|██████████| 625/625 [00:11<00:00, 55.68batch/s, loss_px_z: [0.7443], loss_mse_x: [1.6535], loss_py_z: [1.1693], loss_mse_y: [1.2531], loss_pv_z: [103.2916], loss_mse_v: [0.9567], loss_postrior_z: [101.1586]] \n", "Epoch 16/100: 100%|██████████| 625/625 [00:11<00:00, 55.40batch/s, loss_px_z: [0.7354], loss_mse_x: [0.8059], loss_py_z: [1.1732], loss_mse_y: [1.2717], loss_pv_z: [106.4319], loss_mse_v: [0.9858], loss_postrior_z: [104.2073]] \n", "Epoch 17/100: 100%|██████████| 625/625 [00:11<00:00, 55.67batch/s, loss_px_z: [2.1600], loss_mse_x: [2.8464], loss_py_z: [1.0883], loss_mse_y: [1.1696], loss_pv_z: [106.7967], loss_mse_v: [0.9891], loss_postrior_z: [106.0688]] \n", "Epoch 18/100: 100%|██████████| 625/625 [00:11<00:00, 54.89batch/s, loss_px_z: [0.7860], loss_mse_x: [2.6597], loss_py_z: [1.0036], loss_mse_y: [0.9227], loss_pv_z: [102.5790], loss_mse_v: [0.9485], loss_postrior_z: [100.5853]] \n", "Epoch 19/100: 100%|██████████| 625/625 [00:11<00:00, 53.88batch/s, loss_px_z: [0.9116], loss_mse_x: [0.9684], loss_py_z: [0.9765], loss_mse_y: [0.9605], loss_pv_z: [105.0637], loss_mse_v: [0.9744], loss_postrior_z: [103.2852]] \n", "Epoch 20/100: 100%|██████████| 625/625 [00:11<00:00, 54.23batch/s, loss_px_z: [1.1986], loss_mse_x: [7.3664], loss_py_z: [1.3686], loss_mse_y: [2.0824], loss_pv_z: [103.5854], loss_mse_v: [0.9616], loss_postrior_z: [101.7267]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [20/100]: MSE_x: 2.3551, MSE_y: 1.2030, MSE_v: 0.9676\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 21/100: 100%|██████████| 625/625 [00:11<00:00, 54.97batch/s, loss_px_z: [0.6754], loss_mse_x: [0.8088], loss_py_z: [1.1038], loss_mse_y: [1.2782], loss_pv_z: [100.8194], loss_mse_v: [0.9332], loss_postrior_z: [97.6035]] \n", "Epoch 22/100: 100%|██████████| 625/625 [00:11<00:00, 55.75batch/s, loss_px_z: [1.5267], loss_mse_x: [1.2338], loss_py_z: [0.9382], loss_mse_y: [0.8040], loss_pv_z: [104.1450], loss_mse_v: [0.9673], loss_postrior_z: [102.7854]] \n", "Epoch 23/100: 100%|██████████| 625/625 [00:11<00:00, 54.29batch/s, loss_px_z: [0.7087], loss_mse_x: [1.0746], loss_py_z: [1.1086], loss_mse_y: [1.3181], loss_pv_z: [105.0445], loss_mse_v: [0.9765], loss_postrior_z: [102.6641]] \n", "Epoch 24/100: 100%|██████████| 625/625 [00:11<00:00, 54.38batch/s, loss_px_z: [0.3100], loss_mse_x: [0.4896], loss_py_z: [1.1030], loss_mse_y: [1.2588], loss_pv_z: [103.4497], loss_mse_v: [0.9582], loss_postrior_z: [100.2494]] \n", "Epoch 25/100: 100%|██████████| 625/625 [00:11<00:00, 55.14batch/s, loss_px_z: [0.4496], loss_mse_x: [1.0667], loss_py_z: [0.9804], loss_mse_y: [1.0471], loss_pv_z: [106.0292], loss_mse_v: [0.9863], loss_postrior_z: [103.5820]] \n", "Epoch 26/100: 100%|██████████| 625/625 [00:11<00:00, 54.07batch/s, loss_px_z: [0.9430], loss_mse_x: [1.7313], loss_py_z: [0.9116], loss_mse_y: [0.8233], loss_pv_z: [111.1543], loss_mse_v: [1.0376], loss_postrior_z: [108.5810]] \n", "Epoch 27/100: 100%|██████████| 625/625 [00:11<00:00, 55.23batch/s, loss_px_z: [0.3157], loss_mse_x: [0.3745], loss_py_z: [0.8482], loss_mse_y: [0.7153], loss_pv_z: [101.8660], loss_mse_v: [0.9439], loss_postrior_z: [100.0770]] \n", "Epoch 28/100: 100%|██████████| 625/625 [00:11<00:00, 53.60batch/s, loss_px_z: [0.8641], loss_mse_x: [1.8446], loss_py_z: [0.9266], loss_mse_y: [0.8325], loss_pv_z: [103.8543], loss_mse_v: [0.9660], loss_postrior_z: [102.6205]] \n", "Epoch 29/100: 100%|██████████| 625/625 [00:11<00:00, 55.00batch/s, loss_px_z: [0.7417], loss_mse_x: [1.1123], loss_py_z: [1.0385], loss_mse_y: [1.1367], loss_pv_z: [107.2606], loss_mse_v: [0.9963], loss_postrior_z: [104.4046]] \n", "Epoch 30/100: 100%|██████████| 625/625 [00:11<00:00, 55.33batch/s, loss_px_z: [0.7017], loss_mse_x: [2.0424], loss_py_z: [1.0338], loss_mse_y: [1.0654], loss_pv_z: [108.2052], loss_mse_v: [1.0073], loss_postrior_z: [105.8030]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [30/100]: MSE_x: 2.1616, MSE_y: 1.2084, MSE_v: 0.9667\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 31/100: 100%|██████████| 625/625 [00:11<00:00, 55.53batch/s, loss_px_z: [0.5098], loss_mse_x: [0.6142], loss_py_z: [1.1598], loss_mse_y: [1.4640], loss_pv_z: [101.9042], loss_mse_v: [0.9434], loss_postrior_z: [98.7518]] \n", "Epoch 32/100: 100%|██████████| 625/625 [00:11<00:00, 55.46batch/s, loss_px_z: [0.2685], loss_mse_x: [0.3559], loss_py_z: [0.8601], loss_mse_y: [0.7184], loss_pv_z: [99.3381], loss_mse_v: [0.9203], loss_postrior_z: [95.7403]] \n", "Epoch 33/100: 100%|██████████| 625/625 [00:11<00:00, 54.63batch/s, loss_px_z: [0.6054], loss_mse_x: [0.6897], loss_py_z: [1.1666], loss_mse_y: [1.4648], loss_pv_z: [110.0090], loss_mse_v: [1.0229], loss_postrior_z: [107.6170]] \n", "Epoch 34/100: 100%|██████████| 625/625 [00:11<00:00, 55.32batch/s, loss_px_z: [0.6286], loss_mse_x: [1.4439], loss_py_z: [1.1934], loss_mse_y: [1.4473], loss_pv_z: [105.3239], loss_mse_v: [0.9798], loss_postrior_z: [103.2204]] \n", "Epoch 35/100: 100%|██████████| 625/625 [00:11<00:00, 53.97batch/s, loss_px_z: [0.6942], loss_mse_x: [1.5184], loss_py_z: [1.0618], loss_mse_y: [1.2188], loss_pv_z: [108.3755], loss_mse_v: [1.0158], loss_postrior_z: [107.3421]] \n", "Epoch 36/100: 100%|██████████| 625/625 [00:11<00:00, 55.26batch/s, loss_px_z: [0.4048], loss_mse_x: [0.7296], loss_py_z: [1.0736], loss_mse_y: [1.2077], loss_pv_z: [98.7979], loss_mse_v: [0.9153], loss_postrior_z: [96.1371]] \n", "Epoch 37/100: 100%|██████████| 625/625 [00:11<00:00, 56.41batch/s, loss_px_z: [0.6732], loss_mse_x: [2.5477], loss_py_z: [1.1506], loss_mse_y: [1.4312], loss_pv_z: [99.2480], loss_mse_v: [0.9178], loss_postrior_z: [97.5223]] \n", "Epoch 38/100: 100%|██████████| 625/625 [00:11<00:00, 55.61batch/s, loss_px_z: [0.5150], loss_mse_x: [1.2934], loss_py_z: [0.8623], loss_mse_y: [0.8216], loss_pv_z: [106.1062], loss_mse_v: [0.9891], loss_postrior_z: [103.6298]] \n", "Epoch 39/100: 100%|██████████| 625/625 [00:11<00:00, 55.37batch/s, loss_px_z: [0.9153], loss_mse_x: [3.1581], loss_py_z: [0.9936], loss_mse_y: [1.0444], loss_pv_z: [105.5084], loss_mse_v: [0.9839], loss_postrior_z: [103.6738]] \n", "Epoch 40/100: 100%|██████████| 625/625 [00:11<00:00, 54.97batch/s, loss_px_z: [0.6372], loss_mse_x: [1.2377], loss_py_z: [0.8759], loss_mse_y: [0.8238], loss_pv_z: [105.4479], loss_mse_v: [0.9848], loss_postrior_z: [105.0747]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [40/100]: MSE_x: 2.2160, MSE_y: 1.2174, MSE_v: 0.9662\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 41/100: 100%|██████████| 625/625 [00:11<00:00, 55.49batch/s, loss_px_z: [0.3933], loss_mse_x: [0.7077], loss_py_z: [0.8098], loss_mse_y: [0.7087], loss_pv_z: [100.8510], loss_mse_v: [0.9372], loss_postrior_z: [98.1798]] \n", "Epoch 42/100: 100%|██████████| 625/625 [00:11<00:00, 55.60batch/s, loss_px_z: [0.6129], loss_mse_x: [1.1368], loss_py_z: [1.1585], loss_mse_y: [1.5237], loss_pv_z: [100.2316], loss_mse_v: [0.9312], loss_postrior_z: [97.8113]] \n", "Epoch 43/100: 100%|██████████| 625/625 [00:11<00:00, 54.80batch/s, loss_px_z: [0.3872], loss_mse_x: [0.6784], loss_py_z: [1.0379], loss_mse_y: [1.2025], loss_pv_z: [102.1871], loss_mse_v: [0.9516], loss_postrior_z: [99.1012]] \n", "Epoch 44/100: 100%|██████████| 625/625 [00:11<00:00, 54.81batch/s, loss_px_z: [0.5947], loss_mse_x: [1.2953], loss_py_z: [0.9499], loss_mse_y: [0.9979], loss_pv_z: [106.5104], loss_mse_v: [0.9883], loss_postrior_z: [104.6743]] \n", "Epoch 45/100: 100%|██████████| 625/625 [00:11<00:00, 54.32batch/s, loss_px_z: [0.6412], loss_mse_x: [3.7783], loss_py_z: [0.9002], loss_mse_y: [0.9011], loss_pv_z: [97.6416], loss_mse_v: [0.9105], loss_postrior_z: [94.2107]] \n", "Epoch 46/100: 100%|██████████| 625/625 [00:11<00:00, 55.17batch/s, loss_px_z: [0.6056], loss_mse_x: [1.3386], loss_py_z: [0.9334], loss_mse_y: [0.9600], loss_pv_z: [104.2481], loss_mse_v: [0.9693], loss_postrior_z: [102.1923]] \n", "Epoch 47/100: 100%|██████████| 625/625 [00:11<00:00, 54.82batch/s, loss_px_z: [0.6723], loss_mse_x: [7.5391], loss_py_z: [0.9108], loss_mse_y: [0.9672], loss_pv_z: [103.6044], loss_mse_v: [0.9630], loss_postrior_z: [102.2846]] \n", "Epoch 48/100: 100%|██████████| 625/625 [00:11<00:00, 54.92batch/s, loss_px_z: [0.2197], loss_mse_x: [0.4434], loss_py_z: [1.0514], loss_mse_y: [1.4217], loss_pv_z: [104.7859], loss_mse_v: [0.9797], loss_postrior_z: [101.7223]] \n", "Epoch 49/100: 100%|██████████| 625/625 [00:11<00:00, 55.71batch/s, loss_px_z: [0.2410], loss_mse_x: [0.4813], loss_py_z: [0.9054], loss_mse_y: [1.0336], loss_pv_z: [103.0146], loss_mse_v: [0.9606], loss_postrior_z: [101.0885]] \n", "Epoch 50/100: 100%|██████████| 625/625 [00:11<00:00, 54.98batch/s, loss_px_z: [0.5846], loss_mse_x: [1.2790], loss_py_z: [0.9430], loss_mse_y: [1.0161], loss_pv_z: [111.7826], loss_mse_v: [1.0438], loss_postrior_z: [110.1667]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [50/100]: MSE_x: 2.1777, MSE_y: 1.2043, MSE_v: 0.9657\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 51/100: 100%|██████████| 625/625 [00:11<00:00, 54.96batch/s, loss_px_z: [1.0339], loss_mse_x: [1.5230], loss_py_z: [0.9928], loss_mse_y: [1.1792], loss_pv_z: [104.4264], loss_mse_v: [0.9691], loss_postrior_z: [102.5903]] \n", "Epoch 52/100: 100%|██████████| 625/625 [00:11<00:00, 54.79batch/s, loss_px_z: [0.7486], loss_mse_x: [0.7666], loss_py_z: [1.1842], loss_mse_y: [1.5948], loss_pv_z: [102.5457], loss_mse_v: [0.9553], loss_postrior_z: [101.0967]] \n", "Epoch 53/100: 100%|██████████| 625/625 [00:11<00:00, 54.98batch/s, loss_px_z: [0.3077], loss_mse_x: [1.0589], loss_py_z: [1.0254], loss_mse_y: [1.2029], loss_pv_z: [104.0903], loss_mse_v: [0.9721], loss_postrior_z: [101.5168]] \n", "Epoch 54/100: 100%|██████████| 625/625 [00:11<00:00, 54.34batch/s, loss_px_z: [0.4946], loss_mse_x: [0.9493], loss_py_z: [0.9811], loss_mse_y: [1.1906], loss_pv_z: [103.0164], loss_mse_v: [0.9565], loss_postrior_z: [100.3452]] \n", "Epoch 55/100: 100%|██████████| 625/625 [00:11<00:00, 55.08batch/s, loss_px_z: [0.3406], loss_mse_x: [5.0589], loss_py_z: [0.8992], loss_mse_y: [1.0087], loss_pv_z: [98.9583], loss_mse_v: [0.9173], loss_postrior_z: [97.5815]] \n", "Epoch 56/100: 100%|██████████| 625/625 [00:11<00:00, 54.77batch/s, loss_px_z: [0.3262], loss_mse_x: [0.3477], loss_py_z: [1.0027], loss_mse_y: [1.1875], loss_pv_z: [107.3604], loss_mse_v: [1.0007], loss_postrior_z: [104.1735]] \n", "Epoch 57/100: 100%|██████████| 625/625 [00:11<00:00, 55.67batch/s, loss_px_z: [0.2425], loss_mse_x: [0.5210], loss_py_z: [0.8429], loss_mse_y: [0.8359], loss_pv_z: [105.6930], loss_mse_v: [0.9835], loss_postrior_z: [101.8994]] \n", "Epoch 58/100: 100%|██████████| 625/625 [00:11<00:00, 55.48batch/s, loss_px_z: [0.4562], loss_mse_x: [1.4668], loss_py_z: [0.9041], loss_mse_y: [1.0505], loss_pv_z: [106.8178], loss_mse_v: [0.9959], loss_postrior_z: [105.5796]] \n", "Epoch 59/100: 100%|██████████| 625/625 [00:11<00:00, 54.85batch/s, loss_px_z: [0.1841], loss_mse_x: [0.9394], loss_py_z: [1.0556], loss_mse_y: [1.6084], loss_pv_z: [95.1684], loss_mse_v: [0.8880], loss_postrior_z: [93.4943]] \n", "Epoch 60/100: 100%|██████████| 625/625 [00:11<00:00, 54.79batch/s, loss_px_z: [0.4262], loss_mse_x: [0.3860], loss_py_z: [0.7917], loss_mse_y: [0.8005], loss_pv_z: [104.1415], loss_mse_v: [0.9713], loss_postrior_z: [102.0446]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [60/100]: MSE_x: 2.1817, MSE_y: 1.1895, MSE_v: 0.9652\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 61/100: 100%|██████████| 625/625 [00:11<00:00, 55.19batch/s, loss_px_z: [0.3869], loss_mse_x: [0.7310], loss_py_z: [1.0391], loss_mse_y: [1.3771], loss_pv_z: [104.6561], loss_mse_v: [0.9732], loss_postrior_z: [101.3780]] \n", "Epoch 62/100: 100%|██████████| 625/625 [00:11<00:00, 54.76batch/s, loss_px_z: [0.5479], loss_mse_x: [0.6498], loss_py_z: [0.8399], loss_mse_y: [0.8538], loss_pv_z: [101.8596], loss_mse_v: [0.9493], loss_postrior_z: [99.5369]] \n", "Epoch 63/100: 100%|██████████| 625/625 [00:11<00:00, 55.01batch/s, loss_px_z: [0.5373], loss_mse_x: [0.9175], loss_py_z: [0.9829], loss_mse_y: [1.1854], loss_pv_z: [102.4637], loss_mse_v: [0.9533], loss_postrior_z: [100.1760]] \n", "Epoch 64/100: 100%|██████████| 625/625 [00:11<00:00, 55.09batch/s, loss_px_z: [0.2867], loss_mse_x: [1.5419], loss_py_z: [0.9317], loss_mse_y: [1.2228], loss_pv_z: [96.9979], loss_mse_v: [0.9007], loss_postrior_z: [95.0470]] \n", "Epoch 65/100: 100%|██████████| 625/625 [00:11<00:00, 55.44batch/s, loss_px_z: [0.6300], loss_mse_x: [1.4146], loss_py_z: [0.8759], loss_mse_y: [0.9186], loss_pv_z: [107.2320], loss_mse_v: [1.0003], loss_postrior_z: [105.5436]] \n", "Epoch 66/100: 100%|██████████| 625/625 [00:11<00:00, 53.91batch/s, loss_px_z: [0.3859], loss_mse_x: [2.8775], loss_py_z: [0.9805], loss_mse_y: [1.2691], loss_pv_z: [104.1365], loss_mse_v: [0.9740], loss_postrior_z: [104.6624]] \n", "Epoch 67/100: 100%|██████████| 625/625 [00:11<00:00, 55.30batch/s, loss_px_z: [0.5155], loss_mse_x: [2.5749], loss_py_z: [0.8094], loss_mse_y: [0.8627], loss_pv_z: [104.7769], loss_mse_v: [0.9788], loss_postrior_z: [102.0515]] \n", "Epoch 68/100: 100%|██████████| 625/625 [00:11<00:00, 55.20batch/s, loss_px_z: [0.2483], loss_mse_x: [0.5678], loss_py_z: [1.0396], loss_mse_y: [1.2972], loss_pv_z: [104.7215], loss_mse_v: [0.9814], loss_postrior_z: [102.0759]] \n", "Epoch 69/100: 100%|██████████| 625/625 [00:11<00:00, 55.26batch/s, loss_px_z: [1.4218], loss_mse_x: [1.1111], loss_py_z: [0.8525], loss_mse_y: [0.9750], loss_pv_z: [103.8017], loss_mse_v: [0.9686], loss_postrior_z: [102.3827]] \n", "Epoch 70/100: 100%|██████████| 625/625 [00:11<00:00, 54.61batch/s, loss_px_z: [0.2590], loss_mse_x: [0.5932], loss_py_z: [0.8803], loss_mse_y: [1.1457], loss_pv_z: [104.2802], loss_mse_v: [0.9745], loss_postrior_z: [101.8869]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [70/100]: MSE_x: 2.0605, MSE_y: 1.2068, MSE_v: 0.9650\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 71/100: 100%|██████████| 625/625 [00:11<00:00, 54.63batch/s, loss_px_z: [0.9122], loss_mse_x: [4.1757], loss_py_z: [0.8866], loss_mse_y: [1.1041], loss_pv_z: [99.0652], loss_mse_v: [0.9213], loss_postrior_z: [98.8926]] \n", "Epoch 72/100: 100%|██████████| 625/625 [00:11<00:00, 55.25batch/s, loss_px_z: [0.7746], loss_mse_x: [1.6122], loss_py_z: [0.7496], loss_mse_y: [0.7539], loss_pv_z: [104.4348], loss_mse_v: [0.9758], loss_postrior_z: [101.8911]] \n", "Epoch 73/100: 100%|██████████| 625/625 [00:11<00:00, 55.42batch/s, loss_px_z: [0.5040], loss_mse_x: [1.4536], loss_py_z: [0.9477], loss_mse_y: [1.1859], loss_pv_z: [103.3225], loss_mse_v: [0.9635], loss_postrior_z: [101.3829]] \n", "Epoch 74/100: 100%|██████████| 625/625 [00:11<00:00, 55.29batch/s, loss_px_z: [0.5007], loss_mse_x: [0.7652], loss_py_z: [0.9774], loss_mse_y: [1.3177], loss_pv_z: [102.7477], loss_mse_v: [0.9562], loss_postrior_z: [100.9115]] \n", "Epoch 75/100: 100%|██████████| 625/625 [00:11<00:00, 55.45batch/s, loss_px_z: [0.6312], loss_mse_x: [0.5428], loss_py_z: [1.0763], loss_mse_y: [1.4158], loss_pv_z: [108.3980], loss_mse_v: [1.0175], loss_postrior_z: [106.3569]] \n", "Epoch 76/100: 100%|██████████| 625/625 [00:11<00:00, 55.03batch/s, loss_px_z: [1.1616], loss_mse_x: [3.6411], loss_py_z: [0.9174], loss_mse_y: [1.1184], loss_pv_z: [101.4809], loss_mse_v: [0.9504], loss_postrior_z: [100.3156]] \n", "Epoch 77/100: 100%|██████████| 625/625 [00:11<00:00, 55.45batch/s, loss_px_z: [0.2270], loss_mse_x: [1.4151], loss_py_z: [0.7666], loss_mse_y: [0.9107], loss_pv_z: [99.8907], loss_mse_v: [0.9310], loss_postrior_z: [97.7918]] \n", "Epoch 78/100: 100%|██████████| 625/625 [00:11<00:00, 55.30batch/s, loss_px_z: [0.5104], loss_mse_x: [2.5735], loss_py_z: [1.0417], loss_mse_y: [1.3955], loss_pv_z: [102.6700], loss_mse_v: [0.9608], loss_postrior_z: [100.8437]] \n", "Epoch 79/100: 100%|██████████| 625/625 [00:11<00:00, 55.60batch/s, loss_px_z: [0.2810], loss_mse_x: [1.1481], loss_py_z: [0.7788], loss_mse_y: [0.8689], loss_pv_z: [99.6064], loss_mse_v: [0.9245], loss_postrior_z: [99.1888]] \n", "Epoch 80/100: 100%|██████████| 625/625 [00:11<00:00, 56.25batch/s, loss_px_z: [0.4661], loss_mse_x: [0.6606], loss_py_z: [0.9857], loss_mse_y: [1.2555], loss_pv_z: [97.2984], loss_mse_v: [0.9066], loss_postrior_z: [95.6442]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [80/100]: MSE_x: 2.0278, MSE_y: 1.1949, MSE_v: 0.9645\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 81/100: 100%|██████████| 625/625 [00:11<00:00, 54.68batch/s, loss_px_z: [0.3389], loss_mse_x: [1.4112], loss_py_z: [0.7984], loss_mse_y: [0.9120], loss_pv_z: [106.6279], loss_mse_v: [0.9946], loss_postrior_z: [105.3045]] \n", "Epoch 82/100: 100%|██████████| 625/625 [00:11<00:00, 53.96batch/s, loss_px_z: [0.3469], loss_mse_x: [0.7758], loss_py_z: [0.7624], loss_mse_y: [0.9110], loss_pv_z: [96.9946], loss_mse_v: [0.9044], loss_postrior_z: [94.0614]] \n", "Epoch 83/100: 100%|██████████| 625/625 [00:11<00:00, 53.81batch/s, loss_px_z: [0.2615], loss_mse_x: [0.3087], loss_py_z: [0.9122], loss_mse_y: [1.1561], loss_pv_z: [110.0109], loss_mse_v: [1.0239], loss_postrior_z: [107.2893]] \n", "Epoch 84/100: 100%|██████████| 625/625 [00:11<00:00, 54.81batch/s, loss_px_z: [0.0938], loss_mse_x: [0.2996], loss_py_z: [0.8764], loss_mse_y: [1.0378], loss_pv_z: [104.0820], loss_mse_v: [0.9701], loss_postrior_z: [101.2576]] \n", "Epoch 85/100: 100%|██████████| 625/625 [00:11<00:00, 54.97batch/s, loss_px_z: [0.7172], loss_mse_x: [1.4699], loss_py_z: [1.0360], loss_mse_y: [1.5079], loss_pv_z: [106.3758], loss_mse_v: [0.9988], loss_postrior_z: [104.7337]] \n", "Epoch 86/100: 100%|██████████| 625/625 [00:11<00:00, 55.05batch/s, loss_px_z: [0.1134], loss_mse_x: [3.9313], loss_py_z: [0.8578], loss_mse_y: [1.3222], loss_pv_z: [99.4824], loss_mse_v: [0.9270], loss_postrior_z: [97.2417]] \n", "Epoch 87/100: 100%|██████████| 625/625 [00:11<00:00, 54.46batch/s, loss_px_z: [0.1477], loss_mse_x: [0.4027], loss_py_z: [0.9585], loss_mse_y: [1.6592], loss_pv_z: [105.9451], loss_mse_v: [0.9952], loss_postrior_z: [104.9820]] \n", "Epoch 88/100: 100%|██████████| 625/625 [00:11<00:00, 54.60batch/s, loss_px_z: [0.7088], loss_mse_x: [0.8604], loss_py_z: [0.9679], loss_mse_y: [1.2659], loss_pv_z: [109.0925], loss_mse_v: [1.0223], loss_postrior_z: [106.7311]] \n", "Epoch 89/100: 100%|██████████| 625/625 [00:11<00:00, 54.62batch/s, loss_px_z: [0.3217], loss_mse_x: [0.6296], loss_py_z: [0.7441], loss_mse_y: [0.8663], loss_pv_z: [103.1253], loss_mse_v: [0.9651], loss_postrior_z: [101.4039]] \n", "Epoch 90/100: 100%|██████████| 625/625 [00:11<00:00, 54.76batch/s, loss_px_z: [0.3576], loss_mse_x: [2.2540], loss_py_z: [0.9933], loss_mse_y: [1.3456], loss_pv_z: [103.8477], loss_mse_v: [0.9681], loss_postrior_z: [101.4713]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [90/100]: MSE_x: 2.0580, MSE_y: 1.1633, MSE_v: 0.9644\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 91/100: 100%|██████████| 625/625 [00:11<00:00, 54.66batch/s, loss_px_z: [0.1603], loss_mse_x: [0.4676], loss_py_z: [0.7444], loss_mse_y: [0.8241], loss_pv_z: [108.7655], loss_mse_v: [1.0234], loss_postrior_z: [106.3370]] \n", "Epoch 92/100: 100%|██████████| 625/625 [00:11<00:00, 53.44batch/s, loss_px_z: [0.1892], loss_mse_x: [0.7174], loss_py_z: [1.1678], loss_mse_y: [1.8073], loss_pv_z: [113.5816], loss_mse_v: [1.0619], loss_postrior_z: [111.2462]] \n", "Epoch 93/100: 100%|██████████| 625/625 [00:11<00:00, 54.54batch/s, loss_px_z: [0.1294], loss_mse_x: [0.7718], loss_py_z: [0.8597], loss_mse_y: [1.1468], loss_pv_z: [99.1875], loss_mse_v: [0.9276], loss_postrior_z: [97.8237]] \n", "Epoch 94/100: 100%|██████████| 625/625 [00:11<00:00, 54.27batch/s, loss_px_z: [0.8639], loss_mse_x: [1.9431], loss_py_z: [1.0255], loss_mse_y: [1.4076], loss_pv_z: [102.7940], loss_mse_v: [0.9620], loss_postrior_z: [101.0259]] \n", "Epoch 95/100: 100%|██████████| 625/625 [00:11<00:00, 55.64batch/s, loss_px_z: [0.4005], loss_mse_x: [1.7976], loss_py_z: [0.8490], loss_mse_y: [1.1049], loss_pv_z: [100.7964], loss_mse_v: [0.9436], loss_postrior_z: [98.7635]] \n", "Epoch 96/100: 100%|██████████| 625/625 [00:11<00:00, 55.98batch/s, loss_px_z: [0.0117], loss_mse_x: [0.2462], loss_py_z: [0.7910], loss_mse_y: [0.9281], loss_pv_z: [109.1485], loss_mse_v: [1.0273], loss_postrior_z: [106.6896]] \n", "Epoch 97/100: 100%|██████████| 625/625 [00:11<00:00, 52.94batch/s, loss_px_z: [0.2551], loss_mse_x: [0.8334], loss_py_z: [0.9307], loss_mse_y: [1.2324], loss_pv_z: [102.6908], loss_mse_v: [0.9649], loss_postrior_z: [100.4549]] \n", "Epoch 98/100: 100%|██████████| 625/625 [00:11<00:00, 53.89batch/s, loss_px_z: [1.5356], loss_mse_x: [6.9516], loss_py_z: [0.8813], loss_mse_y: [1.1969], loss_pv_z: [103.2901], loss_mse_v: [0.9661], loss_postrior_z: [103.3188]] \n", "Epoch 99/100: 100%|██████████| 625/625 [00:11<00:00, 55.43batch/s, loss_px_z: [0.3029], loss_mse_x: [2.1966], loss_py_z: [0.6606], loss_mse_y: [0.6747], loss_pv_z: [103.4311], loss_mse_v: [0.9697], loss_postrior_z: [101.9436]] \n", "Epoch 100/100: 100%|██████████| 625/625 [00:11<00:00, 55.07batch/s, loss_px_z: [0.1279], loss_mse_x: [0.5865], loss_py_z: [0.7868], loss_mse_y: [0.9442], loss_pv_z: [105.4194], loss_mse_v: [0.9945], loss_postrior_z: [102.6229]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [100/100]: MSE_x: 2.0460, MSE_y: 1.1746, MSE_v: 0.9638\n", "\n" ] } ], "source": [ "model.fit(data=(x,y,v), epochs=100, epochs_per_eval=10, use_egm_init=True, egm_n_iter=30000, egm_batches_per_eval=500, verbose=1)" ] }, { "cell_type": "markdown", "id": "e1156ff9", "metadata": {}, "source": [ "### Make predictions using the trained CausalBGM model\n", "\n", "Estimate causal effects with posterior intervals from latent MCMC samples.\n", "\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `data` | Tuple of data inputs `(x, y, v)`, *Required.* |\n", "| `alpha` | Significance level for the posterior interval. *Default: 0.01.* |\n", "| `n_mcmc` | Number of posterior MCMC samples to draw. *Default: 3000.* |\n", "| `burn_in` | Number of burn-in MCMC samples before drawing. *Default: 5000.* |\n", "| `x_values` | Treatment value(s) for dose-response function to be predicted. *Examples: 1.0 or [1.0,2.0]* |\n", "| `q_sd` | Standard deviation for the proposal distribution used in Metropolis-Hastings (MH) sampling. *Default: 1.0.* |\n", "| `sample_y` | Whether to consider the variance function in the outcome generative model. *Default: True.* |\n", "| `bs` | Batch size in inference stage, denoting number of test subjects processed per batch prediction. *Default: 10000.* |\n", "\n", "\n", "| Return | Type | Description | Shape |\n", "|------------|---------------|---------------------------------------------------------------------------------------------------------|-------------|\n", "| `pre_adrf_mean` | `np.ndarray` | Point estimates of the Average Dose-Response Function. | `(len(x_values),)` |\n", "| `pre_adrf_PI` | `np.ndarray` | Posterior intervals for the ADRF, representing `[lower bound, upper bound]` | `(len(x_values), 2)` " ] }, { "cell_type": "code", "execution_count": 6, "id": "d237fb5c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MCMC Latent Variable Sampling ...\n", "Final MCMC Acceptance Rate: 0.0948\n" ] } ], "source": [ "pre_adrf_mean, pre_adrf_PI = model.predict(data=(x,y,v), alpha=0.01, n_mcmc=3000, burn_in=5000, x_values=np.linspace(0,3,20), q_sd=1.0, bs=20000)" ] }, { "cell_type": "markdown", "id": "4f037857", "metadata": {}, "source": [ "### Visualizating and evaluating the results\n", "\n", "Show the true average dose-response function (ADRF) and the predicted ADRF." ] }, { "cell_type": "code", "execution_count": 7, "id": "44249fff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RMSE (Root Mean Squared Error): 0.0188\n", "MAPE (Mean Absolute Percentage Error): 0.0103\n" ] }, { "data": { "image/png": "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IYSoSV7bIENUzJv2/BI1R3I1H8nUnCRX85FMzUcyNSej5io7vRmMv78/zz//vFsDD2F8kqv5SKbmJLmaj2RqPpKpORk1V1nZEkIIIYQQQohaICtbQgghhBBCCFELpNgSQgghhBBCiFogxZYQQgghhBBC1AIptoQQQgghhBCiFkix5YXeeustWrduTUBAAH369GH9+vUXPH/BggV06NCBgIAAkpKS+O677+popKI6qpPrnDlz0DTN7SMgIKAORysuZtWqVYwbN46IiAg0TWPRokUX/ZoVK1bQvXt3/P39adu2LXPmzKn1cYqqq26mK1asKPc61TSN9PT0uhmwuKiZM2fSq1cvAgMDadmyJePHj2fXrl0X/Tr5ueq9LiVT+Znq/d555x06d+7s3LC4X79+fP/99xf8GqO8TqXY8jKffvop06ZN4/nnn2fz5s106dKF0aNHc/LkyQrPX716NZMnT+auu+5iy5YtjB8/nvHjx7N9+/Y6Hrm4kOrmCmqH9OPHjzs/Dh06VIcjFhdTUFBAly5deOutt6p0/oEDBxg7dixDhw5l69atPP7449x999388MMPtTxSUVXVzdRh165dbq/Vli1b1tIIRXWtXLmShx56iLVr17JkyRJKSkoYNWoUBQUFlX6N/Fz1bpeSKcjPVG8XFRXFiy++yKZNm9i4cSPDhg3j2muvJSUlpcLzDfU61YVX6d27t/7QQw85H9tsNj0iIkKfOXNmheffeOON+tixY92O9enTR7/vvvtqdZyieqqb6+zZs/Xg4OA6Gp24XIC+cOHCC54zffp0PTEx0e3YTTfdpI8ePboWRyYuVVUyXb58uQ7o2dnZdTImcflOnjypA/rKlSsrPUd+rhpLVTKVn6nG1LRpU/3999+v8HNGep3KypYXKS4uZtOmTYwYMcJ5zGKxMGLECNasWVPh16xZs8btfIDRo0dXer6oe5eSK0B+fj6tWrUiOjr6gu/uCGOQ16p5de3alfDwcEaOHMmvv/7q6eGIC8jJyQEgJCSk0nPktWosVckU5GeqkdhsNubPn09BQQH9+vWr8BwjvU6l2PIip06dwmazERoa6nY8NDS00nsA0tPTq3W+qHuXkmt8fDwffPABX375JR999BF2u53+/ftz5MiRuhiyqAWVvVZzc3M5e/ash0YlLkd4eDizZs3iiy++4IsvviA6OpohQ4awefNmTw9NVMBut/P4448zYMAAOnXqVOl58nPVOKqaqfxMNYbk5GQaN26Mv78/999/PwsXLiQhIaHCc430OvXx9ACEEOX169fP7d2c/v3707FjR959913+8pe/eHBkQgiH+Ph44uPjnY/79+/Pvn37ePXVV/nwww89ODJRkYceeojt27fzyy+/eHooooZUNVP5mWoM8fHxbN26lZycHD7//HOmTp3KypUrKy24jEJWtrxI8+bNsVqtnDhxwu34iRMnCAsLq/BrwsLCqnW+qHuXkuv5fH196datG3v37q2NIYo6UNlrNSgoiAYNGnhoVKKm9e7dW16nXujhhx/mm2++Yfny5URFRV3wXPm5agzVyfR88jPVO/n5+dG2bVt69OjBzJkz6dKlC6+//nqF5xrpdSrFlhfx8/OjR48eLF261HnMbrezdOnSSq9Z7devn9v5AEuWLKn0fFH3LiXX89lsNpKTkwkPD6+tYYpaJq/V+mHr1q3yOvUiuq7z8MMPs3DhQpYtW0abNm0u+jXyWvVul5Lp+eRnqjHY7XaKiooq/JyhXqee7tAh3M2fP1/39/fX58yZo6empur33nuv3qRJEz09PV3XdV2/9dZb9aefftp5/q+//qr7+PjoL7/8sr5jxw79+eef1319ffXk5GRPTUFUoLq5zpgxQ//hhx/0ffv26Zs2bdInTZqkBwQE6CkpKZ6agjhPXl6evmXLFn3Lli06oL/yyiv6li1b9EOHDum6rutPP/20fuuttzrP379/v96wYUP997//vb5jxw79rbfe0q1Wq7548WJPTUGcp7qZvvrqq/qiRYv0PXv26MnJyfpjjz2mWywW/aeffvLUFMR5HnjgAT04OFhfsWKFfvz4cefHmTNnnOfIz1VjuZRM5Weq93v66af1lStX6gcOHNC3bdumP/3007qmafqPP/6o67qxX6dSbHmhf/3rX3pMTIzu5+en9+7dW1+7dq3zc4MHD9anTp3qdv5nn32mt2/fXvfz89MTExP1b7/9to5HLKqiOrk+/vjjznNDQ0P1MWPG6Js3b/bAqEVlHG2/z/9w5Dh16lR98ODB5b6ma9euup+fnx4bG6vPnj27zsctKlfdTF966SU9Li5ODwgI0ENCQvQhQ4boy5Yt88zgRYUqyhNwe+3Jz1VjuZRM5Weq97vzzjv1Vq1a6X5+fnqLFi304cOHOwstXTf261TTdV2vu3U0IYQQQgghhKgf5J4tIYQQQgghhKgFUmwJIYQQQgghRC2QYksIIYQQQgghaoEUW0IIIYQQQghRC6TYEkIIIYQQQohaIMWWEEIIIYQQQtQCKbaEEEIIIYQQohZIsSWEEEIIIYQQtUCKLSGEEMKkVqxYgaZprFixwtNDEUKIekmKLSGEEBekaVqVPurqF/q3336bOXPm1MmfdblSU1P505/+xMGDBy96bufOnYmJiUHX9UrPGTBgAKGhoZSWltbgKIUQQtQWH08PQAghhHf78MMP3R7PnTuXJUuWlDvesWPHOhnP22+/TfPmzbn99tvr5M+7HKmpqcyYMYMhQ4bQunXrC547ZcoUnn76aX7++WcGDRpU7vMHDx5kzZo1PPzww/j4yI9vIYQwAvluLYQQ4oJuueUWt8dr165lyZIl5Y6f78yZMzRs2LA2h2YqN998M8888wzz5s2rsNj65JNP0HWdKVOmeGB0QgghLoVcRiiEEOKyDRkyhE6dOrFp0yYGDRpEw4YN+cMf/gBAUVERzz//PG3btsXf35/o6GimT59OUVGR23PMnj2bYcOG0bJlS/z9/UlISOCdd95xO6d169akpKSwcuVK5+WLQ4YMAWDOnDlomsYvv/zCo48+SosWLWjSpAn33XcfxcXFnD59mttuu42mTZvStGlTpk+fXu6SPbvdzmuvvUZiYiIBAQGEhoZy3333kZ2dXW4cV199Nb/88gu9e/cmICCA2NhY5s6d6zxnzpw5TJw4EYChQ4de9HLL6OhoBg0axOeff05JSUm5z8+bN4+4uDj69OnDoUOHePDBB4mPj6dBgwY0a9aMiRMnVulyxdatW1e4KjhkyBDn36VDVbMTQghRMVnZEkIIUSMyMzO56qqrmDRpErfccguhoaHY7XauueYafvnlF+699146duxIcnIyr776Krt372bRokXOr3/nnXdITEzkmmuuwcfHh6+//poHH3wQu93OQw89BMBrr73GI488QuPGjXn22WcBCA0NdRvHI488QlhYGDNmzGDt2rW89957NGnShNWrVxMTE8MLL7zAd999xz/+8Q86derEbbfd5vza++67jzlz5nDHHXfw6KOPcuDAAd588022bNnCr7/+iq+vr/PcvXv3csMNN3DXXXcxdepUPvjgA26//XZ69OhBYmIigwYN4tFH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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from bayesgm.utils import get_ADRF\n", "\n", "x_values = np.linspace(0,3,20) # treatment values\n", "true_adrf = get_ADRF(x_values = x_values, dataset='Imbens') # true ADRF for Hirano and Imbens dataset\n", "\n", "# Evaluate\n", "rmse = np.sqrt(np.mean((true_adrf-pre_adrf_mean)**2))\n", "mape = np.mean([abs((item[0]-item[1])/item[0]) for item in zip(true_adrf, pre_adrf_mean)])\n", "\n", "print(f\"RMSE (Root Mean Squared Error): {rmse:.4f}\")\n", "print(f\"MAPE (Mean Absolute Percentage Error): {mape:.4f}\")\n", "\n", "# Create the plot\n", "plt.figure(figsize=(10, 6))\n", "# Plot the ground truth curve\n", "plt.plot(x_values, true_adrf, label='True ADRF', color='blue', linestyle='--', linewidth=2)\n", "# Plot the predicted mean curve\n", "plt.plot(x_values, pre_adrf_mean, label='Predicted ADRF', color='red', linewidth=2)\n", "# Plot the posterior intervals\n", "plt.fill_between(x_values, pre_adrf_PI[:, 0], pre_adrf_PI[:, 1], color='red', alpha=0.4, label='Posterior Interval')\n", "\n", "# Add labels, legend, and title\n", "plt.xlabel('Treatment Value', fontsize=12)\n", "plt.ylabel('ADRF', fontsize=12)\n", "plt.title('True vs Predicted ADRF (RMSE=%.4f,MAPE=%.4f)'%(rmse, mape), fontsize=14)\n", "plt.legend(fontsize=12)\n", "plt.grid(True, linestyle='--', alpha=0.6)\n", "\n", "# Show the plot\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "ceb3b113", "metadata": {}, "source": [ "## Use CausalBGM Python API in binary treatment setting\n", "\n", "We will use `ACIC 2018` dataset for an example." ] }, { "cell_type": "markdown", "id": "a4ae26fd-fc6a-460c-a50b-820b3f0fdb63", "metadata": {}, "source": [ "
\n", "Reminder\n", "\n", "- Set *binary_treatment* to *True* in the config file. \n", "- Make sure the *v_dim* matches the number of covariates in the dateset.\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 8, "id": "073b1a2c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'dataset': 'Semi_acic', 'output_dir': '.', 'save_res': True, 'save_model': True, 'binary_treatment': True, 'use_bnn': True, 'z_dims': [3, 6, 3, 6], 'v_dim': 177, 'lr_theta': 0.0001, 'lr_z': 0.0001, 'g_units': [64, 64, 64, 64, 64], 'f_units': [64, 32, 8], 'h_units': [64, 32, 8], 'kl_weight': 0.0001, 'lr': 0.0002, 'g_d_freq': 5, 'use_z_rec': True, 'e_units': [64, 64, 64, 64, 64], 'dz_units': [64, 32, 8]}\n" ] } ], "source": [ "params = yaml.safe_load(open('src/configs/Semi_acic.yaml', 'r'))\n", "print(params)" ] }, { "cell_type": "markdown", "id": "703c410d", "metadata": {}, "source": [ "### Instantiate a CausalBGM model" ] }, { "cell_type": "code", "execution_count": 9, "id": "cb0f60a9", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:95: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " loc = add_variable_fn(\n", "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:105: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " untransformed_scale = add_variable_fn(\n" ] } ], "source": [ "model = bayesgm.models.CausalBGM(params=params,random_seed=None)" ] }, { "cell_type": "markdown", "id": "745230e8", "metadata": {}, "source": [ "### Data preparation \n", "\n", "The input data are organized in a triplet, which contains treatment (*X*), potential outcome (*Y*), and covariates (*V*)." ] }, { "cell_type": "code", "execution_count": 10, "id": "4f73f046", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1000, 1) (1000, 1) (1000, 177)\n" ] } ], "source": [ "#get the data from the ACIC 2018 competition dataset with a specified ufid.\n", "x,y,v = bayesgm.datasets.Semi_acic_sampler(path='data/ACIC_2018',ufid='629e3d2c63914e45b227cc913c09cebe').load_all()\n", "print(x.shape,y.shape,v.shape)" ] }, { "cell_type": "markdown", "id": "2e04a5b0", "metadata": {}, "source": [ "### Model training\n", "\n", "Train CausalBGM with an optional EGM warm-start. \n", "\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `data` | Tuple of data inputs `(x, y, v)`, *Required.* |\n", "| `batch_size` | Batch size for training. *Default: 32.* |\n", "| `epochs` | Number of epochs for training. *Default: 100.* |\n", "| `epochs_per_eval` | Frequency of evaluations during training (e.g., every 5 epochs). *Default: 5.* |\n", "| `use_egm_init` | Whether to run EGM initialization before iterative training. *Default: True.* |\n", "| `epochs_per_eval` | Frequency of evaluations during training (e.g., every 5 epochs). *Default: 5.* |\n", "| `egm_n_iter` | Number of EGM initialization iterations. *Default: 30000.* |\n", "| `egm_batches_per_eval` | Evaluate EGM initialization every this many iterations. *Default: 500.* |\n", "| `verbose` | Controls verbosity level, showing progress and evaluation metrics. *Default: 1.* |\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "10de4f29", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "EGM Initialization Starts ...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:95: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " loc = add_variable_fn(\n", "/home/ql339/.conda/envs/py3.9/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:105: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " untransformed_scale = add_variable_fn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "EGM Initialization Iter [0] : e_loss_adv [0.1102], l2_loss_v [0.8648], l2_loss_z [1.0305], l2_loss_x [0.6933], l2_loss_y [0.5305], g_e_loss [3.2293], dz_loss [0.0733], d_loss [0.3746]\n", "EGM Initialization Iter [500] : e_loss_adv [2.2379], l2_loss_v [1.0616], l2_loss_z [0.9627], l2_loss_x [0.6788], l2_loss_y [0.1069], g_e_loss [5.0480], dz_loss [-1.7182], d_loss [-1.2625]\n", "EGM Initialization Iter [1000] : e_loss_adv [-0.0245], l2_loss_v [1.4840], l2_loss_z [1.0821], l2_loss_x [0.6829], l2_loss_y [0.0910], g_e_loss [3.3154], dz_loss [-1.3309], d_loss [-1.2576]\n", "EGM Initialization Iter [1500] : e_loss_adv [-1.6068], l2_loss_v [0.4169], l2_loss_z [1.0244], l2_loss_x [0.6923], l2_loss_y [0.0486], g_e_loss [0.5754], dz_loss [-1.0655], d_loss [-0.9715]\n", "EGM Initialization Iter [2000] : e_loss_adv [-1.6149], l2_loss_v [0.6514], l2_loss_z [0.8222], l2_loss_x [0.6996], l2_loss_y [0.1217], g_e_loss [0.6800], dz_loss [-0.8808], d_loss [-0.6829]\n", "EGM Initialization Iter [2500] : e_loss_adv [-1.7912], l2_loss_v [1.6250], l2_loss_z [1.0236], l2_loss_x [0.6911], l2_loss_y [0.1043], g_e_loss [1.6528], dz_loss [-0.5761], d_loss [-0.5062]\n", "EGM Initialization Iter [3000] : e_loss_adv [-2.6811], l2_loss_v [0.6036], l2_loss_z [0.8955], l2_loss_x [0.6970], l2_loss_y [0.1193], g_e_loss [-0.3656], dz_loss [-1.3826], d_loss [-1.1942]\n", "EGM Initialization Iter [3500] : e_loss_adv [-2.8498], l2_loss_v [0.6821], l2_loss_z [0.8155], l2_loss_x [0.6820], l2_loss_y [0.0911], g_e_loss [-0.5792], dz_loss [-0.2488], d_loss [-0.1469]\n", "EGM Initialization Iter [4000] : e_loss_adv [-2.9439], l2_loss_v [0.4767], l2_loss_z [0.9369], l2_loss_x [0.6887], l2_loss_y [0.0918], g_e_loss [-0.7499], dz_loss [-0.6104], d_loss [-0.4594]\n", "EGM Initialization Iter [4500] : e_loss_adv [-2.6417], l2_loss_v [0.7067], l2_loss_z [0.9116], l2_loss_x [0.7060], l2_loss_y [0.1264], g_e_loss [-0.1910], dz_loss [-1.3566], d_loss [-1.0913]\n", "EGM Initialization Iter [5000] : e_loss_adv [-1.0904], l2_loss_v [0.9057], l2_loss_z [0.9335], l2_loss_x [0.7084], l2_loss_y [0.1196], g_e_loss [1.5769], dz_loss [-0.4903], d_loss [-0.3944]\n", "EGM Initialization Iter [5500] : e_loss_adv [-0.8474], l2_loss_v [0.6684], l2_loss_z [0.8527], l2_loss_x [0.6900], l2_loss_y [0.0964], g_e_loss [1.4600], dz_loss [-0.6281], d_loss [-0.5299]\n", "EGM Initialization Iter [6000] : e_loss_adv [-0.8948], l2_loss_v [0.7359], l2_loss_z [0.9014], l2_loss_x [0.6886], l2_loss_y [0.0662], g_e_loss [1.4973], dz_loss [-0.3875], d_loss [-0.2597]\n", "EGM Initialization Iter [6500] : e_loss_adv [-1.1519], l2_loss_v [0.4320], l2_loss_z [0.9488], l2_loss_x [0.6827], l2_loss_y [0.1137], g_e_loss [1.0252], dz_loss [-0.4316], d_loss [-0.3879]\n", "EGM Initialization Iter [7000] : e_loss_adv [-0.1190], l2_loss_v [0.5975], l2_loss_z [0.9308], l2_loss_x [0.6818], l2_loss_y [0.1010], g_e_loss [2.1922], dz_loss [-0.4173], d_loss [-0.3681]\n", "EGM Initialization Iter [7500] : e_loss_adv [-0.0798], l2_loss_v [0.6064], l2_loss_z [0.9438], l2_loss_x [0.6962], l2_loss_y [0.0829], g_e_loss [2.2496], dz_loss [-0.8070], d_loss [-0.7731]\n", "EGM Initialization Iter [8000] : e_loss_adv [2.0215], l2_loss_v [0.4414], l2_loss_z [1.0132], l2_loss_x [0.6978], l2_loss_y [0.0823], g_e_loss [4.2563], dz_loss [-0.0485], d_loss [0.0026]\n", "EGM Initialization Iter [8500] : e_loss_adv [1.7494], l2_loss_v [0.5732], l2_loss_z [0.9103], l2_loss_x [0.6829], l2_loss_y [0.0619], g_e_loss [3.9777], dz_loss [-0.5275], d_loss [-0.4650]\n", "EGM Initialization Iter [9000] : e_loss_adv [-0.1547], l2_loss_v [0.5875], l2_loss_z [0.9173], l2_loss_x [0.6891], l2_loss_y [0.0647], g_e_loss [2.1039], dz_loss [-0.6923], d_loss [-0.6058]\n", "EGM Initialization Iter [9500] : e_loss_adv [-1.8302], l2_loss_v [0.5040], l2_loss_z [0.9089], l2_loss_x [0.6838], l2_loss_y [0.0822], g_e_loss [0.3487], dz_loss [-0.4017], d_loss [-0.3120]\n", "EGM Initialization Iter [10000] : e_loss_adv [-1.1754], l2_loss_v [0.4594], l2_loss_z [0.8607], l2_loss_x [0.6830], l2_loss_y [0.0497], g_e_loss [0.8774], dz_loss [-0.7414], d_loss [-0.6600]\n", "EGM Initialization Iter [10500] : e_loss_adv [0.0125], l2_loss_v [0.4014], l2_loss_z [0.8827], l2_loss_x [0.6823], l2_loss_y [0.0821], g_e_loss [2.0610], dz_loss [-0.4633], d_loss [-0.4381]\n", "EGM Initialization Iter [11000] : e_loss_adv [1.2771], l2_loss_v [0.8815], l2_loss_z [0.7977], l2_loss_x [0.6933], l2_loss_y [0.1165], g_e_loss [3.7661], dz_loss [-0.5535], d_loss [-0.4989]\n", "EGM Initialization Iter [11500] : e_loss_adv [0.8197], l2_loss_v [0.6996], l2_loss_z [0.9713], l2_loss_x [0.6715], l2_loss_y [0.0668], g_e_loss [3.2289], dz_loss [-0.5401], d_loss [-0.4833]\n", "EGM Initialization Iter [12000] : e_loss_adv [1.1846], l2_loss_v [0.4105], l2_loss_z [0.8513], l2_loss_x [0.6902], l2_loss_y [0.0928], g_e_loss [3.2294], dz_loss [-0.5215], d_loss [-0.4562]\n", "EGM Initialization Iter [12500] : e_loss_adv [0.5591], l2_loss_v [0.5461], l2_loss_z [0.8962], l2_loss_x [0.6943], l2_loss_y [0.1157], g_e_loss [2.8115], dz_loss [-0.2863], d_loss [-0.2228]\n", "EGM Initialization Iter [13000] : e_loss_adv [0.5567], l2_loss_v [0.5537], l2_loss_z [0.9396], l2_loss_x [0.6648], l2_loss_y [0.0530], g_e_loss [2.7678], dz_loss [-0.8052], d_loss [-0.7681]\n", "EGM Initialization Iter [13500] : e_loss_adv [-0.4126], l2_loss_v [0.6628], l2_loss_z [0.8893], l2_loss_x [0.7001], l2_loss_y [0.0652], g_e_loss [1.9049], dz_loss [0.1546], d_loss [0.2192]\n", "EGM Initialization Iter [14000] : e_loss_adv [1.3701], l2_loss_v [0.4984], l2_loss_z [0.7432], l2_loss_x [0.6523], l2_loss_y [0.0843], g_e_loss [3.3483], dz_loss [-0.1833], d_loss [-0.1407]\n", "EGM Initialization Iter [14500] : e_loss_adv [0.3630], l2_loss_v [0.5708], l2_loss_z [0.8929], l2_loss_x [0.7033], l2_loss_y [0.0717], g_e_loss [2.6017], dz_loss [-0.1090], d_loss [-0.0825]\n", "EGM Initialization Iter [15000] : e_loss_adv [1.1808], l2_loss_v [0.4881], l2_loss_z [0.7314], l2_loss_x [0.6782], l2_loss_y [0.1120], g_e_loss [3.1905], dz_loss [-0.4781], d_loss [-0.4294]\n", "EGM Initialization Iter [15500] : e_loss_adv [0.7721], l2_loss_v [0.5489], l2_loss_z [0.7299], l2_loss_x [0.7268], l2_loss_y [0.1136], g_e_loss [2.8913], dz_loss [-0.4289], d_loss [-0.3480]\n", "EGM Initialization Iter [16000] : e_loss_adv [0.5866], l2_loss_v [0.3066], l2_loss_z [0.8738], l2_loss_x [0.6267], l2_loss_y [0.0903], g_e_loss [2.4841], dz_loss [-0.5187], d_loss [-0.4643]\n", "EGM Initialization Iter [16500] : e_loss_adv [2.6886], l2_loss_v [0.6556], l2_loss_z [0.9029], l2_loss_x [0.6635], l2_loss_y [0.0617], g_e_loss [4.9723], dz_loss [-0.0725], d_loss [-0.0014]\n", "EGM Initialization Iter [17000] : e_loss_adv [0.6549], l2_loss_v [0.7038], l2_loss_z [0.8277], l2_loss_x [0.6232], l2_loss_y [0.0827], g_e_loss [2.8924], dz_loss [-0.2632], d_loss [-0.1660]\n", "EGM Initialization Iter [17500] : e_loss_adv [-0.3580], l2_loss_v [0.5062], l2_loss_z [0.8819], l2_loss_x [0.6791], l2_loss_y [0.0736], g_e_loss [1.7828], dz_loss [-0.1837], d_loss [-0.0903]\n", "EGM Initialization Iter [18000] : e_loss_adv [-0.6044], l2_loss_v [0.4451], l2_loss_z [0.8348], l2_loss_x [0.7131], l2_loss_y [0.0517], g_e_loss [1.4402], dz_loss [-0.3551], d_loss [-0.2829]\n", "EGM Initialization Iter [18500] : e_loss_adv [-0.0970], l2_loss_v [0.3223], l2_loss_z [0.7733], l2_loss_x [0.6027], l2_loss_y [0.0677], g_e_loss [1.6691], dz_loss [-0.4478], d_loss [-0.3706]\n", "EGM Initialization Iter [19000] : e_loss_adv [-0.3036], l2_loss_v [0.4483], l2_loss_z [0.9154], l2_loss_x [0.7860], l2_loss_y [0.0749], g_e_loss [1.9210], dz_loss [-0.0080], d_loss [0.0634]\n", "EGM Initialization Iter [19500] : e_loss_adv [1.4144], l2_loss_v [0.4755], l2_loss_z [0.8437], l2_loss_x [0.5943], l2_loss_y [0.1192], g_e_loss [3.4471], dz_loss [-0.3931], d_loss [-0.3437]\n", "EGM Initialization Iter [20000] : e_loss_adv [1.5499], l2_loss_v [0.5318], l2_loss_z [0.7672], l2_loss_x [0.6411], l2_loss_y [0.0971], g_e_loss [3.5870], dz_loss [-0.3918], d_loss [-0.3298]\n", "EGM Initialization Iter [20500] : e_loss_adv [0.5439], l2_loss_v [0.4782], l2_loss_z [0.8471], l2_loss_x [0.6008], l2_loss_y [0.0701], g_e_loss [2.5401], dz_loss [-0.2296], d_loss [-0.1909]\n", "EGM Initialization Iter [21000] : e_loss_adv [0.5634], l2_loss_v [0.3514], l2_loss_z [0.8784], l2_loss_x [0.6237], l2_loss_y [0.0578], g_e_loss [2.4749], dz_loss [-0.0582], d_loss [-0.0211]\n", "EGM Initialization Iter [21500] : e_loss_adv [0.1586], l2_loss_v [1.0522], l2_loss_z [0.8501], l2_loss_x [0.5285], l2_loss_y [0.0775], g_e_loss [2.6669], dz_loss [-0.4601], d_loss [-0.3838]\n", "EGM Initialization Iter [22000] : e_loss_adv [0.4936], l2_loss_v [0.4876], l2_loss_z [0.8209], l2_loss_x [0.5598], l2_loss_y [0.0686], g_e_loss [2.4305], dz_loss [-0.5799], d_loss [-0.5045]\n", "EGM Initialization Iter [22500] : e_loss_adv [0.5633], l2_loss_v [0.8955], l2_loss_z [0.9021], l2_loss_x [0.4840], l2_loss_y [0.0793], g_e_loss [2.9243], dz_loss [0.0632], d_loss [0.1201]\n", "EGM Initialization Iter [23000] : e_loss_adv [-0.6131], l2_loss_v [1.0310], l2_loss_z [0.8269], l2_loss_x [0.5019], l2_loss_y [0.0767], g_e_loss [1.8233], dz_loss [-0.4884], d_loss [-0.4198]\n", "EGM Initialization Iter [23500] : e_loss_adv [0.2808], l2_loss_v [0.3826], l2_loss_z [0.7574], l2_loss_x [0.6134], l2_loss_y [0.0854], g_e_loss [2.1196], dz_loss [0.0413], d_loss [0.1513]\n", "EGM Initialization Iter [24000] : e_loss_adv [0.7267], l2_loss_v [0.4576], l2_loss_z [0.7689], l2_loss_x [0.5064], l2_loss_y [0.1214], g_e_loss [2.5811], dz_loss [-0.6373], d_loss [-0.5943]\n", "EGM Initialization Iter [24500] : e_loss_adv [1.3909], l2_loss_v [0.5250], l2_loss_z [0.8024], l2_loss_x [0.4561], l2_loss_y [0.0664], g_e_loss [3.2408], dz_loss [-0.1226], d_loss [-0.0769]\n", "EGM Initialization Iter [25000] : e_loss_adv [-0.9248], l2_loss_v [0.4964], l2_loss_z [0.8490], l2_loss_x [0.5210], l2_loss_y [0.1215], g_e_loss [1.0632], dz_loss [0.2103], d_loss [0.2916]\n", "EGM Initialization Iter [25500] : e_loss_adv [-0.7704], l2_loss_v [0.5056], l2_loss_z [0.7879], l2_loss_x [0.3088], l2_loss_y [0.0530], g_e_loss [0.8849], dz_loss [0.2377], d_loss [0.3105]\n", "EGM Initialization Iter [26000] : e_loss_adv [-0.3391], l2_loss_v [0.4905], l2_loss_z [0.8404], l2_loss_x [0.4700], l2_loss_y [0.0738], g_e_loss [1.5356], dz_loss [-0.0343], d_loss [0.0082]\n", "EGM Initialization Iter [26500] : e_loss_adv [-0.4712], l2_loss_v [0.3574], l2_loss_z [0.7607], l2_loss_x [0.4296], l2_loss_y [0.0830], g_e_loss [1.1594], dz_loss [-0.2168], d_loss [-0.1930]\n", "EGM Initialization Iter [27000] : e_loss_adv [0.7430], l2_loss_v [0.5136], l2_loss_z [0.8916], l2_loss_x [0.4302], l2_loss_y [0.0700], g_e_loss [2.6484], dz_loss [-0.6683], d_loss [-0.5880]\n", "EGM Initialization Iter [27500] : e_loss_adv [0.3668], l2_loss_v [0.4964], l2_loss_z [0.9325], l2_loss_x [0.3674], l2_loss_y [0.0685], g_e_loss [2.2315], dz_loss [0.1753], d_loss [0.2039]\n", "EGM Initialization Iter [28000] : e_loss_adv [-0.9352], l2_loss_v [0.5420], l2_loss_z [0.8413], l2_loss_x [0.4752], l2_loss_y [0.0727], g_e_loss [0.9959], dz_loss [-0.3604], d_loss [-0.2736]\n", "EGM Initialization Iter [28500] : e_loss_adv [-0.2398], l2_loss_v [0.4868], l2_loss_z [0.7556], l2_loss_x [0.4528], l2_loss_y [0.0851], g_e_loss [1.5405], dz_loss [-0.3888], d_loss [-0.2976]\n", "EGM Initialization Iter [29000] : e_loss_adv [-0.6478], l2_loss_v [0.5740], l2_loss_z [0.8240], l2_loss_x [0.3217], l2_loss_y [0.0874], g_e_loss [1.1594], dz_loss [-0.1161], d_loss [-0.0649]\n", "EGM Initialization Iter [29500] : e_loss_adv [-0.2740], l2_loss_v [0.5155], l2_loss_z [0.6885], l2_loss_x [0.2661], l2_loss_y [0.0785], g_e_loss [1.2745], dz_loss [-0.3944], d_loss [-0.3385]\n", "EGM Initialization Iter [30000] : e_loss_adv [-0.7436], l2_loss_v [0.5136], l2_loss_z [0.8334], l2_loss_x [0.1789], l2_loss_y [0.0681], g_e_loss [0.8504], dz_loss [-0.0883], d_loss [-0.0273]\n", "EGM Initialization Ends.\n", "Initialize latent variables Z with e(V)...\n", "Iterative Updating Starts ...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 0/100: 100%|██████████| 32/32 [00:10<00:00, 3.09batch/s, loss_px_z: [0.9413], loss_mse_x: [0.2514], loss_py_z: [0.6371], loss_mse_y: [0.0882], loss_pv_z: [22.3034], loss_mse_v: [0.3698], loss_postrior_z: [30.3454]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [0/100]: MSE_x: 0.0967, MSE_y: 0.0816, MSE_v: 0.5076\n", "\n", "Saving checkpoint for epoch 0 at ./checkpoints/Semi_acic/20260311_112445/ckpt-0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 1/100: 100%|██████████| 32/32 [00:00<00:00, 52.06batch/s, loss_px_z: [1.0814], loss_mse_x: [0.3921], loss_py_z: [0.6501], loss_mse_y: [0.1115], loss_pv_z: [59.3399], loss_mse_v: [0.6598], loss_postrior_z: [65.1993]]\n", "Epoch 2/100: 100%|██████████| 32/32 [00:00<00:00, 52.19batch/s, loss_px_z: [1.1222], loss_mse_x: [0.4334], loss_py_z: [0.5929], loss_mse_y: [0.0376], loss_pv_z: [51.3154], loss_mse_v: [0.6012], loss_postrior_z: [56.4026]]\n", "Epoch 3/100: 100%|██████████| 32/32 [00:00<00:00, 52.17batch/s, loss_px_z: [1.0116], loss_mse_x: [0.3234], loss_py_z: [0.5930], loss_mse_y: [0.0414], loss_pv_z: [24.1223], loss_mse_v: [0.3872], loss_postrior_z: [28.4659]]\n", "Epoch 4/100: 100%|██████████| 32/32 [00:00<00:00, 52.53batch/s, loss_px_z: [0.8006], loss_mse_x: [0.1130], loss_py_z: [0.5958], loss_mse_y: [0.0510], loss_pv_z: [20.5702], loss_mse_v: [0.3585], loss_postrior_z: [34.4404]]\n", "Epoch 5/100: 100%|██████████| 32/32 [00:00<00:00, 51.60batch/s, loss_px_z: [1.1752], loss_mse_x: [0.4883], loss_py_z: [0.6078], loss_mse_y: [0.0713], loss_pv_z: [18.7218], loss_mse_v: [0.3485], loss_postrior_z: [24.4937]]\n", "Epoch 6/100: 100%|██████████| 32/32 [00:00<00:00, 50.58batch/s, loss_px_z: [0.8292], loss_mse_x: [0.1428], loss_py_z: [0.7203], loss_mse_y: [0.2263], loss_pv_z: [15.9238], loss_mse_v: [0.3311], loss_postrior_z: [22.7411]]\n", "Epoch 7/100: 100%|██████████| 32/32 [00:00<00:00, 50.07batch/s, loss_px_z: [1.1182], loss_mse_x: [0.4325], loss_py_z: [0.6544], loss_mse_y: [0.1425], loss_pv_z: [49.3744], loss_mse_v: [0.5830], loss_postrior_z: [58.7593]]\n", "Epoch 8/100: 100%|██████████| 32/32 [00:00<00:00, 53.07batch/s, loss_px_z: [0.9144], loss_mse_x: [0.2292], loss_py_z: [0.5907], loss_mse_y: [0.0616], loss_pv_z: [48.1219], loss_mse_v: [0.5634], loss_postrior_z: [59.8836]]\n", "Epoch 9/100: 100%|██████████| 32/32 [00:00<00:00, 54.61batch/s, loss_px_z: [1.2536], loss_mse_x: [0.5691], loss_py_z: [0.5661], loss_mse_y: [0.0364], loss_pv_z: [10.2657], loss_mse_v: [0.2887], loss_postrior_z: [17.2223]] \n", "Epoch 10/100: 100%|██████████| 32/32 [00:00<00:00, 55.06batch/s, loss_px_z: [0.9793], loss_mse_x: [0.2953], loss_py_z: [0.5569], loss_mse_y: [0.0274], loss_pv_z: [37.2485], loss_mse_v: [0.4839], loss_postrior_z: [44.8024]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [10/100]: MSE_x: 0.0956, MSE_y: 0.0811, MSE_v: 0.4902\n", "\n", "Saving checkpoint for epoch 10 at ./checkpoints/Semi_acic/20260311_112445/ckpt-10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 11/100: 100%|██████████| 32/32 [00:00<00:00, 54.95batch/s, loss_px_z: [1.1522], loss_mse_x: [0.4688], loss_py_z: [0.6065], loss_mse_y: [0.0960], loss_pv_z: [2.2391], loss_mse_v: [0.2359], loss_postrior_z: [11.8110]] \n", "Epoch 12/100: 100%|██████████| 32/32 [00:00<00:00, 55.30batch/s, loss_px_z: [0.9200], loss_mse_x: [0.2372], loss_py_z: [0.5623], loss_mse_y: [0.0459], loss_pv_z: [20.5715], loss_mse_v: [0.3698], loss_postrior_z: [22.2090]]\n", "Epoch 13/100: 100%|██████████| 32/32 [00:00<00:00, 59.66batch/s, loss_px_z: [1.0428], loss_mse_x: [0.3606], loss_py_z: [0.5959], loss_mse_y: [0.0940], loss_pv_z: [27.0938], loss_mse_v: [0.4216], loss_postrior_z: [33.3546]]\n", "Epoch 14/100: 100%|██████████| 32/32 [00:00<00:00, 59.17batch/s, loss_px_z: [1.3462], loss_mse_x: [0.6646], loss_py_z: [0.5644], loss_mse_y: [0.0568], loss_pv_z: [34.1856], loss_mse_v: [0.5718], loss_postrior_z: [40.3281]]\n", "Epoch 15/100: 100%|██████████| 32/32 [00:00<00:00, 60.14batch/s, loss_px_z: [0.9129], loss_mse_x: [0.2318], loss_py_z: [0.6260], loss_mse_y: [0.1425], loss_pv_z: [57.6632], loss_mse_v: [0.6218], loss_postrior_z: [65.6941]]\n", "Epoch 16/100: 100%|██████████| 32/32 [00:00<00:00, 60.19batch/s, loss_px_z: [1.4620], loss_mse_x: [0.7816], loss_py_z: [0.5453], loss_mse_y: [0.0444], loss_pv_z: [3.3863], loss_mse_v: [0.2562], loss_postrior_z: [10.9483]] \n", "Epoch 17/100: 100%|██████████| 32/32 [00:00<00:00, 60.11batch/s, loss_px_z: [0.8324], loss_mse_x: [0.1526], loss_py_z: [0.5713], loss_mse_y: [0.0809], loss_pv_z: [31.0689], loss_mse_v: [0.4438], loss_postrior_z: [36.7993]]\n", "Epoch 18/100: 100%|██████████| 32/32 [00:00<00:00, 60.18batch/s, loss_px_z: [0.9134], loss_mse_x: [0.2342], loss_py_z: [0.5573], loss_mse_y: [0.0685], loss_pv_z: [29.7325], loss_mse_v: [0.4428], loss_postrior_z: [37.8426]]\n", "Epoch 19/100: 100%|██████████| 32/32 [00:00<00:00, 59.97batch/s, loss_px_z: [1.0431], loss_mse_x: [0.3645], loss_py_z: [0.6281], loss_mse_y: [0.1604], loss_pv_z: [21.2909], loss_mse_v: [0.3899], loss_postrior_z: [28.2614]]\n", "Epoch 20/100: 100%|██████████| 32/32 [00:00<00:00, 60.11batch/s, loss_px_z: [0.9431], loss_mse_x: [0.2650], loss_py_z: [0.5509], loss_mse_y: [0.0707], loss_pv_z: [20.4603], loss_mse_v: [0.3859], loss_postrior_z: [23.0501]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [20/100]: MSE_x: 0.0929, MSE_y: 0.0824, MSE_v: 0.4880\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 21/100: 100%|██████████| 32/32 [00:00<00:00, 60.17batch/s, loss_px_z: [1.0347], loss_mse_x: [0.3573], loss_py_z: [0.6146], loss_mse_y: [0.1555], loss_pv_z: [29.8462], loss_mse_v: [0.4482], loss_postrior_z: [36.4209]]\n", "Epoch 22/100: 100%|██████████| 32/32 [00:00<00:00, 59.91batch/s, loss_px_z: [0.9561], loss_mse_x: [0.2792], loss_py_z: [0.5554], loss_mse_y: [0.0882], loss_pv_z: [1.5015], loss_mse_v: [0.2573], loss_postrior_z: [7.7514]] \n", "Epoch 23/100: 100%|██████████| 32/32 [00:00<00:00, 60.14batch/s, loss_px_z: [0.8235], loss_mse_x: [0.1472], loss_py_z: [0.5874], loss_mse_y: [0.1351], loss_pv_z: [0.5594], loss_mse_v: [0.2621], loss_postrior_z: [6.8897]] \n", "Epoch 24/100: 100%|██████████| 32/32 [00:00<00:00, 60.10batch/s, loss_px_z: [0.7600], loss_mse_x: [0.0843], loss_py_z: [0.5146], loss_mse_y: [0.0505], loss_pv_z: [15.1470], loss_mse_v: [0.3561], loss_postrior_z: [22.3120]]\n", "Epoch 25/100: 100%|██████████| 32/32 [00:00<00:00, 60.14batch/s, loss_px_z: [0.8172], loss_mse_x: [0.1421], loss_py_z: [0.4946], loss_mse_y: [0.0423], loss_pv_z: [35.5047], loss_mse_v: [0.5002], loss_postrior_z: [39.7496]]\n", "Epoch 26/100: 100%|██████████| 32/32 [00:00<00:00, 59.76batch/s, loss_px_z: [0.8243], loss_mse_x: [0.1498], loss_py_z: [0.5031], loss_mse_y: [0.0492], loss_pv_z: [21.2283], loss_mse_v: [0.4085], loss_postrior_z: [29.4189]]\n", "Epoch 27/100: 100%|██████████| 32/32 [00:00<00:00, 60.15batch/s, loss_px_z: [1.2291], loss_mse_x: [0.5552], loss_py_z: [0.5260], loss_mse_y: [0.0858], loss_pv_z: [32.0752], loss_mse_v: [0.4673], loss_postrior_z: [42.3491]]\n", "Epoch 28/100: 100%|██████████| 32/32 [00:00<00:00, 60.16batch/s, loss_px_z: [0.9256], loss_mse_x: [0.2523], loss_py_z: [0.6113], loss_mse_y: [0.1872], loss_pv_z: [11.5990], loss_mse_v: [0.3499], loss_postrior_z: [15.3578]]\n", "Epoch 29/100: 100%|██████████| 32/32 [00:00<00:00, 60.13batch/s, loss_px_z: [0.9034], loss_mse_x: [0.2306], loss_py_z: [0.5699], loss_mse_y: [0.1462], loss_pv_z: [14.3208], loss_mse_v: [0.3664], loss_postrior_z: [21.1504]]\n", "Epoch 30/100: 100%|██████████| 32/32 [00:00<00:00, 59.69batch/s, loss_px_z: [1.3914], loss_mse_x: [0.7193], loss_py_z: [0.4828], loss_mse_y: [0.0625], loss_pv_z: [-7.3091], loss_mse_v: [0.2280], loss_postrior_z: [-2.4749]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [30/100]: MSE_x: 0.0939, MSE_y: 0.0844, MSE_v: 0.4857\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 31/100: 100%|██████████| 32/32 [00:00<00:00, 60.18batch/s, loss_px_z: [0.7766], loss_mse_x: [0.1051], loss_py_z: [0.4541], loss_mse_y: [0.0316], loss_pv_z: [65.6081], loss_mse_v: [1.0058], loss_postrior_z: [62.1184]]\n", "Epoch 32/100: 100%|██████████| 32/32 [00:00<00:00, 58.97batch/s, loss_px_z: [1.2586], loss_mse_x: [0.5876], loss_py_z: [0.5416], loss_mse_y: [0.1410], loss_pv_z: [25.5976], loss_mse_v: [0.6107], loss_postrior_z: [31.8609]]\n", "Epoch 33/100: 100%|██████████| 32/32 [00:00<00:00, 60.15batch/s, loss_px_z: [1.1108], loss_mse_x: [0.4405], loss_py_z: [0.4404], loss_mse_y: [0.0340], loss_pv_z: [9.5764], loss_mse_v: [0.3409], loss_postrior_z: [13.5380]] \n", "Epoch 34/100: 100%|██████████| 32/32 [00:00<00:00, 59.43batch/s, loss_px_z: [1.0514], loss_mse_x: [0.3816], loss_py_z: [0.4840], loss_mse_y: [0.0906], loss_pv_z: [-7.3509], loss_mse_v: [0.2674], loss_postrior_z: [-4.4814]]\n", "Epoch 35/100: 100%|██████████| 32/32 [00:00<00:00, 57.56batch/s, loss_px_z: [0.9433], loss_mse_x: [0.2741], loss_py_z: [0.4575], loss_mse_y: [0.0741], loss_pv_z: [29.3482], loss_mse_v: [0.4471], loss_postrior_z: [27.1960]]\n", "Epoch 36/100: 100%|██████████| 32/32 [00:00<00:00, 52.69batch/s, loss_px_z: [0.9184], loss_mse_x: [0.2498], loss_py_z: [0.4759], loss_mse_y: [0.1049], loss_pv_z: [10.3026], loss_mse_v: [0.3483], loss_postrior_z: [17.2433]]\n", "Epoch 37/100: 100%|██████████| 32/32 [00:00<00:00, 52.65batch/s, loss_px_z: [0.9823], loss_mse_x: [0.3142], loss_py_z: [0.3996], loss_mse_y: [0.0382], loss_pv_z: [11.1830], loss_mse_v: [0.3703], loss_postrior_z: [19.4070]]\n", "Epoch 38/100: 100%|██████████| 32/32 [00:00<00:00, 52.67batch/s, loss_px_z: [0.9945], loss_mse_x: [0.3270], loss_py_z: [0.4861], loss_mse_y: [0.1335], loss_pv_z: [-9.3832], loss_mse_v: [0.2701], loss_postrior_z: [-4.6423]]\n", "Epoch 39/100: 100%|██████████| 32/32 [00:00<00:00, 52.46batch/s, loss_px_z: [0.7293], loss_mse_x: [0.0624], loss_py_z: [0.4619], loss_mse_y: [0.1198], loss_pv_z: [22.1069], loss_mse_v: [0.3943], loss_postrior_z: [26.1371]]\n", "Epoch 40/100: 100%|██████████| 32/32 [00:00<00:00, 52.65batch/s, loss_px_z: [0.9726], loss_mse_x: [0.3064], loss_py_z: [0.4586], loss_mse_y: [0.1268], loss_pv_z: [19.7465], loss_mse_v: [0.4129], loss_postrior_z: [31.5037]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [40/100]: MSE_x: 0.0933, MSE_y: 0.0893, MSE_v: 0.4900\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 41/100: 100%|██████████| 32/32 [00:00<00:00, 52.70batch/s, loss_px_z: [0.7790], loss_mse_x: [0.1133], loss_py_z: [0.3834], loss_mse_y: [0.0446], loss_pv_z: [1.9458], loss_mse_v: [0.3133], loss_postrior_z: [8.3677]] \n", "Epoch 42/100: 100%|██████████| 32/32 [00:00<00:00, 52.73batch/s, loss_px_z: [0.7895], loss_mse_x: [0.1244], loss_py_z: [0.3713], loss_mse_y: [0.0586], loss_pv_z: [31.2267], loss_mse_v: [0.4730], loss_postrior_z: [35.4569]]\n", "Epoch 43/100: 100%|██████████| 32/32 [00:00<00:00, 52.60batch/s, loss_px_z: [0.7912], loss_mse_x: [0.1266], loss_py_z: [0.3231], loss_mse_y: [0.0287], loss_pv_z: [41.9379], loss_mse_v: [0.5249], loss_postrior_z: [43.0948]]\n", "Epoch 44/100: 100%|██████████| 32/32 [00:00<00:00, 52.66batch/s, loss_px_z: [0.7445], loss_mse_x: [0.0806], loss_py_z: [0.3750], loss_mse_y: [0.0760], loss_pv_z: [21.5167], loss_mse_v: [0.4183], loss_postrior_z: [30.6867]]\n", "Epoch 45/100: 100%|██████████| 32/32 [00:00<00:00, 52.53batch/s, loss_px_z: [0.7780], loss_mse_x: [0.1146], loss_py_z: [0.3586], loss_mse_y: [0.0796], loss_pv_z: [19.9246], loss_mse_v: [0.4149], loss_postrior_z: [21.5443]]\n", "Epoch 46/100: 100%|██████████| 32/32 [00:00<00:00, 52.72batch/s, loss_px_z: [1.0830], loss_mse_x: [0.4202], loss_py_z: [0.2969], loss_mse_y: [0.0634], loss_pv_z: [-9.4088], loss_mse_v: [0.2761], loss_postrior_z: [-3.7582]]\n", "Epoch 47/100: 100%|██████████| 32/32 [00:00<00:00, 52.78batch/s, loss_px_z: [1.0419], loss_mse_x: [0.3797], loss_py_z: [0.3354], loss_mse_y: [0.0947], loss_pv_z: [37.1565], loss_mse_v: [2.0222], loss_postrior_z: [40.7764]]\n", "Epoch 48/100: 100%|██████████| 32/32 [00:00<00:00, 54.16batch/s, loss_px_z: [0.7746], loss_mse_x: [0.1130], loss_py_z: [0.2930], loss_mse_y: [0.0726], loss_pv_z: [7.5576], loss_mse_v: [0.3752], loss_postrior_z: [13.7704]] \n", "Epoch 49/100: 100%|██████████| 32/32 [00:00<00:00, 52.62batch/s, loss_px_z: [0.8423], loss_mse_x: [0.1813], loss_py_z: [0.3029], loss_mse_y: [0.0860], loss_pv_z: [50.3740], loss_mse_v: [0.5826], loss_postrior_z: [42.9421]]\n", "Epoch 50/100: 100%|██████████| 32/32 [00:00<00:00, 53.91batch/s, loss_px_z: [0.9005], loss_mse_x: [0.2401], loss_py_z: [0.2378], loss_mse_y: [0.0572], loss_pv_z: [23.7203], loss_mse_v: [0.4206], loss_postrior_z: [21.5316]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [50/100]: MSE_x: 0.0924, MSE_y: 0.0922, MSE_v: 0.4850\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 51/100: 100%|██████████| 32/32 [00:00<00:00, 56.99batch/s, loss_px_z: [0.8310], loss_mse_x: [0.1712], loss_py_z: [0.2651], loss_mse_y: [0.0840], loss_pv_z: [21.3173], loss_mse_v: [1.1722], loss_postrior_z: [32.6034]]\n", "Epoch 52/100: 100%|██████████| 32/32 [00:00<00:00, 56.32batch/s, loss_px_z: [0.9389], loss_mse_x: [0.2797], loss_py_z: [0.2724], loss_mse_y: [0.0895], loss_pv_z: [41.2433], loss_mse_v: [1.2558], loss_postrior_z: [37.6628]]\n", "Epoch 53/100: 100%|██████████| 32/32 [00:00<00:00, 55.43batch/s, loss_px_z: [1.0191], loss_mse_x: [0.3605], loss_py_z: [0.3110], loss_mse_y: [0.1181], loss_pv_z: [-5.5875], loss_mse_v: [0.2971], loss_postrior_z: [-2.6677]]\n", "Epoch 54/100: 100%|██████████| 32/32 [00:00<00:00, 55.05batch/s, loss_px_z: [0.7439], loss_mse_x: [0.0858], loss_py_z: [0.1105], loss_mse_y: [0.0163], loss_pv_z: [20.1353], loss_mse_v: [0.5451], loss_postrior_z: [20.6309]]\n", "Epoch 55/100: 100%|██████████| 32/32 [00:00<00:00, 53.03batch/s, loss_px_z: [0.9376], loss_mse_x: [0.2801], loss_py_z: [0.1811], loss_mse_y: [0.0681], loss_pv_z: [-17.3250], loss_mse_v: [0.2448], loss_postrior_z: [-14.3498]]\n", "Epoch 56/100: 100%|██████████| 32/32 [00:00<00:00, 57.25batch/s, loss_px_z: [1.3045], loss_mse_x: [0.6476], loss_py_z: [0.3238], loss_mse_y: [0.1491], loss_pv_z: [46.6397], loss_mse_v: [0.5431], loss_postrior_z: [48.7620]]\n", "Epoch 57/100: 100%|██████████| 32/32 [00:00<00:00, 57.07batch/s, loss_px_z: [0.8093], loss_mse_x: [0.1530], loss_py_z: [0.2234], loss_mse_y: [0.1067], loss_pv_z: [41.7925], loss_mse_v: [0.5469], loss_postrior_z: [48.3183]]\n", "Epoch 58/100: 100%|██████████| 32/32 [00:00<00:00, 56.74batch/s, loss_px_z: [1.4082], loss_mse_x: [0.7524], loss_py_z: [0.0447], loss_mse_y: [0.0551], loss_pv_z: [-2.0897], loss_mse_v: [0.3089], loss_postrior_z: [1.1457]] \n", "Epoch 59/100: 100%|██████████| 32/32 [00:00<00:00, 55.34batch/s, loss_px_z: [0.8823], loss_mse_x: [0.2271], loss_py_z: [0.2955], loss_mse_y: [0.1463], loss_pv_z: [-17.1023], loss_mse_v: [0.2474], loss_postrior_z: [-8.4271]]\n", "Epoch 60/100: 100%|██████████| 32/32 [00:00<00:00, 57.76batch/s, loss_px_z: [1.3100], loss_mse_x: [0.6554], loss_py_z: [0.0349], loss_mse_y: [0.0532], loss_pv_z: [-9.9317], loss_mse_v: [0.2931], loss_postrior_z: [-3.7395]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [60/100]: MSE_x: 0.0928, MSE_y: 0.0886, MSE_v: 0.4847\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 61/100: 100%|██████████| 32/32 [00:00<00:00, 58.63batch/s, loss_px_z: [0.8233], loss_mse_x: [0.1693], loss_py_z: [-0.0091], loss_mse_y: [0.0491], loss_pv_z: [38.3667], loss_mse_v: [0.4997], loss_postrior_z: [45.0812]]\n", "Epoch 62/100: 100%|██████████| 32/32 [00:00<00:00, 56.32batch/s, loss_px_z: [0.7631], loss_mse_x: [0.1096], loss_py_z: [0.2690], loss_mse_y: [0.1389], loss_pv_z: [19.4034], loss_mse_v: [0.4365], loss_postrior_z: [26.6290]] \n", "Epoch 63/100: 100%|██████████| 32/32 [00:00<00:00, 57.21batch/s, loss_px_z: [1.1080], loss_mse_x: [0.4551], loss_py_z: [0.2811], loss_mse_y: [0.1415], loss_pv_z: [80.7834], loss_mse_v: [0.6600], loss_postrior_z: [72.9104]] \n", "Epoch 64/100: 100%|██████████| 32/32 [00:00<00:00, 56.45batch/s, loss_px_z: [0.7215], loss_mse_x: [0.0692], loss_py_z: [0.2883], loss_mse_y: [0.1612], loss_pv_z: [53.9828], loss_mse_v: [0.6072], loss_postrior_z: [59.1240]] \n", "Epoch 65/100: 100%|██████████| 32/32 [00:00<00:00, 53.46batch/s, loss_px_z: [1.5178], loss_mse_x: [0.8660], loss_py_z: [0.2269], loss_mse_y: [0.1412], loss_pv_z: [7.9063], loss_mse_v: [0.4066], loss_postrior_z: [8.8537]] \n", "Epoch 66/100: 100%|██████████| 32/32 [00:00<00:00, 57.96batch/s, loss_px_z: [1.0116], loss_mse_x: [0.3604], loss_py_z: [0.5221], loss_mse_y: [0.2095], loss_pv_z: [12.0556], loss_mse_v: [0.4083], loss_postrior_z: [19.8110]] \n", "Epoch 67/100: 100%|██████████| 32/32 [00:00<00:00, 52.53batch/s, loss_px_z: [0.9474], loss_mse_x: [0.2968], loss_py_z: [0.0703], loss_mse_y: [0.0881], loss_pv_z: [-6.6935], loss_mse_v: [0.2905], loss_postrior_z: [-1.6798]] \n", "Epoch 68/100: 100%|██████████| 32/32 [00:00<00:00, 54.06batch/s, loss_px_z: [0.7904], loss_mse_x: [0.1404], loss_py_z: [-0.2489], loss_mse_y: [0.0387], loss_pv_z: [-25.1200], loss_mse_v: [0.2314], loss_postrior_z: [-16.3646]]\n", "Epoch 69/100: 100%|██████████| 32/32 [00:00<00:00, 52.61batch/s, loss_px_z: [0.7263], loss_mse_x: [0.0768], loss_py_z: [0.1700], loss_mse_y: [0.1200], loss_pv_z: [-3.5599], loss_mse_v: [0.3203], loss_postrior_z: [9.7701]] \n", "Epoch 70/100: 100%|██████████| 32/32 [00:00<00:00, 56.04batch/s, loss_px_z: [0.8032], loss_mse_x: [0.1543], loss_py_z: [-0.1722], loss_mse_y: [0.0521], loss_pv_z: [21.8734], loss_mse_v: [0.4367], loss_postrior_z: [29.7064]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [70/100]: MSE_x: 0.0927, MSE_y: 0.0864, MSE_v: 0.4795\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 71/100: 100%|██████████| 32/32 [00:00<00:00, 56.08batch/s, loss_px_z: [0.8890], loss_mse_x: [0.2406], loss_py_z: [-0.1999], loss_mse_y: [0.0420], loss_pv_z: [1.5693], loss_mse_v: [0.4193], loss_postrior_z: [6.5249]] \n", "Epoch 72/100: 100%|██████████| 32/32 [00:00<00:00, 55.01batch/s, loss_px_z: [0.9643], loss_mse_x: [0.3165], loss_py_z: [0.2295], loss_mse_y: [0.1324], loss_pv_z: [25.2323], loss_mse_v: [0.4755], loss_postrior_z: [35.1813]] \n", "Epoch 73/100: 100%|██████████| 32/32 [00:00<00:00, 56.47batch/s, loss_px_z: [0.9932], loss_mse_x: [0.3460], loss_py_z: [0.0042], loss_mse_y: [0.0815], loss_pv_z: [51.5540], loss_mse_v: [0.9088], loss_postrior_z: [57.8552]] \n", "Epoch 74/100: 100%|██████████| 32/32 [00:00<00:00, 54.08batch/s, loss_px_z: [0.8933], loss_mse_x: [0.2466], loss_py_z: [-0.1914], loss_mse_y: [0.0467], loss_pv_z: [6.5270], loss_mse_v: [0.5062], loss_postrior_z: [8.9503]] \n", "Epoch 75/100: 100%|██████████| 32/32 [00:00<00:00, 55.97batch/s, loss_px_z: [1.0264], loss_mse_x: [0.3803], loss_py_z: [-0.2124], loss_mse_y: [0.0410], loss_pv_z: [51.8404], loss_mse_v: [0.7711], loss_postrior_z: [53.4973]]\n", "Epoch 76/100: 100%|██████████| 32/32 [00:00<00:00, 54.47batch/s, loss_px_z: [0.8433], loss_mse_x: [0.1978], loss_py_z: [-0.1416], loss_mse_y: [0.0737], loss_pv_z: [23.4251], loss_mse_v: [0.4216], loss_postrior_z: [25.4289]] \n", "Epoch 77/100: 100%|██████████| 32/32 [00:00<00:00, 56.41batch/s, loss_px_z: [1.0254], loss_mse_x: [0.3805], loss_py_z: [-0.0419], loss_mse_y: [0.0844], loss_pv_z: [89.5222], loss_mse_v: [1.0466], loss_postrior_z: [94.9647]]\n", "Epoch 78/100: 100%|██████████| 32/32 [00:00<00:00, 56.31batch/s, loss_px_z: [0.9360], loss_mse_x: [0.2916], loss_py_z: [0.3582], loss_mse_y: [0.1516], loss_pv_z: [-0.7475], loss_mse_v: [0.3250], loss_postrior_z: [9.3354]] \n", "Epoch 79/100: 100%|██████████| 32/32 [00:00<00:00, 56.92batch/s, loss_px_z: [0.8097], loss_mse_x: [0.1659], loss_py_z: [0.0190], loss_mse_y: [0.1032], loss_pv_z: [23.7452], loss_mse_v: [0.5672], loss_postrior_z: [30.1029]] \n", "Epoch 80/100: 100%|██████████| 32/32 [00:00<00:00, 56.77batch/s, loss_px_z: [1.5119], loss_mse_x: [0.8687], loss_py_z: [-0.2420], loss_mse_y: [0.0538], loss_pv_z: [52.9697], loss_mse_v: [0.7831], loss_postrior_z: [67.9704]]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [80/100]: MSE_x: 0.0921, MSE_y: 0.0892, MSE_v: 0.4806\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 81/100: 100%|██████████| 32/32 [00:00<00:00, 58.74batch/s, loss_px_z: [1.0592], loss_mse_x: [0.4165], loss_py_z: [0.3977], loss_mse_y: [0.1552], loss_pv_z: [76.5605], loss_mse_v: [0.7894], loss_postrior_z: [88.1919]] \n", "Epoch 82/100: 100%|██████████| 32/32 [00:00<00:00, 55.39batch/s, loss_px_z: [0.8014], loss_mse_x: [0.1592], loss_py_z: [-0.3580], loss_mse_y: [0.0247], loss_pv_z: [-10.8457], loss_mse_v: [0.3003], loss_postrior_z: [-1.7214]]\n", "Epoch 83/100: 100%|██████████| 32/32 [00:00<00:00, 55.04batch/s, loss_px_z: [0.7829], loss_mse_x: [0.1414], loss_py_z: [0.1903], loss_mse_y: [0.1368], loss_pv_z: [5.1346], loss_mse_v: [0.3579], loss_postrior_z: [13.7117]] \n", "Epoch 84/100: 100%|██████████| 32/32 [00:00<00:00, 53.91batch/s, loss_px_z: [0.7963], loss_mse_x: [0.1553], loss_py_z: [-0.1579], loss_mse_y: [0.0651], loss_pv_z: [-43.4583], loss_mse_v: [0.1511], loss_postrior_z: [-41.7073]]\n", "Epoch 85/100: 100%|██████████| 32/32 [00:00<00:00, 55.40batch/s, loss_px_z: [1.7594], loss_mse_x: [1.1190], loss_py_z: [-0.3379], loss_mse_y: [0.0233], loss_pv_z: [7.3098], loss_mse_v: [0.3463], loss_postrior_z: [7.8066]] \n", "Epoch 86/100: 100%|██████████| 32/32 [00:00<00:00, 55.51batch/s, loss_px_z: [0.9384], loss_mse_x: [0.2985], loss_py_z: [-0.0485], loss_mse_y: [0.0784], loss_pv_z: [10.2092], loss_mse_v: [0.3946], loss_postrior_z: [15.5025]]\n", "Epoch 87/100: 100%|██████████| 32/32 [00:00<00:00, 56.19batch/s, loss_px_z: [0.9014], loss_mse_x: [0.2620], loss_py_z: [-0.0807], loss_mse_y: [0.0751], loss_pv_z: [4.4597], loss_mse_v: [0.3666], loss_postrior_z: [16.1913]] \n", "Epoch 88/100: 100%|██████████| 32/32 [00:00<00:00, 54.59batch/s, loss_px_z: [0.8896], loss_mse_x: [0.2508], loss_py_z: [-0.4017], loss_mse_y: [0.0261], loss_pv_z: [-1.6607], loss_mse_v: [0.3429], loss_postrior_z: [9.9890]] \n", "Epoch 89/100: 100%|██████████| 32/32 [00:00<00:00, 55.01batch/s, loss_px_z: [0.9987], loss_mse_x: [0.3604], loss_py_z: [-0.0197], loss_mse_y: [0.0888], loss_pv_z: [2.3344], loss_mse_v: [0.3574], loss_postrior_z: [8.8961]] \n", "Epoch 90/100: 100%|██████████| 32/32 [00:00<00:00, 55.18batch/s, loss_px_z: [0.9082], loss_mse_x: [0.2706], loss_py_z: [0.3003], loss_mse_y: [0.1572], loss_pv_z: [41.4758], loss_mse_v: [0.6483], loss_postrior_z: [42.9172]] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [90/100]: MSE_x: 0.0929, MSE_y: 0.0851, MSE_v: 0.4804\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Epoch 91/100: 100%|██████████| 32/32 [00:00<00:00, 55.70batch/s, loss_px_z: [1.2535], loss_mse_x: [0.6164], loss_py_z: [0.3955], loss_mse_y: [0.1559], loss_pv_z: [27.8524], loss_mse_v: [0.4503], loss_postrior_z: [26.3598]] \n", "Epoch 92/100: 100%|██████████| 32/32 [00:00<00:00, 54.39batch/s, loss_px_z: [0.9255], loss_mse_x: [0.2889], loss_py_z: [-0.2278], loss_mse_y: [0.0506], loss_pv_z: [-30.0789], loss_mse_v: [0.2110], loss_postrior_z: [-27.2653]]\n", "Epoch 93/100: 100%|██████████| 32/32 [00:00<00:00, 55.26batch/s, loss_px_z: [0.8545], loss_mse_x: [0.2185], loss_py_z: [-0.1203], loss_mse_y: [0.0712], loss_pv_z: [-3.8885], loss_mse_v: [0.3201], loss_postrior_z: [-0.4682]] \n", "Epoch 94/100: 100%|██████████| 32/32 [00:00<00:00, 55.40batch/s, loss_px_z: [0.8185], loss_mse_x: [0.1830], loss_py_z: [-0.2654], loss_mse_y: [0.0451], loss_pv_z: [-1.6399], loss_mse_v: [0.3369], loss_postrior_z: [1.0570]] \n", "Epoch 95/100: 100%|██████████| 32/32 [00:00<00:00, 58.24batch/s, loss_px_z: [0.6933], loss_mse_x: [0.0585], loss_py_z: [-0.0570], loss_mse_y: [0.0867], loss_pv_z: [0.5686], loss_mse_v: [0.3402], loss_postrior_z: [5.5315]] \n", "Epoch 96/100: 100%|██████████| 32/32 [00:00<00:00, 60.05batch/s, loss_px_z: [0.8206], loss_mse_x: [0.1863], loss_py_z: [0.3453], loss_mse_y: [0.1475], loss_pv_z: [30.9373], loss_mse_v: [0.5577], loss_postrior_z: [33.8833]] \n", "Epoch 97/100: 100%|██████████| 32/32 [00:00<00:00, 60.05batch/s, loss_px_z: [0.7989], loss_mse_x: [0.1652], loss_py_z: [-0.2076], loss_mse_y: [0.0503], loss_pv_z: [5.4328], loss_mse_v: [0.4984], loss_postrior_z: [11.1171]] \n", "Epoch 98/100: 100%|██████████| 32/32 [00:00<00:00, 59.85batch/s, loss_px_z: [0.6983], loss_mse_x: [0.0651], loss_py_z: [-0.0814], loss_mse_y: [0.0811], loss_pv_z: [24.3846], loss_mse_v: [0.5054], loss_postrior_z: [31.1920]]\n", "Epoch 99/100: 100%|██████████| 32/32 [00:00<00:00, 60.03batch/s, loss_px_z: [1.1036], loss_mse_x: [0.4710], loss_py_z: [-0.2236], loss_mse_y: [0.0453], loss_pv_z: [2.1287], loss_mse_v: [0.3433], loss_postrior_z: [5.4971]] \n", "Epoch 100/100: 100%|██████████| 32/32 [00:00<00:00, 59.90batch/s, loss_px_z: [0.8939], loss_mse_x: [0.2618], loss_py_z: [-0.1434], loss_mse_y: [0.0728], loss_pv_z: [-24.3166], loss_mse_v: [0.2560], loss_postrior_z: [-25.0117]]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch [100/100]: MSE_x: 0.0916, MSE_y: 0.0877, MSE_v: 0.4752\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "model.fit(data=(x,y,v), epochs=100, epochs_per_eval=10, use_egm_init=True, egm_n_iter=30000, egm_batches_per_eval=500, verbose=1)" ] }, { "cell_type": "markdown", "id": "4ccdc955", "metadata": {}, "source": [ "### Make predictions using the trained CausalBGM model\n", "\n", "Estimate causal effects with posterior intervals from latent MCMC samples.\n", "\n", "| Config Parameter | Description |\n", "|-------------------------|-------------|\n", "| `data` | Tuple of data inputs `(x, y, v)`, *Required.* |\n", "| `alpha` | Significance level for the posterior interval. *Default: 0.01.* |\n", "| `n_mcmc` | Number of posterior MCMC samples to draw. *Default: 3000.* |\n", "| `burn_in` | Number of burn-in MCMC samples before drawing. *Default: 5000.* |\n", "| `x_values` | Treatment value(s) for dose-response function to be predicted. *Examples: 1.0 or [1.0,2.0]* |\n", "| `q_sd` | Standard deviation for the proposal distribution used in Metropolis-Hastings (MH) sampling. *Default: 1.0.* |\n", "| `sample_y` | Whether to consider the variance function in the outcome generative model. *Default: True.* |\n", "| `bs` | Batch size in inference stage, denoting number of test subjects processed per batch prediction. *Default: 10000.* |\n", "\n", "| Return | Type | Description | Shape |\n", "|------------|---------------|---------------------------------------------------------------------------------------------------------|-------------|\n", "| `pre_ite_mean` | `np.ndarray` | Point estimates of the Individual Treatment Effect (ITE). | `(len(x),)` |\n", "| `pre_ite_PI` | `np.ndarray` | Posterior intervals for the ITEs, representing `[lower bound, upper bound]` | `(len(x), 2)` " ] }, { "cell_type": "code", "execution_count": 12, "id": "8468fbff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MCMC Latent Variable Sampling ...\n", "Final MCMC Acceptance Rate: 0.2116\n" ] } ], "source": [ "pre_ite_mean, pre_ite_PI = model.predict(data=(x,y,v), alpha=0.01, n_mcmc=3000, burn_in=5000, q_sd=1.0, bs=1000)" ] }, { "cell_type": "markdown", "id": "322c8ccd", "metadata": {}, "source": [ "### Evaluating the results\n", "\n", "Calculate the error of average treatment effect ($\\epsilon_{ATE}$) and precision in estimation of heterogeneous effect ($\\epsilon_{PEHE}$)." ] }, { "cell_type": "code", "execution_count": 13, "id": "a7484414", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Delta ATE (Absolute Error in Average Treatment Effect): 0.0069\n", "Delta PEHE (Precision in Estimation of Heterogeneous Effect): 0.0001\n" ] } ], "source": [ "# Get the ground truth ITE\n", "ufid = '629e3d2c63914e45b227cc913c09cebe'\n", "covariants_file = 'data/ACIC_2018/x.csv'\n", "df = pd.read_csv(covariants_file, index_col='sample_id',header=0, sep=',')\n", "df_sim = pd.read_csv('data/ACIC_2018/scaling/factuals/%s.csv'%ufid,index_col='sample_id',header=0, sep=',')\n", "dataset = df.join(df_sim, how='inner')\n", "data_x = dataset['z'].values\n", "data_y = dataset['y'].values\n", "cf_id = ufid + '_cf'\n", "y_true = pd.read_csv('data/ACIC_2018/scaling/counterfactuals/%s.csv'%cf_id,index_col='sample_id',header=0, sep=',')\n", "y_0 = y_true.values[:,0]\n", "y_1 = y_true.values[:,1]\n", "ite_true = y_true.values[:,1]-y_true.values[:,0]\n", "\n", "# Evaluate\n", "delta_ate = abs(np.mean(pre_ite_mean) - np.mean(ite_true))\n", "delta_pehe = np.mean((pre_ite_mean - ite_true)**2)\n", "\n", "print(f\"Delta ATE (Absolute Error in Average Treatment Effect): {delta_ate:.4f}\")\n", "print(f\"Delta PEHE (Precision in Estimation of Heterogeneous Effect): {delta_pehe:.4f}\")" ] }, { "cell_type": "markdown", "id": "fb48b96a", "metadata": {}, "source": [ "## Use CausalBGM by a command-line interface (CLI)\n", "\n", "When installing the CausalBGM by `pip install bayesgm`, an indepedent console program will be available for general use. This has advantage of being generalizeable to non-python scripts!" ] }, { "cell_type": "markdown", "id": "70d23605-99d7-4f6d-a47a-8a0306553ce2", "metadata": {}, "source": [ "
\n", "Reminder\n", "\n", "- Since the current CLI directly takes data from a single file with txt/csv/npy format as input, the training and inference are on the **same dataset**.\n", "- Python or R APIs are recommended for more flexible usage.\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "id": "ed4c9849-2d95-4d01-bf0f-a81e152720e2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2026-03-12 22:10:07.495988: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F AVX512_VNNI AVX512_BF16 AVX_VNNI AMX_TILE AMX_INT8 AMX_BF16 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2026-03-12 22:10:07.584365: I tensorflow/core/util/util.cc:169] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", "2026-03-12 22:10:07.607316: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", "2026-03-12 22:10:08.326003: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/home/ql339/.conda/envs/py3.9/lib/\n", "2026-03-12 22:10:08.326092: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/home/ql339/.conda/envs/py3.9/lib/\n", "2026-03-12 22:10:08.326098: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n", "usage: bayesgm causalbgm [-h] -o OUTPUT_DIR -i INPUT [-t DELIMITER]\n", " [-d DATASET] [-F SAVE_FORMAT] [-save_model]\n", " [-save_res] [--use_bnn | --no-use_bnn]\n", " [--use_egm_init | --no-use_egm_init] [--seed SEED]\n", " [-B | --binary_treatment | --no-binary_treatment]\n", " [-Z Z_DIMS [Z_DIMS ...]] [--lr_theta LR_THETA]\n", " [--lr_z LR_Z] [--x_min X_MIN] [--x_max X_MAX]\n", " [--x_values X_VALUES [X_VALUES ...]]\n", " [--g_units G_UNITS [G_UNITS ...]]\n", " [--f_units F_UNITS [F_UNITS ...]]\n", " [--h_units H_UNITS [H_UNITS ...]]\n", " [--kl_weight KL_WEIGHT] [--lr LR]\n", " [--g_d_freq G_D_FREQ]\n", " [--e_units E_UNITS [E_UNITS ...]]\n", " [--dz_units DZ_UNITS [DZ_UNITS ...]]\n", " [--use-z-rec | --no-use-z-rec] [-N N_ITER]\n", " [--startoff STARTOFF]\n", " [--batches_per_eval BATCHES_PER_EVAL] [-E EPOCHS]\n", " [-M N_MCMC] [-q Q_SD]\n", " [--epochs_per_eval EPOCHS_PER_EVAL] [--alpha ALPHA]\n", "\n", "CausalBGM: An AI-powered Bayesian generative modeling approach for causal\n", "inference in observational studies\n", "\n", "optional arguments:\n", " -h, --help show this help message and exit\n", " -o OUTPUT_DIR, --output_dir OUTPUT_DIR\n", " Output directory\n", " -i INPUT, --input INPUT\n", " Input data file must be in csv or txt or npz format\n", " -t DELIMITER, --delimiter DELIMITER\n", " Delimiter for txt or csv files (default: tab '\\t').\n", " -d DATASET, --dataset DATASET\n", " Dataset name\n", " -F SAVE_FORMAT, --save_format SAVE_FORMAT\n", " Saving format (default: txt)\n", " -save_model Whether to save model. (default: False)\n", " -save_res Whether to save intermediate results. (default: True)\n", " --use_bnn, --no-use_bnn\n", " Whether use Bayesian neural nets. (default: True)\n", " --use_egm_init, --no-use_egm_init\n", " Whether use EGM initialization. (default: True)\n", " --seed SEED Random seed for reproduction (default: 123).\n", " -B, --binary_treatment, --no-binary_treatment\n", " Whether use binary treatment setting. (default: True)\n", " -Z Z_DIMS [Z_DIMS ...], --z_dims Z_DIMS [Z_DIMS ...]\n", " Latent dimensions of Z (default: [3, 3, 6, 6]).\n", " --lr_theta LR_THETA Learning rate for updating model parameters (default:\n", " 0.0001).\n", " --lr_z LR_Z Learning rate for updating latent variables (default:\n", " 0.0001).\n", " --x_min X_MIN Lower bound for treatment interval (default: 0.0).\n", " --x_max X_MAX Upper bound for treatment interval (default: 3.0).\n", " --x_values X_VALUES [X_VALUES ...]\n", " List of treatment values to be predicted. Provide\n", " space-separated values. Example: --x_values 0.5 1.0\n", " 1.5\n", " --g_units G_UNITS [G_UNITS ...]\n", " Number of units for covariates generative model\n", " (default: [64,64,64,64,64]).\n", " --f_units F_UNITS [F_UNITS ...]\n", " Number of units for outcome generative model (default:\n", " [64,32,8]).\n", " --h_units H_UNITS [H_UNITS ...]\n", " Number of units for treatment generative model\n", " (default: [64,32,8]).\n", " --kl_weight KL_WEIGHT\n", " Coefficient for KL divergence term in BNNs (default:\n", " 0.0001).\n", " --lr LR Learning rate for EGM initialization (default:\n", " 0.0001).\n", " --g_d_freq G_D_FREQ Frequency for updating discriminators and generators\n", " (default: 5).\n", " --e_units E_UNITS [E_UNITS ...]\n", " Number of units for encoder network (default:\n", " [64,64,64,64,64]).\n", " --dz_units DZ_UNITS [DZ_UNITS ...]\n", " Number of units for discriminator network in latent\n", " space (default: [64,32,8]).\n", " --use-z-rec, --no-use-z-rec\n", " Use the reconstruction for latent features (default:\n", " True). (default: True)\n", " -N N_ITER, --n_iter N_ITER\n", " Number of iterations (default: 30000).\n", " --startoff STARTOFF Iteration for starting evaluation (default: 0).\n", " --batches_per_eval BATCHES_PER_EVAL\n", " Number of iterations per evaluation (default: 500).\n", " -E EPOCHS, --epochs EPOCHS\n", " Number of epochs in iterative updating algorithm\n", " (default: 100).\n", " -M N_MCMC, --n_mcmc N_MCMC\n", " MCMC sample size (default: 3000).\n", " -q Q_SD, --q_sd Q_SD Standard deviation for proposal distribution in MCMC,\n", " a negative q_sd denotes adaptive MCMC (default: 1.0).\n", " --epochs_per_eval EPOCHS_PER_EVAL\n", " Number of epochs per evaluation (default: 10).\n", " --alpha ALPHA Significance level (default: 0.01).\n" ] } ], "source": [ "!bayesgm causalbgm -h" ] }, { "cell_type": "markdown", "id": "4a52c20b", "metadata": {}, "source": [ "The config parameters are consistent with the `Python APIs` in the previous sections. Here, we use a demo data (continous treatment setting) for an example!" ] }, { "cell_type": "code", "execution_count": 2, "id": "fc1457a7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2025-01-20 11:39:17.090463: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2025-01-20 11:39:17.213772: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", "2025-01-20 11:39:17.787946: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /share/software/user/open/cudnn/8.1.1.33/lib64:/share/software/user/open/nccl/2.8.4/lib:/usr/lib64/nvidia:/share/software/user/open/cuda/11.2.0/targets/x86_64-linux/lib:/share/software/user/open/cuda/11.2.0/lib64:/share/software/user/open/cuda/11.2.0/nvvm/lib64:/share/software/user/open/cuda/11.2.0/extras/Debugger/lib64:/share/software/user/open/cuda/11.2.0/extras/CUPTI/lib64:/share/software/user/open/openblas/0.3.10/lib:/share/software/user/open/gcc/10.1.0/lib64:/share/software/user/open/gcc/10.1.0/lib/gcc/x86_64-pc-linux-gnu:/share/software/user/open/gcc/10.1.0/lib:/share/software/user/open/tensorrt/8.5.1.7/lib:/share/software/user/open/python/3.9.0/lib:/share/software/user/open/libffi/3.2.1/lib64:/share/software/user/open/sqlite/3.44.2/lib:/share/software/user/open/readline/8.2/lib:/share/software/user/open/ncurses/6.4/lib:/share/software/user/open/tcltk/8.6.6/lib:/share/software/user/open/libressl/3.2.1/lib:/share/software/user/open/zlib/1.2.11/lib\n", "2025-01-20 11:39:17.788041: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /share/software/user/open/cudnn/8.1.1.33/lib64:/share/software/user/open/nccl/2.8.4/lib:/usr/lib64/nvidia:/share/software/user/open/cuda/11.2.0/targets/x86_64-linux/lib:/share/software/user/open/cuda/11.2.0/lib64:/share/software/user/open/cuda/11.2.0/nvvm/lib64:/share/software/user/open/cuda/11.2.0/extras/Debugger/lib64:/share/software/user/open/cuda/11.2.0/extras/CUPTI/lib64:/share/software/user/open/openblas/0.3.10/lib:/share/software/user/open/gcc/10.1.0/lib64:/share/software/user/open/gcc/10.1.0/lib/gcc/x86_64-pc-linux-gnu:/share/software/user/open/gcc/10.1.0/lib:/share/software/user/open/tensorrt/8.5.1.7/lib:/share/software/user/open/python/3.9.0/lib:/share/software/user/open/libffi/3.2.1/lib64:/share/software/user/open/sqlite/3.44.2/lib:/share/software/user/open/readline/8.2/lib:/share/software/user/open/ncurses/6.4/lib:/share/software/user/open/tcltk/8.6.6/lib:/share/software/user/open/libressl/3.2.1/lib:/share/software/user/open/zlib/1.2.11/lib\n", "2025-01-20 11:39:17.788058: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n", "2025-01-20 11:39:19.651249: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2025-01-20 11:39:20.144803: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 43430 MB memory: -> device: 0, name: NVIDIA A40, pci bus id: 0000:06:00.0, compute capability: 8.6\n", "/home/users/liuqiao/.local/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:95: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " loc = add_variable_fn(\n", "/home/users/liuqiao/.local/lib/python3.9/site-packages/tensorflow_probability/python/layers/util.py:105: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use the `layer.add_weight()` method instead.\n", " untransformed_scale = add_variable_fn(\n", "2025-01-20 11:39:21.124243: I tensorflow/stream_executor/cuda/cuda_blas.cc:1614] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.\n", "EGM Initialization Starts ...\n", "EGM Initialization Iter [0] : e_loss_adv [0.0104], l2_loss_v [1.0768], l2_loss_z [0.9892], l2_loss_x [0.9474], l2_loss_y [4.9964], g_e_loss [8.0202], dz_loss [0.0822], d_loss [1.8063]\n", "EGM Initialization Iter [500] : e_loss_adv [1.9232], l2_loss_v [1.1323], l2_loss_z [1.2015], l2_loss_x [0.4507], l2_loss_y [2.8286], g_e_loss [7.5364], dz_loss [-0.9738], d_loss [-0.5502]\n", "EGM Initialization Iter [1000] : e_loss_adv [2.0145], l2_loss_v [0.9970], l2_loss_z [1.1143], l2_loss_x [1.5727], l2_loss_y [0.9798], g_e_loss [6.6785], dz_loss [-1.6597], d_loss [-1.3993]\n", "EGM Initialization Ends.\n", "Initialize latent variables Z with e(V)...\n", "Iterative Updating Starts ...\n", "Epoch 0/10: 100%|█| 3/3 [00:09<00:00, 3.25s/batch, loss_px_z: [1.7446], loss_ms\n", "Epoch [0/10]: MSE_x: 1.5652, MSE_y: 1.5891, MSE_v: 0.9300\n", "\n", "Epoch 1/10: 100%|█| 3/3 [00:00<00:00, 36.85batch/s, loss_px_z: [1.0154], loss_ms\n", "Epoch 2/10: 100%|█| 3/3 [00:00<00:00, 36.99batch/s, loss_px_z: [1.3450], loss_ms\n", "Epoch 3/10: 100%|█| 3/3 [00:00<00:00, 36.98batch/s, loss_px_z: [1.6738], loss_ms\n", "Epoch 4/10: 100%|█| 3/3 [00:00<00:00, 38.60batch/s, loss_px_z: [1.9682], loss_ms\n", "Epoch 5/10: 100%|█| 3/3 [00:00<00:00, 32.90batch/s, loss_px_z: [2.1426], loss_ms\n", "Epoch 6/10: 100%|█| 3/3 [00:00<00:00, 40.06batch/s, loss_px_z: [0.8936], loss_ms\n", "Epoch 7/10: 100%|█| 3/3 [00:00<00:00, 39.97batch/s, loss_px_z: [1.1379], loss_ms\n", "Epoch 8/10: 100%|█| 3/3 [00:00<00:00, 38.26batch/s, loss_px_z: [0.9878], loss_ms\n", "Epoch 9/10: 100%|█| 3/3 [00:00<00:00, 37.52batch/s, loss_px_z: [0.6265], loss_ms\n", "Epoch 10/10: 100%|█| 3/3 [00:00<00:00, 36.10batch/s, loss_px_z: [1.0492], loss_m\n", "Epoch [10/10]: MSE_x: 1.5488, MSE_y: 1.5971, MSE_v: 0.9248\n", "\n", "MCMC Latent Variable Sampling ...\n", "Final MCMC Acceptance Rate: 0.1590\n" ] } ], "source": [ "!bayesgm causalbgm -i demo.csv -o ./ -d Demo -N 1000 -E 10 -M 500 -Z 1 1 1 7 --no-binary_treatment --x_values 0 1 2" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.23" } }, "nbformat": 4, "nbformat_minor": 5 }