From: Neil Smith Date: Tue, 27 Dec 2022 18:00:43 +0000 (+0000) Subject: Added profiling X-Git-Url: https://git.njae.me.uk/?a=commitdiff_plain;h=89eb500db478502b125606aa4ffbf8c2cc515ddf;p=advent-of-code-22.git Added profiling --- diff --git a/advent11/Main.hs b/advent11/Main.hs index a63be5c..3f4619b 100644 --- a/advent11/Main.hs +++ b/advent11/Main.hs @@ -6,7 +6,7 @@ import qualified Data.Text.IO as TIO import Data.Attoparsec.Text hiding (take, D) import Control.Applicative import Data.List -import qualified Data.IntMap as M +import qualified Data.IntMap.Strict as M import Data.IntMap ((!)) import Control.Lens import Control.Monad.State.Strict diff --git a/advent19/Main.hs b/advent19/Main.hs index 7fe0315..25f608a 100644 --- a/advent19/Main.hs +++ b/advent19/Main.hs @@ -19,6 +19,7 @@ import Data.Maybe -- import Data.Ord import Control.Monad.Reader import Control.Lens hiding ((<|), (|>), (:>), (:<), indices) +import GHC.Generics (Generic) import Control.Parallel.Strategies import Control.DeepSeq @@ -27,7 +28,9 @@ import Control.DeepSeq -- pattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>) = (Q.|>) data Resource = Ore | Clay | Obsidian | Geode - deriving (Show, Eq, Ord) + deriving (Show, Eq, Ord, Generic) + +instance NFData Resource type Collection = MS.MultiSet Resource @@ -45,7 +48,7 @@ data SingleSearchState = SingleSearchState makeLenses ''SingleSearchState instance NFData SingleSearchState where - rnf a = a `seq` () + rnf (SingleSearchState a b) = rnf a `seq` rnf b `seq` () data Agendum s = Agendum { _current :: s @@ -109,7 +112,15 @@ part1 blueprints = sum [n * (MS.occur Geode (r ^. resources)) | (n, r) <- result where results = [ (n, _current $ fromJust $ runReader searchSpace (TimedBlueprint blueprint 24 (robotLimits blueprint)) ) | (n, blueprint) <- blueprints ] :: [(Int, SingleSearchState)] robotLimits bp = M.foldl' MS.maxUnion MS.empty bp - +-- part1 blueprints = sum [n * (MS.occur Geode (r ^. resources)) | (n, r) <- pResults] +-- where -- results = [ (n, _current $ fromJust $ runReader searchSpace (TimedBlueprint blueprint 24 (robotLimits blueprint)) ) +-- -- | (n, blueprint) <- blueprints ] :: [(Int, SingleSearchState)] +-- -- pResults = parMap rdeepseq id results +-- -- pResults = (fmap runABlueprint blueprints) `using` parList rdeepseq +-- pResults = (fmap runABlueprint blueprints) `using` (parList rdeepseq) +-- runABlueprint (n, blueprint) = (n, _current $ fromJust $ +-- runReader searchSpace (TimedBlueprint blueprint 24 (robotLimits blueprint)) ) +-- robotLimits bp = M.foldl' MS.maxUnion MS.empty bp part2 :: [(Int, Blueprint)] -> Int part2 blueprints = product [MS.occur Geode (r ^. resources) | r <- pResults] diff --git a/profiling/external_time.png b/profiling/external_time.png new file mode 100644 index 0000000..4b4b0fc Binary files /dev/null and b/profiling/external_time.png differ diff --git a/profiling/external_time_and_memory.png b/profiling/external_time_and_memory.png new file mode 100644 index 0000000..44401da Binary files /dev/null and b/profiling/external_time_and_memory.png differ diff --git a/profiling/external_time_and_memory_linear.png b/profiling/external_time_and_memory_linear.png new file mode 100644 index 0000000..44401da Binary files /dev/null and b/profiling/external_time_and_memory_linear.png differ diff --git a/profiling/external_time_and_memory_log.png b/profiling/external_time_and_memory_log.png new file mode 100644 index 0000000..2c38cd8 Binary files /dev/null and b/profiling/external_time_and_memory_log.png differ diff --git a/profiling/imports.png b/profiling/imports.png new file mode 100644 index 0000000..a5e9dcc Binary files /dev/null and b/profiling/imports.png differ diff --git a/profiling/imports_sorted.png b/profiling/imports_sorted.png new file mode 100644 index 0000000..9fa9ad7 Binary files /dev/null and b/profiling/imports_sorted.png differ diff --git a/profiling/internal_external_memory.png b/profiling/internal_external_memory.png new file mode 100644 index 0000000..b4b0986 Binary files /dev/null and b/profiling/internal_external_memory.png differ diff --git a/profiling/internal_external_memory_combined.png b/profiling/internal_external_memory_combined.png new file mode 100644 index 0000000..b92a3dc Binary files /dev/null and b/profiling/internal_external_memory_combined.png differ diff --git a/profiling/internal_external_memory_linear.png b/profiling/internal_external_memory_linear.png new file mode 100644 index 0000000..540e93e Binary files /dev/null and b/profiling/internal_external_memory_linear.png differ diff --git a/profiling/internal_external_memory_log.png b/profiling/internal_external_memory_log.png new file mode 100644 index 0000000..6d704d6 Binary files /dev/null and b/profiling/internal_external_memory_log.png differ diff --git a/profiling/internal_external_time.png b/profiling/internal_external_time.png new file mode 100644 index 0000000..f83c3e2 Binary files /dev/null and b/profiling/internal_external_time.png differ diff --git a/profiling/internal_external_time_linear.png b/profiling/internal_external_time_linear.png new file mode 100644 index 0000000..d459aab Binary files /dev/null and b/profiling/internal_external_time_linear.png differ diff --git a/profiling/internal_time_and_memory.png b/profiling/internal_time_and_memory.png new file mode 100644 index 0000000..376f60d Binary files /dev/null and b/profiling/internal_time_and_memory.png differ diff --git a/profiling/internal_time_and_memory_linear.png b/profiling/internal_time_and_memory_linear.png new file mode 100644 index 0000000..df8c45d Binary files /dev/null and b/profiling/internal_time_and_memory_linear.png differ diff --git a/profiling/internal_time_and_memory_log.png b/profiling/internal_time_and_memory_log.png new file mode 100644 index 0000000..435a973 Binary files /dev/null and b/profiling/internal_time_and_memory_log.png differ diff --git a/profiling/lines_of_code.png b/profiling/lines_of_code.png new file mode 100644 index 0000000..b2a02ee Binary files /dev/null and b/profiling/lines_of_code.png differ diff --git a/profiling/memory_combined.png b/profiling/memory_combined.png new file mode 100644 index 0000000..3e6b91e Binary files /dev/null and b/profiling/memory_combined.png differ diff --git a/profiling/modules.ipynb b/profiling/modules.ipynb new file mode 100644 index 0000000..795625c --- /dev/null +++ b/profiling/modules.ipynb @@ -0,0 +1,4224 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "09b5b05d-ae4f-4ec4-bebf-5824274e4631", + "metadata": {}, + "outputs": [], + "source": [ + "import os, glob\n", + "import collections\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7bd3fc71-cd3b-4218-8912-c35bdc2584bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[' build-depends: base >=4.16\\n',\n", + " ' build-depends: base ^>=4.16.4.0\\n',\n", + " ' build-depends: base >=4.16\\n',\n", + " ' build-depends: split\\n',\n", + " ' build-depends: text, attoparsec\\n',\n", + " ' build-depends: containers, split\\n',\n", + " ' build-depends: text, attoparsec\\n',\n", + " ' build-depends: text, attoparsec, intervals\\n',\n", + " ' build-depends: text, attoparsec, containers\\n',\n", + " ' build-depends: text, attoparsec, containers, rosezipper\\n',\n", + " ' build-depends: text, attoparsec, containers, linear, lens\\n',\n", + " ' build-depends: text, attoparsec, split\\n',\n", + " ' build-depends: text, attoparsec, containers, lens, mtl\\n',\n", + " ' build-depends: containers, linear, array, pqueue, mtl, lens\\n',\n", + " ' build-depends: text, attoparsec\\n',\n", + " ' build-depends: text, attoparsec, containers, linear, lens\\n',\n", + " ' build-depends: text, attoparsec, containers, linear, lens\\n',\n", + " ' build-depends: text, attoparsec, containers, pqueue, mtl, lens, split\\n',\n", + " ' build-depends: containers, linear, lens\\n',\n", + " ' build-depends: text, attoparsec, containers, linear, lens\\n',\n", + " ' build-depends: text, attoparsec, containers, pqueue, mtl, lens, multiset, parallel, deepseq\\n',\n", + " ' build-depends: data-clist , lens\\n',\n", + " ' build-depends: text, attoparsec, containers, lens\\n',\n", + " ' build-depends: containers, linear, lens, mtl\\n',\n", + " ' build-depends: containers, linear, lens, mtl, multiset\\n',\n", + " ' build-depends: containers, linear, lens, mtl, multiset\\n',\n", + " ' build-depends: containers, pqueue, mtl, lens, linear, array\\n']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "with open('../advent-of-code22.cabal') as f:\n", + " build_depends = [l for l in f.readlines() if 'build-depends' in l]\n", + "build_depends" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d0e0655a-2fad-47c9-afe1-8ae4c44949ab", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[', other than Main.\\n -- other-modules:\\n\\n -- LANGUAGE extensions used by modules in this package.\\n -- other-extensions:\\n build-depends: base ^>=4.16.4.0\\n hs-source-dirs: app, src\\n default-language: Haskell2010\\n\\nlibrary\\n import: common-extensions\\n build-depends: base >=4.16\\n hs-source-dirs: ., app, src\\n exposed-modules: AoC\\n\\n',\n", + " ' advent01\\n import: common-extensions, build-directives\\n main-is: advent01/Main.hs\\n build-depends: split\\n\\n',\n", + " ' advent02\\n import: common-extensions, build-directives\\n main-is: advent02/Main.hs\\n build-depends: text, attoparsec\\n\\n']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cabal_file = open('../advent-of-code22.cabal').read()\n", + "executables = cabal_file.split('executable')[2:]\n", + "executables[:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "62a719db-b264-4b95-8dd0-80ab08b3622a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['split']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e = executables[1]\n", + "e.strip().split('build-depends: ')[1].split(',')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5f5e51ea-4457-4701-99d2-844edcec721e", + "metadata": {}, + "outputs": [], + "source": [ + "def extract(line):\n", + " parts = line.strip().split('build-depends: ')\n", + " name = parts[0].split()[0]\n", + " if len(parts) > 1:\n", + " depends = [p.strip() for p in parts[1].split('\\n')[0].split(',') if 'base' not in p]\n", + " else:\n", + " depends = []\n", + " return name, depends " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a852a10b-ee9a-46d5-a390-04f218424760", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'advent01': ['split'],\n", + " 'advent02': ['text', 'attoparsec'],\n", + " 'advent03': ['containers', 'split'],\n", + " 'advent04': ['text', 'attoparsec'],\n", + " 'advent05': ['text', 'attoparsec', 'containers'],\n", + " 'advent06': [],\n", + " 'advent07': ['text', 'attoparsec', 'containers', 'rosezipper'],\n", + " 'advent08': [],\n", + " 'advent09': ['text', 'attoparsec', 'containers', 'linear', 'lens'],\n", + " 'advent10': ['text', 'attoparsec', 'split'],\n", + " 'advent11': ['text', 'attoparsec', 'containers', 'lens', 'mtl'],\n", + " 'advent12': ['containers', 'linear', 'array', 'pqueue', 'mtl', 'lens'],\n", + " 'advent13': ['text', 'attoparsec'],\n", + " 'advent14': ['text', 'attoparsec', 'containers', 'linear', 'lens'],\n", + " 'advent15': ['text', 'attoparsec', 'containers', 'linear', 'lens'],\n", + " 'advent16': ['text',\n", + " 'attoparsec',\n", + " 'containers',\n", + " 'pqueue',\n", + " 'mtl',\n", + " 'lens',\n", + " 'split'],\n", + " 'advent17': ['containers', 'linear', 'lens'],\n", + " 'advent18': ['text', 'attoparsec', 'containers', 'linear', 'lens'],\n", + " 'advent19': ['text',\n", + " 'attoparsec',\n", + " 'containers',\n", + " 'pqueue',\n", + " 'mtl',\n", + " 'lens',\n", + " 'multiset',\n", + " 'parallel',\n", + " 'deepseq'],\n", + " 'advent20': ['data-clist', 'lens'],\n", + " 'advent21': ['text', 'attoparsec', 'containers', 'lens'],\n", + " 'advent22': ['containers', 'linear', 'lens', 'mtl'],\n", + " 'advent23': ['containers', 'linear', 'lens', 'mtl', 'multiset'],\n", + " 'advent24': ['containers', 'pqueue', 'mtl', 'lens', 'linear', 'array'],\n", + " 'advent25': []}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modules = {e: ms for e, ms in [extract(e) for e in executables] if e.endswith(tuple(str(i) for i in range(10)))}\n", + "modules" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "57036fc2-db73-4c5b-b3bc-b7e8f9bbccda", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
arrayattoparseccontainersdata-clistdeepseqlenslinearmtlmultisetparallelpqueuerosezippersplittext
advent01FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
advent02FalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
advent03FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
advent04FalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
advent05FalseTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
advent06FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent07FalseTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseTrue
advent08FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent09FalseTrueTrueFalseFalseTrueTrueFalseFalseFalseFalseFalseFalseTrue
advent10FalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrue
advent11FalseTrueTrueFalseFalseTrueFalseTrueFalseFalseFalseFalseFalseTrue
advent12TrueFalseTrueFalseFalseTrueTrueTrueFalseFalseTrueFalseFalseFalse
advent13FalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
advent14FalseTrueTrueFalseFalseTrueTrueFalseFalseFalseFalseFalseFalseTrue
advent15FalseTrueTrueFalseFalseTrueTrueFalseFalseFalseFalseFalseFalseTrue
advent16FalseTrueTrueFalseFalseTrueFalseTrueFalseFalseTrueFalseTrueTrue
advent17FalseFalseTrueFalseFalseTrueTrueFalseFalseFalseFalseFalseFalseFalse
advent18FalseTrueTrueFalseFalseTrueTrueFalseFalseFalseFalseFalseFalseTrue
advent19FalseTrueTrueFalseTrueTrueFalseTrueTrueTrueTrueFalseFalseTrue
advent20FalseFalseFalseTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalse
advent21FalseTrueTrueFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseTrue
advent22FalseFalseTrueFalseFalseTrueTrueTrueFalseFalseFalseFalseFalseFalse
advent23FalseFalseTrueFalseFalseTrueTrueTrueTrueFalseFalseFalseFalseFalse
advent24TrueFalseTrueFalseFalseTrueTrueTrueFalseFalseTrueFalseFalseFalse
advent25FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", + "
" + ], + "text/plain": [ + " array attoparsec containers data-clist deepseq lens linear \\\n", + "advent01 False False False False False False False \n", + "advent02 False True False False False False False \n", + "advent03 False False True False False False False \n", + "advent04 False True False False False False False \n", + "advent05 False True True False False False False \n", + "advent06 False False False False False False False \n", + "advent07 False True True False False False False \n", + "advent08 False False False False False False False \n", + "advent09 False True True False False True True \n", + "advent10 False True False False False False False \n", + "advent11 False True True False False True False \n", + "advent12 True False True False False True True \n", + "advent13 False True False False False False False \n", + "advent14 False True True False False True True \n", + "advent15 False True True False False True True \n", + "advent16 False True True False False True False \n", + "advent17 False False True False False True True \n", + "advent18 False True True False False True True \n", + "advent19 False True True False True True False \n", + "advent20 False False False True False True False \n", + "advent21 False True True False False True False \n", + "advent22 False False True False False True True \n", + "advent23 False False True False False True True \n", + "advent24 True False True False False True True \n", + "advent25 False False False False False False False \n", + "\n", + " mtl multiset parallel pqueue rosezipper split text \n", + "advent01 False False False False False True False \n", + "advent02 False False False False False False True \n", + "advent03 False False False False False True False \n", + "advent04 False False False False False False True \n", + "advent05 False False False False False False True \n", + "advent06 False False False False False False False \n", + "advent07 False False False False True False True \n", + "advent08 False False False False False False False \n", + "advent09 False False False False False False True \n", + "advent10 False False False False False True True \n", + "advent11 True False False False False False True \n", + "advent12 True False False True False False False \n", + "advent13 False False False False False False True \n", + "advent14 False False False False False False True \n", + "advent15 False False False False False False True \n", + "advent16 True False False True False True True \n", + "advent17 False False False False False False False \n", + "advent18 False False False False False False True \n", + "advent19 True True True True False False True \n", + "advent20 False False False False False False False \n", + "advent21 False False False False False False True \n", + "advent22 True False False False False False False \n", + "advent23 True True False False False False False \n", + "advent24 True False False True False False False \n", + "advent25 False False False False False False False " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_modules = set(m for p in modules for m in modules[p])\n", + "modules_df = pd.DataFrame.from_dict({p: {m: m in modules[p] for m in sorted(all_modules)} for p in modules}, orient='index').sort_index()\n", + "modules_df" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2eec3a74-e533-4d59-b495-9e774ca470e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "| | 0 |\n", + "|:-----------|----:|\n", + "| containers | 16 |\n", + "| attoparsec | 14 |\n", + "| lens | 14 |\n", + "| text | 14 |\n", + "| linear | 9 |\n", + "| mtl | 7 |\n", + "| pqueue | 4 |\n", + "| split | 4 |\n", + "| array | 2 |\n", + "| multiset | 2 |\n", + "| data-clist | 1 |\n", + "| deepseq | 1 |\n", + "| parallel | 1 |\n", + "| rosezipper | 1 |\n" + ] + } + ], + "source": [ + "print(modules_df.sum().sort_values(ascending=False).to_markdown())" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d5c8f2ac-1575-49c4-b2c1-458419b9afd8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['containers', 'attoparsec', 'lens', 'text', 'linear', 'mtl',\n", + " 'pqueue', 'split', 'array', 'multiset', 'data-clist', 'deepseq',\n", + " 'parallel', 'rosezipper'], dtype=object)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted_modules = modules_df.sum().sort_values(ascending=False).index.values\n", + "sorted_modules" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1802f0e4-c0b4-4c07-9b9b-a90d01e656d2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
containersattoparseclenstextlinearmtlpqueuesplitarraymultisetdata-clistdeepseqparallelrosezipper
advent01FalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalse
advent02FalseTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent03TrueFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalse
advent04FalseTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent05TrueTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent06FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent07TrueTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
advent08FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent09TrueTrueTrueTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent10FalseTrueFalseTrueFalseFalseFalseTrueFalseFalseFalseFalseFalseFalse
advent11TrueTrueTrueTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalse
advent12TrueFalseTrueFalseTrueTrueTrueFalseTrueFalseFalseFalseFalseFalse
advent13FalseTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent14TrueTrueTrueTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent15TrueTrueTrueTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent16TrueTrueTrueTrueFalseTrueTrueTrueFalseFalseFalseFalseFalseFalse
advent17TrueFalseTrueFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent18TrueTrueTrueTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent19TrueTrueTrueTrueFalseTrueTrueFalseFalseTrueFalseTrueTrueFalse
advent20FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalse
advent21TrueTrueTrueTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent22TrueFalseTrueFalseTrueTrueFalseFalseFalseFalseFalseFalseFalseFalse
advent23TrueFalseTrueFalseTrueTrueFalseFalseFalseTrueFalseFalseFalseFalse
advent24TrueFalseTrueFalseTrueTrueTrueFalseTrueFalseFalseFalseFalseFalse
advent25FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", + "
" + ], + "text/plain": [ + " containers attoparsec lens text linear mtl pqueue split \\\n", + "advent01 False False False False False False False True \n", + "advent02 False True False True False False False False \n", + "advent03 True False False False False False False True \n", + "advent04 False True False True False False False False \n", + "advent05 True True False True False False False False \n", + "advent06 False False False False False False False False \n", + "advent07 True True False True False False False False \n", + "advent08 False False False False False False False False \n", + "advent09 True True True True True False False False \n", + "advent10 False True False True False False False True \n", + "advent11 True True True True False True False False \n", + "advent12 True False True False True True True False \n", + "advent13 False True False True False False False False \n", + "advent14 True True True True True False False False \n", + "advent15 True True True True True False False False \n", + "advent16 True True True True False True True True \n", + "advent17 True False True False True False False False \n", + "advent18 True True True True True False False False \n", + "advent19 True True True True False True True False \n", + "advent20 False False True False False False False False \n", + "advent21 True True True True False False False False \n", + "advent22 True False True False True True False False \n", + "advent23 True False True False True True False False \n", + "advent24 True False True False True True True False \n", + "advent25 False False False False False False False False \n", + "\n", + " array multiset data-clist deepseq parallel rosezipper \n", + "advent01 False False False False False False \n", + "advent02 False False False False False False \n", + "advent03 False False False False False False \n", + "advent04 False False False False False False \n", + "advent05 False False False False False False \n", + "advent06 False False False False False False \n", + "advent07 False False False False False True \n", + "advent08 False False False False False False \n", + "advent09 False False False False False False \n", + "advent10 False False False False False False \n", + "advent11 False False False False False False \n", + "advent12 True False False False False False \n", + "advent13 False False False False False False \n", + "advent14 False False False False False False \n", + "advent15 False False False False False False \n", + "advent16 False False False False False False \n", + "advent17 False False False False False False \n", + "advent18 False False False False False False \n", + "advent19 False True False True True False \n", + "advent20 False False True False False False \n", + "advent21 False False False False False False \n", + "advent22 False False False False False False \n", + "advent23 False True False False False False \n", + "advent24 True False False False False False \n", + "advent25 False False False False False False " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modules_sorted_cols = modules_df[sorted_modules]\n", + "modules_sorted_cols" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "da22ede4-ac7c-4d32-9396-4cf585f97ba7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
programmodulepresent
12advent01splitTrue
15advent02attoparsecTrue
27advent02textTrue
30advent03containersTrue
40advent03splitTrue
............
324advent24containersTrue
327advent24lensTrue
328advent24linearTrue
329advent24mtlTrue
332advent24pqueueTrue
\n", + "

90 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " program module present\n", + "12 advent01 split True\n", + "15 advent02 attoparsec True\n", + "27 advent02 text True\n", + "30 advent03 containers True\n", + "40 advent03 split True\n", + ".. ... ... ...\n", + "324 advent24 containers True\n", + "327 advent24 lens True\n", + "328 advent24 linear True\n", + "329 advent24 mtl True\n", + "332 advent24 pqueue True\n", + "\n", + "[90 rows x 3 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modules_scatter = modules_df.stack().reset_index()\n", + "modules_scatter.columns = ['program', 'module', 'present']\n", + "modules_scatter = modules_scatter[modules_scatter.present]\n", + "modules_scatter" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "fa6a99a2-749a-48d5-9009-11a45eb2722a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "modules_scatter.plot.scatter(x='program', y='module', s=80, rot=45, figsize=(10, 6))" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "0e1cb390-cfce-41aa-b18f-b3d9fee57ae0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cmap = mpl.colors.ListedColormap(['white', 'blue'])\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 10))\n", + "ax.imshow(modules_df.to_numpy().T, cmap=cmap)\n", + "plt.xticks(range(modules_df.index.size), labels=modules_df.index.values, rotation=90);\n", + "plt.yticks(range(modules_df.columns.size), labels=modules_df.columns.values);\n", + "\n", + "ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5);\n", + "plt.savefig('packages.png');" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "6436d177-2695-4847-b00c-bf7f4a38f1fe", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cmap = mpl.colors.ListedColormap(['white', 'blue'])\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 10))\n", + "ax.imshow(modules_sorted_cols.to_numpy().T, cmap=cmap)\n", + "plt.xticks(range(modules_sorted_cols.index.size), labels=modules_sorted_cols.index.values, rotation=90);\n", + "plt.yticks(range(modules_sorted_cols.columns.size), labels=modules_sorted_cols.columns.values);\n", + "\n", + "ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5);\n", + "plt.savefig('packages_sorted.png');" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "d79246cc-4471-43ac-ba76-d720acbb7435", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['../advent01/Main.hs',\n", + " '../advent02/Main.hs',\n", + " '../advent03/Main.hs',\n", + " '../advent04/Main.hs',\n", + " '../advent05/Main.hs',\n", + " '../advent06/Main.hs',\n", + " '../advent07/Main.hs',\n", + " '../advent08/Main.hs',\n", + " '../advent09/Main.hs',\n", + " '../advent10/Main.hs',\n", + " '../advent11/Main.hs',\n", + " '../advent12/Main.hs',\n", + " '../advent13/Main.hs',\n", + " '../advent14/Main.hs',\n", + " '../advent15/Main.hs',\n", + " '../advent16/Main.hs',\n", + " '../advent17/Main.hs',\n", + " '../advent18/Main.hs',\n", + " '../advent19/Main.hs',\n", + " '../advent20/Main.hs',\n", + " '../advent21/Main.hs',\n", + " '../advent22/Main.hs',\n", + " '../advent23/Main.hs',\n", + " '../advent24/Main.hs',\n", + " '../advent25/Main.hs']" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mains = list(sorted(f for f in glob.glob('../advent*/Main.hs')))\n", + "mains" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "f9076c9f-fc86-435b-9471-99726bfbfb87", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'advent01': [('AoC', False),\n", + " ('Data.List', False),\n", + " ('Data.List.Split', False),\n", + " ('Data.Ord', False)],\n", + " 'advent02': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False)],\n", + " 'advent03': [('AoC', False),\n", + " ('Data.Char', False),\n", + " ('Data.Set', True),\n", + " ('Data.List', False),\n", + " ('Data.List.Split', False)],\n", + " 'advent04': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False)],\n", + " 'advent05': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.List', False),\n", + " ('Data.Maybe', False),\n", + " ('Data.IntMap.Strict', True),\n", + " ('Data.IntMap.Strict', False)],\n", + " 'advent06': [('AoC', False), ('Data.List', False)],\n", + " 'advent07': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.Char', False),\n", + " ('Data.Maybe', False),\n", + " ('Data.Tree', False),\n", + " ('Data.Tree.Zipper', False),\n", + " ('Data.Map.Strict', True),\n", + " ('Data.List', False)],\n", + " 'advent08': [('AoC', False), ('Data.List', False)],\n", + " 'advent09': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.List', False),\n", + " ('Data.Set', True),\n", + " ('Linear', False),\n", + " ('Control.Lens', False)],\n", + " 'advent10': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.List', False),\n", + " ('Data.List.Split', False)],\n", + " 'advent11': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.List', False),\n", + " ('Data.IntMap.Strict', True),\n", + " ('Data.IntMap', False),\n", + " ('Control.Lens', False),\n", + " ('Control.Monad.State.Strict', False),\n", + " ('Control.Monad.Reader', False),\n", + " ('Control.Monad.Writer', False),\n", + " ('Control.Monad.RWS.Strict', False)],\n", + " 'advent12': [('AoC', False),\n", + " ('Data.PQueue.Prio.Min', True),\n", + " ('Data.Set', True),\n", + " ('Data.Sequence', True),\n", + " ('Data.Sequence', False),\n", + " ('Data.Foldable', False),\n", + " ('Data.Char', False),\n", + " ('Control.Monad.Reader', False),\n", + " ('Control.Lens', False),\n", + " ('Linear', False),\n", + " ('Data.Array.IArray', False)],\n", + " 'advent13': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.List', False)],\n", + " 'advent14': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Data.List', False),\n", + " ('Data.Ix', False),\n", + " ('Data.Maybe', False),\n", + " ('Data.Set', True),\n", + " ('Linear', False),\n", + " ('Control.Lens', False)],\n", + " 'advent15': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Data.Ix', False),\n", + " ('Data.Set', True),\n", + " ('Linear', False)],\n", + " 'advent16': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.PQueue.Prio.Max', True),\n", + " ('Data.Set', True),\n", + " ('Data.Sequence', True),\n", + " ('Data.Map.Strict', True),\n", + " ('Data.Map.Strict', False),\n", + " ('Data.Sequence', False),\n", + " ('Data.List', False),\n", + " ('Data.List.Split', False),\n", + " ('Data.Ord', False),\n", + " ('Control.Monad.Reader', False),\n", + " ('Control.Lens', False)],\n", + " 'advent17': [('AoC', False),\n", + " ('Data.Set', True),\n", + " ('Linear', False),\n", + " ('Control.Lens', False),\n", + " ('Data.Maybe', False)],\n", + " 'advent18': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Data.Set', True),\n", + " ('Linear', False),\n", + " ('Control.Lens', False),\n", + " ('Data.Ix', False),\n", + " ('Data.Maybe', False)],\n", + " 'advent19': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.PQueue.Prio.Max', True),\n", + " ('Data.Set', True),\n", + " ('Data.Sequence', True),\n", + " ('Data.Map.Strict', True),\n", + " ('Data.Map.Strict', False),\n", + " ('Data.MultiSet', False),\n", + " ('Data.Sequence', False),\n", + " ('Data.List', False),\n", + " ('Data.Maybe', False),\n", + " ('Control.Monad.Reader', False),\n", + " ('Control.Lens', False),\n", + " ('GHC.Generics', False),\n", + " ('Control.Parallel.Strategies', False),\n", + " ('Control.DeepSeq', False)],\n", + " 'advent20': [('AoC', False),\n", + " ('Data.List', False),\n", + " ('Data.Maybe', False),\n", + " ('Data.CircularList', False),\n", + " ('Control.Lens', False)],\n", + " 'advent21': [('AoC', False),\n", + " ('Data.Text', False),\n", + " ('Data.Text.IO', True),\n", + " ('Data.Attoparsec.Text', False),\n", + " ('Control.Applicative', False),\n", + " ('Data.Map.Strict', True),\n", + " ('Data.Map.Strict', False),\n", + " ('Control.Lens', False)],\n", + " 'advent22': [('AoC', False),\n", + " ('Prelude', False),\n", + " ('Data.Map.Strict', True),\n", + " ('Data.Map.Strict', False),\n", + " ('Linear', False),\n", + " ('Control.Lens', False),\n", + " ('Data.Ix', False),\n", + " ('Data.Maybe', False),\n", + " ('Data.Char', False),\n", + " ('Control.Monad.Reader', False)],\n", + " 'advent23': [('AoC', False),\n", + " ('Data.Set', True),\n", + " ('Linear', False),\n", + " ('Control.Lens', False),\n", + " ('Data.Ix', False),\n", + " ('Data.Maybe', False),\n", + " ('Data.Monoid', False),\n", + " ('Data.MultiSet', False),\n", + " ('Control.Monad.State.Strict', False)],\n", + " 'advent24': [('AoC', False),\n", + " ('Data.PQueue.Prio.Min', True),\n", + " ('Data.Set', True),\n", + " ('Data.IntMap.Strict', True),\n", + " ('Data.Sequence', True),\n", + " ('Data.Sequence', False),\n", + " ('Control.Monad.Reader', False),\n", + " ('Control.Lens', False),\n", + " ('Linear', False),\n", + " ('Data.Array.IArray', False),\n", + " ('Data.List', False),\n", + " ('Data.Maybe', False)],\n", + " 'advent25': [('AoC', False), ('Data.List', False)]}" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "main_imports = {}\n", + "\n", + "for m in mains:\n", + " with open(m) as f:\n", + " lines = f.readlines()\n", + " import_lines = [l for l in lines if l.strip().startswith('import') if 'Debug.Trace' not in l]\n", + " imports = []\n", + " for i in import_lines:\n", + " words = i.strip().split()\n", + " if 'qualified' in i:\n", + " imports.append((words[2], True))\n", + " else:\n", + " imports.append((words[1], False))\n", + " main_imports[m.split('/')[1]] = imports\n", + "\n", + "main_imports" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "3260db91-68df-47d3-b4c3-8745ea974033", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(('AoC', False), 25),\n", + " (('Data.List', False), 16),\n", + " (('Data.Text', False), 14),\n", + " (('Data.Text.IO', True), 14),\n", + " (('Data.Attoparsec.Text', False), 14),\n", + " (('Control.Lens', False), 13),\n", + " (('Data.Set', True), 11),\n", + " (('Control.Applicative', False), 10),\n", + " (('Data.Maybe', False), 10),\n", + " (('Linear', False), 9),\n", + " (('Control.Monad.Reader', False), 6),\n", + " (('Data.Map.Strict', True), 5),\n", + " (('Data.Ix', False), 5),\n", + " (('Data.List.Split', False), 4),\n", + " (('Data.Char', False), 4),\n", + " (('Data.Sequence', True), 4),\n", + " (('Data.Sequence', False), 4),\n", + " (('Data.Map.Strict', False), 4),\n", + " (('Data.IntMap.Strict', True), 3),\n", + " (('Data.Ord', False), 2),\n", + " (('Control.Monad.State.Strict', False), 2),\n", + " (('Data.PQueue.Prio.Min', True), 2),\n", + " (('Data.Array.IArray', False), 2),\n", + " (('Data.PQueue.Prio.Max', True), 2),\n", + " (('Data.MultiSet', False), 2),\n", + " (('Data.IntMap.Strict', False), 1),\n", + " (('Data.Tree', False), 1),\n", + " (('Data.Tree.Zipper', False), 1),\n", + " (('Data.IntMap', False), 1),\n", + " (('Control.Monad.Writer', False), 1),\n", + " (('Control.Monad.RWS.Strict', False), 1),\n", + " (('Data.Foldable', False), 1),\n", + " (('GHC.Generics', False), 1),\n", + " (('Control.Parallel.Strategies', False), 1),\n", + " (('Control.DeepSeq', False), 1),\n", + " (('Data.CircularList', False), 1),\n", + " (('Prelude', False), 1),\n", + " (('Data.Monoid', False), 1)]" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import_counts = collections.Counter(l for ls in main_imports.values() for l in ls)\n", + "import_counts.most_common()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "3f683faa-4d1d-4269-a66e-0ea848804e03", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'advent01': {'AoC', 'Data.List', 'Data.List.Split', 'Data.Ord'},\n", + " 'advent02': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent03': {'AoC', 'Data.Char', 'Data.List', 'Data.List.Split', 'Data.Set'},\n", + " 'advent04': {'AoC', 'Data.Attoparsec.Text', 'Data.Text', 'Data.Text.IO'},\n", + " 'advent05': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.IntMap.Strict',\n", + " 'Data.List',\n", + " 'Data.Maybe',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent06': {'AoC', 'Data.List'},\n", + " 'advent07': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.Char',\n", + " 'Data.List',\n", + " 'Data.Map.Strict',\n", + " 'Data.Maybe',\n", + " 'Data.Text',\n", + " 'Data.Text.IO',\n", + " 'Data.Tree',\n", + " 'Data.Tree.Zipper'},\n", + " 'advent08': {'AoC', 'Data.List'},\n", + " 'advent09': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Control.Lens',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.List',\n", + " 'Data.Set',\n", + " 'Data.Text',\n", + " 'Data.Text.IO',\n", + " 'Linear'},\n", + " 'advent10': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.List',\n", + " 'Data.List.Split',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent11': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Control.Lens',\n", + " 'Control.Monad.RWS.Strict',\n", + " 'Control.Monad.Reader',\n", + " 'Control.Monad.State.Strict',\n", + " 'Control.Monad.Writer',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.IntMap',\n", + " 'Data.IntMap.Strict',\n", + " 'Data.List',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent12': {'AoC',\n", + " 'Control.Lens',\n", + " 'Control.Monad.Reader',\n", + " 'Data.Array.IArray',\n", + " 'Data.Char',\n", + " 'Data.Foldable',\n", + " 'Data.PQueue.Prio.Min',\n", + " 'Data.Sequence',\n", + " 'Data.Set',\n", + " 'Linear'},\n", + " 'advent13': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.List',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent14': {'AoC',\n", + " 'Control.Lens',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.Ix',\n", + " 'Data.List',\n", + " 'Data.Maybe',\n", + " 'Data.Set',\n", + " 'Data.Text',\n", + " 'Data.Text.IO',\n", + " 'Linear'},\n", + " 'advent15': {'AoC',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.Ix',\n", + " 'Data.Set',\n", + " 'Data.Text',\n", + " 'Data.Text.IO',\n", + " 'Linear'},\n", + " 'advent16': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Control.Lens',\n", + " 'Control.Monad.Reader',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.List',\n", + " 'Data.List.Split',\n", + " 'Data.Map.Strict',\n", + " 'Data.Ord',\n", + " 'Data.PQueue.Prio.Max',\n", + " 'Data.Sequence',\n", + " 'Data.Set',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent17': {'AoC', 'Control.Lens', 'Data.Maybe', 'Data.Set', 'Linear'},\n", + " 'advent18': {'AoC',\n", + " 'Control.Lens',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.Ix',\n", + " 'Data.Maybe',\n", + " 'Data.Set',\n", + " 'Data.Text',\n", + " 'Data.Text.IO',\n", + " 'Linear'},\n", + " 'advent19': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Control.DeepSeq',\n", + " 'Control.Lens',\n", + " 'Control.Monad.Reader',\n", + " 'Control.Parallel.Strategies',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.List',\n", + " 'Data.Map.Strict',\n", + " 'Data.Maybe',\n", + " 'Data.MultiSet',\n", + " 'Data.PQueue.Prio.Max',\n", + " 'Data.Sequence',\n", + " 'Data.Set',\n", + " 'Data.Text',\n", + " 'Data.Text.IO',\n", + " 'GHC.Generics'},\n", + " 'advent20': {'AoC',\n", + " 'Control.Lens',\n", + " 'Data.CircularList',\n", + " 'Data.List',\n", + " 'Data.Maybe'},\n", + " 'advent21': {'AoC',\n", + " 'Control.Applicative',\n", + " 'Control.Lens',\n", + " 'Data.Attoparsec.Text',\n", + " 'Data.Map.Strict',\n", + " 'Data.Text',\n", + " 'Data.Text.IO'},\n", + " 'advent22': {'AoC',\n", + " 'Control.Lens',\n", + " 'Control.Monad.Reader',\n", + " 'Data.Char',\n", + " 'Data.Ix',\n", + " 'Data.Map.Strict',\n", + " 'Data.Maybe',\n", + " 'Linear',\n", + " 'Prelude'},\n", + " 'advent23': {'AoC',\n", + " 'Control.Lens',\n", + " 'Control.Monad.State.Strict',\n", + " 'Data.Ix',\n", + " 'Data.Maybe',\n", + " 'Data.Monoid',\n", + " 'Data.MultiSet',\n", + " 'Data.Set',\n", + " 'Linear'},\n", + " 'advent24': {'AoC',\n", + " 'Control.Lens',\n", + " 'Control.Monad.Reader',\n", + " 'Data.Array.IArray',\n", + " 'Data.IntMap.Strict',\n", + " 'Data.List',\n", + " 'Data.Maybe',\n", + " 'Data.PQueue.Prio.Min',\n", + " 'Data.Sequence',\n", + " 'Data.Set',\n", + " 'Linear'},\n", + " 'advent25': {'AoC', 'Data.List'}}" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "main_imports_unqualified = {m: set(i[0] for i in main_imports[m]) for m in main_imports}\n", + "main_imports_unqualified" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "e5ff5780-e511-41ab-9207-0cc6bdaecb64", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('AoC', 25),\n", + " ('Data.List', 16),\n", + " ('Data.Text', 14),\n", + " ('Data.Attoparsec.Text', 14),\n", + " ('Data.Text.IO', 14),\n", + " ('Control.Lens', 13),\n", + " ('Data.Set', 11),\n", + " ('Control.Applicative', 10),\n", + " ('Data.Maybe', 10),\n", + " ('Linear', 9),\n", + " ('Control.Monad.Reader', 6),\n", + " ('Data.Map.Strict', 5),\n", + " ('Data.Ix', 5),\n", + " ('Data.List.Split', 4),\n", + " ('Data.Char', 4),\n", + " ('Data.Sequence', 4),\n", + " ('Data.IntMap.Strict', 3),\n", + " ('Data.Ord', 2),\n", + " ('Control.Monad.State.Strict', 2),\n", + " ('Data.PQueue.Prio.Min', 2),\n", + " ('Data.Array.IArray', 2),\n", + " ('Data.PQueue.Prio.Max', 2),\n", + " ('Data.MultiSet', 2),\n", + " ('Data.Tree', 1),\n", + " ('Data.Tree.Zipper', 1),\n", + " ('Control.Monad.Writer', 1),\n", + " ('Control.Monad.RWS.Strict', 1),\n", + " ('Data.IntMap', 1),\n", + " ('Data.Foldable', 1),\n", + " ('Control.DeepSeq', 1),\n", + " ('GHC.Generics', 1),\n", + " ('Control.Parallel.Strategies', 1),\n", + " ('Data.CircularList', 1),\n", + " ('Prelude', 1),\n", + " ('Data.Monoid', 1)]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import_counts_unqualified = collections.Counter(l for ls in main_imports_unqualified.values() for l in ls)\n", + "import_counts_unqualified.most_common()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "e0580f26-9f6d-49f9-83ff-92dbd190aad6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AoCControl.ApplicativeControl.DeepSeqControl.LensControl.Monad.RWS.StrictControl.Monad.ReaderControl.Monad.State.StrictControl.Monad.WriterControl.Parallel.StrategiesData.Array.IArray...Data.PQueue.Prio.MinData.SequenceData.SetData.TextData.Text.IOData.TreeData.Tree.ZipperGHC.GenericsLinearPrelude
advent01TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent02TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent03TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseTrueFalseFalseFalseFalseFalseFalseFalse
advent04TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent05TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent06TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent07TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueTrueTrueFalseFalseFalse
advent08TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent09TrueTrueFalseTrueFalseFalseFalseFalseFalseFalse...FalseFalseTrueTrueTrueFalseFalseFalseTrueFalse
advent10TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent11TrueTrueFalseTrueTrueTrueTrueTrueFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent12TrueFalseFalseTrueFalseTrueFalseFalseFalseTrue...TrueTrueTrueFalseFalseFalseFalseFalseTrueFalse
advent13TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent14TrueFalseFalseTrueFalseFalseFalseFalseFalseFalse...FalseFalseTrueTrueTrueFalseFalseFalseTrueFalse
advent15TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseTrueTrueTrueFalseFalseFalseTrueFalse
advent16TrueTrueFalseTrueFalseTrueFalseFalseFalseFalse...FalseTrueTrueTrueTrueFalseFalseFalseFalseFalse
advent17TrueFalseFalseTrueFalseFalseFalseFalseFalseFalse...FalseFalseTrueFalseFalseFalseFalseFalseTrueFalse
advent18TrueFalseFalseTrueFalseFalseFalseFalseFalseFalse...FalseFalseTrueTrueTrueFalseFalseFalseTrueFalse
advent19TrueTrueTrueTrueFalseTrueFalseFalseTrueFalse...FalseTrueTrueTrueTrueFalseFalseTrueFalseFalse
advent20TrueFalseFalseTrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent21TrueTrueFalseTrueFalseFalseFalseFalseFalseFalse...FalseFalseFalseTrueTrueFalseFalseFalseFalseFalse
advent22TrueFalseFalseTrueFalseTrueFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseTrueTrue
advent23TrueFalseFalseTrueFalseFalseTrueFalseFalseFalse...FalseFalseTrueFalseFalseFalseFalseFalseTrueFalse
advent24TrueFalseFalseTrueFalseTrueFalseFalseFalseTrue...TrueTrueTrueFalseFalseFalseFalseFalseTrueFalse
advent25TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", + "

25 rows × 35 columns

\n", + "
" + ], + "text/plain": [ + " AoC Control.Applicative Control.DeepSeq Control.Lens \\\n", + "advent01 True False False False \n", + "advent02 True True False False \n", + "advent03 True False False False \n", + "advent04 True False False False \n", + "advent05 True True False False \n", + "advent06 True False False False \n", + "advent07 True True False False \n", + "advent08 True False False False \n", + "advent09 True True False True \n", + "advent10 True True False False \n", + "advent11 True True False True \n", + "advent12 True False False True \n", + "advent13 True True False False \n", + "advent14 True False False True \n", + "advent15 True False False False \n", + "advent16 True True False True \n", + "advent17 True False False True \n", + "advent18 True False False True \n", + "advent19 True True True True \n", + "advent20 True False False True \n", + "advent21 True True False True \n", + "advent22 True False False True \n", + "advent23 True False False True \n", + "advent24 True False False True \n", + "advent25 True False False False \n", + "\n", + " Control.Monad.RWS.Strict Control.Monad.Reader \\\n", + "advent01 False False \n", + "advent02 False False \n", + "advent03 False False \n", + "advent04 False False \n", + "advent05 False False \n", + "advent06 False False \n", + "advent07 False False \n", + "advent08 False False \n", + "advent09 False False \n", + "advent10 False False \n", + "advent11 True True \n", + "advent12 False True \n", + "advent13 False False \n", + "advent14 False False \n", + "advent15 False False \n", + "advent16 False True \n", + "advent17 False False \n", + "advent18 False False \n", + "advent19 False True \n", + "advent20 False False \n", + "advent21 False False \n", + "advent22 False True \n", + "advent23 False False \n", + "advent24 False True \n", + "advent25 False False \n", + "\n", + " Control.Monad.State.Strict Control.Monad.Writer \\\n", + "advent01 False False \n", + "advent02 False False \n", + "advent03 False False \n", + "advent04 False False \n", + "advent05 False False \n", + "advent06 False False \n", + "advent07 False False \n", + "advent08 False False \n", + "advent09 False False \n", + "advent10 False False \n", + "advent11 True True \n", + "advent12 False False \n", + "advent13 False False \n", + "advent14 False False \n", + "advent15 False False \n", + "advent16 False False \n", + "advent17 False False \n", + "advent18 False False \n", + "advent19 False False \n", + "advent20 False False \n", + "advent21 False False \n", + "advent22 False False \n", + "advent23 True False \n", + "advent24 False False \n", + "advent25 False False \n", + "\n", + " Control.Parallel.Strategies Data.Array.IArray ... \\\n", + "advent01 False False ... \n", + "advent02 False False ... \n", + "advent03 False False ... \n", + "advent04 False False ... \n", + "advent05 False False ... \n", + "advent06 False False ... \n", + "advent07 False False ... \n", + "advent08 False False ... \n", + "advent09 False False ... \n", + "advent10 False False ... \n", + "advent11 False False ... \n", + "advent12 False True ... \n", + "advent13 False False ... \n", + "advent14 False False ... \n", + "advent15 False False ... \n", + "advent16 False False ... \n", + "advent17 False False ... \n", + "advent18 False False ... \n", + "advent19 True False ... \n", + "advent20 False False ... \n", + "advent21 False False ... \n", + "advent22 False False ... \n", + "advent23 False False ... \n", + "advent24 False True ... \n", + "advent25 False False ... \n", + "\n", + " Data.PQueue.Prio.Min Data.Sequence Data.Set Data.Text \\\n", + "advent01 False False False False \n", + "advent02 False False False True \n", + "advent03 False False True False \n", + "advent04 False False False True \n", + "advent05 False False False True \n", + "advent06 False False False False \n", + "advent07 False False False True \n", + "advent08 False False False False \n", + "advent09 False False True True \n", + "advent10 False False False True \n", + "advent11 False False False True \n", + "advent12 True True True False \n", + "advent13 False False False True \n", + "advent14 False False True True \n", + "advent15 False False True True \n", + "advent16 False True True True \n", + "advent17 False False True False \n", + "advent18 False False True True \n", + "advent19 False True True True \n", + "advent20 False False False False \n", + "advent21 False False False True \n", + "advent22 False False False False \n", + "advent23 False False True False \n", + "advent24 True True True False \n", + "advent25 False False False False \n", + "\n", + " Data.Text.IO Data.Tree Data.Tree.Zipper GHC.Generics Linear \\\n", + "advent01 False False False False False \n", + "advent02 True False False False False \n", + "advent03 False False False False False \n", + "advent04 True False False False False \n", + "advent05 True False False False False \n", + "advent06 False False False False False \n", + "advent07 True True True False False \n", + "advent08 False False False False False \n", + "advent09 True False False False True \n", + "advent10 True False False False False \n", + "advent11 True False False False False \n", + "advent12 False False False False True \n", + "advent13 True False False False False \n", + "advent14 True False False False True \n", + "advent15 True False False False True \n", + "advent16 True False False False False \n", + "advent17 False False False False True \n", + "advent18 True False False False True \n", + "advent19 True False False True False \n", + "advent20 False False False False False \n", + "advent21 True False False False False \n", + "advent22 False False False False True \n", + "advent23 False False False False True \n", + "advent24 False False False False True \n", + "advent25 False False False False False \n", + "\n", + " Prelude \n", + "advent01 False \n", + "advent02 False \n", + "advent03 False \n", + "advent04 False \n", + "advent05 False \n", + "advent06 False \n", + "advent07 False \n", + "advent08 False \n", + "advent09 False \n", + "advent10 False \n", + "advent11 False \n", + "advent12 False \n", + "advent13 False \n", + "advent14 False \n", + "advent15 False \n", + "advent16 False \n", + "advent17 False \n", + "advent18 False \n", + "advent19 False \n", + "advent20 False \n", + "advent21 False \n", + "advent22 True \n", + "advent23 False \n", + "advent24 False \n", + "advent25 False \n", + "\n", + "[25 rows x 35 columns]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_imports = set(m for p in main_imports_unqualified for m in main_imports_unqualified[p])\n", + "imports_df = pd.DataFrame.from_dict(\n", + " {p: {m: m in main_imports_unqualified[p] \n", + " for m in sorted(all_imports)} \n", + " for p in main_imports_unqualified}, \n", + " orient='index').sort_index()\n", + "imports_df" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "3668bdab-5b8f-4ab0-b788-002f0ced7b8c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "| | 0 |\n", + "|:----------------------------|----:|\n", + "| AoC | 25 |\n", + "| Data.List | 16 |\n", + "| Data.Text | 14 |\n", + "| Data.Attoparsec.Text | 14 |\n", + "| Data.Text.IO | 14 |\n", + "| Control.Lens | 13 |\n", + "| Data.Set | 11 |\n", + "| Data.Maybe | 10 |\n", + "| Control.Applicative | 10 |\n", + "| Linear | 9 |\n", + "| Control.Monad.Reader | 6 |\n", + "| Data.Map.Strict | 5 |\n", + "| Data.Ix | 5 |\n", + "| Data.Sequence | 4 |\n", + "| Data.List.Split | 4 |\n", + "| Data.Char | 4 |\n", + "| Data.IntMap.Strict | 3 |\n", + "| Data.Array.IArray | 2 |\n", + "| Control.Monad.State.Strict | 2 |\n", + "| Data.MultiSet | 2 |\n", + "| Data.Ord | 2 |\n", + "| Data.PQueue.Prio.Max | 2 |\n", + "| Data.PQueue.Prio.Min | 2 |\n", + "| Data.Tree | 1 |\n", + "| Data.Tree.Zipper | 1 |\n", + "| GHC.Generics | 1 |\n", + "| Control.DeepSeq | 1 |\n", + "| Data.Monoid | 1 |\n", + "| Data.IntMap | 1 |\n", + "| Data.Foldable | 1 |\n", + "| Data.CircularList | 1 |\n", + "| Control.Parallel.Strategies | 1 |\n", + "| Control.Monad.Writer | 1 |\n", + "| Control.Monad.RWS.Strict | 1 |\n", + "| Prelude | 1 |\n" + ] + } + ], + "source": [ + "print(imports_df.sum().sort_values(ascending=False).to_markdown())" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "3f3e9d52-87b4-4a2d-889d-0bd925f967b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
programmodulepresent
0advent01AoCTrue
17advent01Data.ListTrue
18advent01Data.List.SplitTrue
23advent01Data.OrdTrue
35advent02AoCTrue
............
831advent24Data.SequenceTrue
832advent24Data.SetTrue
838advent24LinearTrue
840advent25AoCTrue
857advent25Data.ListTrue
\n", + "

191 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " program module present\n", + "0 advent01 AoC True\n", + "17 advent01 Data.List True\n", + "18 advent01 Data.List.Split True\n", + "23 advent01 Data.Ord True\n", + "35 advent02 AoC True\n", + ".. ... ... ...\n", + "831 advent24 Data.Sequence True\n", + "832 advent24 Data.Set True\n", + "838 advent24 Linear True\n", + "840 advent25 AoC True\n", + "857 advent25 Data.List True\n", + "\n", + "[191 rows x 3 columns]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imports_scatter = imports_df.stack().reset_index()\n", + "imports_scatter.columns = ['program', 'module', 'present']\n", + "imports_scatter = imports_scatter[imports_scatter.present]\n", + "imports_scatter" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "1b22b8c9-a14f-406d-bd77-ba7d7b3c3ffa", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "imports_scatter.plot.scatter(x='program', y='module', s=80, rot=45, figsize=(10, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "9552d5f9-cc44-4d49-b97e-8961556878c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "35" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imports_df.columns.size" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "fa42c909-7c89-4351-97fd-150138892255", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['AoC', 'Data.List', 'Data.Text', 'Data.Attoparsec.Text',\n", + " 'Data.Text.IO', 'Control.Lens', 'Data.Set', 'Data.Maybe',\n", + " 'Control.Applicative', 'Linear', 'Control.Monad.Reader',\n", + " 'Data.Map.Strict', 'Data.Ix', 'Data.Sequence', 'Data.List.Split',\n", + " 'Data.Char', 'Data.IntMap.Strict', 'Data.Array.IArray',\n", + " 'Control.Monad.State.Strict', 'Data.MultiSet', 'Data.Ord',\n", + " 'Data.PQueue.Prio.Max', 'Data.PQueue.Prio.Min', 'Data.Tree',\n", + " 'Data.Tree.Zipper', 'GHC.Generics', 'Control.DeepSeq',\n", + " 'Data.Monoid', 'Data.IntMap', 'Data.Foldable', 'Data.CircularList',\n", + " 'Control.Parallel.Strategies', 'Control.Monad.Writer',\n", + " 'Control.Monad.RWS.Strict', 'Prelude'], dtype=object)" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted_imports = imports_df.sum().sort_values(ascending=False).index.values\n", + "sorted_imports" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "8d845f2f-4b8f-49cf-92a8-342fd368c71f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AoCData.ListData.TextData.Attoparsec.TextData.Text.IOControl.LensData.SetData.MaybeControl.ApplicativeLinear...GHC.GenericsControl.DeepSeqData.MonoidData.IntMapData.FoldableData.CircularListControl.Parallel.StrategiesControl.Monad.WriterControl.Monad.RWS.StrictPrelude
advent01TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent02TrueFalseTrueTrueTrueFalseFalseFalseTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent03TrueTrueFalseFalseFalseFalseTrueFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent04TrueFalseTrueTrueTrueFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent05TrueTrueTrueTrueTrueFalseFalseTrueTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent06TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent07TrueTrueTrueTrueTrueFalseFalseTrueTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent08TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent09TrueTrueTrueTrueTrueTrueTrueFalseTrueTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent10TrueTrueTrueTrueTrueFalseFalseFalseTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent11TrueTrueTrueTrueTrueTrueFalseFalseTrueFalse...FalseFalseFalseTrueFalseFalseFalseTrueTrueFalse
advent12TrueFalseFalseFalseFalseTrueTrueFalseFalseTrue...FalseFalseFalseFalseTrueFalseFalseFalseFalseFalse
advent13TrueTrueTrueTrueTrueFalseFalseFalseTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent14TrueTrueTrueTrueTrueTrueTrueTrueFalseTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent15TrueFalseTrueTrueTrueFalseTrueFalseFalseTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent16TrueTrueTrueTrueTrueTrueTrueFalseTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent17TrueFalseFalseFalseFalseTrueTrueTrueFalseTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent18TrueFalseTrueTrueTrueTrueTrueTrueFalseTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent19TrueTrueTrueTrueTrueTrueTrueTrueTrueFalse...TrueTrueFalseFalseFalseFalseTrueFalseFalseFalse
advent20TrueTrueFalseFalseFalseTrueFalseTrueFalseFalse...FalseFalseFalseFalseFalseTrueFalseFalseFalseFalse
advent21TrueFalseTrueTrueTrueTrueFalseFalseTrueFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent22TrueFalseFalseFalseFalseTrueFalseTrueFalseTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
advent23TrueFalseFalseFalseFalseTrueTrueTrueFalseTrue...FalseFalseTrueFalseFalseFalseFalseFalseFalseFalse
advent24TrueTrueFalseFalseFalseTrueTrueTrueFalseTrue...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
advent25TrueTrueFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", + "

25 rows × 35 columns

\n", + "
" + ], + "text/plain": [ + " AoC Data.List Data.Text Data.Attoparsec.Text Data.Text.IO \\\n", + "advent01 True True False False False \n", + "advent02 True False True True True \n", + "advent03 True True False False False \n", + "advent04 True False True True True \n", + "advent05 True True True True True \n", + "advent06 True True False False False \n", + "advent07 True True True True True \n", + "advent08 True True False False False \n", + "advent09 True True True True True \n", + "advent10 True True True True True \n", + "advent11 True True True True True \n", + "advent12 True False False False False \n", + "advent13 True True True True True \n", + "advent14 True True True True True \n", + "advent15 True False True True True \n", + "advent16 True True True True True \n", + "advent17 True False False False False \n", + "advent18 True False True True True \n", + "advent19 True True True True True \n", + "advent20 True True False False False \n", + "advent21 True False True True True \n", + "advent22 True False False False False \n", + "advent23 True False False False False \n", + "advent24 True True False False False \n", + "advent25 True True False False False \n", + "\n", + " Control.Lens Data.Set Data.Maybe Control.Applicative Linear \\\n", + "advent01 False False False False False \n", + "advent02 False False False True False \n", + "advent03 False True False False False \n", + "advent04 False False False False False \n", + "advent05 False False True True False \n", + "advent06 False False False False False \n", + "advent07 False False True True False \n", + "advent08 False False False False False \n", + "advent09 True True False True True \n", + "advent10 False False False True False \n", + "advent11 True False False True False \n", + "advent12 True True False False True \n", + "advent13 False False False True False \n", + "advent14 True True True False True \n", + "advent15 False True False False True \n", + "advent16 True True False True False \n", + "advent17 True True True False True \n", + "advent18 True True True False True \n", + "advent19 True True True True False \n", + "advent20 True False True False False \n", + "advent21 True False False True False \n", + "advent22 True False True False True \n", + "advent23 True True True False True \n", + "advent24 True True True False True \n", + "advent25 False False False False False \n", + "\n", + " ... GHC.Generics Control.DeepSeq Data.Monoid Data.IntMap \\\n", + "advent01 ... False False False False \n", + "advent02 ... False False False False \n", + "advent03 ... False False False False \n", + "advent04 ... False False False False \n", + "advent05 ... False False False False \n", + "advent06 ... False False False False \n", + "advent07 ... False False False False \n", + "advent08 ... False False False False \n", + "advent09 ... False False False False \n", + "advent10 ... False False False False \n", + "advent11 ... False False False True \n", + "advent12 ... False False False False \n", + "advent13 ... False False False False \n", + "advent14 ... False False False False \n", + "advent15 ... False False False False \n", + "advent16 ... False False False False \n", + "advent17 ... False False False False \n", + "advent18 ... False False False False \n", + "advent19 ... True True False False \n", + "advent20 ... False False False False \n", + "advent21 ... False False False False \n", + "advent22 ... False False False False \n", + "advent23 ... False False True False \n", + "advent24 ... False False False False \n", + "advent25 ... False False False False \n", + "\n", + " Data.Foldable Data.CircularList Control.Parallel.Strategies \\\n", + "advent01 False False False \n", + "advent02 False False False \n", + "advent03 False False False \n", + "advent04 False False False \n", + "advent05 False False False \n", + "advent06 False False False \n", + "advent07 False False False \n", + "advent08 False False False \n", + "advent09 False False False \n", + "advent10 False False False \n", + "advent11 False False False \n", + "advent12 True False False \n", + "advent13 False False False \n", + "advent14 False False False \n", + "advent15 False False False \n", + "advent16 False False False \n", + "advent17 False False False \n", + "advent18 False False False \n", + "advent19 False False True \n", + "advent20 False True False \n", + "advent21 False False False \n", + "advent22 False False False \n", + "advent23 False False False \n", + "advent24 False False False \n", + "advent25 False False False \n", + "\n", + " Control.Monad.Writer Control.Monad.RWS.Strict Prelude \n", + "advent01 False False False \n", + "advent02 False False False \n", + "advent03 False False False \n", + "advent04 False False False \n", + "advent05 False False False \n", + "advent06 False False False \n", + "advent07 False False False \n", + "advent08 False False False \n", + "advent09 False False False \n", + "advent10 False False False \n", + "advent11 True True False \n", + "advent12 False False False \n", + "advent13 False False False \n", + "advent14 False False False \n", + "advent15 False False False \n", + "advent16 False False False \n", + "advent17 False False False \n", + "advent18 False False False \n", + "advent19 False False False \n", + "advent20 False False False \n", + "advent21 False False False \n", + "advent22 False False True \n", + "advent23 False False False \n", + "advent24 False False False \n", + "advent25 False False False \n", + "\n", + "[25 rows x 35 columns]" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "imports_sorted_cols = imports_df[sorted_imports]\n", + "imports_sorted_cols" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "4b70002e-f12e-4067-b8b8-119504e4d86b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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aROIZY1TwHfA+hrzunXrLjuvuz73sLzSIV3xY2YeqjSvW7fusvO663MD9nRIR0TEdmAVsIuRRxZn5s7S87p16+7WXfNn1z0/9xBXr0hXrAR+AzaN7Etg3AG6kHndunWXndddnxvwSoeIiIj0hD0d0gkRcXNEvB8R3wy2b42IZ2rI69atu+y87vrcM7TtRLWs8xXwIXAHI4/JpXk7ZPF53bp1l53XXZ97WF7pkK5Ynpmfztn3dyV53bp1l53XXZ8b8PaKdMfJiFhL02hERGymeZRuDXndunWXndddn7th0ksjljVOATcC79F0Ox8HPgZuqCGvW7fusvO663MPy9Ur0gkRcXlmnouIq4DLMvNMLXndunWXndddn3uIt1ekK45GxCvAncAvleV169Zddl53fW7ASYd0xy00l+IeoxmsL0fEXZXkdevWXXZed33uhknvx1jWpAVcB7wGnKstr1u37rLzuutye6VDOiMiNkTEDuALYBnwQC153bp1l53XXZ8bfAy6dEREHAW+BN4Cdmfmr7XkdevWXXZed33umfM46ZAuiIiVmXm6xrxu3brLzuuuzz1zHicdMk0i4iUGD485H5n5RKl53bp1+xvVPV33XOzpkGnzGfA5zf2+24Ejg7oNOFd4Xrdu3d26a/7suufnns18ul4t61IF7AWWjmwvBfbWkNetW3fZed31uYfllQ7pitXAipHtqwf7asjr1q277Lzu+twALJk0IDImzwEHImLvYHsDsK2SvG7dusvO667PDdhIKh0SEauBrcAhYDlwIjM/qiGvW7fusvO663MD9nRY3RTwCPA1cIrmXuDvwAc15HXr1l12Xnd97pnzTBqwrHFqMDiXAV8OttcBb9aQ161bd9l53fW5h2UjqXTF2cw8CxARV2bmYZoXBtWQ161bd9l53fW5ARtJpTuORcS1wC5gT0ScAk5UktetW3fZed31uQEbSaUHImIDcA3wTmb+WVNet27dZed11+V20iEiIiK9YE+HiIiI9IKTDhEREekFJx0iIiLSC046REREpBecdIiIiEgv/APSKC9C0fn4twAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cmap = mpl.colors.ListedColormap(['white', 'blue'])\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 10))\n", + "ax.imshow(imports_df.to_numpy().T, cmap=cmap)\n", + "plt.xticks(range(imports_df.index.size), labels=imports_df.index.values, rotation=90);\n", + "plt.yticks(range(imports_df.columns.size), labels=imports_df.columns.values);\n", + "\n", + "ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5);\n", + "plt.savefig('imports.png');" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "280a262c-13d5-44c9-ab5f-9e166a76a2dc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cmap = mpl.colors.ListedColormap(['white', 'blue'])\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 10))\n", + "ax.imshow(imports_sorted_cols.to_numpy().T, cmap=cmap)\n", + "plt.xticks(range(imports_sorted_cols.index.size), labels=imports_sorted_cols.index.values, rotation=90);\n", + "plt.yticks(range(imports_sorted_cols.columns.size), labels=imports_sorted_cols.columns.values);\n", + "\n", + "ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5))\n", + "ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5);\n", + "plt.savefig('imports_sorted.png');" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "684eb890-3729-4d68-a862-798c9ca152ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'3.4.2'" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib as mpl\n", + "mpl.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0c6ccc03-f87d-437f-aecf-e6cf1fcd0698", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md" + }, + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/profiling/modules.md b/profiling/modules.md new file mode 100644 index 0000000..7af56ce --- /dev/null +++ b/profiling/modules.md @@ -0,0 +1,232 @@ +--- +jupyter: + jupytext: + formats: ipynb,md + text_representation: + extension: .md + format_name: markdown + format_version: '1.3' + jupytext_version: 1.11.1 + kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +```python +import os, glob +import collections +import pandas as pd +import numpy as np + +import matplotlib as mpl +import matplotlib.pyplot as plt +%matplotlib inline +``` + +```python +with open('../advent-of-code22.cabal') as f: + build_depends = [l for l in f.readlines() if 'build-depends' in l] +build_depends +``` + +```python +cabal_file = open('../advent-of-code22.cabal').read() +executables = cabal_file.split('executable')[2:] +executables[:3] +``` + +```python +e = executables[1] +e.strip().split('build-depends: ')[1].split(',') +``` + +```python +def extract(line): + parts = line.strip().split('build-depends: ') + name = parts[0].split()[0] + if len(parts) > 1: + depends = [p.strip() for p in parts[1].split('\n')[0].split(',') if 'base' not in p] + else: + depends = [] + return name, depends +``` + +```python +modules = {e: ms for e, ms in [extract(e) for e in executables] if e.endswith(tuple(str(i) for i in range(10)))} +modules +``` + +```python +all_modules = set(m for p in modules for m in modules[p]) +modules_df = pd.DataFrame.from_dict({p: {m: m in modules[p] for m in sorted(all_modules)} for p in modules}, orient='index').sort_index() +modules_df +``` + +```python +print(modules_df.sum().sort_values(ascending=False).to_markdown()) +``` + +```python tags=[] +sorted_modules = modules_df.sum().sort_values(ascending=False).index.values +sorted_modules +``` + +```python tags=[] +modules_sorted_cols = modules_df[sorted_modules] +modules_sorted_cols +``` + +```python +modules_scatter = modules_df.stack().reset_index() +modules_scatter.columns = ['program', 'module', 'present'] +modules_scatter = modules_scatter[modules_scatter.present] +modules_scatter +``` + +```python tags=[] +modules_scatter.plot.scatter(x='program', y='module', s=80, rot=45, figsize=(10, 6)) +``` + +```python +cmap = mpl.colors.ListedColormap(['white', 'blue']) + +fig, ax = plt.subplots(figsize=(10, 10)) +ax.imshow(modules_df.to_numpy().T, cmap=cmap) +plt.xticks(range(modules_df.index.size), labels=modules_df.index.values, rotation=90); +plt.yticks(range(modules_df.columns.size), labels=modules_df.columns.values); + +ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5); +plt.savefig('packages.png'); +``` + +```python +cmap = mpl.colors.ListedColormap(['white', 'blue']) + +fig, ax = plt.subplots(figsize=(10, 10)) +ax.imshow(modules_sorted_cols.to_numpy().T, cmap=cmap) +plt.xticks(range(modules_sorted_cols.index.size), labels=modules_sorted_cols.index.values, rotation=90); +plt.yticks(range(modules_sorted_cols.columns.size), labels=modules_sorted_cols.columns.values); + +ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5); +plt.savefig('packages_sorted.png'); +``` + +```python +mains = list(sorted(f for f in glob.glob('../advent*/Main.hs'))) +mains +``` + +```python +main_imports = {} + +for m in mains: + with open(m) as f: + lines = f.readlines() + import_lines = [l for l in lines if l.strip().startswith('import') if 'Debug.Trace' not in l] + imports = [] + for i in import_lines: + words = i.strip().split() + if 'qualified' in i: + imports.append((words[2], True)) + else: + imports.append((words[1], False)) + main_imports[m.split('/')[1]] = imports + +main_imports +``` + +```python +import_counts = collections.Counter(l for ls in main_imports.values() for l in ls) +import_counts.most_common() +``` + +```python +main_imports_unqualified = {m: set(i[0] for i in main_imports[m]) for m in main_imports} +main_imports_unqualified +``` + +```python +import_counts_unqualified = collections.Counter(l for ls in main_imports_unqualified.values() for l in ls) +import_counts_unqualified.most_common() +``` + +```python +all_imports = set(m for p in main_imports_unqualified for m in main_imports_unqualified[p]) +imports_df = pd.DataFrame.from_dict( + {p: {m: m in main_imports_unqualified[p] + for m in sorted(all_imports)} + for p in main_imports_unqualified}, + orient='index').sort_index() +imports_df +``` + +```python +print(imports_df.sum().sort_values(ascending=False).to_markdown()) +``` + +```python +imports_scatter = imports_df.stack().reset_index() +imports_scatter.columns = ['program', 'module', 'present'] +imports_scatter = imports_scatter[imports_scatter.present] +imports_scatter +``` + +```python tags=[] +imports_scatter.plot.scatter(x='program', y='module', s=80, rot=45, figsize=(10, 10)) +``` + +```python +imports_df.columns.size +``` + +```python tags=[] +sorted_imports = imports_df.sum().sort_values(ascending=False).index.values +sorted_imports +``` + +```python tags=[] +imports_sorted_cols = imports_df[sorted_imports] +imports_sorted_cols +``` + +```python +cmap = mpl.colors.ListedColormap(['white', 'blue']) + +fig, ax = plt.subplots(figsize=(10, 10)) +ax.imshow(imports_df.to_numpy().T, cmap=cmap) +plt.xticks(range(imports_df.index.size), labels=imports_df.index.values, rotation=90); +plt.yticks(range(imports_df.columns.size), labels=imports_df.columns.values); + +ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5); +plt.savefig('imports.png'); +``` + +```python +cmap = mpl.colors.ListedColormap(['white', 'blue']) + +fig, ax = plt.subplots(figsize=(10, 10)) +ax.imshow(imports_sorted_cols.to_numpy().T, cmap=cmap) +plt.xticks(range(imports_sorted_cols.index.size), labels=imports_sorted_cols.index.values, rotation=90); +plt.yticks(range(imports_sorted_cols.columns.size), labels=imports_sorted_cols.columns.values); + +ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.5)) +ax.grid(which='minor', axis='both', linestyle='-', color='silver', linewidth=1.5); +plt.savefig('imports_sorted.png'); +``` + +```python +import matplotlib as mpl +mpl.__version__ +``` + +```python + +``` diff --git a/profiling/modules.png b/profiling/modules.png new file mode 100644 index 0000000..75b2fde Binary files /dev/null and b/profiling/modules.png differ diff --git a/profiling/packages.png b/profiling/packages.png new file mode 100644 index 0000000..a6bd91e Binary files /dev/null and b/profiling/packages.png differ diff --git a/profiling/packages_sorted.png b/profiling/packages_sorted.png new file mode 100644 index 0000000..2988b77 Binary files /dev/null and b/profiling/packages_sorted.png differ diff --git a/profiling/performance.csv b/profiling/performance.csv new file mode 100644 index 0000000..92bd582 --- /dev/null +++ b/profiling/performance.csv @@ -0,0 +1,26 @@ +program,total_alloc,memory,elapsed +advent01,11516576,10488,0.02 +advent02,9613016,11112,0.02 +advent03,6018112,10408,0.02 +advent04,2913824,9040,0.01 +advent05,3396888,9324,0.01 +advent06,5025888,10124,0.02 +advent07,3049136,9192,0.01 +advent08,214597512,12204,0.09 +advent09,39708256,23660,0.06 +advent10,631808,6800,0.01 +advent11,655812832,66664,0.36 +advent12,1598902400,13264,1.09 +advent13,10281760,12300,0.01 +advent14,258169680,15068,0.85 +advent15,126607950592,18101260,137.27 +advent16,296137053800,45628,144.64 +advent17,77649009464,22000,20.67 +advent18,68244096,14060,0.06 +advent19,1964531122296,14295324,1134.12 +advent20,55860434768,13940,15.04 +advent21,351135824,12680,0.4 +advent22,528445105288,15908,0.23 +advent23,26387446504,13628,370.18 +advent24,3268072336,74820,2.74 +advent25,642496,5896,0.01 diff --git a/profiling/performance.md b/profiling/performance.md new file mode 100644 index 0000000..d224b26 --- /dev/null +++ b/profiling/performance.md @@ -0,0 +1,27 @@ +| Program | Total allocations | Max memory | Time | +|----------|------------------:|-----------:|-----:| +| advent01 | 107029176 | 72440 | 0.04 | +| advent02 | 35370072 | 72440 | 0.06 | +| advent03 | 4017640 | 72504 | 0.02 | +| advent04 | 60820368 | 72504 | 0.08 | +| advent05 | 27810256 | 72440 | 0.08 | +| advent06 | 11624856 | 72504 | 0.06 | +| advent07 | 21605440 | 72444 | 0.04 | +| advent08 | 74894192 | 72508 | 0.09 | +| advent09 | 793279616 | 72508 | 0.31 | +| advent10 | 924456 | 72444 | 0.01 | +| advent11 | 35282262592 | 72504 | 16.4 | +| advent12 | 2206400 | 72508 | 0.03 | +| advent13 | 542152 | 72436 | 0.01 | +| advent14 | 259113488 | 72508 | 0.26 | +| advent15 | 6662932672 | 240372 | 1.80 | +| advent16 | 17242880 | 72444 | 0.03 | +| advent17 | 4808712520 | 72444 | 1.42 | +| advent18 | 21509984 | 72444 | 0.04 | +| advent19 | 44456496 | 72504 | 0.11 | +| advent20 | 3860804096 | 72436 | 3.77 | +| advent21 | 9561880 | 72508 | 0.04 | +| advent22 | 3242847728 | 72500 | 1.67 | +| advent23 | 10263690000 | 95500 | 1.56 | +| advent24 | 4352105528 | 72504 | 3.13 | +| advent25 | 39231576 | 72504 | 0.06 | diff --git a/profiling/profiling.ipynb b/profiling/profiling.ipynb new file mode 100644 index 0000000..142d6de --- /dev/null +++ b/profiling/profiling.ipynb @@ -0,0 +1,4081 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 201, + "metadata": { + "Collapsed": "false" + }, + "outputs": [], + "source": [ + "import glob\n", + "import json\n", + "import pandas as pd\n", + "import numpy as np\n", + "import datetime\n", + "import re\n", + "\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! cd .. && cabal install" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "Collapsed": "false", + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - split-0.2.3.5 (lib) (requires build)\n", + " - advent-of-code22-0.1.0.0 (exe:advent01) --enable-profiling (configuration changed)\n", + "Starting split-0.2.3.5 (lib)\n", + "Building split-0.2.3.5 (lib)\n", + "Installing split-0.2.3.5 (lib)\n", + "Completed split-0.2.3.5 (lib)\n", + "Configuring executable 'advent01' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent01' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent01' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent01/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent01/build/advent01/advent01-tmp/Main.dyn_o ) [Data.List.Split changed]\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent01/build/advent01/advent01-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent01/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent01/build/advent01/advent01-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent01/build/advent01/advent01 ...\n", + "66719\n", + "198551\n", + " 19,449,616 bytes allocated in the heap\n", + " 1,325,784 bytes copied during GC\n", + " 408,784 bytes maximum residency (2 sample(s))\n", + " 144,176 bytes maximum slop\n", + " 63 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 3 colls, 3 par 0.002s 0.001s 0.0003s 0.0003s\n", + " Gen 1 2 colls, 1 par 0.002s 0.001s 0.0004s 0.0005s\n", + "\n", + " Parallel GC work balance: 29.84% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.013s ( 0.012s elapsed)\n", + " GC time 0.004s ( 0.002s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.023s ( 0.017s elapsed)\n", + "\n", + " Alloc rate 1,512,211,092 bytes per MUT second\n", + "\n", + " Productivity 56.0% of total user, 69.2% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - attoparsec-0.14.4 (lib:attoparsec-internal) (requires build)\n", + " - attoparsec-0.14.4 (lib) (requires build)\n", + " - advent-of-code22-0.1.0.0 (exe:advent02) --enable-profiling (configuration changed)\n", + "Starting attoparsec-0.14.4 (lib:attoparsec-internal)\n", + "Building attoparsec-0.14.4 (lib:attoparsec-internal)\n", + "Installing attoparsec-0.14.4 (lib:attoparsec-internal)\n", + "Completed attoparsec-0.14.4 (lib:attoparsec-internal)\n", + "Starting attoparsec-0.14.4 (lib)\n", + "Building attoparsec-0.14.4 (lib)\n", + "Installing attoparsec-0.14.4 (lib)\n", + "Completed attoparsec-0.14.4 (lib)\n", + "Configuring executable 'advent02' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent02' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent02' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent02/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent02/build/advent02/advent02-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n", + "\n", + "\u001b[;1madvent02/Main.hs:55:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " match1P :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text [Round]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m55 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmatch1P\u001b[0m\u001b[0m = roundP `sepBy` endOfLine\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:56:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " roundP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Round\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m56 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mroundP\u001b[0m\u001b[0m = Round <$> p1ShapeP <*> (\" \" *> p2ShapeP)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:58:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " match2P :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text [ShapeResult]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmatch2P\u001b[0m\u001b[0m = shapeResultP `sepBy` endOfLine\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:59:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " shapeResultP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text ShapeResult\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m59 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshapeResultP\u001b[0m\u001b[0m = ShapeResult <$> p1ShapeP <*> (\" \" *> resultP)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:61:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " p1ShapeP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m61 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mp1ShapeP\u001b[0m\u001b[0m = aP <|> bP <|> cP\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:62:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " aP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m62 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35maP\u001b[0m\u001b[0m = Rock <$ \"A\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:63:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " bP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m63 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mbP\u001b[0m\u001b[0m = Paper <$ \"B\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:64:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " cP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m64 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcP\u001b[0m\u001b[0m = Scissors <$ \"C\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:66:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " p2ShapeP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m66 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mp2ShapeP\u001b[0m\u001b[0m = xP <|> yP <|> zP\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:67:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " xP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mxP\u001b[0m\u001b[0m = Rock <$ \"X\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:68:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " yP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m68 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35myP\u001b[0m\u001b[0m = Paper <$ \"Y\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:69:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " zP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m69 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mzP\u001b[0m\u001b[0m = Scissors <$ \"Z\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:71:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " resultP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m71 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mresultP\u001b[0m\u001b[0m = xrP <|> yrP <|> zrP\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:72:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " xrP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m72 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mxrP\u001b[0m\u001b[0m = Loss <$ \"X\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:73:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " yrP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m73 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35myrP\u001b[0m\u001b[0m = Draw <$ \"Y\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:74:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " zrP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mzrP\u001b[0m\u001b[0m = Win <$ \"Z\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:77:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " successfulParse1 :: Data.Text.Internal.Text -> [Round]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m77 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse1\u001b[0m\u001b[0m input = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:80:11: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘match’ shadows the existing binding\n", + " imported from ‘Data.Attoparsec.Text’ at advent02/Main.hs:6:1-43\n", + " (and originally defined in ‘attoparsec-0.14.4-6c5af65faab69e2a5d91c97faaf49696df50d10719db2c6a1db14bb260536cd8:Data.Attoparsec.Text.Internal’)\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m80 |\u001b[0m\u001b[0m Right \u001b[;1m\u001b[35mmatch\u001b[0m\u001b[0m -> match\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:82:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " successfulParse2 :: Data.Text.Internal.Text -> [ShapeResult]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m82 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse2\u001b[0m\u001b[0m input = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:85:11: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘match’ shadows the existing binding\n", + " imported from ‘Data.Attoparsec.Text’ at advent02/Main.hs:6:1-43\n", + " (and originally defined in ‘attoparsec-0.14.4-6c5af65faab69e2a5d91c97faaf49696df50d10719db2c6a1db14bb260536cd8:Data.Attoparsec.Text.Internal’)\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m85 |\u001b[0m\u001b[0m Right \u001b[;1m\u001b[35mmatch\u001b[0m\u001b[0m -> match\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent02/build/advent02/advent02-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent02/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent02/build/advent02/advent02-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent02/Main.hs:55:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " match1P :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text [Round]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m55 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmatch1P\u001b[0m\u001b[0m = roundP `sepBy` endOfLine\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:56:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " roundP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Round\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m56 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mroundP\u001b[0m\u001b[0m = Round <$> p1ShapeP <*> (\" \" *> p2ShapeP)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:58:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " match2P :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text [ShapeResult]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmatch2P\u001b[0m\u001b[0m = shapeResultP `sepBy` endOfLine\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:59:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " shapeResultP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text ShapeResult\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m59 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshapeResultP\u001b[0m\u001b[0m = ShapeResult <$> p1ShapeP <*> (\" \" *> resultP)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:61:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " p1ShapeP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m61 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mp1ShapeP\u001b[0m\u001b[0m = aP <|> bP <|> cP\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:62:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " aP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m62 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35maP\u001b[0m\u001b[0m = Rock <$ \"A\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:63:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " bP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m63 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mbP\u001b[0m\u001b[0m = Paper <$ \"B\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:64:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " cP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m64 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcP\u001b[0m\u001b[0m = Scissors <$ \"C\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:66:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " p2ShapeP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m66 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mp2ShapeP\u001b[0m\u001b[0m = xP <|> yP <|> zP\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:67:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " xP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mxP\u001b[0m\u001b[0m = Rock <$ \"X\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:68:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " yP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m68 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35myP\u001b[0m\u001b[0m = Paper <$ \"Y\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:69:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " zP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Shape\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m69 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mzP\u001b[0m\u001b[0m = Scissors <$ \"Z\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:71:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " resultP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m71 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mresultP\u001b[0m\u001b[0m = xrP <|> yrP <|> zrP\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:72:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " xrP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m72 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mxrP\u001b[0m\u001b[0m = Loss <$ \"X\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:73:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " yrP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m73 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35myrP\u001b[0m\u001b[0m = Draw <$ \"Y\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:74:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " zrP :: Data.Attoparsec.Internal.Types.Parser\n", + " Data.Text.Internal.Text Result\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mzrP\u001b[0m\u001b[0m = Win <$ \"Z\"\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:77:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " successfulParse1 :: Data.Text.Internal.Text -> [Round]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m77 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse1\u001b[0m\u001b[0m input = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:80:11: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘match’ shadows the existing binding\n", + " imported from ‘Data.Attoparsec.Text’ at advent02/Main.hs:6:1-43\n", + " (and originally defined in ‘attoparsec-0.14.4-6c5af65faab69e2a5d91c97faaf49696df50d10719db2c6a1db14bb260536cd8:Data.Attoparsec.Text.Internal’)\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m80 |\u001b[0m\u001b[0m Right \u001b[;1m\u001b[35mmatch\u001b[0m\u001b[0m -> match\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:82:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Top-level binding with no type signature:\n", + " successfulParse2 :: Data.Text.Internal.Text -> [ShapeResult]\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m82 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse2\u001b[0m\u001b[0m input = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent02/Main.hs:85:11: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘match’ shadows the existing binding\n", + " imported from ‘Data.Attoparsec.Text’ at advent02/Main.hs:6:1-43\n", + " (and originally defined in ‘attoparsec-0.14.4-6c5af65faab69e2a5d91c97faaf49696df50d10719db2c6a1db14bb260536cd8:Data.Attoparsec.Text.Internal’)\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m85 |\u001b[0m\u001b[0m Right \u001b[;1m\u001b[35mmatch\u001b[0m\u001b[0m -> match\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent02/build/advent02/advent02 ...\n", + "13009\n", + "10398\n", + " 15,142,040 bytes allocated in the heap\n", + " 1,016,576 bytes copied during GC\n", + " 294,736 bytes maximum residency (2 sample(s))\n", + " 143,536 bytes maximum slop\n", + " 63 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 2 colls, 2 par 0.001s 0.001s 0.0004s 0.0004s\n", + " Gen 1 2 colls, 1 par 0.002s 0.001s 0.0003s 0.0003s\n", + "\n", + " Parallel GC work balance: 31.81% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.014s ( 0.013s elapsed)\n", + " GC time 0.003s ( 0.001s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.023s ( 0.017s elapsed)\n", + "\n", + " Alloc rate 1,119,000,702 bytes per MUT second\n", + "\n", + " Productivity 59.2% of total user, 73.6% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent03) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent03' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent03' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent03' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent03/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent03/build/advent03/advent03-tmp/Main.dyn_o ) [Data.List.Split changed]\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent03/build/advent03/advent03-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent03/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent03/build/advent03/advent03-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent03/build/advent03/advent03 ...\n", + "7727\n", + "2609\n", + " 9,004,224 bytes allocated in the heap\n", + " 886,400 bytes copied during GC\n", + " 214,088 bytes maximum residency (1 sample(s))\n", + " 121,784 bytes maximum slop\n", + " 62 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 2 colls, 2 par 0.002s 0.001s 0.0006s 0.0010s\n", + " Gen 1 1 colls, 0 par 0.000s 0.000s 0.0003s 0.0003s\n", + "\n", + " Parallel GC work balance: 24.28% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.007s ( 0.006s elapsed)\n", + " GC time 0.002s ( 0.002s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.015s ( 0.011s elapsed)\n", + "\n", + " Alloc rate 1,362,247,646 bytes per MUT second\n", + "\n", + " Productivity 43.5% of total user, 54.5% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent04) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent04' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent04' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent04' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent04/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent04/build/advent04/advent04-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent04/build/advent04/advent04-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent04/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent04/build/advent04/advent04-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent04/build/advent04/advent04 ...\n", + "513\n", + "878\n", + " 4,443,080 bytes allocated in the heap\n", + " 164,040 bytes copied during GC\n", + " 223,280 bytes maximum residency (1 sample(s))\n", + " 124,880 bytes maximum slop\n", + " 62 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 0 colls, 0 par 0.000s 0.000s 0.0000s 0.0000s\n", + " Gen 1 1 colls, 0 par 0.000s 0.000s 0.0003s 0.0003s\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.005s ( 0.003s elapsed)\n", + " MUT time 0.005s ( 0.005s elapsed)\n", + " GC time 0.000s ( 0.000s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.013s ( 0.009s elapsed)\n", + "\n", + " Alloc rate 853,932,014 bytes per MUT second\n", + "\n", + " Productivity 40.5% of total user, 54.6% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent05) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent05' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent05' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent05' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent05/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent05/build/advent05/advent05-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n", + "\n", + "\u001b[;1madvent05/Main.hs:54:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Pattern match(es) are non-exhaustive\n", + " In a pattern binding: Patterns of type ‘[Crate]’ not matched: []\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m54 |\u001b[0m\u001b[0m where \u001b[;1m\u001b[35m(c:origin) = wharf!from\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent05/build/advent05/advent05-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent05/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent05/build/advent05/advent05-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent05/Main.hs:54:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Pattern match(es) are non-exhaustive\n", + " In a pattern binding: Patterns of type ‘[Crate]’ not matched: []\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m54 |\u001b[0m\u001b[0m where \u001b[;1m\u001b[35m(c:origin) = wharf!from\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent05/build/advent05/advent05 ...\n", + "TGWSMRBPN\n", + "TZLTLWRNF\n", + " 5,094,344 bytes allocated in the heap\n", + " 425,056 bytes copied during GC\n", + " 214,088 bytes maximum residency (1 sample(s))\n", + " 125,880 bytes maximum slop\n", + " 62 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 1 colls, 1 par 0.001s 0.000s 0.0003s 0.0003s\n", + " Gen 1 1 colls, 0 par 0.000s 0.000s 0.0003s 0.0003s\n", + "\n", + " Parallel GC work balance: 49.39% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.005s ( 0.004s elapsed)\n", + " GC time 0.001s ( 0.001s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.012s ( 0.008s elapsed)\n", + "\n", + " Alloc rate 1,061,113,423 bytes per MUT second\n", + "\n", + " Productivity 40.8% of total user, 53.4% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent06) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent06' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent06' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent06' for advent-of-code22-0.1.0.0..\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent06/build/advent06/advent06-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent06/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent06/build/advent06/advent06-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent06/build/advent06/advent06 ...\n", + "1080\n", + "3645\n", + " 7,728,352 bytes allocated in the heap\n", + " 340,432 bytes copied during GC\n", + " 231,824 bytes maximum residency (1 sample(s))\n", + " 132,720 bytes maximum slop\n", + " 61 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 1 colls, 1 par 0.001s 0.000s 0.0002s 0.0002s\n", + " Gen 1 1 colls, 0 par 0.000s 0.000s 0.0003s 0.0003s\n", + "\n", + " Parallel GC work balance: 57.64% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.003s elapsed)\n", + " MUT time 0.004s ( 0.004s elapsed)\n", + " GC time 0.001s ( 0.000s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.012s ( 0.008s elapsed)\n", + "\n", + " Alloc rate 1,749,470,406 bytes per MUT second\n", + "\n", + " Productivity 37.0% of total user, 50.2% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - rosezipper-0.2 (lib:rosezipper) (requires build)\n", + " - advent-of-code22-0.1.0.0 (exe:advent07) --enable-profiling (configuration changed)\n", + "Starting rosezipper-0.2 (all, legacy fallback)\n", + "Building rosezipper-0.2 (all, legacy fallback)\n", + "Installing rosezipper-0.2 (all, legacy fallback)\n", + "Completed rosezipper-0.2 (all, legacy fallback)\n", + "Configuring executable 'advent07' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent07' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent07' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent07/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent07/build/advent07/advent07-tmp/Main.dyn_o )\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent07/build/advent07/advent07-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent07/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent07/build/advent07/advent07-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent07/build/advent07/advent07 ...\n", + "1084134\n", + "6183184\n", + " 4,838,856 bytes allocated in the heap\n", + " 510,704 bytes copied during GC\n", + " 214,088 bytes maximum residency (1 sample(s))\n", + " 125,880 bytes maximum slop\n", + " 63 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 1 colls, 1 par 0.001s 0.000s 0.0005s 0.0005s\n", + " Gen 1 1 colls, 0 par 0.000s 0.000s 0.0004s 0.0004s\n", + "\n", + " Parallel GC work balance: 41.61% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.006s ( 0.006s elapsed)\n", + " GC time 0.001s ( 0.001s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.013s ( 0.010s elapsed)\n", + "\n", + " Alloc rate 792,510,382 bytes per MUT second\n", + "\n", + " Productivity 45.7% of total user, 56.1% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent08) --enable-profiling (first run)\n", + "Configuring executable 'advent08' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent08' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent08' for advent-of-code22-0.1.0.0..\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent08/build/advent08/advent08-tmp/AoC.dyn_o )\n", + "[2 of 2] Compiling Main ( advent08/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent08/build/advent08/advent08-tmp/Main.dyn_o )\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent08/build/advent08/advent08-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent08/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent08/build/advent08/advent08-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent08/build/advent08/advent08 ...\n", + "1823\n", + "211680\n", + " 351,652,392 bytes allocated in the heap\n", + " 11,062,736 bytes copied during GC\n", + " 1,485,704 bytes maximum residency (6 sample(s))\n", + " 138,792 bytes maximum slop\n", + " 63 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 80 colls, 80 par 0.077s 0.025s 0.0003s 0.0069s\n", + " Gen 1 6 colls, 5 par 0.016s 0.004s 0.0007s 0.0013s\n", + "\n", + " Parallel GC work balance: 45.01% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.005s ( 0.003s elapsed)\n", + " MUT time 0.174s ( 0.164s elapsed)\n", + " GC time 0.092s ( 0.029s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.001s ( 0.001s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.273s ( 0.197s elapsed)\n", + "\n", + " Alloc rate 2,024,427,305 bytes per MUT second\n", + "\n", + " Productivity 63.9% of total user, 83.3% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent09) --enable-profiling (first run)\n", + "Configuring executable 'advent09' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent09' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent09' for advent-of-code22-0.1.0.0..\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent09/build/advent09/advent09-tmp/AoC.dyn_o )\n", + "[2 of 2] Compiling Main ( advent09/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent09/build/advent09/advent09-tmp/Main.dyn_o )\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent09/build/advent09/advent09-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent09/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent09/build/advent09/advent09-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent09/build/advent09/advent09 ...\n", + "6243\n", + "2630\n", + " 59,497,800 bytes allocated in the heap\n", + " 40,326,560 bytes copied during GC\n", + " 8,220,544 bytes maximum residency (6 sample(s))\n", + " 2,878,880 bytes maximum slop\n", + " 77 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 7 colls, 7 par 0.029s 0.027s 0.0038s 0.0066s\n", + " Gen 1 6 colls, 5 par 0.054s 0.037s 0.0061s 0.0125s\n", + "\n", + " Parallel GC work balance: 7.47% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.041s ( 0.039s elapsed)\n", + " GC time 0.083s ( 0.063s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.131s ( 0.105s elapsed)\n", + "\n", + " Alloc rate 1,443,718,624 bytes per MUT second\n", + "\n", + " Productivity 31.6% of total user, 36.9% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent10) --enable-profiling (first run)\n", + "Configuring executable 'advent10' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent10' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent10' for advent-of-code22-0.1.0.0..\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent10/build/advent10/advent10-tmp/AoC.dyn_o )\n", + "[2 of 2] Compiling Main ( advent10/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent10/build/advent10/advent10-tmp/Main.dyn_o )\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent10/build/advent10/advent10-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent10/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent10/build/advent10/advent10-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent10/build/advent10/advent10 ...\n", + "15140\n", + "███ ███ ██ ██ ████ ██ ██ ███ \n", + "█ █ █ █ █ █ █ █ █ █ █ █ █ █ \n", + "███ █ █ █ █ █ █ █ █ █ █ █ \n", + "█ █ ███ █ ████ █ █ ██ ████ ███ \n", + "█ █ █ █ █ █ █ █ █ █ █ █ █ \n", + "███ █ ██ █ █ ████ ███ █ █ █ \n", + " \n", + "\n", + " 900,472 bytes allocated in the heap\n", + " 164,040 bytes copied during GC\n", + " 223,280 bytes maximum residency (1 sample(s))\n", + " 124,880 bytes maximum slop\n", + " 62 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 0 colls, 0 par 0.000s 0.000s 0.0000s 0.0000s\n", + " Gen 1 1 colls, 0 par 0.000s 0.000s 0.0005s 0.0005s\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.001s ( 0.001s elapsed)\n", + " GC time 0.000s ( 0.000s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.008s ( 0.005s elapsed)\n", + "\n", + " Alloc rate 680,385,621 bytes per MUT second\n", + "\n", + " Productivity 16.9% of total user, 23.5% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent11) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent11' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent11' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent11' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent11/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent11/build/advent11/advent11-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent11/Main.hs:89:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Pattern match(es) are non-exhaustive\n", + " In an equation for ‘updateWorry’:\n", + " Patterns of type ‘Int’, ‘Expression’, ‘Int -> Int’ not matched:\n", + " _ (Expression Plus (Literal _)) _\n", + " _ (Expression Plus Old) _\n", + " _ (Expression Times (Literal _)) _\n", + " _ (Expression Times Old) _\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m89 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mupdateWorry current (Expression operator operand) threshold\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent11/build/advent11/advent11-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent11/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent11/build/advent11/advent11-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent11/Main.hs:89:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Pattern match(es) are non-exhaustive\n", + " In an equation for ‘updateWorry’:\n", + " Patterns of type ‘Int’, ‘Expression’, ‘Int -> Int’ not matched:\n", + " _ (Expression Plus (Literal _)) _\n", + " _ (Expression Plus Old) _\n", + " _ (Expression Times (Literal _)) _\n", + " _ (Expression Times Old) _\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m89 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mupdateWorry current (Expression operator operand) threshold\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent11/build/advent11/advent11 ...\n", + "112815\n", + "25738411485\n", + " 1,017,483,040 bytes allocated in the heap\n", + " 383,219,896 bytes copied during GC\n", + " 59,332,752 bytes maximum residency (11 sample(s))\n", + " 748,528 bytes maximum slop\n", + " 179 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 231 colls, 231 par 0.216s 0.175s 0.0008s 0.0086s\n", + " Gen 1 11 colls, 10 par 0.733s 0.215s 0.0195s 0.0584s\n", + "\n", + " Parallel GC work balance: 49.26% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.003s elapsed)\n", + " MUT time 0.508s ( 0.467s elapsed)\n", + " GC time 0.860s ( 0.301s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.089s ( 0.088s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 1.464s ( 0.860s elapsed)\n", + "\n", + " Alloc rate 2,004,482,550 bytes per MUT second\n", + "\n", + " Productivity 40.8% of total user, 64.5% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - pqueue-1.4.3.0 (lib) (requires build)\n", + " - advent-of-code22-0.1.0.0 (exe:advent12) --enable-profiling (configuration changed)\n", + "Starting pqueue-1.4.3.0 (lib)\n", + "Building pqueue-1.4.3.0 (lib)\n", + "Installing pqueue-1.4.3.0 (lib)\n", + "Completed pqueue-1.4.3.0 (lib)\n", + "Configuring executable 'advent12' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent12' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent12' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent12/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent12/build/advent12/advent12-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent12/Main.hs:29:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘goal’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m29 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Mountain\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:39:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘cost’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m39 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:81:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘grid’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m81 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m = grid0 // [(s, mkCell 'a'), (g, mkCell 'z')]\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:123:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘grid’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m123 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:123:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘grid’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m123 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:134:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘goal’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m134 |\u001b[0m\u001b[0m do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:139:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘grid’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m139 |\u001b[0m\u001b[0m do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:153:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘goal’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m153 |\u001b[0m\u001b[0m do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent12/build/advent12/advent12-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent12/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent12/build/advent12/advent12-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent12/Main.hs:29:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘goal’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m29 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Mountain\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:39:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘cost’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m39 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:81:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘grid’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m81 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m = grid0 // [(s, mkCell 'a'), (g, mkCell 'z')]\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:123:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘grid’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m123 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:123:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘grid’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m123 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:134:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘goal’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m134 |\u001b[0m\u001b[0m do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:139:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘grid’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m139 |\u001b[0m\u001b[0m do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent12/Main.hs:153:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘goal’ shadows the existing binding\n", + " defined at advent12/Main.hs:29:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m153 |\u001b[0m\u001b[0m do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent12/build/advent12/advent12 ...\n", + "468\n", + "459\n", + " 2,329,680,024 bytes allocated in the heap\n", + " 94,728,104 bytes copied during GC\n", + " 849,440 bytes maximum residency (43 sample(s))\n", + " 186,352 bytes maximum slop\n", + " 62 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 521 colls, 521 par 0.250s 0.156s 0.0003s 0.0014s\n", + " Gen 1 43 colls, 42 par 0.086s 0.028s 0.0007s 0.0016s\n", + "\n", + " Parallel GC work balance: 16.10% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.005s ( 0.003s elapsed)\n", + " MUT time 2.081s ( 1.966s elapsed)\n", + " GC time 0.331s ( 0.179s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.005s ( 0.005s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 2.423s ( 2.154s elapsed)\n", + "\n", + " Alloc rate 1,119,659,454 bytes per MUT second\n", + "\n", + " Productivity 86.0% of total user, 91.5% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent13) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent13' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent13' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent13' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent13/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent13/build/advent13/advent13-tmp/Main.dyn_o )\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent13/build/advent13/advent13-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent13/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent13/build/advent13/advent13-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent13/build/advent13/advent13 ...\n", + "5675\n", + "20383\n", + " 15,983,552 bytes allocated in the heap\n", + " 2,677,272 bytes copied during GC\n", + " 1,145,232 bytes maximum residency (2 sample(s))\n", + " 136,816 bytes maximum slop\n", + " 64 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 2 colls, 2 par 0.003s 0.002s 0.0011s 0.0011s\n", + " Gen 1 2 colls, 1 par 0.004s 0.001s 0.0007s 0.0010s\n", + "\n", + " Parallel GC work balance: 30.00% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.005s ( 0.003s elapsed)\n", + " MUT time 0.016s ( 0.016s elapsed)\n", + " GC time 0.007s ( 0.004s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.030s ( 0.023s elapsed)\n", + "\n", + " Alloc rate 975,509,592 bytes per MUT second\n", + "\n", + " Productivity 55.1% of total user, 67.1% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent14) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent14' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent14' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent14' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent14/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent14/build/advent14/advent14-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent14/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Control.Applicative’ is redundant\n", + " except perhaps to import instances from ‘Control.Applicative’\n", + " To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent14/build/advent14/advent14-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent14/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent14/build/advent14/advent14-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent14/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Control.Applicative’ is redundant\n", + " except perhaps to import instances from ‘Control.Applicative’\n", + " To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent14/build/advent14/advent14 ...\n", + "644\n", + "27324\n", + " 474,666,344 bytes allocated in the heap\n", + " 44,189,776 bytes copied during GC\n", + " 3,669,176 bytes maximum residency (17 sample(s))\n", + " 160,312 bytes maximum slop\n", + " 66 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 99 colls, 99 par 0.047s 0.027s 0.0003s 0.0009s\n", + " Gen 1 17 colls, 16 par 0.080s 0.028s 0.0017s 0.0031s\n", + "\n", + " Parallel GC work balance: 50.21% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.003s elapsed)\n", + " MUT time 1.617s ( 1.592s elapsed)\n", + " GC time 0.112s ( 0.040s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.015s ( 0.015s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 1.751s ( 1.650s elapsed)\n", + "\n", + " Alloc rate 293,505,646 bytes per MUT second\n", + "\n", + " Productivity 93.3% of total user, 97.4% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent15) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent15' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent15' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent15' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent15/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent15/build/advent15/advent15-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent15/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Control.Applicative’ is redundant\n", + " except perhaps to import instances from ‘Control.Applicative’\n", + " To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent15/Main.hs:8:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Data.List’ is redundant\n", + " except perhaps to import instances from ‘Data.List’\n", + " To import instances alone, use: import Data.List()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m8 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Data.List\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent15/Main.hs:12:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Control.Lens’ is redundant\n", + " except perhaps to import instances from ‘Control.Lens’\n", + " To import instances alone, use: import Control.Lens()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m12 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Lens\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent15/Main.hs:25:21: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘p’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m25 |\u001b[0m\u001b[0m mempty = Region (\\\u001b[;1m\u001b[35mp\u001b[0m\u001b[0m -> False)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent15/build/advent15/advent15-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent15/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent15/build/advent15/advent15-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent15/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Control.Applicative’ is redundant\n", + " except perhaps to import instances from ‘Control.Applicative’\n", + " To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent15/Main.hs:8:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Data.List’ is redundant\n", + " except perhaps to import instances from ‘Data.List’\n", + " To import instances alone, use: import Data.List()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m8 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Data.List\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent15/Main.hs:12:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Control.Lens’ is redundant\n", + " except perhaps to import instances from ‘Control.Lens’\n", + " To import instances alone, use: import Control.Lens()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m12 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Lens\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent15/Main.hs:25:21: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘p’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m25 |\u001b[0m\u001b[0m mempty = Region (\\\u001b[;1m\u001b[35mp\u001b[0m\u001b[0m -> False)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent15/build/advent15/advent15 ...\n", + "5147333\n", + "13734006908372\n", + " 189,084,295,488 bytes allocated in the heap\n", + "10,329,767,309,344 bytes copied during GC\n", + " 13,185,529,696 bytes maximum residency (1550 sample(s))\n", + " 64,387,232 bytes maximum slop\n", + " 25723 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 44034 colls, 44034 par 69.955s 59.862s 0.0014s 0.0142s\n", + " Gen 1 1550 colls, 1549 par 18709.588s 6375.071s 4.1129s 9.0665s\n", + "\n", + " Parallel GC work balance: 91.17% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.005s ( 0.003s elapsed)\n", + " MUT time 257.456s (161.075s elapsed)\n", + " GC time 14408.495s (2094.011s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 4371.048s (4340.921s elapsed)\n", + " EXIT time 1.473s ( 0.001s elapsed)\n", + " Total time 19038.476s (6596.011s elapsed)\n", + "\n", + " Alloc rate 734,434,270 bytes per MUT second\n", + "\n", + " Productivity 24.3% of total user, 68.3% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent16) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent16' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent16' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent16' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent16/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent16/build/advent16/advent16-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent16/Main.hs:58:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘benefit’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent16/build/advent16/advent16-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent16/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent16/build/advent16/advent16-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent16/Main.hs:58:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘benefit’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent16/build/advent16/advent16 ...\n", + "1792\n", + "2587\n", + " 436,836,396,688 bytes allocated in the heap\n", + " 48,620,803,928 bytes copied during GC\n", + " 20,171,424 bytes maximum residency (2171 sample(s))\n", + " 351,712 bytes maximum slop\n", + " 97 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 103284 colls, 103284 par 56.327s 37.400s 0.0004s 0.0132s\n", + " Gen 1 2171 colls, 2170 par 47.089s 15.604s 0.0072s 0.0351s\n", + "\n", + " Parallel GC work balance: 31.48% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 224.034s (206.413s elapsed)\n", + " GC time 93.183s ( 42.812s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 10.234s ( 10.192s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 327.457s (259.420s elapsed)\n", + "\n", + " Alloc rate 1,949,862,696 bytes per MUT second\n", + "\n", + " Productivity 71.5% of total user, 83.5% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent17) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent17' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent17' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent17' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent17/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent17/build/advent17/advent17-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent17/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The qualified import of ‘Data.Map.Strict’ is redundant\n", + " except perhaps to import instances from ‘Data.Map.Strict’\n", + " To import instances alone, use: import Data.Map.Strict()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport qualified Data.Map.Strict as M\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:70:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘simSome’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m70 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msimSome\u001b[0m\u001b[0m oneJetCycle n = fromMaybe -1 $ maximumOf (folded . _y) (final ^. chamber)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:74:10: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘rocks’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m simulate \u001b[;1m\u001b[35mrocks\u001b[0m\u001b[0m jets n = (!!n) $ iterate dropFromTop initState\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:74:16: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘jets’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m simulate rocks \u001b[;1m\u001b[35mjets\u001b[0m\u001b[0m n = (!!n) $ iterate dropFromTop initState\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:96:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘chamber’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m96 |\u001b[0m\u001b[0m push \u001b[;1m\u001b[35mchamber\u001b[0m\u001b[0m rock direction \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:106:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘chamber’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m106 |\u001b[0m\u001b[0m fall \u001b[;1m\u001b[35mchamber\u001b[0m\u001b[0m rock \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:143:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘showChamber’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m143 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshowChamber\u001b[0m\u001b[0m chamber = unlines \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:143:13: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘chamber’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m143 |\u001b[0m\u001b[0m showChamber \u001b[;1m\u001b[35mchamber\u001b[0m\u001b[0m = unlines \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent17/build/advent17/advent17-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent17/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent17/build/advent17/advent17-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent17/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The qualified import of ‘Data.Map.Strict’ is redundant\n", + " except perhaps to import instances from ‘Data.Map.Strict’\n", + " To import instances alone, use: import Data.Map.Strict()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport qualified Data.Map.Strict as M\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:70:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘simSome’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m70 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msimSome\u001b[0m\u001b[0m oneJetCycle n = fromMaybe -1 $ maximumOf (folded . _y) (final ^. chamber)\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:74:10: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘rocks’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m simulate \u001b[;1m\u001b[35mrocks\u001b[0m\u001b[0m jets n = (!!n) $ iterate dropFromTop initState\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:74:16: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘jets’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m simulate rocks \u001b[;1m\u001b[35mjets\u001b[0m\u001b[0m n = (!!n) $ iterate dropFromTop initState\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:96:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘chamber’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m96 |\u001b[0m\u001b[0m push \u001b[;1m\u001b[35mchamber\u001b[0m\u001b[0m rock direction \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:106:6: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘chamber’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m106 |\u001b[0m\u001b[0m fall \u001b[;1m\u001b[35mchamber\u001b[0m\u001b[0m rock \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:143:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘showChamber’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m143 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshowChamber\u001b[0m\u001b[0m chamber = unlines \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent17/Main.hs:143:13: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘chamber’ shadows the existing binding\n", + " defined at advent17/Main.hs:22:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m143 |\u001b[0m\u001b[0m showChamber \u001b[;1m\u001b[35mchamber\u001b[0m\u001b[0m = unlines \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent17/build/advent17/advent17 ...\n", + "3211\n", + "1589142857183\n", + " 112,643,551,288 bytes allocated in the heap\n", + " 3,363,497,384 bytes copied during GC\n", + " 4,914,576 bytes maximum residency (500 sample(s))\n", + " 766,208 bytes maximum slop\n", + " 65 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 24300 colls, 24300 par 7.144s 3.060s 0.0001s 0.0112s\n", + " Gen 1 500 colls, 499 par 2.683s 1.091s 0.0022s 0.0114s\n", + "\n", + " Parallel GC work balance: 32.92% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 56.213s ( 52.282s elapsed)\n", + " GC time 9.185s ( 3.513s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.641s ( 0.638s elapsed)\n", + " EXIT time 0.003s ( 0.002s elapsed)\n", + " Total time 66.046s ( 56.437s elapsed)\n", + "\n", + " Alloc rate 2,003,871,640 bytes per MUT second\n", + "\n", + " Productivity 86.1% of total user, 93.8% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent18) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent18' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent18' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent18' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent18/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent18/build/advent18/advent18-tmp/Main.dyn_o )\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent18/build/advent18/advent18-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent18/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent18/build/advent18/advent18-tmp/Main.p_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent18/build/advent18/advent18 ...\n", + "3364\n", + "2006\n", + " 101,387,336 bytes allocated in the heap\n", + " 7,046,080 bytes copied during GC\n", + " 1,772,120 bytes maximum residency (3 sample(s))\n", + " 198,056 bytes maximum slop\n", + " 64 MiB total memory in use (0 MB lost due to fragmentation)\n", + "\n", + " Tot time (elapsed) Avg pause Max pause\n", + " Gen 0 22 colls, 22 par 0.011s 0.007s 0.0003s 0.0015s\n", + " Gen 1 3 colls, 2 par 0.006s 0.001s 0.0005s 0.0005s\n", + "\n", + " Parallel GC work balance: 27.29% (serial 0%, perfect 100%)\n", + "\n", + " TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n", + "\n", + " SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n", + "\n", + " INIT time 0.004s ( 0.002s elapsed)\n", + " MUT time 0.095s ( 0.092s elapsed)\n", + " GC time 0.017s ( 0.008s elapsed)\n", + " RP time 0.000s ( 0.000s elapsed)\n", + " PROF time 0.000s ( 0.000s elapsed)\n", + " EXIT time 0.002s ( 0.001s elapsed)\n", + " Total time 0.118s ( 0.103s elapsed)\n", + "\n", + " Alloc rate 1,068,522,257 bytes per MUT second\n", + "\n", + " Productivity 80.4% of total user, 88.9% of total elapsed\n", + "\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent19) --enable-profiling (configuration changed)\n", + "Configuring executable 'advent19' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent19' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent19' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent19/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent19/build/advent19/advent19-tmp/Main.dyn_o ) [Control.Parallel.Strategies changed]\n", + "\n", + "\u001b[;1madvent19/Main.hs:3:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Debug.Trace’ is redundant\n", + " except perhaps to import instances from ‘Debug.Trace’\n", + " To import instances alone, use: import Debug.Trace()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m3 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Debug.Trace\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Data.Ord’ is redundant\n", + " except perhaps to import instances from ‘Data.Ord’\n", + " To import instances alone, use: import Data.Ord()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Data.Ord\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:56:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘benefit’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m56 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:166:22: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘prevBenefit’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m166 |\u001b[0m\u001b[0m makeAgendum previous \u001b[;1m\u001b[35mprevBenefit\u001b[0m\u001b[0m newState = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:193:24: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘robots’ shadows the existing binding\n", + " defined at advent19/Main.hs:45:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m193 |\u001b[0m\u001b[0m where blueprintify n \u001b[;1m\u001b[35mrobots\u001b[0m\u001b[0m = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n", + "[1 of 2] Compiling AoC ( src/AoC.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent19/build/advent19/advent19-tmp/AoC.p_o )\n", + "[2 of 2] Compiling Main ( advent19/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent19/build/advent19/advent19-tmp/Main.p_o )\n", + "\n", + "\u001b[;1madvent19/Main.hs:3:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Debug.Trace’ is redundant\n", + " except perhaps to import instances from ‘Debug.Trace’\n", + " To import instances alone, use: import Debug.Trace()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m3 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Debug.Trace\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " The import of ‘Data.Ord’ is redundant\n", + " except perhaps to import instances from ‘Data.Ord’\n", + " To import instances alone, use: import Data.Ord()\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Data.Ord\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:56:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘benefit’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m56 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:166:22: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘prevBenefit’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m166 |\u001b[0m\u001b[0m makeAgendum previous \u001b[;1m\u001b[35mprevBenefit\u001b[0m\u001b[0m newState = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent19/Main.hs:193:24: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " This binding for ‘robots’ shadows the existing binding\n", + " defined at advent19/Main.hs:45:1\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m193 |\u001b[0m\u001b[0m where blueprintify n \u001b[;1m\u001b[35mrobots\u001b[0m\u001b[0m = \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent19/build/advent19/advent19 ...\n", + "1199\n" + ] + } + ], + "source": [ + "! cd .. && for i in {01..25}; do cabal run advent${i} --enable-profiling -- +RTS -N -pj -s -hT ; done" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rm: cannot remove '../times.csv': No such file or directory\n", + "rm: cannot remove '../times_raw.csv': No such file or directory\n" + ] + } + ], + "source": [ + "! rm ../times.csv\n", + "! rm ../times_raw.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "Collapsed": "false", + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Up to date\n", + "66719\n", + "198551\n", + "Up to date\n", + "13009\n", + "10398\n", + "Up to date\n", + "7727\n", + "2609\n", + "Up to date\n", + "513\n", + "878\n", + "Up to date\n", + "TGWSMRBPN\n", + "TZLTLWRNF\n", + "Up to date\n", + "1080\n", + "3645\n", + "Up to date\n", + "1084134\n", + "6183184\n", + "Up to date\n", + "1823\n", + "211680\n", + "Up to date\n", + "6243\n", + "2630\n", + "Up to date\n", + "15140\n", + "███ ███ ██ ██ ████ ██ ██ ███ \n", + "█ █ █ █ █ █ █ █ █ █ █ █ █ █ \n", + "███ █ █ █ █ █ █ █ █ █ █ █ \n", + "█ █ ███ █ ████ █ █ ██ ████ ███ \n", + "█ █ █ █ █ █ █ █ █ █ █ █ █ \n", + "███ █ ██ █ █ ████ ███ █ █ █ \n", + " \n", + "\n", + "Up to date\n", + "112815\n", + "25738411485\n", + "Up to date\n", + "468\n", + "459\n", + "Up to date\n", + "5675\n", + "20383\n", + "Up to date\n", + "644\n", + "27324\n", + "Up to date\n", + "5147333\n", + "13734006908372\n", + "Up to date\n", + "1792\n", + "2587\n", + "Up to date\n", + "3211\n", + "1589142857183\n", + "Up to date\n", + "3364\n", + "2006\n", + "Up to date\n", + "1199\n", + "3510\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent20) (file advent20/Main.hs changed)\n", + "Preprocessing executable 'advent20' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent20' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent20/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent20/build/advent20/advent20-tmp/Main.o, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent20/build/advent20/advent20-tmp/Main.dyn_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent20/build/advent20/advent20 ...\n", + "8721\n", + "831878881825\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent21) (file advent21/Main.hs changed)\n", + "Preprocessing executable 'advent21' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent21' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent21/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent21/build/advent21/advent21-tmp/Main.o, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent21/build/advent21/advent21-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent21/Main.hs:38:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Pattern match(es) are non-exhaustive\n", + " In a pattern binding:\n", + " Patterns of type ‘Shout’ not matched: Literal _\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m38 |\u001b[0m\u001b[0m where \u001b[;1m\u001b[35m(Operation _ rootL rootR) = monkeys ! \"root\"\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent21/Main.hs:50:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Pattern match(es) are non-exhaustive\n", + " In an equation for ‘binarySearch’:\n", + " Patterns of type ‘Monkeys’, ‘Monkeys’, ‘Int’, ‘Int’ not matched:\n", + " (Data.Map.Internal.Bin _ _ _ _ _) (Data.Map.Internal.Bin _ _ _ _ _)\n", + " _ _\n", + " (Data.Map.Internal.Bin _ _ _ _ _) Data.Map.Internal.Tip _ _\n", + " Data.Map.Internal.Tip (Data.Map.Internal.Bin _ _ _ _ _) _ _\n", + " Data.Map.Internal.Tip Data.Map.Internal.Tip _ _\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m50 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mbinarySearch values operations lower upper \u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent21/build/advent21/advent21 ...\n", + "21120928600114\n", + "3453748220116\n", + "Up to date\n", + "26558\n", + "110400\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent23) (file advent23/Main.hs changed)\n", + "Preprocessing executable 'advent23' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent23' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent23/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent23/build/advent23/advent23-tmp/Main.o, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent23/build/advent23/advent23-tmp/Main.dyn_o )\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent23/build/advent23/advent23 ...\n", + "4236\n", + "1023\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent24) (file advent24/Main.hs changed)\n", + "Preprocessing executable 'advent24' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent24' for advent-of-code22-0.1.0.0..\n", + "[2 of 2] Compiling Main ( advent24/Main.hs, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent24/build/advent24/advent24-tmp/Main.o, /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent24/build/advent24/advent24-tmp/Main.dyn_o )\n", + "\n", + "\u001b[;1madvent24/Main.hs:53:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘cost’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m53 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m \n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n", + "\n", + "\u001b[;1madvent24/Main.hs:221:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n", + " Defined but not used: ‘showSafe’\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\n", + "\u001b[;1m\u001b[34m221 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshowSafe\u001b[0m\u001b[0m valley = unlines $ reverse rows\n", + "\u001b[;1m\u001b[34m |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent24/build/advent24/advent24 ...\n", + "288\n", + "861\n", + "Build profile: -w ghc-9.2.5 -O1\n", + "In order, the following will be built (use -v for more details):\n", + " - advent-of-code22-0.1.0.0 (exe:advent25) (configuration changed)\n", + "Configuring executable 'advent25' for advent-of-code22-0.1.0.0..\n", + "Preprocessing executable 'advent25' for advent-of-code22-0.1.0.0..\n", + "Building executable 'advent25' for advent-of-code22-0.1.0.0..\n", + "Linking /home/neil/Programming/advent-of-code-22/dist-newstyle/build/x86_64-linux/ghc-9.2.5/advent-of-code22-0.1.0.0/x/advent25/build/advent25/advent25 ...\n", + "20==1==12=0111=2--20\n" + ] + } + ], + "source": [ + "! cd .. && for i in {01..25}; do /usr/bin/time -f \"%C,%S,%E,%M\" -o times.csv -a cabal run advent${i}; done" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "Collapsed": "false", + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "66719\n", + "198551\n", + "13009\n", + "10398\n", + "7727\n", + "2609\n", + "513\n", + "878\n", + "TGWSMRBPN\n", + "TZLTLWRNF\n", + "1080\n", + "3645\n", + "1084134\n", + "6183184\n", + "1823\n", + "211680\n", + "6243\n", + "2630\n", + "15140\n", + "███ ███ ██ ██ ████ ██ ██ ███ \n", + "█ █ █ █ █ █ █ █ █ █ █ █ █ █ \n", + "███ █ █ █ █ █ █ █ █ █ █ █ \n", + "█ █ ███ █ ████ █ █ ██ ████ ███ \n", + "█ █ █ █ █ █ █ █ █ █ █ █ █ \n", + "███ █ ██ █ █ ████ ███ █ █ █ \n", + " \n", + "\n", + "112815\n", + "25738411485\n", + "468\n", + "459\n", + "5675\n", + "20383\n", + "644\n", + "27324\n", + "5147333\n", + "13734006908372\n", + "1792\n", + "2587\n", + "3211\n", + "1589142857183\n", + "3364\n", + "2006\n", + "1199\n", + "3510\n", + "8721\n", + "831878881825\n", + "21120928600114\n", + "3453748220116\n", + "26558\n", + "110400\n", + "4236\n", + "1023\n", + "288\n", + "861\n", + "20==1==12=0111=2--20\n" + ] + } + ], + "source": [ + "! cd .. && for i in {01..25}; do /usr/bin/time -f \"%C,%S,%E,%M\" -o times_raw.csv -a advent${i}; done" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "!mv ../*prof ." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "!mv ../times.csv ." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "!mv ../times_raw.csv ." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "!mv ../*hp ." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/bin/bash: -c: line 1: syntax error near unexpected token `;'\n", + "/bin/bash: -c: line 1: ` for f in *hp ; do hp2ps $<_io.TextIOWrapper name='advent24.prof' mode='r' encoding='UTF-8'> ; done'\n" + ] + } + ], + "source": [ + "! for f in *hp ; do hp2ps ${f} ; done" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['advent13.prof',\n", + " 'advent10.prof',\n", + " 'advent03.prof',\n", + " 'advent07.prof',\n", + " 'advent20.prof',\n", + " 'advent19.prof',\n", + " 'advent01.prof',\n", + " 'advent18.prof',\n", + " 'advent06.prof',\n", + " 'advent09.prof',\n", + " 'advent08.prof',\n", + " 'advent23.prof',\n", + " 'advent21.prof',\n", + " 'advent22.prof',\n", + " 'advent16.prof',\n", + " 'advent25.prof',\n", + " 'advent11.prof',\n", + " 'advent02.prof',\n", + " 'advent15.prof',\n", + " 'advent17.prof',\n", + " 'advent05.prof',\n", + " 'advent12.prof',\n", + " 'advent04.prof',\n", + " 'advent14.prof',\n", + " 'advent24.prof']" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "glob.glob('*prof')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "Collapsed": "false", + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'program': 'advent13',\n", + " 'total_time': 0.08,\n", + " 'total_alloc': 10281760,\n", + " 'total_ticks': 264,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent10',\n", + " 'total_time': 0.01,\n", + " 'total_alloc': 631808,\n", + " 'total_ticks': 48,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent03',\n", + " 'total_time': 0.04,\n", + " 'total_alloc': 6018112,\n", + " 'total_ticks': 120,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent07',\n", + " 'total_time': 0.03,\n", + " 'total_alloc': 3049136,\n", + " 'total_ticks': 108,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent20',\n", + " 'total_time': 116.93,\n", + " 'total_alloc': 55860434768,\n", + " 'total_ticks': 398748,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent19',\n", + " 'total_time': 125807.27,\n", + " 'total_alloc': 1964531122296,\n", + " 'total_ticks': 429011004,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent01',\n", + " 'total_time': 0.06,\n", + " 'total_alloc': 11516576,\n", + " 'total_ticks': 192,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent18',\n", + " 'total_time': 0.36,\n", + " 'total_alloc': 68244096,\n", + " 'total_ticks': 1224,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent06',\n", + " 'total_time': 0.02,\n", + " 'total_alloc': 5025888,\n", + " 'total_ticks': 84,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent09',\n", + " 'total_time': 0.37,\n", + " 'total_alloc': 39708256,\n", + " 'total_ticks': 1248,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent08',\n", + " 'total_time': 0.69,\n", + " 'total_alloc': 214597512,\n", + " 'total_ticks': 2352,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent23',\n", + " 'total_time': 1977.02,\n", + " 'total_alloc': 26387446504,\n", + " 'total_ticks': 6741780,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent21',\n", + " 'total_time': 1.97,\n", + " 'total_alloc': 351135824,\n", + " 'total_ticks': 6720,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent22',\n", + " 'total_time': 3671.94,\n", + " 'total_alloc': 528445105288,\n", + " 'total_ticks': 12521556,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent16',\n", + " 'total_time': 910.42,\n", + " 'total_alloc': 296137053800,\n", + " 'total_ticks': 3104592,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent25',\n", + " 'total_time': 0.01,\n", + " 'total_alloc': 642496,\n", + " 'total_ticks': 48,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent11',\n", + " 'total_time': 3.02,\n", + " 'total_alloc': 655812832,\n", + " 'total_ticks': 10308,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent02',\n", + " 'total_time': 0.06,\n", + " 'total_alloc': 9613016,\n", + " 'total_ticks': 192,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent15',\n", + " 'total_time': 23014.42,\n", + " 'total_alloc': 126607950592,\n", + " 'total_ticks': 78480684,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent17',\n", + " 'total_time': 198.34,\n", + " 'total_alloc': 77649009464,\n", + " 'total_ticks': 676368,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent05',\n", + " 'total_time': 0.02,\n", + " 'total_alloc': 3396888,\n", + " 'total_ticks': 84,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent12',\n", + " 'total_time': 7.58,\n", + " 'total_alloc': 1598902400,\n", + " 'total_ticks': 25836,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent04',\n", + " 'total_time': 0.03,\n", + " 'total_alloc': 2913824,\n", + " 'total_ticks': 96,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent14',\n", + " 'total_time': 5.8,\n", + " 'total_alloc': 258169680,\n", + " 'total_ticks': 19788,\n", + " 'initial_capabilities': 12},\n", + " {'program': 'advent24',\n", + " 'total_time': 18.13,\n", + " 'total_alloc': 3268072336,\n", + " 'total_ticks': 61836,\n", + " 'initial_capabilities': 12}]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "profs = []\n", + "for fn in glob.glob('*prof'):\n", + " with open(fn) as f:\n", + " j = json.load(f)\n", + " prof = {}\n", + " for n in 'program total_time total_alloc total_ticks initial_capabilities'.split():\n", + " prof[n] = j[n]\n", + " profs.append(prof)\n", + "profs" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_timetotal_alloctotal_ticksinitial_capabilities
program
advent010.061151657619212
advent020.06961301619212
advent030.04601811212012
advent040.0329138249612
advent050.0233968888412
advent060.0250258888412
advent070.03304913610812
advent080.69214597512235212
advent090.3739708256124812
advent100.016318084812
advent113.026558128321030812
advent127.5815989024002583612
advent130.081028176026412
advent145.802581696801978812
advent1523014.421266079505927848068412
advent16910.42296137053800310459212
advent17198.347764900946467636812
advent180.3668244096122412
advent19125807.27196453112229642901100412
advent20116.935586043476839874812
advent211.97351135824672012
advent223671.945284451052881252155612
advent231977.0226387446504674178012
advent2418.1332680723366183612
advent250.016424964812
\n", + "
" + ], + "text/plain": [ + " total_time total_alloc total_ticks initial_capabilities\n", + "program \n", + "advent01 0.06 11516576 192 12\n", + "advent02 0.06 9613016 192 12\n", + "advent03 0.04 6018112 120 12\n", + "advent04 0.03 2913824 96 12\n", + "advent05 0.02 3396888 84 12\n", + "advent06 0.02 5025888 84 12\n", + "advent07 0.03 3049136 108 12\n", + "advent08 0.69 214597512 2352 12\n", + "advent09 0.37 39708256 1248 12\n", + "advent10 0.01 631808 48 12\n", + "advent11 3.02 655812832 10308 12\n", + "advent12 7.58 1598902400 25836 12\n", + "advent13 0.08 10281760 264 12\n", + "advent14 5.80 258169680 19788 12\n", + "advent15 23014.42 126607950592 78480684 12\n", + "advent16 910.42 296137053800 3104592 12\n", + "advent17 198.34 77649009464 676368 12\n", + "advent18 0.36 68244096 1224 12\n", + "advent19 125807.27 1964531122296 429011004 12\n", + "advent20 116.93 55860434768 398748 12\n", + "advent21 1.97 351135824 6720 12\n", + "advent22 3671.94 528445105288 12521556 12\n", + "advent23 1977.02 26387446504 6741780 12\n", + "advent24 18.13 3268072336 61836 12\n", + "advent25 0.01 642496 48 12" + ] + }, + "execution_count": 158, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "performance = pd.DataFrame(profs).set_index('program').sort_index()\n", + "performance" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.total_ticks.plot.bar()" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.total_ticks.plot.bar(logy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.total_alloc.plot.bar()" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.total_alloc.plot.bar(logy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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nXfemS233LLdpUjSmFfaIYOenh623XZbdt11V6qu5a5RIjNZt24dPT09TJkypd3lSNKY19ZDHjJzSWbO7erq2uy5l156iUmTJtkYGKUigkmTJtkDJGms6oqIhcUP41Io7ZABYGNglHP/ShrDejNzbruLqFbaIQNJktQ6bW0QFCdjWNLd3X3yUK/ddf71Td32mgXvG/T5Z555hssuu4xTTjll4Iw1a7j99ts54YQTBt/WmjUcfvjhrFy5st/nV6xYwdq1a/nzP/9zAK699lruu+8+5s+fP6w8SZLqVarTJpbJM888w1e/+tVBX7NmzRouu+yyhre1YsUKli5duunxkUceOWBjQJKkkdDWBkFEHBERC3t7e9tZRr/mz5/PL3/5S2bOnMmpp57KqaeeyrRp09h7771ZvHjxptfccsstzJw5k3PPPZc1a9bwrne9i3333Zd9992X22+/fcjtvPzyy5x++uksXryYmTNnsnjxYhYtWsS8efMAeOyxxzjmmGOYMWMGM2bM2CzzoYceYp999mH58uXce++9zJo1i5kzZzJ9+nQefPDB5n8wkqRRqWOGDFptwYIFrFy5khUrVnDVVVdxwQUXcPfdd/Pkk0/y9re/nQMOOIAFCxZwzjnncN111wHw4osvcuONNzJhwgQefPBB5syZw5133jnodsaPH8/nPvc57rzzTs477zwAFi1atOn5T3ziE8yePZurr76a3t5enn/+eZ5++mkA7r//fo4//ni+9rWvMXPmTD7+8Y/zyU9+kr/6q7/i5ZdfpowNLUlSOZX6KIOyuPXWW5kzZw5dXV3ssMMOzJ49m+XLl7Pddtu95nWvvPIK8+bNY8WKFXR1dfHAAw80vO2bbrqJSy+9FICuri4mTpzI008/zRNPPMFRRx3FVVddxdve9jYA/viP/5jPf/7z9PT08P73v5/dd9+94e1LksYGGwQ1qPX0zueeey477LADd999N6+++ioTJkwYsZomTpzILrvswm233bapQXDCCSew//77c/3113PIIYdw4YUX8u53v3vEapA0cvpOpF4zoZ/Jy2eub1E1GgFdZbvaoXMIBrDtttvy3HPPAXDAAQewePFient7eeKJJ1i2bBmzZs16zWsA1q9fz0477cQWW2zB17/+9Zq77PvmVPuzP/szzj//fAB6e3t59tlngcpQwzXXXMOll166aWLjQw89xG677cYnPvEJjjzySH7+858P+/1LkkZUb2bOLUtjADpoDsFQhwk226RJk3jnO9/JtGnTOOyww5g+fTozZswgIjj77LPZcccdmTRpEuPGjWPGjBmceOKJnHLKKRx77LFceeWVHHTQQXR313bdioMOOogFCxYwc+ZMPv3pT7/muS9+8YvMnTuXiy66iK6uLs4//3x22mknALq7u7nuuut4z3veQ3d3N/fddx/f+MY32HLLLdlxxx05/fTTm/65SJJGp9Je7XDVqlXstddebapIreJ+lvrnkMHoVsarHXoeAkmS5KTCVrrhhhs47bTTXrNsypQpXH311W2qSJKkChsELXTIIYdwyCGHtLsMSZI248WNJElSe+cQZOaSzJzb1dXVzjIkSRrznFQoSVKHi4jdIuKiiPh21bKjI+JfI+LfIuK9Q2XYIJAkqYQi4uKIeDwiVvZZfmhE3B8RqyNiPkBmPpSZJ1W/LjOvycyTgROBvxxqe53TIDhzYnNvQ6jl8sdQ+yWQ16xZw7Rp02p6qwOtd/PNN3P44YfXndGf4447joceeqjf5z760Y9y3333Dbr+iSeeyLe//e3Nlvf9PO655x5OPPHEhmqVpDFqEXBo9YKI6AK+AhwGTAXmRMTUIXI+W6wzqM5pELRYsxsEZXLvvffS29vLbrvtttlzvb29XHjhhUydOtT3q399P4+9996bnp4efv3rXw+7XkkaizJzGfBUn8WzgNVFj8DLwOXAUf2tHxX/BHw3M+8aans2CAYwf/58fvnLXzJz5kxOPfVUMpNTTz2VadOmsffee7N48eJNr7vllluYOXMm5557LmvWrOFd73oX++67L/vuuy+33357Tdurd72nnnqKo48+munTp/OOd7xj03ULnn/+eT784Q+z9957M336dK666qrN1v3mN7/JUUf97vuzzTbbcPrpp7P//vtzxx13cOCBB266bPNFF13EHnvswYEHHsjJJ5/MvHnzNq23bNky/uRP/oTddtttU29B388D4IgjjuDyyy+v6XOQpDFiXETcWXWbW+N6k4GHqx73AJMjYlJEXADsExEbz4H/ceBg4LiI+NiQBdVTfbOV+bDDBQsWsHLlSlasWAHAVVddxYoVK7j77rt58sknefvb384BBxzAggULOOecc7juuusAePHFF7nxxhuZMGECDz74IHPmzNn0x3Uw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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance[['total_ticks', 'total_alloc']].plot.bar(\n", + " logy=True, secondary_y=['total_alloc'], \n", + " figsize=(8, 6), title=\"Internal time and memory\")\n", + "plt.savefig('internal_time_and_memory_log.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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5MnMnj2bWbNmccoppwDw+OOPc9RRRzFp0iQmTZq0XuaSJUvYddddWbBgAXfffTdTp05l8uTJTJw4kQcffHDg3xhJUsOVV8J/H7g3M7/ZxWzzgA9FYQ9gRWY+BiwAxkfEuIgYBhxbztulQTss32wzZszgrrvuYtGiRcyZM4fzzz+f22+/nT//+c+89a1vZa+99mLGjBl84xvf4IorrgDghRde4Oqrr2b48OE8+OCDTJ8+nYULF3a7nmHDhnHWWWexcOFCzjnnHABmzZq1dvonP/lJpk2bxty5c1m9ejXPPfccTz/9NAD3338/xx57LD/4wQ+YPHkyn/jEJ/jUpz7F+9//fl5++WVWr17dmDdHktRoewIfBO6MiEXluC8A2wNk5vnAfIqvwS2m+CrcCeW0VRFxCnAlxVfhLsjMu7tb2UbT3GvdcMMNTJ8+nba2NrbaaiumTZvGggUL2HTTTdeZ769//SunnHIKixYtoq2tjQceeKDf677mmmu46KKLAGhra2PMmDE8/fTTPPnkkxxxxBHMmTOHt7zlLQC87W1v4ytf+Qrt7e285z3vYfz48f1evySp+TLzBjo/d147TwIf72LafIrmX5eN5rB8reL969nZZ5/NVlttxe23387ChQt5+eWXG1bTmDFj2G677bjxxhvXjjvuuOOYN28eI0aM4MADD+Saa65p2PolSdWx0ey5jx49mmeffRaAvfbai3//93/nwx/+ME899RTXX389X//613n00UfXzgOwYsUKxo4dyyabbMKFF15Y92Hx2nV19K53vYvzzjuPT3/606xevXrtrXGHDRvG5ZdfzoEHHsioUaM47rjjWLJkCTvuuCOf/OQnWbJkCXfccQf77rtvP98JSc3W2beDlg7v8K2cM1c0qRptDAatuff01bWBtvnmm7PnnnsyYcIEDj74YCZOnMikSZOICL72ta+x9dZbs/nmmzNkyBAmTZrE8ccfz8knn8zRRx/NZZddxj777MPIkSPrWtc+++zDjBkzmDx5Mp///OfXmfbtb3+bk046ie9///u0tbVx3nnnsc022wAwcuRIrrjiCvbff39GjhzJPffcw49+9COGDh3K1ltvzemnnz7g74skqXqi3kPUvTFy5Mhcs0e6xr333stOO+004OtS63AbS51zz736IuKFzKxvD7AJNspz7pIkVdlGc869Ea688ko+97nPrTNu3LhxzJ07d5AqkiTJ5t4vBx54IAceeOBglyFJ0jo8LC9JUsXY3CVJqhibuyRJFWNzlySpYgavuZ85ZmAfPajnlq9Q/21fly5dyoQJE+p6qV0td91113HYYYf1OqMzxxxzDEuWLOl02oknnsg999zT7fLHH388P/3pT9cb3/H9uPPOOzn++OP7VaskqbE2mj33gW7ureTuu+9m9erV7LjjjutNW716Nd/73vfYeeed+5Td8f3YZZddaG9v5+GHH+5zvZKkxtpomnvH+7lnZsPu6Q70ermnnnqKI488kokTJ7LHHntwxx13APDcc89xwgknsMsuuzBx4kTmzJmz3rIXX3wxRxxxxNrhUaNGcfrpp7P77rtz8803s/fee6+9Ve33v/993vSmN7H33nvzsY99bO195gGuv/563v72t7Pjjjuu3Yvv+H4AvPvd7+bSSy+t632QJDXfRvM999r7uQPMmTOHRYsWNeSe7gBbbrllr5Y744wz2HXXXbn88su55ppr+NCHPsSiRYv48pe/zJgxY7jzzjsB1t77vdaNN97I9OnT1w4///zzTJgwgbPOOmud+ZYtW8aXv/xlbrvtNkaPHs2+++7LpEmT1k5/7LHHuOGGG7jvvvs4/PDDOeaYY9Z7PwCmTJnCjBkz+OxnP9vj+yBJar6Nprl31Oh7uvd2uRtuuGHtXvm+++7L8uXLWbFiBb/+9a/X2UvebLPN1lv2scce43Wve93a4ba2No4++uj15vv973/PtGnTeO1rXwvAe9/73nXqOvLII9lkk03Yeeedefzxx7usdcstt2TZsmXdvh5J0uDZaJt7X+7p/sorrzB8+PCGLNdZPRFBZhIR3S47YsQIVq5cuXZ4+PDhtLW11bWOWq961avqmnflypWMGDGi2yxJ0uDZaM65d7zH+l577cXs2bNZvXo1Tz75JNdffz1Tp05db74VK1awzTbbsMkmm/DDH/6w7nu693a5vfbai4svvhgorqLfYost2HTTTTnggAM455xz1s7X2WH5nXbaicWLF/dY09SpU/nNb37D008/zapVqzo9f99RZ/emf+CBB/r0TQFJUnPUveceEW3AQuDRzOz/97eafHvDjvdz/9rXvsbNN9/csHu693a5M888kxNOOIGJEyfy6le/mgsvvBCAL37xi3z84x9nwoQJtLW1ccYZZ/Ce97xn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance[['total_ticks', 'total_alloc']].plot.bar(\n", + " logy=False, secondary_y=['total_alloc'], \n", + " figsize=(8, 6), title=\"Internal time and memory\")\n", + "plt.savefig('internal_time_and_memory_linear.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": {}, + "outputs": [], + "source": [ + "# times = pd.read_csv('times.csv', \n", + "# names=['program', 'system', 'elapsed', 'memory'], \n", + "# index_col='program')\n", + "# times.index = times.index.str.slice(start=len('cabal run '))\n", + "# times.elapsed = pd.to_numeric(times.elapsed.str.slice(start=2))\n", + "# times" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(2022, 12, 26, 23, 59, 59)" + ] + }, + "execution_count": 166, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "today = datetime.date.today()\n", + "today = datetime.datetime(year=today.year, month=today.month, day=today.day) - datetime.timedelta(seconds=1)\n", + "today" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(1900, 1, 1, 0, 0)" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "epoch = datetime.datetime(year=1900, month=1, day=1)\n", + "epoch" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
systemelapsedmemory
program
advent010.000.0210488
advent020.000.0211112
advent030.000.0210408
advent040.000.019040
advent050.010.019324
advent060.010.0210124
advent070.000.019192
advent080.020.0912204
advent090.010.0623660
advent100.000.016800
advent110.070.3666664
advent120.061.0913264
advent130.010.0112300
advent140.010.8515068
advent1520.65137.2718101260
advent1615.74144.6445628
advent173.9420.6722000
advent180.020.0614060
advent1987.221134.1214295324
advent202.8115.0413940
advent210.020.4012680
advent220.020.2315908
advent231.87370.1813628
advent240.242.7474820
advent250.000.015896
\n", + "
" + ], + "text/plain": [ + " system elapsed memory\n", + "program \n", + "advent01 0.00 0.02 10488\n", + "advent02 0.00 0.02 11112\n", + "advent03 0.00 0.02 10408\n", + "advent04 0.00 0.01 9040\n", + "advent05 0.01 0.01 9324\n", + "advent06 0.01 0.02 10124\n", + "advent07 0.00 0.01 9192\n", + "advent08 0.02 0.09 12204\n", + "advent09 0.01 0.06 23660\n", + "advent10 0.00 0.01 6800\n", + "advent11 0.07 0.36 66664\n", + "advent12 0.06 1.09 13264\n", + "advent13 0.01 0.01 12300\n", + "advent14 0.01 0.85 15068\n", + "advent15 20.65 137.27 18101260\n", + "advent16 15.74 144.64 45628\n", + "advent17 3.94 20.67 22000\n", + "advent18 0.02 0.06 14060\n", + "advent19 87.22 1134.12 14295324\n", + "advent20 2.81 15.04 13940\n", + "advent21 0.02 0.40 12680\n", + "advent22 0.02 0.23 15908\n", + "advent23 1.87 370.18 13628\n", + "advent24 0.24 2.74 74820\n", + "advent25 0.00 0.01 5896" + ] + }, + "execution_count": 168, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "times = pd.read_csv('times_raw.csv', \n", + " names=['program', 'system', 'elapsed', 'memory'], \n", + " index_col='program')\n", + "times.elapsed = (pd.to_datetime(times.elapsed, format=\"%M:%S.%f\") - epoch)\n", + "times.elapsed = times.elapsed.apply(lambda x: x.total_seconds())\n", + "times" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "system float64\n", + "elapsed float64\n", + "memory int64\n", + "dtype: object" + ] + }, + "execution_count": 169, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "times.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
systemelapsedmemory
count25.00000025.0000002.500000e+01
mean5.30920073.1176001.313392e+06
std17.799571235.4104424.513418e+06
min0.0000000.0100005.896000e+03
25%0.0000000.0200001.040800e+04
50%0.0200000.0900001.326400e+04
75%0.2400002.7400002.200000e+04
max87.2200001134.1200001.810126e+07
\n", + "
" + ], + "text/plain": [ + " system elapsed memory\n", + "count 25.000000 25.000000 2.500000e+01\n", + "mean 5.309200 73.117600 1.313392e+06\n", + "std 17.799571 235.410442 4.513418e+06\n", + "min 0.000000 0.010000 5.896000e+03\n", + "25% 0.000000 0.020000 1.040800e+04\n", + "50% 0.020000 0.090000 1.326400e+04\n", + "75% 0.240000 2.740000 2.200000e+04\n", + "max 87.220000 1134.120000 1.810126e+07" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "times.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_timetotal_alloctotal_ticksinitial_capabilitiessystemelapsedmemory
program
advent010.0611516576192120.000.0210488
advent020.069613016192120.000.0211112
advent030.046018112120120.000.0210408
advent040.03291382496120.000.019040
advent050.02339688884120.010.019324
advent060.02502588884120.010.0210124
advent070.033049136108120.000.019192
advent080.692145975122352120.020.0912204
advent090.37397082561248120.010.0623660
advent100.0163180848120.000.016800
advent113.0265581283210308120.070.3666664
advent127.58159890240025836120.061.0913264
advent130.0810281760264120.010.0112300
advent145.8025816968019788120.010.8515068
advent1523014.42126607950592784806841220.65137.2718101260
advent16910.4229613705380031045921215.74144.6445628
advent17198.3477649009464676368123.9420.6722000
advent180.36682440961224120.020.0614060
advent19125807.2719645311222964290110041287.221134.1214295324
advent20116.9355860434768398748122.8115.0413940
advent211.973511358246720120.020.4012680
advent223671.9452844510528812521556120.020.2315908
advent231977.02263874465046741780121.87370.1813628
advent2418.13326807233661836120.242.7474820
advent250.0164249648120.000.015896
\n", + "
" + ], + "text/plain": [ + " total_time total_alloc total_ticks initial_capabilities \\\n", + "program \n", + "advent01 0.06 11516576 192 12 \n", + "advent02 0.06 9613016 192 12 \n", + "advent03 0.04 6018112 120 12 \n", + "advent04 0.03 2913824 96 12 \n", + "advent05 0.02 3396888 84 12 \n", + "advent06 0.02 5025888 84 12 \n", + "advent07 0.03 3049136 108 12 \n", + "advent08 0.69 214597512 2352 12 \n", + "advent09 0.37 39708256 1248 12 \n", + "advent10 0.01 631808 48 12 \n", + "advent11 3.02 655812832 10308 12 \n", + "advent12 7.58 1598902400 25836 12 \n", + "advent13 0.08 10281760 264 12 \n", + "advent14 5.80 258169680 19788 12 \n", + "advent15 23014.42 126607950592 78480684 12 \n", + "advent16 910.42 296137053800 3104592 12 \n", + "advent17 198.34 77649009464 676368 12 \n", + "advent18 0.36 68244096 1224 12 \n", + "advent19 125807.27 1964531122296 429011004 12 \n", + "advent20 116.93 55860434768 398748 12 \n", + "advent21 1.97 351135824 6720 12 \n", + "advent22 3671.94 528445105288 12521556 12 \n", + "advent23 1977.02 26387446504 6741780 12 \n", + "advent24 18.13 3268072336 61836 12 \n", + "advent25 0.01 642496 48 12 \n", + "\n", + " system elapsed memory \n", + "program \n", + "advent01 0.00 0.02 10488 \n", + "advent02 0.00 0.02 11112 \n", + "advent03 0.00 0.02 10408 \n", + "advent04 0.00 0.01 9040 \n", + "advent05 0.01 0.01 9324 \n", + "advent06 0.01 0.02 10124 \n", + "advent07 0.00 0.01 9192 \n", + "advent08 0.02 0.09 12204 \n", + "advent09 0.01 0.06 23660 \n", + "advent10 0.00 0.01 6800 \n", + "advent11 0.07 0.36 66664 \n", + "advent12 0.06 1.09 13264 \n", + "advent13 0.01 0.01 12300 \n", + "advent14 0.01 0.85 15068 \n", + "advent15 20.65 137.27 18101260 \n", + "advent16 15.74 144.64 45628 \n", + "advent17 3.94 20.67 22000 \n", + "advent18 0.02 0.06 14060 \n", + "advent19 87.22 1134.12 14295324 \n", + "advent20 2.81 15.04 13940 \n", + "advent21 0.02 0.40 12680 \n", + "advent22 0.02 0.23 15908 \n", + "advent23 1.87 370.18 13628 \n", + "advent24 0.24 2.74 74820 \n", + "advent25 0.00 0.01 5896 " + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "performance = performance.merge(times, left_index=True, right_index=True)\n", + "# performance.drop(index='advent15loop', inplace=True)\n", + "performance" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['total_time', 'total_alloc', 'total_ticks', 'initial_capabilities',\n", + " 'system', 'elapsed', 'memory'],\n", + " dtype='object')" + ] + }, + "execution_count": 172, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "performance.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance.elapsed.plot.bar(\n", + " figsize=(8, 6), title=\"External time\")\n", + "plt.savefig('external_time.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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gAMO4D//8z/JTABuv/12APbZZ581hzruvPNOli5d2pTHLUla/zii0A877LAD//qv/8r+++/PK6+8wqhRo/jOd76zpv/AAw9k3rx5TJ06le22244999xzTd+4ceO466672H333Rk/fjwLFy5k9erVHHbYYTz11FNkJp/97Gd57Wtfy4knnshnPvMZpk6dSmYyadIkfvazn/Hxj3+cI488kqlTp7LLLrswbdq0oXgapOY6eXyn5aeGJo8a6Hyll1dqaTBFx7fVuho3blw+99xza7Xdc889bL/99kOU0cBsvPHGPPvss0OdxpBq5ddPQ8hCYQ0LheEtIv6cmeOGOo8OHnqQJEmVLBSabH0fTZAktRYLBUmSVMlCQZIkVfKqB0mSWkhEnAX8A/BoZu7URf9xwKHl4khge2DzzHw8IpYDzwCrgfbM3KOn/TmiIElSa1kAHFjVmZn/lpm7ZOYuwBeAazPz8YZV9iv7eywSwEJhvfLtb3+bc845p8u+efPmVfZ1WLBgAccee2yXfV/96lfXzL/00kvss88+tLe39z9ZSVKXMvM64PEeVyzMBs4fyP6Gx6GHztdXDzhe61yf3d7ezsiRPb+M7e3tnHXWWdx2221d9n3sYx8bUB5f/epXOeGEEwAYPXo0M2bMYOHChRx66KE9bClJGgwRMZZi5KHxG14CV0REAv+VmfO73LiBIwr9sHz5ct7ylrdw9NFHs9NOO3HooYdy1VVXsffeezNlyhRuvvlmoPo20QsWLGDmzJkcfPDBTJ48mdNPP51vfetb7Lrrruy55548/nhRKC5ZsoQ999yTqVOn8p73vIcnnngCgOnTp3PCCSew7777csoppzB58mRefvllAJ5++mkmTZq0ZrnDL3/5S3bbbbc1RUVjjFNPPZWTTz55zc2nbrnlFqZOncpee+3Fcccdx047/eUQ2MqVKznwwAOZMmUKn//85wE4/vjjef7559lll13WFAYzZ8581R01JUm9MjIiFjdMc/oZ52Dg+k6HHfbOzN2Ag4BjImKfnoJYKPTTsmXL+PSnP83SpUu59957Oe+88/jNb37DN7/5zTXD8FW3iYbiHg3nnXceN998M1/84hcZO3Yst99+O3vttdeaQwCHH344X//611m6dClvfetb19ySGuDJJ5/k2muv5aSTTmL69OlcemnxS20XXHAB73vf+xg1atRa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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['elapsed', 'memory']].plot.bar(\n", + " logy=False, secondary_y=['memory'], \n", + " figsize=(8, 6), title=\"External time and memory\")\n", + "plt.savefig('external_time_and_memory.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jYEkabKIiIcys3v4Z04c5xhIkqQaGwNJklRT5ByD7Xnsscfo6enhkUceaXUpGqHp06czc+ZMpkyZ0upSJElDaLvGoKenh1133ZVZs2ZRvd672kBmcvfdd9PT08Ps2bNbXY4kaQhttyvhkUceYffdd7cpaDMRwe677+5IjyQVru0aA8CmoE35vklS+dqyMSjRrFmz+OMf/9j0112wYAFXX311019XktSZ2m6OwUCzlq4d17zNy44d1zxJktqJIwaj8OUvf5n58+ez//778y//8i/09fVt8/iiRYs46KCDeP7zn8/y5f99ifZddtmFd7/73Rx44IEcfvjh3HXXXQCcc845zJ07l3nz5nHCCScA8OCDD/LGN76Rgw8+mAMOOIBvfetbADz88MOccMIJzJs3j+OPP56HH275SbIkSeOnKyKWV88A3BJtP2LQbBs3bmTVqlVceeWVTJkyhbe+9a185Stf2eY5K1as4ClPeQoPP/wwBx98MK961avYfffdefDBBznwwAP55Cc/yb//+7/zoQ99iHPPPZdly5bx29/+lmnTprF161YAPvrRj/J3f/d3rFixgq1btzJ//nyOOOIIPv/5z7Pzzjtz/fXXc/3113PggQe24LcgSZogfZm5pJUF2BiM0Pe//31+8YtfcPDBBwOVb/BPe9rTtnnOOeecwze+8Q0AtmzZwm9+8xt23313dthhB44//ngAXvva1/LKV74SgHnz5nHiiSeyaNEiFi1aBMD3vvc9Vq9ezSc+8QmgcjTG73//e9avX8/b3/722nbz5s2b8J9ZkjR5NK0xiIh9gHcATwW+n5mfa9Zrj6fM5PWvfz1nnXXWNutXrlwJwA9/+EMuv/xyrrrqKnbeeWcWLFgw5CF6/bP0165dy/r161m9ejUf/vCHuemmm8hMvva1r7H33nsPuZ0kSeNtTHMMImJFRNwZETcOWH90RNwSEZsiYilAZm7MzDcDrwZeMJbXbaXDDz+cyy67jDvvvBOAe+65h9/97ne1x++77z522203dt55Z26++WZ++tOf1h57/PHHueyyywC46KKLePGLX8zjjz/Oli1beOlLX8rHP/5xtm7dygMPPMBRRx3FZz7zGfovcnXttdcC8JKXvKS26+LGG2/k+uuvb8rPLbXUGTO2vU1is5au3eYmjbexjhisBM4FLuhfERFdwHnAy4AeYENErM7MX0XEPwBLq9u0pblz5/KRj3yEI488kscff5wpU6Zw3nnn1R4/+uijOf/885k3bx577703hxxySO2x7u5ubrrpJg466CBmzJjBqlWr6Ovr47WvfS333Xcfmcm73vUunvzkJ3P66afzzne+k3nz5pGZzJo1i29/+9u85S1v4aSTTmLevHnsv//+zJ8/vxW/BklShxrzZZcjYhbw7czct7p8KHBGZh5VXf5XgMw8q26btZk57HGBg112eePGjeyzzz5jqrlVdtllFx544IFWl9FS7fz+qYUGjhKccV9r6ijAwFECD7HuLCVcdnki5hjsCWypW+4BXhgRC4BXAtOAdUNtHBFLgCUAU6dOnYDyJEnSUCaiMRhsZlxm5g+BHw63cWYuB5ZDZcRgXCtrsck+WiBJKt9EnOCoB9irbnkmcPsEvI4kSRpnE9EYbADmRMTsiJgKnACsHklARCyMiOUDzygoSZIm1lgPV7wYuArYOyJ6IuLkzOwFTgW+C2wELs3Mm0aSm5lrMnNJV1fXWMqTJEkjNKY5Bpm5eIj169jOBENJklSmIi+i5K6E8ffpT3+aCy64YNDHzj///CEf67dy5UpOPfXUQR8788wza/cfffRRXvKSl9Db2zv6YiU1zpM/aZwVea2EzFwDrOnu7j5l2CeP9/8IbXR8dG9vLzvuOPxb2Nvby4oVK7jmmmsGfezNb37zmOo488wzed/73gdUDjE9/PDDWbVqFSeeeOKYciVJzVfkiEHJNm/ezPOe9zze9KY3se+++3LiiSdy+eWX86IXvYg5c+bw85//HBj6sskrV65k0aJFLFy4kNmzZ3PuuefyqU99igMOOIBDDjmEe+65B4DrrruOQw45hHnz5vGKV7yCe++9F4AFCxbwvve9j8MOO4yPfvSjzJ49m8ceewyAP/3pT8yaNau23O8HP/gBBx54YK2JqM84++yzOeOMM2oXa9qwYQPz5s3j0EMP5bTTTmPfffet5dx+++0cffTRzJkzh/e85z0ALF26lIcffpj999+/1ggsWrToCVeclCS1hyIbg9J3JWzatIl3vOMdXH/99dx8881cdNFF/OQnP+ETn/hEbVi9/7LJGzZs4IorruC0006j/yyON954IxdddBE///nPef/738/OO+/Mtddey6GHHlob0n/d617Hxz72Ma6//nr2228/PvShD9Vef+vW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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['elapsed', 'memory']].plot.bar(\n", + " logy=True, secondary_y=['memory'], \n", + " figsize=(8, 6), title=\"External time and memory\")\n", + "plt.savefig('external_time_and_memory_log.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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gAMO4D//8z/JTABuv/12APbZZ581hzruvPNOli5d2pTHLUla/zii0A877LAD//qv/8r+++/PK6+8wqhRo/jOd76zpv/AAw9k3rx5TJ06le22244999xzTd+4ceO466672H333Rk/fjwLFy5k9erVHHbYYTz11FNkJp/97Gd57Wtfy4knnshnPvMZpk6dSmYyadIkfvazn/Hxj3+cI488kqlTp7LLLrswbdq0oXgapOY6eXyn5aeGJo8a6Hyll1dqaTBFx7fVuho3blw+99xza7Xdc889bL/99kOU0cBsvPHGPPvss0OdxpBq5ddPQ8hCYQ0LheEtIv6cmeOGOo8OHnqQJEmVLBSabH0fTZAktRYLBUmSVMlCQZIkVfKqB0mSWkhEnAX8A/BoZu7URf9xwKHl4khge2DzzHw8IpYDzwCrgfbM3KOn/TmiIElSa1kAHFjVmZn/lpm7ZOYuwBeAazPz8YZV9iv7eywSwEJhvfLtb3+bc845p8u+efPmVfZ1WLBgAccee2yXfV/96lfXzL/00kvss88+tLe39z9ZSVKXMvM64PEeVyzMBs4fyP6Gx6GHztdXDzhe61yf3d7ezsiRPb+M7e3tnHXWWdx2221d9n3sYx8bUB5f/epXOeGEEwAYPXo0M2bMYOHChRx66KE9bClJGgwRMZZi5KHxG14CV0REAv+VmfO73LiBIwr9sHz5ct7ylrdw9NFHs9NOO3HooYdy1VVXsffeezNlyhRuvvlmoPo20QsWLGDmzJkcfPDBTJ48mdNPP51vfetb7Lrrruy55548/nhRKC5ZsoQ999yTqVOn8p73vIcnnngCgOnTp3PCCSew7777csoppzB58mRefvllAJ5++mkmTZq0ZrnDL3/5S3bbbbc1RUVjjFNPPZWTTz55zc2nbrnlFqZOncpee+3Fcccdx047/eUQ2MqVKznwwAOZMmUKn//85wE4/vjjef7559lll13WFAYzZ8581R01JUm9MjIiFjdMc/oZ52Dg+k6HHfbOzN2Ag4BjImKfnoJYKPTTsmXL+PSnP83SpUu59957Oe+88/jNb37DN7/5zTXD8FW3iYbiHg3nnXceN998M1/84hcZO3Yst99+O3vttdeaQwCHH344X//611m6dClvfetb19ySGuDJJ5/k2muv5aSTTmL69OlcemnxS20XXHAB73vf+xg1atRa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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['elapsed', 'memory']].plot.bar(\n", + " logy=False, secondary_y=['memory'], \n", + " figsize=(8, 6), title=\"External time and memory\")\n", + "plt.savefig('external_time_and_memory_linear.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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/RwxkCSpxRwxkCQ1xYsvvkhPTw9r165tdymqw5gxYxg3bhybb755u0upm4cSJKmD9PT0sM022zB+/HgqC2OqrDKTJ554gp6eHnbaaad2l1O3tp4qkZkLM3NmV1dXO8uQpI6xdu1atttuOzsFHSAi2G677TpudKeU51BKkgZmp6BzdOJn5aEESZJU1daOQXFRh4Xd3d0ntLMOSepU42dd1dS8FbMPHfT5p59+mosvvphPfepTA2esWMHPf/5zjj322MH3tWIFhx12GHfffXe/z99+++2sWrWK973vfQAsWLCAe+65h1mzZg0rT/XxUIIkqW5PP/003/zmNwd9zYoVK7j44osb3tftt9/OokWLqo/f//73D9gpUPO0tWMQEYdHxJze3t52liFJqtOsWbP47//+b6ZMmcJnP/tZPvvZzzJp0iTe/va3M3/+/OprbrjhBqZMmcLXvvY1VqxYwTvf+U723HNP9txzT37+859vcD8vvPACp5xyCvPnz2fKlCnMnz+fefPmceKJJwLwyCOP8IEPfIDdd9+d3Xff/RWZDzzwAHvssQdLlixh2bJlTJ06lSlTpjB58mTuv//+5r8xGxEPJUiS6jZ79mzuvvtubr/9di6//HLOO+887rjjDh5//HH22Wcf3vWudzF79my++tWvcuWVVwLw3HPPcc011zBmzBjuv/9+ZsyYwdKlSwfdz+jRo/mnf/onli5dytlnnw3AvHnzqs+fdNJJTJs2jR/+8If09vayZs0annrqKQDuu+8+jjnmGL797W8zZcoU/vZv/5ZPf/rTfOQjH+GFF17AP0YH5wWOJEnDcuONNzJjxgy6urp4/etfz7Rp01iyZAnbbrvty1734osvcuKJJ3L77bfT1dXFb37zm4b3fe2113LhhRcC0NXVxdixY3nqqad47LHHOOKII7j88st529veBsA73vEOTj/9dHp6ejjqqKOYMGFCw/svm4jYDfg0sD3w08w8d7hZdgwkqYT6TipcMaYykW+32sbTVreuoH7Ue0n9r33ta7z+9a/njjvu4KWXXmLMmDEjVtPYsWPZcccduemmm6odg2OPPZZ9992Xq666ikMOOYTzzz+fd7/73SNWQ7NExFzgMODRzJxU0z4dOBPoAs7PzNmZeS/wyYjYDPj3RvbrHANJUt222WYbnnnmGQDe9a53MX/+fHp7e3nsscdYvHgxU6dOfdlrAFavXs0b3/hGNttsM77zne/UPZTfN6fWgQceyLnnVv4o7u3t5fe//z1QOQRxxRVXcOGFF1YnQD7wwAPsvPPOnHTSSbz//e/nzjvvHPbP32LzgOm1DRHRBZwDvBeYCMyIiInFc+8HbgR+2shOnWMgSR1sQ6cXNtt2223Hn/3ZnzFp0iTe+973MnnyZHbffXcigjPOOIM3vOENbLfddowaNYrdd9+d4447jk996lMcffTRfP/73+eAAw6gu7u+tYMOOOAAZs+ezZQpU/j85z//sufOPPNMZs6cyQUXXEBXVxfnnnsub3zjGwHo7u7myiuv5OCDD6a7u5t77rmHiy66iM0335w3vOENnHLKKU1/X0ZCZi6OiPF9mqcCyzPzAYCIuBQ4ArgnMxcACyLiKmDYp4W4uqIkldBAhxJeps2HElSfe++9l912e9lBICLiBeCumqY5mTmn77ZFx+DK9YcSIuKDwPTM/ETx+C+AfYHLgKOALYA7M/Oc4dbrHANJklpvXWbuPYzt+rvGcmbm9cD1DVVUsGMgSWqrq6++ms997nMva9tpp5344Q9/2KaKSq0H2LHm8ThgVTN3YMdAktRWhxxyCIcccki7y2i1roiYAyws5tvVawkwISJ2Ah4CjgEGv/b0ELmIkiRJrdebmTMHe0FEXALsD2wfET3AqZl5QUScCFxN5XTFuZm5rJmFeVaCJEkllJkzBmhfBCzq77lmcBElSZJarysi5hQj56Vix0CS1BTjx4/n8ccfb/l+999//wHXXvjgBz/IAw880O9zn/jEJ7jnnnsGzT7uuOO47LLLXtHedwXJu+66i+OOO67+ootDCUOcX9ASTj6UpE522tgm520810ZYtmwZvb297Lzzzq94rre3l/PPP3/Y2es7BsceW5n39/a3v52enh4efPBB3vzmNw87twwcMZAkDclFF11UXcb4r//6r/u9xPGRRx7JXnvtxdve9jbmzPnf6/ZsvfXW/N3f/R177rknBx54II899hgAZ511FhMnTmTy5Mkcc8wxADz77LN8/OMfZ5999mGPPfbgRz/6EQDPP/88xxxzDJMnT+bDH/4wzz//fL91fve73+WII4542b5POeUU9t13X26++eaXjTRccMEF7LLLLuy///6ccMIJ1eWdARYvXsyf/umfsvPOO1dHD/ouLQ1w+OGHc+mll9b7NnooQZLU+e69917mz5/PTTfdVF0t8bvf/e4rXjd37lxuueUWli5dyllnncUTTzwBVH7Z77nnntx6661MmzaNL37xi0BlOefbbruNO++8k/POOw+A008/nXe/+90sWbKE6667js9+9rM8++yznHvuuWy11VbceeedfOELX+CWW27pt9abbrqJvfbaq/r42WefZdKkSfzyl79kv/32q7avWrWKL33pS/ziF7/gmmuu4de//vXLch5++GFuvPFGrrzySmbNmlWt953vfCe33347n/nMZwDYe++9ueGGG+p9Kz2U0B9PV5SkzvLTn/6UW265hX322Qeo/PX+ute97hWvO+uss6oXKFq5ciX3338/2223HZttthkf/vCHAfjoRz/KUUcdBcDkyZP5yEc+wpFHHsmRRx4JwI9//GMWLFjAV7/6VQDWrl3Lgw8+yOLFiznppJOq202ePLnfWh9++GFe+9rXVh93dXVx9NFHv+J1v/rVr5g2bRqvec1rAPjQhz70sqWhjzzySDbbbDMmTpzII488MuB787rXvY5Vq5p6raG28HRFSVLdMpO/+qu/4itf+cqAr7n++uv5yU9+ws0338xWW23F/vvvz9q1a/t9bUTlCr9XXXUVixcvZsGCBXzpS19i2bJlZCaXX345u+6664DbDWbLLbd82X7HjBlDV1dXvz/TYGr/eB3stWvXrmXLLbfcYF1l56EESVLdDjzwQC677DIeffRRAJ588kl+97vfvew1q1ev5tWvfjVbbbUVv/71r/nFL35Rfe6ll16qHqe/+OKL2W+//XjppZdYuXIlBxxwAGeccQZPP/00a9as4ZBDDuEb3/hG9ZfxbbfdBlSWe15/+OLuu+8ecBnl3XbbjeXLl2/wZ5o6dSo/+9nPeOqpp1i3bh2XX375Brfpb0no3/zmN0yaNGmD2xacYyBJ6nwTJ07ky1/+Mu95z3uYPHkyBx98MA8//PDLXjN9+nTWrVvH5MmTOfnkk/mTP/mT6nPd3d0sW7aMvfbai2uvvZZTTjmF3t5ePvrRj/L2t7+dPfbYg8985jO86lWv4uSTT+bFF19k8uTJTJo0iZNPPhmAv/mbv2HNmjVMnjyZM844g6lTp/Zb66GHHsr111+/wZ9phx124B/+4R/Yd999Oeigg5g4cSJjxw5+tsfkyZOrS0uvn3x43XXXceihdS+D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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['total_ticks', 'elapsed']].plot.bar(\n", + " logy=True, secondary_y=['elapsed'], \n", + " figsize=(8, 6), title=\"Internal vs external time\")\n", + "plt.savefig('internal_external_time.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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OTIiNgUezMxX/SOLiFnURuwuKG4/DLy1GDwjSZK6qGV7zZn5d+CRiDgCVv/wxuhi9nzggGL6rtS+VvREq2qTJKmqmrZHHxG/APajNtr2MWqfYV4PnEPt0NkA4NLM/HpEjAD+L7WRsgl8KTOvaUphkiStR5p66F6SJPUuB7xJklRhNnpJkiqsKT+Ys8EGG+SgQYOaES1JUuk8//zzmZml3HluSqMfNGgQy5Yta0a0JEmlExEvrHup3lHKdx+SJKln2OglSaowG70kSRXWtLPXSZLW7uWXX2bhwoUsX768t0tRgwYOHMiwYcMYMGBAb5fSMBu9JPWShQsXsskmm7DjjjtSO+mgyiwzeeqpp1i4cCE77bRTb5fTMA/dS1IvWb58OVtuuaVNvo+ICLbccss+dwTGRi9Jvcgm37f0xefLRi9JUoX5Gb0klcSOk37bo3nzphyyzmWWLFnCJZdcwgknnNBxzrx5/OlPf+Koo45a+/bmzeN973sf999/f7vzZ86cyaJFi3jve98LwLRp05g9ezaTJk3qUp4a4x69JK3HlixZwtlnn73WZebNm8cll1zS7W3NnDmTq6++evXtD3zgAx02efUcG70krccmTZrE//7v/zJmzBhOOeUUTjnlFEaOHMmb3/xmpk6dunqZP/7xj4wZM4bvfe97zJs3j3e+853sscce7LHHHvzpT39a53ZeeuklTj/9dKZOncqYMWOYOnUqF1xwASeeeCIAjz32GIcddhijR49m9OjRr8p8+OGH2X333bnjjjuYNWsWY8eOZcyYMYwaNYq5c+f2/ANTIR66l6T12JQpU7j//vuZOXMmV155JT/+8Y+55557ePLJJ9l7773Zd999mTJlCt/5zneYPn06AM8//zzXXnstAwcOZO7cuRx55JHMmDFjrdvZcMMN+frXv86MGTP40Y9+BMAFF1ywev5JJ53EuHHj+NWvfsXKlStZunQpzzzzDAAPPvggEydO5Gc/+xljxozhc5/7HCeffDIf/ehHeemll1i5cmVzHpyKsNFLkgC4+eabOfLII+nXrx/bbLMN48aN44477mDTTTddY7mXX36ZE088kZkzZ9KvXz/+8pe/dHvb119/PT//+c8B6NevH0OHDuWZZ57hiSee4NBDD+XKK69kt912A+Btb3sbkydPZuHChXzwgx9k+PDh3d5+lXnoXpIE1H4QphHf+9732GabbbjnnnuYMWMGL730UtNqGjp0KDvssAO33HLL6mlHHXUU06ZNY9CgQYwfP57rr7++aduvAvfoJanJ2htNP2/gUexaP+GMZ1tWT71NNtmE5557DoB9992Xn/zkJxxzzDE8/fTT3HTTTXz729/m0UcfXb0MwLPPPsuwYcPYYIMNuPDCCxs+dF6/rbYOOOAAzjnnHD7/+c+zcuXK1ac633DDDfn1r3/N+PHjGTJkCEcddRQPP/wwO++8MyeddBIPP/ww9957L+9617u6+UhUl41ekkqika/D9bQtt9ySd7zjHYwcOZL3vOc9jBo1itGjRxMRnHnmmWy77bZsueWW9O/fn9GjR3PsscdywgkncPjhh3P55Zez//77M3jw4Ia2tf/++zNlyhTGjBnDqaeeusa8H/zgBxx//PGcd9559OvXj3POOYftttsOgMGDBzN9+nQOOuggBg8ezOzZs7nooosYMGAA2267LaeffnqPPy5VEo0equmMwYMH56p3Y5K0vutoj34NvbRHr86bM2cOu+66xvEYIuL5zGzsHU+L+Rm9JEkV5qF7SVKP+t3vfseXv/zlNabttNNO/OpXv+qlitZvNnpJUo8aP34848eP7+0yVPDQvSRJFWajlySpwmz0kiRVmI1ekvQqO+64I08++WTLt7vffvt1+Lv5H/rQh3j44YfbnfepT32K2bNnrzX72GOP5YorrnjV9LZn57vvvvs49thjGy+65ByMJ0llccbQHs6rznfzZ82axcqVK9l5551fNW/lypX89Kc/7XL2qkZ/1FG13zZ485vfzMKFC5k/fz6ve93rupxbFu7RS9J67KKLLlp9ytd//ud/bvfnbCdMmMCee+7Jbrvtxrnnnrt6+pAhQ/jiF7/IHnvswQEHHMATTzwBwFlnncWIESMYNWoUEydOBGDZsmV88pOfZO+992b33XfnqquuAuCFF15g4sSJjBo1io985CO88MIL7dZ58cUXc+ihh66x7dNPP523vOUt/PnPf17jSMB5553HLrvswn777cenP/3p1afCBbjpppt4+9vfzs4777x6777taXgB3v/+93PppZd2+XEtExu9JK2n5syZw9SpU7nllltWn4nu4osvftVy559/PnfeeSczZszgrLPO4qmnngJqzXuPPfbgrrvuYty4cXzta18Daqe+vfvuu7n33nv58Y9/DMDkyZN517vexR133MENN9zAKaecwrJlyzjnnHPYeOONuffee/nXf/1X7rzzznZrveWWW9hzzz1X3162bBkjR47ktttuY5999lk9fdGiRXzjG9/g1ltv5dprr+WBBx5YI2fx4sXcfPPNTJ8+nUmTJq2u953vfCczZ87kC1/4AgB77bUXf/zjH7v60JaKh+4laT113XXXceedd7L33nsDtb3rrbfe+lXLnXXWWat/7GbBggXMnTuXLbfckg022ICPfOQjABx99NF88IMfBGDUqFF89KMfZcKECUyYMAGAa665hmnTpvGd73wHgOXLlzN//nxuuukmTjrppNXrjRo1qt1aFy9ezFZbbbX6dr9+/Tj88MNftdztt9/OuHHj2GKLLQA44ogj1jiN7oQJE9hggw0YMWIEjz32WIePzdZbb82iRYs6nN+X2OglaT2VmRxzzDF861vf6nCZG2+8kd///vf8+c9/ZuONN2a//fZj+fLl7S4bEQD89re/5aabbmLatGl84xvfYNasWWQmV155JW984xs7XG9tBg0atMZ2Bw4cSL9+/dq9T2uz0UYbNbTs8uXLGTRo0Drr6gs8dC9J66kDDjiAK664gscffxyAp59+mr/+9a9rLPPss8+y+eabs/HGG/PAAw9w6623rp73yiuvrP6c+5JLLmGfffbhlVdeYcGCBey///6ceeaZLFmyhKVLlzJ+/Hh++MMfrm6ud999N1A7Ne6qjwvuv/9+7r333nZr3XXXXXnooYfWeZ/Gjh3LH/7wB5555hlWrFjBlVdeuc512jt97l/+8hdGjhy5znX7Ahu9JK2nRowYwTe/+U3e/e53M2rUKA466CAWL168xjIHH3wwK1asYNSoUZx22mm89a1vXT1v8ODBzJo1iz333JPrr7+e008/nZUrV3L00Ufz5je/md13350vfOELbLbZZpx22mm8/PLLjBo1ipEjR3LaaacB8JnPfIalS5cyatQozjzzTMaOHdturYcccgg33njjOu/T9ttvz1e+8hXe8pa3cOCBBzJixAiGDl37txlGjRq1+jS8qwbj3XDDDRxySOtPG9wMDZ+mNiL6ATOARzPzfWtb1tPUStI/VPU0tUOGDGHp0qUt2dYLL7zA/vvvzy233NLuIft6S5cuZciQIaxYsYLDDjuMT37ykxx22GENb+vFF19k3Lhx3Hzz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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['total_ticks', 'elapsed']].plot.bar(\n", + " logy=False, secondary_y=['elapsed'], \n", + " figsize=(8, 6), title=\"Internal vs external time\")\n", + "plt.savefig('internal_external_time_linear.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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8t/5Z6kMm3+1GHk4CjgqIt5drH4a8JVimP1/biRrIL5OZdLmKuAa4GcDzOlXMfQ/g8rchUeofBY/pDJ3YiBmApOofD9+DpxczKfor4bbgJeBuzJz2QC3KzVc1+xrSVKdRMQNwMWZ+cNm1yJVy4ZAkuqo2D1xHbB9jwmJUqm5y0CS6iQiLgCuB/4/mwG1GkcIJEmSIwSSJMmGQJIkUdITE40aNSo33XTTZpchSVLDvPDCC5mZTftDvVQNQUTMAGaMHTuW559/vtnlSJLUMBHx4sZfNYTbL+Okwvb29rQhkCSNJBHxQma2N2v7ziGQJEk2BJIkqWRzCPqzZs0aOjo6WL169cZfrFIZN24cEydOZPTo0c0uRZLUh5ZpCDo6Othiiy2YNGkSlQu3qRVkJitWrKCjo4PJkyc3uxxJUh9KtcsgImZExJy1aze8suvq1auZMGGCzUCLiQgmTJjgyI4klVypGoLMnJ+Zs9ra2np93magNfm5SVL5laohkCRJzdEycwh6mnTSNXXNWzb7Qxt9zcqVK7n44os57rjj+s5Ztozbb7+dww8/vP/tLVvGhz/8Ye6///7a6uy23k033cTpp5/O1VdfXVOGJEk9OUJQg5UrV/L973+/39csW7aMiy++uEEVSZKGkbaImFOctbfhbAhqcNJJJ/Ff//Vf7LrrrpxwwgmccMIJTJ06lZ133pl58+ate80tt9zCrrvuyne/+12WLVvGu9/9bnbffXd23313br/99qq2Vet6Tz31FIcccgjTpk1jr7324t577wXgueee46ijjmLnnXdm2rRpXHHFFYN7EyRJQ2VtZs7KzPnN2HjL7jJohtmzZ3P//fezZMkSrrjiCs4991zuuecennzySfbYYw/23XdfZs+evd4w/gsvvMB1113HuHHjePjhh5k5cyaLFy/e6LZe85rX1LTeySefzG677cYvfvELbrjhBo488kiWLFnCN77xDcaPH899990HwNNPP12fN0OSNKzYEAzQrbfeysyZM2lra+O1r30t++23H4sWLWLLLbdc73Vr1qzh+OOPZ8mSJbS1tfH73/++qvxa17v11lvX/fX/3ve+lxUrVrBq1Squv/56Lr300nWv22qrrWr8SSVJI0GpGoLuVzssu2ovCvXd736X1772tdxzzz28/PLLjBs3bkjW662eiCAzPexPreuU8b0sW9X4Okqgt4nU1UyGlqpVqjkEGzsPQbNtscUWPPvsswDsu+++zJs3j7Vr1/LEE0+wcOFC9txzz/VeA7Bq1Spe//rXM2rUKC666CJ6O+lSb2pdb9999+UnP/kJADfddBNbb701W265JR/4wAc4++yz173OXQaSpN6UaoSgFs3ojCdMmMA+++zD1KlTOeigg5g2bRq77LILEcG3v/1tXve61zFhwgQ22WQTdtllFz75yU9y3HHHceihh3L55Zfznve8h/b26q5sWet6p5xyCkcddRTTpk1js80244ILLgDgK1/5Cv/8z//M1KlTaWtr4+STT+ajH/3ooN8LSdLwEtUOfTdSe3t7Pv/88+ste/DBB9lxxx2bVJEGy89PA+Iug3XcZTD8RcQLmVndX41DoFS7DCRJUnO07C6D4eLaa6/lxBNPXG/Z5MmT+fnPf96kiiRJI5ENQZMdeOCBHHjggc0uQ5I0wrnLQJIk2RBIkqQh2mUQEW8CvgyMz8yPFcsOAT4EvAY4JzN/NRTblqQRo+dRGCP0CAzVR9UjBBFxXkQ8HhH391g+PSIeioilEXESQGb+ITOP7v66zPxFZh4LfBL4hzrUriqcccYZXHjhhb0+d+655/b5XJe5c+dy/PHH9/rcN7/5zXX3X3rpJfbdd186OzsHXqwkqWlqGSGYC5wNrPsNEhFtwDnA+4EOYFFEXJWZv+0n5yvFOoPT2/HJg8prnc66s7OTTTbZ+EfX2dnJeeedx1133dXrc5/+9KcHVcc3v/lNvvSlLwEwZswYDjjgAObNm8cRRxwxqFxJUuNVPUKQmQuBp3os3hNYWowIvARcChzc2/pR8S3gl5m54W+oklu2bBlvectbOOaYY5g6dSpHHHEE119/Pfvssw9TpkzhzjvvBOD555/nU5/6FHvssQe77bYbV155JVD5S/uQQw5hxowZTJ48mbPPPpvvfOc77Lbbbuy111489VTlrV2yZAl77bUX06ZN4yMf+ci6Uw3vv//+fOlLX2K//fbj1FNPZfLkyaxZswaAZ555hkmTJq173OWGG25g9913X9c8dM8488wzOeWUUzj99NMBWLRoEdOmTWPvvfded1nnLo899hjTp09nypQpfOELXwAql3l+8cUX2XXXXdc1AIcccsi60ydLklrLYCcVbgcs7/a4A9guIiZExLnAbhHxxeK5fwHeB3wsIjb40zQiZkXE4ohYXNZh56VLl/K5z32Oe++9l9/97ndcfPHF3HrrrZx++unrhs9PPfVU3vve97Jo0SJuvPFGTjjhBLrOunj//fdz8cUXc+edd/LlL3+ZzTbbjLvvvpu999573dD9kUceybe+9S3uvfdedt55Z77+9a+v2/7KlSu5+eabOfnkk9l///255prKmcsuvfRSDj30UEaPHr1evbfddhtve9vb1lvWlfH5z39+veVHHXUU5557LnfccQc9ryWxZMkS5s2bx3333ce8efNYvnw5s2fPZtNNN2XJkiXrmoCpU6eyaNGiwb7NkqQmGGxD0Ntl9DIzV2TmpzPzbzLztGLh9zLzbcXyc3tZaU5mvj0z317NcHgzTJ48mZ133plRo0bx1re+lQMOOICIYOedd2bZsmUA/OpXv2L27Nnsuuuu7L///qxevZo//elPALznPe9hiy22YJtttmH8+PHMmDEDYN36q1atYuXKley3334AfOITn2DhwoXrtv8P//DK1ItjjjmG888/H4Dzzz+fo446aoN6//znP7PNNtust6x7RpeVK1fy7LPP8s53vhOAww8/fL3nDzjgAMaPH8+4cePYaaed+OMf/9jr+9PW1saYMWPWu7iTJKk1DPY3bwewfbfHE4HHBhpW9ssfd69r1KhR6x6PGjVq3WS6zOSKK65ghx12WG/d3/zmN1Wt35/uFzjaZ599WLZsGTfffDNr165db4i/y6abbsrq1av7zOiysetZdK+7ra2t31r/+te/Vn2JZ0lSeQx2hGARMCUiJkfEGOAw4KqBhpX98sfVOPDAAznrrLPW/ZK9++67q153/PjxbLXVVtxyyy0AXHTRRetGC3pz5JFHMnPmzF5HBwB23HFHli5dutHtbrXVVmyxxRb8+te/Biq7IKoxevTo9eYtrFixgm222WaDXReSpPKr5bDDS4A7gB0ioiMijs7MTuB44FrgQeCyzHxgaEptDV/96ldZs2YN06ZNY+rUqXz1q1+taf0LLriAE044gWnTprFkyRK+9rWv9fnaI444gqeffpqZM2f2+vxBBx203i6H/vzoRz9i1qxZ7L333mQm48dv/CiOWbNmMW3atHWTCm+88UY++MEPVrU9SVK5lOryx912GRzbc6jby+du6Kc//SlXXnklF110UZ+v+chHPsK3v/1tpkyZ0m/Wc889x+abbw7A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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['total_alloc', 'memory']].plot.bar(\n", + " logy=True, secondary_y=['memory'], \n", + " figsize=(8, 6), title=\"Internal vs external memory\")\n", + "plt.savefig('internal_external_memory_log.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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9P7yZ1HskqCnp2fIenY+6dIhl2nFstl/Puj8VatWsWDBAj7+8Y8PnLFsGTfffDMf+MAHBt/WsmW8+93v5p577mmtxob1rr32Wr72ta9xySWXtJQhSdJQmho5iIgxFI3B9zPzh/0sshx4fcPjCcCKQaa/TGbOzcxpmTlt9Oj6/Yhi1apVnHXWWYMus2zZMhYsWNCmiiRJGhlDNgflLxH+HbgvM78+wGIXA8dGYW9gdWY+DCwGJkXExIjoAY4ul+06J510Ev/93//N1KlTOfHEEznxxBOZPHkyu+22GwsXLly3zA033MDUqVP5xje+wbJly3j729/OnnvuyZ577snNN9/c1LZaXe/xxx/nyCOPZMqUKey9997cddddADz99NMcd9xx7LbbbkyZMoULLrhgw54ESdIrQjNf0fcFPgjcHRFLymmfAd4AkJlzgEUUP2NcSvFTxuPKeWsj4gTgcoqfMs7LzHuH8w9ol9mzZ3PPPfewZMkSLrjgAubMmcOdd97JY489xl577cV+++3H7NmzK0P9zz77LFdeeSVjx47lV7/6FTNnzuS2224bclvbbbddS+udcsop7LHHHvzoRz/i6quv5thjj2XJkiV84QtfYPz48dx9990APPHEE8PzZEiSNmpDNgeZeSP9HzvQuEwCnxhg3iKK5mGjceONNzJz5kxGjRrF9ttvz/7778/ixYvZcsstK8u98MILnHDCCSxZsoRRo0bxy1/+sqn8Vte78cYb140KvOMd72DlypWsXr2aq666ivPOO2/dcltttVWLf6kk6ZWofjv3u0DRCw3tG9/4Bttvvz133nknL730EmPHjh2R9fqrJyLITH9KKElqmddWaNK4ceN46qmnANhvv/1YuHAhL774Io8++ijXX38906dPrywDsHr1al772teyySabcM455/Diiy82ta1W19tvv/34/ve/D8C1117LNttsw5ZbbsnBBx/MmWeeuW45dyuoq5w6/uW3V6idT7r0ZTdpJHXtyMFQPz0cbltvvTX77rsvkydP5tBDD2XKlCnsvvvuRARf+cpX2GGHHdh6660ZPXo0u+++Ox/60If4+Mc/zlFHHcX555/PgQceyOabb97Utlpd79RTT+W4445jypQpbLbZZnzve98D4HOf+xyf+MQnmDx5MqNGjeKUU07hve997wY/F5KkjVs0O0TeTptvvnk+88wzlWn33Xcfu+yyS4cq0obwtdN66W+k4NTV7a+jBvobKWj3FySNrIh4NjOb+wbZBu5WkCRJFV27W2FjcPnll/PpT3+6Mm3ixIlceOGFHapIkiSbg4465JBDOOSQQzpdhiRJFTYHkiTVXETMA94NPJKZk/uZfyJwTPlwNLALsG1mPh4Ry4CngBeBtZk5bajtecyBJEn1Nx+YMdDMzPxqZk7NzKnAPwLXZebjDYscWM4fsjEAmwNJkmovM68HHh9ywcJM4NwN2Z7NwUbu9NNP5+yzz+533pw5cwac12v+/PmccMIJ/c770pe+tO7+888/z3777cfatWvXv1hJ0gaJiM0oRhgar7SXwBUR8bOImNVMTvceczDcZ0vrot9Pr127lmYua7127VrmzZvH7bff3u+8j370oxtUx5e+9CU+85nPANDT08NBBx3EwoULOeaYY4ZYU5LUx+iIaLzC3tzMnLseOYcDN/XZpbBvZq6IiO2AKyPi/nIkYkCOHDRp2bJlvPnNb+b4449n8uTJHHPMMVx11VXsu+++TJo0iVtvvRWAZ555hr/5m79hr732Yo899uCiiy4Cim/gRx55JIcffjgTJ07kzDPP5Otf/zp77LEHe++9N48/XryOS5YsYe+992bKlCm85z3vWXfK4wMOOIDPfOYz7L///nzxi19k4sSJvPDCCwA8+eST7Lzzzuse97r66qvZc8891zUSjRlnnHEGp556Kl/72tcAWLx4MVOmTGGfffZZdznqXitWrGDGjBlMmjSJf/iHfwCKy1M/99xzTJ06dV0zcOSRR647jbMkqSVrM3Naw219GgOAo+mzSyEzV5T/PgJcCEwfKsTmoAVLly7lk5/8JHfddRf3338/CxYs4MYbb+RrX/vauiH2L37xi7zjHe9g8eLFXHPNNZx44on0nu3xnnvuYcGCBdx666189rOfZbPNNuOOO+5gn332WTe8f+yxx/LlL3+Zu+66i912241/+qd/Wrf9VatWcd1113HKKadwwAEHcOmlxVnTzjvvPI466ijGjBlTqfemm27irW99a2Vab8anPvWpyvTjjjuOOXPm8JOf/IRRo0ZV5i1ZsoSFCxdy9913s3DhQh566CFmz57NpptuypIlS9Y1BJMnT2bx4sUb+jRLktZDRIwH9gcuapi2eUSM670PHAzcM1SWzUELJk6cyG677cYmm2zCW97yFg466CAigt12241ly5YBcMUVVzB79mymTp3KAQccwJo1a/jNb34DwIEHHsi4cePYdtttGT9+PIcffjjAuvVXr17NqlWr2H///QH467/+a66//g8jP3/5l3+57v7xxx/Pd7/7XQC++93vctxxx72s3ocffphtt922Mq0xo9eqVat46qmn+LM/+zMAPvCBD1TmH3TQQYwfP56xY8ey66678utf/7rf52fUqFH09PRULj4lSdpwEXEu8BPgTRGxPCI+HBEfjYjG/cPvAa7IzMbrD2wP3BgRdwK3Apdm5o+H2l73HnPQAa961avW3d9kk03WPd5kk03WHYiXmVxwwQW86U1vqqz705/+tKn1B9N4AaZ9992XZcuWcd111/Hiiy9WdgP02nTTTVmzZs2AGb2Gur5GY92jRo0atNbf//73TV+aWpLUnMyc2cQy8yl+8tg47QFg91a358jBMDvkkEP45je/ue4D94477mh63fHjx7PVVltxww03AHDOOeesG0Xoz7HHHsvMmTP7HTUA2GWXXVi6dOmQ291qq60YN24ct9xyC1DspmjGmDFjKsc5rFy5km233fZluzckSd3F5mCYff7zn+eFF15gypQpTJ48mc9//vMtrf+9732PE088kSlTprBkyRJOPvnkAZc95phjeOKJJ5g5s/+G8tBDD63slhjMv//7vzNr1iz22WcfMpPx44f+NcisWbOYMmXKugMSr7nmGg477LCmtidJqi8v2dzFfvCDH3DRRRdxzjnnDLjMe97zHr7yla8wadKkQbOefvpptthiCwBmz57Nww8/zBlnnNFSPe9973s57bTTXrZLxddO68VLNq/jJZs3fnW7ZLPHHHSpv/3bv+Wyyy5j0aJFgy7X+0E/VHNw6aWXctppp7F27Vp22mkn5s+f31I9zz//PEceeeTLGgNJUvdx5EAjztdO68WRg3UcOdj41W3kwGMOJElSRVc1B3Uc5dDgfM0kqft0TXMwduxYVq5c6YdNF8lMVq5c6XkPJKnLdM0BiRMmTGD58uU8+uijnS5FLRg7diwTJkzodBmSpBZ0TXMwZswYJk6c2OkyJEna6HXNbgVJktQeNgeSJKnC5kCSJFXYHEiSpAqbA0mSVDHkrxUiYh7wbuCRzJzcz/wTgWMa8nYBts3MxyNiGfAU8CKwNjOnDVfhkiRpZDQzcjAf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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n", + "performance[['total_alloc', 'memory']].plot.bar(\n", + " logy=False, secondary_y=['memory'], \n", + " figsize=(8, 6), title=\"Internal vs external memory\")\n", + "plt.savefig('internal_external_memory_linear.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": { + "Collapsed": "false" + }, + "outputs": [], + "source": [ + "# performance['elapsed_adj'] = performance['elapsed'] - 0.28\n", + "# performance" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "Collapsed": "false" + }, + "outputs": [], + "source": [ + "# performance[['total_time', 'elapsed_adj']].plot.bar(logy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(ncols=3, figsize=(20,5))\n", + "\n", + "performance['elapsed'].plot.bar(ax=ax[2],\n", + " logy=True, \n", + " title=\"Run times (wall clock), log scale\",\n", + "# figsize=(10,8)\n", + " )\n", + "ax[2].set_xlabel('Program')\n", + "\n", + "performance['elapsed'].plot.bar(ax=ax[0],\n", + " logy=False, \n", + " title=\"Run times (wall clock), linear scale\",\n", + "# figsize=(10,8)\n", + " )\n", + "ax[0].set_xlabel('Program')\n", + "\n", + "performance['elapsed'].plot.bar(ax=ax[1],\n", + " logy=False, \n", + " ylim=(0, 22),\n", + " title=\"Run times (wall clock), truncated linear scale\",\n", + "# figsize=(10,8)\n", + " )\n", + "ax[1].set_xlabel('Program')\n", + "\n", + "plt.savefig('run_times_combined.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(ncols=2, figsize=(13,5))\n", + "\n", + "performance['memory'].plot.bar(ax=ax[0],\n", + " logy=True, \n", + " title=\"Memory used, log scale\",\n", + "# figsize=(10,8)\n", + " )\n", + "ax[0].set_xlabel('Program')\n", + "\n", + "performance['memory'].plot.bar(ax=ax[1],\n", + " logy=False, \n", + " title=\"Memory used, linear scale\",\n", + "# figsize=(10,8)\n", + " )\n", + "ax[1].set_xlabel('Program')\n", + "\n", + "plt.savefig('memory_combined.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 251, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(ncols=2, figsize=(13,5))\n", + "\n", + "performance[['total_alloc', 'memory']].plot.bar(ax=ax[0],\n", + " logy=False, secondary_y=['memory'], \n", + " title=\"Internal vs external memory, linear scale\")\n", + "ax[0].set_xlabel('Program')\n", + "\n", + "performance[['total_alloc', 'memory']].plot.bar(ax=ax[1],\n", + " logy=True, secondary_y=['memory'], \n", + " title=\"Internal vs external memory. log scale\")\n", + "\n", + "plt.savefig('internal_external_memory_combined.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": { + "Collapsed": "false" + }, + "outputs": [], + "source": [ + "# ax = performance['elapsed_adj'].plot.bar(logy=False, \n", + "# title=\"Run times (wall clock), linear scale\",\n", + "# figsize=(10,8))\n", + "# ax.set_xlabel('Program')\n", + "# plt.savefig('run_times_linear.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['total_time', 'total_alloc', 'total_ticks', 'initial_capabilities',\n", + " 'system', 'elapsed', 'memory'],\n", + " dtype='object')" + ] + }, + "execution_count": 186, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "performance.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 187, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance['memory'].plot.bar()" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 188, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.plot.scatter('elapsed', 'total_alloc', logx=True, logy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 189, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.plot.scatter('memory', 'total_alloc', logx=True, logy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 190, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "performance.plot.scatter('elapsed', 'total_ticks', logx=True, logy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": { + "Collapsed": "false" + }, + "outputs": [], + "source": [ + "performance[['total_alloc', 'memory', 'elapsed']].to_csv('performance.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": { + "Collapsed": "false" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "| program | total_alloc | elapsed | memory |\n", + "|:----------|--------------:|----------:|---------:|\n", + "| advent01 | 11516576 | 0.02 | 10488 |\n", + "| advent02 | 9613016 | 0.02 | 11112 |\n", + "| advent03 | 6018112 | 0.02 | 10408 |\n", + "| advent04 | 2913824 | 0.01 | 9040 |\n", + "| advent05 | 3396888 | 0.01 | 9324 |\n", + "| advent06 | 5025888 | 0.02 | 10124 |\n", + "| advent07 | 3049136 | 0.01 | 9192 |\n", + "| advent08 | 214597512 | 0.09 | 12204 |\n", + "| advent09 | 39708256 | 0.06 | 23660 |\n", + "| advent10 | 631808 | 0.01 | 6800 |\n", + "| advent11 | 655812832 | 0.36 | 66664 |\n", + "| advent12 | 1598902400 | 1.09 | 13264 |\n", + "| advent13 | 10281760 | 0.01 | 12300 |\n", + "| advent14 | 258169680 | 0.85 | 15068 |\n", + "| advent15 | 126607950592 | 137.27 | 18101260 |\n", + "| advent16 | 296137053800 | 144.64 | 45628 |\n", + "| advent17 | 77649009464 | 20.67 | 22000 |\n", + "| advent18 | 68244096 | 0.06 | 14060 |\n", + "| advent19 | 1964531122296 | 1134.12 | 14295324 |\n", + "| advent20 | 55860434768 | 15.04 | 13940 |\n", + "| advent21 | 351135824 | 0.40 | 12680 |\n", + "| advent22 | 528445105288 | 0.23 | 15908 |\n", + "| advent23 | 26387446504 | 370.18 | 13628 |\n", + "| advent24 | 3268072336 | 2.74 | 74820 |\n", + "| advent25 | 642496 | 0.01 | 5896 |\n" + ] + } + ], + "source": [ + "print(performance[['total_alloc', 'elapsed', 'memory']].to_markdown(floatfmt=['0.0f', '0.0f', '.2f', '0.0f']))" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "advent01 22\n", + "advent02 93\n", + "advent03 51\n", + "advent04 57\n", + "advent05 105\n", + "advent06 30\n", + "advent07 137\n", + "advent08 76\n", + "advent09 97\n", + "advent10 76\n", + "advent11 148\n", + "advent12 155\n", + "advent13 61\n", + "advent14 107\n", + "advent15 91\n", + "advent16 274\n", + "advent17 171\n", + "advent18 72\n", + "advent19 221\n", + "advent20 56\n", + "advent21 118\n", + "advent22 269\n", + "advent23 215\n", + "advent24 224\n", + "advent25 52\n", + "dtype: int64" + ] + }, + "execution_count": 232, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "line_counts = ! find .. -path ../dist-newstyle -prune -o -type f -name \"Main.hs\" -exec wc -l {} \\;\n", + "count_names = [re.search(\"(\\d+) \\.\\./([^/]+)\", l).groups([2, 1]) for l in line_counts if 'advent' in l if 'Main' in l]\n", + "program_counts = pd.Series({n: int(c) for n, c in sorted([(c, n) for n, c in count_names])})\n", + "program_counts" + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "program_counts[::-1].plot.barh(figsize=(6, 9))\n", + "plt.savefig('lines_of_code.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 236, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "| | 0 |\n", + "|:---------|----:|\n", + "| advent01 | 22 |\n", + "| advent02 | 93 |\n", + "| advent03 | 51 |\n", + "| advent04 | 57 |\n", + "| advent05 | 105 |\n", + "| advent06 | 30 |\n", + "| advent07 | 137 |\n", + "| advent08 | 76 |\n", + "| advent09 | 97 |\n", + "| advent10 | 76 |\n", + "| advent11 | 148 |\n", + "| advent12 | 155 |\n", + "| advent13 | 61 |\n", + "| advent14 | 107 |\n", + "| advent15 | 91 |\n", + "| advent16 | 274 |\n", + "| advent17 | 171 |\n", + "| advent18 | 72 |\n", + "| advent19 | 221 |\n", + "| advent20 | 56 |\n", + "| advent21 | 118 |\n", + "| advent22 | 269 |\n", + "| advent23 | 215 |\n", + "| advent24 | 224 |\n", + "| advent25 | 52 |\n" + ] + } + ], + "source": [ + "print(program_counts.to_markdown())" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "97.0" + ] + }, + "execution_count": 245, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "program_counts.median()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md" + }, + "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.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/profiling/profiling.md b/profiling/profiling.md new file mode 100644 index 0000000..88811ae --- /dev/null +++ b/profiling/profiling.md @@ -0,0 +1,360 @@ +--- +jupyter: + jupytext: + formats: ipynb,md + text_representation: + extension: .md + format_name: markdown + format_version: '1.3' + jupytext_version: 1.11.1 + kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +```python Collapsed="false" +import glob +import json +import pandas as pd +import numpy as np +import datetime +import re + +import matplotlib.pyplot as plt +%matplotlib inline +``` + +```python +! cd .. && cabal install +``` + +```python Collapsed="false" tags=[] +! cd .. && for i in {01..25}; do cabal run advent${i} --enable-profiling -- +RTS -N -pj -s -hT ; done +``` + +```python +! rm ../times.csv +! rm ../times_raw.csv +``` + +```python Collapsed="false" tags=[] +! cd .. && for i in {01..25}; do /usr/bin/time -f "%C,%S,%E,%M" -o times.csv -a cabal run advent${i}; done +``` + +```python Collapsed="false" tags=[] +! cd .. && for i in {01..25}; do /usr/bin/time -f "%C,%S,%E,%M" -o times_raw.csv -a advent${i}; done +``` + +```python +!mv ../*prof . +``` + +```python +!mv ../times.csv . +``` + +```python +!mv ../times_raw.csv . +``` + +```python +!mv ../*hp . +``` + +```python +! for f in *hp ; do hp2ps ${f} ; done +``` + +```python Collapsed="false" +glob.glob('*prof') +``` + +```python Collapsed="false" +profs = [] +for fn in glob.glob('*prof'): + with open(fn) as f: + j = json.load(f) + prof = {} + for n in 'program total_time total_alloc total_ticks initial_capabilities'.split(): + prof[n] = j[n] + profs.append(prof) +profs +``` + +```python Collapsed="false" +performance = pd.DataFrame(profs).set_index('program').sort_index() +performance +``` + +```python Collapsed="false" +performance.total_ticks.plot.bar() +``` + +```python Collapsed="false" +performance.total_ticks.plot.bar(logy=True) +``` + +```python Collapsed="false" +performance.total_alloc.plot.bar() +``` + +```python Collapsed="false" +performance.total_alloc.plot.bar(logy=True) +``` + +```python Collapsed="false" +performance[['total_ticks', 'total_alloc']].plot.bar( + logy=True, secondary_y=['total_alloc'], + figsize=(8, 6), title="Internal time and memory") +plt.savefig('internal_time_and_memory_log.png') +``` + +```python Collapsed="false" +performance[['total_ticks', 'total_alloc']].plot.bar( + logy=False, secondary_y=['total_alloc'], + figsize=(8, 6), title="Internal time and memory") +plt.savefig('internal_time_and_memory_linear.png') +``` + +```python +# times = pd.read_csv('times.csv', +# names=['program', 'system', 'elapsed', 'memory'], +# index_col='program') +# times.index = times.index.str.slice(start=len('cabal run ')) +# times.elapsed = pd.to_numeric(times.elapsed.str.slice(start=2)) +# times +``` + +```python +today = datetime.date.today() +today = datetime.datetime(year=today.year, month=today.month, day=today.day) - datetime.timedelta(seconds=1) +today +``` + +```python +epoch = datetime.datetime(year=1900, month=1, day=1) +epoch +``` + +```python +times = pd.read_csv('times_raw.csv', + names=['program', 'system', 'elapsed', 'memory'], + index_col='program') +times.elapsed = (pd.to_datetime(times.elapsed, format="%M:%S.%f") - epoch) +times.elapsed = times.elapsed.apply(lambda x: x.total_seconds()) +times +``` + +```python +times.dtypes +``` + +```python Collapsed="false" +times.describe() +``` + +```python Collapsed="false" +performance = performance.merge(times, left_index=True, right_index=True) +# performance.drop(index='advent15loop', inplace=True) +performance +``` + +```python Collapsed="false" +performance.columns +``` + +```python +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance.elapsed.plot.bar( + figsize=(8, 6), title="External time") +plt.savefig('external_time.png') +``` + +```python +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['elapsed', 'memory']].plot.bar( + logy=False, secondary_y=['memory'], + figsize=(8, 6), title="External time and memory") +plt.savefig('external_time_and_memory.png') +``` + +```python +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['elapsed', 'memory']].plot.bar( + logy=True, secondary_y=['memory'], + figsize=(8, 6), title="External time and memory") +plt.savefig('external_time_and_memory_log.png') +``` + +```python Collapsed="false" +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['elapsed', 'memory']].plot.bar( + logy=False, secondary_y=['memory'], + figsize=(8, 6), title="External time and memory") +plt.savefig('external_time_and_memory_linear.png') +``` + +```python Collapsed="false" +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['total_ticks', 'elapsed']].plot.bar( + logy=True, secondary_y=['elapsed'], + figsize=(8, 6), title="Internal vs external time") +plt.savefig('internal_external_time.png') +``` + +```python Collapsed="false" +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['total_ticks', 'elapsed']].plot.bar( + logy=False, secondary_y=['elapsed'], + figsize=(8, 6), title="Internal vs external time") +plt.savefig('internal_external_time_linear.png') +``` + +```python Collapsed="false" +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['total_alloc', 'memory']].plot.bar( + logy=True, secondary_y=['memory'], + figsize=(8, 6), title="Internal vs external memory") +plt.savefig('internal_external_memory_log.png') +``` + +```python Collapsed="false" +# performance[['total_ticks', 'elapsed']].plot.bar(logy=True) +performance[['total_alloc', 'memory']].plot.bar( + logy=False, secondary_y=['memory'], + figsize=(8, 6), title="Internal vs external memory") +plt.savefig('internal_external_memory_linear.png') +``` + +```python Collapsed="false" +# performance['elapsed_adj'] = performance['elapsed'] - 0.28 +# performance +``` + +```python Collapsed="false" +# performance[['total_time', 'elapsed_adj']].plot.bar(logy=True) +``` + +```python Collapsed="false" +fig, ax = plt.subplots(ncols=3, figsize=(20,5)) + +performance['elapsed'].plot.bar(ax=ax[2], + logy=True, + title="Run times (wall clock), log scale", +# figsize=(10,8) + ) +ax[2].set_xlabel('Program') + +performance['elapsed'].plot.bar(ax=ax[0], + logy=False, + title="Run times (wall clock), linear scale", +# figsize=(10,8) + ) +ax[0].set_xlabel('Program') + +performance['elapsed'].plot.bar(ax=ax[1], + logy=False, + ylim=(0, 22), + title="Run times (wall clock), truncated linear scale", +# figsize=(10,8) + ) +ax[1].set_xlabel('Program') + +plt.savefig('run_times_combined.png') +``` + +```python Collapsed="false" +fig, ax = plt.subplots(ncols=2, figsize=(13,5)) + +performance['memory'].plot.bar(ax=ax[0], + logy=True, + title="Memory used, log scale", +# figsize=(10,8) + ) +ax[0].set_xlabel('Program') + +performance['memory'].plot.bar(ax=ax[1], + logy=False, + title="Memory used, linear scale", +# figsize=(10,8) + ) +ax[1].set_xlabel('Program') + +plt.savefig('memory_combined.png') +``` + +```python +fig, ax = plt.subplots(ncols=2, figsize=(13,5)) + +performance[['total_alloc', 'memory']].plot.bar(ax=ax[0], + logy=False, secondary_y=['memory'], + title="Internal vs external memory, linear scale") +ax[0].set_xlabel('Program') + +performance[['total_alloc', 'memory']].plot.bar(ax=ax[1], + logy=True, secondary_y=['memory'], + title="Internal vs external memory. log scale") + +plt.savefig('internal_external_memory_combined.png') +``` + +```python Collapsed="false" +# ax = performance['elapsed_adj'].plot.bar(logy=False, +# title="Run times (wall clock), linear scale", +# figsize=(10,8)) +# ax.set_xlabel('Program') +# plt.savefig('run_times_linear.png') +``` + +```python Collapsed="false" +performance.columns +``` + +```python Collapsed="false" +performance['memory'].plot.bar() +``` + +```python Collapsed="false" +performance.plot.scatter('elapsed', 'total_alloc', logx=True, logy=True) +``` + +```python Collapsed="false" +performance.plot.scatter('memory', 'total_alloc', logx=True, logy=True) +``` + +```python Collapsed="false" +performance.plot.scatter('elapsed', 'total_ticks', logx=True, logy=True) +``` + +```python Collapsed="false" +performance[['total_alloc', 'memory', 'elapsed']].to_csv('performance.csv') +``` + +```python Collapsed="false" +print(performance[['total_alloc', 'elapsed', 'memory']].to_markdown(floatfmt=['0.0f', '0.0f', '.2f', '0.0f'])) +``` + +```python +line_counts = ! find .. -path ../dist-newstyle -prune -o -type f -name "Main.hs" -exec wc -l {} \; +count_names = [re.search("(\d+) \.\./([^/]+)", l).groups([2, 1]) for l in line_counts if 'advent' in l if 'Main' in l] +program_counts = pd.Series({n: int(c) for n, c in sorted([(c, n) for n, c in count_names])}) +program_counts +``` + +```python +program_counts[::-1].plot.barh(figsize=(6, 9)) +plt.savefig('lines_of_code.png') +``` + +```python +print(program_counts.to_markdown()) +``` + +```python +program_counts.median() +``` + +```python + +``` diff --git a/profiling/run_times_combined.png b/profiling/run_times_combined.png new file mode 100644 index 0000000..f834de7 Binary files /dev/null and b/profiling/run_times_combined.png differ diff --git a/profiling/run_times_linear.png b/profiling/run_times_linear.png new file mode 100644 index 0000000..407fee4 Binary files /dev/null and b/profiling/run_times_linear.png differ diff --git a/profiling/run_times_log.png b/profiling/run_times_log.png new file mode 100644 index 0000000..2098deb Binary files /dev/null and b/profiling/run_times_log.png differ diff --git a/profiling/time-results.csv b/profiling/time-results.csv new file mode 100644 index 0000000..04e90b6 --- /dev/null +++ b/profiling/time-results.csv @@ -0,0 +1,27 @@ +Program,Elapsed time (s),Max memory +advent01, 00.39, 72440 +advent02, 00.41, 72440 +advent03, 00.37, 72504 +advent04, 00.43, 72504 +advent05, 00.43, 72440 +advent06, 00.41, 72504 +advent07, 00.39, 72444 +advent08, 00.44, 72508 +advent09, 00.66, 72508 +advent10, 00.36, 72444 +advent11, 16.75, 72504 +advent12, 00.38, 72508 +advent13, 00.36, 72436 +advent14, 00.61, 72508 +advent15, 02.15, 240372 +advent15loop, 01.88, 240444 +advent16, 00.38, 72444 +advent17, 01.77, 72444 +advent18, 00.39, 72444 +advent19, 00.46, 72504 +advent20, 04.12, 72436 +advent21, 00.39, 72508 +advent22, 02.02, 72500 +advent23, 01.91, 95500 +advent24, 03.48, 72504 +advent25, 00.41, 72504 diff --git a/profiling/time-results.md b/profiling/time-results.md new file mode 100644 index 0000000..70c50c0 --- /dev/null +++ b/profiling/time-results.md @@ -0,0 +1,27 @@ +| Program | Elapsed time (mm:ss) | Max memory | +| advent01 | 0:00.39 | 72440 | +| advent02 | 0:00.41 | 72440 | +| advent03 | 0:00.37 | 72504 | +| advent04 | 0:00.43 | 72504 | +| advent05 | 0:00.43 | 72440 | +| advent06 | 0:00.41 | 72504 | +| advent07 | 0:00.39 | 72444 | +| advent08 | 0:00.44 | 72508 | +| advent09 | 0:00.66 | 72508 | +| advent10 | 0:00.36 | 72444 | +| advent11 | 0:16.75 | 72504 | +| advent12 | 0:00.38 | 72508 | +| advent13 | 0:00.36 | 72436 | +| advent14 | 0:00.61 | 72508 | +| advent15 | 0:02.15 | 240372 | +| advent15loop | 0:01.88 | 240444 | +| advent16 | 0:00.38 | 72444 | +| advent17 | 0:01.77 | 72444 | +| advent18 | 0:00.39 | 72444 | +| advent19 | 0:00.46 | 72504 | +| advent20 | 0:04.12 | 72436 | +| advent21 | 0:00.39 | 72508 | +| advent22 | 0:02.02 | 72500 | +| advent23 | 0:01.91 | 95500 | +| advent24 | 0:03.48 | 72504 | +| advent25 | 0:00.41 | 72504 | diff --git a/profiling/times.csv b/profiling/times.csv new file mode 100644 index 0000000..89d3e47 --- /dev/null +++ b/profiling/times.csv @@ -0,0 +1,25 @@ +cabal run advent01,0.03,0:00.35,81704 +cabal run advent02,0.03,0:00.28,81708 +cabal run advent03,0.03,0:00.29,81712 +cabal run advent04,0.03,0:00.28,81212 +cabal run advent05,0.03,0:00.29,81708 +cabal run advent06,0.03,0:00.33,81700 +cabal run advent07,0.04,0:00.33,81704 +cabal run advent08,0.07,0:00.35,81216 +cabal run advent09,0.02,0:00.34,81708 +cabal run advent10,0.03,0:00.27,81700 +cabal run advent11,0.13,0:00.71,81712 +cabal run advent12,0.14,0:01.16,81708 +cabal run advent13,0.04,0:00.27,81212 +cabal run advent14,0.04,0:01.18,81708 +cabal run advent15,19.38,2:13.30,18018836 +cabal run advent16,16.38,2:26.46,81704 +cabal run advent17,4.27,0:21.79,81220 +cabal run advent18,0.05,0:00.36,81712 +cabal run advent19,86.14,19:05.60,15398736 +cabal run advent20,3.22,0:18.54,210392 +cabal run advent21,0.34,0:03.20,271008 +cabal run advent22,0.05,0:00.49,81712 +cabal run advent23,2.61,6:20.63,331416 +cabal run advent24,0.63,0:07.22,331760 +cabal run advent25,0.43,0:01.86,144388 diff --git a/profiling/times_raw.csv b/profiling/times_raw.csv new file mode 100644 index 0000000..5247c14 --- /dev/null +++ b/profiling/times_raw.csv @@ -0,0 +1,25 @@ +advent01,0.00,0:00.02,10488 +advent02,0.00,0:00.02,11112 +advent03,0.00,0:00.02,10408 +advent04,0.00,0:00.01,9040 +advent05,0.01,0:00.01,9324 +advent06,0.01,0:00.02,10124 +advent07,0.00,0:00.01,9192 +advent08,0.02,0:00.09,12204 +advent09,0.01,0:00.06,23660 +advent10,0.00,0:00.01,6800 +advent11,0.07,0:00.36,66664 +advent12,0.06,0:01.09,13264 +advent13,0.01,0:00.01,12300 +advent14,0.01,0:00.85,15068 +advent15,20.65,2:17.27,18101260 +advent16,15.74,2:24.64,45628 +advent17,3.94,0:20.67,22000 +advent18,0.02,0:00.06,14060 +advent19,87.22,18:54.12,14295324 +advent20,2.81,0:15.04,13940 +advent21,0.02,0:00.40,12680 +advent22,0.02,0:00.23,15908 +advent23,1.87,6:10.18,13628 +advent24,0.24,0:02.74,74820 +advent25,0.00,0:00.01,5896