{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import pandas as pd\n", "\n", "import sys\n", "from datetime import datetime\n", "sys.path.append('../../Scripts')\n", "\n", "from preprocess_daily import DailyPreprocessor\n", "\n", "from generate_signals import SignalGenerator\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 단위테스트" ] }, { "attachments": { "image.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABEsAAAKiCAYAAAAuQ1ILAAAgAElEQVR4Aey9a9AlxZ3mRzg21v6wMfYXh/1xw2GHPbY/zDo8nt2YWFveHY1XUliLPYLZcc/GIu0IzyDNCGlAEiAkdEMCLC7aFgIGCRhugxoJkIQQIC4N/TZ9pbu5tOgBARIgaDHADJrRiGEV5fhV7/N2dr11TtU5J7Mqq+o5EfVmVV7+mfXPJ/+Z+VRmvscVS/ze9alfLXzlpYMlqtFJrAFrwBqwBqwBa8AasAasAWvAGrAGrAFroEYDx9X4NXqZKMmLKKE+/LMGrAFrwBqwBqwBa8AasAasAWvAGrAGrIE4GjBZMpJVMnHgYCnWgDVgDVgD1oA1YA1YA9aANWANWAPWgDWwElnymev/qPja1iuK067YlGxbzieu+f1ksqsrZP7N+f+sOPMr756bH+X5nXN/fW6cqtwung1la8AasAasAWvAGrAGrAFrwBqwBqwBa8AaiKOBpckSCJK/e/ON4pZtVxcpCQ1eswuygTx4j5+89uO5+VGeP/jiO+fG6aq8YT5x4GAp1oA1YA1YA9aANWANWAPWgDVgDVgD1oA1sDRZctWdFxb7ntq+EGnASpTr7tm8UBqqKCQFFrlfND+TJW4Q1oA1YA1YA9aANWANWAPWgDVgDVgD1oA1sDRZwvab+/Z/ayEiY/Ntn1w4DVW0CEESxl00vyGTJU++fKDwZR0YA8aAMWAMGAPGgDFgDBgDxoAxYAwYA6thAB5iKbLksWf3lNtVXvvpXxTcs4IDkoKzPL6944bSD39Wkeh8j22P3Vk8//IzRVMaCI6Q8KCQv3fhvyhJFmSy7afNNphZ+VFWVsQg6849Xz/mvBWRJWwx2vnE/WUcCCHOMlGZKI/yn/e+xA/zIk/kS06dS76Uuy5/8kIGYWFadMO7PP3K4yZLTBgZA8aAMWAMGAPGgDFgDBgDxoAxYAwYAytiYGmyhEk/JIIIACbsTOAhGA49/2hJCpx/02nlPX6EcXAqREc1DfGR9YFLTygu+vpZJZlyxe2fWycEKCRxkAf5AJmAjJAwqLuvyw+igR/yITwgcyBwlJ734hwWyAfSUybKRv6KQ3qRJfPelzjIYruS8uJZaSUvdJvyJz/KE6ZB/jMvHnJjWLExmHldjXm1/qw/Y8AYMAaMAWPAGDAGjAFjwBgYCwaY9y+1soTJenUbjoiIkAyAbOCHS5rqthjID1aaaPUJcZj8Q6qIECA9RImekc9PBI3869xqfpSxembKX//t6+urNSAr+IWrNygbZaSs5MGPMjS9r4iP8N3wC1epVMvclH+dTIgSyJ+xgNLvYQNrDBgDxoAxYAwYA8aAMWAMGAPGgDHQJwaY90cjS5iwQypAooQXftpaUyUvIEW08qRKHOiZQlYJBvwgDhRnllvNj3iQHGy/YfUIF6s9JAsX8qQqjzKKZBFZ0vS+kCSsSOH9yQ/CJyROqnnw3CZ/kSN6F8qP3D6B5LxtyIwBY8AYMAaMAWPAGDAGjAFjwBgwBsaCgahkCWQC/3Y3JEp0r5UaVfICEoFtNXXEgfwopO7lLkuWsLUGMoRyQUxwQT7gIhsXckP5yIUsIQ3P/FhZ0uZ9ic+7ExfihC0/WmUj2aHbJn9W3mhbEOfDoENkjAWUfg8bWGPAGDAGjAFjwBgwBowBY8AYMAaMgT4xwLw/2soSzhuBLAkn/6x4gGTQ1pwqWQKJEJ4ZQlq2uyBLciik7uXiJ4JDfnVuNb86coYySxYuv+oWH8qILPLgx/s0vS+kSJUY4awVCI66suLXJn90ymoSSBiIHRFRfQLJeduQGQPGgDFgDBgDxoAxYAwYA8aAMWAMjAUDzPujkSVM4pm8sz1FZADbbPAjDD8IBq2K4BlSgom/ziRhu01ITBCHn+TJxU8Eh/zq3Gp+lI2tN4rLcyhLZEV4iCokCWXUViDiQ5Y0vS8rQHgXvbvi46/8dYisntvkT1xIH1bEhLocCyj9HjawxoAxYAwYA8aAMWAMGAPGgDFgDBgDfWKAeX80soRJPKsc2OYCSQBJAjGhlQ+Eixxhkq+VGhAEpGHyDynBthwRDKThhxte+LUhS6r5IZd8KBtlpHw8i6xBJitNIEsUh7LpcFeVRytl5r0vebF9R3qgzMgN30156d3a5E9c8uUnHeLXJ5Cctw2ZMWAMGAPGgDFgDBgDxoAxYAwYA8bAWDDAfHtpskQT/DqXybxWYlTD8YcUqIaTJiQSqumWfa7LD7KjutWmKp90lKnqX/c8730J433r3q1uZYm2Ms3LX2evhDLHAkq/hw2sMWAMGAPGgDFgDBgDxoAxYAwYA8ZAnxhIRpbUEQqx/SA7WBky64qdXxfytLKkKS9WqFTPPukTSM7bhswYMAaMAWPAGDAGjAFjwBgwBowBY2AsGBg0WcKqCsiFWVcT4ZBjeBuyhBUnOuA1fIexgNLvYQNrDBgDxoAxYAwYA8aAMWAMGAPGgDHQJwaWJktIWP31+SLO2w3JGDAGjAFjwBgwBowBY8AYMAaMAWPAGDAGYmAAvmOpM0uqRAnPMQpkGQa2MWAMGAPGgDFgDBgDxoAxYAwYA8aAMWAM9IkBkyUvG4B9AtB5G3/GgDFgDBgDxoAxYAwYA8aAMWAMGAO5YcBkickSrwgyBowBY8AYMAaMAWPAGDAGjAFjwBgwBoyBAAMmSwJl5MZkuTxmV40BY8AYMAaMAWPAGDAGjAFjwBgwBoyB7jFgssRkidlDY8AYMAaMAWPAGDAGjAFjwBgwBowBY8AYCDCQBVny3/+Pv1wcd9xxvqwDY8AYMAaMAWPAGDAGjAFjwBgwBowBYyAhBph/hytV/ujSdxXv+tSvTvpCB6FOuM+CLIEoOfzyq76sA2PAGDAGjAFjwBgwBowBY8AYMAaMAWMgIQaYf4fEAETJ1Ofj6CDUicmShACcOtj8/ib/jAFjwBgwBowBY8AYMAaMAWPAGMgPAyZLNtaJyRKTI5NnDG2sNxoG68Q6MQaMAWPAGDAGjAFjwBgwBqaDAZMlG+vaZInJEpMlxoAxYAwYA8aAMWAMGAPGgDFgDBgDE8aAyRKTJTYAEzYAZsY3GgDrxDoxBowBY8AYMAaMAWPAGDAGjAGTJRsx4JUlJg9MIBkDxoAxYAwYA8aAMWAMGAPGgDFgDEwYAyZLTJbYAEzYAJgx32gArBPrxBgwBowBY8AYMAaMAWPAGDAGTJZsxIBXlpg8MIFkDBgDxoAxYAwYA8aAMWAMGAPGgDEwYQyYLDFZYgMwYQNgxnyjAbBOrBNjwBi4acvNBVcVCyeccGLx2MEnjvG//Iori1Pe9/5jrmq6umfkb/7Sl8uL+21rO46RS5pv337Hehzi8lwny37GrDFgDBgDxoAxEB8DJks26tQrS0weeDBqDBgDxoAxMGEMQEycf8EXNmCgjixZdnAKwXLOOZ9aJ0OQfeqpHzyGjCH89A9/ZD0Oad578snF8z8+vKFsy5bD6TYOBK0T68QYMAaMAWMADJgs2YgDkyUTHiDbMG5sENaJdWIMGANTw8CZZ32sJCWq7x2SJXUrSqorTA49+fRMUoO4993/wDHhEDSQIcoXsqS6wmXTpk3FnXffsx5Hce26nRoDxoAxYAwYA3Ex0BdZwkpSxhA7d+9t1d+3jRcDHyZLTJa0AmUMsFlGXINmfVqfxoAxsCoGWLVx/PHHF29961s3DFJCskT5MJi56upr1ld/VAkQxau6dWQJcSBDJKOOLDnppHdvKFdVtp/dDowBY8AYMAaMgdUx0AdZwgeRiy/5YkmWVD+YzKrTtvFmpV/E32SJyRKTJcaAMWAMGAMTxQAEBdd1199YVMmR6vMtt36zeMc73lGwygSCg2e20kBoNG2VmUWWkDfkCwMX7hkwIZvrs+d+rvRbZFDjuKsPlq1D69AYMAaMgWliYBWyhDPOHt7/6DHjSfyqZ58xXghXhkB86KNJ6F+XVrgM45G2mkdd2mq+ktXkmiyZ6AC5CRgOn6aRdL273o2BaWCAgQREB5eIDgYskCHa9lIlS9gyU/c1h5UpTYexziJLdOgruIMs4cwStucQHxKmLj9jdBoYdT27no0BY8AY6BYDy5IlfPSg7+YjBx9fqDc+rOCnCz/6dp75MEKfz1iEfl/3hCstfsRlLFLFgeIRh3EEYxmNXdrkW5U379lkicmSDQCcBxiHdWu0rG/r2xgwBlJggAGKVnSE8tlmI/KkSpYwuIHA0H+yIS6DEggW5IVyqvcMbPTlKAxjoKOBFfdVcqTOL0zve7cPY8AYMAaMAWMgDgaWJUtEXlAP9OOMIyBBVC/cM2YIP9AonPgaH0gO8ZQ2vJef4iGDVa7IJmyRfCWryTVZYrJkHYxNYHF4HENkPVqPxoAxkAsGWMpaJShUtipZgj/x+dLDGScMVkj79LPPNfYjxNVgSPIZ1LAqRct264gRiBQNqJTOrtuPMWAMGAPGgDEQHwMxyBLqBfKCPl11xLiBjyqhn+6byBLFkyxckSWMI1jZShzkLJJvKG/evckSkyXrQJ4HFIfFN0jWqXVqDBgDfWOAwYUGHdWysIKEgUjVn2eIlCr5URdPflWyBLn8F55wEKTBjtLg8kWJZb2hn+/dbowBY8AYMAaMgfgYWJYsYZsuZIg+qFA39N/4cWl1SLXPJ14dWcJHEtLxMYaPKsTjw4o+zmjcovEB4xVWvy6SL3HbXCZLWiqqjTIdpx3orCfryRgwBoyBPDAwjyxRHbEf+C1veUurS2mqLgMbtvDgcumg2JCMYRDFf8dRHAZIPGt5bVWmn/PAkOvB9WAMGAPGwDgwsCxZAonBWIHVoCI05Ic/xAcYCc830z0Ei8IZkxCPZ9Kx1ZcPK0qreIwT8IMkIR7bijWeaJsv6dtcJktaKqqNMh2nHeisJ+vJGDAGjIE8MMDABOJCBEXV1YFpq9YXgyFWonBpsFOVyVcjxcHV9pxqPD/ngR3Xg+vBGDAGjIFxYWBZsiQ2DlglAvECCQJhEsrnAwofX0K/lPcmS0yWdAa2lEC27HEZa9en69MY6AYDfIEJCYrqvVd1dFMPxrv1bAwYA8aAMdA3BnIhS9ADH1bqxiD4zfrokkJ/JktMlpgsMQaMAWPAGDAGjAFjwBgwBowBY8AYmDAGciJLUhAfy8g0WTLhBrEMYJzGrLcxYAwYA8aAMWAMGAPGgDFgDBgD48KAyZKN9WmyxGSJGWRjwBgwBowBY8AYMAaMAWPAGDAGjIEJY8BkickSG4AJGwCz3xsNgHVinRgDxoAxYAwYA8aAMWAMGAPGgMmSjRjwyhKTByaQjAFjwBgwBowBY8AYMAaMAWPAGDAGJowBkyUmS2wAJmwAzJhvNADWiXViDBgDxoAxYAwYA8aAMWAMGAMmSzZiwCtLTB6YQDIGjAFjwBgwBowBY8AYMAaMAWPAGJgwBkyWmCyxAZiwATBjvtEAWCfWiTFgDBgDxoAxYAwYA8aAMWAMmCzZiAGvLDF5YALJGDAGjAFjwBgwBowBY8AYMAaMAWNgwhgwWTIgsuSX/tNfKqiwMV3/1T95z6jep6+6+Y/+3t8v/ov/9p9blyNrH33hyfmubmdt21bXoXEYX4f/8Fd/t6C/sG7j69Y6tU6NgdUw8J//1/+0+Hv/8T+wffJYNisMMP9+8uUD69e/Pu8tBSsrpnyhg1An3PM7rvwb4U9V+JSff+ND2zYoe8r6WPbdb9/7cHHSeduty8CYLatLpzvaIVgXy+vCtm153Rl36XT325/cXux8ar/7CvcVxoAxkB0GTrtsZ7FlbU925XKflK5Psm7Ho1uTJYk6FU8o4jSSi76xqzj3xl3uYBLh1MY8Dk6npEfbNmMmR7ybLDEuc8Sly2RcgoHLv7PbY1mPYz2XGSgGTJYkqjhPKOJ0kB/YvMNsfCKMehAXB6NT06Ntm3GTI+ZNlhiXOeLSZTIuwcB9j+3zKmmPZU2WDBQDJksSVZwnFHE6yHeeuVYceM5Lqz3gioMn63F1Pdq2ra5D4zC+Dk2WxNepcWqdGgPxMODxbDxdGpfWZZcYMFlisiRbptNMvI1hl8bQebXDm8mSdnoynrrVk8mSbvVtfFvfxsBiGODckhu2+twS42Yx3Fhf/evLZInJkmzJEvZ4fvK6ndmWzwasfwPmOui+DkyWdK9z47xZ5yZLmnVkHFlHxkB/GLj23j3F2Vf5DD5jsD8MWvfL6d5kicmSbMkIWHg6Fzfu5Rq39Wa9pcCAyRLjKgWuVpVpssS4XBVDTm8MpcQA/60LO5UyD8s2ho2B+BgwWWKyJFvDzf5O/yvI+I3ehtQ6XQUDJkuMn1XwkyqtyRLjMhW2LNfYioUB2yljKRaWLKc7LJksMVmSJVnCeSVm4LszBDa61nVbDJgsMVbaYqXLeJ6EGJdd4s15GW/LYIBtOF4xbewsgx2n6Q83JktMlmRJlnBeifd29mcYbJSt+1kYMFlibMzCRp/+JkuMyz7x57yNvzYY8LklxkkbnDhOXjgxWWKyJEuyxOeV5GUobLhdH8KAyRJjQVjIyTVZYlzmhEeXxXisw4DPLTEu6nBhv7xxYbLEZEmWZInPK8nbcNiwT7d+TJZMt+5zbvcmS4zLnPHpshmfwoBtlbEgLNgdBhZMlpgsyY4s8XklwzAeNvLTrCeTJdOs99zbuycgxmXuGHX5jFEw4HNLjAPbgmFhwGSJyZLsyBKfVzIsI2KjP636MlkyrfoeSvs2WWJcDgWrLue0sepzS6Zd/27/w6t/kyUmS7IjS864cqdPC0+ESxvp4Rnp3OrMZIkxlBsmKY/JEuMyR1y6TMZlFQOcW/JbZ2/PbuxdLaefjV1j4AgGTJYkmpR6QrG8kfGgd3nd2bBZd6kxYNtmjKXG2DLy3W8Yl8vgxmmMmz4wgL1iy3kfeTtPY94YWAwDJktMlmRlrH1S+GIN2AbP+uoaAyZLjLmuMdcmP5MlxmUbnDiOcZIDBs69cVfBlvMcyuIyuE0YA/MxYLLEZElWxpq9nPzbYDfc+Q3X+rF++sKAyRJjry/szcvXZIlxOQ8fDjM+csLAljWPdXOqD5fF9mEeBkyWmCzJipjglHCz7TZa84yWw/rFh8mSfvVv/Nfr32RJvV6MF+vFGMgPAwee21+888y1rMbfxkl+OHGd5FEnJktMlmRlrL2PMw/DYAPtepiFAZMlxsYsbPTpb7LEuOwTf87b+FsUAyed53NLFtWZ47ud9YEBkyUmS7IhSzivxEy7DWEfhtB5tsedyZL2ujKuutOVyZLudG1cW9fGwOoY8Lklq+vQOLQOu8CAyRKTJdmQJT6vxEavC6PnPFbDmcmS1fRn/KXRn8mSNHo1Xq1XYyANBnxuSRq9Gq/Wa2wMmCwxWZINWeLzSmzgYhs4y4uPKZMl8XVqnK6uU5Mlq+vQOLQOjYHuMOBzS7rTtXFtXa+CAZMlJkuyIUsY7Pr/ztugrWLQnDY9fkyWpNexcby4jk2WLK4z48w6Mwb6xYDPLelX/8a/9d8GAyZLTJZkQZb4vBIbrDYGy3H6x4nJkv7rwO1gYx2YLNmoE+PEOjEG8sYA55Zc9I1dWYzDjZW8seL66a9+TJaYLMnCSPu8kv6MgA2wdb8IBkyWGC+L4KWruCZLjMuusOZ8jLVYGODcklMueSiLcXisd7Ict4+xYcBkicmSLIy0TwW3cR2bcR3r+5gscVvNEdsmS4zLHHHpMhmX8zDAuSVvO32tOPjS/izG4vPK6jBjeaoYMFlisiQLA+19mzbCUzXCQ3tvkyVuqzli1mSJcZkjLl0m47IJA6wsuX3vw1mMxZvK6nDjeYoYMFlisqR3Ay1mfYoN0O/sjmdoGDBZYszmiFmTJcZljrh0mYzLJgxwZonPLTFOmnDi8P4wYrLEZEnvZIn3bPZnAGx8rftFMWCyxJhZFDNdxDdZYlx2gTPnYZzFxgCrSnxuiXEVG1eWFw9TJktMlvROlvg08HgN2sbRukyNgVlkya5nj11GXH1OXS7Lnzb2TZZMu/7d/l3/Q8UA55W880yfWzLU+nO5x297TJZ0SJZs/8HDxe0Hdq+TE1/btbO44r7txeMTP9iJ80qa9muiKxmk/c/tKy66Y624+/E9634Kszt+o+U67reO68gS7Nq/ufTeAhtH/Vy3fUfxpbu3F6d89b7CpEm/9TWV9mKyxDibCtb9nsPBejhOpX+8de/u2jG/zy0ZTp26/U2vrkyWdESWMME/7fqtxWdufbCcTGBAIUownCERMLVGqPNK5p0EftUDO8qJmHTzia8/WE7A0OXUiSbpxO70jHdfdV5HlmDfsGciS2ij2DYTJcZlVzidR5bc/8Se4l0XfW+dXIfMA6OQ7l2Vz/m4LRgD08LA+d/aVrz3ivtKG8NY9cybHig/8jEXqGLB55ZMCxvV+vdz3vVvsqQjsoSGwERCZAmDNCYXfH1lojHVhtL2vBLpDT194JojpNOUSaap4sXv3X+HUkeWUC8hWcIqE9ong0MRKK67/utuzHUwjyzh40TYh+je2DQmx9wm/G7945vxKvVAfwhJy9i/7iOCzy3pv67cXlwHszBgsqQnsgRmmYEaRhP2eVYFjd2/7XklGtzCzjMRQy/obcpE09ix4ffLs+NqQ5boyxkDRFaGuS7zrMsx1cs8soT3VB9Cn8sEhg8VrC4Zkw78Lm5nxkBeGBBZwscEiBKtMKnWk84tYbV1NczPedWp62N69WGypCeyRFtJZhnOqTTGNueVoAsNdLnXRIzOJzwDZio683tOz1DnVOdtyBINDBko1n1Fy+l9XJZxtKdFyBL1J+A0PFPAWBgHFlyPrsdcMCCyhFUlWg09i6Tl3BJWW+dSdpfD7cgYOIIBkyUdkiVMGhicAT5WRDBgY5k6+6mnCMg255VIL9Ibz3Q60p3C7dqoGwPdYGAWWWL9d6N/67lez23JEvTHZIUzdThPwKsT6/VpnFkvxsDqGAhXjjNu5ZkxbJ1uObeE1dZ1YfZbvS6sQ+twWQyYLOmQLFm2ksaaru15JWN9f7+XDfcQMWCyxLjNEbdNZEl4PgkrOn0AsXGcI45dpuniknNLWG1tDEwXA677POveZInJkt4Ms0//ztMo2Fi7XuZhwGSJ8TEPH32FNZElfZXL+bq9GAPGQFsMvPPMtcLnlhgvbfHieN1gxWSJyZLeyBL2Z966c29v+dvIdGNkrOdx6dlkybjqcyzt02SJcTkWLPs9povl0y7b6XNLEs3L3K6m265WrXuTJYkapScU8xslJ3+/7XQz6Ks2YKefjzPrJ75+bNvi69Q4XV2nJktW16FxaB0aA/1i4PLv7Pa5JYnmZcZ2v9gesv5NliRqlJ5QzG+U3ps5Xz9DNiou+7jr1rZt3PU71PZrssS4HCp2XW5jVxi477F9Prck0bxMOrbr9rYoBkyWJGqUnlDMb4w+9Xu+fhZtyI5vfXaFAds2Y60rrC2Sj8kS43IRvDiu8ZIrBnxuibGZKzanWi6TJSZLejkzxP9P3p3BVI3u0N/bZInbbo4YNlliXOaIS5fJuFwUAz63xJhZFDOOnxYzJktMlnROlvi8krSN2kbT+k2JAZMlxldKfC0r22SJcbksdpzO2MkJA5xbcvZVuzofm+ekA5fFbTInDJgsMVnSuUH2eSU2gjkZQZdlMTyaLFlMX8ZXN/oyWdKNno1n69kYSIsBzi3BnlnPafVs/Vq/bTFgssRkSecG2eeV2EC1NVCOlx9WTJbkVyduJwfKycXOp/Z33p9Z924PxoAxEBsDnFtie2ZcxcaV5S2HKZMlJks6H1z6vJLlGquNnPWWAwZMlhiHOeCwWgavLDEuq5jwszExVAxwbsm19+7pfHw+VH253G7rKTFgssRkSafG2OeV2KClNGiWnR5fJkvS69g4XlzHJksW15lxZp0ZA3li4Kt37vG5JYnmZ8Z8npjPuV5MliRqjJ5Q1DfGu/Y/7P8hnwhzORsal62+PQxRL7Zt46nLIeJvVplNlhiXs7Bhf2NjaBhgC47PLTFuh4bbsZbXZEmiiasnFPVGjlO+z73Rp3yP1aD4vepxPya92LaNv46HiFeTJcblEHHrMhu3szBgm2ZszMKG/bvFhskSkyWdbsNhH+YNW70P04auW0NnfcfTt8mSeLo0LuPp0hOLeLo0Lq1LY6B/DPDvg31uSf/14LbgOjBZYrKkU7LEJ3zb6LjjGTYGTJYMu/7G2v5MlhiXY8W232ua2IYogTBx/U+z/l3v+dS7yRKTJZ0ZYv/v+Hwavo2w62JZDJgsMXaWxU7KdCZLjMuU+LJs46trDPjcEmOua8w5v3rMmSwxWdIZWcJ5JWbJ6xuiDZT1MhQMmCwxVnPEqskS4zJHXLpMxuUqGMCu8aFxFRlOawwaA6thwGSJyZLOjLD/b/xqjdXGzvrLAQMmS4zDHHBYLYPJEuOyigk/GxNDxwAfGPnQOPT3cPndFoeMAZMlJks6M8I+r8TGcsjG0mU/gl+TJW7HObYFkyXGZY64dJmMy1UwwLklfGhcRYbTGoPGwGoYMFlisqQTI+zzSlZrqDZ01l8uGDBZYizmgsWwHCZLjMsQD743HsaAAc4t4UPjGN7F7+A2OVQMmCwxWdKJEfZ5JTaSQzWSLvex2DVZcqw+jI889GGyJI96cHtwPRgDcTGAbfO5JXF1aoxan4tgwGSJyZJOyBKfV2LDtIhhctx88WKyJN+6mXK7MVliXE4Z/3738eLf55aMt27dbodRtyZLTJZ0Qpb4vJJhGAQbbtdTEwZMlhgjTRjpI9xkiXHZB+6cp3GXGgNb1nxuSWodW77b8TwMmCwxWZKcLNn2xL6Cgew8IDrMhsoYGAYGTJYMo56m1p5MlhiXU8O833camD/wnM8tMdangfVc69lkicmS5CQGp3mfcaVP887VCLhc7oQWwYDJEuNlEbx0FddkiXHZFdacj7HWNQZOOs/nlnStc+fndi4MmCwxWZKcLPF+SxscGRy7w8eCyZLh1+EY26HJEt08Mh4AACAASURBVONyjLj2OxnXYODcG3cV/KME48F4MAa6x4DJEpMlyY0vg1if5N1947ZBtc5TYMBkiXGVAleryjRZYlyuiiGnN4ZyxQDnlpxyyUPJx+u5vr/L5bbZJwZMlpgsSWp8/T/ibeD6NHDOOz7+TJbE16lxurpOTZasrkPj0Do0BvLEAOeWvO30teLgS/uTjtld/3nWv+ul33oxWWKyJKnh5bwS/m2wG3q/Dd36t/5jYcBkibEUC0sx5ZgsMS5j4smyjKfcMMC5Jbfvfdjj6UTzttzq2+XJxwaZLEnU6DyhOAJyn1eST2O34XVdxMCAbZtxFANHsWWYLDEuY2PK8oypnDDAuSUXfWOXyZJE87ac6tplycv2mCxJ1Og8oTgCdAawPq8kr0ZvI+z6WAUDtm3Gzyr4SZXWZIlxmQpblmts5YABn1tiHOaAwymWwWSJyZJkLLXPK7Fhn6JRHfs7myxxu84R4yZLjMsccekyGZexMOBzS4ylWFiynMWwZLLEZEkyssTnlSzWGG28rK8hYMBkiXGaI05NlhiXOeLSZTIuY2LgvV94yOeWJJq3xawnyxpXuzdZkqjReUJxoPB5JeMyFjb+rk8wYNtmHORoC0yWGJc54tJlMi5jYoAzS3xuiTEVE1OW1YwnkyUmS5KtLGHw6vNKmhuhDZV1NCQMmCwxXnPEq8kS4zJHXLpMxmVMDPDfcE655KFk4/aYZbUsY38sGDBZYrIkidFlb+U7z1xLInssjc/v4Y5kiBgwWWLc5ohbkyXGZY64dJmMy5gYOPjSkbE1bky5lmWcGgOzMWCyJBJZwgoKJhGzLk6xnhIQed8PbN4xqXeeUv36XWcb1bHrxmTJdOs+Z2ybLDEuc8any2Z8xsIAK0umNqeIpTvLcTtcBgMmSyKRJSj/tMt21pIlJ523fXKkgf8fvA3SMgbJafLHjcmS/Otoiu3IZIlxOUXc+52nh3vOLGGM7bqfXt27zvupc5MlEcmSWatLpsgAQxCxt9INu5+Gbb1b76kwYLLE2EqFrVXkmiwxLlfBj9MaP0PBAGPrKX6EHUr9uJzjsyUmSyKSJTSQ6uqSKRo0/y/48RkKG3/XqTBgssRYEBZyck2WGJc54dFlMR5TYYDzSt52+lrBWDtVHpZr/BoDRzFgsiQyWVJdXTLFVSW8s0/rPtrIbHCsizFhwGSJ8Zwjnk2WGJc54tJlMi5TYMDnlhhXKXBlmfW4MlkSmSwBaFpdMsVVJby/zyupb2w2QtbLGDBgssQ4zhHHJkuMyxxx6TIZlykw4HNLjKsUuLLMelyZLElAlmh1yRRXldDQfF5JfWOzEbJexoABkyXGcY44NlliXOaIy6YyvbHjl4vi/uN8TVQH1H8TRurC255bYnxNu20ti686zE3ZLwuyZIyN+ZrL3zPKzq+p4S17XskYMeAB0GKdVBO2pmyoc3p3kyWelOaER5XFZIlxKSwMyWWccPjlV31NVAfU/zJ45dySd57ZfG6J8TXttrUsvpbB5JjTZEGWuDEPpzE3NbxlzysxBoaDgVQDuyZsjdkQD+ndTJZ4UpojXk2WGJc54rKpTB77THvss8q4hy3/TSvYjS/jq8kGOby57zRZMlE2e9kJb5NhX/a8Ehv0aRt08NiELRv0ZoPehY5MluRRD13U9ZDyMFliXA4Jryqrxz7THvusMu65/Du7yzMChaU61/gyvupwYb/F+kuTJSZLFlr+2WTYlz2vxAZ92gbdZMlihrvPjs5kyXDqqk+cdJ23yRLjsmvMxcjPY59pj32axtTzMMb5iNi9eXGML+NrHj4c1q7fNFlisiQaWaL//Y67aAO0QZ+2QTdZ0s5gL9quUsQ3WTKcukpR/7nKNFliXOaKzXnl8thn2mOfVcgScMW5JTufmj3mNr6Mr3n2x2Ht+k2TJSZLopElbU/nrmucNujTNugmS9oZ7Lq207WfyZLh1FXX2OgzP5MlxmWf+Fs2b499pj32WZUs4dySa+/dM/MDpfFlfC1rm5zuaJ9qssRkSTSyZJX/+26DPm2DbrLkqFHOvYMyWTKcusodSzHLZ7LEuIyJp65kTWHs89jBJxYaZzIeGOL18P5HFy73qmQJ55acfdWuyZIlz//4cDF2fD397HMF1zJtYlV8dWUHc8/HZElko7yMsVymAaySZpUyzmt4p1zyUOPJ3LMaxFgHDKvoepU67jvtMu89D1uzcGP/7idIJku617lx3qxzkyXNOjKO8tPRsmMfJog7d+89ZgKF3333P1BOHnHDcQCTrapfGB7zPsyLMl58yRfLstxy6zeL0z/8keKz535uffJ3yvvev15O4vEcXpdfceV6+FVXX1Ns/tKXj7lu2nLzejjvQH6Ko3cK8yC+wuVKL5RbfriSfc45n1qfkMtPsknz7dvvKMtAGslSeJO76rin6dySZfGlcuvd9IyLDsL3DsN4f8JCv5T351/whfV2sG1tR8Ez9YB75933rJcD7IW4okyUlbjc03a4r15hGxN2pBOeVd9V7EiOdKG85C+5YIv86/RJGsoFIXTmWR9bf5dF9LkqvtxnHOkzBkmW1IFqEfDMitskV4Z+VnomiDRQwtWo1DBwMfRKGzZMNSY1GuLQGMO03KuBEh6GSS5+yCWcDubQk0+v54efykb8UBZhba9ZDU/nlRx4bvbeyXmNro1B591kmNqWN2U86m1eeQjTIKGpk1+lg5/1jqrvWeHgOcQR9+CW+BhnheFHp8MVDhp4f8UJMUw9gb95uqkr0yxszcONw7of/Jss6V7nxnmzzk2WNOvIOMpPR23GPnX9Jf2r+muF0w9rnETfLH9c/Kt+YXjM+zAvxgyMRRkfn3rqB8syMak94YQTy/LgKu+Q1JBf6JKO9w6vMI3GZGE46cM4oTzuw7IqjHFbONEOxz3ICuUzjtLYnXGT3lGymtwY455555Ysiy+VW++mZ1zGq7xrXRgYQ6dh/Fn3yAn1PCveLH/Sa5xbp3sIBs2D6spFPapN1GEH2dQv+ZNXWO+8I+0Pv1nlC3GjOCed9O5j4kuHyAM7YR6ESf6y87YY+HK/cQCupDiu/Bvhz7IKXbQx0yjmfbkOmWgBtI3bJLeJ2QsbZl1+MqJ1jZL4ajR1aWlI1fDrrr+x4JI8wmWkuKeRhw1PHYaMCm5dXvP8ZjW8Vc4rATdtMMB76v3qyiijWReWwo+yyNDWyecLCmWuC8NP9aH6C+sqDK9L35R3U/qmcOTLcINrOgUuYYwy8+58IeKSHhQujNWVfZbfLGwta1ecLs3EwGRJGr0ar6vp1WTJavoz/vrRX5uxD32m+nwmbTwzXmD8R78MiaA4GkeoT2aszD1x5Fftg6uyCVe6cKxd9WMcQHn0wU7hygu5jIOQpw+A3DM+eO/JJ5fvEE4eGcNRxnBcwftVy6tn8pd8/DSWYhxCmdAF/hprcY888tClPCUTlzEP/tILZeRespQWl3jkp/SkDXUm/1lujHHPvHNL2uJL5WPegO7QJX4a06E3EQ/62Bq+N+HSrXQlmbihTrhHPumpPzBUDVcasER+hCOX+Z3kh6QWfug+zBP5kqu6Ut0hh3rlOUwT3hMmDIks2bRpU+lHfryvwnkfyZYb4ga5yHjHO95Rlkm6kg6Rp/IovYg50iI/xHFYznn3MfDlvmGgZAmgAaC4sJKAHuBhgGlUAE7GGwACPMIFONLgR/oQZPPkkj6USwNEhlhRjAjGP5RXva+SJTQSyq7GpkZDOvxpGLqQHYYTB8PApXckLveEEXcWWUI4Bl758tz2mtXwVjmvhIbYxqDzbpQZV/Uu1pf64QuF6h2jRP0onDRhZx2+b508hUtOqCsNBEJ5ihfmF3bikicXrClcuKPOZnXw1eWp4IH3k7w6t8mwzgtHJ8IbLvqlDGCYMOXHoEbx8ONe4X0MGmzU0w/4TZak17FxvLiOTZYsrjPjrH+dtRn7ML6gb2UcwriB8Sf3IhwYzzEmwo9xgVzi0Q/ruW7MUCc79CNfZNf5IZfJI+F1eTFGYtzA2IBxDuMHxkgiGChPuLJE4wrGG1x6Dl1k8kw4eSIrDOeesU34ruHYcN64h7SkQzYuF/OKcFxTTR+OlUiv+Ui1TLOeZ42pF2mb884taYMvlY26on64ND7l3dEDda05Dn6kkUsdoDNwAB40BpTcMK7u0SvjXfJk/iRZCpdLOPWscpCH5lLUhQgc4oMNykJ59S74c+FXLZfaheKAcV3EZXwbyqccb33rW9fnjrwz5UIO8clDsqouctR2KT9piKP3Jr3ulVZ61zO61X1bNwa+FsHiWOMOcmWJQIkLgQEIaRg0FMAMEJnQ4k9jAvyAjoZJGhl3GmsIuHlykSG53NMBIR/DCLsP8GlYoTwZceLQUVQbAg1HcUjHu8gQE5fyhPLCe95HXxWIS1nwU5q69JKNHIyhiIVQbtP9rIa3ynklNK42Bl2GDRejzTujP56pE/RHvauu1JGCC+JQ77jVd6yTRxzkSLfkowGD6h7MofO6/MiT8DAvcMAzskgT1j3+1A/ylAYGmrwUJv86l7JJvsIlD5m6wjonnHcPL/RHenDEu3OPS6cAXtGxMKaOiXyVd4g7/Ein8jS5s7A1VuM71PcyWdL/BGuo2ElZbpMlxmVKfKWS3WbsQ/+tsQvjHn1gUX/OWEdxQpdwxgb0vYpT7YcVH3/Jxo/4+NHfMw6p86NMKkNdXowzw3EQ8omncQbyNS5lrEAedRdjDZVb4xLS4c84WGEqL2MVxusa4ysPwvHnObw0FuN9pC/iUs4qWcL7kJbxJBf3Gv+QhvfretzDvw7G/tVhtA2+KLd0o3vGqNyjb+lR4zvVgVx0qnToUmNE+UmOnpUOfUtX8gvj4hfmrXt0Tjxc2gL+yJp1EU4+GrMjl3vigzeVizi6CAvfizjM8Uin+iYu8QjjnSHlKFN4CU/kA/6Jq/Jyr/cmTOkY++te7ZC44A13kcvj6jj94uDJktDICfQCH0YUsOMPwDGgAFppqoAjjLhhnLAxSS7GUA0EGYCa5ypZgj/hpMPoUgblSR4y6DR2xVM4aSAE1GBwNXGm8agBEp9nGQM1RjoR3oU8uLinYUt+TLJk1fNKMPBtDLrqQi7vwr3eS/qmftS5Uyfoknj46/1Dd5Y86ksdBnWEHpEh3Qsvdfmh/7C+yU/4oZyEh+UR4QJehQe9D2nx5zm8hAfCqffQqOKHTN6NcnBxHw5SFI6/LoXzbiovrjoQ7gkjvjoM8kInyFM4fiZL4hjpugFQn34mS8ZZr31iKkbeJkuMyxg46lpGm7EP4zeNO+jrGSPQB2vso7EIfsSVyxiDsQb9MeMDwrgPrzrZ+Gk8obFAnV9Yhrq8kMG4SfkxRlCZ5ReOc8iLsQp5cXGPn+LialxCOnShMS9hyGdCSb6UjTjoKsxDsjSm0XPo8i7kQ/7MF6qEDHFnpWdcpnFUKHPWfazJ7Cz71wZfKltIDqBL/KVv3QsPesbVihPu55ElGttq7Brih3yq4dW8kc+l+mR8jwyRD6o3/EjLs8JJp7YgOYSBMz2rTnEJkw4IJ57meGBacYmn9HJVPj3LRXfIQEe6qvgmbl36WTiW7FluLHx1bRdzy2/wZImAHoJeDQxCAEADIhoTBhRgKk0VXAqTS3idXAwnsiUXA4PBDg0GYQI85QmNOvL5Qk95uLRKQuUOy6UGGfrpnskoDU+NmManMLmz0hO3rpEr3Sy3ruGtel4JjaKNQVddyKWM3KuOpW/qRwMLDAz6DuNV322WPPRLGPGRgYFHtgwudYfu6/IjfjhIQIbql3KGeMAggwf86GQJB696n7C8s+ozjFO9XyYNZTn++OPLMoBvyeAdeDflwbszoFAHQOekMPSFjvTc5NZhKzeD6fIcKEyWeFKaYzuYNVnIsawuk9uQMNBm7MMYgX6Y8QjjCk0ONfahT2YsorGMXI1DeKY/rhv71snGj/jKj+c6P8LDMlC2al6Um/LS/xNWVwaNDUgfjhm41ziKfEjLWAmXr/i4XBqTMX4Kxye611hKMkiDXK6qDNLw7ioTLs/4N6XnPXnfMG3TfaxxD/8+mO04wpXcNvhSGRnL8Y5cmk9o3Eocjf/kJ5d0GhtTL9K75OIik3jUFWNL/Kgvxo7SbTVc8pW35Kk+waTKSViIL+qVZ6Wpygj9mSeEmAAX5C1sqHxhGvmRh9IrfohN/KQP3i8sE/7k0yY9ekPHYRna3MfCl/A0VXeUZIk6FRkuJs740bAAJ+CtA5nC5BInbHxquEwkaUyAVx0KcbknDH/yUIORcccPg4F8LpWBNNxLvtITv2rQSU9c3k0GQ3IwOnQuTPIJ4wqXCvKMYSEtZcJV2rZuXcNb9bwSGl8bg666kEuZuZdOqGOML/rkXQlDf+gkjFd911nykINM8IOcULb8MH51+ZEHaQmjfNSlcCBc4EddC5cqF2m45x1wlb4OD6RXutBtSgMOkF93gZ9QlsqATDAq7FJO9BLG5Z0JV9sLw5ru67A1VcOc83ubLPFEL0d8miwxLnPEZVOZ2ox96DvpVxmraHzABEv39LeE4xe6YTr8QyIi7I+rssN0YRrFk19YhjBNmBdl1oSWMRTjn+q4Q+/BeIZxNJNCLu5njXHC8jfdayzVFE/h5KuJOy6Xwua5WskwL041LNa459p79xQc9FrFW1t8qVzUF/WkZ9U1z9yDNfnJJYx0XNT9rLkFY11kV9ORBhnV8DBeeE88lY8xqfBD/oyTCcPlWfFwiVvFXt14N0wz754xcTWPefGJy5gZnJCWOVub9OiTdLP0Oi/PWPiq4mpqz4MkSwCMGqQamToJQIOfAEgj4p5wwpSWexocYbpojPPkho1VcpU/8ggH/Nwvc4ksaZuWDoj8MAq6b5OWhrpsB1TX8D6weUexZW3PBiO9SGNqY9BVx3J5V+5lKKkLGXnVj4xLGI84qnNc1XtVHs+SE9Yz96QjTJhQPOVHWuK07WSJX70W7eCr6WM+01a4QrIE+bwf2AODYFGDorqOqqk8ddhaBEOO281kyWRJN3o2nhfTs8mSxfRlfOWhrzZjn6a+c5Fwxn/0z7rCiecichaJq3FS2zTEXzRNW9lt45G/xpNt04TjxLZpYo17OLeEfyFcbddd44v3Rg/Cl9y2+lg0Xji2XzRtX/GZGyyClVXeMRa+qria2vMgyZJYAIfZU0PGBcCryu7bwLcp/yplrGt48/7He9sG1aVB73KwsIqu29RlLnGqhn+Z967DVlv8OF53A3+TJd3p2rhur2uTJe11ZVzlo6suxz65jBdcjqMfx2KOe7CB9z227xjCxPg6qusp4i4mvqbcb0yaLJliw1n1nasND8OMgV61EdmgT9ugg8sqtlbFlNOnmRCYLEmjV+N1Nb2aLFlNf8ZfP/rz2GfaY5+Y4566c0uML+PLtn11226ypGb7w6qEwpjTVw37vP/vvkgDtUGftkE3WbK6MV+kva0S12TJcOpqlXoeWlqTJcbl0DBLeT32mfbYpzqmXgXDdeeWGF/G1yqYctoj/arJEpMlC209qhp2DpTCQK/aoGzQp23QTZYMZ6JjsmQ4dbWqXR5SepMlxuWQ8Kqyeuwz7bFPdUwtXCzj1p1bYnwZX8tgyWmO7U9NlpgsWYksiXFeCY3SBn3aBt1kybGGOeeOymTJcOoqZxzFLpvJEuMyNqa6kOexz7THPjHJEvCKHQzPLTG+jK8u7NjY8zBZYrJkabIk1nklNDIb9GkbdJMlw5nomCwZTl2NfQATvp/JEuMyxMNQ7j32mfbYJzZZUj23xPgyvoZiC3Mup8kSkyVLkyWxziuhgdigT9ugmywZzkTHZMlw6irnwUfsspksMS5jY6oLeb948JfK8Q9jIF/T0wH1HxNnN2zdU3xg8451mcbX9DAV2pHY+IqJ1SHJyoIscWMeTmMOG16s80poMMbAcDAQGuKY9yG2hmREp1ZWkyWelOaIeZMlxmWOuHSZjMsuMXDguf3F205fKw6+tH+dMOkyf+dlvI8RA1mQJWNU7BTeKdZ5JVPQld/RHchYMGCyxFjOEcsmS4zLHHHpMhmXXWPgpPO2F7fvfdhkycvGXtfYG2t+JkvcmJYyqDHPKxlr4/J7uaMaIwZMlhjXOeLaZIlxmSMuXSbjsmsMnHvjruKib+xaamzfdVmdn9vHEDBgssRkyVIGNeZ5JUNoKC6jDboxcAQDJkvcFnJsCyZLjMsccekyGZddY2DL2p7ilEseWmps33VZnZ/bxxAwYLLEZMlSBvWMK3cWX71zz1Jph9AwXEYbcGOgHgMmS+r1Yrz0qxeTJf3q3/i3/o2BPDDgc0vyqAe3h/HUg8kSkyWtCA/2P3LCNkv7uGdgGv4vdxuF8RgF16XrMsTAnmf3lW2eds8FWaJ73J1P+SC5UF++76b9VHH5W2dvL/hPEMKmcdlNPRjv1rMxkB8GOLeED5pc/DMGtua4nvKrJ9fJMOrEZInJklYGFKaaSVJ4scwP8uTWnXt98rZx1ApH7hiG0TGE9cSklNP1w7Yf3ps0HV6dhvU71Hvj0rgbKnZdbmM3BQYgiK+9d0/Bym/I47CfZut8ijwt01ieAgZMlniS29qAwlSHxlf3mz67vYBMmUKD8Tu6Y5giBvgqpfYeunyxmqI+/M552AHjMo96cHtwPRgD/WNglj2kz/ZHjf7rx21kuHVgssRkSevJztlXbZwwwV57ufNwDYCNt+uuDQZmfcX3AMz4aYOfVHGMS+MvFbYs19gaIgbYLh9+0OCelaFDfBeX2W0wFwyYLDFZ0tqIsrwvNMIY4Lv2+3+559KYXQ53LCkxUP1q5VUlxltKvLWVbVwah22x4njGytgxcPCl/UV1Fbj/M45xP3bcp34/kyUmS1qTJXxFDskSDtNLDVDLt5E3BvLAQPUrvleV5FEvU28fxqVxOPU24Pd3GwgxgE3knzBovH7BzT7cNdSP791eFsWAyRKTJQsRHu8888hBj5tv82FRizY2x7eBHjoG9BXfq0qM5ZywbFwajznh0WUxHvvGAB8zNF7fsuYPm33Xh/Mftk0wWWKyZCGyhP2QnF3ihj/shu/6c/0tgwF9xfeqEuNnGfykSmNcGo+psGW5xtZQMcB/qmR1if8BgzE8VAznUu4syJI3dvxyUdx/nK8B6GD7re/yvwk2wWayrCUGxmjbdn3t10Znq6mnXDrlLsphXA5jvDE1XHaB/dzyGGNb9Hi+vX1J3cbv//rvjK6/HiO+UuMgN7s3tPJkQZYA/MMvv+prADqgroYGcpfXrHpfGLBtG4Zdn5pdMy6Ny75sovM9tj92WxxGW0w1R0nd9xhfw8BXahzY7h5rdxfVh8mSARAUqYz0MnLdoFdrcIs2UMcftr49UPFAJcc2bFwalznicoplclscRltcZrzcJk3qMbXxNQx8pcbBFG1rzHc2WWKyZKEVPW7Qw568xzQeltWMBQ9UPFDJsZ0Yl8ZljricYpncFofRFtsQH8vEST2mNr6Gga/UOJiibY35ziZLTJaYLGl5/kTMhmdZzUTDGHTkgYoHKjni2Lg0LnPE5RTL5LY4jLa4DBHSJk3qSbLxNQx8pcbBFG1rzHc2WWKyxGSJyRKfQ5MIAx6oeKASs8OOJcu4NC5jYclyViP+3RaH0RbbEB/LxEk9STa+hoGv1DiwnV7RThdFcRyMSYzfspXhxjyMxkxH4Aa9WoNbto043TD1bts2DNs2NbtmXBqX7lPy6FPcFofRFpchQtqkSd33GF/DwFdqHNjer2bv4UhMliyxuuSqq6+ZuSLj4f2PFs//+PDM8FkGlDSkfezgE8ek37l7b3Hf/Q+U/qRVOGVYJp9Z+bfxd4NercHZYE1Lf2MYqHz79juKQ08+XWvP8J8V1saekPbpZ5+rlU16hd959z3r9q+N3EXjTM2uDQmX9InUf12dgh36w7qwGH5t5auPjpFnKGNquJxi/5hDW9z8pS/PbENgO8Rkyvvq2Jm8wzHuomWpymMczbtyLSorjE+/hCwu6YO8uL/8iivX/RQ2z03dxnPA17z3V9g8O4+Nr44TpG/Sa+4kWVW3Ln0Ypym94oKBWX2R4izrpsbBFG1rzHeePFlCI5rXUdQBn8lDSJaQPjSa55zzqWMGcKGBJq1k0vhluM+/4AtlGtLipwHgtrUdZV743bTl5tJf4ci9+JIvrsuT3JSuG/S0Jvsxjc0UZcUeqGAfqu0b21H1i/XMoPDMsz62Ll+2TPKxSVx6lj3FRoU2knAGGqe87/3F6R/+yPqAg7SyndyTjot42D7sG+EMZk499YPr+Si/WO7U7FpsXMaqh6oc1TsuWBR+hK0Qj2CPcGFIrgbZYX+rsJNOevd6X4uf+l314aF8ylaVIdmEgWvKWH2HVZ6nhkv3Ed1/Bb/u+hvXbThtABxja4Vt2pQwXNe+wjEt92pbuPRNuEovV21506ZNBZfyULujvVMO0lMWTVAVT3LkNskjHv1J2Mfccus3awmTsM1zr/5NeWMjSKv3JA7lVd9cnR+ojLPc1G08F1sv/dTpIbTzYTzpHF2jZ9IqLn6MTfCnTpSO+iId1/HHH1/GD9Mr/B3veEcZRx9ilB5ZxA/LybP6hhR2nrxS42CKtjXmO5ssqWkYYSOpu6cR0mAVhkGXQcWPRqeGpUZbdZUWl7jvPfnksmMgbdgwMfA800BhrNWQJT9Vww3LF967QZssiWmAxi4r9kBFHXrYJufdh7ZkXrxZYZ8993PHDCgZCIZlwO7J9mEHq3aOZ32RI50mkyJgSKtBEPG45yJdSJZQPibI4cB8VpmX8Z+aXYuNy2V03iYNEzkmJsQVccY9/R59MFgB4/ipb5wlt0p0kK5KltAPgz0G2eQL5iQfrNbhW/gXXmflv4z/1HA59v6g7v36botgGmzSPmhX3IftSuH4h/d1eG5Lligt7UvEJ370EbRj8tcKjbBcTfnPkods2idtmjbPRVnVY1u3OQAAIABJREFUN6k8uOp/aPeUR+37hBNOLO9VPvJCHvGxRdgM+kBkQPCEc4RQfvU+dRvvG19633DcID+52HnhgHjongudE0d1oTGCsMF4Qpipykf/pFN65Gv8ofoijPql3pSe+gVnKgMuz/gTP4WdR25qHNTZHvu1n89NiiyhodEoGHQxCQD8XDQGNSzCaLiAl4bFMxcNiWeWfqlDIQ6GnIbExT1+arzcI5f05Es+uPgRpov8uCgLaYmnhklDJr06DJVX4cTVYFLyUrpu0O0blw2RdRV7oILtoc1jJ/S1TQMHXMKwbdgY7B12CZuD/WBwyH1IgMi2kVbyZLOwI3z1C+0J+TMQ1CAT+6TBJPG4lw0L8yGMdJIlG0p8Bpv4U1bKL5vG4IZ4CidPkSySE8udml2LiUswBX6od+oTTFFPwgiDS+Jw6Sue+ljqD38wp74VOerTwIyWW+Ov+gYjyAcb3OMPxoUfBtm6V1+pvlMyqi7xFVdlAIOST3zy493wI46wSRjvUG0v1TwWfZ4aLqfYZza1RXBOG1G70jiTZ2wsOMSPeOBSNp02RDr1D8ThmUs2m7Ypm6r0wqjaG3ZZfqQjD+wyF/eSRRylUfx5Lu2F9l03dqbNE0aZ6bd4T2SFZanKnicPOeiFd2ccTzvnHj/ShbJCm8K93i/MG51hy0L7QHnRIbKQrf40lF13n7qNN+Grrkyz/MBUqEfigS8u6ki6Qg9gAT2o7oSNOjsPlqQ7xUO2dA7OZGupP/wpC/WAS32G6ahTntV3kD4kSygv9aXyhum5J36oA57xxw/Zse08clPjYIq2NeY7T4osobHRKAEmjYiGpobBs4ybGh1hNCjiY7AZ4CEDY4EfHQ2NlrQ0dO5JQ3o1LBkX4nPRONV5yY88yBvDQtqwYaqDgwmnsZMmDKdcVXmSm8Ld9bVfKy76xq7iwHP7/R9UEv0HlZgN3LL6JWxiDlRoz9gBDe5km2SvNLDAloSDBGwRdkTxw3vk8cylQbNsHfnxpR2XAQq2E3um9OSDPdOAgzjIk90hX6XHT/lzr7xIq0EQ5ce26ZJshfPeekflEcvFrm17Yt9kbFpMXFInwhtfV8PJiOpdmCUu+FE/DEaEBfXHYRp9WcRPOOeePpg+F2yAF2QKN7ghWaJwDbIpQ3hpkE48+mBccEzZJJ88uRgk611ww/IpXHFjuFdf/m+LUy55qLhh6x73uSPtb5vaIhhUG8EmYp+xvRqH8gxmiaeJKWNCjQtJS/sA54xZwaVsMfJIix/hugfbam+0FcIVlzi0Xy7uuSgDccgzbFvc06YICy/aFul5D/IlHi55EkZcZCoPyo+fysI95VEZm+RJR5QVHXFVy67yqRyEU3bKGOaNbigH+qY/VBnQKWmJy1yB8knmPDf1JLkJX/PKVg3TO4EjEd68v95buEI/1Bm60phAeqqz82G9giHVDfVPGXhG3yoPsnlWv0P9S75wKhxV06te8acN8Rym1z3ydSE7lGeypN9xdR/zmsmRJTQMNTg12rCx0DjVuGkc6pBoNMQLmXgGXzLiyMQw4IYNi3DyIS2X8lQZiCvGU4ZX5cEAYUS42F8nGaF80spoSWZK96nb/pvitMt2Fu88c82kyUgHb30YorHmGXOgQrvGfqh9a4CBPcAP+0E4z9gm/GRLZL+qaUN5DCBJh59smSaDPIeDBeTgx8BEAyj8NPggX+RRJuWJXOSTToMq0lI24mDvNDjR4EuDacIZGCmdZMZy77z27cWmz24vDr40DRI4Ji6FQ+pCWAzvw3BwQR9KvyVMagIHsRb2cWAFP/WxpNHEBRyAI8nQPc/EQQ6u8IQsya5zlUcVT5Ivf8ogQgWsa0Kq8NiD6G03/q/Fv/rU9uL4j60Vbzt9rXjvFx4qLrh5V3HX/ocnQ+yNtW/QezW1RTCoMR73mgzS1sCycBjGC+0q8bDd2E9scDjGpY2IzAjtMuQCWAfXar+hfaY8XOTJhWyVq659iUxRO6E8YX9C3lwqK/HID5lKg6uyhn7ct5Gn8vH+XJSzWq5QLjZB74f9CMvCM2GyXaQLbQF1EvZ9odzqPfUvLKRwm/BVLc+8ZzCB7RX2iMu90ggr6Fd+CpfL/EoYwQ9dIhNXaXCFN3SMroUXMEw+EPO45EXdSL7ihbLC9ApXHSpMWAj7EspKOBf+khnbziM3NQ5SYGtKMidHljCAB5g0FBoXDYeGWx2IEUdh3NNYiEeDkUFQHDVSnrlodNXBF405NLaKh0ylIz9k4acGrTLgp4s4ks+9JhaSk9JVg77vsX0mTUyWJO3kx2CIYw5UaNehrZEdkj1QZ4+rgS42g4Es9k4DmNCGhfIYlDDIk40kPwYxsjU8K0/ZGGxP1f7IjimOXPyRhwzsKf7YRN3zTFh4QdZoQMp7hQNSyY3hUk+fvG5nccaVOyeB6Zi4DDER4kn3YTgDXfAEBsGZMEkdQoxoQAoOuccVQcKzBsrqS9UvCwPIA/NgBZdn0nERl3ZBubjH5Zl7wpGhMksemCVcz3LDd5If7ayaXmHLuupvL//O7uK3zt5efOKancV5W3aVpAnkCR8uvnrnnmLnU9Mg+cbQJ1Tfoaktgr8Q79wzEddkHPvLfRgvtKtgEhxDNMiWCr+0Rd2DUdJho9Vu8AvDaVe0QZEl3ONHPMpBGcIJpu5pG9U2UNdPIEv9DbLIW+NeXJH3VVk8N8mjDMjUhc5mtVf0hB4oD/YHWxX2PZo/YJ8oF+HSA2VBf8SpK2fVT228iotYz034qpZn3jM6IRz98N7chzoUVupWlCoeMmRvZeeRFepPhDR1BSaRW9Wn5FGGat0jL7xIjyy9G3lRR/hRv+BY7UlxcPU+oV8KO4/81DiIhaepypkcWYLxxrDRCAA9DZDGSGOjwdBI1VEoDCDTERCPe+Ko4VUbadioMK7kU3chI4zLvWTRyLnHj46DvMILI0E45aOsVTkpn6sNmkHa2Vft8koTEyeTmGQu2lHEHKjQrsMBm2yI/LALmoDKfjAQwEZg6zRR5FkTUKWVzeCLiQbU+DGowB4pvG7wQBjy6uyc/JS+6mJTZUurYTyTt8IZZFUHTHVplvGjnlhVwpd7JqaL1vPQ4sfEpXCI3kM86V4Y1CRL9UO4+lT8iEcdM4AW2Ud9k05pqi7YED7BeDUu7SEk88L4IbYkNxyAyw+XcgjLdS7h6CHMK0y/7H3Y3+55dl9J5rEC6tade8ttOWzPof/97U9uLy8Ivy1r3rIzpPbY1BbBlOy17plsgm3wysWzwsAa8YVF2hn4xK5j+0kXtpMm3IJ34Vd9iZ5pc/jpGTeMH96HcbjXeLfqr+ewrcpvFXmkRWZ4UX7JDl36vdA2MQ4P3xOyqBouIqHODoWyq/dhG0+B2yZ8Vcsz7xnbDH7AjN5fdp506gvAHxjjWcSJ4oFLdFm189IfcggXacYz+lYbUPlCW92Epaqtp1zgQLJoH7xXX3aecqTGQQpsTUnm5MgSDazUSJZx6ZjU2dCgkVm9NFlZRD5yMbQYIRrtrLQKJ89l8pklt43/rAYt0oSvXefeuKtgYDelhuR3nd4exjZ1HnOg0qZ9rhIH+xMOWCSLgYXsEZPYqq0LBx1K09YNB/V1abB1DK4YvNZ9+alLs4yf7Bp2jC/4Y9/mMCRcMlDWxK9at/hr0E4Y9wzCwSiDX9KGacL4wlYYLnIwxHgoP4wb3tM+SBP6xbgXLkNbA1ECYcIqqLCf5cwdiD5Wm2jLDueLjR3LoW6GeN93W2QMq0luHWbDMMabal/gnfvqGDSMH95XZTeNnZEbtkPdV+XouUke7Vgy5IqUlYzQDfs63jMkVugrmfxLF2G4Jt2hrHn3dW08Jo77wJcIOupEc6V5OiCM+sH+co+uVUe4dfWkuMTH/oqMqcunauupP7BJvZGOi7LWpQ39yIc0oV+s+9Q4iImpKcqaFFmC8V1lYB+rUQxZTlODNmli0mCKhnTWO/cxUFnWvjAQqH69WVbW0NKFdu32vQ+XX+nDieis+h2q/5BwOTQsxSxviMsQa6yC4uwSiL1ZK6HAMXFOOm97ufITcsVbdvLrn90Wjz38NWb7GYKsWW08bO+r3PeBL4gHkRBVMm0IddJHGVPjYBUMOe0BuJLiuPJvhD/LKrSPxtxHYxhDnm0bNKQJS4I5CNYrTfIboC3bVp1usbq0bRvGQLhq1/giz38hGSvejcth4rKKR1aTgFO2j3GOWDVczxB/2rIDwcLKFG3ZmcqhxtJFbq7b4jDaYqrxe7XviY1P42sY+EqNg9i4mpo8kyWVf2mWyiCORe6iDZpBGmSJSBNIlKk1Mr/vYgTDmPTlgcpwByof2Lyj/DI/JjzqXYzL4eJSdRi61967p1xlwkqSA88197HasgPG2bID4bL5tt1zCZcwP9/H69PcFofRFlON4RcdUy/a9oyvYeArNQ4WxY3jH2vjTZaYLFlo/92yDVqkCQMzDqQzaXJsQ7RhGqc+PFAZ7kCFSScHZ3Jg5tjap3E5XFzOwiJ4pW9l5ciimOUcFD5qhFt2IGDcT6fvl9wWh9EWTZZMu55S1b/kLju3mtUf2D+u7TZZYrKkE7JEDdekSdwGLL3azVOvHggPY4A1a6DC4ZhMPsc2aTQuh43LefYezLLNhlUj9Lfz4taFkQaiRMQLsiBSIFS8ZSd+P+O2OIy2qEltbHdW31PXNpfxM76Gga/UOFgGO05z1N6bLDFZ0ilZosbHgIxzAdie45UmRxuk9GN3HDrxQGX4AxUmjkwYxzRRNC6Hj8umPoJtNfSvuE1x54VzFgqHyEK+/MaHtpWut+zE65/cFofRFmOTJJKXepJsfA0DX6lxMM/GO6zZnmdBlvziwV8q/8c0YBnLdfCW/6F4496/P5r3Ub1QVzEbFkuHQ9Jk3iF1MfO1rGbjYB2trqMx2rZrLn/P5OwahC7XWNrEGHE5xj531f6WjxKQHJB9Mf6FMIShtuwgk1VXtAsIxWVWsYylPa3yHmNsixovtnF3fe3XCq42cccYZ9U23oS9MeLr6189sfjp3f9gVJhJjYMmnDh8/ng/C7JkjJXEXvexLd1OWU8haXLaZTt90NzL8xtuyrqwbOt+Hgb4ujwvfIxhTBL5jyOz/k3rGN95aO/kPne23eIMExEb9LWx6lZbdvi3xKxi4cwTbdmJlYflzK7XMehG28b470xjWr03hrrJ8R349+fY+ph2LMf3dJnysnsmSxJNSj1wWw7oIk0Y2Jk0WU6HNrLWW0oMTJEsQZ+Q39ilGF/oU9bPVGW7z51v9+hb+W85YJiVIClwwspQtujw33W0ZQeCkf++kyI/y5xf50PRD9hkhRKrlby6eBx1mgJ79L2QsrYnxkgKfM2TabLEZEmWgxi+MDDIMmliozjPgDmse3xMlSwBa3yh91et7jHXpp2bLGlXL0w4WCUFoZFy0kEfTnthpUm4ZeeGrd6y0wbPU4wDNhjzrXrOzhR1N/Z3ZhUb2Fj0P32NXS9+v3b93qp6MlmSiCxhMOIvkKuDOCRN2Ht9+96HsyR3Vm2ITr86VqzDbnQ4ZbIEjHHGEhNN460bvLXVs8mSxepDHyNYbdLF9gdWZrGEPtyyQ96cgdK2jh1vsToeor6YFDN+Xva/OQ3xnV3m+bjGPoEJ7IV1NV9X1k8a/UQlSxDm3xEN/PGljxb7n/pLqyOSBt548xfF17e+UJz4iV2FdRtJqS3E3HfxcYWv6eigBSTK5fVt4o05Djbomu/+cMyvOLh3+93P7CleeuXngyt3nwV+5fU3is9ee6hAd7u+/2qnRTn47OvFjd97rvjDSw4Ub//w9uITX/1+2cf/6PDPOi2HM8tTA2Dj+LN2dI7LPLUx7VJdfPNTpX2Ythb89n1r4Li+CzDG/D2hT1OrkCZ37jpcDu6s4zQ6DqWaKJkOUUJdt/mxsoTfgR++Vux+6pU2SWbG2fbET4qXX19sgltNU32emVnEgJ/+7M3SBm179C8iSrWoVTRgsmR57UGUoD+IEwiUrn/067QlJkWUg+uCG58s7n34JwVtzb9pagBC7d2f31viAoz4Nz0NfGvtxRIDtgPTq/vc3rjdCDm3UmdeHibyXX+pyVwl0Ytn0iS6SjcINFnSTJZs/Xf/SbHv5rcUuF3o65kd5xQPfvk/S5LXBgDUeECWvP6zvysu/s6h4tK7/rwmRnuvW3c/V7zw6mJfktumQS5xU/0YyLPSzasZUml4MbkmSxbTVzU2k9Erb3+2xDSrOPv80aaYJLHahNUFrD6hbLQ5/6alASbJEGeQJq7/adW9+livNptWvef6tiZLEtQMxp3JvH/pNSDS5P/9wr7y61T6HKeTQxeT/6Hn8dBX/2EJCNwu3oXMUuXVBtlaWQIZMYssgaSATPnw9fvKONyzAuSOfT8u/T/99cfKrIj3xAt/VfpBwDx9+KcFYVzVVSvEPf+bB8uLfLknDv6URbLJ8+dv/qK49oFnilOv3luGSyZ5SQ7x+CGDtMv8mNBhd/zVcxntxU1jsiSOPpmY8LEHgiKXySnlYNtbuGWHtudJVJw6H4IUVhlBTrM9x7/xawDClPr26s3x1/VQ3tBkSYKaMlmSQKkNIk2aNChoieAuJv8p8vj+XScVLz5+VSfkRYryz5NJNQ6BLIHAgIj42kNHzvaA4MBPJAb3EBd/cOXuktzgvSBAIFa4zr7pkWMQK1IEF1IFQgSZ8oeMId09j71UppN8/PSrxicNfsha9oet5/KvXw2YLImrf/pTVnWwoiOnJfCUhYlzuGWHeyZVOZUzbm1YGhpgixhEHlcf28VcC91ogI8PEKM+F6wbfTuXdhowWdJOTwvFMlmykLqiRmbQxNderzRZXa3zJu05h5ksad4+VFd/bRDTdmWJyBLIDH6QEpAhuheZAbkBgSJ/zjDhqq72ECkiV/H1DPHB7yv3PlWuVkEGRA35SmZIlhCXFSf4rfJjYIet8UrCVbS4elqTJavrsCpBWyBy/sLL6hJt2eGgWE2yclkVU9Wpn1fXAKtLcsbk6m84bQnMn9iC5581kJMGTJYkqI1Lb326PNk9gWiLbKmBkDThS5R/i2uACTWrGF559o7iF//+b4uf/mRfceie3y8OH7qxWLvivyxXbnB+xstP3VK8+fPXir/9q2fKFR3hmRqvPXdf8ei3ji/+6sWHShms+Nh9/a+sr/qYl548SA/5gWzuKRNleONvXizlkTfyNfmnbH/z6vfLcOIfuOVftCqn0te55Ef+/HCf3Hrqen7E56fVHk36atLHvHer5lUtK3rl/Xln9M2Putt5zX9Xlpd76UNpKS9loh7a/ESWsG1GW2UgKkRWIIPtLoRDiHDPj7gcCguBwUW44uESFz/IDsiT6mqPMC7xJDP0Jy2X0kKEEF6XJ+khb1ilsupPS4Y9QVtVk8unh7B66vm/Xl6AU87UALjmzIgzrng8+zN6+C+ErIYBD6yMYdIFmeKzhWZW7yADhEkm1t4GOcgqrC005yVha7xKrFY99uxRAyZLEiif5WNeQpZAsUuIFGnCl0d//V1MgUyoIUiee/ii8gBTJt088xM5wKQcwoJnwpmQE0eTceLyDPHBBVlCfIXPS49MfpAfTPIhAzhMlR8uMiBSIHJUnr1/9o+LH+7+XFkO4ojUmZePylLn8k5hfo9/51+VzyIgSMNP+Tfpi7iz9NH0btW8quUlPbpAv7w3h85SdxBLug91T3oOjKXOuH/z2b2NF2RJm3gx4lxz24PF5i1by+vxPTui5/v56+6PJnPrvbuKTedsL147tCeazBg6nIqMD124vdi7ttu6b9GGF8VEaeCKojwvAgJiKOdGaMsOE2r6f/1nFcYEnmCrVofrUofUrQ9/HW4dhiWH6GTFkM8iCrXi+1w0YLIkQU2YLEmg1BVFMkBir6tJk/aKhKBg8h3+pxcRGLgKFyHBhJt70kBa8MxPxAbP3LMKhfum9MorTI98yUYGF2RAGKe6DacpH8mpc8krJGOIg1/4zrxjqI9Z+iLtPH20eTflVVdWdMAvLBtlQT+QPJBNvEsYzkoZrcxpM4nqkixpU56c4lxxw47io5c85Al7ggl7Uz2bLGkmOpt0OCu8NCr/4Q8rNFhhMsQJKpMwvlxTfm3ZgfjxiqSwhod3z9iOSfZQSLzhaTh9ibU60/9FNL2uncNyGjBZspze5qYyWTJXPb0Gwl6bNGlXBWw30daXcHLOBBtygHAm38QJL/wgLEQOhNtyRIAQ1pReccP0pIMUYIWEtsbwNvPIkqZ8wner3kM2sLWFH++IrJBsID4/6WOevhQ3fB+9o/JtejflpfihS1qIkdCPe3TFChLuWWHDO3Cv+CJ3Zk2WQn+TJfMnpUzar7op/iqYsA58v7EOTJZs1EksnJQGrvJHE1S+7A91yTwTs3DLzmevPVSuPvWWnUplD+DRh78OoJJmFJEVQpw1ZLJrhoLsnYUGTJYkqAb2yDKI8C9fDYSkCfXlZbkb6+oH2z66vkUjnICHZAlbSph0Vy8RCkgN04bkAJP2eenDuJLBKgiRMYTjD0FB/opTXVnSlI/SzXN5H1ZnQJywMibMj3ekLE36Qv48fbR5N+VVV1bKpFU7YXhIlvAObGsi/IVHvlxuWVLcNpMrkyXzJ6WHD+4pt+M8tHWXV5h0uMLEZMl8XLZp27PilEar5g8kCWQDW3OGvsWVyTZnmzFuY5UCK2c4e85bdmoqPmMvJtzUH/Xm3zA0QJvzga7DqKspl9JkSYLaZ+BgsiSBYhOIFGlCB8sSXZMmR5XMxLq6UgHSgB/kANtbqpNzVk1wBoYOcSWuJuO4IQHSlD6MKxlM8Kv/FrjNNpymckp+1eVskvB8EsJ5P84CUVzpo0lfxJ+njzbvpryUd+hCltSFQ25RNuJqW46IFXQsGbMmS6G/yZLmSemjO3YXJ35srXjhEZ9fEmIn5b3JkmZcLqv/0qjM+cNhm3wZ5hrLeQNszdGWHWweW3e8ZWcOCDIK8uGvGVVGQ1F0oKvH3Q2KcnDvGjBZkqAKTJYkUGpikXSwsNsmTY4qmok1JIO2cPDMKgV+mmSzSoEDVZlwQ5RAZDA51wScuLrHrRIg89JX45Ke1ResRtHWEcrGL1zpATEQloF08/IJy1e9Z5UKsrRSBuKElS381xrFlT7a6GuePtq8m/Iib1bMkEblEFkCmSP9UDeQSXomLkQP76SDXZW+zWTKZEm7SemWW3cW7z9/e/E3P2gXv43uHWe2Lk2WzNbNqrjB5rT5MfGh/2S1ydgmP2zZYaUJ/2WHd9SWHVak+JefBsAfHyyHeLZOftpMUyI+VLIqzdve0ujXUuNqwGRJXH2W0ljOSWfq3/A0wBclkyZH6o1JNCtEICf4McGGPGDyLbIEl20wCmd1hMJIXz3DA9Ih9JuXvhoXeUz6yYMyQORABvAckiWkgxzhJ6JnXj4iC2a55AFBwk95hnF5H5EpTfoK3x0Z4Tu2ebcwL+ojXGWDDvCDRMHlR91plY/KjC74hUQLYW0mVSZL2k9Kz/uTHQVXG706Tnu91unKZMlq+qvTqfxKY9HyD+QBYx8OUh/rYY28Ix/EeE+IE23ZGev7tqz6LKPpbB2fh5FX9UCQQJS4zeRVLy7NbA2YLJmtm6VDtLVjaQFO2LsGQtKEA3uHeojdKopkIg/ZEK5KYOLNLzykVJPwqbt960tkSVM9sP2putrEZEn8ySarSk769Fpxxx0+v0QT71SuyZL4+FVdLdOHMAmCMOHDw9hXXzBWYDLOVh1t2WGVDf7+9a8B8Meh/lxjx2L/2m4uAat+WKFlAqtZV46RjwZMliSoC5MlCZTak0gGPHxBggWfGmkCScKkmm0bTMRZicDKhur2jabJec7hWmUxC16LlL1vfbUlS9hKpa1T4ftpchS6W+/dVU4AmATUXYSH8X1/7KT1mX17yvNLDu3ebT0lPPDVZMmxuIvZDmfZxiZ/JkVsydHW1qb4YwjnnSGK2LLDihPene0grDb2RL3fGmZyTn348Nd+64HxNJd/1sCQNGCyJEFtmSxJoNSeRbJskEHPlEgTJtKslmBbBxNsiJLqSpNwsu37fvXFqh/+W8+8eoDQgeyCJKrGmzXBOvlz22uJEvxnpbH/0ckrhNKmc7YXrx3yga+pcFElS148uLv4Pz5156jx+eqh3cXje9Jv81q16+XQV77qcwAsZ4NN6ce4QVt2GDvwRR0CydsP+kGBD3/tR+/KlRVXtAFIRf+sgSFpwGRJgtpiNQJfFfwbnwamSJqMoRZTTdKmIHfW6hKvKjlKiDThYPOf7ig+vvmhUU/em3SQMvwzl+0o7r5r57p+L7xxa8FVlyckw59844Fi6wNHyD49P7zzCPFw131H/eX3je9uK/7s9gc3yNuxtqNQGMQFcZBHvtxLllzCqjLnyZBs5CEfOfj99Q/2Fpu3bC0+cOk96/nVvWsMv1j2H9IAwoBVF1Pc1ooetWUH4ujtH95ebt1hAjmW/yIUCysp5TBR9+GvKTVcL9sHutbrxb7D0IDJkgT1xISa/br+jVcDIk0Y8DD48xLbvOs6xqRhyjKqq0u8qqQ9USLcsPrhqpvSrwRQflNyOUhXZ8NARkAqQCbU6QD/J/ftLL5991oZDmnCShTFh2SBjIDsIN41tz1YQGhwVQkT0uCPLAgYxcf/R4/uKokR0s+T+c8+8d1aGdV8IUnIi/LyfsjHr+4dY/rFtOyQJExU2Q7B1pQp/5i0syXk4pufKj+uMWbUlp2pkkld4oHVPZB3PjsjvdYZL6NrCBP/rIEhasBkSYJaM1mSQKmZiqSuGezoi5lJkzwrKubkYYqyqqtLvKpkcbLk8MEj55fsXfP5JbHbUEiW/P6/u6ckPt5z8fdqyQStJBGBAeHAPfEpFys45MfzWV+5r5QHAaIVIiq/CBaRKfjjhzzFIf08mcq3KqOaL2WCIBFJIlf5pHJTWHRth+BQVPpQ/4pSD98U85WSAAAgAElEQVRae3H9jDRt2el669LrP/u74uybHlmvkq899MPi0rv+vLjnsZfW/cZyw3gNDLLSx2O3NLUKKchKe1ZQ+WcNDFUDJksS1JzJkgRKzVwkHS0rTEya5FlRqSYSU5Kr1SVeVbI4USKcPLpjd3ng6wuP+PwS6SSGG5IlkiciA6KCS/6sDmF1xievvr/cwkI8iAqRFsSDqNCqDeJzz0qPtmSJ0oTbfWbJfNd5d5dlq5IlkqF8q2QJq2E+f92Rd9C7pXBTWnS+6uvr/iLnGLz8+s8LJvX6Hfjha8ULr/5Mj6NwIUk4VF5bdvjPQpApqbfsbHviJ8X53zy4rsOv3PtUeX/xd8Z7KKcOf2272unpwz9d1w9Y3P3UK8XPJ3YOR6iDJ174q4Kr7gdufaBrnWbsNyQNmCxJVFv85wj/pqeBKmnir2Z5YCDFJGJqMrW6xKtKlidLwMyWW3cW7z9/e8G/Fp4ahlK9bx1ZorwgFbj0jAsxwcoM+fHMFhq23+BHmO55hmwhXGlFbOj8EVar6KwSySVMaebJVPw6GWG+vANl4tL7kIfyJY8UV2oLTh/J132+PrdZps+k7A+u3F1OUCkbqx6YrH7664+NjjCR7tmWoy07bNfhYkUrk/sUW3bQafiDmEK/Y/7prEG2Qs3T6R37flyccNHR8f2Hr99X4m/MZFK13nlXrT6i7YGXW3c/t2H1ESTUEA90PfVXri58WQdgQD+TJdJEZNdkSWSFDkycSBPONKHzjUma8AVtbF/RUldviknEFGUyKZ3ie8d+Zw4kvfAq6zKWXueRJbHykBwRJbgiLRQ2Rje1bZZ8yAD9q915k1XiMzFjkhb+mLDxlX8KP8YTrDLhqz1jDFafsAol1padKlkCUTIF3bK6SWfIzNOliAKwprFYuBpnChiUDsAFq2rQw7UPPLP+6joTJubYd1144hsTJSZKhAFBzWSJNBHZNVkSWaEDFcegj0EMS41jkCZ0SHRS7CMOO6aBqqezYvcxiXntkuOLV87+R74y1wH11DU+WFVy0qfX1g8l7Tr/seXXJVkyNt01vU9nRrooyi/62s7Kf8+Z9auSJTwzoZ/aVgjph4k9/5IY0oSxhrbsLDtRFVmCPrkXIaD8xu5qoj/r8FcRBdJDFY/yH7Nb1UHY/sAdxGeblWI56kgTZbsmTYRPkyXSRGQXtr/p60jkLC0uYw3EIk1YDsulQUzGr5xV0ZomBCnCIUoOv/yqr8x1QD2lqP8mmc/s21Mcf8ZagdsU1+Hzt5iYLJmvn1Xw04chZ/LPxJ+r7oyOcHKqg0c5a0P3fZQ5lzwZa7A9hxUS4ZYdVu60PRdGq3YYa0CW6OJ5Kj9WB886/DUkCsAdW3Om9gt1wKoanWEyhgNdTZKkI0nO/uc3Fecef0urbU7EU9xPvf3m9fsu60ft2mSJNBHZpZNaltWPXBSLy0gDVdKEfbLL/Ngzqs5pmfRTS7PKZGHZtCZLhkEU9UWWgCvOf9l0zvbitUMmTJZtZ6QzWTIuskT9E/9Bg5USrJoIJ/pMUHWgJCssmcyfevXeSWwVkW7aupBN6DHcssOKiXnbTNrKnkK8usNfdegt5BFjMcglEUxT0AnvKB1AUNIGeX/GpOCMVdRD/nU5GZ9aXjd8fFux87YnW5ElxFPc7162f/2+S50JxyZLpInIrsmSyAodmThIE3XCdC6LkCZswWGw6F97DawyEVs2rckSkyVtsLP5T3cUH9/8kFeXrHBAqcmScZIlWHi+8NNHMqZie4R/q2mArRGQTxy8CRHFfyphy5M/7s3Wa9vDX2dLmEYIY1pWg4XE5hDfvMvJ+NTyWoQsCXVjsmSILalFmU2WtFCSo5SdCl992N/ZhjSBvf+3l+0sv6SxFNm/dhpoM2mNHcdkicmSNpji/JIPXbi9uP7mI/9tpU0axzmWHDBZcqw+YuKjnYVNHwuihHEV/SQEin+rawA9smWHlQCMQfiPRJwZs8iWndVLMQwJEABtDn8dxtvEL6UOaB4D6RZO0n0fd0uOyZL4bW/QEmFXvcxx0FXYaeHpiBchTTot3Agyizl5aCvLZInJkrZYOXxwT3Hix9aKvWvH/ovbtumnHu+KG3aYbFphZc48/ORk/uknWRXBxJ6v2P7F1YC27HBWB+fu/fGlj5Z6XmTla9wS5Set6fDX/EqcvkTgZsgHulY1BEFy/3WPF5edcndxywW7iid3v1g8cu8Pi6988N717SPcb/697xaseCD8gt/+ZhmGy9YR/Na2PHHMORvLyiSfh7/7dK1MyhqGkzfngoQkz7wynfa/XFt865K9pWzKzPvgp/RN4Yo3y0VP6A7Z6DIkS5At/fF+13xk63q+yCMuZeNeK0vwQ4/V/IinuNUwnufpfp5MYcPbcKSJyC6dzFBPgo6sCotbQAMhacKAxRhaQHlzos6bDKQKM1lismQRbEGUcH7JC4/4/JJF9Ebcq27aUV6LpnP85hUpc8xqb0FMzvggxVYSf5RKVw0QA6w0Qc9MhrVlZ+ore3j/WYe/pquNPCWzpZwVSXzsG8uPyTWT+1de+Gk5SYeMYEL95hv/viRQCIeU+Nnrb5REAJN8DiCFlMCPiTlpIEt4FpGyjEwIG/L92mceKmUiG5k6+JR8Xv+Ln5VEjkiTw8/85Trh0VQmyvj8E6+UsklP2pCMaAqvIybkB1FC2dEdsiE80KnOIcF99pGflGHEJW8IFaUXQcKz7nkfZIaEEKSLdKC0VXee7ufJFKZNlkgTkV2TJZEVOjFxkCbsI2bZsbG0euX3MSkyWWKyZFHcbbl1Z/H+87cXbM1ZNO2U45ssSYeX1a1vOgn0kZy7wYSeSZt/6TQAQYC+q1t2IFQYr0zxp3Pn2Mo01R/b4oZ+oGu17phoM7lmRUQ46f7eVx8pJ/f4MdFnch+GE19EgPzxY9UEz8vIhMiAKJE83FAm4SHBAIlAPiJTmsoEWRGuyBDpo/yawhWvziUtJEcYFpaHcl/0r29fD6cchCu+CBKew3vkhu8M0QJZonR1bpPuZ8kUNkyWSBORXSa4dCL+WQOrasCkyaoaLHqZeA6BLLn8iis3/Gvj8y/4wga/Mf8LZOopJ6KBw1459DWnMuVeFpMl0yRL6BkgSTSBn/KkdfVecjEJbM1hNQErLH7jQ9tKl+epbdmZ8uGv13z3h6M40LWKfCbbTK7DCTl+rI5gVQP3kCLhCgz8WPEBMcLEXtf3154vV24sIxPig1+4igI5rGTR6hHCtXKFsOrVVCbekR8kBaRMNa+m8Gp+4TN5o7PQjzxCQol34Rl98064ih8SJOE9K1UgiRSPshOu5zq3qT5nySyVUxSFyRJpIrJL580k1z9rIJYGTJosr8k+JntDIEvOOedTCxEjm7/05eKxg08slCZ3oiU3soR/I3zSp9eKu+/yga9t263JkumSJeoV2I7DdgAm72zT8a87DbCyRFt2qAO27GgMPIUtO7z/1A5/1YGuY6xfJttMrqsrOpj48yOcCX51gk6Y/AnTJdJlUZms8uAXniFC3mzNgYgQmaJVJHUkQVOZSEM+vCtED3Kr79UUXpcvfhBL4coR/CAlRJaQH6QHhAm6ZWVJG7IEfVBOSCJ0UN2WU1eeJt3PkllWgMkSqSG+q44ivmRLnLoGIE0YkLCPmA7Lv2YNtJ10xYyXK1ny7dvvKCA97rz7ngKy5Lrrbyzdh/c/WpIgWllCvFPe9/4yLoTHzt17y2fCn372ufKZ9DwfevLpMq1ks2KF+CJKbrn1m+v38svFzY0sAYPP7NtTHH/GWunGxORYZZksMVlCL8Ckla0RbM3Bner2kOYeMW0MbdnhjBOIE8YqHMw79tXWvB/vy4qLMf90oOtYzwtiss3kmvM6wok3E31t9xApEoazMgIiI/TjWaTLojKZwNcRDiGpQDhkQ5gn4VohMq9MyIekwFV6nZFyxj+9ofSfF640s1zy1rsrDluZ0J2IIFyFQSq1IUuIz6oe6qe6dUeyqm6T7mfJVDv2yhJpIrJrsiSyQi1ugwYgShiEmDTZoJoNHn1MEnMlSzZt2lSIGOGelSKQH6d/+CMloQFBApHx3pNPLl1IFa0m0cqS5398uDj11A8WuIQpjWRDnmjVyra1HcVVV19jsmTB/1bCyhJWmLDSpA/8DilPkyUmS0Kjz78vZYUJHxV8SHqomX7u2aoCecX2dP7LDnXDlp0xrgCCKOL9OIB4DP9Gt4oYHej6rbUXq0GjeWbizOQaYkSTeQgFJv/aelNHlrAig3QQDcjARUa4smRRmeSHTBEalAcZnNOhCX4Yjn+4RaWpTKzQgARCFhdlRb6em8IVr84lb8pSLTsrSvBDNmQMaXkmLu8iWaTXKpTwnnBWlZCeOpEulA6iqEryIHee7mfJFKhNlkgTkV0OHBvT6dCR1WNxETVg0qRZmX1M/HIlS84862PrxEV4L8JDLsQIBApEB6QIBIrIEggQ7rU6RGlCedxDwnz23M+trzxR/JzcHFeWCK+cXcIZJnq2W08KmCyp10sMvDRb13xjaKsAH6/GuF0gX83PLhmrfagXxsjhlh3OmxnTIb2M/1llMrbt+BBBbDka84+JM5NrJupMsDXRxhURUkeWMOHn/Awm8Uqjyf4qMjn3RDLRO6szRAxQHsL5LzOQDcQLV7c0lQmihNUplJf0vG+Yvilc5ahzyZuyhTpEH+RFfFaFKIzys1JEYYSHBEl4r7w4lJX0epZLmfmJ6MIfufPqU2mrMoVzkyXSRGSXZXhjX4oXWWUWt6IGQtLEB90dq8wYk4ZFZeRKlmjFB4RFeC/CAxdyRKtPbtpy8/rKEJElrCaBBBHpoVUooTxWpLAdJyRQFD8nN2eyhP+Kw3/H4b/kLIq/KcU3WWKy5FiLf/SJCTgTc7bmjPlr+NE3HtYdqy8gFNiyQx1py84YVgSxcgZCCLJuDEQQW6lYMTP27W2aXGvFhc7G0IS6yYXAqDt0lQn7KjK1CqMuf62m0PabapxZZSIeYcieJb8pvJpX9Zky1elD8arnmsi/yUWfkCjVeNIFZI3C2uq+KlPW1GSJNBHZNVkSWaEW11oDkCYsd+XfDo/tq0ZrJVQi9jFxHDpZAmmi1SWsJIHg4OwRyA/IEs4qufiSL5aEi7bZhGQJ8dmWA2mSEzlSLUvOZAm4PXxwT3Hix9aKvWu7TZjM2MpkssRkScXkb3jkfAUmelxj3P6x4YUH6kE9sWWHemLLDv+adshbdiAWIOsYjw35jA+t0prCCi0m2OHkWhPuVd0UMlct0yrpdXYK71W9RAqtIn9eWlaN8JtFDlXTttF9nUyZUZMl0kRk12RJZIVa3MIa4MuMSZMjajNZ8urChAWrS0SShARDeHArpAlbbcLw8F4rTkK/3O5zJ0vALkQJhAnESR9Yzj1PkyXDJEve3PtXRdfXlut/UBz/0YeKK75yqPib3a91nn/X7zvk/Kifrbf9qLjwsoPFpo/vKi/u7/76D4vXHnp1UHX30LeeL048c2dx1VV/Pqhyg59n7vtJ2WYevfPFwZV9Gfwz0W4zua5OyJueU8hsyjNlOP+FRytSqm64BSZFGVhRwpantrLb6L5OJvjhZ7Jk4SlouwQs92TpnX/WQN8aMGlS9DLBzHVlSVdkBdt4+E87XeW3bD5DIEsgK9iKw5YctubkTl50Xb477thVnPcnO6yXGStvVqmPlP3XMhOZGGkOr/1F8fELHy0nr0xiY8i0jPTE1wtb/6K47cZnyrqD8Hr/uQ+XpNdQJvHg7qP/34Gy3LzLEDADKQVRdceWZwdR3iHo1GVMbyti6pg+0GRJopEA2x9MliRSrsUupYGQNIHMG/u+01BJq0wWlk07dbJkWfKi63RDIUvAIYe9cujrspgcazqTJekItNCOxr6POaBdRhZECRNBJrBMZJeR4TT9TXwgSVipAWkCeQIBBpmSOxHB6iZWmQyBgKBtbL7iCbeNHlbB2bb0Z1tC3dPvmSyJ3fv/B3kmSxIp1mJX1gD/xo99wJzUzl7gKZAmfUwSTZYsvvWna6KE/IZElvBvhDeds73Yeu8uEybBKgqTJSZLwsHtIvds9WBLDpPX6//0KU8KBzopZAUE23OqW3bYxpPjlh22tpx0zu7ivM0HsywfbYh28aHz9nm72kDbxCJ20HFnEzNMukyWrDz1rBfAfyPhdG//rIFcNTAl0sRkyTCIC5MlzZPeZ/btKY4/Y63A7QPXOeZpsqQZN8vWW8r+K6cBOpNXViic/Jk9xVC2deSkv9zKQn1qy87bT9te1i1kWE51C1HHqg1WN+VULuoS4olyecXV7El0bph3edLUFX2gyZJEIwFteUgk3mKtgWgamAJpsuxEYZV0XlkyDIJmSCtLhEfIgZM+vTbp80uuv3ln8aELt5cXuviND21bvzgM12e7xCFQonU0NYJyHNyzNYItHaxQyHFFQo46G0KZICNYKQEZRv1+5ouPZbNlJ7fDXw/dfXhSB7oOAb8uYxoipI1e6bpMltR04DG8TJbE0KJldKkBSBNWQ7E9h//m9NOfvdll9knz0iSzS9dkicmSlHjj7BLOMEmZR86yD+3evU6OhEQJ9xyGm3PZh1S2lIa5zUC1jziQJGyPYGsOX9j7KIPzTDc50pYd6pjVE2yHYYUHW3b6+g9JuRz+im7QyRDOU3EbSddGrNujuqUPNFmSaCRgsiSRYi02uQZeeuXn5eHEx5+1YzSkSR+Tk1c+/evleRiQJmO5LvvImaN5l/U6+fSvD3JizcoJ/jvOlIkByKIqUeJVJXFWlMhmpuxwch+Q773jx+VEmkMu2daRe3ldvqMTnEV0Qd1y6CoHxLJlh3M62LLDCotF5MSI2/fhr7y7D3RdDkcx6t8y8tM9faDJkkQjAb7Sv/vzexNJt1hrIL0GxkSaaOBvd7WJFBNT63A1HcbU3wuPHDnwde/a7knWS93qkimTRzGxJVkpe5ohTAxYacDEma0b/OeVvlYeDEFXYykj22KqW3ZYadHV+R2QN30c/gpJ4gNd85usj6VdDfU96ANNliQaCTDR/N3P7Ekk3WKtge40MAbSRAN/u6tN9E2WrKa/FPiDKGE1xeGD0zzwNVxd4lUl8fGZsqcZ0uCZf0fLChMmsUymh1R2l3X5CTAECVuxtC1LW3bAQEriDNldHv6qA119Ts/yWHE7G6fu6ANNliQaCZgsSaRYi+1NA2D60lufLtieg/vK62/0VpZFM04xSZ2iTJMl8SejMXCkw05jyBqajHB1iVeVxMfnorZ2kfhDnFwwqeQsEybPXa00GKKexlpmtuawVQbijP4QN+WWHR3+ykqXVDrVga59bDtK9U6WO07ioo96pU8zWbJIz75AXJMlCyjLUQelAUiSoZEmQ5sA5lpekyXxJ6Ox6poVFhz6GkvekOTw7l5VkgabKTunPga+MfLk6ztf/dmaw7+njSHTMoY5uYPMAAv8lx2RaLG37IA3SBn+tXXss3N0oKsPMh4m/mw30tcbfaDJkoQjASYW/lkDY9XAkEiTIU38ci6ryZI0E9IYdf7aoSPnl2y9d9fkCBNWl3hVSRpspuy/hj7Q59/RMoHl8lf59JOW3PHCSiOIEv4tMcQJBApESqxtWxBzyF32P9VUtw3x7ANdjdvc21Xf5aMPNFmScCRgsiShci06Gw2INOFfDrPihFVVuf1iTEYtY2+57Nh6SDMpjaFXSANWWDyzb/b5Ja9dcvz4/qPRiP7j1Pp/aTr7HxXUVQxcrCIjpS3vexAcK38dAMtWieqENFYeljO8SS0EGthgVQj/ZQeXLTyrrA4hLSQMhEzd+SLgbxYG2ToWroSCyIEsMbaGhy3XWXd1Rh9osiThSMBkSULlWnR2Gvjpz94s/9UwZ5pccOOTWZEmq0wWnPYoOeCVJUd1kSsu7rhjV3HSp9cK/rVwXRmZjB9++VVfA9ABdVVXh136pexoxjTgZ1UB/3qWL/+zVhLM8h+THvwu9ZM4CAxt2eGQWG3ZYfvLomffIAtiDhmsbgp1DgECIRP66X7Tx3eVHzwuvOwIacJzHeGi+Hbr69J6mZZe6ANNliQcCbz9w9sLJpD+WQNT0kCOpEmXk4sx52WypJ6AyK3OL7xqR/GZy+rPLzFZMhyiyGTJ8AblTIiZhLKKIJwEb73tR+VE1dt1hlenKSbH/Hclbdnh7BtWi0CA7L3jx7VER10ZwBqEiQ5/5Zk+Gr/q6hKwSFh4Eb9Orv2MUWPgKAaYv5ksSTiL5V8H57glIeErW7Q1sK6BnEiT3CazQy2PyJKtD2wvLrxxa/Fntz+40pfvb3x328Lpq2nuum97rYwXD+4u/nrG6oqh6r9tuVlV8v7ztx9zjsejO3YXV920o9yC45UlwyBMTJYcHbAOafCuL/9svWAbBs/6qs/5JkN6F5e1Gwxqyw7bYsANq5TabNnR4a/vOnNH8X+fsWOdDAF3Yd2JrAvJkrqVKWEa33dT99Zz3npmUmOyZH1qF//GZEl8nVri8DQAaXLj954rONOE7TlPPf/Xnb9E20mm481fOSGy5E++8UBJUGzesnUmISGy4tVDuwsu6fbxPUdXPJBe/nKf3Ldzg5/CfvToroI0ko1/GH/H2hHZkCSQOSJS5C85U3BfeGRPeX4JJAmHn1J3J39uu8mSAWy/EZllsiTvQXTTJIfzJSBHmJSGk9Tw3IgmGQ4fNgaWqT/INcgNtsuwZQeijfNG2LIza9vMb5527KoRCJdwZRPbc0IM6p54/k8408PYMricahomLCZLEk7bTJYkVK5FD04Db7z5i+LrW18oSZNPfPX7nZImU5gcd/GODLCUD4TEWV+5b/1Z/rinX3FvSVR84NJ7SnLjk1ffXxIm19z2YAFxIZIEl1UqWi0CCfPtu9fK9BAioUxkEQ9XccIyfP66+0vZyAjJktA/lDeF+4e2Htmjvj4wPn1b8dLZv+rzSgZCmJgsGf4khhUDTEjVBnHZdhFOZKc6CfF7t8M3W3Yg2DjUFexAwLH1RueVXPYnh47Bl7AGQSIds2JF/nIhYtgKVN2yozR229WP9TRuPTHZMlmScMr5h5ccKA4++3rCHCzaGhieBvogTaYwMe7iHRlkKR+IjnBVh/xxWdWBSxyIC0gOSBK27eAnkgUig0tp33Px99bJlXAFSihTsiVTsiQb8oX4hLMSpeqvvMbu8h9xOOhVA2O5e8/8P02WmCxZb3NN7SBlDzOFSQYTW7W90GXiO4X39zvGn0hCkrDNBmy97bTtxVsrZ5EIZ1pdAhkSEnYQJ6xccd3ErxvrdHw6pQ80WZJwJPDHlz5a7H/qLxPmYNHWwHA10CVp0jQhcPj87TfSD4Mw7lm9EZIZkCaQIooHIcK9XBEbrDAhHq7C2SpDOM8QH4SzcqS6skSy5EqmyBKRJHomnHJV/VXGMbtb791VHH/GRqKE+vuzj/6hyRKTJetttakdpOxhxj6xYDWAJq51rg/YHN/EqmtMP37XS8WJZx09q6SKM7bvsLoJf85B0WqUrsvp/Iz1oWKAPtBkScKRgMmShMq16FFp4M5dhwu2rZ1xxeNJCMamCYHDjxId83TBgItwyBJICy5Wb0B4hOeS6IwQuRArxIO4IG31LBGl15kkSheWRX5yJVOykE15FI4stv1U/UOZY70/fHBPsflPdxRvP/3YfezU33kf+bzJEpMlgyNLzvuXtxSn/srVg7r+6H+6pnjv/35TeZ30mzcX/8//9c3yetfvfrf4l++5uzjhd+4Y1Pu01T91NdSJ0dBw9of/858Wv3nqgzNJubf/wX3Fe/+3m4r3/ePrR4W13DA2NNy0bctji7cMbphsmSxJOOWELNn1/VcT5mDR1sC4NCDSJDbRONZJcdfvJbKki3xFnIiUCcmYLvIfQx6QJlfcsOOYVSa/d/qfmSxpIEtOed/7s9CRzyw5+jWWQbsOvrWb939zoq6GSpYMDWe3rz17DFHy+1/YW3zuuseLG+78QbG2/4XRtpncMDY03EzVhi6DG2ZZJksSzjX5zx9M/vyzBqyBxTQQmzQZw8Q3h3fokizJ4X3HUobXDu0p/20wW3Pe9qH7i+dfeqWXQfTTzz5X3LTl5uKz536uOP+CLxQP73+0OPOsjxXXXX/jennuvPue0u/yK64snv/x4YLnQ08+XYbj8sxA7777HzgmXhvZs9JQlosv+WKBjG/ffkdxwgknFpu/9OX1MvU1sDRZYrKkL+ytku8yE5JcyJWhTXrv3/vc6ImROizmhrGh4aZOp1PwWwY3zF5Mliw2h1sotsmShdTlyNbABg1Amrz783uLVVeajGXS2/d7mCxpt12p73qalf/f/GBvce1HP1g8/tThXoiAxw4+Ufz/7L39kx3Fuec5f9K9ETsbE2b2/rDrjZ3FcXc1Edea3ZFnB98dyx4bh7FswCBZyCDM20WLfNsyFthCGCFzJbDAZgQIEA3q1uluNcK0EchIQrwI3BgJGwNrgnXkxqfaTyu7us459V5ZVd8Tcbre8q0+mZV1nm8/mXnZZV+MRBAEkiuvujoqB+IJwsnM3Ly74opvRucQRRAxEDgQTvghx5ZjRBPiIqZwTLhxaY+L84sDjyyLNvIsudjOV3XKJZ7IYiDLGAnbm8Q3tPIYJFnaQpVh1c7a0c7ytLGXnnzb8fXbz88fOLni2L+WZV/tprvthleexJISX/zxpCSWxInoWATyETiy8J778u3Hoy/7WT/DjEedv2gUpWEhsSQbrzRM6w6Dt4Jv2NS5j6CxZcv1Uf6IHHiZkD9bO7ZznDfhxEQV2yJscA3vD74mloxKe1wcymbeJBJLLrbzrH1tlvAyRtphYGTtI/IYslnaQpVhZfS2o01mbWOIJDff/YJ7aP9vl8WRXz102n3jjpnl4yLtSu2mm+2GNsFHYkmWN3vGsDsOnHEPTp7LGEvBRUAEhhHIK5rUbZB2NT+JJReNyLbWcchiCYKGeZHgNaA8iBMAACAASURBVGJiya57djv7YrghrJiwwdAZvFDGCTHj4kgsSW7bw/riMs5nMU5kjLTDGIlETs1Z0pggnVXYamv4rGIJfc3g4JvLYsk7U793u+9/2U3sXpBYMmYOr7a2kaRy52k3vOsklpTxxh+Sxu7HXnd89REBESiXQFbRpK2GbdPlZglaBJJhX643XUbln2zkDuMSsliCQIL3CEIIW4bl8IOHITSf+9znlucu4RzXmWfEwo0TS8bF8cUS0uWb9GOrznOas0RzltTZ3srKK49BkkU4qzKsRLl2iHJ52pgvltx130vuw7n3JZb0SCihf8vTbrBeJJaUa8OtSE1iyQocOhCB0gmw2hTzmTBE5+nn3x2a/jDDUefHG9rrb5pOFEs4L37j+YXGqEmxpCxjrC/pSCyRWNLGtp7HIKlSAMmStsSSfogleJTw/cfbptwTj5wp7F2idtPddoNhIbFkqHlV/ILEkuIMlYIIpCHwwqk/RKLJF7YeS1yBKjSDtU3lGeZdIq+S9gkltDuJJe34UYeRLLGkm2IJkxkniSB4UDGsLOlam86FLJacm3xvpGHcFaN3WBvDWw8vuja1p6Sy5mljzFsy+auzK+rfn8NklKjW1XZj3ps+46Rz/vU27+dpN9ggEkvSWGI5w7CSB5O86iMCIlAPgWGiSZvEiRDLGvcukVdJO4USiSXtEUr4QSqxpJ1iiT9JcZJhYRMR+9eYd4eVosbF9eOEup/HIBllqJZ5bdeu37p1m2fdwX0rjWbLoy1iCUucj6r/pDbG0ELmhGJCbOaAGhU/9Gt1t7G2thvaySgBNmky8y70QcPab552g/UisaRCG05iSYVwlbQIjCAQF01CFCDaVKa4d4m8SiSWDPsxovPlCTISS5oVS5hDx5a0tv/UM1Ew562d4w1yZGqwfEw4RA/CWRj2CWfHGLIc+//hRyzBSBllqMTTwQjinBlD/n+EreyWZ53bPAaJiRVVbzF6bQ6uJNGkCbFkXBujfv02Rrth8mu/jXF9VBvjGiKJtQO/rdg5tvF0RrUxwg9Lx0+ziv2621gI7QbW1lasruzZ59jqynhbO2HidOuzqF+/30EsifdFVqeWnx/ez9f6RMvPtvE8yNvvu4hn5SGO5Wfxq9zmaTeYGhJLRhhcRS9JLClKUPFFoBiBU2996K776ctu3ZZp9/AvZ9xHp9tr5DYtrph3ibxK2t2GNAynPDGjyh91pC2xpFmxBCNh3bp1kYCBcXrtxk3Rf+QxMDBMMDI4f9+evdE16oz/5H7+82ujSYoxCJiAGAGEcGYUkCZxEE18cWSYWJKUDvl/af36KD5bwuAtgOhCOdg25T2QxyCpWiSx9H2jN0k0aUIsSWpjtBdrY1bPnKNuMTwR5JgIm3qnXdJ2aGsYqoShDdLGbvz+TdE12gPh+eJhEjd0k9KJtzGOaVPm1UJepEd+dX/rbmMhtBsmOUf4oL6pa+qCNkE/Rf2xT51zjWNrJ4hk1J3fTqyfWLNmTZQOYWwlOvM24ZrfhqhjS4Pw1h79urfrlIE8rFy0T9KlrLQf0iUe7dAX8fy0qtjP026wQiSWFLPFRsZmwskbf3ZyZBhdFAERqJ7Aybk5t3niqFu7acrtOyDRJI/wYt4l8iqRWFLFjxiludrgkFjSvFjCj3/aJj/8zZjASLH/6vNjH0MAg9b+s2/GBnFMsOCaXceQIE0MGH+4xDCxJCkd0iIfM1zj6Zn3ShPP1X/8948se2+YINGGLZ4mX/s3e2o3/K09UM+2ChfGZFIbs//yW7vx2wbtya5bmr6xanEIh4jit42kdGhjtGvaGOlYG7NngjSsTftp1bEfUhurq91Yv0KfY/VH3SCgwJy6Zx8Rw0Qz6pzzCLUmSvjthPq1+rI2Y/nYNeun/HyJY+3A4iflQbshHd+7hfCWV5JwZ+lVsZVYUr29lTkHGwqQOaIiiIAIlErAxAGJJsUM/VvuGmgFnLPFGFpbbGorz5LVokQVP8rKSFNiSfNiiRmYGK6IGdQrW44xSDAY2GdrhqoZGxgIFsdvD5Ym5/z9YWLJsHQwVImDcWRGK0YU5fDT9fOuYz+PQWKeH1VvkzwEEHJumTjhmMSTstfByM/D6op2ZJ4aSW2McNbGLM6wtmHXycdENUubc2asWjmGpYOhTFlIwzyj+tjGQmg3Vqe0AatL65cQMqgjjhFF2FK31mb8tmV1ztb6Kgvrn4tfi3sSWXksvWF50IZoX7Q5a0OUnzLHBRdLq6ptnr4JY0SeJaWaZCsTk1iykoeORKApAnHDFNEEw79KT5P3t6+J3OgxePQNlwH1FG8fXT4+f8MlnWuPb2z6jJu/9u87d1/UVdNtsco+O4th3IQR64sOGAIYjfyIN0OW/8bjbcJ/TxkWYYYsRgEGAgKGGaUYFmYo+EaGv0+6lgf5mMGTlA7XzNOFNOw/yWwpC2WryuAYl24egyRLWygSNm70mkhiaTbRzqwN+Mam38YwLO0/9NbGiGNtDLGM6/yX3tqMpUldYfRynbZIfNK26xaeNhZPh2vm6UJ4C0sbM4+TcW2hqut1t7EQ2o3VGXUYF0voW8zbhHq0ukI44Rr1b+2AuOaRFhdErL34W/bJ20+D9C2u9T3+dcuDsppHC20J0YT0aG/0U3bMuTq+edoN70CJJRX+EpBYUiFcJS0CGQgMMzjOvXhsWTTZ9cDAvX/yWGnGif6DX8/Lr+gLNoT/3g9rnzqfzotnfmrObdg2XdqzK+4XuWfoZjMHNQM1zbYJIxZj1IwKfvSb2MGWY/oehkuYYUB4zmE8mDFj+5YO14ftk67lQThLw0/Tj4uhYXkTxr429MeO697mMUjStIEywpjRGxdJLO0m2pnVKW3KjNy0bYw2Z23MNzwtTereBDgMVNoGXwxbriW1MT8dtbEl77YQ2o3VKXVu7cTvl/y6sv4J7w3qmDi2b+3BbxvsW/p23bb+Ndol6XHNvEL8/iYpD4Rbi0Na9qXvtHZo56re5umbeLFJLMn8ek8f4Y3Fj90Xb55PH0EhRUAEKiEwzvgx0WTNNVOuLNFEYsnFl2LVL8Ai6UssuWgYj3tOQr0usaS6OqykQ/5romagptk2YcQW6Vf6HDePQZKmDZQRZv7g29Fwm2FpqZ21471ddxtTu1lqF3gnIZTgxeKLam3p7/K0G15XEksq/CXwu/N/dl/YeqzCHJS0CIhAGgJpjbwyRROJJe340SWxpDpDO+1zVzScxJLq6jBN/5o3zDCDNem8jNh29KcYTXkMkqQ6b+Kc2lk72llobaxP7ca8VtoikPjlzNNueL9JLMn7lk8RT2JJCkgKIgI1EMhqjC2eOOYm7l2a0ySvp4nEknb86JJYUp2hnfW5yxteYkl1dVhl95zFGO6TMeL/uG/jfh6DJEtbqDKs2lk73tuhtTG1m+62G96BEksq/CUgsaRCuEpaBDIQyGuEmWjC8BzEE47jaX10ej5alpitf01iSTtenhJLVrZbvw23ZZ/lrFkavC3lbVM5M3SzmYNmMXpljLSjP0XcCc2QVTtrT9tJKw6G1sbUP7WjjeVpN7zYJJZkfr1ni8CSZPqIgAg0S6CocTJKNNl3YMbxnCOm+PlILGnHy1NiSfvFkoMHZ6OJmv3nT/vl1GuVPbeM2Hb0kWkNWAuXxyDJ0haqDCujtx1tMrQ2pnbT3XbDO1BiSZW/BJyLjKiKs1DyIiACYwiUZTiZaMKSw4gjzHHCPmIJX/7DbXlJLGnHy1NiSTlGtbX7JrYSS6qrwzFda6HLWYxeGSPt6E/lWdKeejJxq41biSVqZ3nabZ52w0tOYkmhV/34yPIsGc9IIUSgagJlG3AsMcxcJgzPMaGELccIKOTXRrHElo7zX0L+8nH++a7sSyypztAu+7kblp7EkurqsMq+WWJJNw2ePAZJlrZQZViJcu1ok6G1MbWb7rYb3oESS6r8JeCcW7Nx4P708acV56LkRUAERhEYZmQVOc8cJb5XiYkml9867bjWRrFky5brXVwEmZmbX3XOwiCknHz1zNDrFi7krcSS6gztIs9XlrgSS6qrw1H9atFrWYze73xmTzQXBkZJF77/9TP3u7X/x6Pua/+mW/dF3VBXWeo2pLBdame0LdrYV/7t3k48M/5zH1ob60q7oa38p78/4P7hC4+59X/3c7Wb+T9GrzmJJUXf9mPis3QwE73a58+f/sX9/oOlY7Zzp85HXztn4bQVAREoj0AWwyttWJurxEQSf8sQnbaIJXiTIHogiiCWcHzfnr3LIoh5lnB94oc/iq4jfnD81a9d7m697XZ35uyb0bF/PWSBxC+bxJLqDO20z1LRcBJLqqvD8nrh1SmFZCTXVZbJh99w3/mnX7u11864Xbt+6xan3mutsFAXM+Xzx0xt5OShRXfLxAl36ben3cTOV9TG5rPx60t7+2jufTd/8O2oH6JPor1c/v3nozZDP6W+aand8OaSWLL6/V3qGV8sOXfhY3fDg79xB+bejPJge/D42xJLSiWuxERgNYGixlg8/jCvEl8weeza/9wKj4vLLvtiJJbgIbJu3bpIDDkyNXDXbtwUlR9BBHHhS+vXR6LIHdt/EAkjhEdc+cWBR9xbby+uuu4LEiHvSyypztCOPzdVHUssqa4OV/em5Z3pi1Hy/tEL7uG9r7l1m2fd+q3H3MF9Zx2GSl/uX/dZj7GO4esLcbQ7sa+HfRs4I34cevD1SAxBFEEcob0g2tJ21CcltxXeeBJLynvvJ6bkiyV4lSCYxMUSO05MQCdFQAQKE6jKSBuVbls8S6686uplUcffN5HEtniQ3Pj9m9zjh55aDo8nyW9OvBIdJ10PWSSxskksqc7QHvV8lHlNYkl1dVi48x2RQBsMjCJlPDf5ntt25wm35jtH3dYf/MYtPP6OjFf9l7/0NoABjAiHGIcoJ6M32egt8iy3MS4eRrQH+h7aBl/2Oce1Nt5TE2XmFSaxZMSLvIxLX9/+a3fi7AfLSfliyZFX3nV8f/36++6O/3ZyOYx2REAEyiVQpmGWNq22iCX+PCX+vokkbBlmgyiCBwkCCcN0EBtMLBl23QSJkLcSS6oztNM+K0XDSSyprg7L7YlXptbED9868jz6y7fc5m0LkUiy8ycnHaJJHfkqj/4YyQgieCiZtxKCieq/P/WfVNf+kBoEWgQ0hmHRNtQH5W8bvLUklqx8d5d+9K0dC+6FU39YTtcXS9jH24TvrY+cWA6jHREQgXIJFDXG8sTvklhiw2wOP/NsNDzHvEsQTX688+5ofhOG6cSvhyySWNkkllRnaOd5bvLEkVhSXR2W2xOvTC3pB39bz2G88h/by7bMRV8NtclvnLS1DdRRbobW7Ln3VDTnzYZbjjuEuTryVR5htWeG1DCvCGKIDamhPWhITfn1xFtLYsnKd3fpR6PEklfO/THyKGEeEyZ61UcERKAaAnkMsKJx2iKWPP/CwvKwGn/fVsGxLXOUIIb4YRBROIdnSdJ1EyRC3kosqc7QLvoMpY3PMt5804ZXuPR1Xk2PvJRqFwww/mOL9wj/ycWbRMZr+cZKF9pJ0XvAOMYwtiFdGkbRr3b22uF3IzGWiXsRZJkgmiE1+/ac1vC+iof28baSWFLlLwHn3DU7X3KzL1+oOBclLwIiMIpAE8ZRW8SSkIWMOsomsSS94dzEc5QmT4kl1dXhqH616LWiBmST8XF5x1jBeMWIlZt7v4zXutoe7cpWtmH+G7WzfrQz+hc8iJiA1YbUUP8aUlN//fOek1hS9G0/Jv5te191j88ujgmlyyIgAlUSSGNwlR1GYsmFZY+VOkSPvHlILKnO0C77mRqWnsSS6uqw0n654v8Ilm3Q2jwR/mSaWnGkfuOl7HoNMT0mA/bnvdEyrt1tZ/QhDKnBQ42hNKyqaENq8FRTH9Ns3fMOlFhS5S8B55zEkooBK3kRSEFgmJFV5XmJJRJLqmxfSvuiQCCx5CKLsttFiu41d5AQjdSkMmGoYsjg+s5/ejXUplnjJamOunIOoxlDmbbGEAsZyt1rawypYU4jf0gNwpiG1IRZ17zgJJbkfs2niyixJB0nhRKBKgmUbUCkSU9iicSSNO1EYYob+hJLijMc1g4r7ZcD9yzhv/sMtbn029PREsAYOV0xynUfYRlmGM/+5MCqn7Dqp0h90I8wpAZBBBGMemZIDXWuPiX8euYdKLGkyl8CzrkdB864ByfPVZyLkhcBERhFYJghUOV5iSUSS6psX0r7okAgseQii7Lbxah+tei1IgZIlXExYlhhgmVZ9d/98I2ZKttClWkzrIv2RTujveFVUmV+Srv6townEJ5n8SE1HGtITfX8q2jjvOcklhR924+Jv/ux1x1ffURABJojULYBkSY9iSUSS9K0E4Upbuj7YskbC7PuGzuechP7Jt0Th6cLrZBDGkn1Qx5J5+3csHh2ve7tuPKOKk+VvXYVP2zzpslQG5bd5D+/DINgIsW8aSleO42iuurN2pqtoMRknnXlrXzKbZtMuIu4iqcIHiNWp3iSqF7LZd1U2+UdKLGkyl8CzkVCicSSiiEreREYQ2CUMVDVNYklEkuqaltKd6XAEhdLHnrsiHv1+EyioHHh5Jx758RcdA0RgWPCEod92D4/M4iEFhM9uDaYWlqamLAbf3I4SoP9Xx2ach+eXipPPJ7Vk58HecfzsjT8MpvA4ecxKh0LR/ovHRss58F5K6+VJ8t2TNda6HJTP379fFmClbkDMHLYyi2+GwaOX8eh7GNYY1QzrEttrZ3tjCE1eAP5Q2qoSw2paWd9pukbeMlJLCn0qh8fWZ4l4xkphAhUTSCLcVBW2PM3XOIQTLr0vfPqazt1P1Hd3HBJolFdVjtQOiuFjSp4xMWSr/zzU+7njz7nvnfPM6vqFtEDsYJyIIZwvPvh5yKhhPAIHsRFrLhy59PRscUxMYN4CBLEI9zN962O598n8QlD/HX/dCgSWvw0OH/XQ89G5SJd0iTteB7j0iHeP9xyKLpvRBPStPv0y5Nlv8q+Oc0P1arC4DnC0Ac8SfgvsFYb6a6xU1UbSpuuCXKIJCwzrbbWjrbGMCmGzuBxZqvU0GcwpIYhU6rHdtRj2ud0WDjegRJLqvwl4Fy0bDCTvOojAiLQHIEsxoHCDjduWdJOfIbzEZtm2EzcO3D7Dqz2JEkrliBCUHd4YCCkIFJwbIIGQgfXLBznCUf6th+P57cF4k0+uzQkiPCWNmIGAgfHpIWHyra9k5HIwX48j2Hp+OEoZ1Jefnmy7FfZaw/7cVrVeeYTQBixOSI01KYfxk5V7WlcugzDYPUkBDkMbq1sE3Z7w/OHPgHvH5YHx9uM+tOQmrDrbdxzWPQ670CJJVX+EpBYUjFdJS8C6QhkMQ4UdrjBK7FkOBu1m+bY3HLXwB08uCQ64FGBuMF8JQgQDF3x5y7hmOsIIlxHgGCLwMCW8wgWHDP3CV4miBGcM7GEcHigWDgTVeyYeH57IJ7F9cUS8xwhLzxJiEMa5hHil4V4o9KxvP/xjidX5UV5baiQX640++l62Hyhiv6ITRufoTW4ytvwB1zp08ZVuH4bSnnqH68DjG1EuYf3vubwUMiTjuJU2/bw+GFIDSteIWhRX/QT1BnXxL9a/m3hy9tNYkm+d3zqWI/PLjp5lqTGpYAiUAmBNEaBwow3diWWjGekdlQ/I18sgT+CiYkTiAQ2fMbqhmOECLw6CMecIWxNUOA6Yoh5fXCNcwgtpME+ebC1fOy8xSN9rvHlnMW1NG0bT4N0+fpltTxIY1w6SWGsvJZmlm0lHfJfE636xzJGq/+ffbnNy/ipqs0hiDBvBQY3Qom8lsJqa9QPnj42pAbhlCE1DIvSkJqw6qqqZzRvuryuJJZU+UvAOff08++6G392suJclLwIiMAoAlmMA4UdbuxKLBnORu2mOTZxsSRLXSBamHCRJd64sL5YglgxLnyo10f1q0Wv5f3xOioeQx1sOVaMVgxY/WdfxtCoNlPkmg3tslWUmOOiSHqKW05bRRhFsEIMoR9AHEE4RSxBNFGfUA7nPrRX3nMSS4q+7cfEf+HUH9y3diyMCaXLIiACVRII1RBpW7kkljQnCLStrdRZ3iJiSZ3lbGNeVfXLP3v2NTexe8Htvv/lUoxLW2mEeQZwq9eynTKGqjTkMMYxxK29adhGs+0N/gyf4dnHu4cv+xpS02y9VPkM1pU270CJJVX9EvhruhJLKgas5EUgBYE2GikhllliicSSENulxJLq2mWK7jVXkO8+8GIpIgn/yec/xhitrFKBaFLXj2jl0z9DjPbFvBa0NyYCVXurvw34Q2p49vEawXsE8QpvEtVJ/XXS5b6QF5zEklyv+fSRJJakZ6WQIlAVgRANvDaWyRdL/LkR8t4LczPYPBHj0hgWNn4+fjwuXV2vztCui63EkurqsKo+GbFk209fdA/t/21mcQNjif8YX7ZlLvqyL7d6GUhVGmxMCrx520IkkjCUQ/Pf1NfeYM28IoghzDOCOMJSvhpSU18dVPlshZ4270CJJVX9Evhrum8sfuy+ePN8xbkoeREQgVEE6jLaup6PiSWs3sHqHKwqYpNP5rl3VhlJO1/EsLDx88wVYZNg+mXiHNf8c9qvzsiuk63EkurqcVS/WuTaweNvRyIJQ3HeePbdVIIJ/zG2oQ8YrpofQsZS1YYWRjqGOXOSMBeOlv+tvs3ZkBo8eBhOA3uG1MBfK1lVz7/qZ6pt6fOek1hS5G2fIu7vzv/ZfWHrsRQhFUQERKAqAnUabl3Oy8QSm7AS8YGlVeP3zHlEDJZAZR9hBY8PBAv2EVuIY0IHgouJJiyhSry4xwlhyYvrJnxwDsEmfp7rfEmHlU7Ii3gs6Up5/PPxsuu4OsO7KrYSS6qrs6r65LlT5yOB5K77XnKvHh69lC/zj2AsaeiDDKW6DC0mBmZoB95L7NeVbx/z4fnec++p5eF0cGeIk4bU6HkP4XngHSixpKpfAn9NV2JJxYCVvAikIFCVkda3dE0s4b4RIb7yz08lenEgYiCA8N22d3JZuOAYEcTOEQ7xxAQNRA9bepUwPl/CPnF4OhJVED44Jl7SeYQXwpAWwgx5co6w8fN+Htqvzuiukq3EkurqLUX3misIYgleJYglST+IGVaDkYqxyn+XGWqj/+rLeEpqK2Wdo83ZSkp4k+BVUlbaSmep7dqQGuYXYkgNvylsSA2eYnrG9YyH9qzwgpNYkus1nz6SxJL0rBRSBKoiUKWh1qe0TSwxzxITPuIMECUQJ0yg4DqiCGII1/AGsWtX7nzaWXrfu+eZKBxhEUb8dC1NS8uObRs/T9nIj7zwarH84uf9PLRfndFdJdsN26bd0cnZFe2lyvz6lHZVfTLpJv0oxpjCkML1nskbZbDKeEpqJ2Weo80x/wWeSwzv0kpK5bW51w6/G4meDKlB+OS5hrGG1JTHuMxnQWmtrhfeVRJLqvwl8Ne0MTD0EQERaI5An4ybKu/VxBKEDIayIETg3cHQFr6WtwkYJlBwHgEEbxE8PfBIsWtsEUnYco108f4oKpaQDmlY2ogklJcy+OetzNq2Uyih3hBL5qfmltuf6rK8uqyy1/Z/mDMXAUNtmLwRF3yMLP+69lf/iBeTYkxsDhzaHMa82lwxnrRHG1Jjk+EikPA84yUmvsX56pmvnyHvQIklVf4S+GvaEktqgKwsRGAEARlP5RhPJpbAkzlBEDjYx3ODbxrO5kUyLKzNbcJ1htHYcJ606fvpEp9y2jkEHY7j5+26tuW0k7o5Siyprt5GdKuFL/HDHyMKd3yG2jBvgdzw6zcG+maAMYGoLf/LhMF4lvSNQRn3y7OK5xeeYAyl4fcBW441pEbPcRltLIQ0eNFJLCn8uh+fgMSS8YwUQgSqJFC38dbV/HyxpKv3qPuqzvCuiq3EkurqrIp++fwHn7jdj70eueRjXDGRYwg/ilWGbht4eD0wtIuhIAy7kTCXrb5tSA2eIniM2LAlRE4NXcrGUn1Ne3jxDpRYUsUvgViaazYO3J8+/jR2VociIAJ1EajKSOtbuhJLqjNK+9aWyrxfiSXVtcsy++hTb33obtv7quM3EVv+wy+joT1GQ1vrCu8HVlixiYKZyLWt91JnuRkahxDCkBoEJgQSPHI0pEbPbJ3tsOm8eAdKLCnzl8CQtFg6mIle9REBEWiGQJmGWZ/TklhSnVHa53ZV9N4lllTXLsvosZ9+/l339e2/dmuvm3V7n3zT4VnCp+kfwcq/u0afraaEQIJQIu+l0XWNlw1DZ/C4sSE1DI9jSA1ik4YqjeanvqS7fHhXSSwp45fAmDQklowBpMsiUDGBosaY4i8ZYxJLqjNK1cbys5VYkp/duHaXt2vGmxZhhN8/CCWPzy6uSkoGRncNjKbqFqMfbwg8ITD6NTwkuY0xuS0eIgypQUxiSA1DlDSkJplXU+1Z+TZfH7y4JJasen2Xf0JiSflMlaIIZCEwziDQ9XTGlsSSdJzUnurlJLGkOt5Z+lnCvrH4cTTE5tKrpqPtibMfDE1ChkDzhkBX6gDPByZrxehnVSUN8VrZthhSw3K9sEFIwuOGITUP731NrOZXsurKM6H7KKdeeYFJLBn6Gi/vAv9VGfWDobyclJIIiEASARmv5RhTEkvK4aj2WIzj4olj0XLBiCR811wz5dbftLTP8cGDS6s0iXMxzvBL+zmy8J67ZudL0VCbux89uzzUZlR8/Zgv58d8nzniIWEr2+AlwXGfeXDvDEHyh9SwNDJDahCTNKRGz1zfn4+s9887TGLJqDd5Sde+tWPBvXDqDyWlpmREQASyEpDRlM9omnx6NloOEJEk6ct1sc3HVtyKcds8cTSxTV565RGHmCK+xfgav1F9LUNtHpw8Fw21+fLtx6OhNp98+pdRUVZcy/qjVeFl6FkbwFOCiUfxJGGejT7PqYFAxJwsiCEMqUEcYUgNXBiGpAlt9dzYc6Nt9rbA6wAV1AAAIABJREFUS0tiyYpXdzUHEkuq4apURSAtAfvhr212A4r/2CcJJZwXz+w8xawcZifn5hLb5cS9A7XLs+Uwpq0mfZiw/o79p6JVbW782cnc/wzSD/fsP9z7zgzPCOYiYSgJw0r6uPwvQ4xsSA3DafgyvIZzGn6kZ6rvfUTZ9887UGJJ0i+Bks/hmjr78oWSU1VyIiACaQnIQM1vPA3zLpFXSX6mao/lsGPIjS/kyaukHK5++/T7WH7H8HuGpX8ZalN0lb+yf9Qqve4aikxGitcEy9ey35e6xisE7xBbpQavETjgRYI3iYYddbfN96WNh36fvAMllvi/BCrav23vq4kzwVeUnZIVARGIEfB//Gs/u0EV9y6RV0l2hmp35TOLC3nyKimfMcNqfjn1jvvizfPRl/0sQ21iXfGKw9B/JKt8zRqiCAV4S+A5gTcJXiVdrxOGE9mQGuYZQRzh3hFLmIdEQ2qabZNdb3+6v9Xti5eWxJIVr+5qDiSWVMNVqYpAWgIyVIsZUXGjVF4lxXiqPZbHz4Q8eZWUx5T2ee7FYw7xCS+Sqrxj9cN89Q9zMfljNP8I4gDzkTAvSZeX/2XYDCvSMIwGUYjhRTakhnlZ1B70jKgNNNsGsDMklqS1tgqEk1hSAJ6iikAJBGScFjekzCiVV0lxlmqP5TE0IW/n/ZqrpIx2NT8157beOYhWGNq2a1B4qM2o7ltGQLNGQGj8GVLC8BK8KVjh5rXD73ZOLLAhNUzAihjEkBpW8WFokYbU6HkI7ZlUef4YvcIklox6k5d0bceBM9GM8SUlp2REQAQyEijDiOh7GmaUyqukPEO/722qrPv/zvaj7qPTqpe8PGHHcsuX3TDl1m2ZdvsOzLj3Ty6tKJSxq80UXD/EZRzSBvCusOV/EUu6srIN98HQIe6JITXMr+QPqenj5LR65vXMt60N8FKTWJLp1Z4v8O7HXnd89REBEWiGQF4joki897evcee/+7ed+m696vZO3Q/1Qz0Vqee2xe1iu/zdd/+12mWOFXBYYhmPnLWbphyCU5IQWmWP3bYfzSpvuYYeXhZ4WDD0ZM+9p1q/sg2eMAypQfhhIlrui2FE3JuG1JTbdvQsimddbYB3oMSSKn8J/DVtiSU1QFYWIjCCQBMGLYb44u8v6Bs4A+qpifbRVJ5ql+14JqtslwuDpaE2zPNyy10D99rxJS+SpDY5olstfKmuH7vKJyzDCm8Lhp8wRwfiQlsnLUXsQQixITUIJDakpotDiPQchfUcqT7qqQ9edBJLCr/uxycgsWQ8I4UQgSoJJBkBVZ+TUSqjtOo2lid9tcv+tkuG2lx+63Q01GbP/otDbUa1oyr7ZaXdHwKsoPT47KL7wtZj7su3H3dPP/9uq27+Tx9/6o4svBctmf2tHQvRkBq2LKHNea7rIwIi0E0CEktqqFdeEEzyqo8IiEAzBEYZA1Vdk1HaX6O0qjZVRrpql/1qlwy12fXA0lAbhJJDT8xk8qRqpsdWrl0hgIiw98k33drrZqNVlV449YdW3Nobix9H4g6/3Vk2m1Whrvvpy9G9tOUeWgFahRSBFhCQWFJDJUksqQGyshCBEQTKMDKzpiGjtF9Gadb20VR4tct+tMuTc3PREJs110xFW47ztLkR3aouicBQAuc/+CTyukBkuPFnJ92ptz4cGjaECyfOfhAJIQgilBmBBKHkl1PvOIQTfURABPpLQGJJDXUvsaQGyMpCBEYQyGMkFI0jo7QfRmnRdlJ3fLXLdrdLlvYd1WbwHMGDhElb8SjBs2RU+HHXRnSruiQCqwj87vyfI5EBweGO/acqXXp6VeYpT+DtMvvyhRVDar6+/dfLQ2oQevQRAREQASMgscRIVLhlbCbKuj4iIALNEBhnEFRxXUZpu43SKtpECGmqXba3XU7cO4iW9423I5b5ZQ4Slv1FKGFukniYvMfN9NjKtW0E8Mwwrwzm6QtJcEDA4Z+WiDc2pOaanS9Fq1RqSE3bWprKKwL1E5BYUgNzOmMmgtJHBESgGQJ5DYUi8WSUttcoLVLvocdVu2xnu9x3YCaaVPKzG44sL/HLKjasZsOqNlvvHDhWuSm7/TXTYyvXthDAQ4Pft8xJ8uDkOcdErk1/EG4oC+IN5WJSWRtSE/pwoKbZKX8REIHVBCSWrGZS+hmJJaUjVYIikIlA2QZEmvRCNkp/9ejBkUsaJ11/YN/+kXHaukwy9ZSmPrsSJuR2GVIbSnoG8pQvbzp+uzw6ObsslCCW4D3yne1Ho6E2O+8vPtRmVNvO1NEqcG8I4KnBqjZ4arDf1AdxBsEGbxZbpYYhNTsOnIlW3AnJw6UpRspXBESgGAGJJcX4pYotsSQVJgUSgcoIjDIGqroWslG6Zcv1I4WPpOujxJLDzzzrzpx9c2SaeQzNOuL4RmlVbSGkdENul0Xqe2Zu3vEtkoYfN+kZsOtZ8hqVjqWXtLV2ifcIk7Qikvhf5iP56PR85UJfZZ2yEm4dAYQJPDbw1ECYYMncuj8MqWFoO0NqEGsuvWo6WmUHsYTf2iF4ttTNRPmJgAhUS0BiSbV8o9SZSRv1XR8REIFmCDRhrIZslGLAPf/CgkPkMEONY4xAtsOuE/bkq2eieISzY8L/4sAj7q23F1ddt/RD3ZpR2kQbaSLPPO2SdvGbE69E9U4dW1vx6/TI1GC5PSGcEd6u+yKGhSMdrmdJe1gc8rtj+w+iL+3T8rWtn7+1W7Z8eQYsXcJzTBlN5OAa5yxeUl7xe0pKx8qSdhvV04lj0Twkvkhi+8xfUkf7aabHVq4hEWBCVMQIWz6XYS51fRg2g0DDvH82pIZ9zmlITV21oHxEoN8EJJbUUP8o4Sjx+oiACDRDoA6jIp5HHqM0rSFVNNxll33R4Sly3569y0Yh5yZ++KNI7Ei6bsbjV792eWQ8XnHFNyOjEuPUF0vi14uWter4EkvGz+FBne66Z3fUZr60fn3UTm697fbomPqxfdrUlVddHXkZseUaYoPt075+vPPuqN3Rfrg+Lu1hcThPftdu3BTlN0osIQ9rR9aOyZ80GCZj5bP7QPhbs2ZNFIdwjx96yt34/Zuidh8XS5LKl5SO5Z92+7vv/utouI2JI/Et85TIs6SZ90lfcuW3K8NZ8N5gzo+ql9DFKwTvEBtSQ754j9iQGsqjjwiIgAjUTUBiSQ3EJZbUAFlZiMAIAnEho47jkMUSM1TNWGXrn/P3zdD0jUwMZ/tPO3ExGM2TgLjx62kNxCbCSSwZL5YktQfq228TVneICrQNriGkITzw5fq6desiwQFPDdoV18elnRTH2iRpIpawRTjha+Xwt354K7PFIxziBt4hflnsOmWkPROGdh7PK6l8Sen45Umzf3rT3zmWCebLSjcMu/G/myeOOuYyqbovG9Gt6lJHCeCxgTiCJwlCRVXzfvDbmCE15GFDahjeg1jCPCQaUtPRBqbbEoGWEZBYUkOF8ULAfVAfERCBZghUbVAkpR+yWGIGI0abGZL+OX8/6boNU7DJK32xhDTj19MYh02FkVgyXizx24Pt+2KJeWZQh3h4MOwFQQQvEsLbMBfaEuf54tWEl4alR1zb99NOimNt0o8zSizxxQvLw8QQv8zxcJQbTxrKS5tOEkuSyhdPhzyyfkNpl8302Mq1CQJ4dbCkLr9X9z75pmP4TZkfRJhfTr0TDanB25p8bEhNnUN7yrwnpSUCItB9AhJLaqpjXGj1EQERaIZAkphR9bkuiiUYtxiC/Lcdo9g8BjCKGapgngLx61kNxTrDh2KUVt0eLf087dIEBurF9n1Bg3PUP6KCLxSwj0eG1aeFQ0yxdGw7Lm0/TpJYQv6IGSbMWJ5sOU9bRfBgiBnnKJt5QLFPPAQUE0YYhsM5ruEp43uW+Hkl3VM8Hb8safdDaZfN9NjKtU4CTNTKCjIIGIgZZXh0+ENqEGBsSA0Ts7J6jobU1FnDyksERKAIAYklRehliCuxJAMsBRWBkgmYoVjnNo9RmtaQKhrOH0Jjk1/65/z9+HX7D7t5lVAWRBTzLkm6XrS8VcYPxSitq23maZd+e7B9hAR/H08R8xax+uI6bcOOiUMYvEAQ1Dhvafj7SWn7caxNxuMgfvjX/HyJT5u1/BA5EEYQ+qwsfvkIZ+UgDMcIRKTJecvLjzMqHStL2m0o7bLkrljJBUIAMQPRAoGEITAMhynyYagOogtDahBe+M3rD6kp20ulSFkVVwREQASyEJBYkoVWgbASSwrAU1QRKEigLkPUzyePUZrWkFK47MMahjELxSj1206V+11vl3h94HliX3+4jd8GfI8W/3wo+6G0y4Jdr6IHRgDRgiE2DIHB44OhN3k+NqSGuU1sSM11P305SltDavIQVRwREIFQCUgsqalmmChLynpNsJWNCMQIVGl8Dku760ZpKEZl0XKEYpQOa0dln1e7LE9oK9r2RsUPpV3GulIdtpQAnh93P3o2mrSVeUKyLruLqILIgsDC79kv3jzvbEhN1avktBS5ii0CItARAhJLaqpIlHeN0awJtrIRgRiBsg3ONOnJKJVRmqad1B1G7VLtMkubi3WlOmwZAX532so2iBtpfofakBrEFX9IDccMtdE//lrWCFRcERCBQgQklhTClz6yxJL0rBRSBMomkMU4KCusjFIZpWW1pTLTUbtUu8zSnsrui5VePQQYCsOwGLxAWIp31PK/eIYwsSuiCh4jxLEhNXmH6dRzl8pFBERABKonILGkesZRDhJLagKtbEQggUAW46CssDJKZZSW1ZbKTEftUu0yS3tK6E51KmACsy9fiCZW5Tfng5PnEle2sSE1JqYgkCCUIJhoSE3AlauiiYAINEJAYklN2HFllEJfE2xlIwIxAlmMg7LCyiiVUVpWWyozHbVLtcss7SnWleowUAKsbMOqNggf7NuHITMMnWEIDavTsNgAv0dtSM0ojxNLQ1sREAER6DMBiSU11T4vKYklNcFWNiIQI5DFOCgrrIxSGaVltaUy01G7VLvM0p5iXakOAyLA8r94j+BFwm9MRBE8QxBLmJ/EhtQwKStDcfQbNKDKU1FEQARaQ0BiSU1VJbGkJtDKRgQSCGQxDsoKe/6GSxyGaZe+T137H92dV1/r3tj0me7c1w2XuLLqvA3pdK1dPnTNf3U/ufqq7rRH6zMCaZcJ3alONUwAbxHED+YW2TCx4LbvPxXNMcJywAgnNqQm64o3Dd+WshcBERCBIAlILKmpWlD2GUuqjwiIQP0E2mDEtqGMJ+fm3OaJo27NNVNu1wMD9/7JY70SGtpQR30o40en593Bg7Nu3ZZpt2HbtJufmlM7PDtfCYP6e2vlOIzA6XMfuut+esL9L9+ecmu3zC4Pqdlx4Ix7+vl3R07iOixNnRcBERABERhNQGLJaD6lXUXp98eRlpawEhIBERhLoA8GZJ33iGhyy12DZdFk8YREkzr59zUvRJJ9B2bc2k1TEkkqEkfibWts56oAlRFgmV9+N16/+xX37zcN3P+84Yj7P6+fc3c+ciYaUsMwHH1EQAREQASqJSCxpFq+y6lLLFlGoR0RqJ1A3ADQcTn/hT734rFINLn0yiNu4t6Bk2hSDle1z5UcJZKs5FFn+6i9s+5xhiz3yxwkN/7spGNIDd4j/2HLnPvfrjnqfvjQacfwG31EQAREQATqJSCxpCbeEktqAq1sRCCBQJ3GRR/zkmjSnDHb5fbGMK89+5c8SRj+hUdTl+83xHtL6E51qgQCeIUwNJu5R5jT7tKrpqPVbJiY9UcPn3Ffuf2FaP4RPEvkQVICcCUhAiIgAjkJSCzJCS5rNMaU7n3yzazRFF4ERKAEAiEaIV0sE54leJgwp8m2XQOHiNLF+9Q9VSsOIZIwJw7tSCJJtazHteUSul8l4ZxjSA3ziiCGsMQv4ggiCWIJosmf/t9PoyE3TNDKdcLqIwIiIAIi0DwBiSU11QEvRL76iIAI1E9gnEGg6+UaZCaaMDyHuU0kmpTLt6vtVSJJeO2k/t66GzmyEo0NqUEAYVjNdT99OTrHcBv7MLSGf6RxnYUAtLyvkdFWBERABMIgILGkpnqQWFITaGUjAgkEumpchn5fiCY771/yEJBoEp4hHEr7UTsJt20kdKc6FSPAMBlEDn7nxYfUMIwGr5L45/wHn7i7Hz0bLf/LMG0t8xsnpGMREAERCIOAxJKa6kFiSU2glY0IJBAIxSjsaznkMRCuMdxkm5QHUvjtIqE77f0phA6GyTC8+uvbfx0t4YtIgvgRDakZMRErwgniyJqNg2hITpKQ0nvAAiACIiACARGQWFJTZfDfBV6Q+oiACNRPoEmDUHlfNAglmlxk0ed2YSIJc5LI4yjsNlF/bx1ejnh9/HLqnWiVGn9IDcNn/CE1o0pOOIbhIJLwzzMEF31EQAREQATCJyCxpKY6klhSE2hlIwIJBPpsmIZ474gm+w5cXOVkfkqrnIRYT2WXyVZNQiTRUtNhiyRW9wndaedP2ZAa5hBB3PjizfPRP7v4HffG4seZ7h9PE7xOEFmYw0Qr22TCp8AiIAIi0DgBiSU1VYHEkppAKxsRSCBgP/y1DctA++j0/LJosmHbtJNoElb9lPW8mEjChL8SSdpVxwndaadO4eFxZOG9xCE1nGcC1jwffvOxqg1CC/v6iIAIiIAItJOAxJKa6o3xrbhg6iMCIlA/gbKMPqVTjaFnosm6LdNOokk1jJtouyaSyJOkvXVaf29dbY54hjCkhmHRCBl4juBBwpCaoivR4DWC9wheJHiTILboIwIiIAIi0G4CEktqqj9ewrw89REBEaifQBOGovLMZyAePDjrEE0uv3XaTT4968QxH8cmuZ2cm3Nb71xaBWnXAwPHsKsmy6O887eh+nvrcnPktxdCSHxIDYJJ1iE1w0qG9wnzkNjywGnnMRmWns6LgAiIgAiEQ+BfXfE39zh9xcDaQDhNUyURgfIIyFjKbyw1xc5Ek/U3STRpqg6y5otIsnniqMOTRCJJ+565pPourxeuPiVEC7w5WJXGVqlhy6o1nC97UlVWsiFtvFPwVNHKNtXXsXIQAREQgboJSCyRWLRCLKu7ASo/EaiDQJIRoHPtMOYQTRBM+B56YkYeCmfDqzcTSdZumnJ79s/IkyTAOsrb39XRP+fNA88Qmw/OH1KDl0fRITWjysTqOLb8L2JJ2SLMqLx1TQREQAREoF4CEksklkgsqfeZU24NEMhrKCheOIY5Q3IQTBiig4Ciumm+bpiQ9zvbjzpEElY3Yu4Z1Uu3GDTQXQ/NkuEtDKmxJXiZG+TGn52M5iBBwKj6gwBD3gy3oRx5J3+tupxKXwREQAREoDwCEksqFEu+/d//zP0//+nRFWKEDXeJb7/7Pz2wHPaa/+H+5f14uKqPy2taSkkEwiEgA647BpxEk+brEpGEiXglkjRfF1X3bU314ggRLLvLkBrme/vshiPR0Bo8OZgwv05vDobwMJwHcQZPFi3/21SrUL4iIAIiUD8BiSUViiXXX7rfnT/3p1Riyf2bjyyHnfgvjy3vVy2OxNOvvwkqRxGonkDVBoXSr99oNIMdT5OHfymvhjraoJjX387rqNdReVTfOy/lwHwfCBF37D8VrVJz6VXTkUhiQ2rqFijIj/IgkLAEsFa2qaslKB8REAERCIuAxJJAxBJftJBYEtZDotK0n8AoY0DX2m0AmgEvL4fq6lHePNWxDb3/qar3Z0gNy+zasBYbUsO5OobUDLsvPFooA0NtWEGnyrlPhpVB50VABERABMIhILFEYskKz5dwmqZKIgLlEQjdIFH5ihujiCasxCLRpDhLa48SScpjaUzbti2jF8ZLgyE1eInYkBq8NfAiYUhNCKvIMKyHIT+2sk2Tgk0ZzJWGCIiACIhAOQQisYQhIL/cPu9+8s2n3atz70TfX9w2u2xE3/nVQ+6Z+15avk54PCGYZ2Nq3ytR+Jen3oqum4dE3jQZumJpvvj06468LU22/nXyjM8JMqpMxOe+7B5nHn41Ss9Pf9x1P2x8/7b/8Ih7/rEzUfqkzbE/DAcmljf5UFZLw+JybJ4lnOMemfvEwrGFCfn45/z9UezHpVlOs1IqIhAWgbYZKCpvfiPVVmYpa/naNxZm3V0PPeseeuxIoclLs8SPh40fx9tH/Prks9PunRNzuctrIgkT6moy3fxtMV5PbTzO05MjfiCCIIYgivhDahBN6h5SM+oeKKu/sk0Iws2o8uqaCIiACIhAvQQiseSxO1+IjHrECQx1jHGM/Cd/+mJkkGN8f/zBJ+7si+869hEsMOA/eO/jyGgn/L9sPRods8Vwz5Mmhjz5ICRQDsQbjsmTNBEX/OsIPJ9+8v+576/5RXR9XJl2Xz0Zhae8pI/gsPjaH6K4pD/uui9IxPdhQtlgRtqk9dYr55fFEu6BsnLN8kY4sXQ4Z8KK7dv9kJaFY0s9IV755/z9UezHpVlv81NuIlAPgTYaKSpzMSO1LNFkYt9kJDogQHxYYLUXSydNvaYNOywc4gkiT5q8/DAII8wBg0iCYOJf036x9thWfml6aBtSw8o0DF/hy/AahrNwLcQPniO2qg4eL3VOGBsiD5VJBERABEQgmcCyWILwgSFtRjcGO8Y9K7Ng6PPxPSEQNMy4tzgmmHCMwZ41TcSLuMcE+Vg6CBEIBZYfW8KbmJCmTL5Awb1xn5YeZR513cIlbeNxCeOXB+HHysk1hCH4WlomkHDs73PPeJdYOOrAF4jsvL8dx35UmsnNRGdFoN0E2mqoqNzFDdTXjh9zt9w1cHia7Lx/4BZPHMskAnzvnmfc7oefi75J9bHxJ4cjz5Nv7Hgq2nKMqHLzfc84xIyfP/pclB/7g6nBimPOWXg/bc6RJ1vOmyhiaXKMGPKPdzwZhbPreMCwT1myiCUSSYq3M7/+urQf7/nxCmEeDxtSg9eIDalhQtTQPTPwbGEoEHOkIOaE5OUSZ61jERABERCB5gksiyVxEQLjmw/DXBBL8JLwDXJECjxNMMzty/AZPogQnMuaJl4e5kVieSEO8MF7hPwQIOxafDuuTKSB9wf3QvniQ3jGXY/n5x+TN2n65/A28QUlBBM8QhBkuBc+Ft4XSPx9u38Tqrh/X9Cx+P52HPtRaUaF0h8R6BiBLhkvupd8hu25F5dEk0uvPOIm7k0vmly58+lIsPjVoSn30rHBKqHFhIpte5c8UBBHECqeODwdCRkWny1ihtXfun86FAkbX/nnpyIRxc6ztTQtLTsmD/ZNCLHztkVMIX4az5KPTs9HQ2zwJGEZ4KOT8iTx60D7S8+ZDalhyV5EEZbwRWxgfg+EByZEbcMHIYfy82VfHxEQAREQARFIQ2BZLMHY9w1u9vlguCNgxA10vB04h2Ee/5pYkjVNhIW4WIK3Cx+EDcQUG+YTLyvH48pEGMrGMByEHfKLzwky7npSvpb3KLEEkQMPGbYwpQx8LD1fIPH3uY7oxJAj9hF6fA8Vi+9vKcco9qPSjAqlPyLQMQIyfPIJDF3kZqIJniZpRBMTIPD0ePX4zLLYYWxMqLCtCRUWz/cOIQ0TXOw6Ikx8fpF4WnbMUCDyNQEG8QUvFruOFwzXOW+CipXTtogk+w7MRBPhIpIwMa5d07bZ54S6pA6pT9pFE/XB8DWW4t565yAakmVDavY++WawQ2qGva7wGsF7BC8SBB4t/zuMlM6LgAiIgAgMI7Aslvhzd2BM4xXBh22SWILYwNc30vHMMKMegz1rmia++GkikvDBGwJhI54nwgHCA3HGlYm0zEOD8AgjDGmx+OOu++WK75N3XKAgXfMsYesLPQzD4WPp+AKJv891PFJgSflsSJLFS9qOYz8qzahQ+iMCHSPQhNGhPJs1PMfxZzgOYgmiCcN0EFGS4iCQ4NFhk6iayGFhGVrDvm0RQy6cnIvC4xmCh4l/3T/mepJRHE/LjgmLIW1pUDaEEbvO1oYMUQYrI1uJJGG3R+oIMez5mUEkyg0Tu/w6LbpPm0As2/XAwH1n+1GH19VlNyw9DwzNYghbGz94uzBMyISeUOdNaSNblVkEREAE+kZgWSzhxn2vDlZzYagIhnWSWGJzbrA1gx0xg/kwOMZgz5omogBiAAINaeBVgoBiw3m4zjAau44444sd48pEOtyXldcEC9Lh3LjrFi9pa3lb2RBi8ALhfgjPFiYWF2GFjx37Aom/b9eJT30YXzsPI8L7ItA49hY3Kc2oUPojAh0jUNSoUPzwDc28dWSiCYbiKNEkb/pp4mEYI4LYN02ctGHeP3ls2ZOEpZUXBitFlLTpKFz1zwDimQlsbMtmTltn4l5EwstvnY6G1OBdxFw+nKetxPNs06uAIUMMF7Llf0OfP6VNbFVWERABEegrgWWxBKEA4x4PBrwg+JrhnySWYHAzpIQPRjyGNwKATRKLwZ4nTTxTLE2EEAQYhAcz8EmX8yZE+ALEuDIhaFBO7pH4pGOeMMQdd93KMGxrIgUCDx87JjxCD0zJmzIwdwkfuzdfIPH3LS9Ly+rEznPMxxe6CDuKvcVNSjNKTH9EoGME4gaAjqs3/NrGGEMSo9E8TfivetvuwS8vhi8eA9wPIgnDK/zr2g/vGcAryLyE4h5MeerLhtQgAjI3DW0BD5I9+2dSD79qw6uAlW385X+1sk0bak1lFAEREIF2EFgWS8zjAuPbPC3MqB63xbiPh8EQL5qmCQnxtBFkGJISP+8fJ5XJrnON77D0x123dJK25umRdI1zCDImKA0Lk3Q+voKNhbH84p4ladgnpdmOZqtSikA2AnkMDcUJz5iso07aLjK0vfx11HGoeTB3jQ35wssoazkZUoMQgiCCMGJDapiDJK/4l62nrTc0q/Kw/C/DbZhTpS2TzdZLSbmJgAiIgAgUIbBKLDEjvOjWF0uKphVCfOYfwWMk6YuXSNVlxBsF75Q0+aRln5RmkcakuCIQKoGsRofC91Mo8eu9baIDnjGA3/h1AAAgAElEQVTmSdLUcCKfn/bzP0NJEwnHedqQGryhbEgNW4bYMKSG6/E4eY5D7NOZqPXr238dTdzKyjZa/jfEWlKZREAERKAbBCSW/M09qQQIPDfM4yS+xVskjYiRNwxCDcJGWo+UNGLJsDS70ax1FyKwkkAeI0Fx8ht7XWLnT4zKcJbQVo/BKMZAbnLOlS7Vd6j3gmcIHiIIYXiM2JAaBLIq2+TKnrS5IwQRhBFWtmH5X61s01xdKGcREAER6BOBf8XNfjr/R31rYHDLxAl3cN9Zsa6BdZ8eYt3reAKhGkAqV3sEGV80CWHJXYkk7Wk7eZ5zG1KDQIcwwpwjLOeLYFLn/DPje9dqQzC0huV/GWpzzc6XHENv9BEBERABERCBughILKnBcDcxSmJJfaJcXQ+Q8mkHgTzGiuJ02xjNW7+IJhisGK9NiCYscbxt19LErXiUlDXcIi8PxSv+nDDki6EzDKmhTX12w5FoaA31e+iJmUbruKkenkla73707PLKNkziqo8IiIAIiIAI1E1AYkmNYsnEzlfcnntPybOkBuZ1P0jKL2wCMuiKG3RiuJrhwYOzkWiy/qbpyNgdxghxZdg1/zzeBMO8BhBJGILBcBuJJKvrwucY+j5Damg7iF4MqaFOEUlsSA2CXCj3UHfPznK//so2Wv637hpQfiIgAiIgAj4BiSU1GO7mWbJr128dXzvWtjpPE7+Ra18EQjE8VI5wjMAy62KUaILHAJ4CbEfliYfI2k1Ly/z64SSStL/NLAyWVqlhSA11zJchNfsO1Dukxm9XaffrenvgOcLKNms2Dtzux17XyjZ1gVc+IiACIiACIwlILJFY0knxZmSr18XeEUhrGChc+w3TJuuQIRN4mfBFQKEs7COWMO/EsOVb8SSw4ReExbuEL54kxMPjgKEaTd6b8k73bFBPRydnozqzOqUN4EVC+0D8ahPLql8Wsy9fcN/asRBN3MrcJFrZpmriSl8EREAERCALAYklEksklmR5YhS2lQTaZJyorOmM0pA54UWCgYwHAeKHfRlykTTEgmE1FoYt8SSStKMdIH7YkBoTxmxIDaJJUn2H3HbjZauqw2dlG1a14cu+PiIgAiIgAiIQIgGJJTWKJayEwySvGn5T3fAbYxviw6YyNUcgbgDouB2GaNvriUlgfRGEfbxF/PuyYTrxcFUuB+vnr/1szwJDahg+4w+pYZ9zXOsazzJ7bbxG8B5h+V+8SfAq0UcEREAEREAEQiYgsURiSSfFm5AfOpWtfgJdM2B0P9kM3CZ4DRNBEEVswle8EvAgiQslHGOAN1Fu5XmxbeEV4g+pYSJWvIMYUoM3SduG1OSp2zJ6a5b/ZR4Slv9lXpITZz8oI1mlIQIiIAIiIAKVE5BYIrFEYknlj5kyaJpAHiNBcS4ajU2zeH/7Gnf+u3/bqu9/ufLniSIIQsj/uuEZd2TjP7j/69sPDg1DuPlr/75V90w9Nd1WiuSP+MG8Iogh/pAalvRFNOnjvDFF+m5Wstlx4Mzy8r9a2aYITcUVAREQARFogoDEkhrFkkMPvu42b1vopDhhw19C2TbxMCnPcAkUMaAUt3nRBKFk8fcXWvN963fn3TPzb478Pnv8rZHXif/SqcXW3DP1Qz216XlhEl2Gz7AyDUOm8PLBo2fP/m4OqclTN3l69TcWP15e/vfuR8+68x98kicZxREBERABERCBxglILKlRLJk/+LbbcMtxiSU1MG/8yVIBgiKQx0hQnOZFEquDtoklbRJ2yixryGIJQ2qYB4aVhZiA1YbUMIcMQ2qGrVRkbbCv2ywd+Qun/hANs2G4zd4n39Tyv1ngKawIiIAIiECQBCSW1GC4m7eFxJLqJ3Y11kE+bSpUYwT6auh05b4llrTDqyYksWTxxNKQGlYauvzWpYl22TKkhvlk+jikJk9/kKbTPrLwnvv69l9HE7eyso2W/01DTWFEQAREQATaQEBiicSSTnq6tOHhUxnrI5DHSFAceZaU6XXRh7SaFEsYUsPEuf6Qmu9sXxpSo5WF8j/Lo3pphBFWtkEoQTDRRwREQAREQAS6RkBiSY1iyWuH33WXbZnrpDhhHh2hbLv2oOp+ihGQ8JHfWAqBnTxL5FkSb4c2pAZBhLlGmHOEITUIJhpSU97zHu95WdmG5X8ZanPNzpccQ2/0EQEREAEREIGuEpBYUqNYcm7yPbdu86zEkhqYd/WB1X3lIxA3tHRcnjFVB0uJJe0XS5gzJG9bYUgNQ2fiQ2o45jzX86ateKPrxXpcJmllstY1GwfR5K2n3vrQLmkrAiIgAiIgAp0lILGkBsPdvC0klmjOks72JIHfmAyi0QZR6HwklrRbLGE5XobHpG1neIbgIYKnCB4jTMaKBwmTs2pITb3PMsv93rb31UgkYRlgLf8b+MtOxRMBERABESiVgMSSmsWStdfOyLOkBualPiVKrPUE0hppClevIZaWd1vEkudfWCh1qd+y06t63hTqKV6neH98dsORSPSIX7NjBBCW6/WH1CCuIJgwF4mF07a+5xPu1AGeJLsfe10r27T+LagbEAEREAERyENAYknFhvvC4++4Xbt+67b+4DfRssH8aGT5YPuePLQo8aSCOsjzMChOdwnIyKrPyKqCdVvEki1brl8lltx62+2rzplocfLVM+7M2Tej60nhktKzuCFufbGE1WYQP3jn2ffci8eiVWgYOsOqNLZKzfqbpqMhNnigaEhNs8/q0cnZaGllPHr2HZjRyjbdfS3qzkRABERABFIQkFhSgaFuw27YfjT3vsObxH4s+tv1W49JKKmIf4q2ryA9IlCFAa806zPq2iyWjBI1Hti33x1+5tmhYkpbxRKG0Vx2w9Sq997aTVPRkJoN26aXh9QUmctEz2B5z+DBg7MO0Yov+8a2R68J3aoIiIAIiIAIrCIgsaQiY90XTPbtOb3qRyOiycN7X5NYUhH/VS1dJ3pNwH74a1uecVUny7aIJddu3OTu2P4Dh8gx8cMfRSLIV792ebTl/I3fv8ldccU3HcNrfnPiFXflVVdHYWfm5p2F+8WBR6IwhP3S+vVDhZRRIkxT16gnPBNYncb/x4DtMwdJne1GeY1+3hGqGOqEFwkCFnUXZ9brF4duXgREQAREoPcEJJZUZKz7YgneJayCYz8Y2eJtwnk/nPbLmwC290+2AKwgEDcAdDzaiAqNT1vEEgQPG1aDEIJoYSIIW0QRriOUcM33LLFwFs+P25T4kTXfNzZ9Jhp6w4Ss/vvO9vFaCK1t9bE8DJFislw8fTZPHHULg+HzwqzoSHUgAiIgAiIgAj0jILGkBrEEEWTy4TdW/HjE20TiSHniSJxlz55j3e4YAn00iLp0z20RS/xhM7ZvIggCCd4mHP/q0YNDxRI8T0yksDTsOPQt9WTtDgOcSVsxxn1PEwx1C6NtvaIlc8Yw4S71gZcPx+PqYEzXqssiIAIiIAIi0GkCEktqEksw5pmjhP+wXfrtabc49Z7EkgrZd/qp1c1lJjDOIND1eo22rLzbLpa89fZiNDwHsePI1CAajsM+Q25MODFRBbEE7xPiXHbZF5eFk9CFEsrniyXxOmZ1FSYMTWOgx+PquNjzyRwyiCOIJEysm2US3cydrSKIgAiIgAiIQIcISCyp0GCPezuwMg5iycTOVySUVMy9Q8+obqUEAjK2ihlbTfNri1jy4513L4sbtm+r3Ny3Z69jH28RG4bDajjMTcLwHAvHPnOfcJ6vDetpu1jSdBtqS/6DqYGb2DcZfZ84XGzYEksy49nDcBuEqjxePSV0v0pCBERABERABFpLQGJJxUZ7XDDZvG1BXiU1MG/tE6mCV0KgLYaSypks6rRFLGmDoFFlGUd5lqhtJ7ftYVxeOjZwux9+buwwmaT4LM3MssxM3MrKNkVWHKqkQ1aiIiACIiACItASAkGJJbf8779wV/zNPZ3+fv2/u7fT92f1R13GhaI6j1vy/KmYNRFIMih0Lpvx1iQviSUXlj1WqhQ7iqYtsaS8Z2rb3kn3zonhE68mPY8IIwgkCCUIJklhsp6rqYtWNiIgAiIgAiIQJIGgxBIM7aI/1hQ/jB/V1GWd4kg8ryCfNhWqMQJZDQSFL8/oK4OlxJIw+vVx71eJJeU8Nx+ennffu+eZVGIHQ2sYYmMr2zD0poxnztJorNNWxiIgAiIgAiIQAAGJJb9vx4/QcT9SQ7susSSAp1tFWCZgP/y1LceYq5ujxJJ2vKcklpTzfD302BHH3CWjnjMmaWWyVlvZhgl0R4XPe225E9WOCIiACIiACPSQgMQSiSWVePNILOlhbxLwLec1FBSvHOOvKEeJJRJLirahNsUfNbErqwnZyjYsA1z16kIBd+sqmgiIgAiIgAhUTkBiicQSiSWVP2bKoGkCbTKUVNbVAo3EEoklfX8u8BzZeucgGm6z64FBrpVt8jBsuu9W/iIgAiIgAiLQJAGJJRJLJJY0+QQq71oI5DESFGe1aNEUE4klEkuaantN53t0ctZt2La0sg1zkxRZ2SbPvdTSQSsTERABERABEQiUgMQSiSUSSwJ9OFWs8gjkMRIUJyCx5IZLHIJJl753Xn1tp+4nqpsbLqlk3ow+PousbLP+punoy35TDMrrhZWSCIiACIiACLSPgMQSiSUSS9r33KrEGQk0ZWgo33AEl9Dq4rMbjjRmAIfGQuVZek7wGnn4lzPR8r94k+BV0jSbjF2tgouACIiACIhApwj0Viz51aMHh4oER6YGbuKHP3KjwjS9+syZs2+mKl/acGXfjyZ47VQ/0fqbadrgUP4STeJtQGKJ2oS1CZb/ZR4SW/63qpVtLL8s29Z3/roBERABERABEShAoLdiyZYt1yeKJb858Yr76tcudzNz8+7W2253jx96KjFc2eJC1vQo57B78NN66+1F9/wLC7Xfg8SSAk+lopZOIItxoLAyYutoAxJL1M5YyYYVbWz536pXtsnTrkvvjJWgCIiACIiACLSIQOvFEvOc2HXPbveLA48siwKICXiH+GKHnUMIMaHh5Ktn3I933r0cjvQIh+BAXK4l5WHnCMf+4WeeXRHuvj17o2PKgKeKL2D4+1Ym4nOee0DgsHTNuyUejuNh9+Cn75eTPCiP5UU4S9c4Wfg4Tz/NNPsSS1rUC/SgqHmMBMWRMVtlG5BY0t/29drxi8v/7rx/4BZPHGt8uM2wtt6D14NuUQREQAREQASGEmi9WIKx//nPr408QRACHti33yGAXHnV1ZFHxR3bf+AQLjh3xRXfjLYIAQgNnPvS+vVROEQRzvtCAGkgrCTl4YsVJjiwXbNmTZQeXinkh1fHtRs3RcKJnzb7Vk5LCxEDsYTycp0tYklSOIsz7h4snJWDY8qDIGPpcs04cT3OM17uNMf/9//4L27Xrt+6949ecJ/O/7H279AWrwu9JDDMEND5/hqsTde9xJL+tb35qTm3eeJoNNyGlW0YftN0OxyXfy9fGLppERABERABEfgrgU6IJeZhgdFvgol5ZGDYI1pwbCIE54jDOa4RB7GA4TcmBHDOxBMTHLhmefjn2Cc8W0QSwiF8WH5sfW8OywNhh68ds0XEQKRhny3HSeEs/1H3QBoWDo8R7pXycQ9cI904JwvPdbtX9rN+v/Jv97rN2xbcmu8cbUQ00RMuAj6BcQaBrvfPcG26ziWW9KfNTT496y6/dWn5X1a2qXv53yJt3e9HtS8CIiACIiACfSPQKbEEQx/RAu8MEyEQGxAJGGZi4gfnTCwxQYNzvohAOiYQ+AKC5YFXBh4ahLFztuUc4oiVgW2SWOJ7kZAeX+IiaCBiIOBwnBTOykS4pHsgHl8LxxbBhK153SRxsvAW1+dgaabZ2jCc1w6/626ZOBGJJhM7X3GLU+/V4mXStwdZ9zuaQBFjQXH7Y9TWWdcSS7rfrhBGLrthKhJKEEzqbF9l5TW6Z9VVERABERABEeg2gU6KJQgfeIkgUCCKIArYOcQFxAgbikI4hBTCEZ4vw1AQCfgidAwTEBBhSJv0CEs4ExdIZ5xYYmUiLOUwsQTR5nOf+1yUHsJEUjgrk13z74E4JgxZOOZNsXu0vCwu+RsnC08a/v2kEUj8MCaW2BCcc5PvRaLJpd+ednWIJt1+bHV3WQmUZTgone4buHXVMWLJxL7J6LvxJ4fdq8dnxhrTbyzMug9Pzzvbjisr6Y8LY9fjYe966Nkorn/+oceORHlbHG1XPw8MrWGIja1sw9CbNnPK2tcqvAiIgAiIgAh0iUDrxRIMfvMIYR8DH6MdLwpEALvGOcQIzhGGuUj8cCZUWBjC8SXcsDw4b+mRZjx/P03K44sJtm/5WVjOk455rQwL55fJ7tVPwyaVpVwIIaTDPuX1w1lc4+Sn69+PlSPtNi6W+KIJYgnDc7bdecIhoti1Mrddekh1L8UJtNlYUdlXG6RdYOJ7lnzvnmcSDeoLJ+fcYGrg2CKSIKr86tBUtH3i8HR03q7DhDAcv3NiyUBH6Hjp2CBR4BgXFkGGNEnDyrH74eeitLj2/MxgOT8Ly3ZYfl2os1H3wCStTNZqK9swieuo8G25Vrz3VQoiIAIiIAIi0F4CrRdL0hrvIYTD08Q8VtgiXCSVi2E1/lwiSWHSnrvx+zcte7ikjVNGuGFiiQkiDMdBNMHThGE6ZYsm7X0kVfIqCLTFMFE5uymMJNWriSUIG773hh8W7w7Ej217JxPFEv868W6+75koPKIKx1fufNohqiDGIHj4aY8La2ViS3zKQboIIt/Y8VSULmlMPjsdnec+yM+OEWP8/Lq6z3K/23YtiSQsAxzi8r9F2FfRHytNERABERABEWgLAYklOSYvLUNM6Hoa48QSXzTZ+ZOTkacJoglznNi1Itu2PIAqZz0EihgLitsPo7fuejaxBCHEPEHiZcCT4+ePPheJEVxDuECssG38etxDhbSJlzR8ZlxYXyyxfQQT8rd0EU24hmiCR4mdt/LF76dLxyfn5tzWOwfRcJtdDwxasbJNHv719NDKRQREQAREQATCJCCxRGJJondLUTEnrVhigghLDLPUMMNzWEXn5KHFQqJJmI+bStUUgTxGguJIJKmyDSCW4H3hixbxeUu4hkcIHhuUBXGEMLaNX+eYNH3RgnjDxJJRYU0gYYtHCWERRUysIV3Ln63vIdNlseTo5KzbsG1pZZuHfznTqpVt8rTnpvps5SsCIiACIiACIRCQWCKxJAixxBdN9tx7yq29diYSTRYefyeXaBLCw6UyhEMgj5GgOBJLqmwDJpYgPlg+DJmxfbZ4a/hCB8IJnia2jV9HsPDDW9qc54tniH25NiwswojFZUtc8kWoIW+7ZuUwkcfOsyUN/17avn/oiRm3/qbp6MsqN22/n7TlD6cXV0lEQAREQAREoH4CEksklgQllpho8tHc+27fntORaLLhluNu/uDbmUST+h8l5RgygbSGgcJ1y8ANuT5tGE5dZUTYMKGEbdfEjCo4fnR63uE9sm7LdORNgldJFfmEnGbI/brKJgIiIAIiIAJVE5BYIrEkSLEkLpqs2zzrsogmVT84Sr9dBEI2RlS2fgo0dYslamfp2xnL/zIPCcv/Mi8J85P0lV+7enqVVgREQAREQATKJSCxRGJJ0GKJiSZsD+476xBN1m895iYffmOkp0m5j4lSazuBvho6uu/0BnLdrCSWhFc3LP/Lija2/G/XVrbJ08bb3ver/CIgAiIgAiJQhEBQYsl3PrPHMTGovu1nQF36QkeZ+4gml22ZGymaFHkoFLd7BPIYCYoTnjHbpTqRWBJO+3rt+DF3y11LIsnO+wcO0aRLba3IvXTvbaA7EgEREAEREIH0BIISS8o0qJXWHysTK0Jhi3cJXiYIJwgofrnSPwIK2QcCRYwFxQ3HqO1SXUgsab5dzU/Nuc0TR6PhNvsOzHR2+d8iz00f3g+6RxEQAREQAREYRkBiyXz3RQVfROjivokmDNEx0WRYg9f5fhIoYiwobvNGbRfrQGJJc+1q8ulZd/mtS8v/9mllmzzPUT/fGLprERABERABEVgiILFEYskKj4w2iymsmMMksIgmD06ec598+hc95yIQEchjJChOc8ZsF9ljoCOQDPtyvYv3HdI9IYxcdsNUJJSId7rnW68QERABERABEegzAYklEks6I5aY0INo8q0dC27tdRJN+ty5+fceksGmsqQz0rrIaf1N04liCee7eL8h3BMr2zDEhpVtGHLD0JsQytWWMvj9qPZFQAREQAREoG8EJJZILOmcWIJowufUWx+66376ciSa7H3yTfenjz/t2/Ot+/0rgbYYJipnt4WUYd4l8nIov96ZpJXJWm1lGyZx1fOVnbNeIiIgAiIgAiLQZwISSySWdFYssQfbRJM1Gwdu92OvSzQxMD3aykjKbiSJWTXM4t4l8ioplzPL/W7btSSSsAywlv8txrdHrwndqgiIgAiIgAisIiCxRGJJ58USa/VvLH7sbtv7qjPR5PwHn9glbTtOQIZ/MYNJ/MrjF/cukVdJOWxPzs25rXcOouE2ux4YaGWbs+Vw7firQbcnAiIgAiIgAiMJSCyRWNIbscSehN+d/3Mkmlx61bTbceCMk2hiZLq7lbFfjuEkjuVwNO8SeZUU53l0ctZt2La0ss3Dv5xxH50unqba+UWG3X0r6M5EQAREQAREYDwBiSUSS3onlthjgWiCWIKnCVuO9ekmARk/F40fsWiehXmXyKskf10cemLGITbx1fK/+TmO6w+6+UbQXYmACIiACIhAOgISSySW9FYssUcEzxLEEjxNGKYj0cTIdGc7ziDQ9eqMLbFNZnvLXQNNOJpxqAheI3iPrNsyHXmT4FWi9pXcvsri0p23gO5EBERABERABLITkFgisaT3Yok9Nogmdz96NvI0kWhiVLqxLctwUDrVGmbD+L6/fY07/92/1TdwBtTTsDoscp7lf5mHhOV/mZeE+UmKpKe46Z/jbrwBdBciIAIiIAIikI+AxBKJJRJLYs8OSwyzag7Dc1h6mNV09Gk3ARlH6Y2jEFkhlCz+/oK+gTOgnspsPyz/y4o2LP/LCjda2ab+57jdPb9KLwIiIAIiIALFCEgskVgisWTIM4RosvfJN93a62Ylmgxh1JbTZRpwSqt+g01iSTuEorLEkteOH3MMU0Ik2Xn/wCGa6Lmr/7mDuT4iIAIiIAIi0GcCEksklkgsGdMDfPLpX9yDk+ci0eSanS+5F079YUwMXQ6NgAytZgytsrhLLOmHWDI/Nec2TxyNhtvsOzCj5X8zzulS1vPmpxNaX67yiIAIiIAIiECdBCSWSCyRWJLyiTPR5Atbj7lv7ViQaJKSWwjB/B//2m+fcCKxpN1iCXOOjHruWBXo8lun3WU3TGllmwAEEr+uQui/VQYREAEREAERaIqAxBKJJRJLcjx9j88uOkSTr2//tTuy8F6OFBSlTgL+j3/tSyzR/CfViC9Jw3D27J+J5h1Jeu5Y8heBBKFEyyiH+VzW2U8rLxEQAREQAREIjYDEEoklEksKPJUmmnz59uMSTQpwrDpqkqGmc2EaZ0n1Is+SasSNskWjuFjC0r6f3XDEXXrlkeV5R/AyYYgNK9sw5IahN0l1rnNhPJ9V981KXwREQAREQARCJiCxRGKJxJISnlC8SxBM+CKg6BMWARleYRheeetBYkn7xBJWrmGCVsQSvqxmw2StnGPyViZxzdseFK++5zmsnlylEQEREAEREIF6CUgskVgisaTEZ85EE4boSDQpEWzBpGRc1WdcVcE6dLFky5brVy1rfOttt686l+TJkRQuKb2kuKGdM8+Sj07PR8NrTCixLYKJVrZp17NYsOtVdBEQAREQARFoNQGJJRJLJJZU8AizYg6TwJpowuSw+jRHoAoDXmnWZ/S1USwZJWQ8sG+/O/zMs0PFlLaLJQyvMYHE3zL8Rs9Nfc9NGayb67WVswiIgAiIgAg0T0BiicQSiSUVPocmmqy9bjZafliiSYWwRyRdhtGgNJoz8kIXS67duMn9eOfdDi8RhBCEkq9+7fJou+ue3e6O7T9wN37/JvebE69E3yuvutohiMzMzS+HOzI1iMIQdljcUQJMCNeoJyZ09QUSf595SvA60bPUHgYjulVdEgEREAEREIHOE5BYIrFEYkkNj/mJsx+46376sjPR5E8ff1pDrsrCCMg4a49xllRXoYsliBsIIQgWV1zxzRViyWWXfdGdOfume/6FBYcgQhjfs8SEEQSUt95ejK4Th3BJcUMQRYaV4ZWNn3Ubtk0nfm3+Eq16065n0fpQbUVABERABESgjwQklkgskVhS45N/6q0PI9FkzcaB2/3Y606iST3wkwxwnWuP0Ra6WIJniQkINoTGRBAEEq6bJwnhksQSC891SyMpruUT4pZ60nPVnucqTV3V00MrFxEQAREQAREIk4DEEoklEksaeDbfWPzY3bb3VSfRpB74aYwChQnXyAtdLDFxwxc6TPywYTkMubFwvzjwiHv80FORwGLh8Egxz5IvrV8fXUuKG6JIYmWSWBLuM5S3f6unh1YuIiACIiACIhAmAYklEkskljT4bP7u/J8j0eTSq6bdjgNn3PkPPmmwNN3NOq+hoHhhGH+hiyXMV2KCge3bKjfMQYIQwjAbBBPCMSQHkYRJXi0c4onNZYKognCSFNfyCXErsSSM56XMfqu7bwXdmQiIgAiIgAiMJyCxRGKJxJLxz0nlIRBN7th/KvI0kWhSPu4yjQelVb9BGLpYEqJw0USZJJbU/2xU3R+V3xsrRREQAREQARFoDwGJJRJLJJYE9LziWYJYwvAchukgouhTnEDVBoXSr9ZIlFhyYdlzpQkRJG2eEkuqfQ6a6GeK975KQQREQAREQATaSyASS9pbfJVcBLpJANHk7kfPSjQpqXqbMDKUZ3mGo8QSiSV6nsp7nrKwLKkLVjIiIAIiIAIi0EoCEktaWW0qdF4TNq8AACAASURBVF8IsFoOq+bgaXLjz046VtPRJzuBLMaBwjZjlI3iLrFEYsmo9qFr1T2z2XtbxRABERABERCB7hCQWNKdutSddJiAiSZrr5uNlh6WaJKtsmVMVWdM1cFWYonEkjramfJY3U9k62kVWgREQAREQAS6RUBiSbfqU3fTcQKffPoX9+DkOWeiyQun/tDxOy7n9mQErTaC2sREYonEkja11y6VtZweWKmIgAiIgAiIQDsJSCxpZ72p1D0nYKLJF7Yec9/aseAkmoxuEF0yXvp4LxJLJJb0sd2HcM+je1ZdFQEREAEREIFuE5BY0u361d31gMDjs4vORJPZly/04I6z32IIRofKkN+75fwNlzgEky5977z62k7dT1Q3N1zi1M7zt/MQ2WXvbRVDBERABERABLpDQGJJd+pSd9JzAiaafPn24+7Iwns9p7Hy9kM0QlSmbhmVWevzsxuOSFg42+82kLXNNBF+ZU+qIxEQAREQARHoFwGJJf2qb91tDwgglCCY8H36+Xd7cMfjb7EJI0N5yhAe1QYklqh9jGofoVwb37sqhAiIgAiIgAh0l4DEku7Wre6s5wRMNGGIDl4nff6EYnioHDKQrQ1ILFFbsLYQ8rbP7w3duwiIgAiIgAhILFEbEIGOE2DyVyaB7bNoErIxorL102iWWNLPem/b897x16NuTwREQAREQARGEpBYMhKPLopAdwiYaMKywyw/zIo6ffm0zUBRebtvSEss6X4dd+E57ss7QvcpAiIgAiIgAkkEJJYkUdE5EegwgRNnP3DX/fRl1yfRpAtGi+6hW8a1xJJu1WdXn88Ovwp1ayIgAiIgAiIwloDEkrGIFEAEukng1FsfLosmux973f3p40+7eaPOadURrToSXBuQWCKxpA0CS2dfCroxERABERABEUhBQGJJCkgKIgJdJvDG4sfutr2vujUbB66rokkbjBKVsV/Gs8SSftV3W5/vLr/7dG8iIAIiIAIiMI6AxJJxhHRdBHpC4Hfn/7wsmuw4cMad/+CTztx5Ww0Vlbu7BrXEku7WbZee2868BHQjIiACIiACIpCDgMSSHNAURQS6TADR5I79pyJPk66IJl0yXnQv3TCyJZZ0ox67/jx2+V2nexMBERABERCBcQQklowjpOsi0FMCeJYgljA8B/EEEaWtn64bNLq/9hnevliy++Hn3M8ffc6xTarLux56duT5V4/PRNeHhZvYNznyelKe8XOWR9rz8XBpj4fdQ5r4WeMalzRp9zVMW/t8lVsEREAEREAEyiAgsaQMikpDBDpMANHk7kfPRqIJc5u0UTTpq6Gj+w5XRDGx5MLJObdt75KY8b17nkkURd5YmI3OI1gMpgaOONQt5985Mee+8s9POa5Z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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "![image.png](attachment:image.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. `make_rhistory`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1. 입력데이터\n", "- 입력\n", " - 프로젝트 진행시 입력데이터 : 신호이력에 대한 쿼리\n", " - 현재 입력데이터 : `history.csv`(하루치의 신호이력)\n", "- 컬럼 : 교차로번호, 종료유닉스, (링, 현시)별 현시시간 (`dura_A1`, ..., `dura_B8`), 주기, 옵셋" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inter_noend_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7...dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleoffset
00206170438052033352626000...33352626000012010
1120217043805393910100000...39101000000140103
22178170438054038394023000...38394023000014050
332011704380540242417581700...2424175817000140133
44177170438055036206826000...36206826000015035
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 inter_no end_unix dura_A1 dura_A2 dura_A3 dura_A4 \\\n", "0 0 206 1704380520 33 35 26 26 \n", "1 1 202 1704380539 39 101 0 0 \n", "2 2 178 1704380540 38 39 40 23 \n", "3 3 201 1704380540 24 24 17 58 \n", "4 4 177 1704380550 36 20 68 26 \n", "\n", " dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n", "0 0 0 0 ... 33 35 26 26 \n", "1 0 0 0 ... 39 101 0 0 \n", "2 0 0 0 ... 38 39 40 23 \n", "3 17 0 0 ... 24 24 17 58 \n", "4 0 0 0 ... 36 20 68 26 \n", "\n", " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n", "0 0 0 0 0 120 10 \n", "1 0 0 0 0 140 103 \n", "2 0 0 0 0 140 50 \n", "3 17 0 0 0 140 133 \n", "4 0 0 0 0 150 35 \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self = SignalGenerator()\n", "# 1. 데이터 준비\n", "self.prepare_data()\n", "self.history.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 출력 데이터\n", "- 출력 : `rhistory`\n", "- 컬럼 : 교차로번호, 시작유닉스, (링, 현시)별 현시시간 (`dura_A1`, ..., `dura_B8`), 주기\n", "- 설명 : 신호이력 로드, 슬라이싱(30분, 10분), 종료유닉스를 시작유닉스로 변경 등" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycle
18821751704415950434555370000434533590000180
18841771704415979432770400000432770400000180
18832061704416010455326260000455326260000150
18851781704416010383943500000383971220000170
18861761704415999371034000000371034000000180
\n", "
" ], "text/plain": [ " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", "1882 175 1704415950 43 45 55 37 0 \n", "1884 177 1704415979 43 27 70 40 0 \n", "1883 206 1704416010 45 53 26 26 0 \n", "1885 178 1704416010 38 39 43 50 0 \n", "1886 176 1704415999 37 103 40 0 0 \n", "\n", " dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n", "1882 0 0 0 43 45 33 59 0 \n", "1884 0 0 0 43 27 70 40 0 \n", "1883 0 0 0 45 53 26 26 0 \n", "1885 0 0 0 38 39 71 22 0 \n", "1886 0 0 0 37 103 40 0 0 \n", "\n", " dura_B6 dura_B7 dura_B8 cycle \n", "1882 0 0 0 180 \n", "1884 0 0 0 180 \n", "1883 0 0 0 150 \n", "1885 0 0 0 170 \n", "1886 0 0 0 180 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.make_rhistory()\n", "self.rhistory.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3 검증요건\n", "1. 현재시점으로부터 `substractor`(30분) 동안의 신호이력 로드되었는가?\n", "2. 현재시점 + `adder`(10분)에 한 주기가 신호 추가되었는가?\n", "3. 종료유닉스가 시작유닉스로 잘 변환되었는가?\n", " - 이전 종료유닉스가 존재하지 않으면 현재 종료유닉스로부터 현시시간 합의 차로 한다.\n", " - 이전 종료유닉스가 존재하면 abs < 10인 경우 이전 종료유닉스로 하고, abs > 10인 경우 현시시간 합의 차로 한다.\n", "4. 존재하지 않는 교차로에 대하여 한 주기 신호 추가되었는가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4 검증" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1704415950\n", "1704417900 1950\n", "1704418320 420\n" ] } ], "source": [ "# 1 : 약 30분(1800초) 동안의 신호이력이 로드되었음\n", "# 2 : 현재시점으로부터 약 10분(600초)이 경과한 시점까지의 신호이력이 로드되었음\n", "print(self.rhistory.start_unix.min())\n", "print(self.present_time, self.present_time - self.rhistory.start_unix.min())\n", "print(self.rhistory.start_unix.max(), self.rhistory.start_unix.max() - self.present_time)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inter_noend_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7...dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleoffset
18861886176170441618037103400000...371034000000180169
18941894176170441636137103400000...371034000000180169
19021902176170441654037103400000...371034000000180169
19091909176170441671937103400000...371034000000180169
19181918176170441690037103400000...371034000000180169
19291929176170441708037103400000...371034000000180169
19361936176170441725937103400000...371034000000180169
19451945176170441744037103400000...371034000000180169
19521952176170441762037103400000...371034000000180169
19601960176170441780037103400000...371034000000180169
\n", "

10 rows × 21 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 inter_no end_unix dura_A1 dura_A2 dura_A3 dura_A4 \\\n", "1886 1886 176 1704416180 37 103 40 0 \n", "1894 1894 176 1704416361 37 103 40 0 \n", "1902 1902 176 1704416540 37 103 40 0 \n", "1909 1909 176 1704416719 37 103 40 0 \n", "1918 1918 176 1704416900 37 103 40 0 \n", "1929 1929 176 1704417080 37 103 40 0 \n", "1936 1936 176 1704417259 37 103 40 0 \n", "1945 1945 176 1704417440 37 103 40 0 \n", "1952 1952 176 1704417620 37 103 40 0 \n", "1960 1960 176 1704417800 37 103 40 0 \n", "\n", " dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n", "1886 0 0 0 ... 37 103 40 0 \n", "1894 0 0 0 ... 37 103 40 0 \n", "1902 0 0 0 ... 37 103 40 0 \n", "1909 0 0 0 ... 37 103 40 0 \n", "1918 0 0 0 ... 37 103 40 0 \n", "1929 0 0 0 ... 37 103 40 0 \n", "1936 0 0 0 ... 37 103 40 0 \n", "1945 0 0 0 ... 37 103 40 0 \n", "1952 0 0 0 ... 37 103 40 0 \n", "1960 0 0 0 ... 37 103 40 0 \n", "\n", " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n", "1886 0 0 0 0 180 169 \n", "1894 0 0 0 0 180 169 \n", "1902 0 0 0 0 180 169 \n", "1909 0 0 0 0 180 169 \n", "1918 0 0 0 0 180 169 \n", "1929 0 0 0 0 180 169 \n", "1936 0 0 0 0 180 169 \n", "1945 0 0 0 0 180 169 \n", "1952 0 0 0 0 180 169 \n", "1960 0 0 0 0 180 169 \n", "\n", "[10 rows x 21 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycle
18861761704415999371034000000371034000000180
18941761704416180371034000000371034000000180
19021761704416361371034000000371034000000180
19091761704416540371034000000371034000000180
19181761704416719371034000000371034000000180
19291761704416900371034000000371034000000180
19361761704417080371034000000371034000000180
19451761704417259371034000000371034000000180
19521761704417440371034000000371034000000180
19601761704417620371034000000371034000000180
01761704418320371034000000371034000000180
\n", "
" ], "text/plain": [ " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", "1886 176 1704415999 37 103 40 0 0 \n", "1894 176 1704416180 37 103 40 0 0 \n", "1902 176 1704416361 37 103 40 0 0 \n", "1909 176 1704416540 37 103 40 0 0 \n", "1918 176 1704416719 37 103 40 0 0 \n", "1929 176 1704416900 37 103 40 0 0 \n", "1936 176 1704417080 37 103 40 0 0 \n", "1945 176 1704417259 37 103 40 0 0 \n", "1952 176 1704417440 37 103 40 0 0 \n", "1960 176 1704417620 37 103 40 0 0 \n", "0 176 1704418320 37 103 40 0 0 \n", "\n", " dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n", "1886 0 0 0 37 103 40 0 0 \n", "1894 0 0 0 37 103 40 0 0 \n", "1902 0 0 0 37 103 40 0 0 \n", "1909 0 0 0 37 103 40 0 0 \n", "1918 0 0 0 37 103 40 0 0 \n", "1929 0 0 0 37 103 40 0 0 \n", "1936 0 0 0 37 103 40 0 0 \n", "1945 0 0 0 37 103 40 0 0 \n", "1952 0 0 0 37 103 40 0 0 \n", "1960 0 0 0 37 103 40 0 0 \n", "0 0 0 0 37 103 40 0 0 \n", "\n", " dura_B6 dura_B7 dura_B8 cycle \n", "1886 0 0 0 180 \n", "1894 0 0 0 180 \n", "1902 0 0 0 180 \n", "1909 0 0 0 180 \n", "1918 0 0 0 180 \n", "1929 0 0 0 180 \n", "1936 0 0 0 180 \n", "1945 0 0 0 180 \n", "1952 0 0 0 180 \n", "1960 0 0 0 180 \n", "0 0 0 0 180 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 3\n", "inter_no = 176\n", "h = self.history[(self.history.inter_no==inter_no) & (self.history.end_unix <= self.present_time) & (self.history.end_unix > self.present_time - self.subtractor)]\n", "rh = self.rhistory[self.rhistory.inter_no==inter_no]\n", "display(h)\n", "display(rh)\n", "# 이전 종료유닉스가 존재하지 않을 경우 : index 1802\n", "# print(h.loc[2183, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2)\n", "# 이전 종료유닉스가 존재할 경우 : index 1810 ~ " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{201, 202, 206, 175, 176, 177, 178, 210}\n", "{201, 202, 206, 175, 176, 177, 178, 210}\n" ] } ], "source": [ "# 4 : 현재시점에서는 검증할 수 없음. 하지만 이전에 검증하였음.\n", "print(set(self.history.inter_no))\n", "print(set(self.rhistory.inter_no))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. `make_rhists`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1. 입력데이터\n", "- 입력 : `rhistory`\n", "- 컬럼 : 교차로번호, 시작유닉스, (링, 현시)별 현시시간 (`dura_A1`, ..., `dura_B8`), 주기" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycle
18821751704415950434555370000434533590000180
18841771704415979432770400000432770400000180
18832061704416010455326260000455326260000150
18851781704416010383943500000383971220000170
18861761704415999371034000000371034000000180
\n", "
" ], "text/plain": [ " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", "1882 175 1704415950 43 45 55 37 0 \n", "1884 177 1704415979 43 27 70 40 0 \n", "1883 206 1704416010 45 53 26 26 0 \n", "1885 178 1704416010 38 39 43 50 0 \n", "1886 176 1704415999 37 103 40 0 0 \n", "\n", " dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n", "1882 0 0 0 43 45 33 59 0 \n", "1884 0 0 0 43 27 70 40 0 \n", "1883 0 0 0 45 53 26 26 0 \n", "1885 0 0 0 38 39 71 22 0 \n", "1886 0 0 0 37 103 40 0 0 \n", "\n", " dura_B6 dura_B7 dura_B8 cycle \n", "1882 0 0 0 180 \n", "1884 0 0 0 180 \n", "1883 0 0 0 150 \n", "1885 0 0 0 170 \n", "1886 0 0 0 180 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.rhistory.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2. 출력데이터\n", "- 출력 : `rhists`\n", "- 컬럼 : 교차로번호, 시작유닉스, (링, 현시)별 현시시간 (`dura_A1`, ..., `dura_B8`), 주기, 유닉스차이(`D_n`), 현시시간합(`S_n`)\n", "- 설명 : `rhistory`에 대하여 참값프로세스 진행 후 현재시점 - `substractor//2`(15분)로 슬라이싱" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 검증요건\n", "1. 결측치 처리\n", "2. 이상치 처리 (삭제, 대체)\n", "3. D_n, S_n의 계산 적정성 여부" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4 검증" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "1704451200\n", "avant tout precedures\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8...dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleD_nS_ndiff
02061704449330466226260000...2626000016000NaN
12061704449490466226260000...26260000160160160160.0
22061704449650466226260000...26260000160320320160.0
32061704449810466226260000...26260000160480480160.0
42061704449970466226260000...26260000160640640160.0
52061704450130466226260000...26260000160800800160.0
62061704450290466226260000...26260000160960960160.0
72061704450450466226260000...26260000160960960160.0
82061704450610466226260000...26260000160960960160.0
92061704450771466226260000...26260000160961960161.0
102061704450930466226260000...26260000160960960159.0
112061704451610466226260000...26260000160839320680.0
\n", "

12 rows × 22 columns

\n", "
" ], "text/plain": [ " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", "0 206 1704449330 46 62 26 26 0 \n", "1 206 1704449490 46 62 26 26 0 \n", "2 206 1704449650 46 62 26 26 0 \n", "3 206 1704449810 46 62 26 26 0 \n", "4 206 1704449970 46 62 26 26 0 \n", "5 206 1704450130 46 62 26 26 0 \n", "6 206 1704450290 46 62 26 26 0 \n", "7 206 1704450450 46 62 26 26 0 \n", "8 206 1704450610 46 62 26 26 0 \n", "9 206 1704450771 46 62 26 26 0 \n", "10 206 1704450930 46 62 26 26 0 \n", "11 206 1704451610 46 62 26 26 0 \n", "\n", " dura_A6 dura_A7 dura_A8 ... dura_B3 dura_B4 dura_B5 dura_B6 \\\n", "0 0 0 0 ... 26 26 0 0 \n", "1 0 0 0 ... 26 26 0 0 \n", "2 0 0 0 ... 26 26 0 0 \n", "3 0 0 0 ... 26 26 0 0 \n", "4 0 0 0 ... 26 26 0 0 \n", "5 0 0 0 ... 26 26 0 0 \n", "6 0 0 0 ... 26 26 0 0 \n", "7 0 0 0 ... 26 26 0 0 \n", "8 0 0 0 ... 26 26 0 0 \n", "9 0 0 0 ... 26 26 0 0 \n", "10 0 0 0 ... 26 26 0 0 \n", "11 0 0 0 ... 26 26 0 0 \n", "\n", " dura_B7 dura_B8 cycle D_n S_n diff \n", "0 0 0 160 0 0 NaN \n", "1 0 0 160 160 160 160.0 \n", "2 0 0 160 320 320 160.0 \n", "3 0 0 160 480 480 160.0 \n", "4 0 0 160 640 640 160.0 \n", "5 0 0 160 800 800 160.0 \n", "6 0 0 160 960 960 160.0 \n", "7 0 0 160 960 960 160.0 \n", "8 0 0 160 960 960 160.0 \n", "9 0 0 160 961 960 161.0 \n", "10 0 0 160 960 960 159.0 \n", "11 0 0 160 839 320 680.0 \n", "\n", "[12 rows x 22 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "apres tout precedures\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8...dura_B4dura_B5dura_B6dura_B7dura_B8cycleD_nS_nUnnamed: 0diff
02061704449330466226260000...2600001600.00.0NaNNaN
12061704449490466226260000...260000160160.0160.0NaN160.0
22061704449650466226260000...260000160320.0320.0NaN160.0
32061704449810466226260000...260000160480.0480.0NaN160.0
42061704449970466226260000...260000160640.0640.0NaN160.0
52061704450130466226260000...260000160800.0800.0NaN160.0
62061704450290466226260000...260000160960.0960.0NaN160.0
72061704450450466226260000...260000160960.0960.0NaN160.0
82061704450610466226260000...260000160960.0960.0NaN160.0
92061704450771466226260000...260000160961.0960.0NaN161.0
102061704450930466226260000...260000160960.0960.0NaN159.0
112061704451090466226260000...260000160960.0960.027.0160.0
122061704451250466226260000...260000160960.0960.027.0160.0
132061704451410466226260000...260000160960.0960.027.0160.0
142061704451570466226260000...260000160960.0960.027.0160.0
\n", "

15 rows × 23 columns

\n", "
" ], "text/plain": [ " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", "0 206 1704449330 46 62 26 26 0 \n", "1 206 1704449490 46 62 26 26 0 \n", "2 206 1704449650 46 62 26 26 0 \n", "3 206 1704449810 46 62 26 26 0 \n", "4 206 1704449970 46 62 26 26 0 \n", "5 206 1704450130 46 62 26 26 0 \n", "6 206 1704450290 46 62 26 26 0 \n", "7 206 1704450450 46 62 26 26 0 \n", "8 206 1704450610 46 62 26 26 0 \n", "9 206 1704450771 46 62 26 26 0 \n", "10 206 1704450930 46 62 26 26 0 \n", "11 206 1704451090 46 62 26 26 0 \n", "12 206 1704451250 46 62 26 26 0 \n", "13 206 1704451410 46 62 26 26 0 \n", "14 206 1704451570 46 62 26 26 0 \n", "\n", " dura_A6 dura_A7 dura_A8 ... dura_B4 dura_B5 dura_B6 dura_B7 \\\n", "0 0 0 0 ... 26 0 0 0 \n", "1 0 0 0 ... 26 0 0 0 \n", "2 0 0 0 ... 26 0 0 0 \n", "3 0 0 0 ... 26 0 0 0 \n", "4 0 0 0 ... 26 0 0 0 \n", "5 0 0 0 ... 26 0 0 0 \n", "6 0 0 0 ... 26 0 0 0 \n", "7 0 0 0 ... 26 0 0 0 \n", "8 0 0 0 ... 26 0 0 0 \n", "9 0 0 0 ... 26 0 0 0 \n", "10 0 0 0 ... 26 0 0 0 \n", "11 0 0 0 ... 26 0 0 0 \n", "12 0 0 0 ... 26 0 0 0 \n", "13 0 0 0 ... 26 0 0 0 \n", "14 0 0 0 ... 26 0 0 0 \n", "\n", " dura_B8 cycle D_n S_n Unnamed: 0 diff \n", "0 0 160 0.0 0.0 NaN NaN \n", "1 0 160 160.0 160.0 NaN 160.0 \n", "2 0 160 320.0 320.0 NaN 160.0 \n", "3 0 160 480.0 480.0 NaN 160.0 \n", "4 0 160 640.0 640.0 NaN 160.0 \n", "5 0 160 800.0 800.0 NaN 160.0 \n", "6 0 160 960.0 960.0 NaN 160.0 \n", "7 0 160 960.0 960.0 NaN 160.0 \n", "8 0 160 960.0 960.0 NaN 160.0 \n", "9 0 160 961.0 960.0 NaN 161.0 \n", "10 0 160 960.0 960.0 NaN 159.0 \n", "11 0 160 960.0 960.0 27.0 160.0 \n", "12 0 160 960.0 960.0 27.0 160.0 \n", "13 0 160 960.0 960.0 27.0 160.0 \n", "14 0 160 960.0 960.0 27.0 160.0 \n", "\n", "[15 rows x 23 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 1. 마지막 시점에 결측 발생 -> 결측처리 이상없음\n", "# 2. 결측 처리 후에 발생하는 이상치 -> 이상치처리 이상없음\n", "### 3. D_n, S_n 계산에 이상있음. D_n과 S_n이 대부분의 경우에 다르므로, 대부분의 경우를 거짓값으로 판단한 채로 진행하고 있음.\n", "# 다만, 이렇게 하여도 결과에는 영향은 없음. D_n과 S_n이 다르면 단지 계산량이 많아져서 구동시간에 부하가 걸렸을 수 있음.\n", "# 또한, D_n은 무조건 900이 나오도록 설정되어 있으나, 이는 적절하지 못함. 전반적인 검토가 필요함. (2023. 2. 13)\n", "# make_rhist의 경우에 이전 코드로 회귀하였고, 앞서 언급한 문제가 사라짐 (2023. 2. 13)\n", "import numpy as np\n", "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 19, 40).timestamp())\n", "self.prepare_data()\n", "self.make_rhistory()\n", "print(int(self.present_time))\n", "\n", "inter_no = 206\n", "self.rhist = self.rhistory.copy()[self.rhistory.inter_no==inter_no]\n", "self.rhist = self.rhist.drop_duplicates(subset=['start_unix']).reset_index(drop=True)\n", "\n", "# D_n 및 S_n 값 정의\n", "self.rhist['D_n'] = 0 # D_n : 시간차이\n", "self.rhist['S_n'] = 0 # S_n : 현시시간합\n", "for n in range(len(self.rhist)):\n", " curr_unix = self.rhist.iloc[n].start_unix # current start_unix\n", " self.rhist.loc[n, ['D_n', 'S_n']] = self.calculate_DS(self.rhist, curr_unix)\n", "\n", "print('avant tout precedures')\n", "rhist_diff = self.rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n", "display(rhist_diff)\n", "\n", "# 이전시각, 현재시각\n", "prev_unix = self.rhist.loc[0, 'start_unix'] # previous start_unix\n", "curr_unix = self.rhist.loc[1, 'start_unix'] # current start_unix\n", "\n", "# rhist의 마지막 행에 도달할 때까지 반복\n", "while True:\n", " n = self.rhist[self.rhist.start_unix==curr_unix].index[0]\n", " cycle = self.rhist.loc[n, 'cycle']\n", " D_n = self.rhist.loc[n, 'D_n']\n", " S_n = self.rhist.loc[n, 'S_n']\n", " # 참값인 경우\n", " if (abs(D_n - S_n) <= 5):\n", " pass\n", " # 참값이 아닌 경우\n", " else:\n", " # 2-1-1. 결측치 처리 : 인접한 두 start_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단, 신호계획의 현시시간으로 \"대체\"\n", " if curr_unix - prev_unix >= 2 * cycle:\n", " # prev_unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", " # (curr_unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", " while curr_unix - prev_unix > cycle:\n", " prev_unix += cycle\n", " # 신호 계획(prow) 불러오기\n", " start_seconds = np.array(self.timetable.start_seconds)\n", " idx = (start_seconds <= prev_unix).sum() - 1\n", " start_hour = self.timetable.iloc[idx].start_hour\n", " start_minute = self.timetable.iloc[idx].start_minute\n", " prow = self.plan.copy()[(self.plan.inter_no==inter_no) & (self.plan.start_hour==start_hour) & (self.plan.start_minute==start_minute)] # planned row\n", " # prow에서 필요한 부분을 rhist에 추가\n", " prow['start_unix'] = prev_unix\n", " prow = prow.drop(['start_hour', 'start_minute', 'offset'], axis=1)\n", " cycle = prow.iloc[0].cycle\n", " self.rhist = pd.concat([self.rhist, prow])\n", " self.rhist = self.rhist.sort_values(by='start_unix').reset_index(drop=True)\n", " n += 1\n", "\n", " # 2-1-2. 이상치 처리 : 비율에 따라 해당 행을 \"삭제\"(R_n <= 0.5) 또는 \"조정\"(R_n > 0.5)한다\n", " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", " # R_n이 0.5보다 작거나 같으면 해당 행을 삭제\n", " if R_n <= 0.5:\n", " self.rhist = self.rhist.drop(index=n).reset_index(drop=True)\n", " if n >= self.rhist.index[-1]:\n", " break\n", " # 행삭제에 따른 curr_unix, R_n 재정의\n", " curr_unix = self.rhist.loc[n, 'start_unix']\n", " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", "\n", " # R_n이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n", " if R_n > 0.5:\n", " # 신호 계획(prow) 불러오기\n", " start_seconds = np.array(self.timetable.start_seconds)\n", " idx = (start_seconds <= curr_unix).sum() - 1\n", " start_hour = self.timetable.iloc[idx].start_hour\n", " start_minute = self.timetable.iloc[idx].start_minute\n", " prow = self.plan[(self.plan.inter_no==inter_no) & (self.plan.start_hour==start_hour) & (self.plan.start_minute==start_minute)] # planned row\n", " # 조정된 현시시간 (prow에 R_n을 곱하고 정수로 바꿈)\n", " adjusted_dur = prow.copy()[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n", " int_parts = adjusted_dur.iloc[0].apply(lambda x: int(x))\n", " frac_parts = adjusted_dur.iloc[0] - int_parts\n", " difference = round(adjusted_dur.iloc[0].sum()) - int_parts.sum()\n", " for _ in range(difference): # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n", " max_frac_index = frac_parts.idxmax()\n", " int_parts[max_frac_index] += 1\n", " frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n", " # rhist에 조정된 현시시간을 반영\n", " self.rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n", " self.rhist.loc[n, 'cycle'] = int_parts.sum().sum() // 2\n", "\n", " if n >= self.rhist.index[-1]:\n", " break\n", " prev_unix = curr_unix\n", " curr_unix = self.rhist.loc[n+1, 'start_unix']\n", "\n", "# # 생략해도 무방할 코드\n", "# self.rhist = self.rhist.reset_index(drop=True)\n", "# self.rhist = self.rhist.sort_values(by=['start_unix'])\n", "\n", "# D_n 및 S_n 값 재정의\n", "for n in range(len(self.rhist)):\n", " curr_unix = self.rhist.iloc[n].start_unix # current start_unix\n", " self.rhist.loc[n, ['D_n', 'S_n']] = self.calculate_DS(self.rhist, curr_unix)\n", " \n", "print('apres tout precedures')\n", "rhist_diff = self.rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n", "display(rhist_diff)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "self.make_rhists()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. `make_hrhists`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1. 입력데이터\n", "- 입력 : `rhists`\n", "- 컬럼 : 교차로번호, 시작유닉스, (링, 현시)별 현시시간 (`dura_A1`, ..., `dura_B8`), 주기, 유닉스차이(`D_n`), 현시시간합(`S_n`), 옵셋" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2. 출력데이터\n", "- 출력 : `hrhists`\n", "- 컬럼 : 교차로번호, 시작유닉스, A현시번호, B현시번호, 현시시간\n", "- 설명 : `rhists`를 계층화" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixphas_Aphas_Bduration
020117044503201136
120117044503202250
220117044503203318
320117044503204458
420117044503205518
\n", "
" ], "text/plain": [ " inter_no start_unix phas_A phas_B duration\n", "0 201 1704450320 1 1 36\n", "1 201 1704450320 2 2 50\n", "2 201 1704450320 3 3 18\n", "3 201 1704450320 4 4 58\n", "4 201 1704450320 5 5 18" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.make_hrhists()\n", "self.hrhists.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 검증요건\n", "1. 계층화가 잘 이루어졌는가?\n", "2. `hrhists`의 시작유닉스의 최소시각과 최대시각이 적정한가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.4 검증" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleD_nS_nUnnamed: 0
61751704450370464855410000464837590000190950.0950.0NaN
\n", "
" ], "text/plain": [ " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 dura_A6 \\\n", "6 175 1704450370 46 48 55 41 0 0 \n", "\n", " dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 dura_B6 \\\n", "6 0 0 46 48 37 59 0 0 \n", "\n", " dura_B7 dura_B8 cycle D_n S_n Unnamed: 0 \n", "6 0 0 190 950.0 950.0 NaN " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixphas_Aphas_Bduration
017517044503701146
117517044503702248
217517044503703337
317517044503703418
417517044503704441
\n", "
" ], "text/plain": [ " inter_no start_unix phas_A phas_B duration\n", "0 175 1704450370 1 1 46\n", "1 175 1704450370 2 2 48\n", "2 175 1704450370 3 3 37\n", "3 175 1704450370 3 4 18\n", "4 175 1704450370 4 4 41" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 1\n", "### 계층화상의 오류 발견. 오버랩현시가 일어나는 경우 현시시간이 제대로 계산되지 않았음.\n", "# durs_A = [getattr(row, f'dura_A{j}') for j in range(1, 9)]\n", "# durs_B = [getattr(row, f'dura_A{j}') for j in range(1, 9)]\n", "# 에서 durs_B의 코드 잘못됨. 수정완료.\n", "inter_no = 175\n", "start_unix = self.rhists[self.rhists.inter_no==inter_no].start_unix.min()\n", "with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n", " display(self.rhists[(self.rhists.inter_no==inter_no)&(self.rhists.start_unix==start_unix)])\n", "display(self.hrhists[(self.hrhists.inter_no==inter_no)&(self.hrhists.start_unix==start_unix)])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1800\n", "600\n", "1290\n", "410 880\n" ] } ], "source": [ "# 2\n", "# 30분(= self.subtractor, 1800초)의 신호이력을 가져온 뒤 참값프로세스를 거치면서 현재시점 - 15분(900초)의 데이터만 슬라이싱한다.\n", "print(self.subtractor)\n", "# 현재시점 + 10분(=self.adder, 600초)에 가상의 신호이력을 생성한다.\n", "print(self.adder)\n", "# 따라서 hrhists에는 약 900 + 600 = 1500만큼의 시작유닉스가 형성되어 있음.\n", "print(self.hrhists.start_unix.max() - self.hrhists.start_unix.min())\n", "print(self.hrhists.start_unix.max() - self.present_time, self.present_time - self.hrhists.start_unix.min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. `save_movement`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1. 입력데이터\n", "- 입력\n", " - 프로젝트 진행시 입력데이터 : 이동류정보에 대한 쿼리\n", " - 현재 입력데이터 : `movement_[timestamp].csv`, 현재시점으로부터 5분 이내의 이동류정보. 5초단위로 수집.\n", "- 컬럼 : 교차로번호, A현시번호, B현시번호, A이동류번호, B이동류번호" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inter_nophas_Aphas_Bmove_Amove_B
001753361
101761184
201771184
301783352
402014461
50202221718
60206221718
7021011618
\n", "
" ], "text/plain": [ " Unnamed: 0 inter_no phas_A phas_B move_A move_B\n", "0 0 175 3 3 6 1\n", "1 0 176 1 1 8 4\n", "2 0 177 1 1 8 4\n", "3 0 178 3 3 5 2\n", "4 0 201 4 4 6 1\n", "5 0 202 2 2 17 18\n", "6 0 206 2 2 17 18\n", "7 0 210 1 1 6 18" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inter_nophas_Aphas_Bmove_Amove_B
001753361
101761184
201771184
301783352
402014461
50202221718
602061184
7021011618
\n", "
" ], "text/plain": [ " Unnamed: 0 inter_no phas_A phas_B move_A move_B\n", "0 0 175 3 3 6 1\n", "1 0 176 1 1 8 4\n", "2 0 177 1 1 8 4\n", "3 0 178 3 3 5 2\n", "4 0 201 4 4 6 1\n", "5 0 202 2 2 17 18\n", "6 0 206 1 1 8 4\n", "7 0 210 1 1 6 18" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(pd.read_csv(os.path.join(self.path_tables, 'move', f'move_{self.present_time - 300}.csv')))\n", "display(pd.read_csv(os.path.join(self.path_tables, 'move', f'move_{self.present_time}.csv')))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 출력데이터\n", "- 출력 : `movement`\n", "- 컬럼 : 교차로번호, A현시번호, B현시번호, A이동류번호, B이동류번호, 시작유닉스\n", "- 설명 : 5분 동안의, 5초 간격의 60개 `movement_[timestamp]`를 모아서 pd.concat함. 이때, 신호이력에서 최근의 종료유닉스를 불러와서 `movement`의 시작유닉스로 삼음." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017511841704447620
117522731704447620
217533611704447620
317534621704447620
417544521704447620
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "0 175 1 1 8 4 1704447620\n", "1 175 2 2 7 3 1704447620\n", "2 175 3 3 6 1 1704447620\n", "3 175 3 4 6 2 1704447620\n", "4 175 4 4 5 2 1704447620" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.make_movement()\n", "self.movement.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 검증요건\n", "1. 특정한 시점의 `move`가 `movement`에 잘 반영되었는가?\n", "2. 해당 시점의 `start_unix`가 `history`에서 잘 반영되었는가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 검증" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "the present time 1704451200\n", "the specific time : 1704451100\n", "move at the specific time\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017544521704450940
117622831704450940
217722731704450950
317811841704450940
420111831704451040
520211621704450950
620611841704451090
721022521704451010
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "0 175 4 4 5 2 1704450940\n", "1 176 2 2 8 3 1704450940\n", "2 177 2 2 7 3 1704450950\n", "3 178 1 1 8 4 1704450940\n", "4 201 1 1 8 3 1704451040\n", "5 202 1 1 6 2 1704450950\n", "6 206 1 1 8 4 1704451090\n", "7 210 2 2 5 2 1704451010" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "history around the specific time\n", "1704451100\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inter_noend_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7...dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleoffset
33933393210170445101043477525000...246675250000190143
339433942011704451040365018581800...3650185818000180137
33953395206170445109046622626000...46622626000016010
33963396178170445112038394459000...38398023000018075
3397339720217044511204812200000...48122000000170103
33983398175170445113046485541000...46483759000019018
33993399176170445113137113400000...371134000000190185
34003400177170445114045327736000...45327736000019049
34013401210170445120043477525000...246675250000190143
\n", "

9 rows × 21 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 inter_no end_unix dura_A1 dura_A2 dura_A3 dura_A4 \\\n", "3393 3393 210 1704451010 43 47 75 25 \n", "3394 3394 201 1704451040 36 50 18 58 \n", "3395 3395 206 1704451090 46 62 26 26 \n", "3396 3396 178 1704451120 38 39 44 59 \n", "3397 3397 202 1704451120 48 122 0 0 \n", "3398 3398 175 1704451130 46 48 55 41 \n", "3399 3399 176 1704451131 37 113 40 0 \n", "3400 3400 177 1704451140 45 32 77 36 \n", "3401 3401 210 1704451200 43 47 75 25 \n", "\n", " dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n", "3393 0 0 0 ... 24 66 75 25 \n", "3394 18 0 0 ... 36 50 18 58 \n", "3395 0 0 0 ... 46 62 26 26 \n", "3396 0 0 0 ... 38 39 80 23 \n", "3397 0 0 0 ... 48 122 0 0 \n", "3398 0 0 0 ... 46 48 37 59 \n", "3399 0 0 0 ... 37 113 40 0 \n", "3400 0 0 0 ... 45 32 77 36 \n", "3401 0 0 0 ... 24 66 75 25 \n", "\n", " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n", "3393 0 0 0 0 190 143 \n", "3394 18 0 0 0 180 137 \n", "3395 0 0 0 0 160 10 \n", "3396 0 0 0 0 180 75 \n", "3397 0 0 0 0 170 103 \n", "3398 0 0 0 0 190 18 \n", "3399 0 0 0 0 190 185 \n", "3400 0 0 0 0 190 49 \n", "3401 0 0 0 0 190 143 \n", "\n", "[9 rows x 21 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "movement around the specific time\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
721033741704451010
721044831704451010
420144611704451040
7210116181704451010
721012621704451010
420155741704451040
620611841704451090
721022521704451010
420111831704451040
62062217181704451090
317811841704451120
420122521704451040
520211621704451120
017511841704451130
117622831704451131
317822731704451120
52022217181704451120
21773317181704451140
420133621704451040
620633841704451090
017522731704451130
1176335181704451131
217744511704451140
62064417181704451090
317833521704451120
017533611704451130
117611841704451131
217711841704451140
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "7 210 3 3 7 4 1704451010\n", "7 210 4 4 8 3 1704451010\n", "4 201 4 4 6 1 1704451040\n", "7 210 1 1 6 18 1704451010\n", "7 210 1 2 6 2 1704451010\n", "4 201 5 5 7 4 1704451040\n", "6 206 1 1 8 4 1704451090\n", "7 210 2 2 5 2 1704451010\n", "4 201 1 1 8 3 1704451040\n", "6 206 2 2 17 18 1704451090\n", "3 178 1 1 8 4 1704451120\n", "4 201 2 2 5 2 1704451040\n", "5 202 1 1 6 2 1704451120\n", "0 175 1 1 8 4 1704451130\n", "1 176 2 2 8 3 1704451131\n", "3 178 2 2 7 3 1704451120\n", "5 202 2 2 17 18 1704451120\n", "2 177 3 3 17 18 1704451140\n", "4 201 3 3 6 2 1704451040\n", "6 206 3 3 8 4 1704451090\n", "0 175 2 2 7 3 1704451130\n", "1 176 3 3 5 18 1704451131\n", "2 177 4 4 5 1 1704451140\n", "6 206 4 4 17 18 1704451090\n", "3 178 3 3 5 2 1704451120\n", "0 175 3 3 6 1 1704451130\n", "1 176 1 1 8 4 1704451131\n", "2 177 1 1 8 4 1704451140" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "390\n" ] } ], "source": [ "# 특정한 시점 = self.present_time - 100\n", "# 1, 2 : 완료\n", "\n", "specific_time = self.present_time - 100\n", "print('the present time',self.present_time)\n", "print('the specific time :', specific_time)\n", "# - 아래 절차를 5초마다 반복\n", "for fsec in range(self.present_time - 300, self.present_time + 1, 5): # fsec : unix time by Five SECond\n", " # 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n", " move = pd.read_csv(os.path.join(self.path_tables, 'move', f'move_{fsec}.csv'), index_col=0)\n", " # 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로번호, 종료유닉스타임)만 수집 : B\n", " recent_histories = [group.iloc[-1:] for _, group in self.history[self.history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", " \n", " # print([group for _, group in self.history[self.history['end_unix'] < fsec].groupby('inter_no')])\n", " if not recent_histories:\n", " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", " else:\n", " rhistory = pd.concat(recent_histories)\n", " recent_unix = rhistory[['inter_no', 'end_unix']]\n", " # 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", " move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", " move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", " # 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n", " move = move.rename(columns = {'end_unix':'start_unix'})\n", " if fsec == specific_time:\n", " print('move at the specific time')\n", " display(move)\n", " # 5. 이동류 이력정보 READ\n", " # - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n", " try:\n", " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", " pass\n", " else: \n", " movement = pd.DataFrame()\n", " except NameError: # movement가 존재하지 않는 경우 생성\n", " movement = pd.DataFrame()\n", " # 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n", " movement = pd.concat([movement, move])\n", " # 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거)\n", " movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix'])\n", " # 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - self.subtractor // 2을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관)\n", " movement = movement[movement.start_unix > fsec - self.subtractor // 2]\n", " # movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", "print('history around the specific time')\n", "print(specific_time)\n", "display(self.history[(self.history.end_unix>=specific_time-100)&(self.history.end_unix<=specific_time+100)])\n", "print('movement around the specific time')\n", "display(movement[(movement.start_unix>=specific_time-100)&(movement.start_unix<=specific_time+100)])\n", "\n", "print(movement.start_unix.max() - movement.start_unix.min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. `update_movement`" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.make_movement()\n", "self.update_movement()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1. 입력데이터\n", "- 입력 : `self.movement`\n", " - 컬럼 : 교차로번호, A현시번호, B현시번호, A이동류번호, B이동류번호, 시작유닉스\n", "- 입력 : `match1`\n", " - 컬럼 : 교차로번호, A현시번호, B현시번호, A이동류번호, B이동류번호" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017711841704390001
117722731704390001
21773317181704390001
317744511704390001
420211621704390009
.....................
74820111831704393560
74920122521704393560
75020611841704393561
75120633841704393561
7522064417181704393561
\n", "

753 rows × 6 columns

\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "0 177 1 1 8 4 1704390001\n", "1 177 2 2 7 3 1704390001\n", "2 177 3 3 17 18 1704390001\n", "3 177 4 4 5 1 1704390001\n", "4 202 1 1 6 2 1704390009\n", ".. ... ... ... ... ... ...\n", "748 201 1 1 8 3 1704393560\n", "749 201 2 2 5 2 1704393560\n", "750 206 1 1 8 4 1704393561\n", "751 206 3 3 8 4 1704393561\n", "752 206 4 4 17 18 1704393561\n", "\n", "[753 rows x 6 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inter_nophas_Aphas_Bmove_Amove_B
001751184
111752273
221753361
331753462
441754452
551761184
661762283
7717633518
881771184
991772273
1010177331718
11111774451
12121781184
13131782273
14141783352
\n", "
" ], "text/plain": [ " Unnamed: 0 inter_no phas_A phas_B move_A move_B\n", "0 0 175 1 1 8 4\n", "1 1 175 2 2 7 3\n", "2 2 175 3 3 6 1\n", "3 3 175 3 4 6 2\n", "4 4 175 4 4 5 2\n", "5 5 176 1 1 8 4\n", "6 6 176 2 2 8 3\n", "7 7 176 3 3 5 18\n", "8 8 177 1 1 8 4\n", "9 9 177 2 2 7 3\n", "10 10 177 3 3 17 18\n", "11 11 177 4 4 5 1\n", "12 12 178 1 1 8 4\n", "13 13 178 2 2 7 3\n", "14 14 178 3 3 5 2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(self.movement)\n", "display(self.match1[:15])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 출력데이터\n", "- `movement_updated`\n", "- 컬럼 : 교차로번호, A현시번호, B현시번호, A이동류번호, B이동류번호, 시작유닉스\n", "- 설명\n", " - 신호이력의 처리 결과(`rhists`)와 이동류번호 테이블 `movement`을 합쳐서 통합테이블을 만들 예정임.\n", " - `rhists`와 `movement`는 모두 시작유닉스를 컬럼으로 가지고 있고 이 시작유닉스 컬럼을 포함한 열들로 `pd.merge`할 예정임.\n", " - 그런데 `rhists`에서는 결측치 처리를 하느라 새롭게 추가된 시작유닉스들이 있음. `movement`에는 이 시작유닉스들에 대한 정보가 없음. 따라서 `rhists`에는 있지만 `movement`에는 없는 시작유닉스들에 대한 행들을 만들어주어야 함. 이때, `match1` (표준적인 교차로번호-A현시번호-B현시번호-A이동류번호-B이동류번호 테이블)를 가져와 사용함." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unixUnnamed: 0
017711841704390001NaN
117722731704390001NaN
21773317181704390001NaN
317744511704390001NaN
420211621704390009NaN
........................
10662102252170439353029.0
10672103374170439353030.0
10682104483170439353031.0
10692021162170439362921.0
1070202221718170439362922.0
\n", "

1071 rows × 7 columns

\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix Unnamed: 0\n", "0 177 1 1 8 4 1704390001 NaN\n", "1 177 2 2 7 3 1704390001 NaN\n", "2 177 3 3 17 18 1704390001 NaN\n", "3 177 4 4 5 1 1704390001 NaN\n", "4 202 1 1 6 2 1704390009 NaN\n", "... ... ... ... ... ... ... ...\n", "1066 210 2 2 5 2 1704393530 29.0\n", "1067 210 3 3 7 4 1704393530 30.0\n", "1068 210 4 4 8 3 1704393530 31.0\n", "1069 202 1 1 6 2 1704393629 21.0\n", "1070 202 2 2 17 18 1704393629 22.0\n", "\n", "[1071 rows x 7 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.movement_updated" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3 검증요건\n", "1. `rhists`에는 있지만 `movement`에는 없는 시작유닉스들에 대한 행들이 `movement_updated`에 반영되었는가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.4 검증" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "206\n", "1704393480\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [inter_no, phas_A, phas_B, move_A, move_B, start_unix]\n", "Index: []" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unixUnnamed: 0
7532061184170439348023.0
754206221718170439348024.0
7552063384170439348025.0
756206441718170439348026.0
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix Unnamed: 0\n", "753 206 1 1 8 4 1704393480 23.0\n", "754 206 2 2 17 18 1704393480 24.0\n", "755 206 3 3 8 4 1704393480 25.0\n", "756 206 4 4 17 18 1704393480 26.0" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 1 잘 반영되었음.\n", "hrhists_inter_unix = set(self.hrhists[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None))\n", "movement_inter_unix = set(self.movement[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None))\n", "missing_in_movement = hrhists_inter_unix - movement_inter_unix\n", "\n", "missing_inter_no, missing_start_unix = list(missing_in_movement)[0]\n", "print(missing_inter_no)\n", "print(missing_start_unix)\n", "\n", "# expected an empty dataframe\n", "display(self.movement[(self.movement.inter_no==missing_inter_no)&(self.movement.start_unix==missing_start_unix)])\n", "# expected a nonempty dataframe\n", "display(self.movement_updated[(self.movement_updated.inter_no==missing_inter_no)&(self.movement_updated.start_unix==missing_start_unix)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. `make_histid`" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "3. 이동류정보 테이블을 변환합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.process_movement()\n", "self.merge_dfs()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.1. 입력데이터\n", "- 입력 : `hrhists`\n", " - 컬럼 : 시작유닉스, A현시번호, B현시번호, 현시시간\n", " - 설명 : 신호이력 처리 결과\n", "- 입력 : `movement_updated`\n", " - 컬럼 : 교차로번호, A현시번호, B현시번호, A이동류번호, B이동류번호, 시작유닉스\n", " - 설명 : 이동류번호 테이블 처리 결과\n", "- 입력 : `matching`\n", " - 컬럼 : 교차로번호, 이동류번호, 진입방향, 진출방향, 진입엣지id, 진출엣지id, 노드id\n", " - 설명 : 각 (노드id, 이동류번호)에 대한 (진입엣지id, 진출엣지id)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixphas_Aphas_Bduration
020217043927911139
1202170439279122101
020217043929301139
1202170439293022101
020217043930701139
..................
320617043939604426
020617043940501125
120617043940502226
220617043940503319
320617043940504419
\n", "

318 rows × 5 columns

\n", "
" ], "text/plain": [ " inter_no start_unix phas_A phas_B duration\n", "0 202 1704392791 1 1 39\n", "1 202 1704392791 2 2 101\n", "0 202 1704392930 1 1 39\n", "1 202 1704392930 2 2 101\n", "0 202 1704393070 1 1 39\n", ".. ... ... ... ... ...\n", "3 206 1704393960 4 4 26\n", "0 206 1704394050 1 1 25\n", "1 206 1704394050 2 2 26\n", "2 206 1704394050 3 3 19\n", "3 206 1704394050 4 4 19\n", "\n", "[318 rows x 5 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unixUnnamed: 0
017711841704390001NaN
117722731704390001NaN
21773317181704390001NaN
317744511704390001NaN
420211621704390009NaN
........................
10662102252170439353029.0
10672103374170439353030.0
10682104483170439353031.0
10692021162170439362921.0
1070202221718170439362922.0
\n", "

1071 rows × 7 columns

\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix Unnamed: 0\n", "0 177 1 1 8 4 1704390001 NaN\n", "1 177 2 2 7 3 1704390001 NaN\n", "2 177 3 3 17 18 1704390001 NaN\n", "3 177 4 4 5 1 1704390001 NaN\n", "4 202 1 1 6 2 1704390009 NaN\n", "... ... ... ... ... ... ... ...\n", "1066 210 2 2 5 2 1704393530 29.0\n", "1067 210 3 3 7 4 1704393530 30.0\n", "1068 210 4 4 8 3 1704393530 31.0\n", "1069 202 1 1 6 2 1704393629 21.0\n", "1070 202 2 2 17 18 1704393629 22.0\n", "\n", "[1071 rows x 7 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inc_dirout_dirinc_edgeout_edgenode_id
inter_nomove_no
17510571545870_02571542797_02i0
21571510153_02571545870_01i0
32-571542797_02571510153_01i0
43-571500487_01571542797_02i0
54571510153_02571500487_01i0
........................
2101974571500535_02-571500535_02u60
2170571511538_02.121571500535_01i6
2171571500535_02.18571500585_01i6
2172571500585_02571542115_01i6
2173-571542115_01571511538_01i6
\n", "

75 rows × 6 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 inc_dir out_dir inc_edge out_edge \\\n", "inter_no move_no \n", "175 1 0 동 남 571545870_02 571542797_02 \n", " 2 1 서 동 571510153_02 571545870_01 \n", " 3 2 남 서 -571542797_02 571510153_01 \n", " 4 3 북 남 -571500487_01 571542797_02 \n", " 5 4 서 북 571510153_02 571500487_01 \n", "... ... ... ... ... ... \n", "210 19 74 서 북 571500535_02 -571500535_02 \n", " 21 70 북 서 571511538_02.121 571500535_01 \n", " 21 71 서 남 571500535_02.18 571500585_01 \n", " 21 72 남 동 571500585_02 571542115_01 \n", " 21 73 동 북 -571542115_01 571511538_01 \n", "\n", " node_id \n", "inter_no move_no \n", "175 1 i0 \n", " 2 i0 \n", " 3 i0 \n", " 4 i0 \n", " 5 i0 \n", "... ... \n", "210 19 u60 \n", " 21 i6 \n", " 21 i6 \n", " 21 i6 \n", " 21 i6 \n", "\n", "[75 rows x 6 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(self.hrhists)\n", "display(self.movement_updated)\n", "display(self.matching)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.2 출력데이터\n", "- `histid`\n", "- 컬럼 : 교차로번호, 노드id, 시작유닉스, A현시번호, B현시번호, 현시시간, 진입엣지id_A, 진출엣지id_A, 진입엣지id_B, 진출엣지id_B\n", "- 설명 : 신호이력 처리 결과와 이동류번호 테이블 처리 결과를 합친 테이블에 진입, 진출엣지를 부여한 테이블." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
4202i917043930701139571510152_02-571510152_01571510152_01571510152_01.65
5202i9170439307022101NaNNaNNaNNaN
6202i917043932101139571510152_02-571510152_01571510152_01571510152_01.65
7202i9170439321022101NaNNaNNaNNaN
8202i917043933491139571510152_02-571510152_01571510152_01571510152_01.65
.................................
313206i717043939604426NaNNaNNaNNaN
314206i717043940501125-571511538_02571542073_02571542073_01571511538_02
315206i717043940502226NaNNaNNaNNaN
316206i717043940503319-571511538_02571542073_02571542073_01571511538_02
317206i717043940504419NaNNaNNaNNaN
\n", "

250 rows × 10 columns

\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "4 202 i9 1704393070 1 1 39 571510152_02 \n", "5 202 i9 1704393070 2 2 101 NaN \n", "6 202 i9 1704393210 1 1 39 571510152_02 \n", "7 202 i9 1704393210 2 2 101 NaN \n", "8 202 i9 1704393349 1 1 39 571510152_02 \n", ".. ... ... ... ... ... ... ... \n", "313 206 i7 1704393960 4 4 26 NaN \n", "314 206 i7 1704394050 1 1 25 -571511538_02 \n", "315 206 i7 1704394050 2 2 26 NaN \n", "316 206 i7 1704394050 3 3 19 -571511538_02 \n", "317 206 i7 1704394050 4 4 19 NaN \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "4 -571510152_01 571510152_01 571510152_01.65 \n", "5 NaN NaN NaN \n", "6 -571510152_01 571510152_01 571510152_01.65 \n", "7 NaN NaN NaN \n", "8 -571510152_01 571510152_01 571510152_01.65 \n", ".. ... ... ... \n", "313 NaN NaN NaN \n", "314 571542073_02 571542073_01 571511538_02 \n", "315 NaN NaN NaN \n", "316 571542073_02 571542073_01 571511538_02 \n", "317 NaN NaN NaN \n", "\n", "[250 rows x 10 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.histid" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.3 검증요건\n", "1. 특정한 (교차로번호, 시작유닉스, A현시번호, B현시번호)에 대하여 (현시시간, 진입엣지id_A, 진출엣지id_A, 진입엣지id_B, 진출엣지id_B)가 잘 배정되어있는가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.4 검증" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_unixphas_Aphas_Bduration
021017043938301124
121017043938301219
221017043938302229
321017043938303356
421017043938304422
\n", "
" ], "text/plain": [ " inter_no start_unix phas_A phas_B duration\n", "0 210 1704393830 1 1 24\n", "1 210 1704393830 1 2 19\n", "2 210 1704393830 2 2 29\n", "3 210 1704393830 3 3 56\n", "4 210 1704393830 4 4 22" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unixUnnamed: 0
95221011618170439383027.0
9532101262170439383028.0
9542102252170439383029.0
9552103374170439383030.0
9562104483170439383031.0
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix Unnamed: 0\n", "952 210 1 1 6 18 1704393830 27.0\n", "953 210 1 2 6 2 1704393830 28.0\n", "954 210 2 2 5 2 1704393830 29.0\n", "955 210 3 3 7 4 1704393830 30.0\n", "956 210 4 4 8 3 1704393830 31.0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0inc_dirout_dirinc_edgeout_edgenode_id
inter_nomove_no
210162-571542115_01571500585_01i6
263571500535_02.18571542115_01i6
364571500585_02571500535_01i6
465571511538_02.121571500585_01i6
566571500535_02.18571511538_01i6
667-571542115_01571500535_01i6
768571511538_02.121571542115_01i6
869571500585_02571511538_01i6
2170571511538_02.121571500535_01i6
2171571500535_02.18571500585_01i6
2172571500585_02571542115_01i6
2173-571542115_01571511538_01i6
\n", "
" ], "text/plain": [ " Unnamed: 0 inc_dir out_dir inc_edge out_edge \\\n", "inter_no move_no \n", "210 1 62 동 남 -571542115_01 571500585_01 \n", " 2 63 서 동 571500535_02.18 571542115_01 \n", " 3 64 남 서 571500585_02 571500535_01 \n", " 4 65 북 남 571511538_02.121 571500585_01 \n", " 5 66 서 북 571500535_02.18 571511538_01 \n", " 6 67 동 서 -571542115_01 571500535_01 \n", " 7 68 북 동 571511538_02.121 571542115_01 \n", " 8 69 남 북 571500585_02 571511538_01 \n", " 21 70 북 서 571511538_02.121 571500535_01 \n", " 21 71 서 남 571500535_02.18 571500585_01 \n", " 21 72 남 동 571500585_02 571542115_01 \n", " 21 73 동 북 -571542115_01 571511538_01 \n", "\n", " node_id \n", "inter_no move_no \n", "210 1 i6 \n", " 2 i6 \n", " 3 i6 \n", " 4 i6 \n", " 5 i6 \n", " 6 i6 \n", " 7 i6 \n", " 8 i6 \n", " 21 i6 \n", " 21 i6 \n", " 21 i6 \n", " 21 i6 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
125210i617043938301124-571542115_01571500535_01NaNNaN
126210i617043938301219-571542115_01571500535_01571500535_02.18571542115_01
127210i617043938302229571500535_02.18571511538_01571500535_02.18571542115_01
128210i617043938303356571511538_02.121571542115_01571511538_02.121571500585_01
129210i617043938304422571500585_02571511538_01571500585_02571500535_01
\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "125 210 i6 1704393830 1 1 24 -571542115_01 \n", "126 210 i6 1704393830 1 2 19 -571542115_01 \n", "127 210 i6 1704393830 2 2 29 571500535_02.18 \n", "128 210 i6 1704393830 3 3 56 571511538_02.121 \n", "129 210 i6 1704393830 4 4 22 571500585_02 \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "125 571500535_01 NaN NaN \n", "126 571500535_01 571500535_02.18 571542115_01 \n", "127 571511538_01 571500535_02.18 571542115_01 \n", "128 571542115_01 571511538_02.121 571500585_01 \n", "129 571511538_01 571500585_02 571500535_01 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 1 잘 배정되었음.\n", "# histid의 (inter_no, start_unix) 순서쌍 모음\n", "pairs = list(self.histid[['inter_no', 'start_unix']].itertuples(index=False, name=None))\n", "\n", "import random\n", "# 임의로 inter_no, start_unix 지정\n", "inter_no, start_unix = random.choice(pairs)\n", "# 대응되는 node_id 지정\n", "node_id = self.inter2node[inter_no]\n", "# 입력 테이블에서 해당되는 행들 목록\n", "display(self.hrhists[(self.hrhists.inter_no==inter_no)&(self.hrhists.start_unix==start_unix)])\n", "display(self.movement_updated[(self.movement_updated.inter_no==inter_no)&(self.movement_updated.start_unix==start_unix)])\n", "display(self.matching[(self.matching.node_id==node_id)])\n", "# 출력 테이블에서 해당되는 행들 목록\n", "display(self.histid[(self.histid.inter_no==inter_no)&(self.histid.start_unix==start_unix)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7. `attach_children`" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "3. 이동류정보 테이블을 변환합니다.\n", "4. 통합 테이블을 생성합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.process_movement()\n", "self.make_histids()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.1. 입력데이터\n", "- `histid`\n", " - 컬럼 : 교차로번호, 노드id, 시작유닉스, A현시번호, B현시번호, 현시시간, 진입엣지id_A, 진출엣지id_A, 진입엣지id_B, 진출엣지id_B\n", " - 설명 : 신호이력 처리 결과와 이동류번호 테이블 처리 결과를 합친 테이블에 진입, 진출엣지를 부여한 테이블.\n", "- 입력 : `match6`\n", " - 컬럼 : 노드id, 현시번호, 링타입, 진입엣지id, 진출엣지id\n", " - 설명 : 각 (노드id, 현시번호, 링타입)에 대한 (진입엣지id, 진출엣지id)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
4202i917043930701139571510152_02-571510152_01571510152_01571510152_01.65
5202i9170439307022101NaNNaNNaNNaN
6202i917043932101139571510152_02-571510152_01571510152_01571510152_01.65
7202i9170439321022101NaNNaNNaNNaN
8202i917043933491139571510152_02-571510152_01571510152_01571510152_01.65
.................................
313206i717043939604426NaNNaNNaNNaN
314206i717043940501125-571511538_02571542073_02571542073_01571511538_02
315206i717043940502226NaNNaNNaNNaN
316206i717043940503319-571511538_02571542073_02571542073_01571511538_02
317206i717043940504419NaNNaNNaNNaN
\n", "

250 rows × 10 columns

\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "4 202 i9 1704393070 1 1 39 571510152_02 \n", "5 202 i9 1704393070 2 2 101 NaN \n", "6 202 i9 1704393210 1 1 39 571510152_02 \n", "7 202 i9 1704393210 2 2 101 NaN \n", "8 202 i9 1704393349 1 1 39 571510152_02 \n", ".. ... ... ... ... ... ... ... \n", "313 206 i7 1704393960 4 4 26 NaN \n", "314 206 i7 1704394050 1 1 25 -571511538_02 \n", "315 206 i7 1704394050 2 2 26 NaN \n", "316 206 i7 1704394050 3 3 19 -571511538_02 \n", "317 206 i7 1704394050 4 4 19 NaN \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "4 -571510152_01 571510152_01 571510152_01.65 \n", "5 NaN NaN NaN \n", "6 -571510152_01 571510152_01 571510152_01.65 \n", "7 NaN NaN NaN \n", "8 -571510152_01 571510152_01 571510152_01.65 \n", ".. ... ... ... \n", "313 NaN NaN NaN \n", "314 571542073_02 571542073_01 571511538_02 \n", "315 NaN NaN NaN \n", "316 571542073_02 571542073_01 571511538_02 \n", "317 NaN NaN NaN \n", "\n", "[250 rows x 10 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idphase_noring_typeinc_edgeout_edge
0i01A-571542797_02571500487_01
1i01B-571500487_01571542797_02
2i02A-571500487_01571545870_01
3i02B-571542797_02571510153_01
4i03A571545870_02571510153_01
..................
111u602BNaNNaN
112u603ANaNNaN
113u603BNaNNaN
114u604ANaNNaN
115u604BNaNNaN
\n", "

116 rows × 5 columns

\n", "
" ], "text/plain": [ " node_id phase_no ring_type inc_edge out_edge\n", "0 i0 1 A -571542797_02 571500487_01\n", "1 i0 1 B -571500487_01 571542797_02\n", "2 i0 2 A -571500487_01 571545870_01\n", "3 i0 2 B -571542797_02 571510153_01\n", "4 i0 3 A 571545870_02 571510153_01\n", ".. ... ... ... ... ...\n", "111 u60 2 B NaN NaN\n", "112 u60 3 A NaN NaN\n", "113 u60 3 B NaN NaN\n", "114 u60 4 A NaN NaN\n", "115 u60 4 B NaN NaN\n", "\n", "[116 rows x 5 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(self.histid)\n", "display(self.match6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.2 출력데이터\n", "- `histids`\n", "- 컬럼 : 교차로번호, 노드id, 시작유닉스, A현시번호, B현시번호, 현시시간, 진입엣지id_A, 진출엣지id_A, 진입엣지id_B, 진출엣지id_B\n", "- 설명\n", " - `histid`는 신호 통합테이블이라고 할 수 있지만, 주교차로에 대해서만 그 정보가 있음.\n", " - 이미 정의해둔 `match6`에 모든 교차로(주교차로 및 부교차로)에 대한 (진입엣지id, 진출엣지id) 정보가 있음.\n", " - `match6`을 사용하여 모든 교차로에 대하여 (진입엣지id, 진출엣지id)가 지정된 신호 통합테이블 `histids`를 만듦." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
0178c3017043930101138NaNNaNNaNNaN
1178c3017043930102239571542116_01-571542116_02.96571542116_02.96571542116_02.164
2178c3017043930103340571542116_01-571542116_02.96571542116_02.96571542116_02.164
3178c3017043930104423571542116_01-571542116_02.96571542116_02.96571542116_02.164
4177i217043930101136-571542809_01571542811_01571542811_02571542809_01
.................................
475206i717043940504419NaNNaNNaNNaN
476177u2017043940501134NaNNaNNaNNaN
477177u2017043940502219NaNNaNNaNNaN
478177u2017043940503363571542810_01.51571542810_02NaNNaN
479177u2017043940504424NaNNaNNaNNaN
\n", "

480 rows × 10 columns

\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "0 178 c30 1704393010 1 1 38 NaN \n", "1 178 c30 1704393010 2 2 39 571542116_01 \n", "2 178 c30 1704393010 3 3 40 571542116_01 \n", "3 178 c30 1704393010 4 4 23 571542116_01 \n", "4 177 i2 1704393010 1 1 36 -571542809_01 \n", ".. ... ... ... ... ... ... ... \n", "475 206 i7 1704394050 4 4 19 NaN \n", "476 177 u20 1704394050 1 1 34 NaN \n", "477 177 u20 1704394050 2 2 19 NaN \n", "478 177 u20 1704394050 3 3 63 571542810_01.51 \n", "479 177 u20 1704394050 4 4 24 NaN \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "0 NaN NaN NaN \n", "1 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "2 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "3 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "4 571542811_01 571542811_02 571542809_01 \n", ".. ... ... ... \n", "475 NaN NaN NaN \n", "476 NaN NaN NaN \n", "477 NaN NaN NaN \n", "478 571542810_02 NaN NaN \n", "479 NaN NaN NaN \n", "\n", "[480 rows x 10 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "self.histids" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.3 검증요건\n", "1. 부교차로에 대하여 `histids`에 해당 행들이 잘 추가되었는가?\n", "2. 추가된 행의 진입엣지id, 진출엣지id가 적정한가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.4 검증" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
0178c3017043930101138NaNNaNNaNNaN
1178c3017043930102239571542116_01-571542116_02.96571542116_02.96571542116_02.164
2178c3017043930103340571542116_01-571542116_02.96571542116_02.96571542116_02.164
3178c3017043930104423571542116_01-571542116_02.96571542116_02.96571542116_02.164
62178c3017043931501138NaNNaNNaNNaN
63178c3017043931502239571542116_01-571542116_02.96571542116_02.96571542116_02.164
64178c3017043931503340571542116_01-571542116_02.96571542116_02.96571542116_02.164
65178c3017043931504423571542116_01-571542116_02.96571542116_02.96571542116_02.164
124178c3017043932901138NaNNaNNaNNaN
125178c3017043932902239571542116_01-571542116_02.96571542116_02.96571542116_02.164
126178c3017043932903340571542116_01-571542116_02.96571542116_02.96571542116_02.164
127178c3017043932904423571542116_01-571542116_02.96571542116_02.96571542116_02.164
186178c3017043934301138NaNNaNNaNNaN
187178c3017043934302239571542116_01-571542116_02.96571542116_02.96571542116_02.164
188178c3017043934303340571542116_01-571542116_02.96571542116_02.96571542116_02.164
189178c3017043934304423571542116_01-571542116_02.96571542116_02.96571542116_02.164
248178c3017043935701138NaNNaNNaNNaN
249178c3017043935702239571542116_01-571542116_02.96571542116_02.96571542116_02.164
250178c3017043935703340571542116_01-571542116_02.96571542116_02.96571542116_02.164
251178c3017043935704423571542116_01-571542116_02.96571542116_02.96571542116_02.164
310178c3017043937101138NaNNaNNaNNaN
311178c3017043937102239571542116_01-571542116_02.96571542116_02.96571542116_02.164
312178c3017043937103340571542116_01-571542116_02.96571542116_02.96571542116_02.164
313178c3017043937104423571542116_01-571542116_02.96571542116_02.96571542116_02.164
376178c3017043938501138NaNNaNNaNNaN
377178c3017043938502239571542116_01-571542116_02.96571542116_02.96571542116_02.164
378178c3017043938503340571542116_01-571542116_02.96571542116_02.96571542116_02.164
379178c3017043938504423571542116_01-571542116_02.96571542116_02.96571542116_02.164
428178c3017043939901138NaNNaNNaNNaN
429178c3017043939902239571542116_01-571542116_02.96571542116_02.96571542116_02.164
430178c3017043939903340571542116_01-571542116_02.96571542116_02.96571542116_02.164
431178c3017043939904423571542116_01-571542116_02.96571542116_02.96571542116_02.164
\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "0 178 c30 1704393010 1 1 38 NaN \n", "1 178 c30 1704393010 2 2 39 571542116_01 \n", "2 178 c30 1704393010 3 3 40 571542116_01 \n", "3 178 c30 1704393010 4 4 23 571542116_01 \n", "62 178 c30 1704393150 1 1 38 NaN \n", "63 178 c30 1704393150 2 2 39 571542116_01 \n", "64 178 c30 1704393150 3 3 40 571542116_01 \n", "65 178 c30 1704393150 4 4 23 571542116_01 \n", "124 178 c30 1704393290 1 1 38 NaN \n", "125 178 c30 1704393290 2 2 39 571542116_01 \n", "126 178 c30 1704393290 3 3 40 571542116_01 \n", "127 178 c30 1704393290 4 4 23 571542116_01 \n", "186 178 c30 1704393430 1 1 38 NaN \n", "187 178 c30 1704393430 2 2 39 571542116_01 \n", "188 178 c30 1704393430 3 3 40 571542116_01 \n", "189 178 c30 1704393430 4 4 23 571542116_01 \n", "248 178 c30 1704393570 1 1 38 NaN \n", "249 178 c30 1704393570 2 2 39 571542116_01 \n", "250 178 c30 1704393570 3 3 40 571542116_01 \n", "251 178 c30 1704393570 4 4 23 571542116_01 \n", "310 178 c30 1704393710 1 1 38 NaN \n", "311 178 c30 1704393710 2 2 39 571542116_01 \n", "312 178 c30 1704393710 3 3 40 571542116_01 \n", "313 178 c30 1704393710 4 4 23 571542116_01 \n", "376 178 c30 1704393850 1 1 38 NaN \n", "377 178 c30 1704393850 2 2 39 571542116_01 \n", "378 178 c30 1704393850 3 3 40 571542116_01 \n", "379 178 c30 1704393850 4 4 23 571542116_01 \n", "428 178 c30 1704393990 1 1 38 NaN \n", "429 178 c30 1704393990 2 2 39 571542116_01 \n", "430 178 c30 1704393990 3 3 40 571542116_01 \n", "431 178 c30 1704393990 4 4 23 571542116_01 \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "0 NaN NaN NaN \n", "1 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "2 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "3 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "62 NaN NaN NaN \n", "63 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "64 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "65 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "124 NaN NaN NaN \n", "125 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "126 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "127 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "186 NaN NaN NaN \n", "187 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "188 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "189 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "248 NaN NaN NaN \n", "249 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "250 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "251 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "310 NaN NaN NaN \n", "311 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "312 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "313 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "376 NaN NaN NaN \n", "377 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "378 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "379 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "428 NaN NaN NaN \n", "429 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "430 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "431 -571542116_02.96 571542116_02.96 571542116_02.164 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idphase_noring_typeinc_edgeout_edge
38c301ANaNNaN
39c301BNaNNaN
40c302A571542116_01-571542116_02.96
41c302B571542116_02.96571542116_02.164
42c303A571542116_01-571542116_02.96
43c303B571542116_02.96571542116_02.164
44c304A571542116_01-571542116_02.96
45c304B571542116_02.96571542116_02.164
\n", "
" ], "text/plain": [ " node_id phase_no ring_type inc_edge out_edge\n", "38 c30 1 A NaN NaN\n", "39 c30 1 B NaN NaN\n", "40 c30 2 A 571542116_01 -571542116_02.96\n", "41 c30 2 B 571542116_02.96 571542116_02.164\n", "42 c30 3 A 571542116_01 -571542116_02.96\n", "43 c30 3 B 571542116_02.96 571542116_02.164\n", "44 c30 4 A 571542116_01 -571542116_02.96\n", "45 c30 4 B 571542116_02.96 571542116_02.164" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 최초 검증시 잘 나타나지 않음.\n", "# 이것 또한 속도를 높이려고 set_index를 사용한 결과임.\n", "# 이전 코드로 복원하니 잘 작동하는 것이 관찰됨.\n", "# 1, 2 잘 추가되었고 적정하게 추가되었음.\n", "child_nodes = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id)\n", "# 임의로 child_node 지정\n", "child_node = random.choice(child_nodes)\n", "# 입력 테이블에서 해당되는 행들 목록\n", "display(self.histids[(self.histids.node_id==child_node)])\n", "display(self.match6[self.match6.node_id==child_node])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8. `initialize_state`, `assign_signals`" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n", "3. 이동류정보 테이블을 변환합니다.\n", "4. 통합 테이블을 생성합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.process_movement()\n", "self.make_histids()\n", "self.initialize_states()\n", "self.assign_signals()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8.1. 입력데이터\n", "- 입력 : `histids`\n", "- 컬럼 : 교차로번호, 노드id, 시작유닉스, A현시번호, B현시번호, 현시시간, 진입엣지id_A, 진출엣지id_A, 진입엣지id_B, 진출엣지id_B" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
0178c3017043930101138NaNNaNNaNNaN
1178c3017043930102239571542116_01-571542116_02.96571542116_02.96571542116_02.164
2178c3017043930103340571542116_01-571542116_02.96571542116_02.96571542116_02.164
3178c3017043930104423571542116_01-571542116_02.96571542116_02.96571542116_02.164
4177i217043930101136-571542809_01571542811_01571542811_02571542809_01
.................................
475206i717043940504419NaNNaNNaNNaN
476177u2017043940501134NaNNaNNaNNaN
477177u2017043940502219NaNNaNNaNNaN
478177u2017043940503363571542810_01.51571542810_02NaNNaN
479177u2017043940504424NaNNaNNaNNaN
\n", "

480 rows × 10 columns

\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "0 178 c30 1704393010 1 1 38 NaN \n", "1 178 c30 1704393010 2 2 39 571542116_01 \n", "2 178 c30 1704393010 3 3 40 571542116_01 \n", "3 178 c30 1704393010 4 4 23 571542116_01 \n", "4 177 i2 1704393010 1 1 36 -571542809_01 \n", ".. ... ... ... ... ... ... ... \n", "475 206 i7 1704394050 4 4 19 NaN \n", "476 177 u20 1704394050 1 1 34 NaN \n", "477 177 u20 1704394050 2 2 19 NaN \n", "478 177 u20 1704394050 3 3 63 571542810_01.51 \n", "479 177 u20 1704394050 4 4 24 NaN \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "0 NaN NaN NaN \n", "1 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "2 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "3 -571542116_02.96 571542116_02.96 571542116_02.164 \n", "4 571542811_01 571542811_02 571542809_01 \n", ".. ... ... ... \n", "475 NaN NaN NaN \n", "476 NaN NaN NaN \n", "477 NaN NaN NaN \n", "478 571542810_02 NaN NaN \n", "479 NaN NaN NaN \n", "\n", "[480 rows x 10 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(self.histids)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8.2 출력데이터\n", "- 출력 : `node2init`\n", " - 설명\n", " - 각 노드id에 대하여 초기화신호를 부여함.\n", " - 여기서 초기화신호란, 최초 `r`로만 되어있던 신호에서 비보호 우회전인 이동류에 대해서는 `g`를 부여한 것을 말함\n", "- 출력 : `sigtable`\n", " - 컬럼 : 노드id, 시작유닉스, sumo현시번호, 현시시간, 신호, (시작일시)\n", " - 설명\n", " - 초기화된 신호에 녹색신호 `G`를 부여하여 만든 테이블" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'c30': ['r', 'r', 'r', 'r', 'r', 'r'], 'i0': ['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'r', 'g', 'r', 'r'], 'i1': ['g', 'r', 'r', 'r', 'r', 'r', 'r', 'g', 'r', 'r'], 'i2': ['r', 'r', 'g', 'g', 'r', 'r', 'r'], 'i3': ['g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r'], 'i6': ['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r'], 'i7': ['r', 'r', 'r', 'g', 'g', 'r', 'r'], 'i8': ['g', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'g', 'r', 'r', 'r'], 'i9': ['r', 'r', 'r', 'r'], 'u00': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g', 'g'], 'u20': ['g', 'g', 'r', 'g', 'g', 'g'], 'u30': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g'], 'u31': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g'], 'u32': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'r'], 'u60': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'r']}\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
0c301704393010038rrrrrr2024-01-05 03:30:10
1c301704393010139GGGGGG2024-01-05 03:30:10
2c301704393010240GGGGGG2024-01-05 03:30:10
3c301704393010323GGGGGG2024-01-05 03:30:10
4i21704393010036GGggGGG2024-01-05 03:30:10
.....................
475i71704394050319rrrggrr2024-01-05 03:47:30
476u201704394050034ggrggg2024-01-05 03:47:30
477u201704394050119ggrggg2024-01-05 03:47:30
478u201704394050263ggGggg2024-01-05 03:47:30
479u201704394050324ggrggg2024-01-05 03:47:30
\n", "

480 rows × 6 columns

\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state start_dt\n", "0 c30 1704393010 0 38 rrrrrr 2024-01-05 03:30:10\n", "1 c30 1704393010 1 39 GGGGGG 2024-01-05 03:30:10\n", "2 c30 1704393010 2 40 GGGGGG 2024-01-05 03:30:10\n", "3 c30 1704393010 3 23 GGGGGG 2024-01-05 03:30:10\n", "4 i2 1704393010 0 36 GGggGGG 2024-01-05 03:30:10\n", ".. ... ... ... ... ... ...\n", "475 i7 1704394050 3 19 rrrggrr 2024-01-05 03:47:30\n", "476 u20 1704394050 0 34 ggrggg 2024-01-05 03:47:30\n", "477 u20 1704394050 1 19 ggrggg 2024-01-05 03:47:30\n", "478 u20 1704394050 2 63 ggGggg 2024-01-05 03:47:30\n", "479 u20 1704394050 3 24 ggrggg 2024-01-05 03:47:30\n", "\n", "[480 rows x 6 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(self.node2init)\n", "display(self.sigtable)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8.3 검증요건\n", "1. 특정한 교차로 세 곳에 대하여 네트워크와 비교했을 때, 비보호우회전신호(g)가 잘 지정되었는가?\n", "2. (A현시번호, B현시번호)가 sumo현시번호로 잘 매핑되었는가?\n", "3. 녹색신호(G)가 잘 배정되었는가?" ] }, { "attachments": { "image-2.png": { "image/png": "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" }, "image-3.png": { "image/png": "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Qvq57029Bu+gWwCIE5qnAwAwGn9bW1szs8G6he7oB3JHCgciq/nWOF6tXImUVt37506rJTkPSKvd9puffuLeDszXTF2dvnfz09LxCgK2BX7Y0EXH++4U5GJ6113XaP4eUvq573/+9xK8g24BAAAAoF9/eyhM1Jsyd54iT9daX+22NNNOZ2Zkfuei9b4W7lczd9uvNbx/l+t7zdR7oIP4sddMvSYHfdWMd3F+ra6o6bu6uJlMf1XY3e57Old2l7eu50yz/XDSz33/898fsPu5BQAAAIB+8T3juin43ooc/nFslpUn0yL+5uvlognracnMnDebdHfaz1mW9VIz4FeLuxJcqd12vja69rlRw14tym7jJO3HdT/PfaVmX3n3vKZJezojM+eH8jnwunu779VisbHuyfR83zXu49RL8A66BQAAQHJNTEyYOaA/hHEtnZMtFTubWTcnZd183WuCfZxp6RtdWlXr9EjhHffTzd9n6iOPq/Ub6uyd+oy3nM+s89T7tM/Vz70hsuKrGW8/rtt57pnfkZVrc153EDZvkLf2614Rf2V8L/c9ncvIsVk3d7gie42+6eHXS/AOugUwfvRzBgAAUTNRq9XuvGBhkzcwnO6Ta/vcwCD0c9P/vPSWtfag3cutp31Z8587jvgkeHBeiKQsB+MP45TlYChLe/xl+U/1D4/3d/XPw/NyMPyO28NruD3+52WSUDMOGN0Cd7dbAAAAAOiPyP8P45rKrXSFO0QAAAAASUVORK5CYII=" }, "image.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "### 8.4 검증\n", "세 곳(`i0`, `i7`, `u30`)의 네트워크 캡쳐 모습\n", "\n", "![image.png](attachment:image.png)\n", "\n", "예상되는 초기화신호 `i0` : grrrgrrrgrrrrrgrr\n", "\n", "![image-2.png](attachment:image-2.png)\n", "\n", "예상되는 초기화신호 `i7` : rrrggrr\n", "\n", "![image-3.png](attachment:image-3.png)\n", "\n", "예상되는 초기화신호 `u30` : ggggrggg" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'r', 'g', 'r', 'r']\n", "['r', 'r', 'r', 'g', 'g', 'r', 'r']\n", "['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g']\n" ] } ], "source": [ "# 1 잘 지정됨.\n", "print(self.node2init['i0'])\n", "print(self.node2init['i7'])\n", "print(self.node2init['u30'])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
12i81704393010024grrrrrrrgGGGgrrr2024-01-05 03:30:10
13i81704393010124grrrrrrrgrrrgGGG2024-01-05 03:30:10
14i81704393010217grrrGGGrgrrrgGGr2024-01-05 03:30:10
15i81704393010358grrrGGGGgrrrgrrr2024-01-05 03:30:10
16i81704393010417gGGGrrrrgrrrgrrr2024-01-05 03:30:10
\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state \\\n", "12 i8 1704393010 0 24 grrrrrrrgGGGgrrr \n", "13 i8 1704393010 1 24 grrrrrrrgrrrgGGG \n", "14 i8 1704393010 2 17 grrrGGGrgrrrgGGr \n", "15 i8 1704393010 3 58 grrrGGGGgrrrgrrr \n", "16 i8 1704393010 4 17 gGGGrrrrgrrrgrrr \n", "\n", " start_dt \n", "12 2024-01-05 03:30:10 \n", "13 2024-01-05 03:30:10 \n", "14 2024-01-05 03:30:10 \n", "15 2024-01-05 03:30:10 \n", "16 2024-01-05 03:30:10 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
12201i817043930101124-571500569_01571500583_02-571500569_01571500618_01
13201i817043930102224571500618_02571500583_02571500618_02571500617_01
14201i817043930103317571500617_02571500618_01571500618_02571500617_01
15201i817043930104458571500617_02571500618_01571500617_02571500569_01
16201i817043930105517571500583_01571500617_01571500583_01571500569_01
\n", "
" ], "text/plain": [ " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", "12 201 i8 1704393010 1 1 24 -571500569_01 \n", "13 201 i8 1704393010 2 2 24 571500618_02 \n", "14 201 i8 1704393010 3 3 17 571500617_02 \n", "15 201 i8 1704393010 4 4 58 571500617_02 \n", "16 201 i8 1704393010 5 5 17 571500583_01 \n", "\n", " out_edge_A inc_edge_B out_edge_B \n", "12 571500583_02 -571500569_01 571500618_01 \n", "13 571500583_02 571500618_02 571500617_01 \n", "14 571500618_01 571500618_02 571500617_01 \n", "15 571500618_01 571500617_02 571500569_01 \n", "16 571500617_01 571500583_01 571500569_01 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 2 잘 매핑됨.\n", "# 3 녹색신호가 잘 배정됨.\n", "node_id = random.choice(self.sigtable.node_id.unique())\n", "display(self.sigtable[self.sigtable.node_id==node_id][:5])\n", "display(self.histids[self.histids.node_id==node_id][:5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 9. `set_timepoints`" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n", "3. 이동류정보 테이블을 변환합니다.\n", "4. 통합 테이블을 생성합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.process_movement()\n", "self.make_histids()\n", "self.initialize_states()\n", "self.assign_signals()\n", "self.set_timepoints()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9.1. 입력데이터\n", "- 입력 : `sigtable`\n", "- 컬럼 : 노드id, 시작유닉스, sumo현시번호, 현시시간, 신호, (시작일시)\n", "- 설명 : 초기화신호가 부여된 신호테이블" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
0c301704393010038rrrrrr2024-01-05 03:30:10
1c301704393010139GGGGGG2024-01-05 03:30:10
2c301704393010240GGGGGG2024-01-05 03:30:10
3c301704393010323GGGGGG2024-01-05 03:30:10
4i21704393010036GGggGGG2024-01-05 03:30:10
.....................
475i71704394050319rrrggrr2024-01-05 03:47:30
476u201704394050034ggrggg2024-01-05 03:47:30
477u201704394050119ggrggg2024-01-05 03:47:30
478u201704394050263ggGggg2024-01-05 03:47:30
479u201704394050324ggrggg2024-01-05 03:47:30
\n", "

480 rows × 6 columns

\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state start_dt\n", "0 c30 1704393010 0 38 rrrrrr 2024-01-05 03:30:10\n", "1 c30 1704393010 1 39 GGGGGG 2024-01-05 03:30:10\n", "2 c30 1704393010 2 40 GGGGGG 2024-01-05 03:30:10\n", "3 c30 1704393010 3 23 GGGGGG 2024-01-05 03:30:10\n", "4 i2 1704393010 0 36 GGggGGG 2024-01-05 03:30:10\n", ".. ... ... ... ... ... ...\n", "475 i7 1704394050 3 19 rrrggrr 2024-01-05 03:47:30\n", "476 u20 1704394050 0 34 ggrggg 2024-01-05 03:47:30\n", "477 u20 1704394050 1 19 ggrggg 2024-01-05 03:47:30\n", "478 u20 1704394050 2 63 ggGggg 2024-01-05 03:47:30\n", "479 u20 1704394050 3 24 ggrggg 2024-01-05 03:47:30\n", "\n", "[480 rows x 6 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(self.sigtable)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9.2 출력데이터\n", "- 출력 : `Sigtable`\n", "- 컬럼 : 노드id, 시작유닉스, sumo현시번호, 현시시간, 신호, (시작일시)\n", "- 설명 : 시작시각과 종료시각이 지정된 신호테이블\n", "- 출력 : `offsets`\n", "- 설명 : 각 노드의 offset을 설정하는 딕셔너리. 이때, offset이란, 시뮬레이션시에 첫번째 태그가 시작되는 시점이다." ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['c30', 'i0', 'i1', 'i2', 'i3', 'i6', 'i7', 'i8', 'i9', 'u00', 'u20', 'u30', 'u31', 'u32', 'u60']\n" ] }, { "data": { "image/png": "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mzdvRseOHVv8TI/H4/uuR1NpaWkAgL1792L79u147LHHAAD5+fmoqqpCXFwcLrzwwlbzxMfH44ILLgAALFu2DNdeey2PfBAREant0KFDOHr0KA4dOgS3242ysjIAQLdu3ZCSkgKg8bsVxcXFuOGGG3yvczqdePPNN/HnP/854D179uyJoqIi3H777fjb3/6Gs2fP4t5778XNN9/sO+LSs2dPv9ds374dMTEx6NOnj29ZcXExCgoK0LVrV7hcLrz77rv4+9//jgULFvjWefPNN5GZmYlOnTph165duP/++zF27FiMGjUKQOMXXQsLCzF27Fj86U9/wsUXX4xvv/0WK1euxA033ICCggLs2bMH27Ztw8CBA3Hs2DHMmzcP5eXlWLp0aUS1ZPNBREQUhj/84Q9+O9l+/foBAD744APfqY2KigrU1dX5vW7ZsmUQQmDChAlB3/e1117DvffeixEjRiAmJgbjxo3DX/7yl4jGduLECdx999345ptvkJiYiB49euDVV1/FTTfd5FunsrIS06ZN850u+dWvfoVHHnnE97yiKHj33Xfx+9//HlOmTMGRI0eQnZ2NoUOHwuFwAADcbjf+/Oc/o6KiAvHx8Rg+fDg2b94c8khJc4oQQkT0CiIiIqLzwKtdiIiISCo2H0RERCQVmw8iIiKSis0HERERScXmg4iIiKRi80FERERSsfkgIiIiqdh8EBERkVRsPoiIiEgqNh9EREQkFZsPIiIikorNBxEREUn1/wDbNNeOt+OhAQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "k = 0\n", "node_ids = []\n", "for node_id, group in self.sigtable.groupby('node_id'):\n", " k += 1\n", " plt.plot(group.start_unix.unique(), [k] * len(group.start_unix.unique()), marker='o')\n", " plt.axvline(self.present_time - 300, c='r', linewidth=.5)\n", " plt.axvline(self.present_time, c='r', linewidth=.5)\n", " node_ids.append(node_id)\n", "print(node_ids)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 상세한 설명\n", "이전 데이터프레임인 `sigtable`의 시작유닉스는 위의 그림과 같다. y축은 각 `node_id`를 나타내고, 굵은 점으로 되어 있는 부분의 x좌표가 시작유닉스를 뜻함. 두 개의 빨간선은 각각 시뮬레이션 시작시각과 종료시각을 나타냄.\n", "\t- `present_time` = 오른쪽 빨간선\n", "\t- 시뮬레이션 시작시각 = `present_time` - 300\n", "\t- 시뮬레이션 종료시각 = `present_time`\n", "\t- `sigtable`의 하한(lower bound) = `present_time` - 600\n", " \t- sigtable의 하한(lower bound) 설정 이유 : 하한을 시뮬레이션 시작시각(`present_time` - 300)으로 잡으면 시뮬레이션 구간 중에 신호가 없는 부분이 생기게된다. 따라서 일정 정도 앞선 시각을 하한으로 잡아야 한다. 이때, 인천시 기준으로 주기의 최댓값이 220임을 고려해 하한을 `present_time` - 600으로 잡았다.\n", " \t- 하한이 `present_time` - 600으로 설정된 시점은 `merge_dfs`에서이고, 이전에 `make_rhists`에서 `present_time - subtractor//2(=1500)`으로 자른 것에서 한번 더 자른 것이다.\n", "\t- `sigtable`의 상한(upper bound) = `present_time` + 600\n", " \t- 시뮬레이션 구간 중에 특정 교차로의 결측이 발생하는 경우 (결측이 발생하고 시뮬레이션 종료시점까지 데이터를 얻을 수 없는 경우) 신호가 적절히 생성될 수 없다. 이러한 오류를 방지하기 위해 `make_rhistory` 단계에서 `present_time + 600`에서 시작하는 한 주기동안의 신호이력을 만들어놓는다. 그러면 `make_rhistory` 단계에서는 `present_time`과 `present_time` + 600 사이 구간이 채워지게 된다. (참값판단프로세스. 정확하게는 결측치 처리.) 따라서 결과적으로 `sigtable`의 상한은 `present_time + 600`이 된다.\n", "- 이만큼의 신호정보를 가지고 있으면 시뮬레이션 시간동안 정상적으로 시뮬레이션이 진행될 수 있다. 하지만, 한 신호파일(add.xml)에서 다른 신호파일(add.xml)로 넘어갈 때, phase 태그의 갯수가 달라서 오류가 날 수 있다. 한편, xml 파일의 용량은 최대한 작아야 한다. 즉, 다음 두 문제를 해결해야 한다.\n", "\t1) `phase` 태그의 갯수가 신호가 생성될 때마다 바뀌지 않도록 해야 한다.\n", "\t2) `phase` 태그의 갯수는 최대한 적을 수록 좋다.\n", "- 한편\n", "- 3) 시뮬레이션 기간의 모든 시점에서 신호가 부여되어야 한다\n", "- 는 조건도 당연히 성립해야 한다.\n", "- `sigtable` 단계에서 주기의 갯수가 일정하게 유지되어도 1)은 해결 가능하다. 즉, 노드별로 가능한 주기의 갯수의 최솟값(`num_cycles`)을 지정하고 `num_cycles`의 주기만큼만 남기면 된다.\n", "- 예를 들어 설명하면, 교차로 `i0`의 주기가 각각 160, 170, 180, 190이다. 따라서 최소주기는 160이다. 300(5분)을 160으로 나눈 몫은 1인데, 거기에 2를 더해 3을 만든다. 이때 3이 노드id `i0`에 대한 `num_cycles`이다.\n", "- 즉, `lsbs`(the last `start_unix` before `sim_start`)를 지정하고, `lsbs`에서 `num_cycles`개 만큼의 주기에 해당하는 주기만 살려서 `Sigtable`을 얻는다. 그러면, 원하던 목적에 부합한다. 1)이 성립하는 것은 `num_cycles`를 지정하는 데에서 당연하고, 2)는 가능한 최솟값은 아닐지라도, 어느 정도 최소의 값은 구한 셈이다.\n", "- 3)도 설명가능하다. 수식으로 증명한 바 있지만 여기에서는 증명을 생략하겠다.\n", "- 이상을 정리하면, 인접한 두 신호 파일 사이에 오류가 나지 않으면서, xml 파일의 크기를 어느 정도 최소화하면서 정리하면서 신호의 시작시각과 종료시각을 맞춘 셈이다.\n", "- 그 결과로 아래와 같은 그림을 얻는다." ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['c30', 'i0', 'i1', 'i2', 'i3', 'i6', 'i7', 'i8', 'i9', 'u00', 'u20', 'u30', 'u31', 'u32', 'u60']\n" ] }, { "data": { "image/png": "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nYQsbZCEcU2O1ojn+E3xgfSVosUHgGPAuE5b8Ry/mXYBAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWovgAAACWyrK7A8ChwuGwNm/erJaWFuXm5qq8vFwZGdTJ6YYcnYMsnSNVskx48REKhXTHHXdo9uzZqq+vV2lpqcaPH69f/vKX8ng8iX47OMz69es1f/58BQKByDKfz6eRI0eqX79+NvYM8SBH5yBL50ilLBNe7kyfPl0zZszQgw8+qA8++EDTp0/Xb37zG/3ud79L9FvBYdavX69nn302amBIB76m+dlnn9X69ett6hniQY7OQZbOkWpZJvzMx5tvvqmLL75Yo0aNkiSdcMIJ+tOf/qS333470W8FBwmHw5o/f/4R28yfP19f+9rXIqcIO0nat3evBb1DrMLhsObNm3fENofmiNRkV5aM68SLNcu+fftaNi4TXnwMGzZMjz76qDZu3KiTTjpJ7777rt544w3de++97bYPBoMKBoORx4dWZXCHzZs3d5h9IBDQtGnTIo9vlzR16tQk9wyJdmiOSF/JyJJxbY9AIKDNmzeroqLCkvdLePFx8803KxAIqG/fvsrMzFQoFNLdd9+tsWPHttu+urpad955Z6K7gTTT0tJidxcAwNWs3A97jDEmkS/4zDPP6MYbb9Q999yjU089VTU1NZo0aZLuvfdejRs3rk379s58lJWVqbm5WT6fL5FdQwrbtGmTnnzyyQ7bjR07VuXl5ZKkTl6v9h207cB+mzdv1tNPP91hu4NzRGqyK0vGdeLFmuW4ceOO6cxHIBCQ3++P6fid8DMfN954o26++WZ9//vflySddtpp2rx5s6qrq9stPrxer7xeb6K7gTRTXl4un893xKkXn8+n3r17R81Jdu7c2YruIUa9e/c+qhyReuzMknGdWLFmaeV/CBI++nfv3t1mQ8zMzFQ4HE70W8FBMjIyNHLkyCO2GTlyJAesFEeOzkGWzpGKWSb8nS688ELdfffdeumll/TJJ59ozpw5uvfee3XJJZck+q3gMP369dNll13W5nSdz+fTZZddxj0F0gQ5OgdZOkeqZZnwz3zs3LlTt956q+bMmaPGxkaVlpZqzJgxuu2222I6lRbPnBGcKeY78Hk8UmI3XyRQqtxJEcfO0iwZ10mVzCzjOX4nvPg4VhQfiBk7KcB5GNdpK57jN/8NAQAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlqL4AAAAlsqyuwOwjgkbBTc1K7xzrzK6dZa3wi9PhsfubrkSWaQGckgdrVl4JQU/aiILh6P4cIkv1v1TTS98pFDz3siyTH9n5V3YW137H2djz9yHLFIDOaSOg7PoKemfj60lC4dj2sUFvlj3T/1r9gdRO1lJCjXv1b9mf6Av1v3Tpp65D1mkBnJIHWThTpz5cDgTNmp64aMjttkx9yN1PjEv7U5xeiSZvSG7uxEzEzbaMdeZWaQTckgdsWTR9MLH6tKvB1k4DMWHwwU3Nbf5H8WhwoG9qrtjuUU9Spyekj6/7U27u5FQ6ZqF05BD6gg1BxXc1KwuvfPs7goSiGkXhwvvPHLhAQCpjv2Y83Dmw+EyunWOqV2PK0+Vt8Kf5N4k2HSp9FfD7O5FzIKbmvWvme932C4ts0gj5JA6Ys0i1v0Y0gfFh8N5K/zK9Hc+4tRLpt+rLn26p+Wcqqdzpt1diFmXPt0dnUW6IIfUEWsWFIHOw7SLw3kyPMq7sPcR2+Rd+DV2shYgi9RADqmDLNyL4sMFuvY/Tj2uOEWZ/uhTl5l+r3pccQrX0VuILFIDOaQOsnAnjzHG2N2JgwUCAfn9fjU3N8vn89ndHUdx3N0cPR4ptTbfmDkuizRFDqkjcofTE7sr+OEOskhD8Ry/+cyHi3gyPFyuliLIIjWQQ+o4OAsycT6mXQAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKUoPgAAgKX4YjkHCYdD2vrB+2pp2qHcvO7qecqpysjItLtbSAKydg+ydg83ZZ2U4mPr1q266aabNG/ePO3evVsnnniiZs6cqcrKymS8HSTVrnhTi2Y9qpbt/4wsy80/TueO/6n6DBlmY8+QaGTtHmTtHm7LOuHTLjt27NDw4cPVqVMnzZs3T+vXr9dvf/tbde/ePdFvhS/VrnhTc++dGrXRSlLL9n9q7r1TVbviTZt6hkQja/cga/dwY9YJP/Mxffp0lZWVaebMmZFlFRUViX4bfCkcDmnRrEeP2GbRrEfU67QBjjt9lyVp/549dnfDMuFwSItmPnLENk7N2m3cnDXjuq3FTz6q3mcMcVTWHmOMSeQL9uvXT+eff74+++wzLVmyRD179tS1116rn/zkJ+22DwaDCgaDkceBQEBlZWVqbm6Wz+dLZNcc6dP339Ozv7rF7m7YYvKzL+ney0bZ3Q0ACcS4bt9lt01V2amn292NIwoEAvL7/TEdvxM+7fLxxx9rxowZ6tOnjxYsWKBrrrlG119/vZ588sl221dXV8vv90d+ysrKEt0lR2tp2mF3FwAASea0fX3Cz3x07txZlZWVevPNr+aorr/+eq1cuVLLly9v054zH8cm1jMf/37zHTr+lP4W9Mg6WV27av8XX9jdDct89sE6PT/tjg7bOTFrt3Fz1ozr9jntzEfCP/NRUlKifv36RS075ZRT9Je//KXd9l6vV16vN9HdcI2ep5yq3Pzj2nxQ6WDdehyn8gEDHTVf2KpTly52d8Ey5QMGujprN3F71ozraN16HKeep5xqYa+SL+HTLsOHD9eGDRuilm3cuFHl5eWJfitIysjI1Lnjf3rENt8e91NH7qDchqzdg6zdw61ZJ7z4+O///m+99dZbmjp1qj788EP98Y9/1KOPPqoJEyYk+q3wpT5DhumiybcoN/+4qOXdehyniybf4shrxN2KrN2DrN3DjVkn/DMfkvTiiy9qypQpqq2tVUVFhSZPnnzYq10OFc+cEaK56e54kiSPR0r85psWXJe1i7kua8Z12mYdz/E7KcXHsaD4QMxcvJMCHItxnbZsvdQWAADgSCg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApbLs7gBwsHDYqK62SbsCQeX4vCrpk6eMDI/d3cJRIEvnIEvnSJUsKT6QMj56p1HL/lyrXU3ByLKcPK/OuryPeg8stLFniBdZOgdZOkcqZcm0C1LCR+80av4j66IGhSTtagpq/iPr9NE7jTb1DPEiS+cgS+dItSw58wHbhcNGy/5ce8Q2y/5cq+P75kedHsyStD8YSnLvEI8DWW48Ypv2skTqsStLxnXixZLlG8/WqmJAgWXjkuIDtqurbWpTjR9qV1NQj//30qhl10p6dOKSJPYMydBelkhPyciScW2Plh1B1dU2qefJ3S15P6ZdYLtd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devW6fe//73GjRtnc+/S1x/+8AddcMEFKi0ttbsrR40zHwl03XXX6cUXX9TixYt1/PHHR5YXFxdr7969ampqimrf0NCg4uLiSJtDP5nc+ri1jRt07txZJ554ogYPHqzq6moNGDBA999/P+swRqtXr1ZjY6MGDRqkrKwsZWVlacmSJXrggQeUlZWloqIi1uNRysvL00knnaQPP/yQ7TFGJSUl6tevX9SyU045JTJ91boe2ltPB6/HxsbGqOf379+v7du3u2Y9Hmzz5s169dVXddVVV0WWpeP2SPGRAMYYXXfddZozZ44WLVqkioqKqOcHDx6sTp066bXXXoss27Bhg7Zs2aKhQ4dKkoYOHaq1a9dGDbKFCxfK5/O1GbxuEg6HFQwGWYcxOu+887R27VrV1NREfiorKzV27NjIv1mPR6elpUUfffSRSkpK2B5jNHz48Da3Hdi4caPKy8slSRUVFSouLo5aj4FAQCtWrIhaj01NTVq9enWkzaJFixQOhzVkyBAL/orUMnPmTBUWFmrUqFGRZWm5PVr+EVcHuuaaa4zf7zevv/561KVQu3fvjrS5+uqrTa9evcyiRYvMqlWrzNChQ83QoUMjz7deBjVixAhTU1Nj5s+fbwoKClx1Wd7NN99slixZYjZt2mTee+89c/PNNxuPx2NeeeUVYwzr8GgdfLWLMazHWN1www3m9ddfN5s2bTJ///vfTVVVlTnuuONMY2OjMYb1GIu3337bZGVlmbvvvtvU1taap59+2mRnZ5vZs2dH2kybNs3k5eWZv/3tb+a9994zF198cbuX2g4cONCsWLHCvPHGG6ZPnz6uu9TWGGNCoZDp1auXuemmm9o8l27bI8VHAkhq92fmzJmRNl988YW59tprTffu3U12dra55JJLTF1dXdTrfPLJJ+aCCy4wXbt2Nccdd5y54YYbzL59+yz+a+zzox/9yJSXl5vOnTubgoICc95550UKD2NYh0fr0OKD9Ribyy+/3JSUlJjOnTubnj17mssvvzzq/hSsx9i88MILpn///sbr9Zq+ffuaRx99NOr5cDhsbr31VlNUVGS8Xq8577zzzIYNG6La/Otf/zJjxowxubm5xufzmSuvvNLs3LnTyj8jJSxYsMBIarN+jEm/7dFjjDHWn28BAABuxWc+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACApSg+AACud/fdd2vYsGHKzs5u8+2wh+PxeNr9ueeeeyJttm/frrFjx8rn8ykvL08//vGP1dLS0u7rffjhh+rWrVub93/++edVWVmpvLw85eTk6Otf/7qeeuqpqDYNDQ0aP368SktLlZ2drZEjR6q2tjaqzc9+9jP17t1bXbt2VUFBgS6++GL94x//iOlvbbVz505NmjRJ5eXl6tq1q4YNG6aVK1fG9RoSxQcAwCXOOecczZo1q93n9u7dq+9973u65pprYn69urq6qJ8nnnhCHo9Hl156aaTN2LFj9f7772vhwoV68cUXtXTpUv30pz9t81r79u3TmDFjdNZZZ7V5Lj8/X7/4xS+0fPlyvffee7ryyit15ZVXasGCBZIOfL/Y6NGj9fHHH+tvf/ub3nnnHZWXl6uqqkq7du2KvM7gwYM1c+ZMffDBB1qwYIGMMRoxYoRCoVDMf/NVV12lhQsX6qmnntLatWs1YsQIVVVVaevWrTG/RmunAQBwvG9961tRX3vRnpkzZxq/339Ur3/xxRebc889N/J4/fr1RpJZuXJlZNm8efOMx+MxW7dujfrdn//85+aKK66I+f0HDhxofvnLXxpjjNmwYYORZNatWxd5PhQKmYKCAvPYY48d9jXeffddIynqawPWrl1rRo4caXJyckxhYaG54oorzLZt24wxxuzevdtkZmaaF198Mep1Bg0aZH7xi1902OeDceYDAIBj1NDQoJdeekk//vGPI8uWL1+uvLw8VVZWRpZVVVUpIyNDK1asiCxbtGiRnnvuOT300EMdvo8xRq+99po2bNigs88+W5IUDAYlSV26dIm0y8jIkNfr1RtvvNHu6+zatUszZ85URUWFysrKJElNTU0699xzNXDgQK1atUrz589XQ0ODLrvsMknS/v37FQqFot5Hkrp27XrY9zkcig8AAI7Rk08+qW7duunf//3fI8vq6+tVWFgY1S4rK0v5+fmqr6+XJP3rX//S+PHjNWvWLPl8vsO+fnNzs3Jzc9W5c2eNGjVKv/vd7/Sd73xHktS3b1/16tVLU6ZM0Y4dO7R3715Nnz5dn332merq6qJe5+GHH1Zubq5yc3M1b948LVy4UJ07d5YkPfjggxo4cKCmTp2qvn37auDAgXriiSe0ePFibdy4Ud26ddPQoUP161//Wp9//rlCoZBmz56t5cuXt3mfjlB8AAAcaerUqZEDbW5urpYtW6arr746atmWLVsS8l5PPPGExo4d2+asQEd+8pOf6D//8z8jZzEOp1u3bqqpqdHKlSt19913a/LkyXr99dclSZ06ddLzzz+vjRs3Kj8/X9nZ2Vq8eLEuuOACZWREH+bHjh2rd955R0uWLNFJJ52kyy67THv27JEkvfvuu1q8eHHU+unbt68k6aOPPpIkPfXUUzLGqGfPnvJ6vXrggQc0ZsyYNu/TEb7VFgDgSNu3b9f27dsjj8eOHatLL7006uzECSecoKysrMjjWbNmadKkSWpqaor5fZYtW6azzz5bNTU1GjBgQGT5E088oRtuuEE7duyILNu/f7+6dOmi5557Tpdccony8vKirn4xxigcDiszM1OPPvqofvSjH7X7nldddZU+/fTTyIdOWzU3N2vv3r0qKCjQkCFDVFlZedjpnL1796p79+56/PHHNWbMGF1wwQXKzs7W9OnT27QtKSlRTk5O5PGuXbsUCARUUlKiyy+/XC0tLXrppZdiW2GSsjpuAgBA+snPz1d+fn7kcdeuXVVYWKgTTzwxoe/zhz/8QYMHD44qPCRp6NChampq0urVqzV48GBJBz7fEQ6HNWTIEEkHPhdy8NUmf/vb3zR9+nS9+eab6tmz52HfMxwORz7rcTC/3y9Jqq2t1apVq/TrX//6sK9hjJExJvI6gwYN0l/+8pc2BVl7cnJylJOTox07dmjBggX6zW9+c8T2h6L4AAC43pYtW7R9+3Zt2bJFoVBINTU1kqQTTzxRubm5kg58tqK6ulqXXHJJ5PcCgYCee+45/fa3v23zmqeccopGjhypn/zkJ/r973+vffv26brrrtP3v/99lZaWRtocbNWqVcrIyFD//v0jy6qrq1VZWanevXsrGAzq5Zdf1lNPPaUZM2ZE2jz33HMqKChQr169tHbtWk2cOFGjR4/WiBEjJEkff/yx/vznP2vEiBEqKCjQZ599pmnTpqlr16767ne/K0maMGGCHnvsMY0ZM0Y///nPlZ+frw8//FDPPPOMHn/8cWVmZkYu0T355JP14Ycf6sYbb1Tfvn115ZVXxrW+KT4AAK5322236cknn4w8HjhwoCRp8eLFOueccyRJGzZsUHNzc9TvPfPMMzLGaMyYMe2+7tNPP63rrrtO5513njIyMnTppZfqgQceiKtvu3bt0rXXXqvPPvtMXbt2Vd++fTV79mxdfvnlkTZ1dXWaPHmyGhoaVFJSoh/+8Ie69dZbI8936dJFy5Yt03333acdO3aoqKhIZ599tt58883Ih2JLS0v197//XTfddJNGjBihYDCo8vJyjRw5MvKZjubmZk2ZMkWfffaZ8vPzdemll+ruu+9Wp06d4vqb+MwHAACwFFe7AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS1F8AAAAS/1/uB3fB0QE184AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "k = 0\n", "node_ids = []\n", "for node_id, group in self.Sigtable.groupby('node_id'):\n", " k += 1\n", " plt.plot(group.start_unix.unique(), [k] * len(group.start_unix.unique()), marker='o')\n", " plt.axvline(self.present_time - 300, c='r', linewidth=.5)\n", " plt.axvline(self.present_time, c='r', linewidth=.5)\n", " node_ids.append(node_id)\n", "print(node_ids)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1704393010\n", "1704393600\n", "1704394050\n", "590\n", "450\n" ] } ], "source": [ "lower_bound = self.sigtable.start_unix.min()\n", "upper_bound = self.sigtable.start_unix.max()\n", "print(lower_bound)\n", "print(self.present_time)\n", "print(upper_bound)\n", "print(self.present_time - lower_bound)\n", "print(upper_bound - self.present_time)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9.3 검증요건\n", "1. 인접한 두 신호파일에 대한 세이브로드시 `phase`태그의 갯수가 달라져서 생기는 오류를 방지할 수 있도록 시간이 세팅되었는가?\n", "2. 시뮬레이션 기간의 모든 시점에서 신호가 부여될 수 있도록 시간이 세팅되었는가?\n", "3. `offset`값이 제대로 설정되었는가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9.4 검증" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-100\n" ] } ], "source": [ "## 1, 2 : 위 그림으로 모두 검증되었음.\n", "# 3 : i0의 경우 lsbs는 위의 그림에서 아래에서 두번째인 주황색 선분에서 세 개의 점들 중 가장 왼쪽에 있는 점임.\n", "# 이것은 sim_start에 비해 100 앞서 있으므로 lsbs - sim_start는 -100으로 계산됨.\n", "# 최종 add.xml 파일에서 i0는 세 번의 주기가 현시되고, 그림에 보이는 세 개 점들은 각 주기의 시작시간을 의미함.\n", "# add.xml 파일에서 어떤 노드의 offset 값이 x이면 그 노드의 첫번째 phase 태그는 시뮬레이션 시작 이후 x초 후에 시작됨.\n", "# 그런데 지금 상황은 시뮬레이션 시작보다 100초 앞서서 i0의 첫번째 phase 태그가 시작되어야 하므로 \n", "# offset은 -100으로 설정되어야 함. 따라서 offset은 적절하게 설정되었음.\n", "node_id = 'i0'\n", "sim_start = self.present_time - 300\n", "group = self.sigtable[self.sigtable.node_id==node_id]\n", "lsbs = group[group['start_unix'] < sim_start]['start_unix'].max() # the last start_unix before sim_start\n", "print(lsbs - sim_start)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10. `assign_yellow_red`" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n", "3. 이동류정보 테이블을 변환합니다.\n", "4. 통합 테이블을 생성합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.process_movement()\n", "self.make_histids()\n", "self.initialize_states()\n", "self.assign_signals()\n", "self.set_timepoints()\n", "self.assign_red_yellow()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 10.1. 입력데이터\n", "- 입력 : `Sigtable`\n", "- 컬럼 : 노드id, 시작유닉스, sumo현시번호, 현시시간, 신호, (시작일시)\n", "- 설명 : 시작시각과 종료시각이 지정된 신호테이블" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 10.2 출력데이터\n", "- 출력 : `SIGTABLE`\n", "- 컬럼 : 노드id, 시작유닉스, sumo현시번호, 현시시간, 신호, (시작일시)\n", "- 설명 : 황색시간과 적색시간이 지정된 신호테이블" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
0c3017043932900_g33rrrrrr2024-01-05 03:34:50
1c3017043932900_y4rrrrrr2024-01-05 03:34:50
2c3017043932901__r1rrrrrr2024-01-05 03:34:50
0c3017043932901_g34GGGGGG2024-01-05 03:34:50
1c3017043932901_y4GGGGGG2024-01-05 03:34:50
.....................
2u6017043936803__r1ggggggggr2024-01-05 03:41:20
0u6017043936803_g51ggggggggr2024-01-05 03:41:20
1u6017043936803_y4ggggggggr2024-01-05 03:41:20
2u6017043936804__r1ggggggggr2024-01-05 03:41:20
309u6017043936804_g17ggggggggr2024-01-05 03:41:20
\n", "

684 rows × 6 columns

\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state start_dt\n", "0 c30 1704393290 0_g 33 rrrrrr 2024-01-05 03:34:50\n", "1 c30 1704393290 0_y 4 rrrrrr 2024-01-05 03:34:50\n", "2 c30 1704393290 1__r 1 rrrrrr 2024-01-05 03:34:50\n", "0 c30 1704393290 1_g 34 GGGGGG 2024-01-05 03:34:50\n", "1 c30 1704393290 1_y 4 GGGGGG 2024-01-05 03:34:50\n", ".. ... ... ... ... ... ...\n", "2 u60 1704393680 3__r 1 ggggggggr 2024-01-05 03:41:20\n", "0 u60 1704393680 3_g 51 ggggggggr 2024-01-05 03:41:20\n", "1 u60 1704393680 3_y 4 ggggggggr 2024-01-05 03:41:20\n", "2 u60 1704393680 4__r 1 ggggggggr 2024-01-05 03:41:20\n", "309 u60 1704393680 4_g 17 ggggggggr 2024-01-05 03:41:20\n", "\n", "[684 rows x 6 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(self.SIGTABLE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 10.3 검증요건\n", "1. `g` -> `g` 사이에 `g`, `g`가 부여되었는가?\n", "2. `r` -> `r` 사이에 `r`, `r`이 부여되었는가?\n", "3. `G` -> `G` 사이에 `G`, `G`가 부여되었는가?\n", "4. `G` -> `r` 사이에 `y`, `r`이 부여되었는가?\n", "5. `r` -> `G` 사이에 `r`, `r`이 부여되었는가?\n", "* 이 다섯 경우만 검증하면 됨. $|\\{G, g, r\\}^2|=9$이므로 가능한 경우의 수는 아홉가지이지만, g로 시작하는 경우에는 무조건 g로 끝나고 그 반대도 성립하기 때문에 4가지 경우는 제외할 수 있음." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 10.4 검증" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
98i01704393200037gGGrgrrrgGGGGrgrr2024-01-05 03:33:20
99i01704393200139grrGgrrrgrrrrGgrr2024-01-05 03:33:20
100i01704393200225grrrgGGGgrrrrrgrr2024-01-05 03:33:20
101i01704393200330grrrgGGrgrrrrrgGr2024-01-05 03:33:20
102i01704393200429grrrgrrrgrrrrrgGG2024-01-05 03:33:20
162i01704393360037gGGrgrrrgGGGGrgrr2024-01-05 03:36:00
163i01704393360139grrGgrrrgrrrrGgrr2024-01-05 03:36:00
164i01704393360225grrrgGGGgrrrrrgrr2024-01-05 03:36:00
165i01704393360330grrrgGGrgrrrrrgGr2024-01-05 03:36:00
166i01704393360429grrrgrrrgrrrrrgGG2024-01-05 03:36:00
228i01704393520037gGGrgrrrgGGGGrgrr2024-01-05 03:38:40
229i01704393520139grrGgrrrgrrrrGgrr2024-01-05 03:38:40
230i01704393520225grrrgGGGgrrrrrgrr2024-01-05 03:38:40
231i01704393520330grrrgGGrgrrrrrgGr2024-01-05 03:38:40
232i01704393520429grrrgrrrgrrrrrgGG2024-01-05 03:38:40
\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state \\\n", "98 i0 1704393200 0 37 gGGrgrrrgGGGGrgrr \n", "99 i0 1704393200 1 39 grrGgrrrgrrrrGgrr \n", "100 i0 1704393200 2 25 grrrgGGGgrrrrrgrr \n", "101 i0 1704393200 3 30 grrrgGGrgrrrrrgGr \n", "102 i0 1704393200 4 29 grrrgrrrgrrrrrgGG \n", "162 i0 1704393360 0 37 gGGrgrrrgGGGGrgrr \n", "163 i0 1704393360 1 39 grrGgrrrgrrrrGgrr \n", "164 i0 1704393360 2 25 grrrgGGGgrrrrrgrr \n", "165 i0 1704393360 3 30 grrrgGGrgrrrrrgGr \n", "166 i0 1704393360 4 29 grrrgrrrgrrrrrgGG \n", "228 i0 1704393520 0 37 gGGrgrrrgGGGGrgrr \n", "229 i0 1704393520 1 39 grrGgrrrgrrrrGgrr \n", "230 i0 1704393520 2 25 grrrgGGGgrrrrrgrr \n", "231 i0 1704393520 3 30 grrrgGGrgrrrrrgGr \n", "232 i0 1704393520 4 29 grrrgrrrgrrrrrgGG \n", "\n", " start_dt \n", "98 2024-01-05 03:33:20 \n", "99 2024-01-05 03:33:20 \n", "100 2024-01-05 03:33:20 \n", "101 2024-01-05 03:33:20 \n", "102 2024-01-05 03:33:20 \n", "162 2024-01-05 03:36:00 \n", "163 2024-01-05 03:36:00 \n", "164 2024-01-05 03:36:00 \n", "165 2024-01-05 03:36:00 \n", "166 2024-01-05 03:36:00 \n", "228 2024-01-05 03:38:40 \n", "229 2024-01-05 03:38:40 \n", "230 2024-01-05 03:38:40 \n", "231 2024-01-05 03:38:40 \n", "232 2024-01-05 03:38:40 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
0i017043932000_g32gGGrgrrrgGGGGrgrr2024-01-05 03:33:20
1i017043932000_y4gyyrgrrrgyyyyrgrr2024-01-05 03:33:20
2i017043932001__r1grrrgrrrgrrrrrgrr2024-01-05 03:33:20
0i017043932001_g34grrGgrrrgrrrrGgrr2024-01-05 03:33:20
1i017043932001_y4grrygrrrgrrrrygrr2024-01-05 03:33:20
2i017043932002__r1grrrgrrrgrrrrrgrr2024-01-05 03:33:20
0i017043932002_g20grrrgGGGgrrrrrgrr2024-01-05 03:33:20
1i017043932002_y4grrrgGGygrrrrrgrr2024-01-05 03:33:20
2i017043932003__r1grrrgGGrgrrrrrgrr2024-01-05 03:33:20
0i017043932003_g25grrrgGGrgrrrrrgGr2024-01-05 03:33:20
1i017043932003_y4grrrgyyrgrrrrrgGr2024-01-05 03:33:20
2i017043932004__r1grrrgrrrgrrrrrgGr2024-01-05 03:33:20
0i017043932004_g24grrrgrrrgrrrrrgGG2024-01-05 03:33:20
1i017043932004_y4grrrgrrrgrrrrrgyy2024-01-05 03:33:20
2i017043933600__r1grrrgrrrgrrrrrgrr2024-01-05 03:36:00
0i017043933600_g32gGGrgrrrgGGGGrgrr2024-01-05 03:36:00
1i017043933600_y4gyyrgrrrgyyyyrgrr2024-01-05 03:36:00
2i017043933601__r1grrrgrrrgrrrrrgrr2024-01-05 03:36:00
0i017043933601_g34grrGgrrrgrrrrGgrr2024-01-05 03:36:00
1i017043933601_y4grrygrrrgrrrrygrr2024-01-05 03:36:00
2i017043933602__r1grrrgrrrgrrrrrgrr2024-01-05 03:36:00
0i017043933602_g20grrrgGGGgrrrrrgrr2024-01-05 03:36:00
1i017043933602_y4grrrgGGygrrrrrgrr2024-01-05 03:36:00
2i017043933603__r1grrrgGGrgrrrrrgrr2024-01-05 03:36:00
0i017043933603_g25grrrgGGrgrrrrrgGr2024-01-05 03:36:00
1i017043933603_y4grrrgyyrgrrrrrgGr2024-01-05 03:36:00
2i017043933604__r1grrrgrrrgrrrrrgGr2024-01-05 03:36:00
0i017043933604_g24grrrgrrrgrrrrrgGG2024-01-05 03:36:00
1i017043933604_y4grrrgrrrgrrrrrgyy2024-01-05 03:36:00
2i017043935200__r1grrrgrrrgrrrrrgrr2024-01-05 03:38:40
0i017043935200_g32gGGrgrrrgGGGGrgrr2024-01-05 03:38:40
1i017043935200_y4gyyrgrrrgyyyyrgrr2024-01-05 03:38:40
2i017043935201__r1grrrgrrrgrrrrrgrr2024-01-05 03:38:40
0i017043935201_g34grrGgrrrgrrrrGgrr2024-01-05 03:38:40
1i017043935201_y4grrygrrrgrrrrygrr2024-01-05 03:38:40
2i017043935202__r1grrrgrrrgrrrrrgrr2024-01-05 03:38:40
0i017043935202_g20grrrgGGGgrrrrrgrr2024-01-05 03:38:40
1i017043935202_y4grrrgGGygrrrrrgrr2024-01-05 03:38:40
2i017043935203__r1grrrgGGrgrrrrrgrr2024-01-05 03:38:40
0i017043935203_g25grrrgGGrgrrrrrgGr2024-01-05 03:38:40
1i017043935203_y4grrrgyyrgrrrrrgGr2024-01-05 03:38:40
2i017043935204__r1grrrgrrrgrrrrrgGr2024-01-05 03:38:40
232i017043935204_g24grrrgrrrgrrrrrgGG2024-01-05 03:38:40
\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state \\\n", "0 i0 1704393200 0_g 32 gGGrgrrrgGGGGrgrr \n", "1 i0 1704393200 0_y 4 gyyrgrrrgyyyyrgrr \n", "2 i0 1704393200 1__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393200 1_g 34 grrGgrrrgrrrrGgrr \n", "1 i0 1704393200 1_y 4 grrygrrrgrrrrygrr \n", "2 i0 1704393200 2__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393200 2_g 20 grrrgGGGgrrrrrgrr \n", "1 i0 1704393200 2_y 4 grrrgGGygrrrrrgrr \n", "2 i0 1704393200 3__r 1 grrrgGGrgrrrrrgrr \n", "0 i0 1704393200 3_g 25 grrrgGGrgrrrrrgGr \n", "1 i0 1704393200 3_y 4 grrrgyyrgrrrrrgGr \n", "2 i0 1704393200 4__r 1 grrrgrrrgrrrrrgGr \n", "0 i0 1704393200 4_g 24 grrrgrrrgrrrrrgGG \n", "1 i0 1704393200 4_y 4 grrrgrrrgrrrrrgyy \n", "2 i0 1704393360 0__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393360 0_g 32 gGGrgrrrgGGGGrgrr \n", "1 i0 1704393360 0_y 4 gyyrgrrrgyyyyrgrr \n", "2 i0 1704393360 1__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393360 1_g 34 grrGgrrrgrrrrGgrr \n", "1 i0 1704393360 1_y 4 grrygrrrgrrrrygrr \n", "2 i0 1704393360 2__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393360 2_g 20 grrrgGGGgrrrrrgrr \n", "1 i0 1704393360 2_y 4 grrrgGGygrrrrrgrr \n", "2 i0 1704393360 3__r 1 grrrgGGrgrrrrrgrr \n", "0 i0 1704393360 3_g 25 grrrgGGrgrrrrrgGr \n", "1 i0 1704393360 3_y 4 grrrgyyrgrrrrrgGr \n", "2 i0 1704393360 4__r 1 grrrgrrrgrrrrrgGr \n", "0 i0 1704393360 4_g 24 grrrgrrrgrrrrrgGG \n", "1 i0 1704393360 4_y 4 grrrgrrrgrrrrrgyy \n", "2 i0 1704393520 0__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393520 0_g 32 gGGrgrrrgGGGGrgrr \n", "1 i0 1704393520 0_y 4 gyyrgrrrgyyyyrgrr \n", "2 i0 1704393520 1__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393520 1_g 34 grrGgrrrgrrrrGgrr \n", "1 i0 1704393520 1_y 4 grrygrrrgrrrrygrr \n", "2 i0 1704393520 2__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393520 2_g 20 grrrgGGGgrrrrrgrr \n", "1 i0 1704393520 2_y 4 grrrgGGygrrrrrgrr \n", "2 i0 1704393520 3__r 1 grrrgGGrgrrrrrgrr \n", "0 i0 1704393520 3_g 25 grrrgGGrgrrrrrgGr \n", "1 i0 1704393520 3_y 4 grrrgyyrgrrrrrgGr \n", "2 i0 1704393520 4__r 1 grrrgrrrgrrrrrgGr \n", "232 i0 1704393520 4_g 24 grrrgrrrgrrrrrgGG \n", "\n", " start_dt \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "232 2024-01-05 03:38:40 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "## 모두 검증되었음.\n", "display(self.Sigtable[self.Sigtable.node_id=='i0'])\n", "display(self.SIGTABLE[self.SIGTABLE.node_id=='i0'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 11. `make_tl_file`" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n", "3. 이동류정보 테이블을 변환합니다.\n", "4. 통합 테이블을 생성합니다.\n" ] } ], "source": [ "self = SignalGenerator()\n", "self.present_time = int(datetime(2024, 1, 5, 3, 40).timestamp())\n", "self.prepare_data()\n", "self.process_history()\n", "self.process_movement()\n", "self.make_histids()\n", "self.initialize_states()\n", "self.assign_signals()\n", "self.set_timepoints()\n", "self.assign_red_yellow()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 11.1. 입력데이터\n", "- 입력 : `SIGTABLE`\n", "- 컬럼 : 노드id, 시작유닉스, sumo현시번호, 현시시간, 신호, (시작일시)\n", "- 설명 : 황색시간과 적색시간이 지정된 신호테이블" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 11.2 출력데이터\n", "- 출력 : `sn_[timestamp].add.xml`\n", "- 설명 : 신호파일" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 11.3 검증요건" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. `SIGTABLE`의 현시시간과 신호가 잘 반영되었는가?\n", "2. `offset`이 제대로 반영되었는가?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 11.4 검증" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'c30': -10, 'i0': -100, 'i1': -130, 'i2': -140, 'i3': -10, 'i6': -70, 'i7': -60, 'i8': -9, 'i9': -90, 'u00': -100, 'u20': -140, 'u30': -10, 'u31': -10, 'u32': -10, 'u60': -70}\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
node_idstart_unixphase_sumodurationstatestart_dt
0i017043932000_g32gGGrgrrrgGGGGrgrr2024-01-05 03:33:20
1i017043932000_y4gyyrgrrrgyyyyrgrr2024-01-05 03:33:20
2i017043932001__r1grrrgrrrgrrrrrgrr2024-01-05 03:33:20
0i017043932001_g34grrGgrrrgrrrrGgrr2024-01-05 03:33:20
1i017043932001_y4grrygrrrgrrrrygrr2024-01-05 03:33:20
2i017043932002__r1grrrgrrrgrrrrrgrr2024-01-05 03:33:20
0i017043932002_g20grrrgGGGgrrrrrgrr2024-01-05 03:33:20
1i017043932002_y4grrrgGGygrrrrrgrr2024-01-05 03:33:20
2i017043932003__r1grrrgGGrgrrrrrgrr2024-01-05 03:33:20
0i017043932003_g25grrrgGGrgrrrrrgGr2024-01-05 03:33:20
1i017043932003_y4grrrgyyrgrrrrrgGr2024-01-05 03:33:20
2i017043932004__r1grrrgrrrgrrrrrgGr2024-01-05 03:33:20
0i017043932004_g24grrrgrrrgrrrrrgGG2024-01-05 03:33:20
1i017043932004_y4grrrgrrrgrrrrrgyy2024-01-05 03:33:20
2i017043933600__r1grrrgrrrgrrrrrgrr2024-01-05 03:36:00
0i017043933600_g32gGGrgrrrgGGGGrgrr2024-01-05 03:36:00
1i017043933600_y4gyyrgrrrgyyyyrgrr2024-01-05 03:36:00
2i017043933601__r1grrrgrrrgrrrrrgrr2024-01-05 03:36:00
0i017043933601_g34grrGgrrrgrrrrGgrr2024-01-05 03:36:00
1i017043933601_y4grrygrrrgrrrrygrr2024-01-05 03:36:00
2i017043933602__r1grrrgrrrgrrrrrgrr2024-01-05 03:36:00
0i017043933602_g20grrrgGGGgrrrrrgrr2024-01-05 03:36:00
1i017043933602_y4grrrgGGygrrrrrgrr2024-01-05 03:36:00
2i017043933603__r1grrrgGGrgrrrrrgrr2024-01-05 03:36:00
0i017043933603_g25grrrgGGrgrrrrrgGr2024-01-05 03:36:00
1i017043933603_y4grrrgyyrgrrrrrgGr2024-01-05 03:36:00
2i017043933604__r1grrrgrrrgrrrrrgGr2024-01-05 03:36:00
0i017043933604_g24grrrgrrrgrrrrrgGG2024-01-05 03:36:00
1i017043933604_y4grrrgrrrgrrrrrgyy2024-01-05 03:36:00
2i017043935200__r1grrrgrrrgrrrrrgrr2024-01-05 03:38:40
0i017043935200_g32gGGrgrrrgGGGGrgrr2024-01-05 03:38:40
1i017043935200_y4gyyrgrrrgyyyyrgrr2024-01-05 03:38:40
2i017043935201__r1grrrgrrrgrrrrrgrr2024-01-05 03:38:40
0i017043935201_g34grrGgrrrgrrrrGgrr2024-01-05 03:38:40
1i017043935201_y4grrygrrrgrrrrygrr2024-01-05 03:38:40
2i017043935202__r1grrrgrrrgrrrrrgrr2024-01-05 03:38:40
0i017043935202_g20grrrgGGGgrrrrrgrr2024-01-05 03:38:40
1i017043935202_y4grrrgGGygrrrrrgrr2024-01-05 03:38:40
2i017043935203__r1grrrgGGrgrrrrrgrr2024-01-05 03:38:40
0i017043935203_g25grrrgGGrgrrrrrgGr2024-01-05 03:38:40
1i017043935203_y4grrrgyyrgrrrrrgGr2024-01-05 03:38:40
2i017043935204__r1grrrgrrrgrrrrrgGr2024-01-05 03:38:40
232i017043935204_g24grrrgrrrgrrrrrgGG2024-01-05 03:38:40
\n", "
" ], "text/plain": [ " node_id start_unix phase_sumo duration state \\\n", "0 i0 1704393200 0_g 32 gGGrgrrrgGGGGrgrr \n", "1 i0 1704393200 0_y 4 gyyrgrrrgyyyyrgrr \n", "2 i0 1704393200 1__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393200 1_g 34 grrGgrrrgrrrrGgrr \n", "1 i0 1704393200 1_y 4 grrygrrrgrrrrygrr \n", "2 i0 1704393200 2__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393200 2_g 20 grrrgGGGgrrrrrgrr \n", "1 i0 1704393200 2_y 4 grrrgGGygrrrrrgrr \n", "2 i0 1704393200 3__r 1 grrrgGGrgrrrrrgrr \n", "0 i0 1704393200 3_g 25 grrrgGGrgrrrrrgGr \n", "1 i0 1704393200 3_y 4 grrrgyyrgrrrrrgGr \n", "2 i0 1704393200 4__r 1 grrrgrrrgrrrrrgGr \n", "0 i0 1704393200 4_g 24 grrrgrrrgrrrrrgGG \n", "1 i0 1704393200 4_y 4 grrrgrrrgrrrrrgyy \n", "2 i0 1704393360 0__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393360 0_g 32 gGGrgrrrgGGGGrgrr \n", "1 i0 1704393360 0_y 4 gyyrgrrrgyyyyrgrr \n", "2 i0 1704393360 1__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393360 1_g 34 grrGgrrrgrrrrGgrr \n", "1 i0 1704393360 1_y 4 grrygrrrgrrrrygrr \n", "2 i0 1704393360 2__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393360 2_g 20 grrrgGGGgrrrrrgrr \n", "1 i0 1704393360 2_y 4 grrrgGGygrrrrrgrr \n", "2 i0 1704393360 3__r 1 grrrgGGrgrrrrrgrr \n", "0 i0 1704393360 3_g 25 grrrgGGrgrrrrrgGr \n", "1 i0 1704393360 3_y 4 grrrgyyrgrrrrrgGr \n", "2 i0 1704393360 4__r 1 grrrgrrrgrrrrrgGr \n", "0 i0 1704393360 4_g 24 grrrgrrrgrrrrrgGG \n", "1 i0 1704393360 4_y 4 grrrgrrrgrrrrrgyy \n", "2 i0 1704393520 0__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393520 0_g 32 gGGrgrrrgGGGGrgrr \n", "1 i0 1704393520 0_y 4 gyyrgrrrgyyyyrgrr \n", "2 i0 1704393520 1__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393520 1_g 34 grrGgrrrgrrrrGgrr \n", "1 i0 1704393520 1_y 4 grrygrrrgrrrrygrr \n", "2 i0 1704393520 2__r 1 grrrgrrrgrrrrrgrr \n", "0 i0 1704393520 2_g 20 grrrgGGGgrrrrrgrr \n", "1 i0 1704393520 2_y 4 grrrgGGygrrrrrgrr \n", "2 i0 1704393520 3__r 1 grrrgGGrgrrrrrgrr \n", "0 i0 1704393520 3_g 25 grrrgGGrgrrrrrgGr \n", "1 i0 1704393520 3_y 4 grrrgyyrgrrrrrgGr \n", "2 i0 1704393520 4__r 1 grrrgrrrgrrrrrgGr \n", "232 i0 1704393520 4_g 24 grrrgrrrgrrrrrgGG \n", "\n", " start_dt \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:33:20 \n", "0 2024-01-05 03:33:20 \n", "1 2024-01-05 03:33:20 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:36:00 \n", "0 2024-01-05 03:36:00 \n", "1 2024-01-05 03:36:00 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "0 2024-01-05 03:38:40 \n", "1 2024-01-05 03:38:40 \n", "2 2024-01-05 03:38:40 \n", "232 2024-01-05 03:38:40 " ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 1 잘 반영됨\n", "print(self.offsets)\n", "self.SIGTABLE[self.SIGTABLE.node_id=='i0']\n" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ] } ], "source": [ "strings = ['\\n']\n", "for node_id, group in self.SIGTABLE.groupby('node_id'):\n", " strings.append(f' \\n')\n", " for row in group.itertuples(index=True):\n", " duration = row.duration\n", " state = row.state\n", " strings.append(f' \\n')\n", " strings.append(' \\n')\n", "strings.append('')\n", "strings = ''.join(strings)\n", "print(strings)" ] } ], "metadata": { "kernelspec": { "display_name": "rts", "language": "python", "name": "rts" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 }