2024-heraklion-scientific-p.../notebooks/walker/Step_1_classes/solution/Step_1_classes.ipynb

201 lines
118 KiB
Plaintext
Raw Normal View History

2024-08-27 14:52:41 +02:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"# 2. Rewrite the code to look like it would in your wildest dreams!\n",
"\n",
"How could you restructure the interface of the `walker` library so that the functionality stays the same, but the code is less smelly?\n",
"\n",
"1. could this code work better/more efficiently as a class?\n",
" - e.g. `walker = Walker(...)`\n",
"2. how should the setup/initialization work?\n",
" - e.g. which parameters would you pass to instantiate the Walker class? How do you pass them to the class?\n",
"3. which functions should be part of the class? \n",
" - e.g. is `sample_next_step` a method of `Walker`? Is `create_context_map` a method of Walker? How about `plot_trajectory`? If so, call them with `walker.sample_next_step()`\n",
"4. what would the import statement look like?\n",
"\n",
"**Important:** We are *not* asking you to implement the changes in `walker.py`! Imagine the new interface, and write the code that would use it in the next cell. Of course it won't run (yet)\n",
"\n",
"Here are some things to keep in mind:\n",
"- Which things will you do a lot? They should be easy to do. The interface for doing those things should be simple.\n",
"- Which things should be modifiable from external code?\n",
"- As a rule of thumb, think about how it sounds when you read it aloud\n",
" - “Giving orders”-style\n",
" - “Telling a story“-style\n",
"\n",
" \n",
"For inspiration think about how you call code from other libraries. Here is an example of instantiating an object and calling one of its methods:\n",
"````python\n",
"import scipy as sp\n",
"\n",
"# Sampling from a gaussian with specific mean and sd:\n",
"# Create a Gaussian (normal) distribution object\n",
"gaussian_dist = sp.stats.norm(loc=mean, scale=sd)\n",
"# Sample 10 values from the Gaussian distribution\n",
"samples = gaussian_dist.rvs(size=10)\n",
"````\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2022-08-18T09:45:09.308173Z",
"start_time": "2022-08-18T11:45:08.852431+02:00"
},
"execution": {
"iopub.execute_input": "2022-08-20T06:21:31.332Z",
"iopub.status.busy": "2022-08-20T06:21:31.327Z",
"iopub.status.idle": "2022-08-20T06:21:31.339Z",
"shell.execute_reply": "2022-08-20T06:21:31.343Z"
},
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"from walker import Walker, plot_trajectory"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2022-08-20T06:21:31.938Z",
"iopub.status.busy": "2022-08-20T06:21:31.932Z",
"iopub.status.idle": "2022-08-20T06:21:32.867Z",
"shell.execute_reply": "2022-08-20T06:21:32.871Z"
},
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# Create a Walker instance\n",
"walker = Walker(sigma_i=3, sigma_j=4, size=200, map_type='hills')\n",
"\n",
"# Sample a next step 1000 times\n",
"i, j = 100, 50\n",
"trajectory = []\n",
"for _ in range(1000):\n",
" i, j = walker.sample_next_step(i, j)\n",
" trajectory.append((i, j))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2022-08-20T06:21:32.883Z",
"iopub.status.busy": "2022-08-20T06:21:32.879Z",
"iopub.status.idle": "2022-08-20T06:21:33.026Z",
"shell.execute_reply": "2022-08-20T06:21:33.033Z"
},
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 480x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_trajectory(trajectory, walker.context_map)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": false,
"source_hidden": false
},
"nteract": {
"transient": {
"deleting": false
}
},
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"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.11.3"
},
"nteract": {
"version": "0.28.0"
},
"toc": {
"nav_menu": {
"height": "12px",
"width": "252px"
},
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 4,
"toc_cell": false,
"toc_section_display": "block",
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 1
}