{ "cells": [ { "cell_type": "code", "id": "c33-0001", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:50.031812Z", "iopub.status.busy": "2026-05-31T13:42:50.031636Z", "iopub.status.idle": "2026-05-31T13:42:50.946668Z", "shell.execute_reply": "2026-05-31T13:42:50.945911Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:35:27.384703078Z", "start_time": "2026-05-31T18:35:27.328228089Z" } }, "source": [ "# context33.prj → pyRBM\n", "#\n", "# Architecture: shared-weights StackRnn (1 entity, reused every time step)\n", "# visible = [context(128) | x_t(40)] = 168 hidden = 128\n", "#\n", "# All hyperparameters taken verbatim from context33.prj.\n", "# Training data: 20-character sentence, encoded with the moby vocabulary.\n", "\n", "import numpy as np_cpu\n", "import matplotlib.pyplot as plt\n", "from rbm.stack_rnn import StackRnn\n", "from rbm.matrix import np, convert\n", "from rbm.entity import EntityParams, TrainingParams\n", "from rbm.status import CheckpointStatus" ], "outputs": [], "execution_count": 77 }, { "cell_type": "code", "id": "c33-0002", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:50.949289Z", "iopub.status.busy": "2026-05-31T13:42:50.948998Z", "iopub.status.idle": "2026-05-31T13:42:50.953268Z", "shell.execute_reply": "2026-05-31T13:42:50.952461Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:35:27.434822465Z", "start_time": "2026-05-31T18:35:27.386343747Z" } }, "source": [ "# ── Config from context33.prj ──────────────────────────────────────────────\n", "SENSORY_SIZE = 40 # numVisibleX * numVisibleY = 1 * 40\n", "CONTEXT_SIZE = 256 # numContext = numHidden\n", "LEARNING_RATE = 0.05 # learningRate\n", "MOMENTUM = 0.9 # momentum\n", "NUM_EPOCHS = 500 # numEpochs\n", "MINI_BATCH = 100 # miniBatchSize\n", "NUM_GIBBS = 3 # numGibbs\n", "RAO_BLACKWELL = True # doRaoBlackwell\n", "L2_LAMBDA = 0.0 # weightDecay\n", "PRJ_NAME = \"context33\"\n", "WORK_DIR = \"results\"\n", "\n", "# Vocabulary (40 chars, matching numVisibleY=40 in context33.prj)\n", "# Same encoding as moby_rnn.ipynb\n", "ALLOWED = set(' .!?ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')\n", "chars = sorted(ALLOWED)\n", "idx_to_char = {i: c for i, c in enumerate(chars)}\n", "char_to_idx = {c: i for i, c in enumerate(chars)}" ], "outputs": [], "execution_count": 78 }, { "cell_type": "code", "id": "c33-0003", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:50.955004Z", "iopub.status.busy": "2026-05-31T13:42:50.954814Z", "iopub.status.idle": "2026-05-31T13:42:50.959397Z", "shell.execute_reply": "2026-05-31T13:42:50.958632Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:35:27.496699992Z", "start_time": "2026-05-31T18:35:27.435851457Z" } }, "source": "# ── Training sentence ──────────────────────────────────────────────────────\nSENTENCE = (\n \"Call me Ishmael. Some years ago, never mind how long precisely, \"\n \"having little money in my pocket and nothing particular to interest \"\n \"me on shore, I thought I would sail about a little.\"\n)\n\n# Convert to uppercase, keep only in-vocab characters\nSENTENCE = ''.join(c for c in SENTENCE.upper() if c in ALLOWED)\nN_SAMPLES = len(SENTENCE)\n\nsensory_np = np_cpu.zeros((N_SAMPLES, SENSORY_SIZE), dtype=np_cpu.float64)\nfor i, c in enumerate(SENTENCE):\n sensory_np[i, char_to_idx[c]] = 1.0\n\ndecoded = SENTENCE\nprint(f\"Sentence : '{decoded}'\")\nprint(f\"Length : {N_SAMPLES} chars\")", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sentence : 'CALL ME ISHMAEL. SOME YEARS AGO NEVER MIND HOW LONG PRECISELY HAVING LITTLE MONEY IN MY POCKET AND NOTHING PARTICULAR TO INTEREST ME ON SHORE I THOUGHT I WOULD SAIL ABOUT A LITTLE.'\n", "Length : 180 chars\n" ] } ], "execution_count": 79 }, { "cell_type": "code", "id": "c33-0004", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:50.961020Z", "iopub.status.busy": "2026-05-31T13:42:50.960862Z", "iopub.status.idle": "2026-05-31T13:42:51.208274Z", "shell.execute_reply": "2026-05-31T13:42:51.207444Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:35:27.884105106Z", "start_time": "2026-05-31T18:35:27.497545407Z" } }, "source": [ "# ── Visualise one-hot encoding ─────────────────────────────────────────────\n", "step = max(1, N_SAMPLES // 40) # show at most 40 tick labels\n", "tick_pos = range(0, N_SAMPLES, step)\n", "\n", "plt.figure(figsize=(16, 3))\n", "plt.imshow(sensory_np.T, aspect='auto', cmap='hot', vmin=0, vmax=1)\n", "plt.colorbar(label='activation')\n", "plt.xlabel('Position')\n", "plt.ylabel('Vocab index')\n", "plt.title(f'One-hot encoding ({N_SAMPLES} chars)')\n", "plt.xticks(tick_pos, [decoded[i] for i in tick_pos], fontsize=8)\n", "plt.tight_layout()\n", "plt.show()" ], "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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U4sWLSpyHydNmmTz88qVKxUSEqIaNWpIkmJjYxUaGlpgyYd33323yG3YU7FiRZv+ueLs2bPatWuXpkyZogcffFBPPPGEjhw5orlz59osF3LllVcqOzu7wPHnzp2zbi9MpUqVFBMTo08//dRmnAtzqefiz+1KF5+rihUr6n//+59q1apV4DlLTEzU4sWLbepOnjwp6eJyHEFBQQ7jyR/jvy5FAgAAgJKN5DEAAHCr/KTwn5Na9hSWZD5w4IDNz/lJqquuukqSdP311ys4OFh79uxRenq6Talfv76uvvpqSVJ4eLgiIyOt5a9Jrr+2k99WfjuSVKNGDe3atavAfjt27LBud1blypV11VVX6emnny4Q/5QpUyTJ2ofCYv3rmOQnNH/99ddC282PtbD+VK5cWWXKlLH+d/fu3QX2s3dsYS4Vc348e/bsKbDf8ePHi9yOPZdKfF7KF198oerVq+uJJ57QnDlzNGXKFLVu3VphYWE26/9mZWWpdOnSBY6/4oorrNsLk5/4d3TN/uxS4ylJLVq00JIlS3T69GmdOnVK6enpGj16tCSpXLlyNscnJSUVaGPWrFn66aefNHnyZKWmpmrmzJl66KGH7I5nft3FiegAAADwFyHeDgAAAPi3jIwMHT58WH/7298c7ve3v/1Nhw4dKpA8Pn/+vN3985NVwcHBunDhgtq1a2d339OnT0uSXn75Zb3++uvW+n379ik6OrrI7bhLcPDFv8ufPn26pk6danefLVu22PzsrVgvh7diPnbsmE1C1VnR0dFq166dnnrqKZv6EydO6KefflLLli2tdUeOHLE7071KlSqSpMOHD7scx19dajxr1qypZcuWaefOnXrxxRd18OBB5eTkqH379nrxxRet910+e4ntc+fO6Y477lCbNm3UoUMHtW3bVt26ddOyZct0991368KFC9Z988f4ry/EBAAAQMlG8hgAALjdN998o969e6tly5Y2Sz7ku/322xUdHV3gn+IXxd69exUcHKykpCS7s2PzTZs2zWZZCkezQAuzf/9+1alTp0B93bp1rdsl52ZfHj16VBkZGSpVqpSWLVvmdEz27N27V5LUoEGDQs+ZH2th/Tl69KjOnj2rc+fO6ezZs7r++usL7GfvWFflx1O7dm3t27fPWl+hQgVVqFDB5fPu3LnT5i8JnBUZGSlJKlWqVIFtoaGhCgn54+v0pk2b9NRTT6levXrW2eiS1KxZM+v2wiQmJkq6eM2Kw3333acrrrhC999/v80yGEVdxiWfMUY//PCDfvjhB7300ksaNGiQRo0apTZt2tjcW9HR0Tp//rx+++23YokfAAAAvoFlKwAAgNu9+eabOnv2rD766KMCicCrrrpKH374oc6cOaM333zT6XPPnTtXeXl5Gjp0qN3t+e0lJSVp2bJl1rJq1Sqn2/ruu+/UrFkz3Xbbbda6MmXKqHfv3kpKStL27dslXVwHWZLKly9/yXNeuHBBc+bM0QMPPKAbb7yxwHZX1pDdsGGDEhMT1b9//wLLE+RLSUnRxo0b1aNHD5t9brzxRt1999367rvvrPEtWrRInTp10rXXXmvdr27durrnnnucjq0wy5YtU25urp555hmb+ueee+6yzpuQkKAGDRooLCzMpeP37Nmj8+fP6+GHH7apr1atmlq1aqWNGzda6+bPn6+cnBzFxcXZ7NunTx8dOnTI4T2Xnp6u//3vf+rVq5fNOLsqf2byn2d2R0RE6IknnijyOezN2M5PgP91eY4mTZpo27ZtysjIcCFaAAAA+CpmHgMAALfbs2ePevTooRkzZmjr1q2aPHmykpKSdN111+nJJ59UpUqV9Mgjj1hnXzojMTFRQ4YM0ZgxY3Tddddp3rx5yszMVHR0tDp37qxJkybprbfeKpZ+jBkzRo888oi+//57vfPOOzp+/Lh69Oih6OhoPfDAA9YZx3v37tWJEyfUp08fZWZm6syZM1qzZo3NjNo/GzhwoNq0aaM1a9bo448/1vbt21WhQgU1btxYd911lypWrOhUnMYYPfPMM1qwYIE2bdqk+Ph4HTlyRHXr1tWNN96otm3bSpIGDBig77//XgkJCZo8ebKuvPJK9e3bV6dOnbJZ4mPo0KFq27atVq5cqffff18hISHq27evtm3bpoYNG7o0ln+Vlpamt99+Wy+//LLmz5+vhQsXqmHDhmrXrp2OHj3q8lq68+fP12uvvaaYmBgtWbLEZtuzzz6r8uXLq2rVqpIuzta95pprJF18UV9GRobS09P16aef6qmnntKyZcs0d+5cWSwWxcXF6corr7SuISxJycnJmjBhgl555RWFhoZq7dq16tSpk+644w51797dZpkHe55//nn99NNP2rBhgyZNmmR9Rjp06KBGjRo51e/FixcrOztb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vLw867ZSpUopOjpaCxcudL4DciF5bIzR+fN/zNOeNWuWZs2a5VLjAAAAAAAAAOB1l5pd7MLM4xdffFEff/yxpkyZIknq06ePOnTooF69emns2LF2jwkODtaMGTM0dOhQtWrVSuXLl79kO/PmzZMk3XzzzVq0aJFOnz5t3ZaTk6N9+/Zpzpw5zndALiSPe/bsqdOnT+vLL7+0qX/wwQdVpkwZTZs2zaVAAAAAAAAAAMArirjmscVisanOzs5WTk7BKcuhoaFq0qSJRo8eba0zxmjp0qVq3rx5oc289tprSktL06effqpWrVoVKfThw4dLkvbt26fPP//cbjyucnrN40GDBik9Pb1AfVpamgYPHlwsQQEAAMC/nTGm0AIAAAB43PkiFEnJycnKyMiwlkGDBtk9XaVKlRQSEqLU1FSb+tTUVEVFRdk9pmXLlnryySf11FNPudSF7du36+abby5Qf+utt6pJkyYundPp5HH16tWVlJRUoH7//v2qXr26S0EAAAAAAAAAgNcU8YV51apVU0REhLX8eWbx5ShbtqymT5+up556SseOHXPpHBMnTtS1115boL5atWqaOHGiS+d0etmKtLQ0/e1vf9P+/ftt6hs2bOhyxwAAAAAAAADAa/J08aV5jrZLyszMVGZm5iVPl56erry8PEVGRtrUR0ZGKiUlpcD+tWrVUnR0tBYsWGCtCw6+OO83NzdXderUUWJiosM269evrw0bNhSo37hxo+rXr3/JmO1xeubxzJkz9c4776h169YKDg5WcHCw2rRpo7fffluff/65S0EAAAAAAAAAgNcUcdmKosrNzdX69esVGxtrrQsKClJsbKwSEhIK7L9z5041aNBAN998s7V8/fXX+vHHH3XzzTfr4MGDl2wzOzu7QLJakqpUqaK8vDznOvA7p2cev/rqq7ruuuu0bNkya6PBwcGaNm0aax4DAAAAAAAAKHmK+MI8Z4wbN05Tp07VunXr9Msvv6h///4KDw9XfHy8JGnq1KlKTk7W4MGDlZ2drW3bttkcf/LkSUkqUF+YxYsXa/To0erYsaMyMjIkSeXKldOoUaO0ZMkS5zsgF5LHubm56tatm1599VU1bNhQWVlZ2rp1qw4cOOBSAAAAAAAAAADgVX9a17jQ7U6aPXu2KleurOHDhysqKkqbNm1S27ZtlZaWJuniu+UuXHDhxIV4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x84bY+iptpKSkszjjz9uDh48aK688kojeSZ5LMmsXr3aPPjggyW6X7Vr1zZnzpwxFSpUsKlv166d2b9/f4ltq7BrtmbNGvPAAw+4pa3C2nRHueeee8yvv/5qateubQ4dOuS2v4wMCQkxqampNgm6iRMnmjfffNOt/fNU8VTyOC4uznzzzTdGkomIiDC7d+82w4cPL/bksSfvDW8UTz7Pnkwe+9tnvSf79efiie8dnv5e78nvHZ4s/piI9HRp2LChSUlJMWXLluWauVBq165tTp8+ba666iqPXzt/Sx57+l70RCF5TKH4VgmIZSsaN26s3bt369ixY94OpUSrV6+err32Wi1atEiTJ0/Wk08+6e2Qis2sWbNs/gnYFVdc4ZZ2PDmGnr5emzdv1o8//qgXXnjBre38WZ06dVSxYkUtX77cbW14ol+NGjXS7t27dfz4cZv6hIQEVa9eXZUqVSqRbdnToEED1a1bV5s3b3ZrO56waNEirVy5UmvXrtXw4cOVlJTklnby8vI0ffp09erVS5JUunRpPfLII5o8ebJb2vNXP//8s6677jpVqVJFjzzyiL744gudP3/eLW156t7wNk88z576/exvn/X5PPm72VPfO7z5vd4T3zs8yVPPl7/asmWLfvrpJ+3fv19z587Vyy+/rKpVq7q1TX+6Zo0aNdKePXt04sQJb4dS4nnjXgQQWAIieYzi8eSTT2ratGm6cOGCvvvuO0VHR6tu3breDqtYPPzww2rUqJG1nDt3zi3teHIMvXG9Xn31VfXr108VKlRwazuzZs3S9u3btX37dr377rtKT093a3ue6pc/y/+fnY8++ki9evXSnj17vB1SsXjzzTcVHBysSZMmubWdyZMn69FHH1VoaKi6dOmiHTt2aOfOnW5t0x9Nnz5dPXv2VK9evfTpp5+6tS1P3Rve4Mnn2VO/nyX//az3VL/8+Xuip793eIonny9/ZIzRgw8+qBYtWmjhwoVq2bKltm3bplq1armtTX++ZjVr1rSuLe7u39HeYoxx23k9fS96i7vGEIBjAZE83rBhg66//nq/+58BTwoJCdFjjz2mHj16KCkpSXv27FGZMmX8avaxu3lyDL11vfbv36/PPvtMQ4YMcWs7Dz/8sOrXr6+7775bY8aMcesLDiX392vjxo12P6OaN2+uAwcOFOv/pHqyrT/L/5+dli1b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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } } ], "execution_count": 80 }, { "cell_type": "code", "id": "c33-0005", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:51.209939Z", "iopub.status.busy": "2026-05-31T13:42:51.209737Z", "iopub.status.idle": "2026-05-31T13:42:51.213230Z", "shell.execute_reply": "2026-05-31T13:42:51.212592Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:35:27.943040281Z", "start_time": "2026-05-31T18:35:27.885267639Z" } }, "source": "# ── Prepare sequences for StackRnn ─────────────────────────────────────────\n# Tile the single sentence N_REPEAT times to form a real batch so GPU/CPU\n# matrix ops are (N_REPEAT, 168) instead of (1, 168).\nN_REPEAT = 500\nsequences = np_cpu.tile(sensory_np[np_cpu.newaxis, :, :], (N_REPEAT, 1, 1))\nprint(f\"sequences shape : {sequences.shape} → {N_REPEAT} × {N_SAMPLES} chars\")", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sequences shape : (500, 180, 40) → 500 × 180 chars\n" ] } ], "execution_count": 81 }, { "cell_type": "code", "id": "c33-0006", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:51.215346Z", "iopub.status.busy": "2026-05-31T13:42:51.215163Z", "iopub.status.idle": "2026-05-31T13:42:51.319714Z", "shell.execute_reply": "2026-05-31T13:42:51.319006Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:35:28.002522032Z", "start_time": "2026-05-31T18:35:27.943911470Z" } }, "source": [ "# ── Build model ────────────────────────────────────────────────────────────\n", "rnn = StackRnn(PRJ_NAME, WORK_DIR)\n", "rnn.append(StackRnn.make_layer(\n", " \"layer0\",\n", " sensory_size=SENSORY_SIZE,\n", " h_size=CONTEXT_SIZE,\n", " entity_params=EntityParams(\n", " do_gaussian_visible=False,\n", " do_gaussian_hidden=False,\n", " num_gibbs_samples=NUM_GIBBS,\n", " ),\n", " training_params=TrainingParams(\n", " learning_rate=LEARNING_RATE,\n", " momentum=MOMENTUM,\n", " num_epochs=NUM_EPOCHS,\n", " mini_batch_size=MINI_BATCH,\n", " num_gibbs_samples=NUM_GIBBS,\n", " do_rao_blackwell=RAO_BLACKWELL,\n", " l2_lambda=L2_LAMBDA,\n", " ),\n", "))\n", "\n", "rnn.state_init(0.01)\n", "rnn.state_load()\n", "\n", "e = rnn.from_index(0).entity\n", "print(f\"Mode : {'shared' if rnn.is_shared else 'unrolled'}\")\n", "print(f\"Visible : {rnn.h_size()} (context) + {rnn.sensory_size()} (sensory) = {e.shape[0]}\")\n", "print(f\"Hidden : {rnn.h_size()}\")\n", "print(f\"Parameters : {e.shape[0] * e.shape[1]:,}\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mode : shared\n", "Visible : 256 (context) + 40 (sensory) = 296\n", "Hidden : 256\n", "Parameters : 75,776\n" ] } ], "execution_count": 82 }, { "cell_type": "code", "id": "c33-0007", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:42:51.321630Z", "iopub.status.busy": "2026-05-31T13:42:51.321423Z", "iopub.status.idle": "2026-05-31T13:44:35.697232Z", "shell.execute_reply": "2026-05-31T13:44:35.696410Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:43:53.713415919Z", "start_time": "2026-05-31T18:35:28.004069404Z" } }, "source": [ "# ── Train: predict next character from current context ─────────────────────\n", "# Pairs used: (h_t, x_{t+1})\n", "# Step 1 — advance context: h_t = forward([h_{t-1} | x_t]) (no weight update)\n", "# Step 2 — CD update on visible = [h_t | x_{t+1}] (predict next)\n", "from rbm.train import cd_binary_binary, _to_gpu\n", "from rbm.matrix import rms_error_accu\n", "\n", "entity = rnn.from_index(0).entity\n", "h_sz = rnn.h_size()\n", "num_seq, T, s_sz = sequences.shape\n", "\n", "entity.grad_zero()\n", "\n", "d_progress = 100.0 / NUM_EPOCHS\n", "progress = 0.0\n", "status = CheckpointStatus(rnn.state_save, update_interval=10)\n", "status.on_change(entity)\n", "\n", "for epoch in range(NUM_EPOCHS):\n", " h = np.zeros((num_seq, h_sz))\n", " err_total = 0.0\n", "\n", " for t in range(T - 1):\n", " x_t = _to_gpu(sequences[:, t, :]) # current char x_t\n", " x_tp1 = _to_gpu(sequences[:, t+1, :]) # next char x_{t+1}\n", "\n", " # Step 1: advance context to h_t (no training)\n", " h = entity.forward(np.concatenate([h, x_t], axis=1))\n", "\n", " # Step 2: train on [h_t | x_{t+1}]\n", " vis = np.concatenate([h, x_tp1], axis=1)\n", " dwhv, dbv, dbh = cd_binary_binary(entity, vis)\n", " grad = entity.grad_compute(dbv, dbh, dwhv)\n", " entity.state_adjust(grad, 1.0 / num_seq)\n", " err_total += rms_error_accu(vis - entity.reconstruct(entity.forward(vis)))\n", "\n", " progress += d_progress\n", " if status.want_report(round(progress)):\n", " if not status.on_change(entity, {\n", " \"progress\": {\"value\": round(progress), \"unit\": \"%\"},\n", " \"err_rms\": {\"value\": err_total / (T - 1), \"unit\": \"\"},\n", " }):\n", " break\n", "\n", "rnn.state_save()" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-------------------------------------------\n", "Entity-296x256: progress : 0%\n", "Entity-296x256: err_rms : 3.5206192813609325e-05\n", "Entity-296x256: l2_norm : 168.14081845237274\n", "-------------------------------------------\n", "Entity-296x256: progress : 10%\n", "Entity-296x256: err_rms : 0.0002846312083479259\n", "Entity-296x256: l2_norm : 175.11439535880584\n", "-------------------------------------------\n", "Entity-296x256: progress : 20%\n", "Entity-296x256: err_rms : 0.0001958053595724496\n", "Entity-296x256: l2_norm : 182.26684401899442\n", "-------------------------------------------\n", "Entity-296x256: progress : 30%\n", "Entity-296x256: err_rms : 0.00018214022125563278\n", "Entity-296x256: l2_norm : 188.44618289565412\n", "-------------------------------------------\n", "Entity-296x256: progress : 40%\n", "Entity-296x256: err_rms : 0.00014556143658172474\n", "Entity-296x256: l2_norm : 194.11115081490732\n", "-------------------------------------------\n", "Entity-296x256: progress : 50%\n", "Entity-296x256: err_rms : 0.0001421858759457632\n", "Entity-296x256: l2_norm : 199.29947239189366\n", "-------------------------------------------\n", "Entity-296x256: progress : 60%\n", "Entity-296x256: err_rms : 0.00012014078723774705\n", "Entity-296x256: l2_norm : 204.13700705201106\n", "-------------------------------------------\n", "Entity-296x256: progress : 70%\n", "Entity-296x256: err_rms : 0.00011899923197647104\n", "Entity-296x256: l2_norm : 208.56436457236208\n", "-------------------------------------------\n", "Entity-296x256: progress : 80%\n", "Entity-296x256: err_rms : 0.0001093107101692574\n", "Entity-296x256: l2_norm : 212.7535847106701\n", "-------------------------------------------\n", "Entity-296x256: progress : 90%\n", "Entity-296x256: err_rms : 0.00011302519021015924\n", "Entity-296x256: l2_norm : 216.6413678308393\n", "-------------------------------------------\n", "Entity-296x256: progress : 100%\n", "Entity-296x256: err_rms : 0.00010362448422015396\n", "Entity-296x256: l2_norm : 220.34688279481534\n" ] } ], "execution_count": 83 }, { "cell_type": "code", "id": "c33-0008", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:44:35.698954Z", "iopub.status.busy": "2026-05-31T13:44:35.698747Z", "iopub.status.idle": "2026-05-31T13:44:35.743964Z", "shell.execute_reply": "2026-05-31T13:44:35.743294Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:43:54.079011304Z", "start_time": "2026-05-31T18:43:53.714907777Z" } }, "source": [ "# ── Reconstruction: teacher-forced ─────────────────────────────────────────\n", "# Step through each sample, reconstruct, compare to input.\n", "rnn.reset(batch_size=1)\n", "recons = []\n", "for i in range(N_SAMPLES):\n", " x_t = np.array(sensory_np[i][np_cpu.newaxis, :])\n", " h = rnn.step(x_t)\n", " rec = convert(rnn.reconstruct(h))[0] # (40,)\n", " recons.append(rec)\n", "\n", "recons_np = np_cpu.array(recons) # (12, 40)\n", "decoded_recon = ''.join(idx_to_char[int(np_cpu.argmax(recons_np[i]))] for i in range(N_SAMPLES))\n", "\n", "print(f\"Input : '{decoded}'\")\n", "print(f\"Reconstruction: '{decoded_recon}'\")\n", "\n", "correct = sum(decoded[i] == decoded_recon[i] for i in range(N_SAMPLES))\n", "print(f\"Char accuracy : {correct}/{N_SAMPLES} = {100*correct/N_SAMPLES:.0f}%\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input : 'CALL ME ISHMAEL. SOME YEARS AGO NEVER MIND HOW LONG PRECISELY HAVING LITTLE MONEY IN MY POCKET AND NOTHING PARTICULAR TO INTEREST ME ON SHORE I THOUGHT I WOULD SAIL ABOUT A LITTLE.'\n", "Reconstruction: 'MALL ME ISHMAEL. SOME YEARS AGO NEVER MIND HOW LONG PRECISELY HAVING LITTLE MONEY IN MY POCKET AND NOTHING PARTICULAR TO INTEREST ME ON SHORE I THOUGHT I WOULD SAIL ABOUT A LITTLE.'\n", "Char accuracy : 179/180 = 99%\n" ] } ], "execution_count": 84 }, { "cell_type": "code", "id": "c33-0009", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:44:35.745972Z", "iopub.status.busy": "2026-05-31T13:44:35.745781Z", "iopub.status.idle": "2026-05-31T13:44:36.051662Z", "shell.execute_reply": "2026-05-31T13:44:36.050823Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:43:54.629668429Z", "start_time": "2026-05-31T18:43:54.080558630Z" } }, "source": [ "# ── Visualise reconstruction ───────────────────────────────────────────────\n", "step = max(1, N_SAMPLES // 40)\n", "tick_pos = range(0, N_SAMPLES, step)\n", "\n", "step = max(1, N_SAMPLES // 40) # show at most 40 tick labels\n", "tick_pos = range(0, N_SAMPLES, step)\n", "\n", "plt.figure(figsize=(16, 3))\n", "plt.imshow(sensory_np.T, aspect='auto', cmap='hot', vmin=0, vmax=1)\n", "plt.colorbar(label='activation')\n", "plt.xlabel('Position')\n", "plt.ylabel('Vocab index')\n", "plt.title(f'Input ({N_SAMPLES} chars)')\n", "plt.xticks(tick_pos, [decoded[i] for i in tick_pos], fontsize=8)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "plt.figure(figsize=(16, 3))\n", "plt.imshow(recons_np.T, aspect='auto', cmap='hot', vmin=0, vmax=1)\n", "plt.colorbar(label='activation')\n", "plt.xlabel('Position')\n", "plt.ylabel('Vocab index')\n", "plt.title(f'Reconstruction (acc {100*correct/N_SAMPLES:.0f}%)')\n", "plt.xticks(tick_pos, [decoded[i] for i in tick_pos], fontsize=8)\n", "plt.tight_layout()\n", "plt.show()\n" ], "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABY8AAAEiCAYAAACxwS1VAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUQlJREFUeJzt3Xd0VNXax/FfuhAmIMUEosEIAnpFhIgIiKCxoKiAIioWEF+9iAUU9QoWpAiiFxAxdgzlKoKiNGlG4aISepUmJQQIJCEESKSkkPP+oYzMzWQyM0yf72etvRbZc87ez95z5mR42OwTIskQAAAAAAAAAABnCfV2AAAAAAAAAAAA30PyGAAAAAAAAABQDsljAAAAAAAAAEA5JI8BAAAAAAAAAOWQPAYAAAAAAAAAlEPyGAAAAAAAAABQDsljAAAAAAAAAEA5JI8BAAAAAAAAAOWQPAYAAAAAAAAAlEPyGAAAAJKke++9V4cPH1Z0dLS3QzlnhmFo/Pjx3g7DbOrUqZo2bZq3wwAAAAAcQvIYAADgHPXs2VOGYSgpKcnboUiSqlSposGDB6t9+/Z2nxMaGqohQ4Zo/PjxOn78uLn+5ptv1meffaZNmzaptLRUGRkZFbYRFxenjz/+WLt379aJEye0c+dOjR49WjVr1ix3bJMmTTR//nwVFhbq8OHDmjx5smrXru3YQP3IqFGjdM899+jKK6/0digAAACA3UgeAwAABJiqVavqjTfeUIcOHew+584771Tjxo31ySefWNT36NFDPXr00LFjx3TgwIEKz4+OjlZ6erq6du2qyZMn65lnntG8efP09NNPKy0tTSEhIeZj4+PjtXTpUjVs2FCDBg3Sv//9b3Xq1Ek//PCDIiIiHB6vP1i/fr1Wr16tAQMGeDsUAAAAwG7h3g4AAAAA3vfoo4/q119/LZcgHjRokB5//HGVlpZqzpw5uuKKK6yef9ddd+niiy9Wp06dNG/ePHN9fn6+Bg8erGbNmmn9+vXmNqOjo5WUlKR9+/ZJklauXKm0tDT16tVLn376qXsG6WJVq1bViRMn7D5++vTpGjJkiPr27WuxuhsAAADwVaw8BgAAcIPU1FQVFhaqXr16+u6771RYWKjc3Fy98847Cg39+ytY/fr1ZRiGBgwYoP79+2vPnj06ceKElixZon/84x8WbS5evFiLFy+22teZ7STq16+vvLw8SdIbb7whwzBkGIYGDx5cYaxRUVHq2LGj0tLSyr128OBBlZaWVjremJgYSVJOTk658yXp5MmT5rp77rlHc+fONSeOJenHH3/U9u3b1b1790r7CgkJ0bPPPquNGzfq5MmTys3N1fz5861uG9K5c2dt2rRJp06d0m+//aZbb73V4vWEhASlpKRo27ZtOnHihPLy8jR9+nTVr1/f4rgzW5Ncf/31SklJUU5Ojvbv3y9JqlatmsaOHauMjAydOnVKOTk5WrRokZo3b27Rxg8//KBq1arp5ptvrnSMAAAAgC9g5TEAAICbhIWFaeHChVqxYoVeeOEF3XTTTXrhhRe0a9cuffTRRxbHPvLIIzKZTEpJSdF5552nfv366aefflLTpk2Vm5trd5+HDh1Snz599NFHH+nbb7/Vt99+K0nauHFjheckJSUpKipKa9eudW6gkpYuXarTp09r3LhxGjBggPbv368rr7xSr7zyir777jtt375dklSvXj3FxsZq9erV5dpYuXKlbr/99kr7mjBhgh599FHNmzdPn332mcLDw9WuXTtde+21WrNmjfm46667Tnfffbc++OADFRYW6tlnn9WMGTOUkJCg/Px8SVLLli3Vpk0bffXVV9q/f78uvvhiPfnkk1qyZIkuv/xyi6S3JH3wwQc6dOiQhg4dan6w4EcffaRu3brp/fff15YtW1SrVi1dd911uuyyy7Ru3TrzuVu2bNGJEyfUtm1bzZw50+E5BgAAALzBoFAoFAqFQqE4X3r27GkYhmEkJSWZ61JTUw3DMIxXX33V4tg1a9YYq1atMv9cv359wzAM4/jx40a9evXM9S1btjQMwzBGjx5trlu8eLGxePHicv2npqYaGRkZ5p9r1aplGIZhDB482K74e/fubRiGYfzjH/+wedycOXMs+rHWTn5+vnG21NRUIywszHxMUlKSYRiG8dBDD5U7f9SoUYZhGEZkZGSFfXTo0MEwDMN49913bcZqGIZx6tQp45JLLjHXNW3a1DAMw3jqqafMdeedd165c1u1alUuxjPv8dKlS43Q0FCL448cOWKMHz/errnetm2b8f3333v9mqVQKBQKhUKhUOwpbFsBAADgRv+7wvjnn3/WJZdcUu64mTNnWuw3vGrVKi1fvtyulbjnqlatWpKkI0eOnFM7WVlZWrlypfr166cuXbpo9OjR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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABY8AAAEiCAYAAACxwS1VAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVytJREFUeJzt3Xd0VNXax/FfCkQJE5BiAtFghEvx4qVERFQMElQUpYmIWEB8VcQCig0bAipyvVKNHUPgKkVRigUULyhCQIg0aVIChEACoSVCSIH9/qGMjJkMmSHTv5+19lpkzzlnP2efM5PhYfOcEElGAAAAAAAAAACcJtTbAQAAAAAAAAAAfA/JYwAAAAAAAABAKSSPAQAAAAAAAAClkDwGAAAAAAAAAJRC8hgAAAAAAAAAUArJYwAAAAAAAABAKSSPAQAAAAAAAAClkDwGAAAAAAAAAJRC8hgAAAAAAAAAUArJYwAAAJyVxMREGWOUmJjolfFDQkK0bt06Pffcc14Z3580adJExcXF+uc//+ntUAAAAOAHSB4DAAC/1KdPHxljrK24uFi7d+9WSkqK6tat6+3wKtxDDz2kPn36BH0M9txxxx268MIL9dZbb3k7FLsefvhhbdiwQcePH9fu3bv15ptvqkqVKqW2q1+/vj799FMdPHhQR48e1eLFi9WuXbtS23Xp0kUbN27U4cOHNWfOHNWpU6fUNrNnz9Z7771Xqn/jxo366quvNHz48Ao5NwAAAAQ+Q6PRaDQajeZvrU+fPsYYY1544QVz5513mvvuu8988MEHpri42GzZssVERER4PcaKbOvWrTMLFy70yRhCQkJMRESECQkJ8Upcq1atMu+++67Xr5G99vrrrxtjjJkxY4Z58MEHzbhx40xRUZGZN2+ezXYXXHCB2bdvn9m7d68ZMmSIeeyxx8yqVatMUVGRadu2rXW7+Ph4c/z4cZOammr69+9vNm3aVOpY119/vTl06JCpVauW3Zg6duxojDHm4osv9vr80Gg0Go1Go9F8vnk9ABqNRqPRaDSn26nkcUJCgk3/yJEjjTHG3HbbbV6PsSKbM8njKlWqeD0GT7XmzZsbY4xp376912P5e4uJiTFFRUUmNTXVpv/hhx82xhhz8803W/veeustU1RUZBo2bGjtO/fcc83OnTvNypUrrX0PPvig2bp1q/XnxMREc+LECes/loSFhZn169ebxx9/vMy4wsPDzYEDB8ywYcO8Pkc0Go1Go9FoNN9ulK0AAAABZfHixZL+KAFwukaNGunTTz/VgQMHVFBQoBUrVuiWW24ptX+1atU0evRoZWRk6Pjx48rMzFRqaqpq1qxp3aZ27dr68MMPlZ2drYKCAq1evVr33HOPzXHq1asnY4wGDx6s+++/X1u3btXx48f1888/67LLLrPZNjo6Wh999JEyMzN1/Phx7dmzR7NmzVK9evUkSRkZGWratKnatWtnLdOxcOFCSX+V77jmmmuUnJysnJwc7d69W5KUkpKijIyMUuc4dOhQGWNK9d95551avny5jh49qoMHD+qHH37Qddddd8YYyqp53KNHD61cuVLHjh3T/v37NWXKlFIlRVJSUpSfn6+6devqiy++UH5+vvbt26c33nhDoaFn/qratWtXFRYW6scff7Tpj4uLU3JysjZt2qRjx44pNzdXM2bMsM7p6cpzzSMiIjR06FBt3rxZBQUF2rNnj2bOnKmLL764zNjatGmjSpUqadq0aTb9p37u1auXta9t27ZatWqVfvvtN2tfQUGB5syZo4SEBDVo0ECSdO655+rw4cPWbQ4ePKjQ0FCde+65kqRHHnlEYWFhmjBhQplxlZSUaNGiRerSpUuZ2wAAAACSFO7tAAAAACrSRRddJEk6dOiQte+SSy7RkiVLlJWVpddff11Hjx5Vz549NWvWLN16662aNWuWJCkyMlKLFy9WkyZN9NFHH+mXX35RrVq11LlzZ11wwQU6cOCAzjnnHC1atEgNGjTQW2+9pYyMDN12221KTU1V9erVNX78eJt4evfuLYvFovfee0/GGD399NP6/PPPdfHFF6ukpESSNHPmTP3zn//UhAkTtGPHDp1//vm67rrrFBcXp507d2rQoEGaMGGCfv/9d7366quSpJycHJtx3n77be3fv1/Dhw9XZGSk0/P20ksvadiwYVqyZIleeuklFRUVqXXr1mrfvr2+++67csVwuj59+mjSpEn6+eefNWTIEEVHR2vgwIG66qqr1KJFCx05csS6bVhYmObPn6/ly5frySefVIcOHfTkk09q27Ztevfddx3GfeWVV+rXX3+1zuUprVq10pVXXqlp06Zp9+7duuiii/TQQw9p0aJFuuSSS1RQUCCpfNc8NDRUX375pTp06KCpU6dq3Lhxslgsuu6669S0aVNt377dbmwRERGSZB3rlGPHjkmSEhISbLY9/Z61t+3WrVu1YsUKvfnmm+rVq5eWLVum559/Xlu2bNHhw4dVq1YtDR06VHfddVep+fi79PR0denSRRaLRfn5+Q63BQAAQHDz+vJnGo1Go9FoNGfbqbIV7du3NzVr1jSxsbGme/fuJicnxxQUFJjY2Fjrtt99951Zs2aNqVy5ss0xfvrpJ7N582brzy+//LIxxpiuXbuWOe5jjz1mjDGmd+/e1r7w8HCzZMkSk5eXZ6pWrWokmXr16hljjNm/f7+pXr26ddtbbrnFGGNMp06djCRTrVo1Y4wxgwcPdni+ZZWMODUPP/74owkNDbV5LSUlxWRkZJTaZ+jQocb8sfTYSDL169c3JSUlZubMmQ7rFpcVQ2JiojHGmMTEROt8ZGdnm7Vr19rUnr7pppuMMca8/PLLNjGeql19+jHT09PNihUrzngf7Nq1y3z66ael+s8555xSfa1btzbGGHPXXXc5dc379u1rjDFm0KBBTt2jLVq0MMYY8/zzz9v0X3/99cYYY/Ly8qx9s2fPNgcPHrTeP6fakiVLjDHGPPHEE9a+sWPHmlNyc3NNu3btjCTz3nvvma+//rpcsfXq1csYY0yrVq3O+r1Io9FoNBqNRgvcRtkKAADg177//nvl5uZq9+7dmjlzpo4eParOnTsrKytLknTeeeepffv2mjFjhiwWi2rWrGlt8+fPV8OGDa2lFG699VatXr3auhLZnptuukl79+7V1KlTrX0lJSUaP368LBZLqdIN06dPtykzcKqsxqlyBwUFBSosLFS7du1UvXp1l+fhgw8+0MmTJ13at2vXrgoLC9Pw4cPtlrNw1mWXXabo6Gi9/fbbKiwstPZ//fXX2rhxozp16lRqn7+vMF68eLHDkhCn1KxZ0+6K3ePHj1v/HB4erho1amjr1q06dOiQWrZsaX2tPNf81ltv1f79+x2WgrBn1apVWrZsmZ555hn17dtX9erVU8eOHfXee++pqKjIWmpCkt555x2dd955mj59upo3b65//OMfGjNmjLXEyenbDho0SHFxcbr88stVr149LVq0SM2aNdM999yjxx9/XFFRUZoyZYp2796thQsXqnHjxqViOzVntWrVcuqcAAAAEFxIHgMAAL82YMAAdejQQbfeequ++uor1apVyyZh2aBBA4WGhuqVV15Rbm6uTRs+fLgk6fzzz5f0R53kX3/91eF49erV05YtW0olWTdu3Gh9/XS7du2y+flUIvm8886TJBUVFemZZ57RjTfeqJycHP3www966qmnFB0d7dQ82KttXF7169fXiRMntGHDBpePcbpTc7B58+ZSr23atKnUHBUUFCg3N9em79ChQ6pRo0a5xgsJCSnVd84552jYsGHatWuXCgsLdeDAAeXm5uq8885TtWrVrNuV55rXr19fmzdv1okTJ8oVz+luvfVWrVmzRikpKdqxY4fmzp2rGTNmaNWqVfr999+t282bN0+PPPKIrrnmGmvt406dOun555+XJJttJSkzM1MrVqzQ0aNHJUnjx4/Xu+++q82bNys5OVkXXnihunTponXr1mnu3LkKCwuz2f/UnFXEPxYAAAAgcFHzGAAA+LWff/5Z6enpkqRZs2bpp59+0ieffKJGjRrp6NGj1oeuvfHGG5o/f77dY2zdutVt8ZWVcDw94Tlu3DjNnTtXXbt21Q033KARI0ZoyJAhat++vVavXl2ucf5eV1cqOzH490Sit7mSlD3lwIED1kT86SZMmKB7771XY8eOVVpamo4cOSJjjKZNm1auB/FVlD179qht27Zq0KCBYmJitGXLFuXk5CgrK8vm4XiSlJycrJSUFP3rX/9SUVGRVq9erfvuu0+SSm17up49e6pJkybq3LmzQkND1bNnT11//fVKT0/X+vXrdf/99+uKK67QkiVLrPucmrO/J+0BAACA05E8BgAAAePkyZMaMmSIFi1apEceeUSjRo2yPsysuLhY33//vcP9t23bpqZNmzrcZufOnfrXv/6lkJAQm+TsqdIAO3fudCn27du3a/To0Ro9erQaNGig1atXa/Dgwbr77rslubZC9NChQ3ZLYfx95e+2bdsUFhamSy65RGvWrCnzeOWN4dQcNGrUSAsXLrR5rVGjRi7PkT2bNm1SfHx8qf4ePXooNTVVTz75pLUvIiKi1HyU55pv27ZNrVu3Vnh4+BkfRFeWrVu3Wv+RokmTJqpbt64mTZpUartjx45p2bJl1p87dOigY8eO2SR+T3fuuefqjTfe0IsvvqgjR47o/PPPV+XKlbVnzx5Jf5TvOHTokGJjY232i4+P14kTJxwmpQEAAADKVgAAgIDyww8/aPny5Ro0aJAiIiK0f/9+LVy4UA8+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lZXlckwAAAAAAAAAgkAA1Dy+6qqrbH4uKCjQqlWrXE4cSy4kjydMmKAHHnhATz/9tFq0aKEWLVro6aef1n333afx48e7HEhycrKaNm2qXr16uXwMSRo5cqSioqKsLTY29qyOBwAAAAAAACDABUDN4//973/avn27Xn31VTVp0qRCjun0UuHevXurV69emjdvnrVv3bp1yszM1NSpUzVgwACng5gwYYJuvvlmXXPNNTYrhbOzsxUREaFq1arZrD6Ojo5Wdna23WMVFRWpqMhRgRIAAAAAAAAAOE2R/L7mcd26ddWrVy/dcccdevbZZ7V27Vp9/PHHmjp1qsvVGZxeeVxYWKgdO3aU6s/IyHApaTthwgR169ZN7du3L3Xc9PR0FRUVKSkpydrXsGFD1atXT2lpaU6PhT/wRNvgFhkSUmaDe/n7E6W5b86er9wDXEvAv1T0ZwffBQD38pXf9xXNk59FgTqHAHyckeNVx37wEXTgwAElJyfr6quvVv369fXpp5+qT58+2rFjh77//nuXjul08vitt97Siy++qMqVK1v7KleurOeff15vvfWWU8dKTk7WXXfdpd69eys/P1/R0dGKjo7WOeecI0nKy8vTxIkTNXr0aLVr104tW7ZUSkqKli5davdheQAAAAAAAADgtACoeXy6HTt26PXXX9ezzz6rdevWKTEx0aXjlKtsxcyZM21+7tChg3bv3q01a9ZIkpo1a6bKlSs7ncE+VeLihx9+sOnv27evUlNTJUmPP/64Tp48qZkzZyoiIkLz5893qTQGAAAAAAAAANh1pgSxHyWPr7zySt15553q0aOHzjnnHM2ePVtDhgxx6VjlSh6fXm9YKp1MzszMdGnwkHL817jCwkI98sgjeuSRR1waAwAAAAAAAAAcKv6zOXrdx7322mvq1auX6tatq++++04DBw7U7NmzVVBQ4PIxy5U87tevn8sDAAAAAAAAAIBPO1Xb2NHrPu6aa67RG2+8oRkzZujAgQMVcsxyJY/hmxw9LMDRA094GArwF1ffR67gvedenryWrqroOHzlnH0lDn/GHMIRR/dAWfeOv983gXperuDzwf/4ynWp6PeRJ88rUL8z+Qrm4+wxhwEqAMpWXH311RV+TJeSx7feeqt69uypuLg4mwfnSVJCQkKFBAYAAAAAAAAAHnFSjhPEPrry+JZbbtE333yjkpIS3XLLLQ63nTt3rtPHdzp5/Oijj+rVV1/VpEmT1KVLF6WkpKh+/fpq1aqVkpOTnQ4AAAAAAAAAALzKT8tWzJo1SzExMdq/f79mzZpV5nbGGIWHO7+O2Ok9BgwYoAceeEDTpk1T37599e9//1sZGRkaNmyYatSo4XQAAAAAAAAAAOBVRX+2slTyVCDOCQsLs/vnihLq7A5xcXFaunSpJKmgoEAWi0WSNGXKFN1xxx0VGx0AAAAAAAAAuNvJcjQfd/fdd5cqMSxJlSpV0t133+3SMZ1eeZydna0aNWpo165d2rVrl6644gqtXbtW8fHxCqEouEdRhB04e7yPAkcwXktfOWdficOfMYdwVaDeO4F6Xq5gLuAq7p2/MBe2mI+zxxwGqAB4YF5KSormzZun/fv32/RbLBalpKRoypQpTh/T6ZXH//vf/9S5c2drQGPGjNG3336r6dOn64svvnA6AAAAAAAAAADwKjetPB4wYIAyMjJUUFCgZcuWqVWrVuXa7/bbb5cxxql8a0hIiIwxpfovuOACHTlypNzHOZ3TK48feOABhYb+kXN+++23deDAAV155ZWaM2eO3nvvPZeCAAAAAAAAAACvKZbjmselq0GcUc+ePTV69Gj1799fy5cv16BBgzR//nw1atSo1Org09WrV0//+c9/9OOPP5ZrnF9++UXGGBlj9P3336ukpMT6WlhYmOLj4zVv3jznT0AuJI+NMTpx4q912tOnT9f06dNdGhwAAAAAAAAAvO5Mq4tdWHn8xBNP6IMPPtCkSZMkSf3791enTp3Ur18/jRo1yu4+oaGh+vjjjzV06FC1bdtW1atXP+M4s2bNkiQ1b95c8+fP1++//259raioSDt27NDMmTOdPwG5kDzu27evfv/9d3322Wc2/T169FCVKlU0efJklwIBAAAAAAAAAK8oZ81ji8Vi011YWKiiotJLlitVqqSEhASNHDnS2meM0YIFC9SmTZsyh3nppZe0b98+ffTRR2rbtm25Qh8+fLgkaceOHZo2bZrdeFzldM3jIUOGKDc3t1T/vn379Nxzz1VIUAAAAAhsR40pswEAAAAed6IcTVJWVpby8vKsbciQIXYPV6tWLYWHhysnJ8emPycnRzExMXb3ueqqq3Tffffp/vvvd+kUNmzYoObNm5fqv/zyy5WQkODSMZ1OHsfFxSkjI6NU/86dOxUXF+dSEAAAAAAAAADgNeV8YF5sbKyioqKs7fSVxWejatWqmjJliu6//34dOHDApWMkJyfrwgsvLNUfGxur5ORkl47pdNmKffv26V//+pd27txp09+sWTOXTwwAAAAAAAAAvKZEfzw0z9HrkvLz85Wfn3/Gw+Xm5qqkpETR0dE2/dHR0crOzi61ff369RUfH6+5c+da+0JD/1j3W1xcrEaNGmn79u0Ox7zkkkv0yy+/lOpftWqVLrnkkjPGbI/TK4+nTp2q8ePHq127dgoNDVVoaKiuvfZajRs3TtOmTXMpCAAAAAAAAADwmnKWrSiv4uJipaenKykpydoXEhKipKQkpaWlldp+06ZNatq0qZo3b25tc+bM0cKFC9W8eXNlZmaecczCwsJSyWpJqlOnjkpKSpw7gT85vfL4xRdf1EUXXaTvv//eOmhoaKgmT55MzWMAAAAAAAAA/qecD8xzxujRo5WamqqVK1fq559/1qBBgxQZGamUlBRJUmpqqrKysvTcc8+psLBQ69evt9n/8OHDklSqvyzffvutRo4cqS5duigvL0+SVK1aNb322mv67rvvnD8BuZA8Li4uVq9evfTiiy+qWbNmKigo0Lp167Rr1y6XAgAAAAAAAAAArzqtrnGZrztpxowZql27toYPH66YmBitXr1aHTt21L59+yT98Wy5kyddOHAZnnzySf3444/auXOnVq1aJUlq3ry5cnJydPfdd7t0zBBJAf1Ia4vFory8PMVERZWrHsnpXHnad2RIiNP7BDJHc8hcAe7De69ilDWPwTiHnrynuH8BVDQ+VwD4An/4LPKHGD3Jk38fqKixLBaLsvPyFOVCHixYncodqnqU5GjOLBbpsO/PbZUqVXTnnXdaF/2uXbtWU6dOdblshdM1jyXp7rvv1tq1a1VQUKCCggKtWbNGd911l0sBAAAAAAAAAIBXnSxH8wPHjh3TTz/9pLlz5+rHH3/U4cOHdeONN+qWW25x6XhOl614/PHHNWLECL311ltasmSJJOnqq6/Wu+++q1q1amns2LEuBQIAAAAAAAAA3lCeksZhbo/i7MTHx+uLL77QpZdeKmOMQkJCZE5b1R4e7nQq2Pnk8aOPPqqHHnpIU6ZMsfbNnTtX69ev18svv0zyGAAAAAAAAIBfCYTk8bhx45SRkaGkpCRlZGSodevWqlGjht588009+eSTLh3T6eRxnTp1tHTp0lL9S5cuVZ06dVwKAgAAAAAAAAC8pbgc21R2exRnp02bNmrfvr0OHDigkydP6sSJE1qyZImGDBmi8ePHq2XLlk4f0+nk8datW9WzZ0+NHDnSpv/222/Xli1bnA7AU6rJ/r8OHHawT7A9AMgd8fnCeUk89CrY+fp7zx0C9bw8jXn8iyfnwpcfQOJPgvGcgbJw3/uXYPzuhuDgD/evP8ToSf7+HRjO8ZOSxg6FhYVZH+aXm5urunXr6rffftPOnTvVqFEjl47pdPJ46NChmj59uq655hprzeOrrrpKSUlJ6tmzp0tBAAAAAAAAAIC3lKdsha/79ddf1axZM+3YsUPLly/X008/raKiIj3wwAPavn27S8cMLe+G//znPyVJn3/+uVq3bq3c3Fx17dpVXbt2VW5uri6//HLNmjXLpSAAAAAAAAAAwFtO6o8EclnNH1Ymv/LKKwoN/SPd+9JLLyk+Pl6LFy/WTTfdpMcee8ylY5Z75fHatWu1YsUKffjhh5o2bZruvvtulwYEAAAAAAAAAF9yUlLZhZMkfygs8u2331r/vG3bNjVp0kTnnXeeDh065PIxy73yODExUevXr9ebb76pvXv3KiUlRVdffbXLAwMAAAAAAACALygqR/NHZ5M4lv5ImjtKqpdSpUoV9ezZU3379lXbtm21detWTZw4UampqcrJyTmrYNzBYrEoLy9PMVFR1oLRACpWoD6UKRgf1hKM5xyouJZnz1fm0FfiCFQVPb++cr18JQ64F9f57DGHAAKNxWJRdl6eosiDldup3OHuqCgZB3MWYrHogiCc23KvPD7l2LFjmjRpktq1a6eGDRvq008/1cMPP6xdu3Zp9uzZ7ogRAAAAAAAAANzGUb3jUy0YOZ08Pt22bdv02muv6ZVXXlF+fr46depUUXEBAAAAAAAAgEecLEcLRuV+YN7ftW3bVv369dOtt96qkydPasaMGZo4cWJFxgYAAAAAAAAAblcsxwnis1qB68ecSh7XqVNHffv2Vd++fdWgQQMtXbpUjz32mGbMmKFjx465K0YAAAAAAAAAcJtgXl3sSLmTx19//bU6dOig3NxcTZ48WR999JF+++03d8YGOIWHXZw9V+cwUOc3UB9sxHslOHAty8cf3g++Eocj/vzg1IqO0dHxPHm/+cPcB6OKvge4zuXnK59TvhJHRQvU83IkGM+5ovnD9zAElxNynDwu+44NbOVOHhcXF6tHjx768ssvdfIkeXgAAAAAAAAAgYHksX3lTh536dLFnXEAAAAAAAAAgFdQ89g+lx+YBwAAAAAAAACBwMhx8jhYi6mQPAYAAAAAAAAQ1E782WCL5DEAAAAAAACAoEby2D6SxwgYPI317DGH3uPJuffkWDxBGb6O+7D8eD+fPX+fp7LuAX8/L09irrzHV+beV+KoaIF6Xo4E4zlXNOYQvuakKFthD8ljAAAAAAAAAEGtSI5XHod5KhAfQ/IYAAAAAAAAQFBj5bF9od4cvH///lqzZo2OHDmiI0eOaOnSperYsaP19YiICL311lvKzc1Vfn6+PvvsM51//vlejBgAAAAAAABAoDmpv+oe22uOEsuBzKvJ4927d+vZZ59VQkKCLrvsMv3vf//T7Nmzdckll0iSxowZo1tuuUW33XabEhMTVbduXX3++efeDBkAAAAAAABAgDlZjhaMQiSV/fQTLzhw4ICeeuopffbZZ9q/f7969+6tmTNnSpIaNWqkTZs26YorrtDy5cvLdTyLxaK8vDzFREUpPz/fnaEDAAAAAAAAXmOxWJSdl6co8mDldip3OCcqSiUO5izcYlHnIJxbr648Pl1oaKhuv/12RUZGKi0tTQkJCapcubIWLFhg3Wbz5s3auXOn2rRpU+ZxKleuLIvFYtMAAAAAAAAAoCysPLbP68njpk2bKj8/X4WFhXr33XfVrVs3bdy4UTExMSosLNSRI0dsts/JyVFMTEyZxxsyZIjy8vKsLSsry92nAAAAAAAAAMCPOap3fKoFI68njzdv3qzmzZurdevWeuedd5SamqomTZq4fLyRI0cqKirK2mJjYyswWgAAAAAAAACBhuSxfeHeDqC4uFjbtm2TJP3yyy9q1aqVBg4cqOnTpysiIkLVqlWzWX0cHR2t7OzsMo9XVFSkoqIit8cNAAAAAAAAIDAYOS5N4VMPjfMgryeP/y40NFQRERFKT09XUVGRkpKS9Pnnn0uSGjZsqHr16iktLc3p44b92f4uWP/VAL7lqCn7IygyJMSDkfg+5ipwcC0BIPD5+2d9WfH7Q+yuCsZz9gX+/l4BgEBQ/GeDLa+WrXjttdfUtm1b1atXT02bNtVrr72mdu3a6eOPP1ZeXp4mTpyo0aNHq127dmrZsqVSUlK0dOlSLV++3JthAwAAAAAAAAgg7ipbMWDAAGVkZKigoEDLli1Tq1atytz2//7v//Tjjz/q4MGDOnjwoL777juH23uCV5PH559/viZPnqzNmzfr+++/V6tWrXTDDTdowYIFkqTHH39cX375pWbOnKkff/xR2dnZ6t69uzdDBgAAAAAAABBg3JE87tmzp0aPHq1hw4apZcuWWrNmjebPn6/atWvb3b5du3aaOnWqrr32WrVp00aZmZn69ttvVbduXddOqgKEKMBLdlgsFuXl5Sk2Kkr5+fmlXqdsBXwB/02t/JirwMG1BIDA5++f9cFYwiEYz9kX+Pt7BYDvsFgsys7LU1QZeTCUdip3+GFUlIodzFkli0X/5+TcLlu2TCtWrNCjjz4qSQoJCVFmZqYmTJigUaNGnXH/0NBQHTp0SI888oimTJlSvhOqYF5deQwAAAAAAAAA3lYsqchBO1UP2WKx2LTKlSvbPV6lSpWUkJBgrbAgScYYLViwQG3atClXTFWqVFGlSpV08OBBV0/rrPncA/NQMQL1X64D9bwcxR6o5+yqYDznQOXJa8n7CAC8w98/Y/09fle4cs7B+Hu2os85UOcJ7sf/FgAqzsk/m6PXJSkrK8um/+WXX9awYcNKbV+rVi2Fh4crJyfHpj8nJ0eNGzcuV0yjRo3Snj17bBLQnkbyGAAAAAAAAEBQO1Nd41OvxcbG2pStKCwsdEs8zzzzjHr16qV27dq5bYzyIHkMAAAAAAAAIKiVd+Vxfn5+uWoe5+bmqqSkRNHR0Tb90dHRys7Odrjv4MGD9eyzz6pDhw5at27dGcdyJ2oeAwAAAAAAAAhqjuodn2rOKC4uVnp6upKSkqx9ISEhSkpKUlpaWpn7PfXUU3rxxRfVsWNHpaenOzlqxWPlMQAAAAAAAICgVt6Vx84YPXq0UlNTtXLlSv38888aNGiQIiMjlZKSIklKTU1VVlaWnnvuOUnS008/reHDh6t3797asWOHddXy77//rqNHj7oQwdkLmuTxmeqWBJpALY4fqOflSDCeM1DReB95j6MHCpWF6wVHAvXBXIF6Xo4E6jn7ynl5Mo5gfPizP8fuiD9cL3+I0ZOC7Zz94fq78v1X8p34g9lJOc4dupI8njFjhmrXrq3hw4crJiZGq1evVseOHbVv3z5JUlxcnE6e/OvIDz30kCIiIjRz5kyb45T1UD5PCJrkMQAAAAAAAADYU94H5jkrOTlZycnJdl+79tprbX6Oj493cRT3IXkMAAAAAAAAIKi5o2xFICB5DAAAAAAAACCoFf/ZyhLqqUB8DMljAAAAAAAAAEHNXWUr/B3JYwAAAAAAAABBjeSxfSSPAQCA2/DUaFS0QL2nAvW8HKnoc3b0dHtPzq+vXEvigCv84X3p6/eUr3wW+buy5tEf5tAfYoR9Ro7rGpf97g5sJI8BAAAAAAAABLWiP1tZqHkMAAAAAAAAAEHopByvPHb0WiAjeQwAAAAAAAAgqFHz2D6SxwAAAAAAAACCGiuP7SN5DMAreJAEUD68VwCgfPhMBHxPML4vg/Gc3YF5hDcUy3HN4zBPBeJjSB4DAAAAAAAACGqsPLaP5DEAAAAAAACAoEbNY/tIHgMAAAAAAAAIaiSP7SN5DAAAAAAAACCoUbbCPpLHALyCByCUX1kPTGMOgwPXGQAAwDt4cDEQXIr/bGUJ1iRqsJ43AAAAAAAAAEj6Y2Wxo9IUrDwGAAAAAAAAgCBEzWP7SB4DAAAAAAAACGrUPLaP5DEAAAAAAACAoFb0ZytLsCZRg/W8AcBv8DAOAAAAwPP4Hg4EF1Ye20fyGAAAAAAAAEBQo+axfSSPAQAAAAAAAAQ1I8eri42nAvExJI8BAAAAAAAABDVWHttH8hgAAAAAAABAUCv+szl6PRiRPAYAAAAAAAAQ1Fh5bB/JY8AFR03ZlW54Ii8Q+PgMgCO+fn/4enwAAACAN5A8to/kMQAAAAAAAICgdlKOH5jn6LVARvIYAAAAAAAAQFArkeO6xiWeCsTHkDwGAAAAAAAAENQoW2EfyWMAAAAAAAAAQY3ksX2h3g4A8EeRISFlNgCBj88AOOLr94evxwcAAAB4w8lyNFcMGDBAGRkZKigo0LJly9SqVSuH2/fo0UMbN25UQUGB1q5dqxtvvNHFkSsGyWMAAAAAAAAAQa1YUpGD5qgecll69uyp0aNHa9iwYWrZsqXWrFmj+fPnq3bt2na3b9OmjaZOnaqJEyeqRYsWmjVrlmbNmqV//vOfrp1UBQiRZLw2ugdYLBbl5eUpJipK+fn53g4HAAAAAAAAcAuLxaLsvDxFkQcrt1O5w7gzzJnFYtEuJ+d22bJlWrFihR599FFJUkhIiDIzMzVhwgSNGjWq1PbTpk1TZGSkbrnlFmtfWlqaVq9erYceesjJM6sYrDwGAAAAAAAAENROlKM5o1KlSkpISNCCBQusfcYYLViwQG3atLG7T5s2bWy2l6T58+eXub0nBM0D86paLN4OAQAAAAAAAHAb8l+ui4yKcljXODIqStIfK5BPV1hYqKKiolLb16pVS+Hh4crJybHpz8nJUePGje2OERMTY3f7mJiYcpyBewR88vjUBd2aleXlSAAAAAAAAAD3s1gslK0op6KiIu3du1e/7d59xm3z8/OV9bcc48svv6xhw4a5KzyvC/jk8Z49exQbG6v8/HxZLBZlZWVZf3anQB3L0+MxFmMxFmMxlnfGYyzGYizGYizvjMdYjMVYjMVY3hkvkMayWCzas2dPhR83UBUWFio+Pl6VK1d2eX97cnNzVVJSoujoaJv+6OhoZWdn290nOzvbqe09IeCTx5JKvWHy8/M99q8vgTqWp8djLMZiLMZiLO+Mx1iMxViMxVjeGY+xGIuxGIuxvDNeIIzlyWsTKAoLC8tMAruquLhY6enpSkpK0uzZsyX98cC8pKQkvfXWW3b3SUtLU1JSksaNG2ftu+6665SWllahsTkjKJLHAAAAAAAAAOBJo0ePVmpqqlauXKmff/5ZgwYNUmRkpFJSUiRJqampysrK0nPPPSdJGjdunH744Qc98cQT+uqrr9SrVy9ddtlleuCBB7x2DiSPAQAAAAAAAKCCzZgxQ7Vr19bw4cMVExOj1atXq2PHjtq3b58kKS4uTidP/vWYvrS0NPXu3VuvvPKKXnvtNW3ZskVdu3bV+vXrvXUKkiQTLK1y5cpm6NChpnLlyozlJ+MxFmMxFmMxVuCfG2MxFmMxli+PFcjnxliMxViM5ctjBfK5eXoeabSzaSF//gEAAAAAAAAAAKtQbwcAAAAAAAAAAPA9JI8BAAAAAAAAAKUETfI4LCxML730kjZu3Kh169Zp1apVeu+991StWjVvh1YhMjIy1KxZM7ePU7VqVeXn5+vDDz90+1iekpGRoU2bNmnVqlXW1rRpU7eN58k59NRYGRkZ2rhxo8LCwqx9K1asUGJiolvGOnW9Nm3apGeeeabCxzh9LE+dV6VKlfT6669ry5Yt2rBhg9auXat77rmnwsfx9FiS7TVbv369BgwY4LaxTh/TnZ+J//3vf/Xqq6/a9H355ZcaPHhwhY/11Vdf6eGHHy7Vv3r1anXr1q3Cx/OUU5+369evV0lJifXnadOmVfhYGRkZysnJUXj4X88JbteunYwxGjNmTIWO5cl7wxs8+X721O/nQP2s9+R5neKp7x2e/F7vye8dnuSp95cnP+u9oVu3blq5cqVWrVqljRs36vvvv1dISIhbxgrEaxYeHm59L//666/65Zdf9MUXX7j977Xu/p5ojCn1eeTuMT15L3qCN+bQEwL9MxGBzeuFlz3RJk2aZObMmWOqV69u7evRo4eJj4/3emwV0TIyMkyzZs3cPs59991nFi1aZA4ePGgiIyO9ft7+NHfemENPjZWRkWG2b99uHnjgAWvfihUrTGJioluvV926dc3hw4dNq1at/P68Pv74Y/PZZ5+ZKlWqGEmmXr16ZsOGDaZfv35+Pdbfr1lcXJw5fPiwufTSS90ylr0x3dGqV69uduzYYS677DIjyfTr18/8+OOPJiQkpMLH6t69u1m5cqVNX0JCgsnJyTHh4eFunUdPtHr16plDhw65/X5YsWKF6d69u7VvypQp5ueffzZjxozx23vDG82T72dP/X4O1M96T57Xqeap7x2e/F7vye8dnmye/v7ric96T7eYmBizf/9+ExcXZ+1r0aIF18yJNmXKFPPFF1/YvJeTkpJMz5493Tquu+fSGGOqVavmsTE9fS96onl6Dj3dAvEzkRbwzesBuL3Vr1/fHD161NSsWdPrsbireeqDdOnSpebGG280s2bNcluiKVDnzhtz6KmxMjIyzD333GMyMzPNueeeayTPJI8lmWXLlpkePXr49Xk1aNDAHD161NSoUcOm/8YbbzQ7d+7027HKumbLly83t956q1vGKmtMd7QbbrjB/Prrr6ZBgwZm9+7dbvvHyPDwcJOTk2OToEtOTjZvvPGGW8/PU81TyeMBAwaYL7/80kgyUVFRZsuWLWb48OEVnjz25L3hjebJ97Mnk8eB9lnvyfM6vXnie4env9d78nuHJ1sgJiI93Zo1a2ays7NN1apVuWYutAYNGpjff//dnHfeeR6/doGWPPb0veiJRvKYRvOtFhRlK1q2bKktW7bowIED3g7FrzVp0kQXXnih5s+fr4kTJ+q+++7zdkgVZvr06Tb/Beycc85xyzienENPX681a9Zo4cKFevzxx906zukaNWqkmjVratGiRW4bwxPn1aJFC23ZskUHDx606U9LS1NcXJxq1arll2PZ07RpUzVu3Fhr1qxx6zieMH/+fC1evFgrVqzQ8OHDlZGR4ZZxSkpKNGXKFPXr10+SFBERoTvuuEMTJ050y3iBasmSJbroootUp04d3XHHHfr000914sQJt4zlqXvD2zzxfvbU7+dA+6w/xZO/mz31vcOb3+s98b3Dkzz1/gpUa9eu1U8//aSdO3fq888/15NPPqm6deu6dcxAumYtWrTQ1q1bdejQIW+H4ve8cS8CCC5BkTxGxbjvvvs0efJknTx5Ul9//bXi4+PVuHFjb4dVIW6//Xa1aNHC2o4fP+6WcTw5h964Xi+++KIGDhyoGjVquHWc6dOna8OGDdqwYYMmTJig3Nxct47nqfMKZKf+svPee++pX79+2rp1q7dDqhBvvPGGQkND9f7777t1nIkTJ+rOO+9UpUqV1L17d23cuFGbNm1y65iBaMqUKerbt6/69eunjz76yK1jeere8AZPvp899ftZCtzPek+dVyB/T/T09w5P8eT7KxAZY9SjRw9deeWVmjdvnq666iqtX79e9evXd9uYgXzNLr74YmttcXf/jvYWY4zbjuvpe9Fb3DWHABwLiuTxL7/8on/84x8B95cBTwoPD9fdd9+tPn36KCMjQ1u3blWVKlUCavWxu3lyDr11vXbu3KlPPvlEL7zwglvHuf3223XJJZfo+uuv1+uvv+7WBxxK7j+vVatW2f2MatOmjXbt2lWhf0n15FinO/WXnauuukozZ850yxjecOLECZ08edLt42zcuFFbt27VLbfcon79+rHq2EWTJ0/WY489puPHj7v9HzA8dW94Q6C+nwPps/50nvjd7MnvHd74Xu/p7x3wL5s3b9b777+vbt26admyZercubO3Q/ILq1atUoMGDVS9enVJ0vbt29WiRQuNHDlS5513nneDO0v79u1TzZo1bfpq1aqlffv2uXXcQLoXvTWHAOwLiuTxtm3bNHPmTE2cONHmiZ3du3dXfHy8FyPzH507d9b27dt1wQUXKD4+XvHx8briiit099132zy9HmXz5Bx683q98soruuuuuzzyX6W+//57vfPOO3rllVfcPpY7z2vr1q2aO3eu3n//fZ177rmSpHr16unNN9/UiBEj/HYsVKyJEyfqueee0+WXX67p06d7Oxy/tHfvXg0ZMkTPPPOMt0OBjwqUz/q/c/fvZk9+7/Dm93pPfu+A76tbt66uvPJK68/Vq1dXfHy8tm3b5sWo/MfWrVs1e/bsUu/lyMhIL0ZVMebPn68HH3zQ+vPdd9+t7du3Kzs72y3jBeK96Ok5BOBYUCSPJalfv35as2aNli9frl9//VUbNmzQ9ddfX6ruHOy777779PHHH9v0bdq0SVlZWbrlllu8FFXF+Xv9sHbt2lX4GJ6cQ29erwMHDmj8+PEeq7M1YsQIXX311WrZsqVbx3H3ed1zzz3avn271q1bpw0bNujLL7/UG2+8oQ8//NCvx0LFmT59uho1aqRPP/1UR48e9XY4fmvSpElatmyZt8NAOXni9/PpAumz/nTuPi9Pf+/w5vd6T33v8ARPv78CTXh4uF566SVt3rxZq1at0uLFi5Wamqo5c+a4bcxAu2Z9+/bVunXrrO/lxYsXq0OHDho1apS3QzsrgwYNUp06dbRmzRqtWrVKvXv31m233ea28bxxL7qbp+cQgGMh+uPJeQAAAAAAAAAAWAXNymMAAAAAAAAAQPmRPAYAAAAAAAAAlELyGAAAAAAAAABQCsljAAAAAAAAAEApJI8BAAAAAAAAAKWQPAYAAAAAAAAAlELyGAAAAAAAAABQCsljAAAAVJjExEQZY1StWjWH22VkZGjgwIEeigoAAACAK0geAwAABKGUlBQZY2SMUWFhobZs2aIXX3xRYWFhZ3XcpUuXKiYmRkeOHJEk9enTR4cOHSq1XatWrfT++++f1VgAAAAA3Cvc2wEAAADAO7755hvde++9ioiI0E033aTk5GQVFxfr9ddfd/mYxcXFysnJOeN2ubm5Lo8BAAAAwDNYeQwAABCkCgsLlZOTo127dundd9/VggUL1LlzZ1WvXl2pqak6ePCgjh49qq+//loNGjSw7hcXF6c5c+bo4MGD+v333/Xrr7/qxhtvlGRbtiIxMVGTJk1S9erVrauchw4dKql02YoLL7xQs2bNUn5+vo4cOaLp06fr/PPPt74+dOhQrVq1SnfddZcyMjJ0+PBhTZ06VVWrVvXQbAEAAADBh+QxAAAAJEkFBQWqXLmyJk2apMsuu0ydO3dWmzZtFBISoq+//lrh4X/8p7Xk5GRFRETommuu0aWXXqpnnnlGv//+e6njLV26VAMHDtSRI0cUExOjmJgY/ec//ym1XUhIiGbPnq0aNWooMTFR1113nS6++GJNnz7dZrv69eura9euuvnmm3XzzTcrMTFRzz77rHsmAwAAAABlKwAAACAlJSXphhtu0DfffKNu3brpyiuvVFpamiTpzjvvVGZmprp27arPPvtMcXFxmjlzpn799VdJf6witqe4uFhHjhyRMcZhKYukpCRdeumlio+P1+7duyVJ99xzjzZs2KDLLrtMK1eulCSFhoaqb9++1kT1lClTlJSUpBdeeKHC5gEAAADAX1h5DAAAEKRuvvlm5efn6/jx4/rmm280ffp0TZo0ScXFxVq+fLl1u4MHD2rz5s1q0qSJJGn8+PF64YUX9NNPP+nll1/WpZdeelZxNGnSRJmZmdbEsSRt3LhRhw4dso4pSTt27LBZ4bx3716b0hYAAAAAKhbJYwAAgCC1cOFCNW/eXP/4xz907rnnqm/fvjLGnHG/iRMn6uKLL9aUKVN06aWXauXKlXrkkUfcHm9xcbHNz8YYhYbydRYAAABwF75tAwAABKmjR49q27ZtyszM1IkTJyT9seK3UqVKat26tXW7GjVqqFGjRtqwYYO1b/fu3Xrvvfd066236s0339T9999vd4yioiKFhYU5jGPjxo268MILdcEFF1j7mjRpovPOO89mTAAAAACeRfIYAAAAVlu3btWsWbP0wQcf6KqrrtK//vUv/fe//1VWVpZmz54tSRozZoyuv/56XXTRRWrRooWuvfZabdy40e7xduzYIYvFovbt26tmzZo699xzS22zYMECrVu3Th9//LFatGihVq1aafLkyVq0aJHS09Pder4AAAAAykbyGAAAADbuvfdepaen68svv1RaWppCQkJ00003qaSkRJIUFham5ORkbdy4UfPmzdNvv/2mAQMG2D1WWlqa3nnnHU2fPl25ubl6+umn7W7XpUsXHTp0SD/++KMWLFig7du36/bbb3fbOQIAAAA4sxBJZy5sBwAAAAAAAAAIKqw8BgAAAAAAAACUQvIYAAAAAAAAAFAKyWMAAAAAAAAAQCkkjwEAAAAAAAAApZA8BgAAAAAAAACUQvIYAAAAAAAAAFAKyWMAAAAAAAAAQCkkjwEAAAAAAAAApZA8BgAAAAAAAACUQvIYAAAAAAAAAFAKyWMAAAAAAAAAQCkkjwEAAAAAAAAApfw/kPbIUvW6sEQAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } } ], "execution_count": 85 }, { "cell_type": "code", "id": "c33-0010", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T13:44:36.053484Z", "iopub.status.busy": "2026-05-31T13:44:36.053314Z", "iopub.status.idle": "2026-05-31T13:44:36.198793Z", "shell.execute_reply": "2026-05-31T13:44:36.197851Z" }, "ExecuteTime": { "end_time": "2026-05-31T18:43:55.864990961Z", "start_time": "2026-05-31T18:43:54.630647593Z" } }, "source": [ "# ── Next-step prediction ───────────────────────────────────────────────────\n", "# Given h_t (context after seeing x_t), predict x_{t+1} via clamped Gibbs.\n", "def predict_next(rnn, context, n_gibbs=NUM_GIBBS, temperature=1.0):\n", " entity = rnn.next_entity()\n", " h_sz, s_sz = rnn.h_size(), rnn.sensory_size()\n", " x_init = (np.random.rand(1, s_sz) > 0.5).astype(float)\n", " visible = np.concatenate([context, x_init], axis=1)\n", " for _ in range(n_gibbs):\n", " h = entity.forward(visible)\n", " visible = entity.reconstruct(h)\n", " visible[:, :h_sz] = context\n", " probs = convert(visible[:, h_sz:])[0]\n", " probs = np_cpu.power(np_cpu.clip(probs, 1e-10, 1.0), 1.0 / temperature)\n", " probs /= probs.sum()\n", " return probs\n", "\n", "rnn.reset(batch_size=1)\n", "h = np.zeros((1, CONTEXT_SIZE))\n", "predicted = ''\n", "\n", "for i in range(N_SAMPLES - 1):\n", " x_t = np.array(sensory_np[i][np_cpu.newaxis, :])\n", " h = rnn.step(x_t) # advance to h_t\n", " probs = predict_next(rnn, h.copy()) # predict x_{t+1} from h_t\n", " predicted += idx_to_char[int(np_cpu.argmax(probs))]\n", "\n", "print(f\"Input (t+1) : '{decoded[1:]}'\")\n", "print(f\"Predicted from h_t : '{predicted}'\")\n", "correct = sum(decoded[i+1] == predicted[i] for i in range(N_SAMPLES - 1))\n", "print(f\"Next-step accuracy : {correct}/{N_SAMPLES-1} = {100*correct/(N_SAMPLES-1):.0f}%\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input (t+1) : 'ALL ME ISHMAEL. SOME YEARS AGO NEVER MIND HOW LONG PRECISELY HAVING LITTLE MONEY IN MY POCKET AND NOTHING PARTICULAR TO INTEREST ME ON SHORE I THOUGHT I WOULD SAIL ABOUT A LITTLE.'\n", "Predicted from h_t : 'MRL.ME PSHMAEL. SMME YEARS AGO NEVER MIND HOWALONG PRECISELY HAVING LITTLE MONEY IN MY POCKET AND NOTHING PARTICULAR TO INTEREST ME ON SHORE I THOUGNT I WOULDTSAIL ABOUT A LITTLE.'\n", "Next-step accuracy : 171/179 = 96%\n" ] } ], "execution_count": 86 } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }