{ "cells": [ { "cell_type": "markdown", "id": "ae97327d", "metadata": {}, "source": [ "# Tracking History\n", "\n", "The `tools` package contains utilities that interact with the learning process itself. For example, `tools.lineage` has utilities that enable tracking the lineage of individuals.\n", "\n", "These utilities are as follows:\n", "\n", "* `TrackParents` modifies the behaviour of an existing variator to record the parents in each offspring.\n", "\n", "* `graph_lineage` takes a collection of individuals and plot their lineage. These individuals must be produced by variators enhanced with `TrackParents`." ] }, { "cell_type": "code", "execution_count": 2, "id": "15f5468c", "metadata": {}, "outputs": [], "source": [ "import random\n", "random.seed(1)\n", "from evokit.core import Population\n", "from evokit.evolvables.bitstring import BitString, CountBits\n", "from evokit.tools.lineage import TrackParents\n", "from evokit.tools.lineage import graph_lineage" ] }, { "cell_type": "markdown", "id": "dac5b394", "metadata": {}, "source": [ "To enable lineage tracking, take an existing algorithm (e.g. [OneMax](./onemax.ipynb)) and wrap the variator with `TrackParents`. Then, run the algorithm as normal." ] }, { "cell_type": "code", "execution_count": 3, "id": "a1977346", "metadata": {}, "outputs": [], "source": [ "T: int = 10\n", "\n", "from evokit.evolvables.algorithms import SimpleLinearAlgorithm\n", "from evokit.evolvables.bitstring import OnePointCrossover\n", "from evokit.evolvables.selectors import TruncationSelector\n", "\n", "another_pop = Population((BitString.random(size=20)\n", " for _ in range(50)))\n", "\n", "ctrl = SimpleLinearAlgorithm(another_pop,\n", " CountBits(),\n", " TruncationSelector(budget=6),\n", " TrackParents(OnePointCrossover(0.5), 9))\n", "\n", "for _ in range (10):\n", " ctrl.step()" ] }, { "cell_type": "markdown", "id": "1dccbfc9", "metadata": {}, "source": [ "## Accessing Parents\n", "\n", "`TrackParents` stores the parents of each offspring in its `.parents`. This can incur a memory cost: if an individual has at most $N$ parents and $K$ generations of parents are tracked, then at most\n", "\n", "$$\\sum^{K}_{i=1}{N^i}$$\n", "\n", "extra individuals may be stored in memory. The cost can be significantly less in practice, as in the following example, because successful individuals often share common ancestors." ] }, { "cell_type": "code", "execution_count": 4, "id": "67f075e9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(,\n", " )" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctrl.population[0].parents" ] }, { "cell_type": "markdown", "id": "e057b71d", "metadata": {}, "source": [ "## Visualising Parents\n", "\n", "The `graph_lineage` function takes a number of individuals and outputs a `Digraph` (type from the `graphviz` module).\n", "\n", "Connections can look messy with large populations. In this case, either reduce the node size with `use_tooltip=True` or increase vertical spacing with `vertical_spacing=N, N>1`.\n", "\n", "Note that tooltips are only visible when the file is saved in SVG format. Do this with by setting `save_as=`." ] }, { "cell_type": "code", "execution_count": 5, "id": "cdca83c9", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455184\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452016\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455184->2143419452016\n", "\n", "\n", "\n", "\n", "2143419453744\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455184->2143419453744\n", "\n", "\n", "\n", "\n", "2143419455232\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455232->2143419452016\n", "\n", "\n", "\n", "\n", "2143419455232->2143419453744\n", "\n", "\n", "\n", "\n", "2143419455280\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454704\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455280->2143419454704\n", "\n", "\n", "\n", "\n", "2143419454896\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455280->2143419454896\n", "\n", "\n", "\n", "\n", "2143419455328\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455328->2143419454704\n", "\n", "\n", "\n", "\n", "2143419455328->2143419454896\n", "\n", "\n", "\n", "\n", "2143419455376\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454848\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455376->2143419454848\n", "\n", "\n", "\n", "\n", "2143419454800\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455376->2143419454800\n", "\n", "\n", "\n", "\n", "2143419455424\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419455424->2143419454848\n", "\n", "\n", "\n", "\n", "2143419455424->2143419454800\n", "\n", "\n", "\n", "\n", "2143419452784\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452016->2143419452784\n", "\n", "\n", "\n", "\n", "2143419453408\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452016->2143419453408\n", "\n", "\n", "\n", "\n", "2143419453744->2143419452784\n", "\n", "\n", "\n", "\n", "2143419453744->2143419453408\n", "\n", "\n", "\n", "\n", "2143419451920\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452784->2143419451920\n", "\n", "\n", "\n", "\n", "2143419453072\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452784->2143419453072\n", "\n", "\n", "\n", "\n", "2143419453408->2143419451920\n", "\n", "\n", "\n", "\n", "2143419453408->2143419453072\n", "\n", "\n", "\n", "\n", "2143419452496\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451920->2143419452496\n", "\n", "\n", "\n", "\n", "2143419452736\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451920->2143419452736\n", "\n", "\n", "\n", "\n", "2143419453072->2143419452496\n", "\n", "\n", "\n", "\n", "2143419453072->2143419452736\n", "\n", "\n", "\n", "\n", "2143419452304\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452496->2143419452304\n", "\n", "\n", "\n", "\n", "2143419451680\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452496->2143419451680\n", "\n", "\n", "\n", "\n", "2143419452736->2143419452304\n", "\n", "\n", "\n", "\n", "2143419452736->2143419451680\n", "\n", "\n", "\n", "\n", "2143419452064\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452304->2143419452064\n", "\n", "\n", "\n", "\n", "2143419452160\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452304->2143419452160\n", "\n", "\n", "\n", "\n", "2143419451680->2143419452064\n", "\n", "\n", "\n", "\n", "2143419451680->2143419452160\n", "\n", "\n", "\n", "\n", "2143419454752\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452064->2143419454752\n", "\n", "\n", "\n", "\n", "2143419451728\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452064->2143419451728\n", "\n", "\n", "\n", "\n", "2143419451824\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452160->2143419451824\n", "\n", "\n", "\n", "\n", "2143419451872\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452160->2143419451872\n", "\n", "\n", "\n", "\n", "2143419451584\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454752->2143419451584\n", "\n", "\n", "\n", "\n", "2143419451536\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454752->2143419451536\n", "\n", "\n", "\n", "\n", "2143419451488\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451728->2143419451488\n", "\n", "\n", "\n", "\n", "2143419451392\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451728->2143419451392\n", "\n", "\n", "\n", "\n", "2143419452352\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451584->2143419452352\n", "\n", "\n", "\n", "\n", "2143419453024\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451584->2143419453024\n", "\n", "\n", "\n", "\n", "2143419451536->2143419452352\n", "\n", "\n", "\n", "\n", "2143419451536->2143419453024\n", "\n", "\n", "\n", "\n", "2143419452112\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451488->2143419452112\n", "\n", "\n", "\n", "\n", "2143419451776\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451488->2143419451776\n", "\n", "\n", "\n", "\n", "2143419451392->2143419452112\n", "\n", "\n", "\n", "\n", "2143419451392->2143419451776\n", "\n", "\n", "\n", "\n", "2143419451824->2143419451488\n", "\n", "\n", "\n", "\n", "2143419451824->2143419451392\n", "\n", "\n", "\n", "\n", "2143419451344\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451872->2143419451344\n", "\n", "\n", "\n", "\n", "2143419451632\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451872->2143419451632\n", "\n", "\n", "\n", "\n", "2143419453120\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451344->2143419453120\n", "\n", "\n", "\n", "\n", "2143419453648\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419451344->2143419453648\n", "\n", "\n", "\n", "\n", "2143419451632->2143419453120\n", "\n", "\n", "\n", "\n", "2143419451632->2143419453648\n", "\n", "\n", "\n", "\n", "2143419453504\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454704->2143419453504\n", "\n", "\n", "\n", "\n", "2143419453552\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454704->2143419453552\n", "\n", "\n", "\n", "\n", "2143419453600\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454896->2143419453600\n", "\n", "\n", "\n", "\n", "2143419453696\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419454896->2143419453696\n", "\n", "\n", "\n", "\n", "2143419453312\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453504->2143419453312\n", "\n", "\n", "\n", "\n", "2143419453168\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453504->2143419453168\n", "\n", "\n", "\n", "\n", "2143419453552->2143419453312\n", "\n", "\n", "\n", "\n", "2143419453552->2143419453168\n", "\n", "\n", "\n", "\n", "2143419452976\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453312->2143419452976\n", "\n", "\n", "\n", "\n", "2143419452928\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453312->2143419452928\n", "\n", "\n", "\n", "\n", "2143419452880\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453168->2143419452880\n", "\n", "\n", "\n", "\n", "2143419452832\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453168->2143419452832\n", "\n", "\n", "\n", "\n", "2143419452592\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452880->2143419452592\n", "\n", "\n", "\n", "\n", "2143419452544\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452880->2143419452544\n", "\n", "\n", "\n", "\n", "2143419452832->2143419452592\n", "\n", "\n", "\n", "\n", "2143419452832->2143419452544\n", "\n", "\n", "\n", "\n", "2143419452208\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452592->2143419452208\n", "\n", "\n", "\n", "\n", "2143419451296\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452592->2143419451296\n", "\n", "\n", "\n", "\n", "2143419452544->2143419452208\n", "\n", "\n", "\n", "\n", "2143419452544->2143419451296\n", "\n", "\n", "\n", "\n", "2143419452208->2143419451824\n", "\n", "\n", "\n", "\n", "2143419452208->2143419451872\n", "\n", "\n", "\n", "\n", "2143419451296->2143419454752\n", "\n", "\n", "\n", "\n", "2143419451296->2143419451728\n", "\n", "\n", "\n", "\n", "2143419452640\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452976->2143419452640\n", "\n", "\n", "\n", "\n", "2143419452448\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452976->2143419452448\n", "\n", "\n", "\n", "\n", "2143419452928->2143419452640\n", "\n", "\n", "\n", "\n", "2143419452928->2143419452448\n", "\n", "\n", "\n", "\n", "2143419452256\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452640->2143419452256\n", "\n", "\n", "\n", "\n", "2143419452400\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452640->2143419452400\n", "\n", "\n", "\n", "\n", "2143419452448->2143419452256\n", "\n", "\n", "\n", "\n", "2143419452448->2143419452400\n", "\n", "\n", "\n", "\n", "2143419451440\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452256->2143419451440\n", "\n", "\n", "\n", "\n", "2143419451968\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419452256->2143419451968\n", "\n", "\n", "\n", "\n", "2143419452400->2143419451440\n", "\n", "\n", "\n", "\n", "2143419452400->2143419451968\n", "\n", "\n", "\n", "\n", "2143419451440->2143419451584\n", "\n", "\n", "\n", "\n", "2143419451440->2143419451536\n", "\n", "\n", "\n", "\n", "2143419451968->2143419451344\n", "\n", "\n", "\n", "\n", "2143419451968->2143419451632\n", "\n", "\n", "\n", "\n", "2143419453360\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453600->2143419453360\n", "\n", "\n", "\n", "\n", "2143419453216\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2143419453600->2143419453216\n", "\n", "\n", "\n", "\n", "2143419453696->2143419453360\n", "\n", "\n", "\n", "\n", "2143419453696->2143419453216\n", "\n", "\n", "\n", "\n", "2143419453360->2143419452976\n", "\n", "\n", "\n", "\n", "2143419453360->2143419452928\n", "\n", "\n", "\n", "\n", "2143419453216->2143419452880\n", "\n", "\n", "\n", "\n", "2143419453216->2143419452832\n", "\n", "\n", "\n", "\n", "2143419454848->2143419453600\n", "\n", "\n", "\n", "\n", "2143419454848->2143419453696\n", "\n", "\n", "\n", "\n", "2143419454800->2143419453504\n", "\n", "\n", "\n", "\n", "2143419454800->2143419453552\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dot = graph_lineage(ctrl.population, use_tooltip=True, save_as=\"weeeeee\")\n", "dot" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.12.10" } }, "nbformat": 4, "nbformat_minor": 5 }