{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "29874499fd2a20779e162626f76f6776",
     "grade": false,
     "grade_id": "cell-e894ec2378fa46eb",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# You must run this cell, but you can ignore its contents.\n",
    "\n",
    "import hashlib\n",
    "\n",
    "def ads_hash(ty):\n",
    "    \"\"\"Return a unique string for input\"\"\"\n",
    "    ty_str = str(ty).encode()\n",
    "    m = hashlib.sha256()\n",
    "    m.update(ty_str)\n",
    "    return m.hexdigest()[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "6f1fee68b047ccaf945f9998a29d8651",
     "grade": false,
     "grade_id": "cell-ada87b3b188b2d39",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# You must also run this cell.\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "markdown",
     "checksum": "bd84ae4c048d756b33d0fd85d55f1aec",
     "grade": false,
     "grade_id": "cell-d7462f8b0f718bef",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# Exercise - Optimization first steps\n",
    "\n",
    "We are going to take our first steps towards optimization by returning to a bumblebee example.\n",
    "\n",
    "We are going to define the positions of a flower and the flight path of a bumblebee."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "13882d6eb738408b7520368a4b5e8ff5",
     "grade": false,
     "grade_id": "cell-78cb75cddd4fc5ef",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "flower = np.array([7.5, 10.3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "5f73a413f4a03726e882c755a3430c17",
     "grade": false,
     "grade_id": "cell-ab9736432799913b",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "def make_bee_track(t):\n",
    "    pos0 = (-10,3)\n",
    "    velocity = (4.0, 0.2)\n",
    "    pos_x = pos0[0] + t*velocity[0]\n",
    "    pos_y = pos0[1] + t*velocity[1]\n",
    "    return np.array([pos_x,pos_y])\n",
    "\n",
    "t = np.linspace(0,15,20)\n",
    "bee_track = make_bee_track(t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "markdown",
     "checksum": "6aa761a551cb0142afbfe7e7d81947ed",
     "grade": false,
     "grade_id": "cell-08928dcd585933a7",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Here we plot these positions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "c8e52b43cbe861d8eddacccc87aeb1e2",
     "grade": false,
     "grade_id": "cell-4b58d56276437c3a",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "fig, ax = plt.subplots(nrows=1, ncols=1)\n",
    "ax.plot( [flower[0]], [flower[1]], 'or', label='flower' )\n",
    "ax.plot( bee_track[0], bee_track[1], '.-k', label='bee')\n",
    "ax.axis('equal')\n",
    "ax.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "markdown",
     "checksum": "0f3a53f8323083b2effbac78689c09d7",
     "grade": false,
     "grade_id": "cell-701acd6a5b4a9581",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Q1 Draw a figure as above with, additionally, a blue line between each point on `bee_track` and `flower`.\n",
    "\n",
    "When complete, your figure should look like this:\n",
    "\n",
    "<img src=\"data:image/png;base64,[encoded data, 31772 characters]\"/>\n",
    "\n",
    "\n",
    "Hint, draw the flower first. Then, make a for loop which steps through each position of the bee. Inside the for loop, draw a line segment between the bee and the flower."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "38fbad4ec96d8ade393535b625140003",
     "grade": true,
     "grade_id": "cell-43f8774b1a82b15b",
     "locked": false,
     "points": 1,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# YOUR CODE HERE\n",
    "raise NotImplementedError()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "markdown",
     "checksum": "89805e9c9678ff01669528f20a596bf6",
     "grade": false,
     "grade_id": "cell-45a057824a59090e",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Q2 write a function called `my_distance` which takes two arguments, each of which is a length 2 sequence of `x`, `y` position and returns the Euclidean distance between these points."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "9bd3bd0fb3a886f4696138c95e0058ab",
     "grade": false,
     "grade_id": "cell-9d86e35ff582bf8f",
     "locked": false,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# YOUR CODE HERE\n",
    "raise NotImplementedError()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "b359ea8e38a47e5320e08ce6158dc39c",
     "grade": true,
     "grade_id": "cell-d96cb3c1a49758db",
     "locked": true,
     "points": 0,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "assert my_distance((0,0),(3,4)) == 5\n",
    "assert my_distance((3,4), (0,0)) == 5\n",
    "assert my_distance((13,14), (10,10)) == 5\n",
    "assert my_distance((10,10), (13,14)) == 5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "markdown",
     "checksum": "5220e92a49ceb61457be556c246b28ce",
     "grade": false,
     "grade_id": "cell-9426c238469156ae",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Q3 compute the distance between each point on `bee_track` and `flower`. Put the results in a 1D numpy array called `distance`.\n",
    "\n",
    "Hint: recall the function you wrote in the \"numpy basics\" exercise called `compute_distance`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "922ea2de206db155b31c1b6020e50c27",
     "grade": false,
     "grade_id": "cell-bf78a3429e48b28d",
     "locked": false,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# YOUR CODE HERE\n",
    "raise NotImplementedError()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "0304ff76ac1ade2c3221a53c5df5fbb2",
     "grade": true,
     "grade_id": "cell-70fd1e669decb646",
     "locked": true,
     "points": 1,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# If this runs without error, it means the answer in your previous cell was correct.\n",
    "assert ads_hash(np.round(distance*1000).astype(np.int32))=='54f4f2edcb'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Q4 make a plot of the bee track parameter `t` on the X axis and `distance` on the Y axis.\n",
    "\n",
    "It should look like this:\n",
    "\n",
    "<img src=\"data:image/png;base64,[encoded data, 13988 characters]&#10;\">\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "c03c9f9064ad82267ed7ad1ff2274116",
     "grade": true,
     "grade_id": "cell-acdc61a7b1539944",
     "locked": false,
     "points": 1,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# YOUR CODE HERE\n",
    "raise NotImplementedError()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Q5 Using `calc_distance_func` from the lecture, find the value of `t` that minimizes the distance between the bee and the flower. Save the result in `best_t`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "ea188c9450758aa26fecfdc16042a9f2",
     "grade": false,
     "grade_id": "cell-23d19427610d2072",
     "locked": false,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# YOUR CODE HERE\n",
    "raise NotImplementedError()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "7a33eaaaaca8781f883635cee037a71d",
     "grade": true,
     "grade_id": "cell-0a3594afd2952a33",
     "locked": true,
     "points": 1,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# If this runs without error, it means the answer in your previous cell was correct.\n",
    "assert ads_hash(np.round(best_t*1000).astype(np.int32))=='dec1ab2f6d'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "make_bee_track(best_t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Q6 What is the position of the bee when it is closest to the flower? Save the result as a numpy array in `best_pos`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "20073a563548884f84b927f1c1f154eb",
     "grade": false,
     "grade_id": "cell-cac598c7f739d146",
     "locked": false,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# YOUR CODE HERE\n",
    "raise NotImplementedError()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "deletable": false,
    "editable": false,
    "nbgrader": {
     "cell_type": "code",
     "checksum": "4e73e4a1310b052d0bd683f8e5b40fd3",
     "grade": true,
     "grade_id": "cell-9d882991838f0996",
     "locked": true,
     "points": 1,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "# If this runs without error, it means the answer in your previous cell was correct.\n",
    "assert type(best_pos)==np.ndarray\n",
    "assert best_pos.ndim==1\n",
    "assert best_pos.shape==(2,)\n",
    "assert ads_hash(np.round(best_pos[0]*1000).astype(np.int32))=='e33b9415bc'\n",
    "assert ads_hash(np.round(best_pos[1]*1000).astype(np.int32))=='f71cbfce4c'"
   ]
  }
 ],
 "metadata": {
  "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.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
