{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Overview of the Package Ecosystem\n",
    "\n",
    "Julia's package ecosystem is organized in terms of Github organizations. While this is informal, many of the main packages (but not all!) can be found in the various organizations.\n",
    "\n",
    "http://julialang.org/community/\n",
    "\n",
    "A useful source on the the changing package ecosystem (might be) found here:\n",
    "\n",
    "http://www.pkgupdate.com/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## A Quick Look At Some Organizations\n",
    "\n",
    "Let's take a quick look at some organizations which provide important functionality to Julia. I will go through some of the most well-developed and \"ready for use orgs\". Of course, there are more that I will be leaving off the list.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### JuliaLang\n",
    "\n",
    "- JuliaLang is the Base organization\n",
    "- It holds the Julia language itself\n",
    "- Other core pacakges exist in JuliaLang\n",
    "  - PkgDev for package development\n",
    "  - IJulia\n",
    "  - Compat for version compatibility\n",
    "- There is a general trend of \"slimming Base\" to lower the Travis load on JuliaLang"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### JuliaStats\n",
    "\n",
    "- Hosts Dataframes.jl, the data frame implementation of Julia\n",
    "- Distributions.jl holds probability distributions and methods for generating random numbers according to specific distributions\n",
    "- The standard regression and hypothesis testing libraries are held here\n",
    "- Klara.jl is a native MCMC engine\n",
    "- One of the main R linear model library developers, Douglas Bates, is a heavy contributor\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. (http://julialang.org)\n",
    "\n",
    "Note, Dataframes used to be slow. A very large change is coming in the next week. To understand it in detail, read: http://www.johnmyleswhite.com/notebook/2015/11/28/why-julias-dataframes-are-still-slow/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaOpt\n",
    "\n",
    "- Julia for Mathematical Programming (JuMP) is one of the premire Julia libraries. It implements a DSL for interfacing with many commercial and non-commercial mathematical optimization (linear, mixed-integer, conic, semidefinite, nonlinear) algorithms. Most of JuliaOpt can be used through JuMP\n",
    "- Optim.jl are a set of native Julia optimization algorithms\n",
    "- An interesting fact is that the creator of NLopt is a heavy contributor to Julia and JuliaOpt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaParallel\n",
    "\n",
    "Bindings to many popular parallel libraries / APIs are found in JuliaParallel:\n",
    "\n",
    "- DistributedArrays.jl: A distributed array implmentation\n",
    "- PETSc.jl\n",
    "- MPI.jl\n",
    "- ScaLAPACK.jl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaGPU\n",
    "\n",
    "Bindings for common GPU libraries:\n",
    "\n",
    "- ArrayFire.jl\n",
    "- CUDArt.jl\n",
    "- CUSPARSE.jl\n",
    "- CUDNN.jl\n",
    "- CUFFT.jl\n",
    "- CUBLAS.jl\n",
    "\n",
    "JuliaGPU is also developing a framework for easy GPU usage:\n",
    "\n",
    "- CUDAnative.jl\n",
    "- GPUArrays.jl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaDiff\n",
    "\n",
    "JuliaDiff holds libraries for differentiation in Julia\n",
    "\n",
    "- ForwardDiff.jl: A robust implementation of forward-mode autodifferentiation\n",
    "- ReverseDiffSource.jl: A newer library for reverse-mode autodifferentiation (backwards propogation)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaGraphs\n",
    "\n",
    "JuliaGraphs is built around LightGraphs.jl, a fast and performant implementation of graph algorithms in Julia"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaMath\n",
    "\n",
    "JuliaMath holds basic mathematical libraries.\n",
    "\n",
    "- IterativeSolvers.jl: Iterative methods for `Ax=b`, Krylov subspace methods, etc.\n",
    "- Roots.jl: Root-finding algorithms"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaDiffEq\n",
    "\n",
    "JuliaDiffEq holds the packages for solving differential equations.\n",
    "\n",
    "- DifferentialEquations.jl: The core package for solving ODEs, SDEs, PDEs, DAEs, (hopefully DDEs soon...). Also wraps ODE.jl, Sundials.jl, and ODEInterface.jl into one convenient API.\n",
    "- Sundials.jl: Wrappers for the Sundials ODE/DAE solvers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaPlots\n",
    "\n",
    "JuliaPlots is the organization for plotting and visualization.\n",
    "\n",
    "- Plots.jl is a metapackage for plotting. It is the main plotting library in Julia.\n",
    "- GGPlots.jl is a Grammar of Graphics (GoG) API for Plots.jl\n",
    "- StatPlots.jl provides plotting recipes for statistics in Plots.jl\n",
    "- PlotRecipes.jl is a random assortment of plotting recipes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaInterop\n",
    "\n",
    "Interoperability of Julia with other languages.\n",
    "\n",
    "- MATLAB.jl\n",
    "- RCall.jl\n",
    "- Mathematica.jl\n",
    "- JavaCall.jl\n",
    "- CxxWrap.jl\n",
    "- ObjectiveC.jl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## JuliaPy\n",
    "\n",
    "Julia interop with Python\n",
    "\n",
    "- PyPlot.jl: A wrapper for the Python matplotlib library\n",
    "- SymPy.jl\n",
    "- PyCall.jl\n",
    "- pyjulia\n",
    "- Pandas.jl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Misc\n",
    "\n",
    "- JLD.jl: An HDF5-based saving format for Julia\n",
    "- Bio.jl: A huge library for bioinformatics in Julia"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Julia 0.5.2",
   "language": "julia",
   "name": "julia-0.5"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "0.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
