{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# The archive\n", "\n", "When you fit a brush estimator, three new attributes are created: `best_estimator_`, `population_`, and `archive_`.\n", "\n", "Brush will store the pareto front using validation loss as a list in `archive_`. This pareto front is always created with individuals from the final population that are not dominated in objectives **scorer** and **complexity**. Setting `scorer` as an objective means optimizing the metric set as `scorer: str`.\n", "\n", "In case you need more flexibility, the `population_` will contain the entire final population, and you can iterate through this list to select individuals with different criteria. It is also good to remind that Brush supports different optimization objectives using the argument `objectives`.\n", "\n", "Each element from the archive is a Brush individual that can be serialized (JSON object)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from pybrush import BrushClassifier\n", "\n", "# load data\n", "df = pd.read_csv('../examples/datasets/d_analcatdata_aids.csv')\n", "X = df.drop(columns='target')\n", "y = df['target']" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generation 1/100 [/ ]\n", "Best model on Val:Logistic(Sum(-0.32,If(AIDS>=16068.00,If(AIDS>=20712.00,1.00*Add(1.00,AIDS),1.00*Mul(1.00,AIDS)),If(Total>=1601948.00,1.00*Mul(20712.00*AIDS,AIDS),If(AIDS>=258.00,AIDS,-0.32)))))\n", "Train Loss (Med): 0.77500 (0.56250)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 7 (95)\n", "Median complexity (Max): 992 (921596320)\n", "Time (s): 0.10080\n", "\n", "Generation 2/100 [// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 7 (98)\n", "Median complexity (Max): 176 (1657696672)\n", "Time (s): 0.14870\n", "\n", "Generation 3/100 [// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (93)\n", "Median complexity (Max): 176 (1304140832)\n", "Time (s): 0.19549\n", "\n", "Generation 4/100 [/// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (54)\n", "Median complexity (Max): 176 (12044960)\n", "Time (s): 0.23452\n", "\n", "Generation 5/100 [/// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (54)\n", "Median complexity (Max): 176 (12044960)\n", "Time (s): 0.26943\n", "\n", "Generation 6/100 [//// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (52)\n", "Median complexity (Max): 176 (12044960)\n", "Time (s): 0.30666\n", "\n", "Generation 7/100 [//// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (52)\n", "Median complexity (Max): 176 (12044960)\n", "Time (s): 0.34096\n", "\n", "Generation 8/100 [///// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (52)\n", "Median complexity (Max): 176 (11307680)\n", "Time (s): 0.37853\n", "\n", "Generation 9/100 [///// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (54)\n", "Median complexity (Max): 176 (11307680)\n", "Time (s): 0.41267\n", "\n", "Generation 10/100 [////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (54)\n", "Median complexity (Max): 176 (11307680)\n", "Time (s): 0.45000\n", "\n", "Generation 11/100 [////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (52)\n", "Median complexity (Max): 176 (10717856)\n", "Time (s): 0.48708\n", "\n", "Generation 12/100 [/////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (50)\n", "Median complexity (Max): 176 (10422944)\n", "Time (s): 0.52469\n", "\n", "Generation 13/100 [/////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (50)\n", "Median complexity (Max): 176 (10422944)\n", "Time (s): 0.55745\n", "\n", "Generation 14/100 [//////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (50)\n", "Median complexity (Max): 176 (10422944)\n", "Time (s): 0.59163\n", "\n", "Generation 15/100 [//////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.62577\n", "\n", "Generation 16/100 [///////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.65858\n", "\n", "Generation 17/100 [///////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.69383\n", "\n", "Generation 18/100 [////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.72813\n", "\n", "Generation 19/100 [////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.76378\n", "\n", "Generation 20/100 [/////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.80245\n", "\n", "Generation 21/100 [/////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (49)\n", "Median complexity (Max): 176 (10078880)\n", "Time (s): 0.83974\n", "\n", "Generation 22/100 [//////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (10078112)\n", "Time (s): 0.88074\n", "\n", "Generation 23/100 [//////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (10078112)\n", "Time (s): 0.92155\n", "\n", "Generation 24/100 [///////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (10078112)\n", "Time (s): 0.95491\n", "\n", "Generation 25/100 [///////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (10078112)\n", "Time (s): 0.99640\n", "\n", "Generation 26/100 [////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.03516\n", "\n", "Generation 27/100 [////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.07259\n", "\n", "Generation 28/100 [/////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.11719\n", "\n", "Generation 29/100 [/////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.15723\n", "\n", "Generation 30/100 [//////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.19967\n", "\n", "Generation 31/100 [//////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.24691\n", "\n", "Generation 32/100 [///////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.50000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.30097\n", "\n", "Generation 33/100 [///////////////// ]\n", "Best model on Val:Logistic(Sum(-8.68,0.52*AIDS))\n", "Train Loss (Med): 0.77500 (0.52500)\n", "Val Loss (Med): 0.70000 (0.60000)\n", "Median Size (Max): 5 (47)\n", "Median complexity (Max): 176 (5654432)\n", "Time (s): 1.34932\n", "\n", "Generation 34/100 [////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,AIDS,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (56)\n", "Median complexity (Max): 176 (21677984)\n", "Time (s): 1.40049\n", "\n", "Generation 35/100 [////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,AIDS,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.55000)\n", "Median Size (Max): 5 (56)\n", "Median complexity (Max): 176 (21677984)\n", "Time (s): 1.45974\n", "\n", "Generation 36/100 [/////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,AIDS,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (56)\n", "Median complexity (Max): 176 (21677984)\n", "Time (s): 1.52614\n", "\n", "Generation 37/100 [/////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (111)\n", "Median complexity (Max): 176 (1343408032)\n", "Time (s): 1.58717\n", "\n", "Generation 38/100 [//////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (104)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.64133\n", "\n", "Generation 39/100 [//////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (106)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.69622\n", "\n", "Generation 40/100 [///////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (106)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.75234\n", "\n", "Generation 41/100 [///////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (106)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.80336\n", "\n", "Generation 42/100 [////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (72)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.86306\n", "\n", "Generation 43/100 [////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (74)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.90866\n", "\n", "Generation 44/100 [/////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (74)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 1.95261\n", "\n", "Generation 45/100 [/////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (72)\n", "Median complexity (Max): 176 (20891552)\n", "Time (s): 2.01117\n", "\n", "Generation 46/100 [//////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (60)\n", "Median complexity (Max): 176 (73582496)\n", "Time (s): 2.06181\n", "\n", "Generation 47/100 [//////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (60)\n", "Median complexity (Max): 176 (73582496)\n", "Time (s): 2.13684\n", "\n", "Generation 48/100 [///////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (58)\n", "Median complexity (Max): 176 (31115168)\n", "Time (s): 2.18129\n", "\n", "Generation 49/100 [///////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,AIDS,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (58)\n", "Median complexity (Max): 176 (31115168)\n", "Time (s): 2.22840\n", "\n", "Generation 50/100 [////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,1.00*Cos(1.00*Exp(Total)),Total),If(Total>=1601948.00,1.00,If(AIDS>=258.00,1.00,1.00*Cos(Total)))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (60)\n", "Median complexity (Max): 176 (31115168)\n", "Time (s): 2.28667\n", "\n", "Generation 51/100 [////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,Cos(Exp(1.00)),Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (50)\n", "Median complexity (Max): 176 (29640608)\n", "Time (s): 2.46638\n", "\n", "Generation 52/100 [/////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,Cos(Exp(1.00)),Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (36)\n", "Median complexity (Max): 176 (4652960)\n", "Time (s): 2.56978\n", "\n", "Generation 53/100 [/////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,Cos(Exp(1.00)),Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (36)\n", "Median complexity (Max): 176 (4652960)\n", "Time (s): 2.66823\n", "\n", "Generation 54/100 [//////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,Cos(Exp(1.00)),Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (36)\n", "Median complexity (Max): 176 (4652960)\n", "Time (s): 2.78801\n", "\n", "Generation 55/100 [//////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,Cos(Exp(1.00)),Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.60000)\n", "Median Size (Max): 5 (36)\n", "Median complexity (Max): 176 (4652960)\n", "Time (s): 2.91201\n", "\n", "Generation 56/100 [///////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (2760608)\n", "Time (s): 3.02868\n", "\n", "Generation 57/100 [///////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (2760608)\n", "Time (s): 3.08023\n", "\n", "Generation 58/100 [////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (2760608)\n", "Time (s): 3.12875\n", "\n", "Generation 59/100 [////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (2760608)\n", "Time (s): 3.17882\n", "\n", "Generation 60/100 [/////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (2760608)\n", "Time (s): 3.22413\n", "\n", "Generation 61/100 [/////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (2760608)\n", "Time (s): 3.27697\n", "\n", "Generation 62/100 [//////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.32183\n", "\n", "Generation 63/100 [//////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.37218\n", "\n", "Generation 64/100 [///////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.42008\n", "\n", "Generation 65/100 [///////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.46696\n", "\n", "Generation 66/100 [////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.51688\n", "\n", "Generation 67/100 [////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.56779\n", "\n", "Generation 68/100 [/////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.61874\n", "\n", "Generation 69/100 [/////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.82500 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (31)\n", "Median complexity (Max): 176 (1279904)\n", "Time (s): 3.66529\n", "\n", "Generation 70/100 [//////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.75000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (19)\n", "Median complexity (Max): 176 (69536)\n", "Time (s): 3.71265\n", "\n", "Generation 71/100 [//////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.75000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (19)\n", "Median complexity (Max): 176 (69536)\n", "Time (s): 3.75228\n", "\n", "Generation 72/100 [///////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.75000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (19)\n", "Median complexity (Max): 176 (69536)\n", "Time (s): 3.80158\n", "\n", "Generation 73/100 [///////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.75000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (19)\n", "Median complexity (Max): 176 (69536)\n", "Time (s): 3.84654\n", "\n", "Generation 74/100 [////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (69536)\n", "Time (s): 3.89059\n", "\n", "Generation 75/100 [////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 3.95229\n", "\n", "Generation 76/100 [/////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.02272\n", "\n", "Generation 77/100 [/////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.08319\n", "\n", "Generation 78/100 [//////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.13113\n", "\n", "Generation 79/100 [//////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.18934\n", "\n", "Generation 80/100 [///////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.24344\n", "\n", "Generation 81/100 [///////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.30500\n", "\n", "Generation 82/100 [////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.39221\n", "\n", "Generation 83/100 [////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.43939\n", "\n", "Generation 84/100 [/////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (41)\n", "Median complexity (Max): 176 (473464736)\n", "Time (s): 4.48879\n", "\n", "Generation 85/100 [/////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (40)\n", "Median complexity (Max): 176 (1178785696)\n", "Time (s): 4.54237\n", "\n", "Generation 86/100 [//////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (40)\n", "Median complexity (Max): 176 (1178785696)\n", "Time (s): 4.61088\n", "\n", "Generation 87/100 [//////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (35)\n", "Median complexity (Max): 176 (321050528)\n", "Time (s): 4.69097\n", "\n", "Generation 88/100 [///////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (35)\n", "Median complexity (Max): 176 (321050528)\n", "Time (s): 4.75119\n", "\n", "Generation 89/100 [///////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (35)\n", "Median complexity (Max): 176 (321050528)\n", "Time (s): 4.80611\n", "\n", "Generation 90/100 [////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (35)\n", "Median complexity (Max): 176 (321050528)\n", "Time (s): 4.86054\n", "\n", "Generation 91/100 [////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (33)\n", "Median complexity (Max): 176 (66246560)\n", "Time (s): 4.92291\n", "\n", "Generation 92/100 [/////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (33)\n", "Median complexity (Max): 176 (66246560)\n", "Time (s): 4.97706\n", "\n", "Generation 93/100 [/////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.03965\n", "\n", "Generation 94/100 [//////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.08854\n", "\n", "Generation 95/100 [//////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.14694\n", "\n", "Generation 96/100 [///////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.18979\n", "\n", "Generation 97/100 [///////////////////////////////////////////////// ]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.23257\n", "\n", "Generation 98/100 [//////////////////////////////////////////////////]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.27898\n", "\n", "Generation 99/100 [//////////////////////////////////////////////////]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.34219\n", "\n", "Generation 100/100 [//////////////////////////////////////////////////]\n", "Best model on Val:Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "Train Loss (Med): 0.85000 (0.52500)\n", "Val Loss (Med): 0.90000 (0.50000)\n", "Median Size (Max): 5 (30)\n", "Median complexity (Max): 176 (11042720)\n", "Time (s): 5.39780\n", "\n", "Best model: Logistic(Sum(0.00,If(AIDS>=16068.00,1.00,1.00*Mul(If(Total>=1601948.00,-0.91,Total),If(AIDS>=258.00,1.00,Cos(Total))))))\n", "score: 0.84\n" ] } ], "source": [ "est = BrushClassifier(\n", " functions=['SplitBest','Add','Mul','Sin','Cos','Exp','Logabs'],\n", " objectives=[\"scorer\", \"linear_complexity\"],\n", " scorer='balanced_accuracy', # brush implements several metrics for clf and reg!\n", " max_gens=100,\n", " pop_size=100,\n", " max_depth=10,\n", " max_size=100,\n", " verbosity=2,\n", ")\n", "\n", "est.fit(X, y)\n", "\n", "print(\"Best model:\", est.best_estimator_.get_model())\n", "print('score:', est.score(X,y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see individuals from archive using the index:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "Logistic(Sum(-11.58,AIDS))\n" ] } ], "source": [ "print(len(est.archive_))\n", "\n", "print( est.archive_[-1].get_model() )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And you can call `predict` (or `predict_proba`, if your `est` is an instance of `BrushClassifier`) with individuals from the archive or population. But first you need to wrap the data in a Brush dataset to make feature names match:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, False, True, True, True, True,\n", " False, True, True, True, True])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pybrush import Dataset\n", "\n", "data = Dataset(X=X, ref_dataset=est.data_, \n", " feature_names=est.feature_names_)\n", "\n", "est.archive_[-1].predict(data)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 9.9999940e-01, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 3.7768183e-03, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 1.8871395e-04, 1.0000000e+00, 1.0000000e+00,\n", " 1.0000000e+00, 9.1870719e-01], dtype=float32)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "est.archive_[-1].predict_proba(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading a specific model from archive\n", "\n", "Use it as if it is a compatible sklearn estimator!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "ind_from_arch = est.archive_[-1]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Logistic(Sum(-11.58,AIDS))\n", "Fitness(0.600000 16.000000 )\n" ] } ], "source": [ "print(ind_from_arch.get_model())\n", "print(ind_from_arch.fitness)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To use this loaded model to do predictions, you need to wrap the data into a Dataset:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, False, True, True, True, True,\n", " False, True, True, True, True])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pybrush import Dataset\n", "\n", "data = Dataset(X=X, ref_dataset=est.data_, \n", " feature_names=est.feature_names_)\n", "ind_from_arch.predict(data)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, False, True, True, True, True,\n", " False, True, True, True, True])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ind_from_arch.predict(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing the Pareto front of the archive" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] }, { "data": { "text/plain": [ "Text(0, 0.5, 'Complexity (smaller is better)')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmgAAAGwCAYAAAAdapmWAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR/RJREFUeJzt3Qd0VFX+wPFfKKFJ7zWA0rs0aVJXBEVAUaQLCKsL0kREUaIoIIqIAguLSxNXwQLo/kHp0pESEOktktB7qEsgvP/5Xc7MmUmfSSZ5yXw/5wzkvXnz3p07M5lf7r2/ewMsy7IEAAAAtpEhtQsAAAAAdwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgM5lSuwDw3P379+X06dOSM2dOCQgISO3iAACARNCpZ69fvy7FihWTDBnibyMjQEuDNDgrWbJkahcDAAB4ITw8XEqUKBHvMQRoaZC2nDle4Fy5cqV2cQAAQCJcu3bNNLA4vsfjQ4CWBjm6NTU4I0ADACBtSczwJJIEAAAAbIYADQAAwGYI0AAAAGyGAA0AAMBmCNAAAABshgANAADAZgjQAAAAbIYADQAAwGYI0AAAAGyGAC2VdezYUfLmzSudOnVK7aIAAODXLEvk6lWR8+cf/K/bqYWlnlLZ4MGDpU+fPjJv3rzULgoAAH7rwgWR/ftFTp8WuXNHJEsWkWLFRCpXFilYMOXLQwtaKmvWrFmiFk0FAAC+C842bBA5flzXuRYpWfLB/7qt+/X+lGb7AG39+vXSrl07KVasmFlcdMmSJYl63KlTp6R79+6SP39+yZYtm1SrVk127NiR4mWbNm2alC5dWrJmzSr169eXbdu2JWsZAACA97QbU1vOIiJESpcWyZFDJGPGB//rtu7X+1O6u9P2AdrNmzelRo0aJtBJrCtXrkijRo0kc+bM8ssvv8j+/fvl008/NWO9YrNp0ya5e/dujP36uHPnznldtoULF8qwYcMkODhYQkJCzLGtW7eW89q5DQAAUl1ExINuzUKFRAIC3O/Tbd2v9+txKcn2Y9DatGljbp6YMGGClCxZUubMmePcV6ZMmViPvX//vgwYMEDKlSsnCxYskIwaNovIoUOHpEWLFibAGjFihFdlmzRpkvTr10969+5ttmfMmCFLly6V2bNny8iRI8VTGgjqLSoqyuPHAgCAmCIjH4w5y5o1ljvlwX7t4tTjUpLtW9C88fPPP0udOnXk+eefl0KFCkmtWrXkyy+/jPXYDBkyyLJly2TXrl3Ss2dPE7AdO3bMBGcdOnSIMzhLSGRkpOzcuVNatWrldi3d3rJli1fn1EBSW/W2b9/u1eMBAIC7wMAHCQH/+5/ESvfr/XpcSkqXAdrx48dl+vTpplVs+fLl8uqrr8qgQYPizJTUMWRr1qyRjRs3SteuXU1wpoGUnsNbFy9eNC1dhQsXdtuv22fPnnVu63U0kNQgsUSJEl4HbwAAwHO5cz/I1tTRR9HHmem27tf79biUZPsuTm9oK5i2oI0bN85sawva3r17TRdjr169Yn1MqVKlZP78+dK0aVMpW7aszJo1ywz897VVq1b5/BoAACB2+lWvU2lcuiTy118Pxpxpt6a2nGlwpoGZ3p8CIUH6b0ErWrSoVNbadFGpUiUJCwuL8zGaDNC/f3+TlXnr1i0ZOnRokspQoEABM54tepKBbhcpUiRJ5wYAAMlH5zlr0kSkbFmRa9dEwsMf/K/buj815kFLly1omsGpg/xdHT58WIKCguLsjmzZsqUJ4r7//ntzrM5PliVLFpk4caJXZQgMDJTatWvL6tWrzVg2R8uebg8cONCrcwIAAN/QIOzxxx9ka2pCgI4509azlG45SzMB2o0bN+To0aPO7dDQUNm9e7fky5fPdEtOnTpVFi9ebAIfB239atiwoenifOGFF8zcYzNnzjS36DRo0kxMDd50WoxMmTKZ1reVK1easWjFixePszUtobJpBqh2qWp3a7169WTy5Mlmag5HVicAALCPgACRPHnEHiybW7t2rQ7Zi3Hr1auXuT84ONgKCgqK8bj//ve/VtWqVa0sWbJYFStWtGbOnBnnNVasWGHdvn07xv6QkBArPDzc67KpKVOmWKVKlbICAwOtevXqWVu3brWSKiIiwlxH/wcAAGmDJ9/fAfpPageJ8My1a9ckd+7cEhERIbl0LQoAAJCuvr/TZZIAAABAWkaABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgAYAAGAzBGgAAAA2Q4AGAABgMwRoAAAANkOABgAAYDMEaAAAADZDgGYDHTt2lLx580qnTp1SuygAAMAGCNBsYPDgwfLVV1+ldjEAAIBNEKDZQLNmzSRnzpypXQwAAGATqR6grV+/Xtq1ayfFihWTgIAAWbJkSYKPee+998yxrreKFSu6HRMVFSXvvvuulClTRrJlyyYPP/ywfPDBB2JZVoqXfdq0aVK6dGnJmjWr1K9fX7Zt25ZsZQAAAOlPqgdoN2/elBo1apggxhNVqlSRM2fOOG8bN250u3/ChAkyffp0mTp1qhw4cMBsf/zxxzJlypRYz7dp0ya5e/dujP379++Xc+fOeV32hQsXyrBhwyQ4OFhCQkLM8a1bt5bz58979HwBAID/yJTaBWjTpo25eSpTpkxSpEiROO/fvHmztG/fXp566imzrS1Y3377baytV/fv35cBAwZIuXLlZMGCBZIxY0az/9ChQ9KiRQsTYI0YMcKrsk+aNEn69esnvXv3NtszZsyQpUuXyuzZs2XkyJEePWcNBPWmrYMAACD9SvUWNG8dOXLEdC2WLVtWunXrJmFhYW73N2zYUFavXi2HDx8223/88YdpZYstoMqQIYMsW7ZMdu3aJT179jQB27Fjx0xw1qFDh1iDs8SIjIyUnTt3SqtWrdyupdtbtmzx+HwaRGqL3vbt270qDwAASBu8akHTYOjEiRNy69YtKViwoOluzJIli6QUHcc1d+5cqVChgunefP/996VJkyayd+9e52B7bZ26du2aGZumLWLa6jR27FgTzMVGg701a9aY83Tt2tUEUBpIaTepty5evGiuW7hwYbf9un3w4EHntl5HA0jtMi1RooR8//330qBBA6+vCwAA/CRA++uvv0ywol2AJ0+edBtsHxgYaAKb/v37y3PPPWdaiXzJtRWsevXqJmALCgqS7777Tvr27Wv268//+c9/5JtvvjEB5O7du2XIkCEmEOvVq1es5y1VqpTMnz9fmjZtalrmZs2aZQb/+9qqVat8fg0AAJB2JCqSGjRokBncHhoaKh9++KHpZouIiDBdeGfPnjXdg40bN5bRo0ebgCmlu+Dy5Mkj5cuXl6NHjzr3vfHGG6YV7cUXX5Rq1apJjx49ZOjQoTJ+/Pg4z6PJABpkamamtg7q8UlRoEAB03oXPclAt+MbPwcAAPxbolrQcuTIIcePH5f8+fPHuK9QoUJmrJbeNFPx119/lfDwcKlbt66klBs3bpgxYxqEOWiAFb0lT4MlHV8WV3dky5YtpVKlSqaLUceu6fxk2nU7ceJEr8qlLYu1a9c2Y+F0LJvS6+v2wIEDvTonAABI/xIVoLm2Oun4Mw3KdE6v2Dz55JMeB1euLV/aSqfdkfny5TNdjjpNxuLFi01Q4zB8+HDTyqXdmqdPnzaBoQZfXbp0cR6j9+uYMz2HdnFqAoBmVPbp0ydGGTRo0m5TPZ9Oi6EZopUrV5aVK1eawLN48eKxtqYlVHalGaDapVqnTh2pV6+eTJ482Yw1c2R1AgAAxGB5ICoqysqcObN1+PBhK7msXbtWB7PFuPXq1cvcHxwcbAUFBbk9pnPnzlbRokWtwMBAq3jx4mb76NGjbsdcu3bNGjx4sFWqVCkra9asVtmyZa1Ro0ZZd+7cibUcK1assG7fvh1jf0hIiBUeHu5V2R2mTJliyqHlrVevnrV161YrKSIiIsx19H8AAJA2ePL9HaD/iAe0NUoHzz/22GOePAzJSLNTc+fObcYB5sqVK7WLAwAAkvn72+N0y48++sgMwNcpLQAAAJD8PG5By5s3rxmAf+/ePTMIXte5dHX58uXkLiOioQUNAID0/f3t8US1OsgdAAAAvuNxgBbXJK8AAABIHl5N+a9zjr3zzjtmWovz58+bfb/88ovs27cvmYoFAADgvzwO0NatW2dm5v/9999l0aJFZi4wpWtJ6nxkAAAASOEATZdP0uWedBJXTRJw0Aldt27dmsTiAAAAwOMA7c8//5SOHTvG2K+rC+hySQAAAEjhAE0XJj9z5kyM/bqUki6JBAAAgBQO0F588UV588035ezZsxIQEGDWsdy0aZNZH7Nnz55JLA4AAAA8DtDGjRsnFStWlJIlS5oEAV1U/PHHH5eGDRuazE4AAACk8EoCDuHh4WY8mgZptWrVknLlyiWxKEgsVhIAACDt8elanGPGjDFLPWkLWtu2beWFF14wwdnt27fNfQAAAEjhFrSMGTOaJAHN2nR16dIlsy8qKiqJRUJCaEEDACDt8WkLmsZzmhwQnU5Umy9fPk9PBwAAAG/X4sybN68JzPRWvnx5tyBNW810LNorr7yS2NMBAAAgqQHa5MmTTetZnz595P333zdNdA66okDp0qWlQYMGiT0dAAAAkhqg9erVy/xfpkwZadSokWTKlOiHAgAAwAMej0HTNTcvX74cY78mCWgCAQAAAJLGqySB2Ny5c8dt8XQAAAB4J9H9lF988YX5X5MD/v3vf8tDDz3kliSwfv16s8IAAAAAUihA++yzz5wtaDNmzHDrznQkCeh+AAAApFCAFhoaav5v3ry5LFq0yEy7AQAAABuMQVu7dq0JziIjI+XQoUNy7949HxQLAADAf3kcoOmam3379pXs2bNLlSpVJCwszOx/7bXX5KOPPvJFGQEAAPyKxwHayJEjzbJOv/32m2TNmtW5v1WrVrJw4cLkLh8AAIDf8Xi22SVLlphA7LHHHnNb7klb044dO5bc5QMAAPA7HregXbhwQQoVKhRj/82bN2NdRB0AAAA+DtDq1KkjS5cudW47gjKdG421OAEAAFKhi3PcuHHSpk0b2b9/v8ng/Pzzz83PmzdvlnXr1iVDkQAAAPybxy1ojRs3lt27d5vgrFq1arJixQrT5bllyxapXbu2b0oJAADgRwKsuBbXhG1du3ZNcufOLREREZIrV67ULg4AAEjm72+Puzgda28uXrxYDhw4YLYrV64s7du3l0yZvDodAAAAXHgcUe3bt0+eeeYZOXv2rFSoUMHsmzBhghQsWFD++9//StWqVT09JQAAAJIyBu3ll182c56dPHlSQkJCzC08PFyqV68u/fv39/R0AAAASGoLmiYI7Nixw22xdP157NixUrduXU9PBwAAgKS2oJUvX17OnTsXY//58+flkUce8fR0AAAA8CZA06wDx238+PEyaNAg+eGHH0w3p9705yFDhpixaAAAAEiBaTYyZMjgtoyT4yGOfa7bmuEJ32KaDQAA0p5kn2Zj7dq1yVU2AAAAJCBRAVrTpk0TcxgAAABSI0kAAAAAvkWABgAAYDMEaAAAADZDgAYAAJDWA7Tbt2/LrVu3nNsnTpyQyZMny4oVK5K7bAAAAH7J4wCtffv28tVXX5mfr169KvXr15dPP/3U7J8+fbovyggAAOBXPA7QdHH0Jk2amJ91BYHChQubVjQN2r744gtflBEAAMCveBygafdmzpw5zc/arfnss8+alQYee+wxE6gBAAAghQM0XRB9yZIlEh4eLsuXL5cnnnjCuVg6yw4BAACkQoA2evRoGT58uJQuXdqMP2vQoIGzNa1WrVrJUCQAAAD/lqjF0qM7e/asnDlzRmrUqGG6N9W2bdtMC1rFihV9UU64YLF0AADS9/e3V/OgFSlSxLSWOYIzVa9ePYIzL3Xs2FHy5s0rnTp1Su2iAACAtLJYuiYCzJ0710R7+nN8Fi1alFxl8xuDBw+WPn36yLx581K7KAAAIK0EaNocFxAQ4PwZyatZs2by22+/pXYxAACATSSqi3POnDnOqTX05/hunlq/fr20a9dOihUrZoJAzRBNyHvvvWeOdb3F1r166tQp6d69u+TPn1+yZcsm1apVkx07dnhcxqSWfdq0aSapImvWrCaxQsfrAQAA2HYtzps3b5pkAw1iPFGlShWTqOC4bdy40e3+K1euSKNGjSRz5szyyy+/yP79+82KBzrWKzabNm2Su3fvxtivjzt37pzXZV+4cKEMGzZMgoODzSS/enzr1q3NtCQAAABed3H6Ups2bczNU5kyZTLJCnGZMGGClCxZ0q1Vr0yZMrEee//+fRkwYICUK1dOFixYIBkzZjT7Dx06JC1atDAB1ogRI7wq+6RJk6Rfv37Su3dvsz1jxgxZunSpzJ49W0aOHJno5wsAAPxHqregeevIkSOma7Fs2bLSrVs3CQsLc7v/559/ljp16sjzzz8vhQoVMlmnX375Zazn0mzUZcuWya5du6Rnz54mYDt27JgJzjp06BBrcJYYkZGRsnPnTmnVqpXbtXR7y5YtHp9PW+oqV64sdevW9ao8AAAgbUiTAZqO49Ks0l9//dUs0B4aGmrWB71+/brzmOPHj5v7tFVMVzx49dVXZdCgQXFmSmqwt2bNGtNV2rVrVxOcaSCVlAXgL168KFFRUWa9Ule6rXPJOeh1NJDUILFEiRJxBm/ayqddrtu3b/e6TAAAIJ11ceoYrSeffNJ002ngk1pcuxWrV69uAragoCD57rvvpG/fvma/toJpC9q4cePMtrag7d2715S9V69esZ63VKlSMn/+fGnatKlpmZs1a5Yze9WXVq1a5fNrAACAdNqCpgPu9+zZI3aTJ08eKV++vBw9etS5r2jRoqY70FWlSpVidIW60mSA/v37m8xMXRR+6NChSSpXgQIFzHi26EkGuh3f+DkAAODfPO7i1GkrtGXJTm7cuGHGjGlQ5qAZnDrI39Xhw4dNS1tc3ZEtW7Y0QZxOtrt69WqTganrjnorMDBQateubc7loC17uu1YwxQAACDJWZz37t0zGYjaLafBR44cOWJkLXoaXLm2fOl4st27d0u+fPlMl+PUqVNl8eLFbkGOBk3ayqXB1unTp80UFtpS1aVLF+cx2vrVsGFD08X5wgsvmLnHZs6caW7RadCk3aZ6Pg3KNENUW99WrlxpxqIVL1481ta0hMquNANUu1S1u1WXw5o8ebKZnsOR1QkAAJDkAE3HcT366KPOFilX3ozX0oljmzdv7tzWgEZpUKOJANqypa1jrk6ePGmCsUuXLknBggWlcePGsnXrVvOzg2Y6amD31ltvyZgxY8wUGxocacZndJpZqYGcJhpoq5eDzlmmgajreT0pu+rcubNcuHBBRo8ebRIDatasaZIboicOAAAAOARYlmU5t5AmXLt2zSy5FRERYdZHBQAA6ev72+tpNrRrT6evuH37ttkmzgMAAEgeHgdo2q2og+k1a7Jt27ZmmSWl01u8/vrryVQsAAAA/+VxgKaD5XW6DZ2uInv27M79OtZKx1YBAAAghZMEVqxYYbo2dcZ7Vzpx7YkTJ5JYHAAAAHjcgqZTRLi2nDlcvnxZsmTJklzlAgAA8FseB2g6FcVXX33lNrWGziP28ccfu005AQAAgBTq4tRATJMEdA6wyMhIGTFihOzbt8+0oG3atMnLYgAAAMDrFrSqVauaCWp1ctj27dubLs9nn31Wdu3aJQ8//LCnpwMAAEA0TFSbBjFRLQAA6fv7O1FdnHv27En0xatXr57oYwEAAOBlgKbrR2oyQEKNbXpMVFRUYk4JAACApARooaGhiTkMAAAAKRWgBQUFJce1AAAAkFwB2s8//yyJ9cwzzyT6WAAAAHgZoHXo0CExhzEGDQAAIKUCNF0pAAAAADadqBYAAAA2W+pJ6eoB69atk7CwMLPck6tBgwYlV9kAAAD8kscBmi7p1LZtW7l165YJ1PLlyycXL16U7NmzS6FChQjQAAAAUrqLc+jQodKuXTu5cuWKZMuWTbZu3SonTpyQ2rVry8SJE5NaHgAAAL/ncYC2e/duef311yVDhgySMWNGuXPnjpQsWVI+/vhjefvtt31TSgAAAD/icYCWOXNmE5wp7dLUcWhKF/8MDw9P/hICAAD4GY/HoNWqVUu2b98u5cqVk6ZNm8ro0aPNGLT58+dL1apVfVNKAAAAP+JxC9q4ceOkaNGi5uexY8dK3rx55dVXX5ULFy7IzJkzfVFGAAAAvxJgWZaV2oWAZ65du2a6lCMiIiRXrlypXRwAAJDM399MVAsAAJDWx6BdunTJjDtbu3atnD9/PsYyUJcvX07O8gEAAPgdjwO0Hj16yNGjR6Vv375SuHBhs0A6AAAAUjFA27Bhg2zcuFFq1KiRjMUAAACA12PQKlasKLdv3/b0YQAAAPBVgPbPf/5TRo0aZRZL1/FompHgegMAAEAKd3HmyZPHBGItWrRw26+zdeh4tKioqCQWCQAAwL95HKB169bNLPf0zTffkCQAAABghwBt7969smvXLqlQoYIvygMAAOD3PB6DVqdOHRZFBwAAsFML2muvvSaDBw+WN954Q6pVq2a6O11Vr149OcsHAADgdzxeizNDhpiNbjoOjSSBlMNanAAApO/vb49b0EJDQ5NSNgAAACTA4wAtKCjI04cAAADAl0kC8+bNk6VLlzq3R4wYYeZGa9iwoZw4ccLT0wEAACCpAdq4ceMkW7Zs5uctW7bI1KlT5eOPP5YCBQrI0KFDPT0dAAAAktrFqVNsPPLII+bnJUuWSKdOnaR///7SqFEjadasmaenAwAAQFJb0B566CGzBqdasWKF/O1vfzM/Z82alUXUAQAAUqMFTQOyl19+WWrVqiWHDx+Wtm3bmv379u2T0qVLJ0eZAAAA/JrHLWjTpk2TBg0ayIULF+THH3+U/Pnzm/07d+6ULl26+KKMAAAAfsXjiWqR+pioFgCA9P39nagWtLCwMI8KcOrUKY+OBwAAgIcBWt26deXvf/+7bN++Pc5jNBr88ssvpWrVqqbrEwAAAD5MEti/f7+MHTvWJAhotmbt2rWlWLFi5ucrV66Y+zVJ4NFHHzVzojkSBwAAAODjMWg6jYauIrBx40azaoBu6wS1mtHZunVr03oG32MMGgAA6fv7mySBNIgADQCAtCfZkwQAAACQcgjQAAAAbIYADQAAwGYI0GygY8eOkjdvXrPwPAAAgMcB2s2bN31TEj82ePBg+eqrr1K7GAAAIK0GaIULF5Y+ffqYqTaQPJo1ayY5c+ZM7WIAAIC0GqB9/fXXcvnyZWnRooWUL19ePvroIzl9+rTXBVi/fr20a9fOTHwbEBAgS5YsSfAx7733njnW9VaxYsU4j9cy6jFDhgzxupxJKbsuMF+6dGkzsW/9+vVl27ZtyVoOAADg5wFahw4dTCCi622+8sor8s0330hQUJA8/fTTsmjRIrl3757HXaY1atQwQYwnqlSpImfOnHHe4mrR0+Wp/vWvf0n16tXjPd+mTZvk7t27MfbrKgnnzp3zuuwLFy6UYcOGSXBwsISEhJjjdVLf8+fPJ/gcAQCAf/I6SaBgwYIm8NizZ49MmjRJVq1aZQa5a2vS6NGj5datW4k6T5s2beTDDz80A+U9kSlTJilSpIjzpisaRHfjxg3p1q2bWSNUB+HH5f79+zJgwADp2rWrREVFOfcfOnTItBTOmzfP67Jr3fTr10969+4tlStXlhkzZkj27Nll9uzZ4ikNBPUcujYqAABIv7wO0LRVSdfd1IBh5MiRJjhbvXq1fPrpp6YlTVvafOnIkSMmGCxbtqwJwsLCwmIco0HXU089Ja1atYr3XBkyZJBly5bJrl27pGfPniZgO3bsmAnO9HmMGDHCqzJGRkbKzp073a6v19LtLVu2eHw+fT7aohffovUAAMBPFkt3pcHXnDlzZPny5SY4+8c//iHdu3eXPHnyOI9p2LChVKpUSXxFx3HNnTtXKlSoYLo333//fWnSpIns3bvXOdh+wYIFpksxscGMBntr1qwx59GWNA2gNJCaPn261+W8ePGiaZHTxApXun3w4EHntl7njz/+MF2mJUqUkO+//14aNGjg9XUBAICfBWjaVffiiy+aMVtxdbVpsDNq1CjxFe1adNCxZRqw6Ti47777Tvr27Svh4eFm6oqVK1eagfmJVapUKZk/f740bdrUtMzNmjXLDP73Ne0eBgAA8LqLU1usdNB9fOOgsmXLZgbFpxRtvdOM0qNHj5pt7VbUQfiPPvqoGaumt3Xr1skXX3xhfnYdZxa927Z///4mM1PH0A0dOjRJ5dJxcRkzZoyRZKDbOm4OAAAgWQI07UKMLQPx0qVLJhhJDZoMoGPGihYtarZbtmwpf/75p+zevdt5q1Onjhmrpj/HVk7tjtTHadesduPqeDrNwBw+fLjX5QoMDJTatWubczno+DbdpgsTAAAkWxenZVmx7r9z544JSLwJrhwtXyo0NNQEUfny5TNdjlOnTpXFixe7BTkaNGkrl3Zr6hxs2lqnQVeXLl2cQWTVqlXdrpMjRw7Jnz9/jP2OoEm7TfV8GpRpK5uOr9MuUk0UKF68eKytaQmVXWmma69evUyAWK9ePZk8ebIZa6ZdxQAAAEkK0LR7UOmYrH//+9/y0EMPOe/TLkOdtDW+yWLjsmPHDmnevLlzWwMapUGNJgJoy5a2jrk6efKkCca01U6n+2jcuLFs3brV/OwNzawcN26cSRBwDTJ1zjIdHxbXeRMqu+rcubNcuHDBTD1y9uxZqVmzpvz6668xEgcAAAAcAqy4msSiKVOmjPn/xIkTJtPQtZtQgxqdKX/MmDFmwD5869q1a5I7d26JiIiQXLlypXZxAABAMn9/J7oFTbvvlLYY6Rit+CZ+BQAAQAqOQVu7dm0SLgcAAIBkCdB0bNUHH3xgBto7xlnFt7QRAAAAfByg6RJIjoXE9ee4pMSkrgAAAOldopMEYB8kCQAAkL6/vz2eqFanjIiLTg4LAACApPE4QKtWrZosXbo0xv6JEyeaiVgBAACQwgGaJgk899xz8uqrr8rt27fl1KlTZomkjz/+WL755pskFgcAAABejUHTRIEePXqY5Z0uX75sJqedPXs2C4CnEMagAQCQ9vh0DJp65JFHzJqWf/31l7mYLmdEcAYAAJA8PA7QNm3aJNWrV5cjR47Inj17ZPr06fLaa6+ZIO3KlSvJVCwAAAD/5XGA1qJFCxOM6eLklSpVkpdfftl0eYaFhZkEAgAAAKTwUk8rVqyQpk2buu17+OGHTcva2LFjk1gcAAAAeD1R7dGjR+XYsWPy+OOPS7Zs2URPw0oCKYMkAQAA0h6fJglcunTJTKtRvnx5adu2rZw5c8bs79u3rwwfPtz7UgMAAMC7AG3o0KGSOXNmM+Yse/bszv06Lu2XX37x9HQAAABIjjFoy5cvlxIlSrjtL1eunJw4ccLT0wEAACCpLWg3b950azlz0Alrs2TJ4unpAAAAkNQArUmTJvLVV185tzUx4P79+2app+bNm3t6OgAAACS1i1MDMU0S2LFjh0RGRsqIESNk3759pgVNp9oAAABACreg6RJPhw8flsaNG0v79u1Nl+ezzz5rJqvV+dAAAACQSvOgIfUwDxoAAOn7+ztRXZy65mZi6TqdAAAA8F6iArSaNWuaZICEGtv0mKioqCQUBwAAAIkK0EJDQ31fEgAAACQ+QAsKCkrMYQAAAEiNaTbUoUOHZMqUKXLgwAGzXalSJXnttdekQoUKyVEmAAAAv+bxNBs//vijmWpj586dUqNGDXMLCQkx+/Q+AAAApPA0GzrXWbdu3WTMmDFu+4ODg+Xrr7+WY8eOJbFISAjTbAAAkL6/vz1uQTtz5oz07Nkzxv7u3bub+wAAAJA0HgdozZo1kw0bNsTYv3HjRrNOJwAAAFI4SeCZZ56RN99804xBe+yxx8y+rVu3yvfffy/vv/++/Pzzz27HAgAAwMdj0DJkSFyjG5PW+g5j0AAASHuSfaknV/fv309K2QAAAJDcY9AAAABgw4lqt2/fLmvXrpXz58/HaFGbNGlScpUNAADAL3kcoI0bN07eeecds2pA4cKFzVgzB9efAQAAkEIB2ueffy6zZ8+Wl156yctLAgAAIFnHoGkWZ6NGjTx9GAAAAHwVoA0dOlSmTZvm6cMAAADgqy7O4cOHy1NPPWXW5KxcubJkzpzZ7f5FixZ5ekoAAAAkJUAbNGiQyeBs3ry55M+fn8QAAACA1A7Q5s2bJz/++KNpRQMAAIANxqDly5fPdG8CAADAJgHae++9J8HBwXLr1i3flAgAAMDPedzF+cUXX8ixY8fMJLWlS5eOkSQQEhKSnOUDAADwOx4HaB06dPBNSQAAAGAEWJZlPfgRacW1a9ckd+7cEhERIbly5Urt4gAAgGT+/vZqsXS1c+dOOXDggPm5SpUqUqtWLW9PBQAAgKQEaOfPn5cXX3xRfvvtN8mTJ4/Zd/XqVTMv2oIFC6RgwYKenhIAAABJyeJ87bXX5Pr167Jv3z65fPmyue3du9c02+kktgAAAEjhMWjad7pq1SqpW7eu2/5t27bJE088YVrT4FuMQQMAIH1/f3vcgnb//v0YU2so3af3AQAAIGk8DtBatGghgwcPltOnTzv3nTp1SoYOHSotW7ZMYnEAAADgcYA2depU00Snk9Tqkk96K1OmjNk3ZcoU35QynevYsaPkzZtXOnXqlNpFAQAAaXUeNH2IjkM7ePCg2a5UqZK0atXKF+XzC5oRq4kXuhD9Dz/8kODxjEEDACDt8fk8aAEBAfK3v/3N3JB0zZo1M0EaAACAR12ca9askcqVK5voLzqNBHWy2g0bNnhcq+vXr5d27dpJsWLFTOC3ZMmSRC3Yrse63ipWrOh2zPjx402mac6cOaVQoUJmiapDhw55XL7kKPu0adNMl3DWrFmlfv36JuMVAAAgyQHa5MmTpV+/frE2yWlz3d///neZNGmSeOrmzZtSo0YNE8R4QgPCM2fOOG8bN250u3/dunUyYMAA2bp1q6xcuVLu3r1rpgHR68Vm06ZN5pjo9u/fL+fOnfO67AsXLpRhw4ZJcHCwWUhej2/durWZ8BcAACBWViKVKlXK2r9/f5z3HzhwwCpZsqSVFFqcxYsXJ3hccHCwVaNGDY/Off78eXP+devWxbgvKirKnK9Tp07WvXv3nPsPHjxoFS5c2JowYYLXZa9Xr541YMAAt2sVK1bMGj9+vNtxa9eutZ577rl4rzF16lSrUqVKVvny5c31IiIiEiwXAACwB/3eTuz3d6Jb0LQVKbb5zxwyZcokFy5ckJRy5MgR07VYtmxZ6datm4SFhcV7vHbDqnz58sW4L0OGDLJs2TLZtWuX9OzZ08znduzYMTOliHaNjhgxwqsyRkZGmjVLXRMo9Fq6vWXLFo/Ppy2C2qK3fft2r8oDAADShkQHaMWLFzdLOsVlz549UrRoUUkJOo5r7ty58uuvv8r06dMlNDRUmjRpYjIhY6MB15AhQ6RRo0ZStWrVWI/RYE/H2WlXadeuXU1wpoGUnt9bFy9elKioKClcuLDbft0+e/asc1uv8/zzz5sgsUSJEl4FbwAAIP1IdBZn27Zt5d1335Unn3zSDHZ3dfv2bTPG6umnn5aU0KZNG+fP1atXNwFbUFCQfPfdd9K3b99YW540uIw+Ti26UqVKyfz586Vp06amZW7WrFlm8L+v6ZQlAAAAHregvfPOO2Zh9PLly8vHH38sP/30k7lNmDBBKlSoYO4bNWqUpIY8efKYch09ejTGfQMHDpT/+7//k7Vr15rWqYS6cfv3728yM2/dumVWR0iKAgUKSMaMGWMkGeh2kSJFknRuAACQfiU6QNNuuc2bN5suwrfeesvMfq+3t99+2+zT1qnoXXkp5caNG2bMmGsXq47b1+Bs8eLFputSVztIqDtSl6rSSXcXLVokq1evNhmYw4cP97pcgYGBUrt2bXMu1+5W3W7QoIHX5wUAAOmbRxPVajeijpO6cuWKaa3SIKhcuXJmmaKkBFeuLV86nmz37t1mML92OerSUhpkuQY5GjRpK5eWR9cE1e5Vbanq0qWLW7fmN998Y1r5dC40x5gvnRIkW7ZsbmXQoEm7TfV8GpRpwoPO+abTc+hYNB1/F1trWkJlVzrFRq9evaROnTpSr149M12JTs/Ru3dvr+sMAACkc1Yq0+kltBjRb7169XJOqREUFOT2mM6dO1tFixa1AgMDreLFi5vto0ePuh0T2zn1NmfOnFjLsWLFCuv27dsx9oeEhFjh4eFeld1hypQpZpoSLa9Ou7F161YrpdJ0AQCAPXjy/e3VWpxIXazFCQBA+v7+TvQYNAAAAKQMAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGQI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZArRU1rFjR8mbN6906tQptYsiliVy9arI+fMP/tdtAACQ8jKlwjXhYvDgwdKnTx+ZN29eqpbjwgWR/ftFTp8WuXNHJEsWkWLFRCpXFilYMFWLBgCA36EFLZU1a9ZMcubMmerB2YYNIsePi+TKJVKy5IP/dVv36/0AACDl2D5AW79+vbRr106KFSsmAQEBsmTJkgQf895775ljXW8VK1ZMlbJNmzZNSpcuLVmzZpX69evLtm3bxE60G1NbziIiREqXFsmRQyRjxgf/67bu1/vp7gQAIOXYPkC7efOm1KhRwwQ6nqhSpYqcOXPGedu4cWOcx27atEnu3r0bY//+/fvl3LlzXpdt4cKFMmzYMAkODpaQkBBzbOvWreW8DvKyCQ3AtFuzUCGRgAD3+3Rb9+v9ehwAAEgZtg/Q2rRpIx9++KEZTO+JTJkySZEiRZy3AgUKxHrc/fv3ZcCAAdK1a1eJiopy7j906JC0aNEi3rFhCZVt0qRJ0q9fP+ndu7dUrlxZZsyYIdmzZ5fZs2eLNzQQ1PPUrVtXkktk5IMxZ1mzxn6/7tf79TgAAJAybB+geevIkSOm67Fs2bLSrVs3CQsLi/W4DBkyyLJly2TXrl3Ss2dPE7AdO3bMBGcdOnSQESNGeHX9yMhI2blzp7Rq1crtWrq9ZcsWr86pgaS26m3fvl2SS2Dgg4SA//0v9vt1v96vxwEAgJSRLgM0Hes1d+5c+fXXX2X69OkSGhoqTZo0kevXr8d6vAZya9asMd2g2pKmwZkGUvpYb128eNG0yBUuXNhtv26fPXvWua3Xef75502QWKJECa+DN2/lzv0gW1N7XaOPM9Nt3a/363EAACBlpMtpNrTr0aF69eomYAsKCpLvvvtO+vbtG+tjSpUqJfPnz5emTZuaVrdZs2aZgf++tmrVKklN+hR1Ko1Ll0T++uvBmDPt1tSWMw3ONDDT+1OgKgAAQHpuQYsuT548Ur58eTl69Gicx2gyQP/+/U1W5q1bt2To0KFJuqaOecuYMWOMJAPd1jFxdqLznDVpIlK2rMi1ayLh4Q/+123dzzxoAACkrHTZghbdjRs3zLiyHj16xNkd2bJlS6lUqZJ8//33cvjwYTM/WZYsWWTixIleXTMwMFBq164tq1evNmPZlI5v0+2BAweK3WgQ9vjjD7I1NSFAx5xp6xktZwAApLxMaSG4cm350vFku3fvlnz58pluyalTp8rixYtN4OMwfPhw0xKm3ZqnT58201xoa1aXLl1inF+DJu0S1WN1WgzN/tRMyZUrV5qxaMWLF4+zNS2hsukUG7169ZI6depIvXr1ZPLkyWZqDs3qtCMNxvLkSe1SAAAA2wdoO3bskObNmzu3NehRGvhoIoC2fmnrmKuTJ0+aYOzSpUtSsGBBady4sWzdutX8HJ1mVo4bN84kEWirl4POWabjw2J7TGLL1rlzZ7lw4YKMHj3aJAbUrFnTJC5ETxwAAABwFWBZzBGf1ly7dk1y584tERERkkvXZAIAAOnq+9svkgQAAADSEgI0AAAAmyFAAwAAsBkCNAAAAJshQAMAALAZAjQAAACbIUADAACwGdtPVIuYHFPX6XwqAAAgbXB8bydmCloCtDTo+vXr5v+SJUumdlEAAIAX3+M6YW18WEkgDdL1Q3WN0Zw5c0pAMq9mrtG9Bn7h4eGsUuBD1HPKoJ5TBvWcMqjntF/PGnJpcFasWDGz1GR8aEFLg/RFLVGihE+voW9KfgH4HvWcMqjnlEE9pwzqOW3Xc0ItZw4kCQAAANgMARoAAIDNEKDBTZYsWSQ4ONj8D9+hnlMG9ZwyqOeUQT37Vz2TJAAAAGAztKABAADYDAEaAACAzRCgAQAA2AwBGgAAgM0QoKVz06ZNk9KlS0vWrFmlfv36sm3btjiPnTt3rlmZwPWmj3OlOSWjR4+WokWLSrZs2aRVq1Zy5MgR8XfJWc93796VN998U6pVqyY5cuQwM0737NnTrB7h75L7/ezqlVdeMcdMnjzZR6VPW3xR1wcOHJBnnnnGTNSp7+26detKWFiY+LPkrucbN27IwIEDzWTm+ju6cuXKMmPGDPF30zyoZ3X16lUZMGCA+a7TbM7y5cvLsmXLknROj2kWJ9KnBQsWWIGBgdbs2bOtffv2Wf369bPy5MljnTt3Ltbj58yZY+XKlcs6c+aM83b27Fm3Yz766CMrd+7c1pIlS6w//vjDeuaZZ6wyZcpYt2/ftvxVctfz1atXrVatWlkLFy60Dh48aG3ZssWqV6+eVbt2bcuf+eL97LBo0SKrRo0aVrFixazPPvvM8ne+qOujR49a+fLls9544w0rJCTEbP/0009xntMf+KKe9RwPP/ywtXbtWis0NNT617/+ZWXMmNHUtb9a4GE937lzx6pTp47Vtm1ba+PGjaYef/vtN2v37t1en9MbBGjpmH6pDxgwwLkdFRVlvoDGjx8f54dfg6+43L9/3ypSpIj1ySefuAUTWbJksb799lvLXyV3Pcdm27ZtOh2OdeLECctf+aqeT548aRUvXtzau3evFRQURIDmo7ru3Lmz1b1792Qva1rmi3quUqWKNWbMGLd9jz76qDVq1CjLX9XzsJ6nT59ulS1b1oqMjEy2c3qDLs50KjIyUnbu3Gm6IF3X8NTtLVu2xPk4bR4PCgoyC8W2b99e9u3b57wvNDRUzp4963ZO7arQpt34zpme+aKeYxMREWG6M/LkySP+yFf1fP/+fenRo4e88cYbUqVKFZ8+B3+ua63npUuXmm6i1q1bS6FChczvjSVLloi/8tV7umHDhvLzzz/LqVOnzJCUtWvXyuHDh+WJJ54QfxTpRT1r/TVo0MB0cRYuXFiqVq0q48aNk6ioKK/P6Q0CtHTq4sWL5s2kby5Xuq1BVmwqVKggs2fPlp9++km+/vpr80tVP+wnT5409zse58k50ztf1HN0//vf/8yYtC5duvjtAsm+qucJEyZIpkyZZNCgQT5/Dv5c1+fPnzeBxUcffSRPPvmkrFixQjp27CjPPvusrFu3TvyRr97TU6ZMMePOdAxaYGCgqW8dK/X444+LP7roRT0fP35cfvjhB/M4HXf27rvvyqeffioffvih1+f0RqZkOxPSPP2LQW8O+sGvVKmS/Otf/5IPPvggVcvmr/WsCQMvvPCC+Ut4+vTpqVDa9FvP+hfw559/LiEhIaZ1Er6raw0klLb4DB061Pxcs2ZN2bx5sxnA3rRp01Qre3r73aEB2tatW00rkLa0rV+/3rQEabKRa4sP4qbvV23lnTlzpmTMmFFq165tWiQ/+eQTswRUSqEFLZ0qUKCAeWOdO3fObb9uFylSJFHnyJw5s9SqVUuOHj1qth2PS8o50xtf1HP04OzEiROycuVKv20981U9b9iwwbTslCpVyrSi6U3r+vXXXzeZWf7KF3Wt59T61ZYdVxpc+GsWpy/q+fbt2/L222/LpEmTpF27dlK9enWT0dm5c2eZOHGi+KMCXtSzZm5qd7w+zvW9qq1j2r2ZHK9dYhCgpVPatK1R/+rVq93+KtBt17/A4qNNuH/++ad5s6oyZcqYN5/rOa9duya///57os+Z3viinl2DM53CZNWqVZI/f37xZ76oZx17tmfPHtm9e7fzpq0MOh5t+fLl4q98Udd6Tp1S49ChQ27H6dgobeXxR76oZ/29oTcdD+VKgwlHK6a/CfSinhs1amSCXtc60/eq1rOeLzleu0RJtnQD2I6mAWuG5dy5c639+/db/fv3N2nAjrTsHj16WCNHjnQe//7771vLly+3jh07Zu3cudN68cUXraxZs5oUYtdpNvQcmrK9Z88eq3379kyzkcz1rJlDOn1JiRIlTFq3a0q9pn/7K1+8n6Mji9N3da1TmWTOnNmaOXOmdeTIEWvKlClm+ocNGzakynNMr/XctGlTk8mp02wcP37cZH7qMf/85z8tf7XAw3oOCwuzcubMaQ0cONA6dOiQ9X//939WoUKFrA8//DDR50wOBGjpnP4SLFWqlJmvRdOCt27d6vZB7tWrl3N7yJAhzmMLFy5s5oDR+YqiT7Xx7rvvmvv1zdmyZUvzBvZ3yVnPOueO/u0U201/6fqz5H4/R0eA5tu6njVrlvXII4+YgEHnndP5FP1dctez/iH30ksvmSkftJ4rVKhgffrpp+Z3tz+b4kE9q82bN1v169c333M65cbYsWOte/fuJfqcySFA/0m+9jgAAAAkFWPQAAAAbIYADQAAwGYI0AAAAGyGAA0AAMBmCNAAAABshgANAADAZgjQAAAAbIYADQAAwGYI0AAkyUsvvSQdOnRwbjdr1kyGDBkS72N0MfLJkycn+drJdR6712lsfvvtNwkICJCrV6/6vDyXLl2SQoUKyV9//SX+IDH1b4fXJalGjhwpr732WmoXA3EgQAN89IvaXy1atEg++OCDZD3n3LlzJU+ePDH2b9++Xfr37y9plQY8+mWuC7W7+vzzz81zji/obdiwoZw5c0Zy587t83KOHTtW2rdvbwJiO0jMHwFJEb3+U0Nsf3zE9Tnw1vDhw2XevHly/PjxZDsnkg8BGoBklS9fPsmZM2eKXKtgwYKSPXt2SYsiIyPjvE+DroS+iAMDA6VIkSImwPOlW7duyaxZs6Rv375JOk9UVJTcv39f0sJrkJj6T8scr0WBAgWkdevWMn369NQuEmJBgAYkwbp166RevXqSJUsWKVq0qOkyuHfvnvP+H374QapVqybZsmWT/PnzS6tWreTmzZvOrhB9bI4cOcyXQaNGjeTEiRNxXuvPP/+UFi1aOM+lLUc3btyI0do3ceJEUxY9ZsCAAXL37t1Yz3f48GHz5X7w4EG3/Z999pk8/PDDzl/k+sVcpkwZc90KFSqY1gVPWjfOnz8v7dq1M4/X8/znP/+J8ZhJkyaZetK6KFmypPzjH/9wPjetp969e0tERIQpr97ee++9WFsZwsLCTEvPQw89JLly5ZIXXnhBzp0757xfH1ezZk2ZP3++eax+Eb/44oty/fr1OJ+Po9ViyZIlUq5cOcmaNav5UgsPD3cec+zYMXPdwoULm2vXrVtXVq1a5XYevZ62LPbs2dOUTV8/rQ9Vq1Yt87y07qK33OrP+j7Tenc8f215i60r7ccff5QqVaqY96Ne79NPP41RhnHjxkmfPn1MEF2qVCmZOXNmvK/nsmXLzPkee+wxt/0///yzsz6aN29uWmJcy+OoNz2ucuXK5hz6+ty5c8e03BQvXty83vXr1zfPxbU7tUuXLuZ+Db71ffHtt98674+rPtTevXulTZs25jXQ16JHjx5y8eJF52O1fgcOHGjen47gJDEt5/F9juOyadMmqV69uqkfrTstm6uNGzdKkyZNzDn1PT9o0CDnObWc+rtg6NChzucY3+cgoTqN67VQ+tlcsGBBvM8FqSRZl14H0plevXpZ7du3j/W+kydPWtmzZ7f+8Y9/WAcOHLAWL15sFShQwAoODjb3nz592sqUKZM1adIkKzQ01NqzZ481bdo06/r169bdu3et3LlzW8OHD7eOHj1q7d+/35o7d6514sSJWK9148YNq2jRotazzz5r/fnnn9bq1autMmXKmPK5ljVXrlzWK6+8Ysrz3//+15Rv5syZcT6/OnXqWO+8847bvtq1azv3RUZGWqNHj7a2b99uHT9+3Pr666/NORcuXBhnHTVt2tQaPHiwc7tNmzZWjRo1rC1btlg7duywGjZsaGXLls367LPPnMfoz2vWrDH1pM+tQoUK1quvvmruu3PnjjV58mTz3M6cOWNuWocqKCjIeZ6oqCirZs2aVuPGjc11tm7dap6LlsdBX5uHHnrIWY/r16+3ihQpYr399ttx1tGcOXOszJkzm7ravHmzOXe9evXM83DYvXu3NWPGDHPOw4cPm/rLmjWr2+upZdXnMHHiRPOa623btm2W/hpetWqVeV6XLl2KUadXr161GjRoYPXr18/5/O/du2etXbvWPPbKlSvmOC1XhgwZrDFjxliHDh0y5dZ61v9dy5AvXz7zPjxy5Ig1fvx485iDBw/G+fwHDRpkPfnkk2779L2gdaLvX33st99+axUvXtytPI5603ratGmTOe7mzZvWyy+/bPZp3WsdfPLJJ1aWLFlMvTk+V7pv165d1rFjx6wvvvjCypgxo/X777/HWx963YIFC1pvvfWWef+HhIRYf/vb36zmzZu7vTf19X/jjTdMeeJ63q71H9/nODaO16VSpUrWihUrzPFPP/20Vbp0afN5Uvq8c+TIYd67+ry1fmrVqmW99NJL5n59H5QoUcK8lo7nGN/nIKE6jeu1UFpXWl59brAXAjTAywBNv9Q1kLh//75zn/7i1i8ADRZ27txpfvH99ddfMR6rv4D1vt9++y1R5dAgK2/evCZQc1i6dKn5cj179qyzrPoF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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "xs, ys = [], []\n", "for ind in est.archive_:\n", " xs.append(ind.fitness.loss_v)\n", " ys.append(ind.fitness.linear_complexity)\n", "\n", "print(len(xs))\n", "plt.scatter(xs, ys, alpha=0.25, c='b', linewidth=1.0)\n", "plt.yscale('log')\n", "plt.xlabel(\"Loss on validation partition (greater is better)\")\n", "plt.ylabel(\"Complexity (smaller is better)\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Acessing the entire population (unique individuals)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Completed 100% [====================]\n", "Best model: Logistic(Sum(-0.91,0.04*Max(0.39*AIDS,0.43*AIDS,0.43*AIDS,0.52*AIDS)))\n", "score: 0.54\n" ] } ], "source": [ "est = BrushClassifier(\n", " # functions=['SplitBest','Add','Mul','Sin','Cos','Exp','Logabs'],\n", " objectives=[\"scorer\", \"linear_complexity\"],\n", " max_depth=5,\n", " max_size=75,\n", " max_gens=100,\n", " pop_size=200,\n", " verbosity=1\n", ")\n", "\n", "est.fit(X,y)\n", "\n", "print(\"Best model:\", est.best_estimator_.get_model())\n", "print('score:', est.score(X,y))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGwCAYAAACJjDBkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVbxJREFUeJzt3QeYk1X69/Ebhl4EEekConSUDouIVEVRFCushaZY/qiIq6DuKuqqYENWYHGRKhZYFFlUBKRKB+kdKQLSm1Kl5r1+Z99kM8PMMMlMJu37ua4weVJPHpI8d865z32yeDwejwEAACAgWQO7OQAAAIQgCgAAIAgEUQAAAEEgiAIAAAgCQRQAAEAQCKIAAACCQBAFAAAQhGzB3Alpc/78edu1a5flz5/fsmTJEu7mAACANFAJzaNHj1qJEiUsa9aU+5sIokJIAdQVV1wR7mYAAIAg7Nixw0qVKpXi9QRRIaQeKO9/wiWXXBLu5gAAgDQ4cuSI6wTxHsdTQhAVQt4hPAVQBFEAAESXi6XikFgOAAAQBIIoAACAIBBEAQAABIEgCgAAIAgEUQAAAEEgiAIAAAgCQRQAAEAQCKIAAACCQBAFAAAQBIIoAACAIBBEAUAm+eWXX2zYsGHuL4DoRxAFAJlk3759tmvXLvcXQPQjiAIAAAhCtmDuBABIGw3deXuevMN4/sN5RYoUsbJly4atfQCCRxAFACE0ffp0N4Tnb+PGje4kJUqUsM6dO4epdQDSgyAqFTt27LCHHnrI/YrMli2bvfzyy3bvvfeGu1kAokizZs0S9UQpeKpQoYKv90k9UQCiE0FUKhQ49evXz2rUqGF79uyx2rVrW6tWrSxv3rzhbhqAKKFgyX+4TkGUtuvVqxfWdgFIP4KoVBQvXtydpFixYla4cGE7dOgQQRQAAIjt2Xk//vijtW7d2uUcZMmSxcaPH3/BbQYOHOh+FebKlcvq169vixYtSvaxlixZYufOnbMrrrgiE1oOIBZp6E7fRwzhAbEhpoOo48ePW/Xq1V2glJwxY8bYs88+a7169bKlS5e627Zs2fKCGi7qfWrfvr0NHjw4k1oOIBbpB5uSyJmNB8SGLB6Px2NxQD1RX3/9tbVp08Z3mXqe6tatawMGDHDb58+fdz1NTz31lL3wwgvuslOnTtmNN95oXbp0cUnmqdFtdfI6cuSIe7zff//dLrnkkpC9NgAAkHF0/C5QoMBFj98x3ROVmtOnT7shuhYtWvguy5o1q9ueP3++21Z82bFjRze75mIBlPTu3dvtdO+JoT8AAGJX3AZRBw4ccDlORYsWTXS5tjUTT+bOneuG/JRLpRl6Oq1atSrFx3zxxRdd1Oo9qUQCAACITczOS8X111/vhvjSKmfOnO4EAABiX9z2RKlcQUJCgu3duzfR5dpWOQMAAIDUxG0QlSNHDlc8c9q0ab7L1Ouk7QYNGoS1bQAAIPLF9HDesWPHbNOmTb7trVu32vLly61QoUJWunRpV96gQ4cOVqdOHVc9WNXJVRahU6dOYW03AACIfDEdRP3000/WtGlT37aCJlHgNGLECGvbtq3t37/fXnnlFZdMrsTxSZMmXZBsDgAAELd1oiK5zgQAAIgc1IkCAAAIIYIoAACAIBBExalffvnFhg0b5v4CAIDAEUTFKS2yvGvXrgsWWwYAAGlDEBXFjh49Gu4mAAAQt2K6xEEsW7ZsmdWvX98WLlxoNWvWTNN9NHTn7XnyDuP5D+cVKVLEypYtG6IWAwAQWwiiotQXX3xhZ86csdGjR6c5iJo+fbobwvO3ceNGd5ISJUpY586dQ9JeAABiDXWiorBOlP7L1GO0fft2K1OmjKvEniVLloB7ohQ8VahQwdf7RE8UAACW5uM3PVFRSEvXKICSbdu22YoVK1y19YtRgOQfJCmI0raWvAEAAIEhiIpw69evd0GSvwkTJlhCQoKdO3fO/X3vvfesdevWiW5TvXp1q1SpUia3FgCA+EEQFQIDBw50JwU56fW3v/3NvvrqqxSv13N89tln7uTvnnvusbFjx6Z4Pw3dKQdKfwEAQODIiYrwnCjd97HHHrMxY8ak+T7t2rWzjz76yD03AAAIDGvnxQj9J2omnqqL58yZ0w3fJUeJ5dmyZbPhw4fbyJEjXa7UiRMnMr29AADEC4KoKKAAqVOnTrZ48WLLkSNHsrfR5cqV6tixox06dMjGjRtnhw8f9iWif/PNN77bHj9+3M3wAwAAwSOIiiK5c+e2kydPJnvdqVOnXLkCKVasmL3wwgvur5d/CYRBgwbZrFmzfF2WixYtsj/++CPk7QcAIJYQREURJZhnzfrf/zLvsJ73ry73T0DPlSuX7zqVP7jtttvcefVA3XHHHVa1alW3vXfvXps8ebKdP3/ebU+bNs0mTpzoexzVlTp79mymvUYAAKIFQVQUUXK5N9i5/vrr3RCd/oouT0vyuXqkypcvb5dffrnb1vmXXnrJ8uTJ47YLFixohQoV8vVu/fOf/7TVq1e77Z07d7oerIyYdQgAQLQjiIoSKq6p9fLUu/T222+7JVzUu6S/ffr0cZcvXbrUduzYEfBj+yer165d2/70pz+580pUf/jhh12gJQcOHHA1q7y9YZ9//rlNnTrVnVdgpcrpp0+fzqBXDABAZCOIihIKXFq1amXz5s2zHj16+AIZ/e3Zs6fNnTvXXZ+W5V8CCa6uuOIKy5s3r6+A59NPP+17DuVglSpVyp3fv3+/mxW4Z88et7127VoX4HnRewUAiDXUiYrCtfMikYYTNStQw4HqwVq4cKFbn69t27bu+n79+lndunWtYcOGbnagSjBcffXVKc42BAAgXKgThUylHrHChQu7AErq16/vC6AUpzdu3NiuvPJKt60hx3//+9++oT/1os2YMcP3WKpvRWwPAIh0BFEIOQ3/1axZ0y0zI1rT7/nnn7d8+fK5bQVM3qDpzJkz9u677/rWC9TsQOV6MRwIAIg0BFEIC2+elWiGYbNmzXwB13333efrtVJC/ZQpU3w5YP/5z39szpw5viFE5WJ5ZywCAJCZCKIQUTQcWLlyZd+6f3Xq1HG9Vt5k9ksvvdTy58/vmy2ohZ4VaMnmzZtdLhYAAJmBIAoRz78Eww033OBmCXoDqg4dOviGCXft2mVr1qzx3Xbw4MFuqRxRRXblYlE4FACQUQiiELWyZ8/uhv28M/waNWpknTt3dueVY6XcK29RUc0UHDp0qG9R5iVLliTqtWJIEAAQKIIoxCQN/6nXqmzZsm5b5RQef/xx31CgFmfWcKCod6p3796+yuy6buPGjQRWAIBUEUQhbnKttCCzN7eqRYsWduutt7rzCpZuvPFGK168uNvesGGDjR071nfbH374wTcsqB4uFmsGAAhBFOKehgPr1atnl112ma/GVbdu3XxBlMoreHulVFBUy+xoeFCUZ+XtwQIAxBeCKCAJBU/eGlZy8803u8DKW5rh7rvvdr1a3l6r2bNn+2772Wef2fLly915FRPV0CCFQwEgNhFEhYCm3VepUsUtc4LYkitXLrvmmmvcX++wYJcuXdx5BUuFChXy1cDS0jb/+Mc/3LIBopmDK1euDGPrAQAZibXzQiie1s7DhU6ePGm//vqrS2pX79a3337r8qnuueceN0TYv39/18ulWYRHjx61Y8eOJcrbAgCEB2vnAWGWO3duK1++vC8ouu2229xQoCiIuvbaa12tK28vlUoweH/TqCr7qlWr3HldxkxBAIg8/10tFkCm8AZUSmb3LnUjtWrVcjWvvMvbaM1Ab+D022+/2T//+U9r3769XXHFFbZ3715X78q7NA4AIDzoiQIigIKqokWL+rbvuusuV+fKP+BSvpVoQebvvvvOd1utJ7h27VpfD5cS2gEAoUdPFBDhlKjeoEED33bLli19ldc11KegyTsMqNILn376qSvRULBgQbeeoK5TXhYAIGPREwVEGQ35eUswaHjw3nvvtapVq7rtIkWK2O233+5bwHnZsmW2aNEid17Dg0OGDLFNmzb5Et+V0M7cEgAIDkEUEEO0rE3NmjV9uVeaCXjfffe582fOnHFBlhLeRUVCP/jgA1/ulYYJf/755zC2HgCiC8N5QBwseSM5c+Z0vVRelStXdlXaExIS3Pa6devcgs2aUahpvcOHD3e9XCVLlnRFQ7XGoHdBZwAAPVFA3NKQYLly5XzbDzzwgFtDUNSTpYKx3vooGhL84osvfLedOnWqb1hQw4EMCQKIRwRRAHy8w4AKnm666SY3PCiaKdiuXTt3XgGTioiqGJ03mf3tt9/2VWbfuXOn7dq1K2yvAQAyC0EUgItSHpXyqbyBVseOHV1tK9EswIYNG/oCrh9//NGmT5/uC7jGjBnjlsDx5mWpDAMAxAKCKADpoqrrjRo18hUKVR5VmzZt3PlTp065XCovrR3Yu3dvXyClPKwdO3aEqeUAkD4EUQAyPJHdW4JBCzUr16pMmTJuW1XWldzuTWb3X95G5Ra09M2ePXvc9vHjx10ZBgCIVMzOA5BpVHXdW3ldHnnkEV9PlXqn1KulwEvmzZvnyjB0797dbc+fP99KlSrllr4BgEhATxSAsFF+Vfbs2X25VVruRn+lTp06duedd/pyq1THSknrsn37dhswYIAvmf3AgQNujUEAyEwEUQAiknqlypYt6wu2unbtavXr13fb6q1SeQbvsOG0adNswoQJvoBLawt6Ay7KLwAIFYIoAFFXgkEzBVu1auXLrbr11lvdtvzxxx+uBIM3n2r58uX2/vvv+5LZNVNw//79YXsNAGIHQRSAqKceqcKFC/vKMTz22GO+RZeLFy9u1113nS/gmjhxoi1cuNCd10LOKsHgDaq0mLN3GRwAuBgSywHEtGLFirmT18MPP+zqVXl7rVSGwVueYfbs2bZmzRp7+umnfSUZihYt6k4AkBQ9UQDiSo4cOSxv3rzuvGYKtm/f3q0hKFWrVrUWLVr4cqkmT55smzdvdtuqwj5y5EhXikH0Vz1XAOIXQRQA/H/qsdKagd78q7/85S9Wr14937aGCnWSSZMm2WeffeYLuGbNmmX79u2zSOIN+ABEUBCl6cXq9tavNE07Vnc4AMQaDfOpeKg3t+q+++7zbTdu3Ni3YLOGBX/66Sc7dOiQ21Z9q3/961++ZPa9e/fasWPHMrXty5Ytcz1s+gsgzEGUFhnt2bOnqzysqsP6ArnllltcLZcCBQq4L5OxY8eSlAkgLmiGoIp/inqn1GtVsWJF3wLOKsHgTWYfP368K8PgDbiU3O4NuEJVguGLL75wuV+jR48OyeMDSGMQpSTL6tWr29atW+2NN96wtWvXuiJ3ygfQEg36Qrj++uvtlVdesWuvvdYWL15s8WzgwIFuSKBu3brhbgqAMJRgKF26tK+XStq2bWs33HCDO68eKX2Xeiu1axjw448/9t1WOVjpLRzqXfhZ9JdaWUBoZPGk4dP14osv2nPPPedLvkyN8gQ0bViVh+PdkSNHXC+dAk79MgWA5Hr5Dx48aLVr13bBzttvv20NGzZ0izorx0qpEy1btnRlHPTDVRXevcFaSjSEV6tWrUTbNWrUyIRXA8TX8TtNQVTSfCh1Y3vXt0LKCKIABMpbJFRDhDt27LApU6bYQw895GYVfvXVV25hZs0oFOWkashOgZg/VW9XD5RysjSk2K5dO2vdunWi22h0oVKlSpn4yoA4D6KU76TgSXVUypcvn1FtjVkEUQAykqqtK2hSIVEFW++9957rqfrhhx8Cfqx77rnH5bFGEpWR+PHHH93QZ4kSJcLdHMSxI2k8fmcNdKaKgid1PQMAMpcm9ngrsaun6qWXXnIJ5Mq5CoR6poYMGWKRRscW7/AmEJMlDvr06WPPP/+8m8ILAAgfDdUpV1WB1LBhwyxnzpy+GYHJ3VbXDx8+3D7//HP3KxtA+gScE6WV1ZU4rpklGqP3Fp7z8k7bBcN5ADLXqlWrrH79+r68Kn/6rtaagddcc41F2hCet+dJObd6DWqjZjiKgkSG9hCpx++A187r169fetsGAAgBBUrJBVCiy/PkyWORRjlQSRPjFUjpJGXLlnXDj0AkCjiI6tChQ2haAgBIF83eU+6qJgFp+E6z87zb+qvre/ToYZFESeRaszC1niggppZ9UTG4v/3tb/bnP//Zt1bU999/72btAQDCQ2UNvKtGqADyN9984+pNiS73FuCMJBqqU9DkHzjpr/cyhvIQU0GUquvqja2x9XHjxvnWg1qxYoX16tUrFG0EAFyEenFUVFM9UCrYOX36dGvVqpVbckYTgnS56kqp9hSAMAVRL7zwglv6RXVJlFju1axZM1uwYEEGNQsAEAgN1ylomjdvnhuy07YWRR4wYICbUT137lx3/cWqnYeThu6UA8UQHmJ2dp6WHtCYtRYhzp8/v+uB0kKbSgxU9Vstron/YnYegHDSGnwHDhxw39EKqgCEsdimFCxY0Hbv3n3B5epGLlmyZKAPBwAIEX1fqzgnARQQGgF/sjTVtGfPnrZnzx7XLaxkRXUTa4Fi73pOAIDIsHz58gtKCAAIUxD11ltvuWG7K664wiWVV6lSxU1Rve6669yMPQBA5Fi0aJFt2bIl3M0AYlLAOVFemuGh3CgFUjVr1mRB4mSQEwUg3PQVH8nJ5EBc5US9/vrrbtkX9URppsd9993nAihVw9V1AIDIQQAFhE7AQdRrr73mqw3lT4GVrgMARI5t27bZwIEDmTkNREIQlVLXsEodFCpUKKPaBQDIACpLo5I0WgImXqnMw8SJE91fICxr51166aUueNKpQoUKiQIpfTjVO/X4449naOMAAOmjwpVKvYhnymvZuHGjVaxY0QoXLhzu5iAeg6h+/fq5XqjOnTu7YTslXHmpcrmqzDZo0MBi2Z133mkzZ8605s2b25dffhnu5gBAmhw9etTOnj3rfgwDCEMQ1aFDB/dX3cINGza0bNnSfNeY0a1bNxdEjhw5MtxNAYA0+/rrry1nzpzWtm1bixcaulMPlOzcuTPRX1FHAL1SSK+AIyGtkaeK5UWKFEl0+cGDB91lsTzu3qRJE9cTBQDR5Oabb0601mm81MfSEJ4/LcCskygtJd6HORGmxPLknDp1KugPqX4dPPjgg27sPnfu3HbNNde4hTMzyo8//mitW7e2EiVKuFwurWqeHM1g0bBkrly5rH79+u5DCADRTj9wtQRMPKlXr5773tepVq1a7jL99V6m64FM64n68MMP3V8FIUOGDHEzPrzU+6RARZXMA3X48GE3PNi0aVP7/vvv7fLLL7eff/45xbF7LTGjN3/27NkTXb527VoXhBUtWvSC+xw/ftyqV6/uhuLuuuuuZB93zJgx9uyzz9pHH33kAijlgLVs2dI2bNhwQa8bAERbTtSCBQvcd1u8FP7VUJ3/cJ16oLS+61VXXRXWdiFOg6gPPvjA1xOlQCMhIeGCxHJdHqi3337bFe4cPny47zLlXSVH6/R17drVFfccPXq0rw0KdDTMqCCoR48eF9zvlltucafU9O3b17p06WKdOnVy23ot3333nQ0bNsxeeOGFgF6TerR0iuWhTQDRQ9/b+qGpZbriJYgCImo4b+vWre7UuHFjVxPKu62TgpjJkye7XzmBmjBhgtWpU8fuvfde1+OjJWQ+/vjj5BubNaur9bFs2TK32LGCqs2bN7sAqk2bNskGUGlx+vRpW7JkibVo0SLRc2l7/vz5AT+eAj19YS1evDio9gBARlLgpIkx6omJR0oiVw6U/6xyICw5UTNmzHBDbQo8FDxp2mx6aGHMQYMGud4lBWJPPPGEPf300ynOgFNe0/Tp023OnDl2//33uwBKwY4eIz2zONRrlHQoUNt79uzxbet5FOwpkCtVqlRQARYAIHNpWE9J5MzGQ9hn52mNvCeffNIX5Gj2Q7ly5eypp55yv3ICHfpSb5J6ot566y23rZ6o1atXu+E0b1mFpEqXLm2jRo1yvWJ67qFDh2bK+lBTp04N+XMAQCj88MMPtnfvXjeJB0CYeqIUJGk4T1P9NYvNv5dGydmBKl68uBun91e5cmXbvn17ivfRF8Gjjz7qZlhozb7u3btbeujXifKr9LhJn6dYsWLpemwAiARlypS54LsWQCYHUSoPMGDAALv++usT9f5UrVrV5ScFSjPzNCzoT71b+sCnNPSmiuEKtMaNG2fTpk1zwdtzzz1nwVJifO3atd1j+feQaTvWq7ADiA/KCfJO9Y9EKpPzyy+/uL9AzA7n7d+/P9kp/yojEMyQmnqRrrvuOjecd99997naTIMHD3anpBTYaJadAiwFTqqarl9W6qZWbpSGE5PrldK6fps2bfJtKxl++fLlbsFkDQ2KZvZp+FBDiyqhoBIHek3e2XoAEM2U97ljxw7X8+5foiZSKM9WQZRK1ai6OhAVPAFq1KiR58MPP3Tn8+XL59myZYs7/+STT3patmzpCcY333zjqVatmidnzpyeSpUqeQYPHpzibadMmeI5efLkBZcvXbrUs2PHjmTvM2PGDFUIveDUoUOHRLfr37+/p3Tp0p4cOXJ46tWr51mwYIEnPX7//Xf3PPoLAOF0+vRpT69evTzLli3zRKIjR46472r9BcItrcfvLPonkKBLs+LUG6TkxBEjRthjjz3mpvPPmzfPZs2a5YbF8F9HjhxxU2q1fhO1WQCEm5bnUuVy/zp/4aShO/VAeUcMlNpRsWJFX0+ZUi3olUIkH78DDqJEuU99+vRxCeZ642ucvWfPnm65FvwPQRQApEzDdzqlREWcdQJiKohC2hBEAYgkmrSj/NBIWXiXnihE+/E74MRyb4Li119/bevWrXPbSu6+4447XKI3ACAy/fHHH269Uv12zozaehejAClpkKQAKn/+/GFrExCIgKOeNWvW2O233+4qeesXg3f9Oy0c/M0331i1atUCfUgAQCa49tpr3QlAmOpEPfLII64m1K+//upWxdZJ02b1wVQBTABA5FIvVCQuju5dyF5/gWgRcE5U7ty57aeffnKBlD8t1VK3bl23LAz+i5woAJFEX/d9+/Z1RYRVnw9A+o7fWYOpept0eRTZt2+fXX311YE+HAAgkygPSis+aM1RAJmUE6WIzKt379729NNP26uvvmp/+tOf3GULFiyw119/3eVGAQAiV40aNcLdBCBmpGk4L2vWrIlmcnjv4r3MfzsSx9rDheE8AJFG30eqzVS9evVwNwWIjxIHM2bMyMi2AQDCRJOCtJC8ZlfnypUr3M0BohrFNkOInigAkebs2bNu9CB79uzhbgoQn8U2AQDRiaLIQMYJeHYeACC6ff/997Zw4cJwNwOIegRRABCHvVEJCQnhbgYQ9ejXBYA4c+ONN4a7CUB89kSpIvmJEyd829u2bbN+/frZlClTMrptAIAQUGL5sWPH7Pz58+FuChBfQdQdd9xhn3zyiTv/22+/Wf369e399993lw8aNCgUbQQAZCD9+H3vvffs8OHD4W4KEF9BlBYcbtSokTv/5ZdfWtGiRd0HUoHVhx9+GIo2AgAyULFixaxt27aWN2/ecDcFiK+cKA3l5c+f353XEN5dd93lKpprCRgFUwCAyKYim5UrVw53M4D464nSIsOqdrtj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+eWXXy6478GDB911M2fOTFM7Bg8e7Ln00ks9x44d81323XffebJmzerZs2ePr61lypTxnD171nebe++919O2bdsUH/eDDz7wXHXVVb7tDRs2uHatW7cuxft07drVc/fdd6e4jxo3buzp1q1bosdbtGiR73o9ti7Tc6dk7Nixnssuu8y3PXz4cE+BAgUuuJ1er/dxpkyZ4klISPBs377dd/2aNWsSPX+vXr08efLk8Rw5csR3m+eff95Tv379FNui59ZjLFiw4ILXsHDhwhTvV7VqVU///v0TtbVNmzaJbrN161b3OMuWLUt0eWr71GvGjBnuvocPH3bb999/v+fGG29MdBu9tipVqiRqw4MPPujb1nu3SJEinkGDBqX4OtSOzp07J7qsdevWnk6dOiV7e+9rGjJkiO+yL774wl02bdo032W9e/d2n5+U6DOUP39+zzfffOO7TI/x9ddfJ7vv/v73v3tuuummRI+xY8cOdxu9D737sWbNmp6L8d//qX2Ok+P9fxk9enSiz3vu3Lk9Y8aMcdsPP/yw59FHH010v9mzZ7vP88mTJy94b6f2Odi2bZt73+/cuTPR5c2bN/e8+OKLvvupTcuXL7+gvb///ntA30XIHPREIebpV6l6CPx7jzQkp14J/bJTj0Pz5s3dMIB+GX788cduGMSbN6QeGvUu6Reqfp3rl2Vqz6XHU1e9/3Op98W/F0FDOQkJCb5tDesl7fXxp14L/QLVL39vL1StWrWsUqVKvtsMHDjQ9UTo17SGSTT8k7SHJbV2qxfCvydDj50030Q9MdpXGo7QMJOGYTQjTL+e00rPpR4a/14aDV3ouXSd/5CWf87WxfaR6DWoxzHpa/A+rv7P1StQuXJld7n2k65Lup/UAxQqej69J/xpW70RGpb10hCTl967yqtK7fWfPHnSDUn5U++Vej00NKrepXnz5l1wP//n0dCa6LPgf5n/86rXSL1t6oHScJ56XLRf0/peU2+weju1770n7/tYPT9eSXvVLia1z3Fq9N3gpc+7hsK97xe1VT2E/m3Vd4E+z1u3bg2ofep11P+vepb9H089rP6vW71v/v8nXhpOlEA+awg9gijEPQUzGlLSkIcO5v3793dfpN4vSeWQqAte3fTqzteXoDeYCVb27NkTbesgqS/mlOgAqiGQzz//3G3rr3JdvHSgVHCgvKgpU6a4WWTKy0gtKTpQCuJuu+029wWvnB4NSylwk4x8nmD3UVpoH3399dcu30hDVdpPOugmbb9/EBwugb5+DdMlDRqUd+TN2dm1a5cLMpIOsfo/j/eHRtLL/J9XQ3nab/pBoaBM55V/lNb3gAIu/SDR/fxPCiJvuOGGoP8PLvY5Doba+thjjyVqpwIrtdWbjxjIY6mN+tz4P54CNv/8RQVLyaULaPhb9CMJkYMgCjFPvQ4KgvxzI5RnoV4O5TOIvrTUG/Daa6+5HBT9GtTB1kv5Gy+++KI7aFSrVs0XzCT3XPqS9U9m1XMpl0hf6OmhoElBnF6Lcoj8c330HArylDujtl599dWJft1ejHoClP+lL3gv9Zz5J0PrOh1MlT+iBFwFkzow+9N+8+9NSWkfKffKP+FbeTt6Lh380kOvQXk2SV+DntO7n9SzeOedd7rgScFpWnJM9LrkYq8tra9f7fCnbe1P/97JQOn/XfsxKR10Ffh8+umnLlfnYgnqF6O2KrlaeVDe5Hj/pPCLUQ+qcn3U06j3qf8pvcHrxT7HyfH/QaQgVIn13veL2qp9mrSdOnnfE8n9nyd3mf5/dJl69ZI+lt6HF6OEdwW32ueIHARRiBmaDZP0160O1Aos9FfF6jTD7T//+Y9Lpn322WddcLNw4ULXM6GDr4YklCyq2Uj6ItWvWAVPClz0i169PPoV6v2STS7Q0ZCKDlr60tOwhZ5Xw17eoZJgKUlWybsaomnatKmVKFHCd52GVtT+yZMnu4OAEoqVKJtWCvCU4Kpf3dofCpgeeeQR3xCC6MteCbf6ha8gTjPnkib86sCoX9xK3NaBNbmhB82YUgCjfaVkZiVtayackvfTO4ymg4z2t/c1KGBSwKekXO9+0v+vt0dBSdRp6d1Scq/2hTcJWu+15Oj167kVmOn1J/fYf/nLX9z+0QxA/V8pgXrAgAHJJuEHQsNMCk78e6OUEK73u5LDdZ0S9FN676aV9qH+79WDoteq/0f/98nFaCaqelWUBK73qIJ9vW/Vc3qxADQ1qX2OU6OkcP1/6POq94t69Lwz/nr27Ol+OCkh3Ntbpv3pP1FE/+c//vijm8DiDSaT+xwoSNa+0ntdbdN3i977vXv3tu++++6ir089p95ZgogcBFGIGZqNo197/if9IlX+jqZ/6wtLeROPP/64G/bSjCRRToe+BPXLWl90uly9LRoKUW0jBV6anaPrNDNPBwEFG8nR7XVA0EFCuTn33HOPG0LRQTK91HOmYRAd/P2H8kTtUZClGW6aNq08JQWPgdCwpQIzBTN6LL1W78wg0b5TiQPNHFJvnPKydADwp94w7V+1Qz0g77zzTrK9BToQaQajhm8UVJUrV871sqWX9r8OfAqO1COhnBP/x1X79bxqp/alAg/1NlyMcq00K/Ff//qX20eaXZgcBULqTVKPml5/cnlCej7NmtQQrPajAh0dyHUATw8Fpt7H9u8R0Y8ADcFqX6tt6Z0mr5mtCtT0XPpxoF4p//fJxWj/qTdLAdNNN93k2q1SBspR04+aYKX2OU6NZnx269bN5WDt2bPHvvnmG18vk/abcpYU7CqA0XeK/r/8f8Do/05Bs4b3vENtKX0O9BlTEKVAWj9cFKwpkFQJi4vR/5ty0RBZsii7PNyNAID0UgKwDsbRsIxHqKhHQ1P21auSnoAEkUV5Xgq8VBZBAT0iB/8bABAjbr31VjfkpKGl5GpUITopx1K9WARQkYf/EQCIIRdbVBrRR2kBiEwM5wEAAASBQXMAAIAgEEQBAAAEgSAKAAAgCARRAAAAQSCIAgAACAJBFAAAQBAIogAAAIJAEAUAAGCB+38W0Eyf7/kiSAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "\n", "xs, ys = [], []\n", "for ind in est.population_:\n", " # use the same as the objectives\n", " xs.append(ind.fitness.loss_v)\n", " ys.append(ind.fitness.linear_complexity)\n", "plt.scatter(xs, ys, alpha=0.5, c='gray', marker='+', linewidth=1.0)\n", "\n", "xs, ys = [], []\n", "for ind in est.archive_:\n", " xs.append(ind.fitness.loss_v)\n", " ys.append(ind.fitness.linear_complexity)\n", "plt.scatter(xs, ys, alpha=1.0, c='k', marker='*', s=100, linewidth=1.0)\n", "plt.plot(xs, ys, alpha=0.5, c='k', ls=':', linewidth=1.0)\n", "\n", "plt.yscale('log')\n", "plt.xlabel(\"Loss on validation partition (smaller is better)\")\n", "plt.ylabel(\"Complexity (smaller is better)\")\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "brush", "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.13.5" } }, "nbformat": 4, "nbformat_minor": 2 }