{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# Save Chain to Log File\n", "Author(s): Paul Miles | Date Created: July 19, 2019\n", "\n", "Many models are time consuming to evaluate. As MCMC simulations required many model evaluations, it can be useful to periodically save the chain elements to a file. This can be useful for a variety of reasons:\n", "\n", "- Chain visualization while simulation continues to run.\n", "- Chain is saved in the event that simulation ends prematurely. \n", "\n", "This is important when working on remote systems where you may have limited computation time. This tutorial demonstrates the following:\n", "\n", "- How to specify a log file directory\n", "- Format to save log files in (binary or text)\n", "- How to read in log files for analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Run Simulation & Export to Log Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import required paths." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.9.0\n" ] } ], "source": [ "import numpy as np\n", "from pymcmcstat.MCMC import MCMC\n", "from datetime import datetime\n", "import pymcmcstat\n", "print(pymcmcstat.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define a simple model and sum-of-squares function." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# define test model function\n", "def test_modelfun(xdata, theta):\n", " m = theta[0]\n", " b = theta[1]\n", " nrow, ncol = xdata.shape\n", " y = np.zeros([nrow,1])\n", " y[:,0] = m*xdata.reshape(nrow,) + b\n", " return y\n", "\n", "def test_ssfun(theta, data):\n", " xdata = data.xdata[0]\n", " ydata = data.ydata[0]\n", " # eval model\n", " ymodel = test_modelfun(xdata, theta)\n", " # calc sos\n", " ss = sum((ymodel[:, 0] - ydata[:, 0])**2)\n", " return ss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize MCMC object:\n", "- Add data\n", "- Define model settings\n", "- Define model parameters" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Initialize MCMC object\n", "mcset = MCMC()\n", "# Add data\n", "nds = 100\n", "x = np.linspace(2, 3, num=nds)\n", "y = 2.*x + 3. + 0.1*np.random.standard_normal(x.shape)\n", "mcset.data.add_data_set(x, y)\n", "# update model settings\n", "mcset.model_settings.define_model_settings(sos_function=test_ssfun)\n", "\n", "mcset.parameters.add_model_parameter(\n", " name='m',\n", " theta0=2.,\n", " minimum=-10,\n", " maximum=np.inf,\n", " sample=True)\n", "mcset.parameters.add_model_parameter(\n", " name='b',\n", " theta0=-5.,\n", " minimum=-10,\n", " maximum=100,\n", " sample=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define log file directory and turn on flags in simulations options\n", "The following keyword arguments of the simulation options allow you to setup the log files.\n", "\n", "- `savedir`: Directory in which to store log files. If not specified, but log files turned on, then saves to directory with naming convention 'YYYYMMDD_hhmmss_chain_log'.\n", "- `save_to_bin`: Save log files in binary format. Uses `h5py` package for binary read/write.\n", "- `save_to_txt`: Save log files in text format. Uses `numpy` package for text read/write.\n", "\n", "By default the feature is set to `False`. You can save to either format or to both. Regardless of what format is used to save the chain, a text log file will be included which appends a date/time stamp with corresponding chain indices. This will be explained in more detail later.\n", "\n", "To generate a set of results and save them to a specific directory, the following code can be executed:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import os\n", "datestr = datetime.now().strftime('%Y%m%d_%H%M%S')\n", "savedir = 'resources' + os.sep + str('{}_{}'.format(datestr, 'serial_chain'))\n", "mcset.simulation_options.define_simulation_options(\n", " nsimu=int(5e4), updatesigma=1, method='dram',\n", " savedir=savedir, savesize=1000, save_to_json=True,\n", " verbosity=0, waitbar=False, save_to_txt=True, save_to_bin=True)\n", "\n", "mcset.run_simulation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Process Simulation\n", "At this point, the simulation is either running, or has completed running. You will observe a folder in the working directory that matches the input argument for `savedir`. In this case, we are going to reference a saved solution from the `resources` directory." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We observe that the folder `resources/20190517_073038_serial_chain` matches the pattern that was specified for `savedir`, and we display its contents" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20190517_073038_mcmc_simulation.json s2chainfile.h5\r\n", "binlogfile.txt s2chainfile.txt\r\n", "chainfile.h5 sschainfile.h5\r\n", "chainfile.txt sschainfile.txt\r\n", "covchainfile.h5 txtlogfile.txt\r\n", "covchainfile.txt\r\n" ] } ], "source": [ "ls resources/20190517_073038_serial_chain/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, there are log files saved in both binary (h5) and text (txt) format. Note, if you run this simulation on your machine, the results folder (`savedir`) will be different because of the date/time stamp." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Processing the log files\n", "We start by importing several modules from the [pymcmcstat](https://prmiles.wordpress.ncsu.edu/codes/python-packages/pymcmcstat/) package. We note that this operation should be done from a separate script file, and possibly from a separate computer. For example, if running a long simulation on a remote server, you can periodically copy the log files from the remote server and analyze the chains on your local machine." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "from pymcmcstat.chain import ChainProcessing as CP\n", "from pymcmcstat.chain.ChainStatistics import chainstats\n", "from pymcmcstat import mcmcplot as mcp\n", "import time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We initialize the plotting class and define the directory in which to find the log files. If you want to look at results you generated, then chage the value of `savedir` accordingly." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# define directory where log files are saved\n", "savedir = 'resources' + os.sep + '20190517_073038_serial_chain'\n", "# For testing purposes we can repeatedly read in the data to see how binary versus text is processed.\n", "ns = 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Read in binary data files and print amount of time it takes to process." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Binary: 0.05322208404541016 sec\n", "\n" ] } ], "source": [ "start = time.time()\n", "for ii in range(ns):\n", " results = CP.read_in_savedir_files(savedir, extension='h5')\n", "end = time.time()\n", "binary_time = end - start\n", "print('Binary: {} sec\\n'.format(binary_time/ns))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Text: 0.4920275926589966 sec\n", "\n" ] } ], "source": [ "start = time.time()\n", "for ii in range(ns):\n", " results = CP.read_in_savedir_files(savedir, extension='txt') \n", "end = time.time()\n", "text_time = end - start\n", "print('Text: {} sec\\n'.format(text_time/ns))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is clearly seen that the binary files are more quickly processed. In either case, the results extracted from the log files are identical, and we can proceed with the analysis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis\n", "We extract the following from the results dictionary:\n", "- `chain`: Sampling chain for model parameters\n", "- `s2chain`: Observation error chain\n", "- `sschain`: Sum-of-squares error corresponding to each row of `chain`." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "chain = results['chain']\n", "s2chain = results['s2chain']\n", "sschain = results['sschain']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define the burn-in period for the chain as half the simulation run time. Display statistics for burned-in portion of chain." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "------------------------------\n", "name : mean std MC_err tau geweke\n", "$p_{0}$ : 2.1135 0.0391 0.0017 38.1465 0.9989\n", "$p_{1}$ : 2.7027 0.0984 0.0044 37.5644 0.9975\n", "------------------------------\n", "==============================\n", "Acceptance rate information\n", "Chain provided:\n", "Net : 20.32% -> 5079/25000\n", "------------------------------\n" ] } ], "source": [ "# define burnin\n", "nsimu = chain.shape[0]\n", "burnin = int(nsimu/2)\n", "# display chain statistics\n", "stats = chainstats(chain[burnin:,:], returnstats=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot Chain\n", "- Chain panel\n", "- pairwise correlation" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "