{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Introduction to\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Types of computer languages\n", "\n", "* **Compiled languages**: C/C++, Fortran, ... \n", " - Directly compiled to machine code that is executed by CPU \n", " - Pros: fast, memory efficient\n", " - Cons: longer development time, hard to debug\n", "\n", "* **Interpreted language**: R, Matlab, Python, SAS IML, JavaScript, ... \n", " - Interpreted by interpreter\n", " - Pros: fast prototyping\n", " - Cons: excruciatingly slow for loops\n", "\n", "* Mixed (dynamic) languages: Matlab (JIT), R (`compiler` package), Julia, Cython, JAVA, ...\n", " - Pros and cons: between the compiled and interpreted languages\n", "\n", "* Script languages: Linux shell scripts, Perl, ...\n", " - Extremely useful for some data preprocessing and manipulation\n", "\n", "* Database languages: SQL, Hadoop. \n", " - Data analysis *never* happens if we do not know how to retrieve data from databases " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Messages\n", "\n", "* To be versatile in the big data era, master at least one language in each category.\n", "\n", "* To improve efficiency of interpreted languages such as R or Matlab, conventional wisdom is to avoid loops as much as possible. Aka, **vectorize code**\n", "> The only loop you are allowed to have is that for an iterative algorithm.\n", "\n", "* When looping is necessary, need to code in C, C++, or Fortran. \n", "Success stories: the popular `glmnet` package in R is coded in Fortran.\n", "\n", "* Modern languages such as Julia tries to solve the **two language problem**. That is to achieve efficiency without vectorizing code." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## What's Julia?\n", "\n", "> Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical computing environments\n", "\n", "* Started in 2009. First public release in 2012. \n", " - Creators: Jeff Bezanson, Alan Edelman, Stefan Karpinski, Viral Shah\n", " - Current release v0.6.2\n", " - v1.0 is staged to release in 2018\n", "\n", "* Aim to solve the notorious **two language problem**:\n", " - Prototype code goes into high-level languages like R/Python, production code goes into low-level language like C/C++\n", "> Walks like Python. Runs like C.\n", "\n", "\n", "\n", "* Write high-level, abstract code that closely resembles mathematical formulas\n", " - yet produces fast, low-level machine code that has traditionally only been generated by static languages.\n", "\n", "* Julia is more than just \"Fast R\" or \"Fast Matlab\"\n", " - Performance comes from features that work well together. \n", " - You can't just take the magic dust that makes Julia fast and sprinkle it on [language of choice]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## R is great, but...\n", "\n", "* It's not meant for high performance computing\n", " - http://adv-r.had.co.nz/Performance.html\n", " - Section on performance starts with \"Why is R slow?\" \n", "\n", "* Deficiencies in the core language \n", " - Many fixed with packages (`devtools`, `roxygen2`, `Matrix`)\n", " - Others harder to fix (R uses an old version of BLAS)\n", " - Some impossible to fix (clunky syntax, poor design choices)\n", "\n", "* Only 6 active developers left (out of 20 R-Core members)\n", " - JuliaLang organization has 74 members, with 567 total contributors (as of 3/3/17)\n", " - https://github.com/JuliaLang/julia/graphs/contributors\n", "\n", "* Doug Bates (member of R-Core, `Matrix` and `lme4`)\n", " - Getting Doug on board was a big win for statistics with Julia, as he brought a lot of knowledge about the history of R development and design choices\n", " - https://github.com/dmbates/MixedModels.jl\n", " \n", " > As some of you may know, I have had a (rather late) mid-life crisis and run off with another language called Julia. \n", " >\n", " > -- Doug Bates (on the `knitr` Google Group)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Language features of R, Matlab and Julia\n", "\n", "| Features | R | Matlab | Julia |\n", "|:---------------------:|:------------------------:|:--------------:|:-------------------:|\n", "| Open source | 👍 | 👎 | 👍 |\n", "| IDE | RStudio 👍 👍 👍 | 👍 👍 👍 | Atom+Juno 👎 |\n", "| Dynamic document | RMarkdown 👍 👍 👍 | 👍 👍 | Jupyter 👍 👍 |\n", "| Multi-threading | `parallel` 👎 | 👍 | 👍 👍 [see docs](http://docs.julialang.org/en/stable/manual/parallel-computing/) |\n", "| JIT | `compiler` 👎 | 👍 👍 | 👍 👍 👍 |\n", "| Call C/Fortran | wrapper, `Rcpp` | wrapper | [no glue code needed](http://docs.julialang.org/en/stable/manual/calling-c-and-fortran-code/) |\n", "| Call shared library | wrapper | wrapper | [no glue code needed](http://docs.julialang.org/en/stable/manual/calling-c-and-fortran-code/) |\n", "| Type system | 👎 | 👍 👍 | 👍 👍 👍 |\n", "| Pass by reference | 👎 | 👎 | 👍 👍 👍 |\n", "| Linear algebra | 👎 | MKL, Arpack | OpenBLAS, eigpack, or MKL |\n", "| Distributed computing | 👎 | 👍 | 👍 👍 👍 |\n", "| Sparse linear algebra | `Matrix` package 👎 | 👍 👍 👍 | 👍 👍 👍 |\n", "| Documentation | 👍 | 👍 👍 👍 | 👍 |\n", "| Profiler | 👍 👍 | 👍 👍 👍 | 👍 |" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Benchmark\n", "\n", "* Benchmark code `R-benchmark-25.R` from [http://r.research.att.com/benchmarks/R-benchmark-25.R](http://r.research.att.com/benchmarks/R-benchmark-25.R) covers many commonly used numerical operations used in statistics. \n", "\n", "* We ported to [Matlab](./benchmark_matlab.m) and [Julia](./benchmark_julia.jl) and report the run times (averaged over 5 runs) here.\n", "\n", "| Test | R 3.4.3 | Matlab R2017a | Julia 0.6.2 |\n", "|:-------------------------------------------------- |:-------:|:-------------:|:-----------:|\n", "| Matrix creation, trans., deform. (2500 x 2500) | 0.65 | **0.13** | 0.21 |\n", "| Power of matrix (2400 x 2400, `A.^1000`) | 0.18 | **0.10** | 0.18 |\n", "| Quick sort ($n = 7 \\times 10^6$) | 0.75 | **0.30** | 0.65 |\n", "| Cross product (2800 x 2800, $A^TA$) | 15.02 | **0.18** | 0.23 |\n", "| LS solution ($n = p = 2000$) | 7.00 | 0.07 | **0.06** |\n", "| FFT ($n = 2,400,000$) | 0.32 | **0.03** | 0.04 |\n", "| Eigen-values ($600 \\times 600$) | 0.75 | **0.22** | 0.26 |\n", "| Determinant ($2500 \\times 2500$) | 3.77 | 0.19 | **0.14** |\n", "| Cholesky ($3000 \\times 3000$) | 5.54 | **0.08** | 0.17 |\n", "| Matrix inverse ($1600 \\times 1600$) | 4.13 | **0.11** | 0.14 |\n", "| Fibonacci (vector calculation) | 0.23 | **0.16** | 0.27 |\n", "| Hilbert (matrix calculation) | 0.27 | 0.07 | **0.06** |\n", "| GCD (recursion) | 0.42 | **0.09** | 0.16 |\n", "| Toeplitz matrix (loops) | 0.32 | 0.0012 | **0.0007** |\n", "| Escoufiers (mixed) | 0.30 | 0.15 | **0.14** |\n", "\n", "Machine specs: Intel i7 @ 2.9GHz (4 physical cores, 8 threads), 16G RAM, Mac OS 10.13.3." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Gibbs sampler example by Doug Bates\n", "\n", "* An example from Dr. Doug Bates's slides [Julia for R Programmers](http://www.stat.wisc.edu/~bates/JuliaForRProgrammers.pdf).\n", "\n", "* The task is to create a Gibbs sampler for the density \n", "$$\n", "f(x, y) = k x^2 exp(- x y^2 - y^2 + 2y - 4x), x > 0\n", "$$\n", "using the conditional distributions\n", "$$\n", "\\begin{eqnarray*}\n", " X | Y &\\sim& \\Gamma \\left( 3, \\frac{1}{y^2 + 4} \\right) \\\\\n", " Y | X &\\sim& N \\left(\\frac{1}{1+x}, \\frac{1}{2(1+x)} \\right).\n", "\\end{eqnarray*}\n", "$$\n", "\n", "* This is a Julia function for the simple Gibbs sampler:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "jgibbs (generic function with 1 method)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Distributions\n", "\n", "function jgibbs(N, thin)\n", " mat = zeros(N, 2)\n", " x = y = 0.0\n", " for i in 1:N\n", " for j in 1:thin\n", " x = rand(Gamma(3.0, 1.0 / (y * y + 4.0)))\n", " y = rand(Normal(1.0 / (x + 1.0), 1.0 / sqrt(2.0(x + 1.0))))\n", " end\n", " mat[i, 1] = x\n", " mat[i, 2] = y\n", " end\n", " mat\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generate a bivariate sample of size 10,000 with a thinning of 500. How long does it take?" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.381052949" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jgibbs(100, 5); # warm-up\n", "@elapsed jgibbs(10000, 500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* R solution. The `RCall.jl` package allows us to execute R code without leaving the `Julia` environment. We first define an R function `Rgibbs()`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RCall.RObject{RCall.ClosSxp}\n", "function (N, thin) \n", "{\n", " mat <- matrix(0, nrow = N, ncol = 2)\n", " x <- y <- 0\n", " for (i in 1:N) {\n", " for (j in 1:thin) {\n", " x <- rgamma(1, 3, y * y + 4)\n", " y <- rnorm(1, 1/(x + 1), 1/sqrt(2 * (x + 1)))\n", " }\n", " mat[i, ] <- c(x, y)\n", " }\n", " mat\n", "}\n" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using RCall\n", "\n", "R\"\"\"\n", "library(Matrix)\n", "Rgibbs <- function(N, thin) {\n", " mat <- matrix(0, nrow=N, ncol=2)\n", " x <- y <- 0\n", " for (i in 1:N) {\n", " for (j in 1:thin) {\n", " x <- rgamma(1, 3, y * y + 4) # 3rd arg is rate\n", " y <- rnorm(1, 1 / (x + 1), 1 / sqrt(2 * (x + 1)))\n", " }\n", " mat[i,] <- c(x, y)\n", " }\n", " mat\n", "}\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and then generate the same number of samples" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "18.415733088" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# benchmark\n", "@elapsed R\"\"\"\n", "system.time(Rgibbs(10000, 500))\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see 40-80 fold speed up of `Julia` over `R` on this example, **without extra coding effort**!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Learning resources\n", "\n", "0. [Intro to Julia](https://www.youtube.com/watch?v=4igzy3bGVkQ) (1h40m), by Jane Herriman (Dec 19, 2017), and next (monthly) tutorial \n", "[Intro to Julia](https://www.youtube.com/watch?v=JserqX6hbYw), by Jane Herriman on April 6, 2018 at 10AM PDT. \n", "0. Cheat sheet: [The Fast Track to Julia](https://juliadocs.github.io/Julia-Cheat-Sheet/). \n", "0. Browse the `Julia` [documentation](http://docs.julialang.org/en/stable/). \n", "0. For Matlab users, read [Noteworthy Differences From Matlab](http://docs.julialang.org/en/stable/manual/noteworthy-differences/?highlight=matlab#noteworthy-differences-from-matlab). \n", "For R users, read [Noteworthy Differences From R](http://docs.julialang.org/en/stable/manual/noteworthy-differences/?highlight=matlab#noteworthy-differences-from-r). \n", "For Python users, read [Noteworthy Differences From Python](http://docs.julialang.org/en/stable/manual/noteworthy-differences/?highlight=matlab#noteworthy-differences-from-python). \n", "0. The [Learning page](http://julialang.org/learning/) on Julia's website has pointers to many other learning resources. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Julia REPL (Read-Evaluation-Print-Loop)\n", "\n", "The `Julia` REPL, or `Julia` shell, has four main modes.\n", "\n", "0. Default mode is the Julian prompt `julia>`. Type backspace in other modes to enter default mode. \n", "\n", "0. Help mode `help?>`. Type `?` to enter help mode. `?search_term` does a fuzzy search for `search_term`. \n", "\n", "0. Shell mode `shell>`. Type `;` to enter shell mode. \n", "\n", "0. Search mode `(reverse-i-search)`. Press `ctrl+R` to enter search model. \n", "\n", "0. With **`RCall.jl`** package installed, we can enter the R mode by typing `$` (shift+4) at Julia REPL.\n", "\n", "Some survival commands in Julia REPL: \n", "0. `quit()` or `Ctrl+D`: exit Julia.\n", "\n", "0. `Ctrl+C`: interrupt execution.\n", "\n", "0. `Ctrl+L`: clear screen.\n", "\n", "0. `whos()`: list all variables in current workspace.\n", "\n", "0. `workspace()`: clear all variables and reset session.\n", "\n", "0. Append `;` (semi-colon) to suppress displaying output from a command.\n", "\n", "0. `include(\"filename.jl\")` to source a Julia code file." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Seek help\n", "\n", "* Online help from REPL: `?function_name`.\n", "\n", "* Google (of course).\n", "\n", "* Julia documentation:Plotly javascript loaded.
\n", "To load again call
init_notebook(true)\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "data": [ { "fields": { "colorbar": { "title": "" }, "line": { "color": "rgba(0, 154, 250, 1.000)", "dash": "solid", "shape": "linear", "width": 1 }, "mode": "lines", "name": "y1", "showlegend": true, "type": "scatter", "x": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 ], "xaxis": "x1", "y": [ 1.3921307108173968, 1.0652558608388614, -0.9886899126432904, -0.8385949812484722, -0.6634303756762613, 0.11831769167296868, -0.9115487556183135, -0.009175254637361574, 0.9098876723856789, 0.4735105275746837, -0.6521504592157917, -1.6283232364105624, -2.6257081989458566, -1.59507450435543, -3.0191737271622383, -3.638298207259495, -3.4029910528353473, -4.017332278589937, -5.6587712681857285, -6.151082333071111, -5.6605169581444335, -5.187017459601302, -4.348006145962882, -3.435152183672455, -3.1914224866167316, -3.6225490081771556, -4.261208989008605, -3.4498989472371724, -4.154113197558089, -4.298781482272807, -5.155488720758118, -3.6839767178621794, -3.6486229536032946, -4.7788867701135995, -5.628158372623902, -6.0146514875355175, -7.295774888009117, -6.052945533969334, -5.569641207344041, -5.29740103612891, -5.293072227176147, -4.902599318907711, -3.8006666438987273, -4.718498401463764, -5.854673719085409, -6.425977944165969, -7.51101223229312, -6.864403070002812, -7.142994267446119, -7.4682297183430935 ], "yaxis": "y1" } }, { "fields": { "colorbar": { "title": "" }, "line": { "color": "rgba(227, 111, 71, 1.000)", "dash": "solid", "shape": "linear", "width": 1 }, "mode": "lines", "name": "y2", "showlegend": true, "type": "scatter", "x": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 ], "xaxis": "x1", "y": [ 1.3451241767424507, 2.1441869713661292, 3.2242073080228844, 1.8590306799944039, 0.8962719367895697, 0.6933016703447114, 1.609825038238971, 0.7694638589385342, -0.2602199168342555, -0.16973629861981465, 1.1386746821959415, 3.689805935808535, 3.612080549804806, 3.631923913683005, 4.31379744580791, 5.279634495969921, 4.77897464329353, 4.0583968659256415, 5.229993277509245, 4.345918562889203, 4.594131760128548, 3.0078549831828667, 2.946260064316165, 2.4240135817008577, 1.202741020285026, 0.5132427644511994, 1.624278262304437, -0.6508822475692215, -0.7413574657319525, -1.11957083434201, -1.852952385783913, -3.2409829013555305, -2.4717486426745507, -2.5844904091175582, -2.9892640963798045, -3.0484552747005362, -4.334450164245254, -4.489079623776927, -2.6132272882710073, -2.1049608690154313, -1.9676602397795107, -2.7664338114291875, -5.324464775457212, -5.969446149290054, -5.700766324487425, -6.930309554369748, -7.412201712486577, -6.8391178036633695, -6.551932979180394, -5.327156144758428 ], "yaxis": "y1" } } ], "layout": { "fields": { "annotations": [ { "font": { "color": "rgba(0, 0, 0, 1.000)", "family": "sans-serif", "size": 20 }, "rotation": 0, "showarrow": false, "text": "Random walk", "x": 0.5148148148148148, "xanchor": "center", "xref": "paper", "y": 1, "yanchor": "top", "yref": "paper" } ], "height": 400, "legend": { "bgcolor": "rgba(255, 255, 255, 1.000)", "bordercolor": "rgba(0, 0, 0, 1.000)", "font": { "color": "rgba(0, 0, 0, 1.000)", "family": "sans-serif", "size": 11 }, "x": 1, "y": 1 }, "margin": { "b": 20, "l": 0, "r": 0, "t": 20 }, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "showlegend": true, "width": 600, "xaxis1": { "anchor": "y1", "domain": [ 0.03619130941965587, 0.9934383202099738 ], "gridcolor": "rgba(0, 0, 0, 0.100)", "gridwidth": 0.5, "linecolor": "rgba(0, 0, 0, 1.000)", "mirror": false, "range": [ 1, 50 ], "showgrid": true, "showline": true, "showticklabels": true, "tickangle": 0, "tickcolor": "rgb(0, 0, 0)", "tickfont": { "color": "rgba(0, 0, 0, 1.000)", "family": "sans-serif", "size": 11 }, "tickmode": "array", "ticks": "inside", "ticktext": [ "10", "20", "30", "40", "50" ], "tickvals": [ 10, 20, 30, 40, 50 ], "title": "time", "titlefont": { "color": "rgba(0, 0, 0, 1.000)", "family": "sans-serif", "size": 15 }, "type": "-", "visible": true, "zeroline": false, "zerolinecolor": "rgba(0, 0, 0, 1.000)" }, "yaxis1": { "anchor": "x1", "domain": [ 0.07581474190726165, 0.9415463692038496 ], "gridcolor": "rgba(0, 0, 0, 0.100)", "gridwidth": 0.5, "linecolor": "rgba(0, 0, 0, 1.000)", "mirror": false, "range": [ -7.51101223229312, 5.279634495969921 ], "showgrid": true, "showline": true, "showticklabels": true, "tickangle": 0, "tickcolor": "rgb(0, 0, 0)", "tickfont": { "color": "rgba(0, 0, 0, 1.000)", "family": "sans-serif", "size": 11 }, "tickmode": "array", "ticks": "inside", "ticktext": [ "-6", "-4", "-2", "0", "2", "4" ], "tickvals": [ -6, -4, -2, 0, 2, 4 ], "title": "", "titlefont": { "color": "rgba(0, 0, 0, 1.000)", "family": "sans-serif", "size": 15 }, "type": "-", "visible": true, "zeroline": false, "zerolinecolor": "rgba(0, 0, 0, 1.000)" } } } }, "text/html": [ "\n", "\n", "\n" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Pkg.add(\"PlotlyJS\")\n", "plotlyjs() # change backend to Plotly\n", "plot(x, title=\"Random walk\", xlab=\"time\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gr() # change backend to GR\n", "plot(x, title=\"Random walk\", xlab=\"time\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[1m\u001b[36mINFO: \u001b[39m\u001b[22m\u001b[36mSaved animation to /Users/huazhou/Documents/github.com/Hua-Zhou.github.io/teaching/biostatm280-2018spring/slides/02-juliaintro/tmp.gif\n", "\u001b[39m" ] }, { "data": { "text/html": [ "\" />" ], "text/plain": [ "Plots.AnimatedGif(\"/Users/huazhou/Documents/github.com/Hua-Zhou.github.io/teaching/biostatm280-2018spring/slides/02-juliaintro/tmp.gif\")" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gr()\n", "@gif for i in 1:20\n", " plot(x -> sin(x) / (.2i), 0, i, xlim=(0, 20), ylim=(-.75, .75))\n", " scatter!(x -> cos(x) * .01 * i, 0, i, m=1)\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Julia Version 0.6.2\n", "Commit d386e40c17 (2017-12-13 18:08 UTC)\n", "Platform Info:\n", " OS: macOS (x86_64-apple-darwin14.5.0)\n", " CPU: Intel(R) Core(TM) i7-6920HQ CPU @ 2.90GHz\n", " WORD_SIZE: 64\n", " BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)\n", " LAPACK: libopenblas64_\n", " LIBM: libopenlibm\n", " LLVM: libLLVM-3.9.1 (ORCJIT, skylake)\n" ] } ], "source": [ "versioninfo()" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 0.6.2", "language": "julia", "name": "julia-0.6" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "0.6.2" }, "livereveal": { "scroll": true, "start_slideshow_at": "selected" }, "toc": { "colors": { "hover_highlight": "#DAA520", "running_highlight": "#FF0000", "selected_highlight": "#FFD700" }, "moveMenuLeft": true, "nav_menu": { "height": "512px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": false, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }