Last active
February 14, 2017 14:06
-
-
Save yohm/ee7e607d63660cf67da31c8bb44f3738 to your computer and use it in GitHub Desktop.
An introductory sample of OACIS Python APIs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# First of all, you need to import OACIS module. Add the OACIS_ROOT path to sys.path to import `oacis` module\n", | |
"import os,sys\n", | |
"sys.path.append( os.environ['OACIS_ROOT'] )\n", | |
"import oacis" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Prerequisites\n", | |
"\n", | |
"Before running the following samples, please prepare a sample simulator as follows.\n", | |
"\n", | |
"- Name: sample_simulator\n", | |
"- Parameter definitions:\n", | |
" - \"p1\", Float, 1.0\n", | |
" - \"p2\", Float, 2.0\n", | |
" - \"p3\", Float, 3.0\n", | |
"- Command:\n", | |
" `ruby -r json -e 'j = JSON.load(File.read(\"_input.json\")); sum=%w(p1 p2 p3).map{|k| j[k]}.inject(:+); puts({sum: sum}.to_json)' > _output.json`\n", | |
"- Input type: JSON\n", | |
"- Executable_on : localhost" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"if oacis.Simulator.where(name=\"sample_simulator\").size() == 0:\n", | |
" sim = {\n", | |
" \"name\": \"sample_simulator\",\n", | |
" \"command\": \"ruby -r json -e 'j = JSON.load(File.read(\\\"_input.json\\\")); sum=%w(p1 p2 p3).map{|k| j[k]}.inject(:+); puts({sum: sum}.to_json)' > _output.json\",\n", | |
" \"support_input_json\": True,\n", | |
" \"parameter_definitions\": [\n", | |
" {\"key\": \"p1\", \"type\": \"Float\", \"default\": 1.0},\n", | |
" {\"key\": \"p2\", \"type\": \"Float\", \"default\": 2.0},\n", | |
" {\"key\": \"p3\", \"type\": \"Float\", \"default\": 3.0}\n", | |
" ],\n", | |
" \"executable_on\": [ oacis.Host.find_by_name(\"localhost\")]\n", | |
" }\n", | |
" oacis.Simulator.create(sim)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'#<ParameterSet _id: 58a305c43192d529a5e4136b, created_at: 2017-02-14 13:27:32 UTC, updated_at: 2017-02-14 13:27:59 UTC, v: {\"p1\"=>10.0, \"p2\"=>20.0, \"p3\"=>30.0}, runs_status_count_cache: {\"finished\"=>5, \"created\"=>0, \"submitted\"=>0, \"running\"=>0, \"failed\"=>0}, progress_rate_cache: -1000000, to_be_destroyed: false, simulator_id: BSON::ObjectId(\\'58a305b53192d529a5e41367\\')>'" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# First, we are going to show how to create ParameterSets and Runs.\n", | |
"sim = oacis.Simulator.find_by_name('sample_simulator')\n", | |
"ps = sim.find_or_create_parameter_set( {\"p1\":10.0,\"p2\":20.0,\"p3\":30.0} )\n", | |
"ps.inspect()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['58a305c93192d529a5e4136c',\n", | |
" '58a305c93192d529a5e4136d',\n", | |
" '58a305c93192d529a5e4136e',\n", | |
" '58a305c93192d529a5e4136f',\n", | |
" '58a305c93192d529a5e41370']" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# When creating runs, you need to specify the host to which the jobs are submitted to.\n", | |
"# We may need to set \"host_parameters\" which specify the parameters required by job schedulers.\n", | |
"\n", | |
"host = oacis.Host.find_by_name(\"localhost\")\n", | |
"new_runs = ps.find_or_create_runs_upto( 5, submitted_to= host )\n", | |
"new_run_ids = [ str( run.id() ) for run in new_runs ]\n", | |
"new_run_ids" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 2.0}\n", | |
"['58a305db3192d529a5e41372']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 4.0}\n", | |
"['58a305db3192d529a5e41378']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 6.0}\n", | |
"['58a305db3192d529a5e4137e']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 8.0}\n", | |
"['58a305db3192d529a5e41384']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 10.0}\n", | |
"['58a305db3192d529a5e4138a']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 12.0}\n", | |
"['58a305dc3192d529a5e41390']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 14.0}\n", | |
"['58a305dc3192d529a5e41396']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 16.0}\n", | |
"['58a305dc3192d529a5e4139c']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 18.0}\n", | |
"['58a305dc3192d529a5e413a2']\n", | |
"{'p1': 1.0, 'p3': 3.0, 'p2': 20.0}\n", | |
"['58a305dc3192d529a5e413a8']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 2.0}\n", | |
"['58a305dd3192d529a5e413ae']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 4.0}\n", | |
"['58a305dd3192d529a5e413b4']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 6.0}\n", | |
"['58a305dd3192d529a5e413ba']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 8.0}\n", | |
"['58a305dd3192d529a5e413c0']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 10.0}\n", | |
"['58a305dd3192d529a5e413c6']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 12.0}\n", | |
"['58a305dd3192d529a5e413cc']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 14.0}\n", | |
"['58a305dd3192d529a5e413d2']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 16.0}\n", | |
"['58a305de3192d529a5e413d8']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 18.0}\n", | |
"['58a305de3192d529a5e413de']\n", | |
"{'p1': 2.0, 'p3': 3.0, 'p2': 20.0}\n", | |
"['58a305de3192d529a5e413e4']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 2.0}\n", | |
"['58a305de3192d529a5e413ea']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 4.0}\n", | |
"['58a305de3192d529a5e413f0']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 6.0}\n", | |
"['58a305de3192d529a5e413f6']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 8.0}\n", | |
"['58a305df3192d529a5e413fc']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 10.0}\n", | |
"['58a305df3192d529a5e41402']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 12.0}\n", | |
"['58a305df3192d529a5e41408']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 14.0}\n", | |
"['58a305df3192d529a5e4140e']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 16.0}\n", | |
"['58a305df3192d529a5e41414']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 18.0}\n", | |
"['58a305e03192d529a5e4141a']\n", | |
"{'p1': 3.0, 'p3': 3.0, 'p2': 20.0}\n", | |
"['58a305e03192d529a5e41420']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 2.0}\n", | |
"['58a305e03192d529a5e41426']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 4.0}\n", | |
"['58a305e03192d529a5e4142c']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 6.0}\n", | |
"['58a305e03192d529a5e41432']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 8.0}\n", | |
"['58a305e13192d529a5e41438']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 10.0}\n", | |
"['58a305e13192d529a5e4143e']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 12.0}\n", | |
"['58a305e13192d529a5e41444']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 14.0}\n", | |
"['58a305e13192d529a5e4144a']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 16.0}\n", | |
"['58a305e13192d529a5e41450']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 18.0}\n", | |
"['58a305e23192d529a5e41456']\n", | |
"{'p1': 4.0, 'p3': 3.0, 'p2': 20.0}\n", | |
"['58a305e23192d529a5e4145c']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 2.0}\n", | |
"['58a305e23192d529a5e41462']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 4.0}\n", | |
"['58a305e23192d529a5e41468']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 6.0}\n", | |
"['58a305e23192d529a5e4146e']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 8.0}\n", | |
"['58a305e23192d529a5e41474']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 10.0}\n", | |
"['58a305e23192d529a5e4147a']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 12.0}\n", | |
"['58a305e23192d529a5e41480']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 14.0}\n", | |
"['58a305e33192d529a5e41486']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 16.0}\n", | |
"['58a305e33192d529a5e4148c']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 18.0}\n", | |
"['58a305e33192d529a5e41492']\n", | |
"{'p1': 5.0, 'p3': 3.0, 'p2': 20.0}\n", | |
"['58a305e33192d529a5e41498']\n" | |
] | |
} | |
], | |
"source": [ | |
"# A sample to make multiple parameter sets\n", | |
"import numpy as np\n", | |
"sim = oacis.Simulator.where( name = 'sample_simulator' ).first()\n", | |
"p1_values = np.linspace(1.0,5.0, 5)\n", | |
"p2_values = np.linspace(2.0, 20.0, 10)\n", | |
"base_param = sim.default_parameters()\n", | |
"base_param\n", | |
"\n", | |
"for p1 in p1_values:\n", | |
" for p2 in p2_values:\n", | |
" param = base_param.copy()\n", | |
" param.update( {'p1':p1, 'p2':p2} )\n", | |
" print( param )\n", | |
" ps = sim.find_or_create_parameter_set( param )\n", | |
" runs = ps.find_or_create_runs_upto(1, submitted_to=host)\n", | |
" print( [ run.id().to_s() for run in runs] )" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Getting Results\n", | |
"\n", | |
"We are going to investigate the dependency of \"p1\" and \"p2\" against the results.\n", | |
"**Run the below cells after the above jobs are finished.**" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"sample_simulator\n", | |
"ruby -r json -e 'j = JSON.load(File.read(\"_input.json\")); sum=%w(p1 p2 p3).map{|k| j[k]}.inject(:+); puts({sum: sum}.to_json)' > _output.json\n", | |
"['localhost']\n", | |
"255\n", | |
"255\n" | |
] | |
} | |
], | |
"source": [ | |
"sim = oacis.Simulator.find_by_name('sample_simulator')\n", | |
"print( sim.name() )\n", | |
"print( sim.command() )\n", | |
"print( [h.name() for h in sim.executable_on()] )\n", | |
"\n", | |
"print( len( sim.runs() ) )\n", | |
"print( len(sim.runs().where({'status':'finished'})) )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"58a305db3192d529a5e41371 {'p1': 1.0, 'p2': 2.0, 'p3': 3.0} 5 5\n", | |
"{'created': 0, 'finished': 5, 'running': 0, 'submitted': 0, 'failed': 0}\n", | |
"[6.0, 5]\n" | |
] | |
} | |
], | |
"source": [ | |
"# ParameterSet of {p1: 1.0, p2: 2.0, p3: 3.0}\n", | |
"ps = sim.find_parameter_set( {'p1':1.0, 'p2':2.0, 'p3':3.0} )\n", | |
"\n", | |
"# Here are some examples of fields of ParameterSet\n", | |
"print( ps.id(), ps.v(), ps.runs().count(), ps.runs().where({'status':'finished'}).count() )\n", | |
"print( ps.runs_status_count() )\n", | |
"print( ps.average_result(\"sum\") )\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"58a305db3192d529a5e41372\n", | |
"finished\n", | |
"{'sum': 6.0}\n", | |
"0.07\n", | |
"2017-02-14T13:28:01+00:00\n", | |
"/Users/murase/work/oacis/public/Result_development/58a305b53192d529a5e41367/58a305db3192d529a5e41371/58a305db3192d529a5e41372\n" | |
] | |
} | |
], | |
"source": [ | |
"# Getting a Run\n", | |
"run = ps.runs().first()\n", | |
"\n", | |
"# Here are some examples of fields of Run\n", | |
"for field in [ run.id(), run.status(), run.result(), run.cpu_time(), run.finished_at(), run.dir() ]:\n", | |
" print( field )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"p2 == 10.0 and p3 == 3.0\n", | |
"{'p1': 1.0, 'p2': 10.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 10.0, 'p3': 3.0}\n", | |
"{'p1': 3.0, 'p2': 10.0, 'p3': 3.0}\n", | |
"{'p1': 4.0, 'p2': 10.0, 'p3': 3.0}\n", | |
"{'p1': 5.0, 'p2': 10.0, 'p3': 3.0}\n", | |
"p1 <= 2 and p2 > 15.0 and p3 == 3.0\n", | |
"{'p1': 2.0, 'p2': 20.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 18.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 16.0, 'p3': 3.0}\n", | |
"{'p1': 1.0, 'p2': 20.0, 'p3': 3.0}\n", | |
"{'p1': 1.0, 'p2': 18.0, 'p3': 3.0}\n", | |
"{'p1': 1.0, 'p2': 16.0, 'p3': 3.0}\n", | |
"p1 is in [2,4] and p2==20\n", | |
"{'p1': 4.0, 'p2': 20.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 20.0, 'p3': 3.0}\n", | |
"p1 <= 3 and p2 <= 6.0, ordered by p1 in ascending order and p2 in descending order\n", | |
"{'p1': 1.0, 'p2': 6.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 6.0, 'p3': 3.0}\n", | |
"{'p1': 3.0, 'p2': 6.0, 'p3': 3.0}\n", | |
"{'p1': 1.0, 'p2': 4.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 4.0, 'p3': 3.0}\n", | |
"{'p1': 3.0, 'p2': 4.0, 'p3': 3.0}\n", | |
"{'p1': 1.0, 'p2': 2.0, 'p3': 3.0}\n", | |
"{'p1': 2.0, 'p2': 2.0, 'p3': 3.0}\n", | |
"{'p1': 3.0, 'p2': 2.0, 'p3': 3.0}\n" | |
] | |
} | |
], | |
"source": [ | |
"# Search ParameterSets by condition\n", | |
"sim = oacis.Simulator.where(name=\"sample_simulator\").first()\n", | |
"\n", | |
"# The followings are some example queries which you might find useful.\n", | |
"# Since a ParameterSet contains the parameters in the field of `v`, you need to issue an query against `v`.\n", | |
"# See http://www.rubydoc.info/github/mongoid/origin/Origin/Selectable\n", | |
"print(\"p2 == 10.0 and p3 == 3.0\")\n", | |
"found = sim.parameter_sets().where({\"v.p2\":10.0, \"v.p3\":3.0}).asc(\"v.p1\")\n", | |
"for ps in found:\n", | |
" print( ps.v() )\n", | |
"\n", | |
"print(\"p1 <= 2 and p2 > 15.0 and p3 == 3.0\")\n", | |
"found = sim.parameter_sets().lte( {\"v.p1\":2} ).gt( {\"v.p2\":15.0} ).where( {\"v.p3\":3.0} )\n", | |
"for ps in found:\n", | |
" print( ps.v() )\n", | |
"\n", | |
"print(\"p1 is in [2,4] and p2==20\")\n", | |
"found = sim.parameter_sets().send('in', {\"v.p1\":[2,4]} ).where( {\"v.p2\":20} )\n", | |
"for ps in found:\n", | |
" print( ps.v() )\n", | |
"\n", | |
"print(\"p1 <= 3 and p2 <= 6.0, ordered by p1 in ascending order and p2 in descending order\")\n", | |
"found = sim.parameter_sets().lte( {\"v.p1\":3, \"v.p2\": 6.0} ).order_by( {\"v.p1\":'asc', \"v.p2\":'desc'} )\n", | |
"for ps in found:\n", | |
" print( ps.v() )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/murase/.pyenv/versions/miniconda3-4.1.11/envs/ml/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", | |
" warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n", | |
"/Users/murase/.pyenv/versions/miniconda3-4.1.11/envs/ml/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", | |
" warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x104ddf2e8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# plot results using matplotlib\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"sim = oacis.Simulator.where(name='sample_simulator').first()\n", | |
"parameter_sets = sim.parameter_sets().where( {\"v.p1\":1.0, \"v.p3\":3.0} ).asc(\"v.p2\")\n", | |
"x = []\n", | |
"y = []\n", | |
"for ps in parameter_sets:\n", | |
" x.append( ps.v()[\"p2\"] )\n", | |
" y.append( ps.average_result(\"sum\")[0] )\n", | |
"plt.plot(x,y, 'ro')\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Deleting Items\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"5\n", | |
"4\n", | |
"True\n", | |
"False\n" | |
] | |
} | |
], | |
"source": [ | |
"# call discard method to delete an item\n", | |
"\n", | |
"sim = oacis.Simulator.where(name=\"sample_simulator\").first()\n", | |
"ps = sim.find_parameter_set( {\"p1\":1.0, \"p2\": 2.0, \"p3\": 3.0} )\n", | |
"print( len( ps.runs() ) )\n", | |
"run = ps.runs()[0] # Get the first run\n", | |
"run.discard() # Delete it\n", | |
"print( len(ps.runs()) ) # => 4. The number of runs is decreased by 1.\n", | |
"\n", | |
"\n", | |
"# deleting all ParameterSet whose p2 is larger than 10.0\n", | |
"print( sim.parameter_sets().gt( {\"v.p2\": 10.0} ).count() > 0 ) # => true\n", | |
"for ps in sim.parameter_sets().gt( {\"v.p2\": 10.0} ):\n", | |
" ps.discard()\n", | |
"print( sim.parameter_sets().gt( {\"v.p2\": 10.0} ).count() > 0 ) # => false\n", | |
"# Visit the page of OACIS and verify that ParameterSets have been deleted." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"anaconda-cloud": {}, | |
"kernelspec": { | |
"display_name": "Python [conda env:ml]", | |
"language": "python", | |
"name": "conda-env-ml-py" | |
}, | |
"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.5.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment