Current section
Files
Jump to
Current section
Files
resources/boyle example - matrex installation and usage.ipynb
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Sample usage of Boyle module\n",
"\n",
"## Preparing environment"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"All dependencies up to date\n"
]
},
{
"data": {
"text/plain": [
"{:ok, [\"lala1\", \"matrex_samples\", \"test1\"]}"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create new environment\n",
"Boyle.mk(\"matrex_samples\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"All dependencies up to date\n"
]
},
{
"data": {
"text/plain": [
":ok"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Activate new environment and load modules available in that environment\n",
"Boyle.activate(\"matrex_samples\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Resolving Hex dependencies...\n",
"Dependency resolution completed:\n",
"Unchanged:\n",
"\u001b[32m elixir_make 0.4.2\u001b[0m\n",
"\u001b[32m matrex 0.6.7\u001b[0m\n",
"All dependencies up to date\n",
"==> matrex\n",
"make: Nothing to be done for 'build'.\n"
]
},
{
"data": {
"text/plain": [
":ok"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Install new dependency\n",
"Boyle.install({:matrex, \"~> 0.6\"})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Matrex usage\n",
"\n",
"* Library: https://github.com/versilov/matrex\n",
"* Original notebook: https://github.com/versilov/matrex/blob/master/Matrex.ipynb\n",
"\n",
"## Access behaviour"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m3\u001b[0m×\u001b[33m3\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 8.0 1.0 6.0\u001b[0m │\n",
"│\u001b[33m 3.0 5.0 7.0\u001b[0m │\n",
"│\u001b[33m 4.0 9.0 2.0 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = Matrex.magic(3)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"7.0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[2][3]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m2\u001b[0m×\u001b[33m3\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 8.0 1.0 6.0\u001b[0m │\n",
"│\u001b[33m 3.0 5.0 7.0 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[1..2]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[:rows]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{3, 3}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[:size]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9.0"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[:max]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"7.0"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[2][:max]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[:argmax]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m[2][:argmax]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Math operators overloading and logistic regression implementation"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{:module, LinearRegression, <<70, 79, 82, 49, 0, 0, 15, 240, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 1, 124, 0, 0, 0, 45, 23, 69, 108, 105, 120, 105, 114, 46, 76, 105, 110, 101, 97, 114, 82, 101, 103, 114, 101, 115, 115, 105, 111, ...>>, {:lr_cost_fun_ops, 2}}"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import Matrex\n",
"\n",
"defmodule LinearRegression do\n",
" def lr_cost_fun(%Matrex{} = theta, {%Matrex{} = x, %Matrex{} = y, lambda} = _params, iteration \\\\ 0)\n",
" when is_number(lambda) do\n",
" m = y[:rows]\n",
"\n",
" h = Matrex.dot_and_apply(x, theta, :sigmoid)\n",
" l = Matrex.ones(theta[:rows], theta[:cols]) |> Matrex.set(1, 1, 0)\n",
"\n",
" regularization =\n",
" Matrex.dot_tn(l, Matrex.square(theta))\n",
" |> Matrex.scalar()\n",
" |> Kernel.*(lambda / (2 * m))\n",
"\n",
" # Compute the cost and add regularization parameter\n",
" j =\n",
" y\n",
" |> Matrex.dot_tn(Matrex.apply(h, :log), -1)\n",
" |> Matrex.subtract(\n",
" Matrex.dot_tn(\n",
" Matrex.subtract(1, y),\n",
" Matrex.apply(Matrex.subtract(1, h), :log)\n",
" )\n",
" )\n",
" |> Matrex.scalar()\n",
" |> (fn\n",
" :nan -> :nan\n",
" x -> x / m + regularization\n",
" end).()\n",
"\n",
" # Compute gradient\n",
" grad =\n",
" x\n",
" |> Matrex.dot_tn(Matrex.subtract(h, y))\n",
" |> Matrex.add(Matrex.multiply(theta, l), 1.0, lambda)\n",
" |> Matrex.divide(m)\n",
"\n",
" {j, grad}\n",
" end\n",
" \n",
" # The same cost function, implemented with operators from `Matrex.Operators` module.\n",
" # Works 2 times slower, than standard implementation. But it's a way more readable.\n",
" # It is here for demonstrating possibilites of the library.\n",
" def lr_cost_fun_ops(%Matrex{} = theta, {%Matrex{} = x, %Matrex{} = y, lambda} = _params)\n",
" when is_number(lambda) do\n",
" # Turn off original operators. Use this with caution!\n",
" import Kernel, except: [-: 1, +: 2, -: 2, *: 2, /: 2, <|>: 2]\n",
" import Matrex\n",
" import Matrex.Operators\n",
" \n",
" # This line is needed only when used from iex, to remove ambiguity of t/1 function.\n",
" import IEx.Helpers, except: [t: 1]\n",
"\n",
" m = y[:rows]\n",
"\n",
" h = sigmoid(x * theta)\n",
" l = ones(size(theta)) |> set(1, 1, 0.0)\n",
"\n",
" j = (-t(y) * log(h) - t(1 - y) * log(1 - h) + lambda / 2 * t(l) * pow2(theta)) / m\n",
"\n",
" grad = (t(x) * (h - y) + (theta <|> l) * lambda) / m\n",
"\n",
" {scalar(j), grad}\n",
" end\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{\"\", 0}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"System.cmd(\"git\", [\"clone\", \"https://github.com/versilov/matrex\", \"resources/matrex\"])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X.mtx.gz Xtest.mtx.gz Xtrain.mtx.gz \n",
"Y.mtx Ytest.mtx Ytest.mtx.gz \n",
"Ytrain.mtx matrex.csv nn_theta1.mtx \n",
"nn_theta2.mtx t10k-images-idx3-ubyte.idx.gz t10k-labels-idx1-ubyte.idx \n"
]
}
],
"source": [
"ls \"resources/matrex/test/data\""
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m5000\u001b[0m×\u001b[33m400\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│ ⋮ ⋮ ⋮ ⋮ ⋮ … ⋮ ⋮ ⋮ ⋮ │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = Matrex.load(\"resources/matrex/test/data/X.mtx.gz\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[?25l\u001b[0m#Matrex[\u001b[33m80\u001b[0m×\u001b[33m80\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄▄▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;233;38;5;235m▄\u001b[48;5;243;38;5;253m▄\u001b[48;5;250;38;5;254m▄\u001b[48;5;247m▄\u001b[48;5;241m▄\u001b[48;5;237;38;5;252m▄\u001b[48;5;232;38;5;244m▄\u001b[38;5;234m▄ \u001b[38;5;0m▄ \u001b[48;5;0;38;5;235m▄\u001b[38;5;239m▄\u001b[38;5;240m▄\u001b[48;5;232;38;5;234m▄ \u001b[38;5;233m▄\u001b[48;5;233;38;5;245m▄\u001b[48;5;232;38;5;242m▄\u001b[48;5;234;38;5;247m▄\u001b[48;5;241;38;5;245m▄\u001b[48;5;245;38;5;242m▄\u001b[48;5;241m \u001b[48;5;0m \u001b[48;5;232m \u001b[48;5;237;38;5;236m▄\u001b[48;5;248;38;5;240m▄\u001b[48;5;244;38;5;232m▄\u001b[48;5;243m▄\u001b[48;5;244m▄\u001b[48;5;247;38;5;234m▄\u001b[48;5;244;38;5;241m▄\u001b[48;5;237;38;5;249m▄\u001b[48;5;232;38;5;242m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;234;38;5;232m▄\u001b[48;5;251;38;5;238m▄\u001b[48;5;254;38;5;249m▄\u001b[48;5;250;38;5;243m▄\u001b[48;5;251;38;5;236m▄\u001b[48;5;255;38;5;247m▄\u001b[48;5;254;38;5;253m▄\u001b[48;5;245;38;5;254m▄\u001b[48;5;232;38;5;241m▄ \u001b[48;5;0;38;5;239m▄\u001b[48;5;232;38;5;249m▄\u001b[48;5;239;38;5;254m▄\u001b[48;5;248;38;5;252m▄\u001b[48;5;251;38;5;245m▄\u001b[48;5;253;38;5;241m▄\u001b[48;5;254;38;5;247m▄\u001b[48;5;247;38;5;252m▄\u001b[48;5;233;38;5;234m▄\u001b[48;5;232m \u001b[48;5;0;38;5;239m▄\u001b[48;5;238;38;5;251m▄\u001b[48;5;254;38;5;252m▄\u001b[48;5;252;38;5;237m▄\u001b[48;5;242;38;5;0m▄\u001b[48;5;232;38;5;235m▄\u001b[48;5;241;38;5;248m▄\u001b[48;5;239;38;5;234m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;234;38;5;0m▄\u001b[48;5;248;38;5;235m▄\u001b[48;5;242;38;5;247m▄\u001b[48;5;0;38;5;238m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;233m▄\u001b[48;5;237m▄\u001b[48;5;233m▄\u001b[48;5;232m \u001b[48;5;248;38;5;246m▄\u001b[48;5;255m \u001b[48;5;249;38;5;250m▄\u001b[48;5;234;38;5;235m▄\u001b[48;5;232m \u001b[48;5;242m \u001b[48;5;254;38;5;249m▄\u001b[38;5;240m▄\u001b[48;5;244;38;5;232m▄\u001b[48;5;236;38;5;0m▄\u001b[48;5;0m \u001b[48;5;233;38;5;240m▄\u001b[48;5;250;38;5;254m▄\u001b[48;5;247;38;5;241m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;233m▄\u001b[48;5;238;38;5;249m▄\u001b[48;5;253m \u001b[48;5;251;38;5;235m▄\u001b[48;5;237;38;5;0m▄\u001b[48;5;232m▄\u001b[38;5;238m▄\u001b[48;5;243;38;5;248m▄\u001b[38;5;234m▄\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;240;38;5;238m▄\u001b[48;5;244;38;5;243m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;246;38;5;248m▄\u001b[48;5;255m \u001b[48;5;249;38;5;244m▄\u001b[48;5;234;38;5;0m▄\u001b[48;5;232m \u001b[38;5;0m▄▄▄▄▄▄\u001b[48;5;0;38;5;236m▄\u001b[48;5;236;38;5;250m▄\u001b[48;5;252;38;5;249m▄\u001b[48;5;246;38;5;233m▄\u001b[48;5;232;38;5;0m▄ \u001b[48;5;234;38;5;232m▄\u001b[48;5;248;38;5;233m▄\u001b[48;5;239;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;234;38;5;246m▄\u001b[48;5;249;38;5;248m▄\u001b[48;5;241;38;5;234m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;238;38;5;241m▄\u001b[48;5;243;38;5;245m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄▄▄▄▄▄▄\u001b[48;5;0;38;5;239m▄\u001b[48;5;239;38;5;252m▄\u001b[48;5;254m \u001b[48;5;250;38;5;244m▄\u001b[48;5;235;38;5;232m▄\u001b[48;5;232m \u001b[38;5;234m▄\u001b[38;5;243m▄\u001b[48;5;233;38;5;248m▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;236;38;5;253m▄\u001b[38;5;252m▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;236m▄\u001b[48;5;237;38;5;253m▄\u001b[48;5;248;38;5;254m▄\u001b[48;5;254;38;5;253m▄\u001b[48;5;241;38;5;250m▄\u001b[48;5;234;38;5;246m▄\u001b[48;5;233;38;5;238m▄\u001b[48;5;232m \u001b[48;5;0;38;5;236m▄\u001b[48;5;232;38;5;245m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;237;38;5;253m▄\u001b[48;5;239;38;5;254m▄\u001b[48;5;243;38;5;255m▄\u001b[48;5;244;38;5;254m▄\u001b[48;5;248;38;5;239m▄\u001b[48;5;234;38;5;0m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;233;38;5;243m▄\u001b[48;5;249;38;5;246m▄\u001b[48;5;240;38;5;233m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;238m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;235;38;5;254m▄\u001b[48;5;242m▄\u001b[48;5;245m▄\u001b[48;5;240m▄\u001b[48;5;235m▄▄\u001b[48;5;243m▄\u001b[48;5;252m▄\u001b[48;5;254m \u001b[48;5;250;38;5;254m▄\u001b[48;5;236;38;5;248m▄\u001b[48;5;0;38;5;243m▄\u001b[48;5;232;38;5;235m▄ \u001b[38;5;234m▄\u001b[48;5;244;38;5;251m▄\u001b[48;5;253;38;5;241m▄\u001b[48;5;248;38;5;0m▄\u001b[48;5;244m▄▄\u001b[48;5;246;38;5;236m▄\u001b[48;5;248m \u001b[48;5;254;38;5;253m▄\u001b[48;5;252;38;5;240m▄\u001b[48;5;242;38;5;0m▄\u001b[48;5;236m▄\u001b[48;5;235;38;5;232m▄▄\u001b[48;5;233m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;233;38;5;239m▄\u001b[48;5;244;38;5;254m▄\u001b[48;5;252;38;5;248m▄\u001b[48;5;250;38;5;237m▄\u001b[48;5;246m▄\u001b[48;5;237;38;5;243m▄\u001b[48;5;240;38;5;251m▄\u001b[48;5;252;38;5;242m▄\u001b[38;5;248m▄\u001b[48;5;238;38;5;239m▄\u001b[48;5;0m \u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;239;38;5;248m▄\u001b[48;5;248;38;5;240m▄\u001b[48;5;247;38;5;234m▄\u001b[48;5;245;38;5;237m▄\u001b[48;5;243;38;5;239m▄\u001b[48;5;242;38;5;243m▄\u001b[48;5;237;38;5;250m▄\u001b[48;5;238;38;5;253m▄\u001b[48;5;248m \u001b[48;5;234;38;5;242m▄\u001b[48;5;0;38;5;240m▄\u001b[38;5;237m▄\u001b[48;5;232;38;5;235m▄▄\u001b[38;5;234m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;248;38;5;241m▄\u001b[48;5;254m \u001b[48;5;253;38;5;255m▄▄▄\u001b[38;5;254m▄\u001b[48;5;254;38;5;251m▄\u001b[38;5;245m▄\u001b[48;5;252;38;5;236m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;245m▄\u001b[48;5;250;38;5;234m▄\u001b[48;5;251m▄\u001b[48;5;246;38;5;232m▄\u001b[48;5;237m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[48;5;234;38;5;232m▄\u001b[48;5;251;38;5;243m▄\u001b[48;5;248;38;5;252m▄\u001b[48;5;238;38;5;253m▄\u001b[48;5;241m▄\u001b[48;5;246;38;5;250m▄\u001b[48;5;252;38;5;242m▄\u001b[48;5;251;38;5;234m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;241;38;5;236m▄\u001b[48;5;255;38;5;247m▄\u001b[48;5;252;38;5;249m▄\u001b[48;5;251m▄\u001b[48;5;253;38;5;243m▄\u001b[38;5;236m▄\u001b[48;5;243;38;5;0m▄\u001b[48;5;236;38;5;238m▄\u001b[48;5;251;38;5;253m▄\u001b[48;5;237;38;5;235m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;246;38;5;238m▄\u001b[48;5;239;38;5;248m▄\u001b[48;5;0;38;5;243m▄\u001b[38;5;242m▄\u001b[48;5;234;38;5;246m▄\u001b[48;5;241;38;5;244m▄\u001b[48;5;250;38;5;237m▄\u001b[48;5;240;38;5;232m▄\u001b[48;5;236;38;5;0m▄\u001b[48;5;239m▄\u001b[48;5;242;38;5;232m▄▄\u001b[48;5;244;38;5;233m▄\u001b[48;5;246m▄\u001b[48;5;238;38;5;232m▄\u001b[48;5;0m▄\u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;234;38;5;232m▄\u001b[48;5;240;38;5;0m▄\u001b[48;5;241m▄▄▄\u001b[48;5;240m▄\u001b[48;5;235m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;237;38;5;0m▄\u001b[48;5;240m▄\u001b[48;5;238m▄\u001b[48;5;234;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;234;38;5;232m▄\u001b[48;5;240;38;5;0m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;235;38;5;0m▄\u001b[48;5;241m▄\u001b[48;5;240m▄\u001b[48;5;235;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;236m▄\u001b[38;5;239m▄\u001b[48;5;232;38;5;233m▄\u001b[38;5;0m▄ \u001b[38;5;235m▄\u001b[38;5;245m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;235;38;5;255m▄▄\u001b[48;5;234;38;5;252m▄\u001b[48;5;233;38;5;247m▄\u001b[48;5;232;38;5;238m▄\u001b[38;5;0m▄ \u001b[38;5;0m▄▄\u001b[38;5;234m▄\u001b[48;5;0;38;5;237m▄▄\u001b[48;5;232;38;5;244m▄\u001b[38;5;238m▄\u001b[38;5;0m▄ \u001b[38;5;236m▄\u001b[48;5;235;38;5;253m▄▄\u001b[48;5;233;38;5;249m▄\u001b[48;5;232;38;5;243m▄\u001b[48;5;0;38;5;238m▄\u001b[48;5;232;38;5;233m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;242;38;5;241m▄\u001b[48;5;254;38;5;255m▄\u001b[48;5;248;38;5;254m▄\u001b[48;5;238;38;5;253m▄\u001b[48;5;243m▄\u001b[38;5;254m▄▄\u001b[48;5;234;38;5;241m▄\u001b[48;5;232;38;5;0m▄ \u001b[48;5;248;38;5;250m▄\u001b[48;5;255;38;5;254m▄\u001b[48;5;253;38;5;236m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;246m▄\u001b[48;5;253;38;5;234m▄\u001b[48;5;255;38;5;243m▄\u001b[48;5;252;38;5;254m▄\u001b[48;5;239;38;5;252m▄\u001b[48;5;0;38;5;237m▄\u001b[48;5;232;38;5;0m▄ \u001b[38;5;0m▄\u001b[48;5;0;38;5;236m▄\u001b[48;5;232;38;5;245m▄\u001b[48;5;235;38;5;254m▄\u001b[48;5;241;38;5;251m▄\u001b[48;5;237;38;5;243m▄\u001b[48;5;238;38;5;234m▄\u001b[38;5;233m▄\u001b[48;5;240;38;5;245m▄\u001b[48;5;250;38;5;243m▄\u001b[48;5;235;38;5;0m▄\u001b[48;5;232m \u001b[48;5;236;38;5;232m▄\u001b[48;5;246m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;241m▄\u001b[48;5;249;38;5;233m▄\u001b[48;5;253;38;5;241m▄\u001b[48;5;247;38;5;254m▄\u001b[48;5;235;38;5;246m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;240;38;5;233m▄\u001b[48;5;252;38;5;234m▄\u001b[48;5;251m▄\u001b[48;5;253;38;5;240m▄\u001b[48;5;254;38;5;244m▄\u001b[38;5;252m▄ \u001b[48;5;241m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[38;5;233m▄\u001b[48;5;233;38;5;240m▄\u001b[48;5;232;38;5;234m▄ \u001b[48;5;237;38;5;0m▄\u001b[48;5;242m▄\u001b[48;5;234;38;5;232m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;245;38;5;236m▄\u001b[48;5;255;38;5;253m▄\u001b[48;5;242;38;5;245m▄\u001b[48;5;232m \u001b[48;5;233;38;5;234m▄\u001b[48;5;242;38;5;250m▄\u001b[48;5;252;38;5;247m▄\u001b[48;5;254;38;5;238m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;236;38;5;0m▄\u001b[48;5;0;38;5;234m▄\u001b[48;5;232;38;5;245m▄\u001b[48;5;245;38;5;244m▄\u001b[48;5;246;38;5;234m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;238m▄\u001b[48;5;238;38;5;252m▄\u001b[48;5;253;38;5;249m▄\u001b[48;5;245;38;5;235m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;233;38;5;235m▄\u001b[48;5;238;38;5;250m▄\u001b[48;5;251;38;5;254m▄\u001b[48;5;255;38;5;243m▄\u001b[48;5;241;38;5;236m▄\u001b[48;5;0m▄\u001b[48;5;234;38;5;247m▄\u001b[48;5;237;38;5;253m▄\u001b[48;5;234;38;5;249m▄\u001b[48;5;242m \u001b[48;5;233;38;5;0m▄\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;234m \u001b[48;5;252m \u001b[48;5;249;38;5;248m▄\u001b[48;5;232m \u001b[48;5;233;38;5;0m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;236m▄\u001b[48;5;234;38;5;249m▄\u001b[48;5;248;38;5;246m▄\u001b[48;5;246;38;5;234m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[38;5;240m▄\u001b[48;5;241;38;5;253m▄\u001b[48;5;252;38;5;248m▄\u001b[48;5;249;38;5;235m▄\u001b[48;5;234;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;234;38;5;233m▄\u001b[48;5;249;38;5;247m▄\u001b[48;5;254m \u001b[48;5;246;38;5;254m▄\u001b[48;5;248m▄\u001b[48;5;253m▄\u001b[48;5;254;38;5;251m▄\u001b[48;5;252;38;5;238m▄\u001b[48;5;245;38;5;233m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;234;38;5;246m▄\u001b[48;5;244;38;5;255m▄\u001b[48;5;249;38;5;253m▄\u001b[48;5;250;38;5;246m▄\u001b[38;5;245m▄\u001b[38;5;244m▄\u001b[38;5;240m▄\u001b[48;5;248;38;5;244m▄\u001b[48;5;246;38;5;253m▄\u001b[48;5;254m \u001b[48;5;243;38;5;251m▄\u001b[48;5;0;38;5;241m▄\u001b[48;5;232m \u001b[48;5;0;38;5;236m▄\u001b[48;5;232;38;5;245m▄\u001b[48;5;233;38;5;248m▄\u001b[48;5;235;38;5;250m▄\u001b[48;5;234;38;5;249m▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;247;38;5;246m▄\u001b[48;5;248;38;5;233m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;237;38;5;247m▄\u001b[48;5;253;38;5;251m▄\u001b[48;5;248;38;5;235m▄\u001b[48;5;233;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;235m▄\u001b[38;5;244m▄\u001b[48;5;236;38;5;252m▄\u001b[48;5;245;38;5;254m▄\u001b[48;5;253m \u001b[48;5;254m \u001b[38;5;253m▄\u001b[48;5;251;38;5;243m▄\u001b[48;5;237;38;5;232m▄\u001b[48;5;234m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;235m▄\u001b[48;5;251;38;5;246m▄\u001b[48;5;252;38;5;255m▄\u001b[48;5;240;38;5;250m▄\u001b[48;5;233;38;5;245m▄\u001b[48;5;0;38;5;242m▄\u001b[48;5;232;38;5;245m▄\u001b[48;5;234;38;5;251m▄\u001b[48;5;245;38;5;255m▄\u001b[48;5;254;38;5;251m▄\u001b[48;5;252;38;5;237m▄\u001b[48;5;253;38;5;239m▄\u001b[48;5;254;38;5;250m▄\u001b[48;5;242;38;5;254m▄\u001b[48;5;232;38;5;236m▄ \u001b[38;5;0m▄\u001b[48;5;235;38;5;245m▄\u001b[48;5;251m \u001b[48;5;250;38;5;234m▄\u001b[48;5;243;38;5;235m▄\u001b[48;5;249;38;5;248m▄\u001b[48;5;254;38;5;245m▄\u001b[48;5;253;38;5;237m▄\u001b[48;5;244;38;5;251m▄\u001b[48;5;232;38;5;241m▄ \u001b[48;5;235;38;5;237m▄\u001b[48;5;251m \u001b[48;5;242;38;5;237m▄\u001b[48;5;0m \u001b[48;5;232m \u001b[38;5;0m▄\u001b[38;5;234m▄\u001b[38;5;243m▄\u001b[38;5;237m▄\u001b[38;5;0m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;240;38;5;241m▄\u001b[48;5;254m \u001b[38;5;253m▄\u001b[38;5;251m▄\u001b[48;5;253;38;5;236m▄\u001b[48;5;243;38;5;232m▄\u001b[48;5;232m \u001b[48;5;235;38;5;232m▄\u001b[48;5;245m▄\u001b[48;5;253;38;5;237m▄\u001b[48;5;254;38;5;240m▄\u001b[48;5;255;38;5;239m▄\u001b[48;5;254;38;5;240m▄\u001b[48;5;253;38;5;237m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;237;38;5;0m▄\u001b[48;5;0;38;5;232m▄ \u001b[48;5;237;38;5;238m▄\u001b[48;5;252;38;5;253m▄\u001b[48;5;238m \u001b[48;5;0m \u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;242;38;5;235m▄\u001b[48;5;251m \u001b[48;5;241;38;5;253m▄\u001b[48;5;249;38;5;244m▄\u001b[48;5;246;38;5;232m▄\u001b[48;5;234m▄\u001b[48;5;0m \u001b[48;5;245;38;5;242m▄\u001b[48;5;248;38;5;249m▄\u001b[48;5;232m \u001b[48;5;233;38;5;0m▄\u001b[48;5;250;38;5;240m▄\u001b[48;5;246;38;5;253m▄\u001b[48;5;233;38;5;249m▄\u001b[48;5;0;38;5;239m▄\u001b[38;5;237m▄\u001b[48;5;232;38;5;243m▄\u001b[48;5;236;38;5;252m▄\u001b[48;5;247;38;5;251m▄\u001b[48;5;252;38;5;238m▄\u001b[48;5;235;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;241;38;5;240m▄\u001b[48;5;255;38;5;251m▄\u001b[48;5;253;38;5;250m▄\u001b[48;5;241;38;5;237m▄\u001b[48;5;236;38;5;0m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄▄▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;240;38;5;233m▄\u001b[48;5;253;38;5;235m▄\u001b[48;5;237;38;5;232m▄\u001b[48;5;232m \u001b[48;5;236;38;5;0m▄\u001b[48;5;239m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;239;38;5;233m▄\u001b[48;5;244m▄\u001b[48;5;232m \u001b[48;5;239;38;5;0m▄\u001b[48;5;249;38;5;233m▄\u001b[48;5;254;38;5;235m▄\u001b[48;5;253m▄\u001b[48;5;250;38;5;234m▄\u001b[48;5;243;38;5;0m▄\u001b[48;5;235;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;242m▄\u001b[48;5;232;38;5;236m▄\u001b[38;5;0m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;236m▄\u001b[38;5;239m▄\u001b[48;5;232;38;5;243m▄\u001b[38;5;244m▄\u001b[48;5;234;38;5;252m▄\u001b[48;5;235m▄\u001b[48;5;234;38;5;248m▄\u001b[48;5;232;38;5;237m▄ \u001b[48;5;0;38;5;232m▄\u001b[48;5;236;38;5;235m▄\u001b[48;5;253;38;5;250m▄\u001b[48;5;251;38;5;255m▄\u001b[48;5;235;38;5;246m▄\u001b[48;5;0;38;5;233m▄\u001b[48;5;232m \u001b[48;5;0;38;5;237m▄\u001b[48;5;235;38;5;250m▄\u001b[48;5;247;38;5;245m▄\u001b[48;5;249;38;5;243m▄\u001b[48;5;237;38;5;248m▄\u001b[48;5;232;38;5;234m▄ \u001b[38;5;0m▄\u001b[48;5;0;38;5;235m▄\u001b[48;5;233;38;5;247m▄\u001b[48;5;235;38;5;252m▄\u001b[48;5;232;38;5;242m▄\u001b[38;5;244m▄\u001b[48;5;233;38;5;246m▄\u001b[48;5;232;38;5;234m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;242;38;5;239m▄\u001b[48;5;252;38;5;250m▄\u001b[48;5;253;38;5;243m▄\u001b[48;5;252;38;5;233m▄\u001b[48;5;245;38;5;232m▄\u001b[48;5;240;38;5;0m▄\u001b[48;5;237m▄\u001b[48;5;239;38;5;232m▄\u001b[48;5;246;38;5;247m▄\u001b[48;5;234;38;5;243m▄\u001b[48;5;232m \u001b[48;5;243;38;5;232m▄\u001b[48;5;254;38;5;250m▄ \u001b[48;5;246;38;5;254m▄\u001b[48;5;232;38;5;237m▄ \u001b[48;5;233;38;5;244m▄\u001b[48;5;244;38;5;237m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;250;38;5;247m▄\u001b[48;5;241;38;5;243m▄\u001b[48;5;0m \u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;237m▄\u001b[48;5;232;38;5;248m▄\u001b[48;5;239;38;5;254m▄\u001b[48;5;251;38;5;250m▄\u001b[48;5;254;38;5;241m▄\u001b[48;5;252;38;5;235m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;243;38;5;238m▄\u001b[48;5;251;38;5;248m▄\u001b[48;5;237;38;5;233m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;233;38;5;238m▄\u001b[48;5;250;38;5;254m▄\u001b[48;5;247;38;5;245m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;236m▄\u001b[48;5;246;38;5;251m▄\u001b[48;5;254;38;5;255m▄\u001b[48;5;251;38;5;242m▄\u001b[48;5;234;38;5;0m▄\u001b[48;5;232m \u001b[48;5;243;38;5;232m▄\u001b[48;5;233m▄\u001b[48;5;232m \u001b[38;5;234m▄\u001b[48;5;246;38;5;250m▄\u001b[48;5;242;38;5;243m▄\u001b[48;5;0m \u001b[48;5;232m \u001b[38;5;234m▄\u001b[48;5;238;38;5;249m▄\u001b[48;5;252;38;5;248m▄\u001b[38;5;235m▄\u001b[48;5;242;38;5;0m▄\u001b[48;5;234;38;5;232m▄\u001b[48;5;0m▄ \u001b[38;5;240m▄\u001b[48;5;247;38;5;251m▄\u001b[48;5;245;38;5;236m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;238m▄\u001b[48;5;235;38;5;250m▄\u001b[48;5;249;38;5;254m▄\u001b[48;5;252;38;5;240m▄\u001b[48;5;236;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[38;5;233m▄\u001b[48;5;0;38;5;242m▄\u001b[48;5;233;38;5;248m▄\u001b[48;5;240;38;5;254m▄\u001b[48;5;250;38;5;255m▄\u001b[48;5;255;38;5;252m▄\u001b[48;5;249;38;5;236m▄\u001b[48;5;235;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[38;5;0m▄▄ \u001b[38;5;234m▄\u001b[38;5;233m▄▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;237;38;5;244m▄\u001b[48;5;251;38;5;246m▄\u001b[48;5;239;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[48;5;234;38;5;0m▄\u001b[48;5;239m▄\u001b[48;5;233m▄\u001b[48;5;0m \u001b[48;5;232;38;5;0m▄▄\u001b[48;5;0;38;5;236m▄\u001b[48;5;239;38;5;250m▄\u001b[48;5;252;38;5;242m▄\u001b[48;5;240;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;240m▄\u001b[48;5;237;38;5;251m▄\u001b[48;5;253m \u001b[38;5;240m▄\u001b[48;5;242;38;5;0m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[38;5;234m▄\u001b[38;5;245m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;238;38;5;252m▄\u001b[48;5;246;38;5;255m▄\u001b[48;5;254m \u001b[48;5;255;38;5;254m▄\u001b[48;5;254;38;5;239m▄\u001b[48;5;249;38;5;0m▄\u001b[48;5;237m▄\u001b[48;5;0m \u001b[48;5;232;38;5;0m▄\u001b[48;5;0;38;5;240m▄\u001b[38;5;245m▄\u001b[48;5;232;38;5;234m▄ \u001b[38;5;242m▄\u001b[48;5;237;38;5;249m▄\u001b[48;5;240;38;5;244m▄\u001b[48;5;238;38;5;237m▄\u001b[48;5;243m▄\u001b[48;5;245;38;5;233m▄\u001b[48;5;246;38;5;234m▄\u001b[48;5;243m▄\u001b[48;5;247;38;5;248m▄\u001b[48;5;252m▄\u001b[48;5;245;38;5;239m▄\u001b[48;5;237;38;5;238m▄\u001b[48;5;234;38;5;236m▄\u001b[48;5;232m \u001b[38;5;242m▄\u001b[48;5;236;38;5;252m▄\u001b[48;5;237;38;5;253m▄▄▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;237;38;5;253m▄\u001b[48;5;249;38;5;246m▄\u001b[48;5;244;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;241m▄\u001b[48;5;241;38;5;252m▄\u001b[48;5;251;38;5;248m▄\u001b[38;5;237m▄\u001b[48;5;241;38;5;0m▄\u001b[48;5;232m \u001b[48;5;233;38;5;234m▄\u001b[48;5;248;38;5;250m▄\u001b[48;5;255;38;5;254m▄\u001b[48;5;254;38;5;255m▄ \u001b[48;5;252;38;5;254m▄\u001b[48;5;247m▄\u001b[48;5;242m▄\u001b[48;5;243m▄\u001b[38;5;255m▄\u001b[48;5;244m▄\u001b[48;5;250m▄\u001b[48;5;254;38;5;250m▄\u001b[48;5;249;38;5;235m▄\u001b[48;5;233;38;5;0m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;236;38;5;242m▄\u001b[48;5;250;38;5;244m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;0;38;5;232m▄▄▄\u001b[48;5;232;38;5;0m▄\u001b[48;5;0;38;5;240m▄\u001b[48;5;240;38;5;248m▄\u001b[48;5;249;38;5;238m▄\u001b[48;5;236;38;5;0m▄\u001b[48;5;0;38;5;232m▄▄\u001b[48;5;232m \u001b[48;5;0m \u001b[48;5;238m \u001b[48;5;253m \u001b[48;5;254;38;5;255m▄\u001b[48;5;252;38;5;254m▄\u001b[48;5;253m \u001b[48;5;255;38;5;248m▄\u001b[48;5;253;38;5;239m▄\u001b[48;5;254;38;5;241m▄\u001b[48;5;253;38;5;250m▄\u001b[48;5;244;38;5;255m▄\u001b[48;5;233;38;5;245m▄\u001b[48;5;0;38;5;233m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;239;38;5;238m▄\u001b[48;5;253m \u001b[38;5;255m▄\u001b[48;5;242;38;5;254m▄\u001b[48;5;233;38;5;248m▄\u001b[48;5;232;38;5;246m▄▄\u001b[38;5;241m▄\u001b[38;5;233m▄ \u001b[48;5;234;38;5;232m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;241m▄\u001b[48;5;244;38;5;232m▄\u001b[48;5;248m▄\u001b[48;5;249m▄\u001b[48;5;253;38;5;233m▄\u001b[38;5;238m▄\u001b[48;5;254m▄\u001b[48;5;249;38;5;233m▄\u001b[48;5;246;38;5;232m▄\u001b[48;5;243m▄\u001b[48;5;235;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;240;38;5;232m▄\u001b[48;5;248;38;5;243m▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;232;38;5;249m▄\u001b[38;5;251m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;243m \u001b[48;5;246;38;5;233m▄\u001b[48;5;234;38;5;0m▄\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;239;38;5;0m▄\u001b[48;5;242;38;5;232m▄\u001b[48;5;243m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;234;38;5;232m▄\u001b[48;5;0m▄▄\u001b[48;5;236;38;5;0m▄\u001b[48;5;250;38;5;237m▄\u001b[48;5;254;38;5;252m▄\u001b[48;5;246;38;5;254m▄\u001b[48;5;232;38;5;241m▄\u001b[38;5;0m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;239;38;5;0m▄\u001b[48;5;243;38;5;232m▄\u001b[38;5;0m▄\u001b[48;5;247;38;5;233m▄\u001b[48;5;248m▄\u001b[48;5;249m▄\u001b[48;5;250;38;5;234m▄\u001b[48;5;236;38;5;233m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;237;38;5;0m▄\u001b[48;5;241m▄\u001b[48;5;242m▄\u001b[48;5;237m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;242m▄\u001b[48;5;255;38;5;235m▄\u001b[48;5;249m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;0m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;237m▄\u001b[38;5;236m▄\u001b[38;5;238m▄\u001b[38;5;242m▄\u001b[38;5;241m▄\u001b[38;5;239m▄\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;240m▄\u001b[48;5;232;38;5;246m▄▄\u001b[48;5;234;38;5;252m▄\u001b[48;5;235;38;5;255m▄\u001b[48;5;234;38;5;252m▄\u001b[48;5;235;38;5;254m▄\u001b[48;5;234;38;5;252m▄\u001b[48;5;232;38;5;236m▄\u001b[38;5;0m▄ \u001b[38;5;0m▄\u001b[38;5;238m▄\u001b[48;5;0;38;5;242m▄\u001b[48;5;232;38;5;233m▄ \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;236m▄\u001b[48;5;245;38;5;253m▄\u001b[48;5;252m \u001b[38;5;248m▄\u001b[38;5;244m▄\u001b[48;5;255;38;5;245m▄\u001b[48;5;231;38;5;247m▄\u001b[48;5;253m \u001b[48;5;241;38;5;253m▄\u001b[48;5;232;38;5;240m▄\u001b[38;5;0m▄ \u001b[38;5;0m▄▄\u001b[38;5;235m▄\u001b[48;5;0;38;5;237m▄\u001b[38;5;238m▄▄▄▄\u001b[48;5;232;38;5;234m▄ \u001b[48;5;234;38;5;232m▄\u001b[48;5;243m▄\u001b[48;5;246m▄\u001b[48;5;242m▄\u001b[48;5;239;38;5;0m▄\u001b[48;5;240m▄▄▄\u001b[38;5;232m▄\u001b[48;5;234m▄\u001b[48;5;232m \u001b[38;5;235m▄\u001b[48;5;236;38;5;246m▄\u001b[48;5;237;38;5;236m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;236m▄\u001b[48;5;233;38;5;247m▄\u001b[48;5;239;38;5;242m▄\u001b[48;5;244;38;5;238m▄\u001b[48;5;246;38;5;240m▄\u001b[48;5;235;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;237;38;5;233m▄\u001b[48;5;252;38;5;240m▄\u001b[48;5;240;38;5;234m▄\u001b[48;5;0m \u001b[48;5;232;38;5;0m▄\u001b[48;5;241m▄\u001b[48;5;253;38;5;245m▄\u001b[48;5;250;38;5;254m▄\u001b[48;5;235;38;5;238m▄\u001b[48;5;0m \u001b[48;5;232m \u001b[38;5;0m▄\u001b[38;5;235m▄\u001b[48;5;0;38;5;245m▄\u001b[48;5;233;38;5;252m▄\u001b[48;5;239m▄\u001b[48;5;245;38;5;248m▄\u001b[48;5;250;38;5;240m▄\u001b[48;5;252;38;5;235m▄\u001b[48;5;249;38;5;233m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;244;38;5;236m▄\u001b[48;5;247;38;5;250m▄\u001b[48;5;251;38;5;248m▄\u001b[48;5;235;38;5;234m▄\u001b[48;5;232m \u001b[38;5;0m▄ \u001b[38;5;245m▄\u001b[48;5;239;38;5;254m▄\u001b[48;5;244;38;5;249m▄\u001b[48;5;236;38;5;235m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;233;38;5;234m▄\u001b[48;5;246;38;5;241m▄\u001b[48;5;242;38;5;233m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;233;38;5;243m▄\u001b[48;5;243;38;5;249m▄\u001b[48;5;248;38;5;236m▄\u001b[48;5;239;38;5;0m▄\u001b[48;5;233;38;5;241m▄\u001b[48;5;243;38;5;242m▄\u001b[48;5;235;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[38;5;235m▄\u001b[48;5;233;38;5;247m▄\u001b[48;5;237;38;5;252m▄▄\u001b[38;5;253m▄\u001b[48;5;239m▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;242m▄\u001b[48;5;253m \u001b[48;5;238;38;5;239m▄\u001b[48;5;0m \u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;237m▄\u001b[48;5;238;38;5;252m▄\u001b[48;5;251;38;5;248m▄\u001b[48;5;250;38;5;236m▄\u001b[48;5;246;38;5;0m▄\u001b[48;5;239m▄\u001b[48;5;232m▄\u001b[48;5;0;38;5;234m▄\u001b[38;5;245m▄\u001b[48;5;232;38;5;248m▄\u001b[48;5;238;38;5;241m▄\u001b[48;5;248;38;5;236m▄\u001b[48;5;243;38;5;232m▄\u001b[48;5;233m▄\u001b[48;5;232m \u001b[38;5;0m▄\u001b[48;5;0;38;5;237m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;245;38;5;249m▄\u001b[48;5;251;38;5;236m▄\u001b[48;5;242;38;5;0m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[38;5;233m▄\u001b[48;5;0;38;5;241m▄▄\u001b[48;5;232;38;5;234m▄ \u001b[48;5;237;38;5;0m▄\u001b[48;5;234m▄\u001b[48;5;0;38;5;234m▄\u001b[48;5;237;38;5;245m▄\u001b[48;5;247;38;5;237m▄\u001b[48;5;233;38;5;0m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;247;38;5;250m▄\u001b[48;5;255;38;5;254m▄\u001b[48;5;254;38;5;242m▄\u001b[48;5;251;38;5;235m▄\u001b[48;5;248;38;5;232m▄\u001b[48;5;250;38;5;234m▄\u001b[48;5;254;38;5;246m▄ \u001b[48;5;241;38;5;248m▄\u001b[48;5;0;38;5;233m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;239m▄\u001b[48;5;243m▄\u001b[48;5;233;38;5;0m▄\u001b[48;5;232m \u001b[48;5;0;38;5;239m▄\u001b[48;5;235;38;5;250m▄\u001b[48;5;242;38;5;254m▄\u001b[48;5;251;38;5;243m▄\u001b[48;5;250;38;5;235m▄\u001b[48;5;240;38;5;0m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;233m▄\u001b[48;5;235;38;5;248m▄\u001b[48;5;252;38;5;250m▄\u001b[48;5;249;38;5;235m▄\u001b[48;5;234;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;234;38;5;232m▄\u001b[48;5;242;38;5;0m▄\u001b[48;5;235;38;5;232m▄\u001b[48;5;232;38;5;0m▄\u001b[38;5;233m▄\u001b[48;5;0;38;5;239m▄\u001b[38;5;244m▄\u001b[48;5;232;38;5;246m▄\u001b[48;5;0;38;5;245m▄\u001b[48;5;232;38;5;247m▄\u001b[48;5;246;38;5;244m▄\u001b[48;5;241;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;245;38;5;242m▄\u001b[48;5;254;38;5;255m▄\u001b[48;5;237;38;5;244m▄\u001b[48;5;0;38;5;234m▄\u001b[38;5;233m▄\u001b[48;5;232;38;5;244m▄\u001b[48;5;245;38;5;255m▄\u001b[48;5;254;38;5;253m▄\u001b[48;5;253;38;5;239m▄\u001b[48;5;254;38;5;245m▄\u001b[48;5;246;38;5;253m▄\u001b[48;5;233;38;5;238m▄\u001b[48;5;232;38;5;0m▄ \u001b[48;5;0;38;5;238m▄\u001b[48;5;235;38;5;251m▄\u001b[48;5;246;38;5;255m▄\u001b[48;5;253m▄\u001b[38;5;252m▄\u001b[48;5;246;38;5;251m▄\u001b[48;5;244;38;5;247m▄\u001b[48;5;246m \u001b[48;5;250;38;5;242m▄\u001b[48;5;251m▄▄▄\u001b[48;5;250;38;5;246m▄\u001b[48;5;241m▄\u001b[48;5;232m \u001b[48;5;0;38;5;233m▄\u001b[48;5;242;38;5;248m▄\u001b[48;5;253;38;5;250m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[48;5;238;38;5;248m▄\u001b[48;5;250;38;5;244m▄\u001b[38;5;234m▄\u001b[48;5;245;38;5;240m▄\u001b[38;5;249m▄\u001b[48;5;254;38;5;243m▄\u001b[48;5;251;38;5;233m▄\u001b[48;5;248;38;5;239m▄\u001b[48;5;236;38;5;244m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;235m▄\u001b[48;5;250;38;5;238m▄\u001b[48;5;254;38;5;248m▄\u001b[48;5;250;38;5;254m▄\u001b[48;5;249m▄\u001b[48;5;254;38;5;248m▄\u001b[48;5;253;38;5;237m▄\u001b[48;5;244;38;5;232m▄\u001b[48;5;0m \u001b[48;5;238;38;5;236m▄\u001b[48;5;254m \u001b[48;5;243;38;5;245m▄\u001b[48;5;232m \u001b[48;5;248;38;5;238m▄\u001b[48;5;253;38;5;234m▄\u001b[48;5;247;38;5;232m▄\u001b[48;5;240;38;5;0m▄\u001b[48;5;237m▄\u001b[48;5;235m▄\u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄▄▄▄\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;232m \u001b[48;5;235;38;5;232m▄\u001b[48;5;250;38;5;243m▄\u001b[48;5;251;38;5;255m▄\u001b[48;5;234;38;5;250m▄\u001b[48;5;232;38;5;245m▄▄▄\u001b[38;5;246m▄\u001b[38;5;248m▄\u001b[38;5;236m▄\u001b[38;5;0m▄ \u001b[48;5;245;38;5;234m▄\u001b[48;5;248;38;5;238m▄\u001b[48;5;247;38;5;237m▄\u001b[38;5;233m▄\u001b[48;5;238;38;5;0m▄\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;243;38;5;234m▄\u001b[48;5;236;38;5;233m▄\u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;233m▄\u001b[48;5;239;38;5;0m▄▄\u001b[48;5;235;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[48;5;250;38;5;240m▄\u001b[48;5;245;38;5;242m▄\u001b[48;5;232m \u001b[48;5;233;38;5;232m▄\u001b[48;5;242m▄\u001b[48;5;253;38;5;234m▄\u001b[48;5;255;38;5;235m▄\u001b[48;5;254m▄▄\u001b[48;5;253m▄\u001b[48;5;249;38;5;233m▄\u001b[48;5;236;38;5;232m▄\u001b[48;5;0m▄\u001b[48;5;232m \u001b[0m│\n",
"│\u001b[48;5;232m \u001b[48;5;0;38;5;232m▄\u001b[48;5;232m \u001b[0m│\n",
"\u001b[0m└ ┘\u001b[?25h\n"
]
},
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m80\u001b[0m×\u001b[33m80\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m 0.0\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m 8.0e-5\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m -0.0007\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m-0.00269\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m-0.00279\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m-0.00278\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m-0.00278\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 0.0 0.0\u001b[0m … \u001b[33m-0.00113\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│ ⋮ ⋮ ⋮ ⋮ ⋮ … ⋮ ⋮ ⋮ ⋮ │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m-0.00371 0.0085\u001b[0m … \u001b[33m 9.0e-5\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m-0.00487 0.02283\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m-0.00278-0.00287\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m-0.00177-0.01581\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m -1.6e-4-0.02008\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 3.0e-5-0.00158\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 1.7e-4\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m … \u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x[1100..1115]\n",
"|> list_of_rows()\n",
"|> Enum.map(&(reshape(&1, 20, 20)\n",
"|> transpose()))\n",
"|> reshape(4, 4)\n",
"|> heatmap()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m5000\u001b[0m×\u001b[33m1\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│\u001b[33m 10.0 \u001b[37m│\n",
"│ ⋮ │\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[37m│\n",
"│\u001b[33m 9.0 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y = Matrex.load(\"resources/matrex/test/data/Y.mtx\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m400\u001b[0m×\u001b[33m1\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│ ⋮ │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[37m│\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"theta = Matrex.zeros(x[:cols], 1)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"100"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lambda = 0.01\n",
"iterations = 100"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m10\u001b[0m×\u001b[33m400\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 1.2e-4-0.00107-0.00117\u001b[0m … \u001b[33m-0.07428 0.00924 0.0\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m -9.0e-5 0.00102 -6.2e-4\u001b[0m … \u001b[33m 0.02237 0.00611 -0.0007\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m -5.0e-5-0.00108 0.02117\u001b[0m … \u001b[33m 0.00117 -4.0e-5 0.0\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m -1.0e-5 6.0e-5 0.0013\u001b[0m … \u001b[33m-0.00308 2.6e-4 1.0e-5\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 0.0 2.3e-4-0.00268\u001b[0m … \u001b[33m 0.01584-0.00147 0.0\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 0.0 4.0e-5 -3.1e-4\u001b[0m … \u001b[33m 0.0044 -4.7e-4 1.0e-5\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m -3.0e-5 0.0002 0.001\u001b[0m … \u001b[33m-0.00276 -6.6e-4 8.0e-5\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m -6.0e-5 5.2e-4 5.9e-4\u001b[0m … \u001b[33m-0.00499 -0.0035 3.7e-4\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 0.0 5.0e-5 1.5e-4\u001b[0m … \u001b[33m 2.1e-4-0.00525 4.2e-4\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 0.0 -1.0e-5 1.6e-4\u001b[0m … \u001b[33m 0.00163 -3.7e-4 1.0e-5\u001b[38;5;102m 0.0\u001b[33m \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"solutions =\n",
" 1..10 # Our ten digits, we wish to recognize\n",
" |> Task.async_stream(\n",
" fn digit ->\n",
" # Prepare labels matrix with only current digit labeled with 1.0\n",
" y3 = Matrex.apply(y, fn val -> if(val == digit, do: 1.0, else: 0.0) end)\n",
"\n",
" # Use fmincg() optimizer (ported to Elixir with Matrex functions) with previously defined cost function.\n",
" {sX, fX, _i} =\n",
" Matrex.Algorithms.fmincg(&LinearRegression.lr_cost_fun/3, theta, {x, y3, lambda}, iterations)\n",
" \n",
" # Return the digit itself and the best found solution, which is a column matrix 401x1\n",
" {digit, List.last(fX), sX}\n",
" end,\n",
" max_concurrency: 4\n",
" ) # Merge all 10 found solution column matrices into one 10x401 solutions matrix\n",
" |> Enum.map(fn {:ok, {_d, _l, theta}} -> Matrex.to_list(theta) end)\n",
" |> Matrex.new()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m5000\u001b[0m×\u001b[33m10\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 0.0 1.8e-4 8.0e-5 0.0 1.4e-4\u001b[0m … \u001b[33m 0.0 1.5e-4 0.00148 0.99992\u001b[0m │\n",
"│\u001b[33m 0.0 1.0e-5 7.0e-5 0.0 0.00637\u001b[0m … \u001b[33m 0.0 0.0 1.0e-5 0.99995\u001b[0m │\n",
"│\u001b[33m 0.0 1.1e-4 3.0e-5 0.0 1.9e-4\u001b[0m … \u001b[33m 0.0 0.00972 0.00116 0.9976\u001b[0m │\n",
"│\u001b[33m 0.0 1.2e-4 1.0e-5 0.0 0.0\u001b[0m … \u001b[33m 0.0 6.0e-5 1.7e-4 0.99986\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 1.0e-5 0.0 0.00167\u001b[0m … \u001b[33m 0.0 1.0e-5 0.0 0.98872\u001b[0m │\n",
"│\u001b[33m 0.0 5.0e-5 0.0 0.0 1.0e-5\u001b[0m … \u001b[33m 0.0 0.00696 1.0e-5 1.0\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 0.01038 0.0 0.0\u001b[0m … \u001b[33m 0.0 1.0e-5 1.0e-5 0.9493\u001b[0m │\n",
"│\u001b[33m 0.0 0.37895 0.00361 0.0 0.11678\u001b[0m … \u001b[33m 0.0 0.0175 0.0 0.9214\u001b[0m │\n",
"│\u001b[33m 0.0 3.0e-5 1.1e-4 0.0 3.1e-4\u001b[0m … \u001b[33m 0.0 0.00435 5.0e-5 0.99452\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 0.23053 0.0 0.00105\u001b[0m … \u001b[33m 0.0 1.0e-5 0.00154 0.99776\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 0.0005 0.0 0.15892\u001b[0m … \u001b[33m 0.0 0.00191 2.8e-4 0.98208\u001b[0m │\n",
"│ ⋮ ⋮ ⋮ ⋮ ⋮ … ⋮ ⋮ ⋮ ⋮ │\n",
"│\u001b[33m 0.0 1.0e-5 0.74765 0.0 0.00116\u001b[0m … \u001b[33m 2.0e-5 0.00113 0.00966 1.0e-5\u001b[0m │\n",
"│\u001b[33m 0.0 6.0e-5 2.9e-4 0.01534 4.4e-4\u001b[0m … \u001b[33m 0.0075 0.02059 0.98074 0.0\u001b[0m │\n",
"│\u001b[33m 0.0 2.0e-5 1.0e-5 4.5e-4 0.0\u001b[0m … \u001b[33m 0.00804 0.01399 0.80344 0.0\u001b[0m │\n",
"│\u001b[33m 0.0 1.0e-5 0.0 8.9e-4 0.0\u001b[0m … \u001b[33m 0.00173 0.32175 0.94479 0.0\u001b[0m │\n",
"│\u001b[33m 0.0 4.0e-5 0.0 0.00114 0.0\u001b[0m … \u001b[33m 0.03529 0.01958 0.89826 0.00213\u001b[0m │\n",
"│\u001b[33m 1.0e-5 5.0e-5 1.7e-4 0.02086 0.01135\u001b[0m … \u001b[33m 0.00577 0.00132 0.94976 0.0001\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 0.0 0.0 0.0\u001b[0m … \u001b[33m 8.6e-4 0.04835 0.96422 0.0\u001b[0m │\n",
"│\u001b[33m 0.00496 0.00175 0.26107 1.1e-4 0.07533\u001b[0m … \u001b[33m 5.0e-5 0.00839 0.88033 0.0\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 0.0 0.03696 6.9e-4\u001b[0m … \u001b[33m 1.5e-4 0.00449 0.81857 0.0\u001b[0m │\n",
"│\u001b[33m 0.0 0.0 0.0 1.0e-5 0.0\u001b[0m … \u001b[33m 0.29215 0.10323 0.29345 0.0049 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictions =\n",
" x\n",
" |> Matrex.dot_nt(solutions)\n",
" |> Matrex.apply(:sigmoid)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"95.5"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"accuracy =\n",
" 1..predictions[:rows]\n",
" |> Enum.reduce(0, fn row, acc ->\n",
" if y[row] == predictions[row][:argmax], do: acc + 1, else: acc\n",
" end)\n",
" |> Kernel./(predictions[:rows])\n",
" |> Kernel.*(100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Enumerable protocol"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"true"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Enum.member?(m, 2.0)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Enum.count(m)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"45.0"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Enum.sum(m)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saving and loading matrix"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
":ok"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Matrex.random(5) |> Matrex.save(\"rand.mtx\")"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m5\u001b[0m×\u001b[33m5\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 0.87862 0.04598 0.51931 0.1271 0.54683\u001b[0m │\n",
"│\u001b[33m 0.92596 0.90734 0.77617 0.67619 0.76672\u001b[0m │\n",
"│\u001b[33m 0.52224 0.68494 0.52633 0.46003 0.84459\u001b[0m │\n",
"│\u001b[33m 0.96764 0.77753 0.35702 0.55002 0.7374\u001b[0m │\n",
"│\u001b[33m 0.21511 0.77983 0.40448 0.74108 0.58493 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Matrex.load(\"rand.mtx\")"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
":ok"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Matrex.magic(5) |> Matrex.divide(Matrex.eye(5)) |> Matrex.save(\"nan.csv\")"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m5\u001b[0m×\u001b[33m5\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 16.0\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[36m ∞ \u001b[33m 4.0\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m 12.0\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m 25.0\u001b[36m ∞ \u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[36m ∞ \u001b[33m 8.0 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Matrex.load(\"nan.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## NaN and Infinity"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m3\u001b[0m×\u001b[33m3\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m 1.0\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 1.0\u001b[38;5;102m 0.0\u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[38;5;102m 0.0\u001b[33m\u001b[38;5;102m 0.0\u001b[33m 1.0 \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = Matrex.eye(3)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0m#Matrex[\u001b[33m3\u001b[0m×\u001b[33m3\u001b[0m]\n",
"\u001b[0m┌ ┐\n",
"│\u001b[33m\u001b[36m ∞ \u001b[33m\u001b[31m NaN \u001b[33m\u001b[31m NaN \u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[31m NaN \u001b[33m\u001b[36m ∞ \u001b[33m\u001b[31m NaN \u001b[33m\u001b[0m │\n",
"│\u001b[33m\u001b[31m NaN \u001b[33m\u001b[31m NaN \u001b[33m\u001b[36m ∞ \u001b[33m \u001b[0m│\n",
"\u001b[0m└ ┘"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n = Matrex.divide(m, Matrex.zeros(3))"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
":inf"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n[1][1]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
":nan"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n[1][2]"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Elixir",
"language": "Elixir",
"name": "ielixir"
},
"language_info": {
"codemirror_mode": "elixir",
"file_extension": "ex",
"mimetype": "text/x-elixir",
"name": "elixir",
"nbconvert_exporter": "",
"pygments_lexer": "elixir",
"version": "#Version<1.6.5>"
}
},
"nbformat": 4,
"nbformat_minor": 2
}