{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Project: Building a Proactive Psychology Tutor Engine\n", "\n", "**Goal:** This notebook retrains the `proactive-tutor-engine`'s models using the psychology-focused datasets from the `psychology-data-pipeline`. The final product will be an intelligent tutor specialized in the domain of psychology.\n", "\n", "**Methodology:**\n", "1. **Data Ingestion:** Assumes the `normalize_psych_data.py` script has been run to generate a clean, unified dataset.\n", "2. **Student Interaction Simulation:** Creates a realistic, time-series log from the static Q&A data, which is essential for training our temporal models.\n", "3. **Feature Engineering:** Engineers historical features (e.g., prior attempts) and textual features (e.g., question length) from the data.\n", "4. **BKT Model Training:** Trains a Bayesian Knowledge Tracing (BKT) model on a specific psychology \"skill\" to track long-term student mastery.\n", "5. **LGBM Model Training:** Trains an enriched LightGBM \"Success Predictor\" to make tactical, short-term predictions of student success.\n", "6. **Showcase Simulation:** Demonstrates the fully retrained tutor, combining the strategic BKT model and the tactical LGBM model to make intelligent, proactive help decisions." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "vscode": { "languageId": "plaintext" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Setup complete.\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os\n", "import joblib\n", "import re\n", "import lightgbm as lgb\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import roc_auc_score\n", "from sklearn.preprocessing import LabelEncoder\n", "from pyBKT.models import Model\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "# --- Define Paths and Constants ---\n", "PROCESSED_DATA_DIR = 'data/processed/'\n", "MODELS_DIR = 'models/'\n", "os.makedirs(MODELS_DIR, exist_ok=True)\n", "\n", "# --- THIS IS THE CHANGE ---\n", "# Point to the new data file that includes the pre-computed embeddings\n", "PSYCH_DATA_FILE = os.path.join(PROCESSED_DATA_DIR, \"psychology_data_with_embeddings.parquet\")\n", "# --- END OF CHANGE ---\n", "\n", "print(\"Setup complete.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data Ingestion and Student Interaction Simulation\n", "\n", "This is the most critical step. First, we ensure our source psychology data exists by running the `normalize_psych_data.py` script.\n", "\n", "Then, because the Tutor Engine's models require sequential student interaction data (which our Q&A dataset lacks), we create a **Student Interaction Simulator**. This function generates a realistic, time-series log from the static data, creating simulated students, their attempts, success/failure, and response times. This makes training our temporal models possible." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "vscode": { "languageId": "plaintext" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully loaded 401,374 psychology Q&A pairs.\n", "\n", "Dataset sources (our 'skills'):\n", "source\n", "BoltMonkey/psychology-question-answer 197179\n", "Gragroo/psychology-question-answer_psygpt_with_validation 193235\n", "PsychoLexQA 9803\n", "MMLU/professional_psychology 612\n", "MMLU/high_school_psychology 545\n", "Name: count, dtype: int64\n", "\n", "Simulating interaction logs for 500 students...\n", "Simulation complete. Generated 25,000 interactions.\n" ] } ], "source": [ "# Import the simulation function from our new module\n", "from feature_engineering import simulate_student_interactions\n", "\n", "# --- Step 1: Load the Psychology Dataset ---\n", "if not os.path.exists(PSYCH_DATA_FILE):\n", " print(f\"FATAL: Psychology data file not found at '{PSYCH_DATA_FILE}'. Please run `compute_embeddings.py` first.\")\n", " df_psych = None\n", "else:\n", " df_psych = pd.read_parquet(PSYCH_DATA_FILE)\n", " df_psych['problem_id'] = df_psych.index.astype(str)\n", " print(f\"Successfully loaded {len(df_psych):,} psychology Q&A pairs.\")\n", " print(\"\\nDataset sources (our 'skills'):\")\n", " print(df_psych['source'].value_counts())\n", "\n", "# --- Step 2: Use the imported Student Interaction Simulator ---\n", "if df_psych is not None:\n", " df_simulated_log = simulate_student_interactions(df_qa=df_psych, num_students=500, interactions_per_student=50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feature Engineering for Tutor Models\n", "\n", "Now that we have a simulated time-series log, we use our centralized `create_features` function to engineer the features needed for the LGBM model. We treat the `source` of the data as the \"skill\" for our models." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "vscode": { "languageId": "plaintext" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Starting Feature Engineering...\n", "Feature engineering complete. 24,500 interactions ready for modeling.\n" ] } ], "source": [ "# Import the feature creation function\n", "from feature_engineering import create_features\n", "\n", "if 'df_simulated_log' in locals() and not df_simulated_log.empty:\n", " print(\"\\nStarting Feature Engineering...\")\n", "\n", " # First, create and save the encoder that will be used by the function\n", " skill_encoder = LabelEncoder()\n", " skill_encoder.fit(df_simulated_log['source'])\n", " joblib.dump(skill_encoder, os.path.join(MODELS_DIR, 'psych_skill_encoder.joblib'))\n", "\n", " # Now, create the features using the centralized function\n", " df_model_data = create_features(df_simulated_log, skill_encoder)\n", " \n", " print(f\"Feature engineering complete. {len(df_model_data):,} interactions ready for modeling.\")\n", "else:\n", " print(\"Simulated data not available. Cannot proceed.\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- Training BKT 'Strategist' Models for Top Skills ---\n", "\n", "--- Training BKT for skill: BoltMonkey/psychology-question-answer ---\n", "\n", "Simulating interaction logs for 100 students...\n", "Simulation complete. Generated 3,000 interactions.\n", "BKT model for 'BoltMonkey/psychology-question-answer' saved to: models/bkt_model_BoltMonkey_psychology-question-answer.pkl\n", "\n", "--- Training BKT for skill: Gragroo/psychology-question-answer_psygpt_with_validation ---\n", "\n", "Simulating interaction logs for 100 students...\n", "Simulation complete. Generated 3,000 interactions.\n", "BKT model for 'Gragroo/psychology-question-answer_psygpt_with_validation' saved to: models/bkt_model_Gragroo_psychology-question-answer_psygpt_with_validation.pkl\n", "\n", "--- Training BKT for skill: PsychoLexQA ---\n", "\n", "Simulating interaction logs for 100 students...\n", "Simulation complete. Generated 3,000 interactions.\n", "BKT model for 'PsychoLexQA' saved to: models/bkt_model_PsychoLexQA.pkl\n" ] } ], "source": [ "if 'df_model_data' in locals() and not df_model_data.empty:\n", " print(\"\\n--- Training BKT 'Strategist' Models for Top Skills ---\")\n", " \n", " # Get the top 3 most common skills (datasets)\n", " top_skills = df_psych['source'].value_counts().nlargest(3).index.tolist()\n", " bkt_models = {}\n", "\n", " for skill_name in top_skills:\n", " print(f\"\\n--- Training BKT for skill: {skill_name} ---\")\n", " skill_questions = df_psych[df_psych['source'] == skill_name]\n", " \n", " bkt_simulated_log = simulate_student_interactions(df_qa=skill_questions, num_students=100, interactions_per_student=30)\n", " bkt_simulated_log['order_id'] = bkt_simulated_log.groupby('student_id').cumcount() + 1\n", " bkt_df_formatted = bkt_simulated_log.rename(columns={'student_id': 'user_id', 'source': 'skill_name', 'is_correct': 'correct'})\n", " \n", " # You can tune these defaults per skill if desired\n", " defaults = {'prior': 0.5, 'learns': 0.1, 'guesses': 0.1, 'slips': 0.2, 'forgets': 0.01}\n", " bkt_model = Model(seed=42, num_fits=1, defaults=defaults)\n", " bkt_model.fit(data=bkt_df_formatted, skills=skill_name)\n", " \n", " # Save the model with a skill-specific name\n", " # Replace invalid filename characters\n", " safe_skill_name = re.sub(r'[\\\\/*?:\"<>|]',\"_\", skill_name)\n", " model_path = os.path.join(MODELS_DIR, f'bkt_model_{safe_skill_name}.pkl')\n", " bkt_model.save(model_path)\n", " print(f\"BKT model for '{skill_name}' saved to: {model_path}\")\n", " bkt_models[skill_name] = bkt_model\n", "\n", " # For the showcase, we'll just use the first one trained\n", " SKILL_TO_MODEL = top_skills[0] if top_skills else None\n", "else:\n", " print(\"Modeling data not available. Skipping BKT training.\")\n", " bkt_model = None" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "vscode": { "languageId": "plaintext" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- Training ENRICHED LGBM 'Success Predictor' Model ---\n", "Training on 19,600 interactions with 390 features.\n", "[LightGBM] [Info] Number of positive: 5557, number of negative: 14043\n", "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.021628 seconds.\n", "You can set `force_col_wise=true` to remove the overhead.\n", "[LightGBM] [Info] Total Bins 98624\n", "[LightGBM] [Info] Number of data points in the train set: 19600, number of used features: 390\n", "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.283520 -> initscore=-0.927066\n", "[LightGBM] [Info] Start training from score -0.927066\n", "\n", "Enriched LGBM Model AUC on validation set: 0.9115\n", "Enriched LGBM 'Tactician' model saved to: models/lgbm_psych_predictor_enriched.joblib\n", "\n", "--- Feature Importance for Enriched Q&A Tactician ---\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9oAAAMWCAYAAAAOPf6IAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8yJJREFUeJzs3QmcjfX///+Xfd932UtCEYps2akktChRKVn6EJFPRYQIFVFUpEKfSKVNCSEqiWSJJIVKi70i+zb/2/P9/V/nd53jzMyZcTBn5nG/3U5jzrnmOte5znWmeV6v1/t9pYuLi4szAAAAAAAQFemjsxoAAAAAACAEbQAAAAAAooigDQAAAABAFBG0AQAAAACIIoI2AAAAAABRRNAGAAAAACCKCNoAAAAAAEQRQRsAAAAAgCgiaAMAAAAAEEUEbQAAkKb973//s0suucQyZcpkefPmPd+bA0RkyZIlli5dOvfV06lTJytTpsx53S4A/4egDQBRoj94Irn5/yg6G3777TcbOnSo1axZ0/Lly2cFCxa0hg0b2sKFC8Mu/88//1jXrl2tUKFCliNHDmvUqJGtXr06oufSeuN7nT/88IOdDS+88IJNnTrVUiLtj0svvdRi1Z9//mlDhgyxtWvXWlqh41Th5MILL7TJkyfbSy+9dE6e98svv7S2bdtakSJFLEuWLC4cde/e3X1+4zNt2jR3fGXPnt1Klixpd955p3vPEtOuXTv3mXz44YeTtI0HDhywwYMHu+fU74YCBQrY5Zdfbr17947oeVO70N9/+fPntyuvvNJeffVVO3XqlMWSESNG2Pvvv3++NwNIVTKe7w0AgNRUFfN77bXXbMGCBafdX7FixbO6HR988IE9+eST1qZNG7vrrrvsxIkTbluaNWvm/gC8++67A8vqj8GWLVvat99+a//9739dKFeQ1R+Qq1atsvLlyyf6fCVKlLCRI0eedn/x4sXtbND2aTsVjhBdCk86SaPQp0CVFujElz4Hzz77rF100UXn5DnHjx/vwmq5cuXs/vvvt2LFitnGjRvt5ZdftjfffNPmzp1rV111VdDPvPfee+6Yb9CggfXs2dN27dpls2bNsh9//DHBz9r+/fvtww8/dO/pG2+8YaNGjXKhMDHHjx+3q6++2p2I0O8RbaeC94YNG2zGjBnuJMHZ+ozHEv/vv927d7vftZ07d3bvi/b1uaaTRckJ+QraN998s/v/BoAoiQMAnBU9evSIOx+/Zr/77ru43bt3B9135MiRuEsuuSSuRIkSQfe/+eabbhvffvvtwH27du2Ky5s3b1z79u0Tfa4GDRrEVa5cOe5c0vPpeaPp1KlTcYcOHTrj9ZyP/RENx48fjzt69GjcypUr3fEwZcqUuLRi6NCh7jWHfmbOxMGDB+N9bOnSpXHp06ePq1+//mnLbd68Oa5IkSJxxYsXj/v777+DHmvXrl1c/vz54w4fPhx0v963hLz66qtxmTJlivv000/d61yyZElEr+Gtt95yy0+fPv20x7QN+/bti0vrwn3e9Z7q92yOHDnijh07FvbnTp48edr7mByLFy9275G+nilt71133RUXTQcOHIjq+oBYQ+s4AJxDBw8etAcffNC1fapdtEKFCjZ69Gil8aDlVHFS1Wr69OlumaxZs1qNGjXs888/T/Q5Kleu7Cq+fnqu6667zn7//Xf7999/A/erIqbW1RtvvDFwn1rI1WqqyvjRo0fP+DVrHWo/VbVQ26HX/tBDD5227ilTpljjxo2tcOHCbrlKlSrZiy++GLSMqnKqqH322WeBdk1V30Utz+EqdWoz1/2//PJL0Hquv/56mz9/vl1xxRWWLVs2mzRpUqCV/oEHHgi8R9pudQgktxXUey/ffvtt95r0XLVr17b169e7x/W8eg69x3ot/u30t6Orw6BOnTru58uWLWsTJ0487blU5VQ1Te+p1le1alXXbuyn9WubdNyNGzfOtUzrdapTQG2voq4Hb/96bfpffPGF3XLLLVaqVKnA+9inTx87fPhw0PpVdc2ZM6f98ccfrjqmf+uY6tevn508eTJoWa+SfNlll7nt1XLXXHONffPNN0HLvf766+7412tXe+5tt912Wov1Tz/9ZDfddJMVLVrUrUuVRi23b9++eN8bHQc6NkXPrder48ijfaLPk16vqrc9evRwx0d8748qwGrrHjBgQLzPOWzYMPc8el+0rJ/ei6eeesp1FoS2sKdPn951p2TIkCHo/syZM1tC9DtE3SwaEqJuGn0fiS1btrivdevWPe0x7d/cuXMH7QPvc+gXbrxwUt5zDX/RPtIQGO3bTz75JGgZVf7r16/v2tpz5crlunP0+8Fvx44d7njW8aD3Ud0DrVu3Dvqc6blbtGjhfm96n6977rnHkkPbq24E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AAAAgChK1UFbg/U1vji+W6zTJbrie22hLfgAAAAAgHPjvM46frZpLLOukZZaacx46LXuPGfrUmEAAAAAgDQctBU2Q6dlT+3XugMAAAAAnF+punUcAAAAAIBzjaANAAAAAEAUEbQBAAAAAIgigjYAAAAAAFFE0AYAAAAAIIoI2gAAAAAARBFBGwAAAACAKCJoAwAAAAAQRQRtAAAAAACiiKANAAAAAEAUEbQBAAAAAIgigjYAAAAAAFFE0AYAAAAAIIoI2gAAAAAARBFBGwAAAACAKCJoAwAAAAAQRQRtADHl5MmTNmjQICtbtqxly5bNLrzwQhs2bJjFxcWFXb579+6WLl06GzduXND9TzzxhNWpU8eyZ89uefPmTfA59+7dayVKlHDr+eeffxJctkyZMm45/23UqFFBy2hbR48ebRdffLFlyZLFLrjgArc9fkePHrVHH33USpcu7ZbRel999dVE9g4AAABSgoyWRnTq1Mn9gfz++++HfXzIkCHusbVr14ZdvmHDhnb55Zef9sc6gHPrySeftBdffNGmTZtmlStXtm+++cbuvvtuy5Mnj/Xq1Sto2ffee8+WL19uxYsXP209x44ds1tuucVq165tr7zySoLP2blzZ6tSpYr98ccfEW3j448/bl26dAl8nytXrqDHe/fubZ988okL25dddpn99ddf7ubXrl0727lzp9u2iy66yLZv326nTp2K6PkBAABwfqWZoJ2Yfv362f33339OnmvJkiXWqFEj+/vvv4MqaSktzE+dOtUeeOCBRCt4wLm0bNkya926tbVs2dJ9r0rvG2+8YV9//XXQcgrF+kzPnz8/sKzf0KFDA8d5QhTq9Rl47LHHbO7cuRFto4J10aJFwz62ceNGt87vvvvOKlSo4O5Tdd5v3rx59tlnn9nWrVstf/78gdcJAACA2EDQ/v/lzJnT3XBu1Bq5yE5kzHG+NwMx5pdRLV2790svvWQ//vija73+9ttvbenSpfbMM88EllPl94477rD//ve/ruqdXN9//72rTq9YscKF3kipVVzt7KVKlbLbb7/d+vTpYxkz/t+v2w8//NDKlStnH330kV1zzTWujbxp06b21FNPBUL17Nmz7YorrnD3/e9//7McOXLYDTfc4NapdnkAAACkbKlujPasWbNcK6b+GC1QoID7A/bgwYOnLbdy5UorVKiQa0P1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AIC0hYp2iFOnTrnKriqcqvwq2M2aNSuo7VjVVYVKPd64cWPbtWuXzZ071ypWrGi5c+e222+/3Q4dOhS0XgVXBd08efK4gDpo0CBXofUcPXrU+vXrZxdccIELtbVq1XLPF9oqXqpUKcuePbu1bdvW9u7dG/Hr0va2b9/eVZAVWjt27GgtWrSwL774IrDMvHnzrFOnTm4ZvW4937Zt22zVqlWBZVTtVSitWbOmC68DBw507ev+ZZLip59+suLFi7t1dejQwT1fOAcPHnTVbb0vJUuWjGjdO3futDlz5ljnzp3jXUYnDLQfVbVOyL59+yx//vwRPS8AAACAtI2gHUIh+7XXXrOJEyfahg0brE+fPi6UqtrrH1s8YcIEFzp/++03V9EdN26cq+4q2Kn6OX78+KD1Tps2zVVvv/76a3v22WftmWeesZdffjnwuEL4V199ZTNnznTtyrfccotdc801LojKihUrXGDUcmvXrnVVWlV4k2vNmjVu+xs0aJBguBR/wFTr9Ztvvml//fWXOymh7T1y5Igbh55UOpmgMK+A/+KLL9rPP/9s9evXt3///TewzAsvvGA5c+Z0N53MWLBggatKR0L7XG3wN954Y7zLvPLKK+6EQ4kSJeJd5q233nLjtxML4wAAAAAg6eL8ZdU0TlVlhcqFCxda7dq1A/drDK8q1GplVsDV402aNHGPjRo1yvr3729btmwJtCd3797dtTcrQIpCqKreCu5ee/Ijjzziqqlqy1YVVz+rr6ruepo2beoqxyNGjHBVcgVfBXnPbbfd5p5DrdyRUqDcvXu3q7DrhIEq6+EoRN9www1u3f5x0/r+1ltvdScTdOJA1fW3337btZjHt0918+zfv99VpDU2WuPF/bTuiy66yE1c5oVavWbtO40N18mJP//80530yJo1a6Kv9dJLL3X7UCdBwvn999/d8+kESXxhXF0FGquuEycam460QUMKdFKnWbNmlilTpvO9OUBYHKeIBRyniAUcp4iUsoy6k5VR1MmcEMZo+2zevNkFan3I/I4dOxY0/ljjnD1FihRxYdML2d59qlz7XXXVVYGQLQryY8aMcRN7rV+/3n29+OKLg35GAdULo5oQTO3iflqHF+YjpVbxAwcO2PLly13YV9BUS3kojdX+7rvvgkK2KJgrEOtkgw6y999/31X0td7LLrssbIfA0KFDT7t/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qVLFXnvtNfvzzz/t/fffd8vs2bPHVbj13Hq8fPnyNmrUKBf8v/vuuzN6vQAAAABSP4J2GqGqbc+ePe3zzz+3jRs3uqCpm4JzpBXm5FaZE6JAW7x4cStXrpx16NDBtm3bdkbrmz17tl1xxRV2yy23WOHCha1atWo2efLkwOM///yzq0qrXdyTJ08eq1Wrln311Vfue52MqFChggvgBw8edJXtSZMmufXVqFHjjLYPAAAAQOpH0A5x6tQpGzlypKuEqvKrluFZs2a5x5YsWeKquPPnz3cBTo83btzYdu3a5dqUK1as6Cq9t99+uwukfgprCroKdaraDho0yFVXPUePHrV+/frZBRdc4EKxgp+eL7RVvFSpUpY9e3Zr27at7d27N+LXpe1t3769C9JlypRxY5jVLv3FF19EXGFObpU5PnqNek3z5s2zF1980YXg+vXr27///pvsdW7dutWtS1VovU/33Xef9erVy6ZNm+Ye91q/ixQpEvRz+t57TO/xwoULbc2aNZYrVy7LmjWrPfPMM247/S3oAAAAABBOxrD3pmEK2a+//robv6uwpgqwQmmhQoWCWqwnTJjgAm+7du3cLUuWLDZjxgw7cOCAC8Hjx4+3hx9+OPAzCnqdO3e2r7/+2k3M1bVrVxeau3Tp4h5XCNd44pkzZ7oK73vvvecqx+vXr3fbobHE+nltX5s2bVzoGzx4cLJfp0LksmXLbPjw4WErzAqXtWvXds+n7UwunUDQzbN//3739fjx40FVZZ2kqF69ul100UX2xhtv2N133x10ksL7Gd0SO1GiqvPQoUPd95deeqmtW7fOhW+dAIlvXfo5BWzdpxMgCuh6zzUBmk6ovPrqq9aqVSu3zzSJGlI379hI7HgDzieOU8QCjlPEAo5TRCopxwhB20eBcMSIEa6aqZApamlW+7RahxWOReFU451F4bd///62ZcsWt6zcfPPNLqD5g7bGDWtMtMKc2pIVoPW9grbapTWmWF8VckXVbYVp3a9tevbZZ13wfuihh9zjF198sQt9WiYpSpQoYbt373aBUycM7r333tMqzNo+tY0rrKrCrHHJquwmh4K6F3r9tH90oiKU2rM/+eSToIqz9pXo/pw5cyb4fJocTst8/PHHgfv0WnUCQfd5Vet33nkn8H7JDz/84LoYtMy3337rvuqEi8ag63bttde6tnS12990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W+OUNXGbR69d17HW6/zzzz9dm7VOBLRv397O1qXGFIj/+usv19796KOPun3vp6Dvrz7rUlyqmHu8irou56Xx5d4kbFqv9qnWrdejdvDu3bufldcBAAAAIO0gaCfDsGHDXIVV4481oZfap9VWrPG9SWkHD6UQffjwYdfSrPCq6q03uZpX3dUkaw8++KC7LJXGD2tc8fXXX+8e1791LWqF38cee8xdLktjkbW9kdA4c2/dGlOuAK9J3/yhVeOZFap12TDtA51oUNVc/46G0MuVjRo1yt0Somtt+2kCN/9l0cLR5bq0P5MisXUCAAAAgKSLIz3gHI9r0HXCVYH2JnEDUuJYLU22p/H6tJAhpeI4RSzgOEUs4DhFUrOMOprVzZwQrqMNAAAAAEAUEbTTEI291mRj4W7Tp08/35sHAAAAAKkCY7TTELXExHeRdV3XGwAAAABw5gjaaciZzIgOAAAAAIgMreMAAAAAAEQRQRsAAAAAgCgiaAMAAAAAEEUEbQAAAAAAooigDQAAAABAFBG0AQAAAACIIoI2AAAAAABRRNAGAAAAACCKCNoAAAAAAEQRQRsAAAAAgCgiaAMAAAAAEEUEbQAAAAAAooigDQAAAABAFBG0AQAAAACIIoI2AAAAAABRRNAGAAAAACCKCNoAAAAAAEQRQRspxqhRoyxdunT2wAMPBO7bsWOH3XHHHVa0aFHLkSOHVa9e3d55551E1/X8889bmTJlLGvWrFarVi37+uuvT1vmq6++ssaNG7v15s6d266++mo7fPhw4PG//vrLOnTo4B7Lmzevde7c2Q4cOBDFVwwAAAAgNSJonwMNGzYMCo/RMnXqVBcAU4OVK1fapEmTrEqVKkH333nnnbZp0yabPXu2rV+/3m688UZr166drVmzJt51vfnmm9a3b18bPHiwrV692qpWrWotWrSwXbt2BYXsa665xpo3b+5CuJ6/Z8+elj79//tIKGRv2LDBFixYYB999JF9/vnn1rVr17O0BwAAAACkFgTtNOLdd9+1Zs2aWaFChVyFtnbt2jZ//vygZRQkW7VqZcWLF3eV5ffffz/o8ePHj9vDDz9sl112masCazkF4T///POMtk1VYoXayZMnW758+YIeW7Zsmd1///1Ws2ZNK1eunA0cONCdXFi1alW863vmmWesS5cudvfdd1ulSpVs4sSJlj17dnv1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AEAsBG0frU6tluUHH3zQwqZajBXgFi9ebKuJq/J5thTe1ULdqVMnW2Vbi6Wp2ipqGde8aK0Irm0KdKqizp0719rUFWa7d+9uQXjEiBGuUaNGtvJ5YtvGdWks8aq0+lkBWicYRHOZtcibFih74IEHbG6y5ofrtf302Shot23b1sJqkKJXWhcdg25x8a/e7tF8em9OfVxno/RZ6paYYwEAAACAMyFoRxkyZIi1LqsVWYuD5ciRw+b5arXrxLSDR1OIVuVUC3+piq0w6w+CCq6aN9y7d2+bF61LgGle96233mr363td01pzpQcNGmTXnNalqXS8CeVvx1abuqrXOnmg62aL5k4rwOtEgwK+2ud1nP5F3UQt4zpx0K5du7P+PAAAAAAgpUoVilUOBP4hmjut63jv2rUrvNAbkBQXRdGaAFoAj7laSKoYp0gOGKdIDhinSGyWUdezOp7j838TcQEAAAAAQCAI2ilEuXLlbMXuWLdJkyZd6MMDAAAAgIsGc7RTCLW7qO0lFl3XGwAAAABwfhC0U4hzWREdAAAAABAcWscBAAAAAAgQQRsAAAAAgAARtAEAAAAACBBBGwAAAACAABG0AQAAAAAIEEEbAAAAAIAAEbQBAAAAAAgQQRsAAAAAgAARtAEAAAAACBBBGwAAAACAABG0AQAAAAAIEEEbAAAAAIAAEbQBAAAAAAgQQRsAAAAAgAARtAEAAAAACBBBGwAAAACAABG0AQAAAAAIEEE7iahTp47r2bNn4M87ceJElyNHDpccPPPMMy5VqlThz2HLli32c6zblClT4n2u9evXu9tvv91lz57dZc6c2V133XVu69at4fu3b9/uWrdu7fLnz2/3X3PNNe7DDz887Xk+++wzV6VKFZcxY0aXM2dO17hx43/gnQMAAABISQjaCFu0aJGrUaOGy507twXLMmXKuOeeey5in8cee+y00Kv9ztWKFSvcuHHjXIUKFcLbChcu7LZt2xZxe/zxx12WLFncLbfcEudz/fLLL65mzZp2XPPnz3erV692AwcOdJdcckl4nzZt2rgNGza4Tz75xK1Zs8bdcccdrlmzZu67774L76PgrTB+7733uu+//94tXrzY3XPPPef8XgEAAACkbGkv9AEg6VBlt1u3bhZ29b2Cd6dOnez7jh07hvcrV66c++KLL8I/p017bsPowIEDrmXLlm78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JdA87dq1s1tc1Cmg8B0fBXKdaNANAAAAABIqVShWSgH+wXkNuk74rl27wou4AUlxrpa6HtThQAsZkirGKZIDximSA8YpEptl1E2rbub4cB1tAAAAAAACRNC+iOh60lpsLNZt0qRJF/rwAAAAACBFYI72RUQtMXFdZF3X9QYAAAAAnDuC9kXkXFZEBwAAAAAkDK3jAAAAAAAEiKANAAAAAECACNoAAAAAAASIoA0AAAAAQIAI2gAAAAAABIigDQAAAABAgAjaAAAAAAAEiKANAAAAAECACNoAAAAAAASIoA0AAAAAQIAI2gAAAAAABIigDQAAAABAgAjaAAAAAAAEiKANAAAAAECACNoAAAAAAASIoA0AAAAAQIAI2gAAAAAABIigjSTjmWeecalSpXI9e/a0n7ds2WI/x7pNmTIlzud57LHHXJkyZVzmzJldzpw5Xb169dyyZcsi9nnqqadc9erVXaZMmVyOHDniPa7du3e7yy67zF537969Ab1bAAAAACkVQTuJqFOnTjhgBmnixIlnDJJJwYoVK9y4ceNchQoVwtsKFy7stm3bFnF7/PHHXZYsWdwtt9wS53OVKlXKvfTSS27NmjVu0aJFrlixYu6mm25yO3fuDO9z7Ngxd9ddd7kuXbqc8djat28fcVwAAAAAEB+CNsI++ugjd+ONN7q8efO6bNmyuWrVqrnPP//8tGpxdHVZ1eNzceDAAdeyZUs3fvx4q0B70qRJ4/Lnzx9xmzZtmmvWrJmF7bjcc889VsUuUaKEK1eunBs1apTbv3+/W716dXgfBfYHH3zQXXXVVfEe29ixY62K/dBDD53TewQAAABw8SBoI+yrr76yoD1jxgz37bffuuuvv97ddttt7rvvvovYT+HVX2VW1fhcdO3a1TVs2NDCcXx0TKtWrbIKc0Kpcv3qq6+67Nmzu4oVKybquH744Qf3xBNPuLfeesulTs1/KgAAAAAShvRwFk6dOuWGDh3qihcv7jJmzGgBburUqXbf/PnzrcqrSnClSpXs/htuuMHt2LHDzZw501155ZVWLVbV9dChQxHPe+LECdetWzcLhXny5HEDBw50oVAofP/Ro0etslqoUCGbf1ylShV7vehW8SJFitjc4yZNmtj84oR6/vnnXZ8+fdx1113nrrjiCvf000/b1//+978R+6VNmzaiyqxjPVuTJ092K1eu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hQqn3dehQwc7fu82bNiwOJ8nFArZMW/atMlNnz7dfffdd65o0aKuXr167uDBg7bPH3/8YbcRI0a4tWvX2gmLWbNmufbt24efR59Ro0aN3CeffOJ++ukn2+eLL744Y8gHAAAAgLQX+gBwfhw9etTlzZvXDRgwwD333HPx7rtlyxb30EMPuVq1ap12n4Ku38yZMy2g3nnnnWd9bAcOHHAtW7Z048ePd08++eRp96sqnT9//gQ9lyrXS5cutQBdrlw52zZ27Fh7/Hvvvefuu+8+V758effhhx+GH3P55Ze7p556yrVq1cqdOHHCpU2b1uXMmdN16dIlvI/C+v3333/OJxQAAAAApHxUtKOcOnXKDR061BUvXtzaiitWrOimTp1q982fP9+qt59//rmrVKmS3X/DDTe4HTt2WOC88sorXbZs2axyfOjQoYjnVYBT63H27Nldnjx53MCBA6366g/CCreFChVymTNndlWqVLHX81NVVW3OCp5NmjSx9uaEKlasmBs9erRr06aNHUNcTp48aaH38ccfdyVKlDjtfgVW/01V4+uvvz7mvgnVtWtX17BhQ6s6xzJp0iT7zBSQ+/fvf9pn66fPUS655JKI6rTavxctWhTn49Q2rt+dQnYsqoB/9NFHrnbt2ol4ZwAAAAAuRgTtKArZb731lnvllVfcunXr3IMPPmiVzgULFoT3eeyxx9xLL73kvv76a/frr7+6Zs2aueeff969++677rPPPnOzZ892L774YsTzvvnmmxbili9fboF31KhR7rXXXgvfrxC+ZMkSa9levXq1u+uuuyLmFi9btswqx9pv1apVFm5jVX/P1RNPPOEuvfTSiDbq+OZC6/0mZN+46P2uXLnSPvdYdNLinXfecfPmzbOQ/fbbb9vvIy5lypSxkxHa96+//nLHjh1zzz77rPvtt99Oq8Z7du3a5YYMGeI6dux42n0tWrSwExs6AaIg7v+dAQAAAEAstI5HVUOffvppm4tbrVo126ZKrSqhmj/sBTEF3Bo1atj3CpkKdb/88ku4qtu0aVMLhn379g0/txbTUsu2KuJahGvNmjX2s+Yfb9261U2YMMG+avEtUXVb84a1XcekcK7g3adPH7tfc60V9LVPUPQ+X3/9dQvyCaGTB1mzZnV33HFHvJ+pV2UWbzGx48eP2zzqHj16uBkzZrg0adLYNlX51VWg7+Xee++NCNFqf69fv7778ccfreU7lg8++MB+V7ly5bLnrVu3rn12em7vef3H06BBA+tGePTRR0+7X/PBH3nkETvhobZ7zW2PPomClMcbB9HjAUhKGKdIDhinSA4Yp0ioxIwRgrbPzz//bG3JN954Y8R2VUXVKu7xL9iVL18+q3j6W6e1TZVrv6pVq1rI9ijIjxw50lq1Fbr1VeHZTwE1d+7c9v369eutXdxPzxFU0P77779d69atbZ602rQT4o033rA2c3+bdjRVqtWGHk0nIlS5V9t95cqVw9sVshcuXOjGjBnjpkyZYkHZ78iRI+FKuP93Eqsyr8XP1LKvVvmHH37YlSxZ0kK95/Dhw9adoLZynTCZM2dOnM+n49Dno9Cttn6FeKR88Y0JIKlgnCI5YJwiOWCc4kzim8IajaAdtSiXqB1arcJ+CmOqWku6dOnC2xWe/T972xQYE/O6CnLffvvtacEyS5Ys7nzQe9MiaLfddlt4m/ce1PK+YcOGiAqywrC2vf/++/E+r6r9vXr1iqggq7qv1ndVptV276cKvyr+quhrTnY0VfFFxxlrhfJYVI3W+1N7v3cSRceheeE6KaKVxXWy5ExUvZeaNWvanHek7LOV+sdW4yX6v28gqWCcIjlgnCI5YJwioRJzqV+Ctk/ZsmUtUKuFO9aiV17QPhuaY+2nlbGvuOIKC9aqzKqirepurJW+Ra3NsZ4jKGrLVmXdT63SqnSrbV3h2E8t5tdee60tFhcffZ66RdMfMVWFoyvDOrGg9nB9Jvq8Ne9drd2q7KsCrjnz//73v+21/ceuyrlX8VclXM+hudp6T2pP1yW/9Dz+kK0zUlpoTZVt3USP0+9ElW/NQb/uuuvsmDRfX1VxTRnQ7w0XB41T/sFFUsc4RXLAOEVywDjFmSRmfBC0oyqWqqQqzKmaq8qlVqNevHixLYSlSzydLYV3VXY7depki39pnq9ax0Ut42rB1org2qaQuXPnTjd37lyr2ioUdu/e3UKerv2s6ztr5fPEto17c69VQdfz6+f06dPbCQa1f0dXkHPkyGFfo7crqCrMesf/T9Gxab68KtFqA1fY12XEdALAT5V1/Z48WvRMn7WCcoECBexz1SrvHn3+3kkLtZP7bd682arVWlFebfQaC2rh12trLnq/fv3+0fcMAAAAIPkjaEfR6tOqaqpCqsW6FDavueYam5ubmHbwaAp7qppqPrIqpqqy+le51qJnWmStd+/e7vfff7d50prXfeutt9r9+l7Bb/DgwW7QoEF2KSwFTh1vQvnnNKtNXdVinTxQy3hiaH60FhbTitxB81/STOHWv9p7XPyXSROdlNAtLnXq1DntMdHU2u61qQMAAABAYqQKnSlxAAFSNVyLk+mSWt5Cb0BSnKul6QOabkALGZIqximSA8YpkgPGKRKbZdRNq47n+HAdbQAAAAAAAkTQTiHKlStni3bFumnBLwAAAADA+cEc7RRC7S5xXUBdl7ACAAAAAJwfBO0U4lxWRAcAAAAABIfWcQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0AYAAAAAIEAEbQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0AYAAAAAIEAEbQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0EaS8cwzz7hUqVK5nj17hrfVqVPHtvlvnTt3PuNzrV+/3t1+++0ue/bsLnPmzO66665zW7dutfv27NnjHnjgAVe6dGmXMWNGV6RIEde9e3e3b9++iOeYO3euq169usuaNavLnz+/69u3rztx4sQ/8M4BAAAApCQE7fNAYdEfHoMyceJElyNHDpcSrFixwo0bN85VqFDhtPs6dOjgtm3bFr4NGzYs3uf65ZdfXM2aNV2ZMmXc/Pnz3erVq93AgQPdJZdcYvf/8ccfdhsxYoRbu3atfY6zZs1y7du3Dz/H999/7xo0aOBuvvlm991337n333/fffLJJ65fv37/wLsHAAAAkJIQtC8SH330kbvxxhtd3rx5XbZs2Vy1atXc559/HrHPyZMnLZAWL17cKr2XX365GzJkiAuFQuF99P2gQYNcgQIFbJ969eq5jRs3ntOxHThwwLVs2dKNHz/e5cyZ87T7M2XKZBVl76bjj8+jjz5qIVmBvFKlSvY+VN2+9NJL7f7y5cu7Dz/80N1222123w033OCeeuop99///jdcsVawVujXey1ZsqSrXbu2Pd+YMWPc33//fU7vFwAAAEDKRtC+SHz11VcWtGfMmOG+/fZbd/3111vQVLXW8+yzz7qxY8e6l156yVqv9bPC5YsvvhjeRz+/8MIL7pVXXnHLli2ztuz69eu7I0eOnPWxde3a1TVs2NBCeyyTJk1yefLksYDcv39/d+jQoTif69SpU+6zzz5zpUqVsuNSuK5SpYr7+OOP4z0GtY0rwKdNm9Z+Pnr0aLgC7tGJBb1PfX4AAAAAEBeCdoygNnTo0HBVt2LFim7q1Kl2n9qQNUdYlWBVSnW/qqE7duxwM2fOdFdeeaWFtXvuuee0MKhKabdu3WzOsEKjKsf+SrGC3UMPPeQKFSpk4VXhUK/npxZnzSdWhbdJkyZu9+7dCX5fzz//vOvTp4/NVb7iiivc008/bV9VxfV8/fXXrlGjRhZ6ixUr5po2bepuuukmt3z5crtfx6vnGTBggO2niu9bb71lbdhnCrJxmTx5slu5cqV95rHos3znnXfcvHnzLGS//fbbrlWrVnE+n34XqpBrvrfavmfPnm2f1R133OEWLFgQ8zG7du2yyn3Hjh3D2xTS9Xm89957Vun//fff3RNPPGH3qX0dAAAAAOLyf+U7hCnwKdipYqsgqkqwgp1arj2PPfaYVX0VeJs1a2a3DBkyuHfffddCnoKdqsBaPMvz5ptv2hxghdZvvvnGQp1Cs+Yfi0L4Dz/8YMGzYMGCbtq0aRYU16xZY8eh6rEer+Nr3LixzSkePHjwOZ1QUAt0rly5wtu08Nerr77qfvrpJ6sIa57yokWL3KhRo+z+zZs3u+3bt0dUnnXiQCcFlixZ4u6+++7TXkcnEHTz7N+/374eP37cbdq0yfXo0cOq7GnSpLFtCvM6Nn0v9957b/ixmnOt34NC8I8//mht37FeT1St12cq5cqVs/fx8ssv23v00/GozVwnSdRy7r2uKv4K61p4rXXr1vb7feSRR9zChQsjjg8pk/f75feMpIxxiuSAcYrkgHGKhErMGEkV8pdVL3IKaQqeX3zxhc1h9tx3331WoVY4VgDT/XXr1rX7FMZUadUCXCVKlLBtCmdbtmyxMOwthqZK67p166wiLlpUS4trKVxrNWw9Vl8Vsj0KtJUrV7bqsyq7am9WW7RHwVavsXfv3kS/V7WA69gVWL25ywqQCpO6T8FXlVzNXdb7E1V4a9SoYRVszdH26ESD3pfmNUfTSYnHH3/8tO06KaFFynQMqVP//8YKHYO3uviUKVPsOPzUuq33rZMM6iqINfh1f/Pmze24/Cc61A6v1/McPnzYjk8hWlX69OnTn/Z8+s/jr7/+si4D/Q61Wvnw4cPt5AcAAACAi8ehQ4fCuexM60ZR0fb5+eef7cPTXGa/Y8eORYQ6/8rY+fLls8q2F7K9bV67tadq1arhkC0K8iNHjrQwq6q1vqqKHB38c+fObd8rJKpS7qfn8MJ8YijkKvxOnz49HLLlgw8+sPnQul9V4FWrVtlq6Qr/bdu2dWdDIb1Xr14RFeTChQvbCQtVpv1hWFTh12W31EavOdnRFPa9inWsFcpF7fGiSrXnjTfesGkA3jYdh1rk9bvSCQ/9Ds9EoVzHrkp59AkApCw6YTNnzhz7W5AuXboLfThATIxTJAeMUyQHjFMklNedmxAEbR+1fYuqxpor7aeqp6rW4v8PUOE5+j9IbVNlNjGvq+CmRbaiA1yWLFlckNSargq9qsXRi489/PDDVmn3WsCvuuoq97///c/a1RW0teK3/PnnnxEVbf189dVXx3w9fW66RdNnpu4Bf+u6937VHq4TG/q8FfoVjnXCQRXwBx980P373/921157bURLuY7ROxGhueiqaKuTQIFeJyP0O9Wcd72uF7J1UkUnFlTZ1k302t7vQJVrte+r4q5V2/WzTkZEL5KGlEvjhX9wkdQxTpEcME6RHDBOcSaJGR8EbZ+yZctaKFQLty7nFM0L2mdDc6z9li5dau3HCnUKlapoqzW5Vq1aMR+vOcSxniMxtLBXu3btLGwraEZT8PS3cYuOzztpoAXiFLbnzp0bDtYKrTquLl26uKCplVtt+lqA7eDBg1ZNvvPOO63N22/Dhg3WvuFR4NYce4Xv7t27W4Vcl/PStbVFi695n6Uu3eWneehaCE60wJ1a59VZoGq4OgBuueWWwN8nAAAAgJSFoO2TNWtWa1lW1VThUsFMAW7x4sXWg1+0aNGzfm6Fd7VQd+rUyYKeFktT67ioZVzXkW7Tpo1tU/DeuXOnBVq1RysUKzBqfvSIESNsxW+tfJ6YtnFVhlWVHj16tC1epkXNRCuna0Ezrx1bwVKLtKl1XJf+0kJoCudepV6t5E8++aSdJFDw1urpai3XAm1B8K+0rmAd10rhfrGWGdAxe8cdTZXuhCxN8OWXX55xHwAAAACIRtCOoss8qX1Y1VCtip0jRw53zTXX2CJhiWkHj6YQrfZkLW6mKrFW2/ZfTmrChAkWYHv37m2XktIlwDSv+9Zbb7X79f348eNtEbBBgwZZ27cquzrehNBq4rrEmK5ZrZtH4VuXDROFfwXn+++/36rrCtA6MaDX86gtW9VlHbsWYdPJCAV+2qkBAAAA4P+w6jjOK7Waq4Kua1d7C70BSXFRFF12TusDMFcLSRXjFMkB4xTJAeMUic0yCVl1PHJCLgAAAAAAOCcE7RRCc6q1Ynesm1bWBgAAAACcH8zRTiHU7qK2l1h0rWgAAAAAwPlB0E4hzmVFdAAAAABAcGgdBwAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0AYAAAAAIEAEbQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0AYAAAAAIEAEbQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0AYAAAAAIEAEbQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAKUNsgnA84kFArZ17///tulS5fuQh8OENPx48fdoUOH3P79+xmnSLIYp0gOGKdIDhinSCiNEX+miQ9BG+fV7t277Wvx4sUv9KEAAAAAQKKpaJg9e/Z49yFo47zKlSuXfd26desZBydwIc9WFi5c2P36668uW7ZsF/pwgJgYp0gOGKdIDhinSChVshWyCxYseMZ9Cdo4r1Kn/r9lARSy+UOGpE5jlHGKpI5xiuSAcYrkgHGKhEhosZDF0AAAAAAACBBBGwAAAACAABG0cV5lyJDBDR482L4CSRXjFMkB4xTJAeMUyQHjFP+EVKGErE0OAAAAAAAShIo2AAAAAAABImgDAAAAABAggjYAAAAAAAEiaOO8GjNmjCtWrJi75JJLXJUqVdzy5csv9CEhhfjqq6/cbbfd5goWLOhSpUrlPv7444j7tRzFoEGDXIECBVzGjBldvXr13MaNGyP22bNnj2vZsqVdQzNHjhyuffv27sCBAxH7rF692tWqVcvGcOHChd2wYcNOO5YpU6a4MmXK2D5XXXWVmzFjxj/0rpGcDB061F133XUua9as7tJLL3WNGzd2GzZsiNjnyJEjrmvXri537twuS5Ys7s4773R//vlnxD5bt251DRs2dJkyZbLnefjhh92JEyci9pk/f7675pprbGGfkiVLuokTJ552PPw9RlzGjh3rKlSoEL6mcLVq1dzMmTPD9zNOkdQ888wz9m9/z549w9sYp7jgtBgacD5Mnjw5lD59+tAbb7wRWrduXahDhw6hHDlyhP78888LfWhIAWbMmBF69NFHQx999JEWeAxNmzYt4v5nnnkmlD179tDHH38c+v7770O33357qHjx4qHDhw+H97n55ptDFStWDC1dujS0cOHCUMmSJUMtWrQI379v375Qvnz5Qi1btgytXbs29N5774UyZswYGjduXHifxYsXh9KkSRMaNmxY6IcffggNGDAglC5dutCaNWvO0yeBpKp+/fqhCRMm2NhZtWpVqEGDBqEiRYqEDhw4EN6nc+fOocKFC4fmzp0b+uabb0JVq1YNVa9ePXz/iRMnQuXLlw/Vq1cv9N1339m4z5MnT6h///7hfTZt2hTKlClTqFevXjYGX3zxRRuTs2bNCu/D32PE55NPPgl99tlnoZ9++im0YcOG0COPPGJ/xzR2hXGKpGT58uWhYsWKhSpUqBDq0aNHeDvjFBcaQRvnTeXKlUNdu3YN/3zy5MlQwYIFQ0OHDr2gx4WUJzponzp1KpQ/f/7Q8OHDw9v27t0bypAhg4Vl0T+getyKFSvC+8ycOTOUKlWq0O+//24/v/zyy6GcOXOGjh49Gt6nb9++odKlS4d/btasWahhw4YRx1OlSpVQp06d/qF3i+Rqx44dNuYWLFgQHpMKM1OmTAnvs379ettnyZIl9rP+j2Dq1KlD27dvD+8zduzYULZs2cLjsk+fPqFy5cpFvFbz5s0t6Hv4e4zE0t++1157jXGKJOXvv/8OXXHFFaE5c+aEateuHQ7ajFMkBbSO47w4duyY+/bbb61d15M6dWr7ecmSJRf02JDybd682W3fvj1i/GXPnt3au7zxp69qF//Xv/4V3kf7a5wuW7YsvM+///1vlz59+vA+9evXt/bfv/76K7yP/3W8fRjniLZv3z77mitXLvuqv5HHjx+PGD+aglCkSJGIcarpCPny5YsYX/v373fr1q1L0Bjk7zES4+TJk27y5Mnu4MGD1kLOOEVSotZwtX5HjyXGKZKCtBf6AHBx2LVrl/1j7f9jJvr5xx9/vGDHhYuDQrbEGn/effqq+Vl+adOmtRDk36d48eKnPYd3X86cOe1rfK8DyKlTp2wuYY0aNVz58uVtm8aITuLohE984zTW+PLui28f/Z/Hw4cP20kh/h7jTNasWWPBWvNcNb912rRprmzZsm7VqlWMUyQJOgG0cuVKt2LFitPu4+8pkgKCNgAAF6AKs3btWrdo0aILfShATKVLl7ZQrc6LqVOnurZt27oFCxZc6MMCzK+//up69Ojh5syZYwuQAUkRreM4L/LkyePSpElz2mqP+jl//vwX7LhwcfDGWHzjT1937NgRcb9WHtVK5P59Yj2H/zXi2odxDk+3bt3cp59+6ubNm+cuu+yy8HaNEbUh7t27N95xerZjUKtHa8V9/h4jIVQN1ArL1157ra2YX7FiRTd69GjGKZIEtWvr32ytBq7uM910IuiFF16w71VRZpziQiNo47z9g61/rOfOnRvROqmf1ZoG/JPU7q1/8PzjT21fmnvtjT991T/I+sfb8+WXX9o41Vxubx9dRkzzvjw6m67Kj9rGvX38r+PtwziH1ulTyFYLrsZW9DQE/Y1Mly5dxPjR/H9dfsY/TtXS6z8ppPGl/9Ontt6EjEH+HuNsaIwcPXqUcYokoW7dujbG1HXh3bTGii7R6X3POMUFd6FXY8PFQ5c/0CrPEydOtBWeO3bsaJc/8K/2CJzLyqO6PIdu+tM2atQo+/5///tf+PJeGm/Tp08PrV69OtSoUaOYl/eqVKlSaNmyZaFFixbZSqb+y3tpFVNd3qt169Z2mRuNaV32I/ryXmnTpg2NGDHCVjgdPHgwl/eC6dKli11ibv78+aFt27aFb4cOHYq4HI0u+fXll1/a5WiqVatmt+jL0dx00012iTBdYiZv3rwxL0fz8MMP2xgcM2ZMzMvR8PcYcenXr5+thr9582b7e6mfdQWG2bNn2/2MUyRF/lXHhXGKC42gjfNK1x/UHz1db1CXQ9D1ioEgzJs3zwJ29K1t27bhS3wNHDjQgrL+Qaxbt65dH9Zv9+7dFqyzZMlil/e49957LcD76RrcNWvWtOcoVKiQBfhoH3zwQahUqVI2znVZEF2PFog1PnXTtbU9OvFz//3326WU9H/umjRpYmHcb8uWLaFbbrnFruGua7727t07dPz48dP+e7j66qttDJYoUSLiNTz8PUZc2rVrFypatKiNDQUP/b30QrYwTpEcgjbjFBdaKv3Pha6qAwAAAACQUjBHGwAAAACAABG0AQAAAAAIEEEbAAAAAIAAEbQBAAAAAAgQQRsAAAAAgAARtAEAAAAACBBBGwAAAACAABG0AQAAAAAIEEEbAAAkeXXq1HE9e/a80IcBAECCELQBAEjm/vOf/7hUqVKddvv5558Def6JEye6HDlyuAvpo48+ckOGDHFJ1fz58+0z37t374U+FABAEpD2Qh8AAAA4dzfffLObMGFCxLa8efO6pOb48eMuXbp0iX5crly5XFKl9wQAgB8VbQAAUoAMGTK4/PnzR9zSpElj902fPt1dc8017pJLLnElSpRwjz/+uDtx4kT4saNGjXJXXXWVy5w5sytcuLC7//773YEDB8KV2nvvvdft27cvXCl/7LHH7D59//HHH0cchyrfqoDLli1bbJ/333/f1a5d215/0qRJdt9rr73mrrzySttWpkwZ9/LLLyeqdbxYsWLuySefdG3atHFZsmRxRYsWdZ988onbuXOna9SokW2rUKGC++abb06rzOuYr7jiCnvt+vXru19//TXitcaOHesuv/xylz59ele6dGn39ttvR9yv96R9br/9dvvMOnTo4K6//nq7L2fOnHa/ugxk1qxZrmbNmva6uXPndrfeeqv75Zdfws/lfUaq2Os5MmXK5CpWrOiWLFkS8ZqLFy+2z0D36zV03H/99Zfdd+rUKTd06FBXvHhxlzFjRnv81KlT4/08AQD/LII2AAAp2MKFCy2M9ujRw/3www9u3LhxFjifeuqp8D6pU6d2L7zwglu3bp1788033Zdffun69Olj91WvXt09//zzLlu2bG7btm12e+ihhxJ1DP369bPXX79+vQVEhe1BgwbZMWjb008/7QYOHGivnRjPPfecq1Gjhvvuu+9cw4YNXevWre29tmrVyq1cudLCsn4OhULhxxw6dMhe96233rLwqlbvu+++O3z/tGnT7Fh79+7t1q5d6zp16mQnGubNmxfx2jrZ0KRJE7dmzRo7cfHhhx/a9g0bNthnNHr0aPv54MGDrlevXhb4586da5+1Hqdw7Pfoo4/a57pq1SpXqlQp16JFi/DJEG2rW7euK1u2rAXwRYsWudtuu82dPHnS7lfI1vt55ZVX7Hf44IMP2mewYMGCRH2eAIAAhQAAQLLWtm3bUJo0aUKZM2cO35o2bWr31a1bN/T0009H7P/222+HChQoEOfzTZkyJZQ7d+7wzxMmTAhlz579tP30fyOmTZsWsU37aX/ZvHmz7fP8889H7HP55ZeH3n333YhtQ4YMCVWrVi3OY6pdu3aoR48e4Z+LFi0aatWqVfjnbdu22WsNHDgwvG3JkiW2Tfd570M/L126NLzP+vXrbduyZcvs5+rVq4c6dOgQ8dp33XVXqEGDBhHvu2fPnhH7zJs3z7b/9ddfofjs3LnT9luzZk3EZ/Taa6+F91m3bp1t07FJixYtQjVq1Ij5fEeOHAllypQp9PXXX0dsb9++vT0OAHBhMEcbAIAUQG3Hamf2qKVZvv/+e6vc+ivYqoQeOXLEqrtqRf7iiy+sKvrjjz+6/fv3WyXVf/+5+te//hX+XhVetU63b9/eWq49es3s2bMn6nnVGu7Jly+ffVULfPS2HTt2WCu9pE2b1l133XXhfdS2rrZuVdYrV65sXzt27BjxOqqaexXqWO8pPhs3brTq/bJly9yuXbvCleytW7e68uXLx3wvBQoUCB+3jk8V7bvuuivm82vBO/2ebrzxxojtx44dc5UqVUrQMQIAgkfQBgAgBVCwLlmy5GnbNddarc133HHHafdpjrLmCGvecJcuXSyMa9ExtSYrCCusxRe0NbfY35Yd18JgXuj3jkfGjx/vqlSpErGfN6c8ofyLqulY4toW3aYdBP97io9avDV/XO+3YMGCdiwK2Pps/eI7bs27jov3eX722WeuUKFCp83bBwBcGARtAABSMC2CpnnDsUK4fPvttxboRo4cafOH5YMPPojYR4uCefOBo1c113xkf/VW1dX4qMqswLlp0ybXsmVLd76pcq750qpeiz4bzdPWwmyir+oAaNu2bfgx+lnzo+Ojz0j8n9Pu3bvt+RWya9WqZdt0EiOxVO3W/G6dMImm41KgVoVcC84BAJIGgjYAACmY2pZVsS5SpIhr2rSphWm1k2uhL63arQCuKvSLL75o1VeFSi2q5acVvlU5VdjTitaqcut2ww03uJdeeslVq1bNAmbfvn0TdOkuBcbu3btbq7guS3b06FELv1pFWwuH/ZN0fA888IAt/qY28m7durmqVauGg/fDDz/smjVrZm3X9erVc//9739tRXC118dHVWtVoj/99FPXoEEDq0JrdXCtNP7qq69aO7jCsBaGS6z+/ftbS7xWg+/cubOFei3OpnbyPHny2CJqWgBNJ0y0wrlWiNfvUQvY+U8YAADOH1YdBwAgBdMq3wp/s2fPtrnJCpVarVvBUBScdXmvZ5991lqatSK45mv7aeVxBbzmzZtbFXvYsGG2XVVwXQ5M1dp77rnHAl9C5nTfd999dnkvXfdbAVKVWK2ErstT/dN0fDohoOPV3GtdBkyXH/M0btzY5mOPGDHClStXzlZp13Hq0lrxUdu2TiAoSKtqrwCvkxqTJ0+2rgF9tgrDw4cPT/QxaxVy/f50gkQnBHRiQ5ds04kCGTJkiK3art+bKvI6eaFW8vPxeQIAYkulFdHiuA8AACDFUJjXtbjVKg4AwD+JijYAAAAAAAEiaAMAAAAAECBaxwEAAAAACBAVbQAAAAAAAkTQBgAAAAAgQARtAAAAAAACRNAGAAAAACBABG0AAAAAAAJE0AYAAAAAIEAEbQAAAAAAAkTQBgAAAAAgQARtAAAAAABccP4fGo5Xbn8RgWIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "if 'df_model_data' in locals() and not df_model_data.empty:\n", " print(\"\\n--- Training ENRICHED LGBM 'Success Predictor' Model ---\")\n", "\n", " # --- THIS IS THE CHANGE ---\n", " # Get the list of embedding column names (assumes 'all-MiniLM-L6-v2' which has 384 dimensions)\n", " embedding_cols = [f'embed_{i}' for i in range(384)]\n", "\n", " # Add the new embedding columns to the list of features\n", " base_features = ['prior_response_time', 'prior_is_correct', 'skill_id_encoded', 'skill_attempts', 'skill_correct_rate', 'question_length']\n", " features = base_features + embedding_cols\n", " # --- END OF CHANGE ---\n", "\n", " target = 'is_correct'\n", "\n", " student_ids = df_model_data['student_id'].unique()\n", " train_student_ids, val_student_ids = train_test_split(student_ids, test_size=0.2, random_state=42)\n", " train_df, val_df = df_model_data[df_model_data['student_id'].isin(train_student_ids)], df_model_data[df_model_data['student_id'].isin(val_student_ids)]\n", " X_train, y_train = train_df[features], train_df[target]\n", " X_val, y_val = val_df[features], val_df[target]\n", "\n", " print(f\"Training on {len(X_train):,} interactions with {len(features)} features.\")\n", "\n", " lgbm_predictor = lgb.LGBMClassifier(objective='binary', metric='auc', random_state=42)\n", " lgbm_predictor.fit(X_train, y_train, eval_set=[(X_val, y_val)], callbacks=[lgb.early_stopping(10, verbose=False)])\n", "\n", " auc = roc_auc_score(y_val, lgbm_predictor.predict_proba(X_val)[:, 1])\n", " print(f\"\\nEnriched LGBM Model AUC on validation set: {auc:.4f}\")\n", "\n", " lgbm_model_path = os.path.join(MODELS_DIR, 'lgbm_psych_predictor_enriched.joblib')\n", " joblib.dump(lgbm_predictor, lgbm_model_path)\n", " print(f\"Enriched LGBM 'Tactician' model saved to: {lgbm_model_path}\")\n", " \n", " print(\"\\n--- Feature Importance for Enriched Q&A Tactician ---\")\n", " # Note: Plotting importance with 390 features can be messy. Let's show the top 20.\n", " lgb.plot_importance(lgbm_predictor, figsize=(10, 8), max_num_features=20, importance_type='gain', title='Top 20 Feature Importances for Q&A Success Predictor')\n", " plt.tight_layout()\n", " plt.show()\n", "else:\n", " print(\"Modeling data not available. Skipping LGBM training.\")\n", " lgbm_predictor = None" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "vscode": { "languageId": "plaintext" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- Running Showcase Pre-Flight Checks ---\n", "✅ SUCCESS: All pre-flight checks passed. Starting Final Showcase Simulation...\n", "\n", "\n", "--- SCENARIO 1: Confident Student ---\n", "\n", "LGBM TACTICAL Check: Immediate success probability is 70.1%\n", " -> Tactical Decision: Student is likely to succeed. No intervention needed.\n", "BKT STRATEGIC Check: No BKT history or model available for student on 'BoltMonkey/psychology-question-answer'.\n", "-------------------------\n", "QUESTION: How does Freud's psychoanalytic theory explain human behaviour?...\n", "FINAL ACTION: Encouragement -> 'You've got this! Keep up the great work.'\n", "-------------------------\n", "\n", "\n", "--- SCENARIO 2: Struggling Student ---\n", "\n", "LGBM TACTICAL Check: Immediate success probability is 25.6%\n", " -> Tactical Decision: High struggle detected. Intervene with a direct hint.\n", "BKT STRATEGIC Check: Long-term mastery of 'BoltMonkey/psychology-question-answer' is 2.4%\n", "-------------------------\n", "QUESTION: How does Freud's psychoanalytic theory explain human behaviour?...\n", "FINAL ACTION: Proactive Hint -> Freud believed that human behaviour is driven by unconscious desires and conflicts that originate in childhood experiences....\n", "-------------------------\n" ] } ], "source": [ "# --- Showcase Pre-Flight Checks ---\n", "print(\"\\n--- Running Showcase Pre-Flight Checks ---\")\n", "showcase_ready = True\n", "\n", "# Check 1: Is the LGBM Tactician model trained?\n", "if 'lgbm_predictor' not in locals() or lgbm_predictor is None:\n", " print(\"❌ ERROR: The LGBM 'Tactician' model ('lgbm_predictor') was not trained. Cannot run showcase.\")\n", " showcase_ready = False\n", "\n", "# Check 2: Are the BKT Strategist models trained?\n", "if 'bkt_models' not in locals() or not bkt_models:\n", " print(\"❌ ERROR: The BKT 'Strategist' models ('bkt_models') were not trained. Showcase will run without strategic insights.\")\n", " # We can proceed without BKT, but we'll disable the check.\n", " # Set bkt_models to an empty dict to prevent errors later.\n", " bkt_models = {}\n", "\n", "# Check 3: Do we have the source dataframe for question lookups?\n", "if 'df_psych' not in locals() or df_psych.empty:\n", " print(\"❌ ERROR: The main psychology dataframe ('df_psych') is not available. Cannot look up question text.\")\n", " showcase_ready = False\n", "\n", "# --- Run Showcase if All Checks Pass ---\n", "if showcase_ready:\n", " print(\"✅ SUCCESS: All pre-flight checks passed. Starting Final Showcase Simulation...\")\n", "\n", " # Get the list of embedding column names\n", " embedding_cols = [f'embed_{i}' for i in range(384)]\n", "\n", " def run_psychology_tutor(student_state_features, student_bkt_data, skill_for_bkt_check):\n", " assert len(student_state_features.columns) == 390, f\"Showcase input has {len(student_state_features.columns)} features, but model expects 390.\"\n", " \n", " prob_success = lgbm_predictor.predict_proba(student_state_features)[:, 1][0]\n", " print(f\"\\nLGBM TACTICAL Check: Immediate success probability is {prob_success:.1%}\")\n", " \n", " hint_level = -1\n", " if prob_success < 0.45:\n", " print(\" -> Tactical Decision: High struggle detected. Intervene with a direct hint.\")\n", " hint_level = 1\n", " elif prob_success < 0.65:\n", " print(\" -> Tactical Decision: Mild struggle detected. Offer a hint passively.\")\n", " hint_level = 0\n", " else:\n", " print(\" -> Tactical Decision: Student is likely to succeed. No intervention needed.\")\n", "\n", " # Check if BKT models exist and if the specific skill has a model\n", " if bkt_models and skill_for_bkt_check in bkt_models and student_bkt_data is not None and not student_bkt_data.empty:\n", " bkt_model_for_skill = bkt_models[skill_for_bkt_check]\n", " mastery_prob = bkt_model_for_skill.predict(data=student_bkt_data)['state_predictions'].iloc[-1]\n", " print(f\"BKT STRATEGIC Check: Long-term mastery of '{skill_for_bkt_check}' is {mastery_prob:.1%}\")\n", " else:\n", " print(f\"BKT STRATEGIC Check: No BKT history or model available for student on '{skill_for_bkt_check}'.\")\n", "\n", " question_index = int(student_state_features.index[0])\n", " question = df_psych.loc[question_index, 'question']\n", " answer_as_hint = df_psych.loc[question_index, 'answer']\n", " \n", " print(\"-\" * 25)\n", " print(f\"QUESTION: {question[:150]}...\")\n", " if hint_level == 1: print(f\"FINAL ACTION: Proactive Hint -> {answer_as_hint[:150]}...\")\n", " elif hint_level == 0: print(\"FINAL ACTION: Passive Offer -> 'Looks a bit tricky. Let me know if you need a hint!'\")\n", " else: print(\"FINAL ACTION: Encouragement -> 'You've got this! Keep up the great work.'\")\n", " print(\"-\" * 25)\n", "\n", " # --- SCENARIO 1: Confident Student ---\n", " print(\"\\n\\n--- SCENARIO 1: Confident Student ---\")\n", " question_index_1 = df_psych.index[0]\n", " skill_for_scenario_1 = df_psych.loc[question_index_1, 'source']\n", " \n", " base_confident_features = pd.DataFrame({'prior_response_time': [20.0], 'prior_is_correct': [1.0], 'skill_id_encoded': [skill_encoder.transform([skill_for_scenario_1])[0]], 'skill_attempts': [10], 'skill_correct_rate': [0.9], 'question_length': [len(df_psych.loc[question_index_1, 'question'])]})\n", " question_embeddings_1 = df_psych.loc[[question_index_1], embedding_cols].reset_index(drop=True)\n", " confident_features = pd.concat([base_confident_features, question_embeddings_1], axis=1)\n", " confident_features.index = [question_index_1]\n", " \n", " run_psychology_tutor(confident_features, None, skill_for_scenario_1)\n", "\n", " # --- SCENARIO 2: Struggling Student ---\n", " print(\"\\n\\n--- SCENARIO 2: Struggling Student ---\")\n", " \n", " # Use the first skill for which we trained a BKT model, if any exist\n", " if bkt_models:\n", " SKILL_TO_DEMO_BKT = list(bkt_models.keys())[0]\n", " \n", " question_index_2 = df_psych[df_psych['source'] == SKILL_TO_DEMO_BKT].index[0]\n", " base_struggling_features = pd.DataFrame({'prior_response_time': [95.0], 'prior_is_correct': [0.0], 'skill_id_encoded': [skill_encoder.transform([SKILL_TO_DEMO_BKT])[0]], 'skill_attempts': [5], 'skill_correct_rate': [0.2], 'question_length': [len(df_psych.loc[question_index_2, 'question'])]})\n", " question_embeddings_2 = df_psych.loc[[question_index_2], embedding_cols].reset_index(drop=True)\n", " struggling_features = pd.concat([base_struggling_features, question_embeddings_2], axis=1)\n", " struggling_features.index = [question_index_2]\n", " \n", " student_bkt_history = val_df[val_df['source'] == SKILL_TO_DEMO_BKT].rename(columns={'student_id': 'user_id', 'source': 'skill_name', 'is_correct': 'correct'})\n", " \n", " if not student_bkt_history.empty:\n", " run_psychology_tutor(struggling_features, student_bkt_history, SKILL_TO_DEMO_BKT)\n", " else:\n", " print(f\"Could not find a student with history for '{SKILL_TO_DEMO_BKT}' in the validation set to run showcase.\")\n", " else:\n", " print(\"\\nSkipping BKT part of Scenario 2 because no BKT models were trained.\")\n", "\n", "else:\n", " print(\"\\nShowcase aborted due to failed pre-flight checks. Please review error messages above.\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.11.9" } }, "nbformat": 4, "nbformat_minor": 4 }