{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "How to read this lecture…\n", "\n", "- If using QuantEcon lectures for the first time on a computer, execute ] add InstantiateFromURL inside of a notebook or the REPL \n", "- For some notebooks, enable content with “Trust” on the command tab of Jupyter lab \n", "- Code should execute sequentially if run in a Jupyter notebook \n", "- Please direct feedback to [contact@quantecon.org](mailto:contact@quantecon.org\") or [discourse forum](http://discourse.quantecon.org/) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setting up Your Julia Environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Contents\n", "\n", "- [Setting up Your Julia Environment](#Setting-up-Your-Julia-Environment) \n", " - [Overview](#Overview) \n", " - [Jupyter](#Jupyter) \n", " - [Installing a Pre-built Jupyter Image](#Installing-a-Pre-built-Jupyter-Image) \n", " - [Installing Julia and Dependencies Manually](#Installing-Julia-and-Dependencies-Manually) \n", " - [Using Jupyter](#Using-Jupyter) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview\n", "\n", "In this lecture we will cover how to get up and running with Julia\n", "\n", "Topics:\n", "\n", "1. Jupyter \n", "1. Choosing from different options \n", "1. Installation of libraries, including the Julia code that underpins these lectures " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jupyter\n", "\n", "Like Python, and unlike Matlab and Stata, there is a looser connection between Julia as a programming language and Julia as a development environment\n", "\n", "Because of this, you will have different options for editing code on your local computer or in the cloud\n", "\n", "Several of the options rely on [Jupyter](http://jupyter.org/) which provides a browser-based interface to access computational kernels for different languages (e.g. Julia, Python, R, etc.)\n", "\n", "While you will eventually use other editors, there are some advantages of starting with Jupyter while learning the language\n", "\n", "- It requires no installation if you used a cloud-based solution \n", "- Nicely formatted output in the browser, including tables, figures, animation, video, etc. \n", "- The ability to mix in formatted text and mathematical expressions between cells \n", "- Functions to generate PDF slides, static HTML, etc. \n", "\n", "\n", "Whether you end up using Jupyter as your primary work environment or not, you’ll find learning about it an excellent investment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Recommended Options\n", "\n", "In order of priority, for those just getting started, we suggest\n", "\n", "1. Use [Jupyter on the cloud or department server](jl_jupyterhub) if it is available \n", "1. Install the pre-built [docker-based Jupyter](jl_jupyterdocker) from QuantEcon \n", "1. Install [Anaconda and Julia locally](jl_jupyterlocal) otherwise and manually install QuantEcon based packages \n", "\n", "\n", "Eventually, you will both want to do a [local installation](jl_jupyterlocal) and move from just using jupyter to using other [tools and editors](tools_editors) such as [Atom/Juno](http://junolab.org/), but don’t let the environment get in the way of learning the language\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using Jupyter Online\n", "\n", "If you have access to a cloud based solution for Jupyter, then that is typically the easiest solution\n", "\n", "* JuliaBox (currently having , once it's working.For example, many Canadian students have access to syzygy.ca* Ask at your university ..(e.g. `www.syzygy.ca `_ and `juliabox.com `_ )- Students: ask your department if these resources are available \n", "- Universities and workgroups: email [contact@quantecon.org](mailto:contact@quantecon.org\") for help on setting up a shared Jupyterhub instance with precompiled packages ready for these lecture notes \n", "\n", "\n", "If you have are given an online Jupyter installation for a class, you may not need to do anything to begin using these notebooks\n", "\n", "Otherwise, if there are errors when you attempt to use an online Jupyterhub, you will need to go open a Jupyter notebook and type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "] add InstantiateFromURL\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Installing a Pre-built Jupyter Image\n", "\n", "[Docker](https://www.docker.com/) is a technology that you use to host a “[virtual](https://en.wikipedia.org/wiki/Operating-system-level_virtualization) ” version of a minimal, self-contained operating system on another computer\n", "\n", "While it is largely used for running code in the cloud and in distributed computing, it is also convenient for using on local computers\n", "\n", "In essence, it allows people to share a consistent and reproducible environment with no setup or tinkering required\n", "\n", "QuantEcon has constructed a pre-built [docker image](https://hub.docker.com/u/quantecon/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setup\n", "\n", "- Create an account for [Docker Hub](https://hub.docker.com/) and create a docker id \n", "\n", "\n", "Download and install\n", "\n", "- [Mac](https://store.docker.com/editions/community/docker-ce-desktop-mac) \n", "- [Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows). **Do not** choose to use Windows containers \n", "\n", "\n", "Open a terminal on OS/X and Linux, or a “Windows PowerShell” terminal on Windows\n", "\n", "To verify that there are no obvious errors in the installation, runRun ``docker version`` in the terminal to check there are no obvious errorsDownload the QuantEcon Docker image by running the following in your terminal (this may take some time depending on your internet connection)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "docker pull quantecon/base\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After this is finished, first clear any existing volumes and then create a persistent storage volume (ignoring any warnings from the rm step)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "docker volume rm quantecon\n", "docker volume create quantecon\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running in a Local Folder\n", "\n", "The Docker image can exchange files locally (and recursively below in the tree) to where it is run\n", "\n", "Open a terminal and cd to the directory you are interested in storing local files\n", "\n", "To run an image local to those files, type the following in the terminal (on Linux and OSX)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "docker run --rm -p 8888:8888 -v quantecon:/home/jovyan/.julia -v \"$(pwd)\":/home/jovyan/local quantecon/base\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And on Powershell on Window" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "docker run --rm -p 8888:8888 -v quantecon:/home/jovyan/.julia -v ${PWD}:/home/jovyan/local quantecon/base\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Remark:** When you call this command, Docker may require you to give it permissions to access the drive and the network. If you do not see the output within 20 or so seconds, then look for confirmation windows which may be hidden behind the terminal/etc.\n", "\n", "In the output, you should see some text near that bottom that looks like" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "127.0.0.1):8888/?token=7c8f37bf32b1d7f0b633596204ee7361c1213926a6f0a44b\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Copy the text after ?token= (e.g. 7c8f37bf32b1d7f0b633596204ee7361c1213926a6f0a44b)\n", "\n", "In a browser, go to a URL like the following" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "http://127.0.0.1:8888/lab\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: Ctrl+C is also the keyboard shortcut you use to kill the container. So be sure to copy using the mouse.\n", "\n", "Paste the text into Password or token: and choose Log in\n", "\n", "Ensure you save any important files to the local notebooks in the local directory, which stores in the local filesystem where you ran the docker command\n", "\n", "A few useful maintenance features\n", "\n", "- If you forget your token number, you may need to stop and restart the container \n", "- To stop the container, use Ctrl-C or type docker stop $(docker ps -aq) in a different terminal \n", "- To reset your Docker volume completely, redo the docker volume rm quantecon and docker volume create quantecon steps \n", "- To clean unnecessary Docker assets from your system, run docker system prune \n", "\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Installing Julia and Dependencies Manually\n", "\n", "While using the Docker instance is convenient and error-proof, you may eventually want to install things locally\n", "\n", "The easiest way to do that is to install Anaconda for a full Python and Jupyter environment,\n", "\n", "Install Anaconda by: [downloading the binary](https://www.anaconda.com/download/) (3.7 version) and install\n", "\n", "- Make sure you click yes to “add Anaconda to my PATH.” If you’d rather do that later, see: [Anaconda for Windows](http://docs.anaconda.com/anaconda/install/windows/) and [Mac/Linux](https://conda.io/docs/user-guide/install/macos.html). \n", "\n", "\n", "This could be in a separate section* Note that the packages in Anaconda update regularly --- you can keep up to date by typing ``conda update anaconda`` in a terminalDownload and install Julia, from [download page](http://julialang.org/downloads/) , accepting all default options.\n", "\n", "Assuming there were no problems, you should now be able to start Julia either by\n", "\n", "- Navigating to Julia through your menus or desktop icons (Windows, OSX), or \n", "- Opening a terminal and typing julia (Linux, + OSX/git bash if you configure it) \n", "\n", "\n", "Either way you should now be looking at something like this (modulo your operating system — this is a Linux machine)\n", "\n", "\n", "\n", " \n", "In that julia terminal, type the following" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m git-repo `https://github.com/JuliaRegistries/General.git`\n", "\u001b[?25l\u001b[2K\u001b[?25h\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Tables ───────── v0.1.11\n", "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m NLsolve ──────── v3.0.1\n", "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DiffEqJump ───── v5.6.0\n", "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Optim ────────── v0.17.2\n", "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m OrdinaryDiffEq ─ v4.17.2\n", "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `~/.julia/environments/v1.0/Project.toml`\n", " \u001b[90m [2774e3e8]\u001b[39m\u001b[93m ↑ NLsolve v2.1.0 ⇒ v3.0.1\u001b[39m\n", " \u001b[90m [429524aa]\u001b[39m\u001b[93m ↑ Optim v0.17.1 ⇒ v0.17.2\u001b[39m\n", "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `~/.julia/environments/v1.0/Manifest.toml`\n", " \u001b[90m [c894b116]\u001b[39m\u001b[93m ↑ DiffEqJump v5.5.0 ⇒ v5.6.0\u001b[39m\n", " \u001b[90m [d3d80556]\u001b[39m\u001b[93m ↑ LineSearches v7.0.0 ⇒ v7.0.1\u001b[39m\n", " \u001b[90m [2774e3e8]\u001b[39m\u001b[93m ↑ NLsolve v2.1.0 ⇒ v3.0.1\u001b[39m\n", " \u001b[90m [429524aa]\u001b[39m\u001b[93m ↑ Optim v0.17.1 ⇒ v0.17.2\u001b[39m\n", " \u001b[90m [1dea7af3]\u001b[39m\u001b[93m ↑ OrdinaryDiffEq v4.17.0 ⇒ v4.17.2\u001b[39m\n", " \u001b[90m [bd369af6]\u001b[39m\u001b[93m ↑ Tables v0.1.10 ⇒ v0.1.11\u001b[39m\n" ] } ], "source": [ "] add IJulia InstantiateFromURL Revise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, install and precompile all of the key packages for these lecture notes (which may take 10-20 minutes)," ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "using InstantiateFromURL\n", "activate_github(\"QuantEcon/QuantEconLecturePackages\", tag = \"v0.9.0\") # activate the QuantEcon environment\n", "\n", "using LinearAlgebra, Statistics, Compat # load common packages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To run Jupyter, in a terminal cd to the location you wish to modify local files in and type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```none\n", "jupyter lab\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For convenience, you may find it useful on your operating system to change the directory where the REPL starts\n", "\n", "- On Windows, if you have a shortcut on your desktop or on the taskbar, you should: (1) right-click on the icon; (2) right click on the “julia” text; (3) choose “Properties”, and (4) change the “Start In” to be something such as C:\\Users\\YOURUSERNAME\\Documents \n", "\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating a Startup File (Advanced)\n", "\n", "Whenever the Julia compiler or REPL starts, it will look for a file called startup.jl (see [Julia Manual](https://docs.julialang.org/en/v1/manual/getting-started/#man-getting-started-1))\n", "\n", "The location for the file is relative to your default Julia environment (e.g. ~/.julia/config/startup.jl or C:\\Users\\USERNAME\\.julia\\config\\startup.jl on Windows)\n", "\n", "To add one, first create the ~/.julia/config/ directory if necessary in the terminal or file explorer (to find the ~/.julia location in the REPL, you can look at the output of ] st)\n", "\n", "Next, either download the file [startup.jl](/_static/includes/startup.jl) into that directory, or create a file and paste in the following text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```julia\n", "import REPL\n", "Base.atreplinit() do repl\n", " # make the ; shell mode sticky\n", " !isdefined(repl, :interface) && (repl.interface = REPL.setup_interface(repl))\n", " repl.interface.modes[2].sticky=true\n", "end\n", "\n", "try\n", " @eval using Revise\n", " # Turn on Revise's automatic-evaluation behavior\n", " Revise.async_steal_repl_backend()\n", "catch err\n", " @warn \"Could not load Revise.\"\n", "end\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Jupyter\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Getting Started\n", "\n", "After you have started Jupyter (either on the cloud, the docker, or locally installed on your computer)\n", "\n", "You should see something (not exactly) like this\n", "\n", "\n", "\n", " \n", "The page you are looking at is called the “dashboard”\n", "\n", "The address localhost:8888/tree you see in the image indicates that the browser is communicating with a Julia session via port 8888 of the local machine\n", "\n", "If you click on “New” you should have the option to start a Julia notebook\n", "\n", "\n", "\n", " \n", "Here’s what your Julia notebook should look like\n", "\n", "\n", "\n", " \n", "The notebook displays an *active cell*, into which you can type Julia commands" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notebook Basics\n", "\n", "Notice that in the previous figure the cell is surrounded by a green border\n", "\n", "This means that the cell is in *edit mode*\n", "\n", "As a result, you can type in Julia code and it will appear in the cell\n", "\n", "When you’re ready to execute these commands, hit Shift-Enter instead of the usual Enter\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Modal Editing\n", "\n", "The next thing to understand about the Jupyter notebook is that it uses a *modal* editing system\n", "\n", "This means that the effect of typing at the keyboard **depends on which mode you are in**\n", "\n", "The two modes are\n", "\n", "1. Edit mode \n", " \n", " Indicated by a green border around one cell, as in the pictures above\n", " \n", " Whatever you type appears as is in that cell- \n", " - \n", "1. Command mode \n", " \n", " The green border is replaced by a blue border\n", " \n", " Key strokes are interpreted as commands — for example, typing b adds a new cell below the current one- \n", " - \n", "\n", "\n", "(To learn about other commands available in command mode, go to “Keyboard Shortcuts” in the “Help” menu)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Switching modes\n", "\n", "- To switch to command mode from edit mode, hit the Esc key \n", "- To switch to edit mode from command mode, hit Enter or click in a cell \n", "\n", "\n", "The modal behavior of the Jupyter notebook is a little tricky at first but very efficient when you get used to it" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Working with Files\n", "\n", "To run an existing Julia file using the notebook you can copy and paste the contents into a cell in the notebook\n", "\n", "If it’s a long file, however, you have the alternative of\n", "\n", "1. Saving the file in your **present working directory** \n", "1. Executing include(\"filename\") in a cell \n", "\n", "\n", "The present working directory can be found by executing the command pwd()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Plots\n", "\n", "Let’s generate some plots\n", "\n", "First, ensure that you have activated a set of packages with" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "using InstantiateFromURL\n", "activate_github(\"QuantEcon/QuantEconLecturePackages\", tag = \"v0.9.0\") # activate the QuantEcon environment\n", "\n", "using LinearAlgebra, Statistics, Compat # load common packages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now try copying the following into a notebook cell and hit Shift-Enter" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Plots\n", "gr(fmt=:png)\n", "plot(sin, -2pi, pi, label=\"sine function\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You’ll see something like this (although the style of plot depends on your\n", "installation — more on this later)\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Working with the Notebook\n", "\n", "Let’s go over some more Jupyter notebook features — enough so that we can press ahead with programming" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Tab Completion\n", "\n", "A simple but useful feature of IJulia is tab completion\n", "\n", "For example if you type rep and hit the tab key you’ll get a list of all\n", "commands that start with rep\n", "\n", "\n", "\n", " \n", "IJulia offers up the possible completions\n", "\n", "This helps remind you of what’s available and saves a bit of typing\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Online Help\n", "\n", "To get help on the Julia function such as repmat, enter ?repmat\n", "\n", "Documentation should now appear in the browser" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Other Content\n", "\n", "In addition to executing code, the Jupyter notebook allows you to embed text, equations, figures and even videos in the page\n", "\n", "For example, here we enter a mixture of plain text and LaTeX instead of code\n", "\n", "\n", "\n", " \n", "Next we Esc to enter command mode and then type m to indicate that we\n", "are writing [Markdown](http://daringfireball.net/projects/markdown/), a mark-up language similar to (but simpler than) LaTeX\n", "\n", "(You can also use your mouse to select Markdown from the Code drop-down box just below the list of menu items)\n", "\n", "Now we Shift + Enter to produce this\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Inserting unicode (e.g. Greek letters)\n", "\n", "Julia supports the use of [unicode characters](https://docs.julialang.org/en/v1/manual/unicode-input/)\n", "such as α and β in your code\n", "\n", "Unicode characters can be typed quickly in Jupyter using the tab key\n", "\n", "Try creating a new code cell and typing \\alpha, then hitting the tab key on your keyboard" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Shell Commands\n", "\n", "You can execute shell commands (system commands) in IJulia by prepending a semicolon\n", "\n", "For example, ;ls will execute the UNIX style shell command ls, which — at least for UNIX style operating systems — lists the contents of the current working directory\n", "\n", "These shell commands are handled by your default system shell and hence are platform specific" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Package Manager\n", "\n", "You can enter the package manager by prepending a ]\n", "\n", "For example, ] st will give the the current status of installed pacakges in the current environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sharing Notebooks\n", "\n", "Notebook files are just text files structured in [JSON](https://en.wikipedia.org/wiki/JSON) and typically end with .ipynb\n", "\n", "A notebook can easily be saved and shared between users — you just need to\n", "pass around the ipynb file\n", "\n", "To open an existing ipynb file, import it from the dashboard (the first browser page that opens when you start Jupyter notebook) and run the cells or edit as discussed above\n", "\n", "The Jupyter organization has a site for sharing notebooks called [nbviewer](http://nbviewer.jupyter.org/) which provides a static HTML representations of notebooks\n", "\n", "However, each notebook can be downloaded as an ipynb file by clicking on the download icon at the top right of its page" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The REPL\n", "\n", "While we have not emphasized it, on any JupyterHub or locally installed Jupyter installation you will also have access to the Julia REPL\n", "\n", "This is a Julia specific terminal disconnected from the graphical interface of Jupyter, and becomes increasingly important as you learn Julia\n", "\n", "To start the REPL on a typical jupyterlab environment\n", "\n", "1. Choose “New Launcher” \n", "1. Choose a Julia 1.0 Console \n", "\n", "\n", "Otherwise, if you have a local installation, then\n", "\n", "- Navigating to Julia through your menus or desktop icons (Windows, OSX), or \n", "- Opening a terminal and typing julia (Linux) \n", "\n", "\n", "The REPL is one of the best places to add and remove packages, so a good test is to see the current status of the package manager" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[36m\u001b[1mProject \u001b[22m\u001b[39mQuantEconLecturePackages v0.1.0\n", "\u001b[32m\u001b[1m Status\u001b[22m\u001b[39m `~/Research/lecture-source-jl/notebooks/.projects/QuantEconLecturePackages-v0.9.0/Project.toml`\n", " \u001b[90m [aae01518]\u001b[39m\u001b[37m BandedMatrices v0.7.1\u001b[39m\n", " \u001b[90m [6e4b80f9]\u001b[39m\u001b[37m BenchmarkTools v0.4.1\u001b[39m\n", " \u001b[90m [3da002f7]\u001b[39m\u001b[37m ColorTypes v0.7.5\u001b[39m\n", " \u001b[90m [34da2185]\u001b[39m\u001b[37m Compat v1.3.0\u001b[39m\n", " \u001b[90m [a93c6f00]\u001b[39m\u001b[37m DataFrames v0.14.1\u001b[39m\n", " \u001b[90m [1313f7d8]\u001b[39m\u001b[37m DataFramesMeta v0.4.0\u001b[39m\n", " \u001b[90m [31c24e10]\u001b[39m\u001b[37m Distributions v0.16.4\u001b[39m\n", " \u001b[90m [2fe49d83]\u001b[39m\u001b[37m Expectations v1.0.2\u001b[39m\n", " \u001b[90m [1a297f60]\u001b[39m\u001b[37m FillArrays v0.3.0\u001b[39m\n", " \u001b[90m [f6369f11]\u001b[39m\u001b[37m ForwardDiff v0.10.1\u001b[39m\n", " \u001b[90m [28b8d3ca]\u001b[39m\u001b[37m GR v0.35.0\u001b[39m\n", " \u001b[90m [7073ff75]\u001b[39m\u001b[37m IJulia v1.13.0\u001b[39m\n", " \u001b[90m [a98d9a8b]\u001b[39m\u001b[37m Interpolations v0.10.5\u001b[39m\n", " \u001b[90m [5ab0869b]\u001b[39m\u001b[37m KernelDensity v0.5.1\u001b[39m\n", " \u001b[90m [b964fa9f]\u001b[39m\u001b[37m LaTeXStrings v1.0.3\u001b[39m\n", " \u001b[90m [5078a376]\u001b[39m\u001b[37m LazyArrays v0.3.2\u001b[39m\n", " \u001b[90m [76087f3c]\u001b[39m\u001b[37m NLopt v0.5.1\u001b[39m\n", " \u001b[90m [2774e3e8]\u001b[39m\u001b[37m NLsolve v3.0.0\u001b[39m\n", " \u001b[90m [429524aa]\u001b[39m\u001b[37m Optim v0.17.1\u001b[39m\n", " \u001b[90m [d96e819e]\u001b[39m\u001b[37m Parameters v0.10.1\u001b[39m\n", " \u001b[90m [91a5bcdd]\u001b[39m\u001b[37m Plots v0.21.0\u001b[39m\n", " \u001b[90m [f27b6e38]\u001b[39m\u001b[37m Polynomials v0.5.1\u001b[39m\n", " \u001b[90m [1fd47b50]\u001b[39m\u001b[37m QuadGK v2.0.2\u001b[39m\n", " \u001b[90m [fcd29c91]\u001b[39m\u001b[37m QuantEcon v0.15.0\u001b[39m\n", " \u001b[90m [295af30f]\u001b[39m\u001b[37m Revise v0.7.12\u001b[39m\n", " \u001b[90m [f2b01f46]\u001b[39m\u001b[37m Roots v0.7.3\u001b[39m\n", " \u001b[90m [60ddc479]\u001b[39m\u001b[37m StatPlots v0.8.1\u001b[39m\n", " \u001b[90m [90137ffa]\u001b[39m\u001b[37m StaticArrays v0.9.2\u001b[39m\n", " \u001b[90m [37e2e46d]\u001b[39m\u001b[37m LinearAlgebra \u001b[39m\n", " \u001b[90m [9a3f8284]\u001b[39m\u001b[37m Random \u001b[39m\n", " \u001b[90m [2f01184e]\u001b[39m\u001b[37m SparseArrays \u001b[39m\n", " \u001b[90m [10745b16]\u001b[39m\u001b[37m Statistics \u001b[39m\n", " \u001b[90m [8dfed614]\u001b[39m\u001b[37m Test \u001b[39m\n" ] } ], "source": [ "] st" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.0", "language": "julia", "name": "julia-1.0" } }, "nbformat": 4, "nbformat_minor": 2 }