diff --git a/notebooks/Post_processing_v2.ipynb b/notebooks/Post_processing_v2.ipynb new file mode 100644 index 00000000..54e202ac --- /dev/null +++ b/notebooks/Post_processing_v2.ipynb @@ -0,0 +1,1688 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "4c515c3b", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "from inro.emme.database.scenario import Scenario as EmmeScenario\n", + "from inro.emme.network import Network\n", + "from inro.emme.database.emmebank import Emmebank, create as _create_emmebank\n", + "from shapely.geometry import mapping, LineString\n", + "import json\n", + "from typing import Dict, List, Optional\n", + "import inro.modeller as _m" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ffc17fbe", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "transit_bank = Emmebank('../Database_transit/emmebank')\n", + "highway_bank = Emmebank('../Database_highway/emmebank')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "882a0254", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "scenario = bank.scenario(12)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "89a839a9", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'centroids': 4756,\n", + " 'regular_nodes': 477431,\n", + " 'links': 1602820,\n", + " 'turn_entries': 0,\n", + " 'transit_lines': 1252,\n", + " 'transit_segments': 231425,\n", + " 'turns': 0,\n", + " 'modes': 17,\n", + " 'transit_vehicles': 119}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scenario.element_totals" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3073110f", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "transit_network = scenario.get_network()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "8cf0dffa", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "output_path = \"E:\\\\TM2\\\\2015_TM2_20250619\\\\output_summaries\\\\boardings_by_segment_am.csv\"\n", + "with open(output_path, 'w') as f:\n", + " f.write(\n", + " \",\".join([\n", + " \"Line\", \n", + " \"From\",\n", + " \"To\",\n", + " \"Length\", \n", + " \"Dwt\",\n", + " \"capt\",\n", + " \"TTF\",\n", + " \"voltr\",\n", + " \"caps\",\n", + " \"Data1\",\n", + " \"Data2\",\n", + " \"Data3\"\n", + " ])\n", + " )\n", + " f.write(\"\\n\")\n", + " \n", + " for line in transit_network.transit_lines():\n", + " total_capacity = line.vehicle.total_capacity\n", + " seated_capacity = line.vehicle.seated_capacity\n", + " hdw = line.headway\n", + " line_hour_total_cap = 60 * total_capacity / hdw\n", + " line_hour_seated_cap = 60 * seated_capacity / hdw\n", + " for segment in line.segments(include_hidden=False):\n", + " f.write(\n", + " \",\".join(\n", + " [\n", + " str(x) \n", + " for x in [\n", + " segment.line.id, \n", + " segment.i_node, \n", + " segment.j_node,\n", + " segment.link.length, \n", + " segment.dwell_time,\n", + " line_hour_total_cap,\n", + " segment.transit_time_func,\n", + " segment.transit_volume,\n", + " line_hour_seated_cap,\n", + " segment.data1,\n", + " segment.data2,\n", + " segment.data3\n", + " ]\n", + " ]\n", + " )\n", + " )\n", + " f.write(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "554129e5", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "output_path_geojson = \"E:\\\\TM2\\\\2015_TM2_20250619\\\\output_summaries\\\\boardings_by_segment_am.geojson\"" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "ae47e6c9", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "features = []\n", + "for line in transit_network.transit_lines():\n", + " total_capacity = line.vehicle.total_capacity\n", + " seated_capacity = line.vehicle.seated_capacity\n", + " hdw = line.headway\n", + " line_hour_total_cap = 60 * total_capacity / hdw\n", + " line_hour_seated_cap = 60 * seated_capacity / hdw\n", + "\n", + " for segment in line.segments(include_hidden=False):\n", + " geometry = mapping(LineString(segment.link.shape))\n", + " feature = {\n", + " \"type\": \"Feature\",\n", + " \"geometry\": geometry,\n", + " \"properties\": {\n", + " \"LINE_ID\": segment.line.id,\n", + " \"INODE\": int(segment.i_node.id),\n", + " \"JNODE\": int(segment.j_node.id),\n", + " \"VOLTR\": segment.transit_volume,\n", + " \"caps\": line_hour_seated_cap,\n", + " \"capt\": line_hour_total_cap\n", + " }\n", + " }\n", + " features.append(feature)\n", + "\n", + "geojson_data = {\n", + " \"type\": \"FeatureCollection\",\n", + " \"crs\": {\n", + " \"type\": \"name\",\n", + " \"properties\": {\"name\": \"urn:ogc:def:crs:EPSG::2875\"},\n", + " },\n", + " \"features\": features\n", + "}\n", + "\n", + "with open(output_path_geojson, \"w\") as f:\n", + " json.dump(geojson_data, f, indent=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "11719a4a", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "transit_attributes = {\n", + " \"LINK\": ['#link_id', \"@trantime\", \"@ft\"],\n", + " \"TRANSIT_SEGMENT\": [\"@schedule_time\", \"@trantime_seg\", \"data1\"]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "56908585", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "def copy_attribute_values(src, \n", + " dst, \n", + " src_attributes: Dict[str, List[str]],\n", + " dst_attributes: Optional[Dict[str, List[str]]] = None,\n", + " ):\n", + " for domain, src_attrs in src_attributes.items():\n", + " if src_attrs:\n", + " dst_attrs = src_attrs\n", + " if dst_attributes is not None:\n", + " dst_attrs = dst_attributes.get(domain, src_attrs)\n", + " values = src.get_attribute_values(domain, src_attrs)\n", + " dst.set_attribute_values(domain, dst_attrs, values)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "3bbbf231", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "copy_attribute_values(scenario, transit_network, transit_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "e5d88051", + "metadata": { + "scrolled": true, + "show_input": true + }, + "outputs": [], + "source": [ + "transit_link_dict = {\n", + " tran_link[\"#link_id\"]: tran_link for tran_link in transit_network.links()\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "56c557fb", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'#link_id'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[81], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mtransit_link_dict\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m#link_id\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mi_node\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", + "\u001b[1;31mKeyError\u001b[0m: '#link_id'" + ] + } + ], + "source": [ + "transit_link_dict['#link_id']['i_node']" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "2c19e245", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: Link(482187-477842),\n", + " 77108: Link(1-6345),\n", + " 78851: Link(1-24987),\n", + " 79119: Link(1-27779),\n", + " 77532: Link(2-11163),\n", + " 78081: Link(2-16351),\n", + " 78144: Link(2-17005),\n", + " 77248: Link(3-7750),\n", + " 77580: Link(3-11662),\n", + " 77583: Link(3-11677),\n", + " 79143: Link(3-28063),\n", + " 77970: Link(4-15283),\n", + " 78532: Link(4-21458),\n", + " 78605: Link(4-22191),\n", + " 77581: Link(5-11662),\n", + " 78331: Link(5-19222),\n", + " 78824: Link(5-24659),\n", + " 78884: Link(5-25265),\n", + " 78444: Link(6-20456),\n", + " 78783: Link(6-24353),\n", + " 77025: Link(7-5465),\n", + " 77212: Link(7-7419),\n", + " 78885: Link(7-25265),\n", + " 77930: Link(8-14924),\n", + " 78179: Link(8-17405),\n", + " 78837: Link(8-24845),\n", + " 77724: Link(9-13035),\n", + " 78273: Link(9-18411),\n", + " 78866: Link(9-25106),\n", + " 77126: Link(10-6532),\n", + " 77911: Link(10-14761),\n", + " 77955: Link(10-15118),\n", + " 78011: Link(10-15673),\n", + " 77927: Link(11-14912),\n", + " 77937: Link(11-14934),\n", + " 77431: Link(12-9904),\n", + " 77743: Link(12-13190),\n", + " 79115: Link(12-27744),\n", + " 77005: Link(13-5163),\n", + " 77806: Link(13-13760),\n", + " 78329: Link(13-19204),\n", + " 78671: Link(13-23028),\n", + " 77958: Link(14-15162),\n", + " 78306: Link(14-18849),\n", + " 78672: Link(14-23028),\n", + " 76985: Link(15-4930),\n", + " 78061: Link(15-16211),\n", + " 78160: Link(15-17123),\n", + " 78567: Link(15-21759),\n", + " 78350: Link(16-19409),\n", + " 78568: Link(16-21759),\n", + " 78735: Link(16-23782),\n", + " 77074: Link(17-5971),\n", + " 77840: Link(17-14125),\n", + " 77849: Link(17-14193),\n", + " 78736: Link(17-23782),\n", + " 77400: Link(18-9568),\n", + " 77736: Link(18-13148),\n", + " 77740: Link(18-13172),\n", + " 79139: Link(18-28007),\n", + " 77461: Link(19-10355),\n", + " 78351: Link(19-19409),\n", + " 79140: Link(19-28007),\n", + " 77978: Link(20-15357),\n", + " 78384: Link(20-19781),\n", + " 79056: Link(20-27072),\n", + " 77283: Link(21-8279),\n", + " 77850: Link(21-14193),\n", + " 78014: Link(21-15721),\n", + " 77138: Link(22-6674),\n", + " 77368: Link(22-9134),\n", + " 77676: Link(22-12480),\n", + " 78143: Link(22-16989),\n", + " 77139: Link(23-6674),\n", + " 77972: Link(23-15321),\n", + " 78008: Link(23-15650),\n", + " 77369: Link(24-9134),\n", + " 77999: Link(24-15559),\n", + " 78140: Link(24-16966),\n", + " 78166: Link(24-17229),\n", + " 77430: Link(25-9880),\n", + " 77737: Link(25-13148),\n", + " 78185: Link(25-17476),\n", + " 78346: Link(25-19385),\n", + " 77087: Link(26-6103),\n", + " 78033: Link(26-15972),\n", + " 78246: Link(26-18192),\n", + " 78629: Link(26-22523),\n", + " 77415: Link(27-9719),\n", + " 77428: Link(27-9874),\n", + " 77842: Link(27-14141),\n", + " 79091: Link(27-27514),\n", + " 77344: Link(28-8876),\n", + " 78428: Link(28-20287),\n", + " 78752: Link(28-23994),\n", + " 77358: Link(29-8996),\n", + " 77365: Link(29-9110),\n", + " 77494: Link(29-10748),\n", + " 78530: Link(29-21403),\n", + " 78101: Link(30-16537),\n", + " 78171: Link(30-17285),\n", + " 78411: Link(30-20072),\n", + " 77056: Link(31-5786),\n", + " 77090: Link(31-6130),\n", + " 77187: Link(31-7128),\n", + " 77188: Link(32-7128),\n", + " 77229: Link(32-7640),\n", + " 77719: Link(32-12965),\n", + " 77131: Link(33-6570),\n", + " 78111: Link(33-16675),\n", + " 78396: Link(33-19932),\n", + " 78933: Link(33-25882),\n", + " 77631: Link(34-12033),\n", + " 78476: Link(34-20857),\n", + " 78645: Link(34-22749),\n", + " 77230: Link(35-7640),\n", + " 77516: Link(35-10963),\n", + " 78716: Link(35-23474),\n", + " 79105: Link(35-27615),\n", + " 77517: Link(36-10963),\n", + " 78834: Link(36-24833),\n", + " 79106: Link(36-27615),\n", + " 77103: Link(37-6276),\n", + " 77860: Link(37-14313),\n", + " 78957: Link(37-26029),\n", + " 79051: Link(37-27026),\n", + " 77622: Link(38-11984),\n", + " 77784: Link(38-13551),\n", + " 78248: Link(38-18194),\n", + " 78632: Link(38-22604),\n", + " 77446: Link(39-10154),\n", + " 78052: Link(39-16144),\n", + " 78408: Link(39-20031),\n", + " 78757: Link(39-24089),\n", + " 77558: Link(40-11418),\n", + " 77610: Link(40-11901),\n", + " 78028: Link(40-15940),\n", + " 79000: Link(40-26463),\n", + " 77043: Link(41-5605),\n", + " 78373: Link(41-19641),\n", + " 78560: Link(41-21691),\n", + " 77439: Link(42-10024),\n", + " 77983: Link(42-15426),\n", + " 78121: Link(42-16784),\n", + " 78519: Link(42-21285),\n", + " 77623: Link(43-11986),\n", + " 77933: Link(43-14928),\n", + " 78267: Link(43-18347),\n", + " 78873: Link(43-25162),\n", + " 77244: Link(44-7716),\n", + " 78276: Link(44-18461),\n", + " 78599: Link(44-22089),\n", + " 78922: Link(44-25627),\n", + " 77484: Link(45-10652),\n", + " 78034: Link(45-15972),\n", + " 78961: Link(45-26067),\n", + " 79134: Link(45-27933),\n", + " 77046: Link(46-5643),\n", + " 78167: Link(46-17229),\n", + " 78506: Link(46-21144),\n", + " 78962: Link(46-26067),\n", + " 77773: Link(47-13471),\n", + " 78062: Link(47-16211),\n", + " 78507: Link(47-21144),\n", + " 77127: Link(48-6532),\n", + " 77152: Link(48-6802),\n", + " 77820: Link(48-13939),\n", + " 78198: Link(48-17616),\n", + " 78199: Link(49-17616),\n", + " 78665: Link(49-22973),\n", + " 78738: Link(49-23833),\n", + " 78931: Link(49-25844),\n", + " 77023: Link(50-5456),\n", + " 78018: Link(50-15754),\n", + " 78838: Link(50-24849),\n", + " 77449: Link(51-10209),\n", + " 77760: Link(51-13330),\n", + " 78963: Link(51-26091),\n", + " 77495: Link(52-10758),\n", + " 78029: Link(52-15949),\n", + " 78229: Link(52-18044),\n", + " 78971: Link(52-26153),\n", + " 77035: Link(53-5533),\n", + " 77128: Link(53-6532),\n", + " 77727: Link(54-13067),\n", + " 78030: Link(54-15949),\n", + " 78593: Link(54-22029),\n", + " 78854: Link(54-25001),\n", + " 77987: Link(55-15431),\n", + " 78594: Link(55-22029),\n", + " 78811: Link(55-24572),\n", + " 77292: Link(56-8334),\n", + " 77728: Link(56-13067),\n", + " 77833: Link(56-14053),\n", + " 78865: Link(56-25070),\n", + " 77618: Link(57-11959),\n", + " 78395: Link(57-19922),\n", + " 78896: Link(57-25394),\n", + " 78964: Link(57-26091),\n", + " 77295: Link(58-8348),\n", + " 78770: Link(58-24253),\n", + " 78812: Link(58-24572),\n", + " 78666: Link(59-22973),\n", + " 78739: Link(59-23833),\n", + " 78849: Link(59-24974),\n", + " 78932: Link(59-25844),\n", + " 77189: Link(60-7134),\n", + " 78610: Link(60-22233),\n", + " 78690: Link(60-23184),\n", + " 79028: Link(60-26714),\n", + " 77777: Link(61-13513),\n", + " 78527: Link(61-21368),\n", + " 78691: Link(61-23184),\n", + " 78835: Link(61-24843),\n", + " 77091: Link(62-6147),\n", + " 78055: Link(62-16163),\n", + " 78247: Link(62-18192),\n", + " 77092: Link(63-6147),\n", + " 78368: Link(63-19580),\n", + " 78454: Link(63-20569),\n", + " 78653: Link(63-22875),\n", + " 77112: Link(64-6398),\n", + " 77190: Link(64-7134),\n", + " 78546: Link(64-21576),\n", + " 78836: Link(64-24843),\n", + " 77277: Link(65-8172),\n", + " 78664: Link(65-22970),\n", + " 78813: Link(65-24572),\n", + " 79124: Link(65-27855),\n", + " 77293: Link(66-8334),\n", + " 77570: Link(66-11559),\n", + " 77638: Link(66-12140),\n", + " 78226: Link(66-18008),\n", + " 77073: Link(67-5950),\n", + " 77433: Link(67-9931),\n", + " 78321: Link(67-19099),\n", + " 78895: Link(67-25387),\n", + " 77105: Link(68-6284),\n", + " 77559: Link(68-11418),\n", + " 78725: Link(68-23636),\n", + " 78778: Link(68-24310),\n", + " 77003: Link(69-5129),\n", + " 77661: Link(69-12355),\n", + " 78540: Link(69-21523),\n", + " 78579: Link(69-21909),\n", + " 77168: Link(70-6920),\n", + " 78580: Link(70-21909),\n", + " 79001: Link(70-26463),\n", + " 79064: Link(70-27182),\n", + " 77434: Link(71-9933),\n", + " 77499: Link(71-10795),\n", + " 78638: Link(71-22649),\n", + " 79081: Link(71-27373),\n", + " 77969: Link(72-15270),\n", + " 78619: Link(72-22330),\n", + " 79070: Link(72-27267),\n", + " 77408: Link(73-9658),\n", + " 77685: Link(73-12585),\n", + " 78095: Link(73-16495),\n", + " 77196: Link(74-7256),\n", + " 77360: Link(74-9047),\n", + " 77675: Link(75-12458),\n", + " 77686: Link(75-12586),\n", + " 77897: Link(75-14621),\n", + " 78360: Link(75-19505),\n", + " 77193: Link(76-7229),\n", + " 77308: Link(76-8486),\n", + " 77424: Link(76-9836),\n", + " 77856: Link(76-14274),\n", + " 77180: Link(77-7080),\n", + " 77467: Link(77-10394),\n", + " 78082: Link(77-16354),\n", + " 78843: Link(77-24905),\n", + " 77511: Link(78-10878),\n", + " 77612: Link(78-11917),\n", + " 78522: Link(78-21325),\n", + " 79031: Link(78-26747),\n", + " 78080: Link(79-16336),\n", + " 78277: Link(79-18461),\n", + " 78564: Link(79-21745),\n", + " 77094: Link(80-6184),\n", + " 77678: Link(80-12486),\n", + " 78859: Link(80-25011),\n", + " 77119: Link(81-6450),\n", + " 77169: Link(81-6920),\n", + " 77630: Link(81-12024),\n", + " 78299: Link(81-18775),\n", + " 77712: Link(82-12917),\n", + " 77778: Link(82-13513),\n", + " 77957: Link(82-15124),\n", + " 78970: Link(82-26148),\n", + " 77268: Link(83-7994),\n", + " 77498: Link(83-10776),\n", + " 78779: Link(83-24323),\n", + " 77202: Link(84-7296),\n", + " 77752: Link(84-13255),\n", + " 78482: Link(84-20888),\n", + " 77242: Link(85-7711),\n", + " 77259: Link(85-7859),\n", + " 78621: Link(85-22370),\n", + " 78680: Link(85-23088),\n", + " 77573: Link(86-11569),\n", + " 78340: Link(86-19327),\n", + " 78913: Link(86-25573),\n", + " 77396: Link(87-9526),\n", + " 77965: Link(87-15246),\n", + " 78409: Link(87-20048),\n", + " 78727: Link(87-23716),\n", + " 77273: Link(88-8112),\n", + " 77741: Link(88-13172),\n", + " 78183: Link(88-17468),\n", + " 78659: Link(88-22952),\n", + " 77044: Link(89-5605),\n", + " 77251: Link(89-7793),\n", + " 77757: Link(89-13317),\n", + " 77147: Link(90-6744),\n", + " 78154: Link(90-17069),\n", + " 78655: Link(90-22901),\n", + " 78805: Link(90-24526),\n", + " 77148: Link(91-6744),\n", + " 78561: Link(91-21691),\n", + " 78806: Link(91-24526),\n", + " 78914: Link(91-25573),\n", + " 77329: Link(92-8732),\n", + " 77347: Link(92-8921),\n", + " 78803: Link(92-24519),\n", + " 79127: Link(92-27866),\n", + " 76991: Link(93-5034),\n", + " 77304: Link(93-8459),\n", + " 77405: Link(93-9621),\n", + " 79037: Link(93-26817),\n", + " 76993: Link(94-5035),\n", + " 77450: Link(94-10213),\n", + " 77490: Link(94-10710),\n", + " 77973: Link(94-15321),\n", + " 76983: Link(95-4927),\n", + " 77330: Link(95-8732),\n", + " 77791: Link(95-13579),\n", + " 77331: Link(96-8732),\n", + " 77348: Link(96-8921),\n", + " 78903: Link(96-25468),\n", + " 76963: Link(97-4758),\n", + " 78219: Link(97-17911),\n", + " 78418: Link(97-20159),\n", + " 78704: Link(97-23345),\n", + " 77081: Link(98-6042),\n", + " 77529: Link(98-11132),\n", + " 78010: Link(98-15663),\n", + " 78541: Link(98-21529),\n", + " 77336: Link(99-8766),\n", + " 78078: Link(99-16323),\n", + " 78103: Link(99-16614),\n", + " 78122: Link(99-16784),\n", + " 77015: Link(100-5271),\n", + " 77795: Link(100-13626),\n", + " 78344: Link(100-19383),\n", + " 77656: Link(101-12307),\n", + " 77770: Link(101-13421),\n", + " 78097: Link(101-16510),\n", + " 78386: Link(101-19802),\n", + " 77657: Link(102-12307),\n", + " 78119: Link(102-16730),\n", + " 78262: Link(102-18285),\n", + " 77170: Link(103-6956),\n", + " 77518: Link(103-10998),\n", + " 78630: Link(103-22572),\n", + " 79112: Link(103-27683),\n", + " 77177: Link(104-7069),\n", + " 77591: Link(104-11786),\n", + " 77665: Link(104-12367),\n", + " 79144: Link(104-28069),\n", + " 77265: Link(105-7951),\n", + " 77523: Link(105-11061),\n", + " 78960: Link(105-26050),\n", + " 77123: Link(106-6479),\n", + " 77374: Link(106-9174),\n", + " 78631: Link(106-22572),\n", + " 78950: Link(106-25996),\n", + " 77009: Link(107-5204),\n", + " 77082: Link(107-6055),\n", + " 78558: Link(107-21686),\n", + " 78693: Link(107-23226),\n", + " 77524: Link(108-11061),\n", + " 78951: Link(108-25996),\n", + " 78980: Link(108-26253),\n", + " 78988: Link(108-26329),\n", + " 77544: Link(109-11290),\n", + " 77549: Link(109-11335),\n", + " 78345: Link(109-19383),\n", + " 78709: Link(109-23389),\n", + " 77156: Link(110-6822),\n", + " 78372: Link(110-19625),\n", + " 78852: Link(110-24991),\n", + " 78864: Link(110-25031),\n", + " 77594: Link(111-11817),\n", + " 78501: Link(111-21103),\n", + " 78559: Link(111-21686),\n", + " 77616: Link(112-11957),\n", + " 77681: Link(112-12531),\n", + " 78015: Link(112-15724),\n", + " 78773: Link(112-24277),\n", + " 77617: Link(113-11957),\n", + " 77866: Link(113-14343),\n", + " 78085: Link(113-16385),\n", + " 77034: Link(114-5530),\n", + " 77294: Link(114-8337),\n", + " 77800: Link(114-13726),\n", + " 78285: Link(114-18617),\n", + " 77151: Link(115-6797),\n", + " 77624: Link(115-11991),\n", + " 77801: Link(115-13726),\n", + " 77642: Link(116-12176),\n", + " 77867: Link(116-14343),\n", + " 78318: Link(116-19015),\n", + " 78696: Link(116-23244),\n", + " 77507: Link(117-10865),\n", + " 77682: Link(117-12531),\n", + " 77876: Link(117-14437),\n", + " 77662: Link(118-12357),\n", + " 78023: Link(118-15818),\n", + " 78149: Link(118-17025),\n", + " 78607: Link(118-22203),\n", + " 77341: Link(119-8836),\n", + " 77545: Link(119-11294),\n", + " 78356: Link(119-19473),\n", + " 78608: Link(119-22203),\n", + " 77546: Link(120-11294),\n", + " 79046: Link(120-26936),\n", + " 79058: Link(120-27083),\n", + " 79114: Link(120-27718),\n", + " 77979: Link(121-15377),\n", + " 78366: Link(121-19537),\n", + " 78457: Link(121-20628),\n", + " 79077: Link(121-27307),\n", + " 78131: Link(122-16916),\n", + " 78438: Link(122-20413),\n", + " 78613: Link(122-22266),\n", + " 78928: Link(122-25813),\n", + " 77980: Link(123-15377),\n", + " 78266: Link(123-18346),\n", + " 78470: Link(123-20778),\n", + " 77272: Link(124-8084),\n", + " 77902: Link(124-14675),\n", + " 77915: Link(124-14805),\n", + " 78293: Link(124-18731),\n", + " 77465: Link(125-10378),\n", + " 78502: Link(125-21103),\n", + " 78516: Link(125-21246),\n", + " 78654: Link(125-22893),\n", + " 78147: Link(126-17019),\n", + " 79159: Link(126-29711),\n", + " 77006: Link(127-5168),\n", + " 77797: Link(127-13662),\n", + " 78105: Link(128-16631),\n", + " 78126: Link(128-16832),\n", + " 78909: Link(128-25539),\n", + " 77070: Link(129-5921),\n", + " 78723: Link(129-23630),\n", + " 78789: Link(129-24379),\n", + " 78809: Link(129-24567),\n", + " 77214: Link(130-7444),\n", + " 78810: Link(130-24567),\n", + " 78874: Link(130-25170),\n", + " 77479: Link(131-10598),\n", + " 78517: Link(131-21246),\n", + " 78981: Link(131-26267),\n", + " 77659: Link(132-12351),\n", + " 78174: Link(132-17307),\n", + " 77917: Link(133-14815),\n", + " 78459: Link(133-20671),\n", + " 78626: Link(133-22482),\n", + " 78986: Link(134-26321),\n", + " 79022: Link(134-26663),\n", + " 77078: Link(135-6016),\n", + " 78987: Link(135-26321),\n", + " 79040: Link(135-26850),\n", + " 77079: Link(136-6016),\n", + " 77560: Link(136-11422),\n", + " 77990: Link(136-15470),\n", + " 78420: Link(137-20203),\n", + " 78742: Link(137-23878),\n", + " 76984: Link(138-4928),\n", + " 77089: Link(138-6117),\n", + " 78224: Link(138-17994),\n", + " 78622: Link(138-22432),\n", + " 77671: Link(139-12430),\n", + " 78524: Link(139-21340),\n", + " 78743: Link(139-23879),\n", + " 77808: Link(140-13779),\n", + " 77996: Link(140-15511),\n", + " 78173: Link(140-17294),\n", + " 78652: Link(140-22869),\n", + " 77534: Link(141-11179),\n", + " 77825: Link(141-13979),\n", + " 76974: Link(142-4820),\n", + " 77367: Link(142-9131),\n", + " 78688: Link(142-23182),\n", + " 78926: Link(142-25729),\n", + " 76975: Link(143-4820),\n", + " 77574: Link(143-11578),\n", + " 78361: Link(143-19512),\n", + " 78689: Link(143-23182),\n", + " 77351: Link(144-8952),\n", + " 77832: Link(144-14035),\n", + " 77916: Link(144-14805),\n", + " 78998: Link(144-26408),\n", + " 77885: Link(145-14496),\n", + " 78841: Link(145-24888),\n", + " 78952: Link(145-26009),\n", + " 79029: Link(145-26714),\n", + " 77508: Link(146-10865),\n", + " 77781: Link(146-13528),\n", + " 77886: Link(146-14496),\n", + " 78657: Link(146-22930),\n", + " 77563: Link(147-11450),\n", + " 78528: Link(147-21368),\n", + " 78700: Link(147-23296),\n", + " 78889: Link(147-25334),\n", + " 77782: Link(148-13528),\n", + " 78603: Link(148-22182),\n", + " 78890: Link(148-25334),\n", + " 77088: Link(149-6105),\n", + " 77320: Link(149-8638),\n", + " 77047: Link(150-5649),\n", + " 78048: Link(150-16113),\n", + " 78334: Link(150-19232),\n", + " 79054: Link(150-27062),\n", + " 76964: Link(151-4760),\n", + " 78604: Link(151-22182),\n", + " 78891: Link(151-25334),\n", + " 77302: Link(152-8443),\n", + " 77550: Link(152-11347),\n", + " 78774: Link(152-24277),\n", + " 76965: Link(153-4760),\n", + " 77048: Link(153-5649),\n", + " 78968: Link(153-26146),\n", + " 78114: Link(154-16690),\n", + " 78200: Link(154-17623),\n", + " 78279: Link(154-18523),\n", + " 79154: Link(154-28549),\n", + " 77154: Link(155-6821),\n", + " 77469: Link(155-10423),\n", + " 77787: Link(155-13562),\n", + " 78301: Link(155-18824),\n", + " 77004: Link(156-5145),\n", + " 77155: Link(156-6821),\n", + " 78973: Link(156-26171),\n", + " 77321: Link(157-8646),\n", + " 77443: Link(157-10132),\n", + " 78338: Link(157-19300),\n", + " 78989: Link(157-26348),\n", + " 77327: Link(158-8719),\n", + " 77444: Link(158-10132),\n", + " 78707: Link(158-23376),\n", + " 79033: Link(158-26751),\n", + " 77998: Link(159-15558),\n", + " 78287: Link(159-18682),\n", + " 78746: Link(159-23933),\n", + " 77435: Link(160-9941),\n", + " 77710: Link(160-12878),\n", + " 78317: Link(160-19014),\n", + " 78861: Link(160-25024),\n", + " 77338: Link(161-8788),\n", + " 77774: Link(161-13481),\n", + " 77938: Link(161-14947),\n", + " 77237: Link(162-7671),\n", + " 77240: Link(162-7708),\n", + " 77646: Link(162-12192),\n", + " 78211: Link(162-17763),\n", + " 77335: Link(163-8764),\n", + " 78439: Link(163-20426),\n", + " 78611: Link(163-22246),\n", + " 77432: Link(164-9920),\n", + " 77493: Link(164-10737),\n", + " 77643: Link(164-12182),\n", + " 78901: Link(164-25465),\n", + " 77149: Link(165-6752),\n", + " 78790: Link(165-24383),\n", + " 79135: Link(165-27991),\n", + " 77279: Link(166-8205),\n", + " 77914: Link(166-14779),\n", + " 78019: Link(166-15760),\n", + " 78791: Link(166-24383),\n", + " 77829: Link(167-14020),\n", + " 78327: Link(167-19163),\n", + " 78353: Link(167-19446),\n", + " 78617: Link(167-22302),\n", + " 77159: Link(168-6852),\n", + " 78419: Link(168-20183),\n", + " 78764: Link(168-24230),\n", + " 79136: Link(168-27991),\n", + " 77959: Link(169-15175),\n", + " 78240: Link(169-18138),\n", + " 78673: Link(169-23036),\n", + " 78902: Link(169-25465),\n", + " 77555: Link(170-11394),\n", + " 77707: Link(170-12825),\n", + " 78212: Link(170-17812),\n", + " 78042: Link(171-16034),\n", + " 79097: Link(171-27554),\n", + " 77687: Link(172-12591),\n", + " 78054: Link(172-16156),\n", + " 78749: Link(172-23960),\n", + " 77579: Link(173-11630),\n", + " 78712: Link(173-23429),\n", + " 78793: Link(173-24396),\n", + " 77750: Link(174-13244),\n", + " 77924: Link(174-14855),\n", + " 78271: Link(174-18368),\n", + " 79146: Link(174-28107),\n", + " 77382: Link(175-9323),\n", + " 77419: Link(175-9771),\n", + " 77813: Link(175-13848),\n", + " 78272: Link(175-18368),\n", + " 77253: Link(176-7810),\n", + " 77485: Link(176-10684),\n", + " 77509: Link(176-10876),\n", + " 78382: Link(176-19776),\n", + " 77254: Link(177-7810),\n", + " 77814: Link(177-13848),\n", + " 78383: Link(177-19776),\n", + " 78786: Link(177-24370),\n", + " 77141: Link(178-6696),\n", + " 77486: Link(178-10684),\n", + " 77531: Link(179-11134),\n", + " 77690: Link(179-12678),\n", + " 77964: Link(179-15230),\n", + " 77459: Link(180-10344),\n", + " 77934: Link(180-14929),\n", + " 77322: Link(181-8646),\n", + " 77538: Link(181-11206),\n", + " 78462: Link(181-20696),\n", + " 77452: Link(182-10269),\n", + " 77673: Link(182-12433),\n", + " 78233: Link(182-18071),\n", + " 78401: Link(182-19964),\n", + " 77016: Link(183-5274),\n", + " 77470: Link(183-10423),\n", + " 78186: Link(183-17490),\n", + " 77072: Link(184-5931),\n", + " 77764: Link(184-13384),\n", + " 77839: Link(184-14115),\n", + " 78115: Link(184-16690),\n", + " 77059: Link(185-5792),\n", + " 77639: Link(185-12153),\n", + " 77758: Link(185-13327),\n", + " 77663: Link(186-12357),\n", + " 78905: Link(186-25471),\n", + " 79050: Link(186-27020),\n", + " 77587: Link(187-11713),\n", + " 78045: Link(187-16052),\n", + " 78236: Link(187-18100),\n", + " 77060: Link(188-5792),\n", + " 77626: Link(188-11998),\n", + " 78156: Link(188-17084),\n", + " 79048: Link(188-26943),\n", + " 77314: Link(189-8563),\n", + " 77364: Link(189-9092),\n", + " 79036: Link(189-26814),\n", + " 77788: Link(190-13572),\n", + " 78297: Link(190-18774),\n", + " 78740: Link(190-23866),\n", + " 78823: Link(190-24652),\n", + " 77102: Link(191-6267),\n", + " 77145: Link(191-6731),\n", + " 77694: Link(191-12718),\n", + " 79063: Link(191-27116),\n", + " 77030: Link(192-5515),\n", + " 78520: Link(192-21291),\n", + " 78601: Link(192-22144),\n", + " 78858: Link(192-25008),\n", + " 77261: Link(193-7915),\n", + " 77354: Link(193-8964),\n", + " 77717: Link(193-12961),\n", + " 78781: Link(193-24336),\n", + " 77150: Link(194-6784),\n", + " 77880: Link(194-14463),\n", + " 78087: Link(194-16401),\n", + " 78394: Link(194-19919),\n", + " 77355: Link(195-8964),\n", + " 78234: Link(195-18071),\n", + " 78288: Link(195-18682),\n", + " 77223: Link(196-7513),\n", + " 77601: Link(196-11854),\n", + " 78218: Link(196-17910),\n", + " 79010: Link(196-26537),\n", + " 77224: Link(197-7513),\n", + " 77554: Link(197-11376),\n", + " 77720: Link(197-12985),\n", + " 79088: Link(197-27489),\n", + " 77376: Link(198-9201),\n", + " 77668: Link(198-12386),\n", + " 78643: Link(198-22716),\n", + " 79072: Link(198-27270),\n", + " 77417: Link(199-9732),\n", + " 77453: Link(199-10294),\n", + " 78429: Link(199-20315),\n", + " 79150: Link(199-28194),\n", + " 77606: Link(200-11873),\n", + " 77882: Link(200-14481),\n", + " 78043: Link(200-16051),\n", + " 78682: Link(200-23117),\n", + " 77658: Link(201-12350),\n", + " 78027: Link(201-15894),\n", + " 78402: Link(201-19975),\n", + " 78982: Link(201-26268),\n", + " 77246: Link(202-7728),\n", + " 77868: Link(202-14348),\n", + " 78584: Link(202-21919),\n", + " 78983: Link(202-26268),\n", + " 76960: Link(203-4757),\n", + " 77207: Link(203-7353),\n", + " 77879: Link(203-14455),\n", + " 77267: Link(204-7979),\n", + " 78721: Link(204-23617),\n", + " 78093: Link(205-16493),\n", + " 78598: Link(205-22074),\n", + " 78965: Link(205-26107),\n", + " 79061: Link(205-27114),\n", + " 77287: Link(206-8293),\n", + " 77349: Link(206-8924),\n", + " 78787: Link(206-24377),\n", + " 79062: Link(206-27114),\n", + " 77809: Link(207-13800),\n", + " 78425: Link(207-20277),\n", + " 78788: Link(207-24377),\n", + " 78862: Link(207-25024),\n", + " 77491: Link(208-10714),\n", + " 78107: Link(208-16657),\n", + " 77729: Link(209-13071),\n", + " 77810: Link(209-13800),\n", + " 77812: Link(209-13821),\n", + " 77339: Link(210-8801),\n", + " 77473: Link(210-10468),\n", + " 77943: Link(210-14978),\n", + " 77474: Link(211-10468),\n", + " 78044: Link(211-16051),\n", + " 78387: Link(211-19833),\n", + " 79012: Link(211-26572),\n", + " 77510: Link(212-10877),\n", + " 78024: Link(212-15853),\n", + " 78877: Link(212-25191),\n", + " 78977: Link(212-26226),\n", + " 77117: Link(213-6435),\n", + " 77135: Link(213-6654),\n", + " 78141: Link(213-16969),\n", + " 78755: Link(213-24051),\n", + " 76994: Link(214-5037),\n", + " 77569: Link(214-11536),\n", + " 78163: Link(214-17178),\n", + " 78574: Link(214-21834),\n", + " 77611: Link(215-11908),\n", + " 78145: Link(215-17015),\n", + " 78295: Link(215-18742),\n", + " 78590: Link(215-21994),\n", + " 78241: Link(216-18155),\n", + " 78921: Link(216-25624),\n", + " 79102: Link(216-27582),\n", + " 78146: Link(217-17015),\n", + " 78335: Link(217-19234),\n", + " 78651: Link(217-22848),\n", + " 78860: Link(217-25019),\n", + " 77478: Link(218-10535),\n", + " 77745: Link(218-13203),\n", + " 78503: Link(218-21121),\n", + " 78990: Link(218-26366),\n", + " 77853: Link(219-14257),\n", + " 78991: Link(219-26366),\n", + " 77854: Link(220-14257),\n", + " 78215: Link(220-17881),\n", + " 78792: Link(220-24393),\n", + " 78260: Link(221-18284),\n", + " 78302: Link(221-18833),\n", + " 77197: Link(222-7256),\n", + " 77683: Link(223-12535),\n", + " 77904: Link(223-14704),\n", + " 78796: Link(223-24432),\n", + " 79057: Link(223-27081),\n", + " 77561: Link(224-11428),\n", + " 77627: Link(224-12004),\n", + " 78554: Link(224-21661),\n", + " 78920: Link(224-25601),\n", + " 77021: Link(225-5373),\n", + " 77225: Link(225-7530),\n", + " 77575: Link(225-11587),\n", + " 78289: Link(225-18685),\n", + " 77227: Link(226-7590),\n", + " 77238: Link(226-7673),\n", + " 79084: Link(226-27413),\n", + " 77512: Link(227-10907),\n", + " 78633: Link(227-22616),\n", + " 77192: Link(228-7182),\n", + " 77789: Link(228-13572),\n", + " 78298: Link(228-18774),\n", + " 78596: Link(228-22047),\n", + " 77514: Link(229-10912),\n", + " 78821: Link(229-24638),\n", + " 78840: Link(229-24867),\n", + " 77386: Link(230-9444),\n", + " 78405: Link(230-20013),\n", + " 78906: Link(230-25471),\n", + " 77436: Link(231-9975),\n", + " 77462: Link(231-10358),\n", + " 78165: Link(231-17198),\n", + " 78924: Link(231-25709),\n", + " 77038: Link(232-5544),\n", + " 77366: Link(232-9116),\n", + " 77733: Link(232-13109),\n", + " 78620: Link(232-22330),\n", + " 77031: Link(233-5515),\n", + " 77906: Link(233-14723),\n", + " 77941: Link(233-14955),\n", + " 78002: Link(233-15596),\n", + " 78597: Link(234-22047),\n", + " 78711: Link(234-23403),\n", + " 77313: Link(235-8559),\n", + " 78414: Link(235-20113),\n", + " 78544: Link(235-21571),\n", + " 78588: Link(235-21981),\n", + " 77290: Link(236-8314),\n", + " 77704: Link(236-12806),\n", + " 78047: Link(236-16108),\n", + " 77061: Link(237-5821),\n", + " 77922: Link(237-14852),\n", + " 78092: Link(237-16491),\n", + " 78935: Link(237-25907),\n", + " 77923: Link(238-14852),\n", + " 77968: Link(238-15259),\n", + " 78694: Link(238-23238),\n", + " 79110: Link(238-27651),\n", + " 77220: Link(239-7490),\n", + " 78249: Link(239-18240),\n", + " 78668: Link(239-22987),\n", + " 79013: Link(239-26586),\n", + " 77040: Link(240-5547),\n", + " 77896: Link(240-14620),\n", + " 78051: Link(240-16134),\n", + " 78250: Link(241-18248),\n", + " 78307: Link(241-18862),\n", + " 78910: Link(241-25550),\n", + " 79129: Link(241-27869),\n", + " 78038: Link(242-16008),\n", + " 78397: Link(242-19945),\n", + " 78491: Link(242-20967),\n", + " 77723: Link(243-13034),\n", + " 78089: Link(243-16436),\n", + " 78421: Link(243-20211),\n", + " 79027: Link(243-26684),\n", + " 76970: Link(244-4786),\n", + " 77411: Link(244-9679),\n", + " 78453: Link(244-20552),\n", + " 76971: Link(245-4786),\n", + " 78563: Link(245-21735),\n", + " 77785: Link(246-13552),\n", + " 78737: Link(246-23790),\n", + " 78899: Link(246-25441),\n", + " 77526: Link(247-11113),\n", + " 77951: Link(247-15022),\n", + " 78164: Link(247-17178),\n", + " 77527: Link(248-11113),\n", + " 77949: Link(248-15015),\n", + " 78715: Link(248-23458),\n", + " 77186: Link(249-7124),\n", + " 77218: Link(249-7476),\n", + " 77239: Link(249-7700),\n", + " 78492: Link(249-20978),\n", + " 77219: Link(250-7476),\n", + " 78127: Link(250-16837),\n", + " 78261: Link(250-18284),\n", + " 78133: Link(251-16918),\n", + " 78602: Link(251-22166),\n", + " 78831: Link(251-24784),\n", + " 77319: Link(252-8635),\n", + " 77652: Link(252-12260),\n", + " 78869: Link(252-25142),\n", + " 78974: Link(252-26207),\n", + " 78134: Link(253-16918),\n", + " 78480: Link(253-20871),\n", + " 78634: Link(253-22625),\n", + " 77991: Link(254-15483),\n", + " 78294: Link(254-18741),\n", + " 78955: Link(254-26023),\n", + " 77306: Link(255-8484),\n", + " 77992: Link(255-15483),\n", + " 78012: Link(255-15695),\n", + " 78452: Link(255-20549),\n", + " 77466: Link(256-10393),\n", + " 78498: Link(256-21052),\n", + " 78525: Link(256-21351),\n", + " 78947: Link(256-25987),\n", + " 78499: Link(257-21052),\n", + " 78875: Link(257-25178),\n", + " 78948: Link(257-25987),\n", + " 79016: Link(257-26599),\n", + " 77489: Link(258-10696),\n", + " 78534: Link(258-21460),\n", + " 78573: Link(258-21831),\n", + " 79017: Link(258-26599),\n", + " 77669: Link(259-12405),\n", + " 78493: Link(259-20988),\n", + " 78975: Link(259-26217),\n", + " 77307: Link(260-8484),\n", + " 77664: Link(260-12361),\n", + " 77875: Link(260-14397),\n", + " 78303: Link(260-18838),\n", + " 76961: Link(261-4757),\n", + " 77066: Link(261-5851),\n", + " 77981: Link(261-15399),\n", + " 78084: Link(261-16378),\n", + " 77392: Link(262-9518),\n", + " 78063: Link(262-16221),\n", + " 78319: Link(262-19025),\n", + " 77305: Link(263-8462),\n", + " 77383: Link(263-9351),\n", + " 78380: Link(263-19744),\n", + " 78705: Link(263-23365),\n", + " 77206: Link(264-7345),\n", + " 77334: Link(264-8754),\n", + " 77693: Link(264-12707),\n", + " 78956: Link(264-26024),\n", + " 78521: Link(265-21301),\n", + " 78826: Link(265-24715),\n", + " 77926: Link(266-14904),\n", + " 78016: Link(266-15739),\n", + " 79078: Link(266-27317),\n", + " 78083: Link(267-16354),\n", + " 78575: Link(267-21841),\n", + " 78827: Link(267-24715),\n", + " 78942: Link(267-25962),\n", + " 77041: Link(268-5547),\n", + " 77208: Link(268-7364),\n", + " 78642: Link(268-22714),\n", + " 78717: Link(268-23478),\n", + " 77216: Link(269-7457),\n", + " 78747: Link(269-23949),\n", + " 78937: Link(269-25923),\n", + " 79014: Link(269-26586),\n", + " 77409: Link(270-9665),\n", + " 77607: Link(270-11876),\n", + " 78375: Link(270-19652),\n", + " 78648: Link(270-22791),\n", + " 77291: Link(271-8314),\n", + " 78615: Link(271-22274),\n", + " 77022: Link(272-5409),\n", + " 77198: Link(272-7259),\n", + " 77256: Link(272-7817),\n", + " 77389: Link(272-9511),\n", + " 78201: Link(273-17627),\n", + " 78508: Link(273-21146),\n", + " 78616: Link(273-22274),\n", + " 78640: Link(273-22678),\n", + " 77221: Link(274-7490),\n", + " 78313: Link(274-18927),\n", + " 77375: Link(275-9200),\n", + " 78243: Link(275-18176),\n", + " 79130: Link(275-27869),\n", + " 77536: Link(276-11193),\n", + " 78152: Link(276-17060),\n", + " 78703: Link(276-23317),\n", + " 78985: Link(276-26297),\n", + " 77401: Link(277-9579),\n", + " 77796: Link(277-13653),\n", + " 78020: Link(277-15760),\n", + " 77182: Link(278-7097),\n", + " 77199: Link(278-7259),\n", + " 77410: Link(278-9665),\n", + " 77049: Link(279-5651),\n", + " 77231: Link(279-7647),\n", + " 78553: Link(279-21646),\n", + " 79148: Link(279-28190),\n", + " 77500: Link(280-10798),\n", + " 77537: Link(280-11193),\n", + " 77614: Link(280-11951),\n", + " 78867: Link(280-25131),\n", + " 77615: Link(281-11951),\n", + " 78104: Link(281-16621),\n", + " 78153: Link(281-17060),\n", + " 79149: Link(281-28190),\n", + " 77427: Link(282-9873),\n", + " 77471: Link(282-10446),\n", + " 78057: Link(282-16186),\n", + " 78510: Link(282-21173),\n", + " 76982: Link(283-4904),\n", + " 77257: Link(283-7838),\n", + " 78046: Link(283-16060),\n", + " 78169: Link(283-17269),\n", + " 77019: Link(284-5323),\n", + " 77458: Link(284-10343),\n", + " 78822: Link(284-24651),\n", + " 77236: Link(285-7670),\n", + " 77274: Link(285-8131),\n", + " 77761: Link(285-13342),\n", + " 78497: Link(285-21024),\n", + " 77158: Link(286-6832),\n", + " 78193: Link(286-17537),\n", + " 78275: Link(286-18454),\n", + " 78883: Link(286-25257),\n", + " 77476: Link(287-10491),\n", + " 77552: Link(287-11371),\n", + " 78106: Link(287-16654),\n", + " ...}" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transit_link_dict" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "46fc14ac", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "attributes = transit_network.get_attribute_values()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "5f0a422b", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'function' object has no attribute 'names'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[42], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mattributes\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnames\u001b[49m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'function' object has no attribute 'names'" + ] + } + ], + "source": [ + "attributes.names" + ] + }, + { + "cell_type": "markdown", + "id": "dd0c214f", + "metadata": {}, + "source": [ + "### Export Network as shapefiles" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bcfd7b45", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "### Export network as shapefiles\n", + "_MODELLER = _m.Modeller()\n", + "network_to_shapefile = _MODELLER.tool(\"inro.emme.data.network.export_network_as_shapefile\")" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "f88145f1", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'field_mapping': {'nodes': OrderedDict([('ID', 'ID'),\n", + " ('X', 'X'),\n", + " ('Y', 'Y'),\n", + " ('DATA1', 'DATA1'),\n", + " ('DATA2', 'DATA2'),\n", + " ('DATA3', 'DATA3'),\n", + " ('ISZONE', 'ISZONE'),\n", + " ('ISINTERSEC', 'ISINTERSEC'),\n", + " ('LABEL', 'LABEL'),\n", + " ('INBOAI', 'INBOAI'),\n", + " ('FIALII', 'FIALII'),\n", + " ('@bike_node', '@bike_node'),\n", + " ('@drive_node', '@drive_nod'),\n", + " ('@farezone', '@farezone'),\n", + " ('@hdw_fraction', '@hdw_fract'),\n", + " ('@maz_id', '@maz_id'),\n", + " ('@rail_node', '@rail_node'),\n", + " ('@stop_tap_id', '@stop_tap_'),\n", + " ('@tap_id', '@tap_id'),\n", + " ('@taz_id', '@taz_id'),\n", + " ('@wait_pfactor', '@wait_pfac'),\n", + " ('@walk_node', '@walk_node'),\n", + " ('@xboard_nodepen', '@xboard_no'),\n", + " ('#node_county', '#node_coun'),\n", + " ('#node_id', '#node_id'),\n", + " ('#node_type', '#node_type'),\n", + " ('#osm_node_id', '#osm_node_'),\n", + " ('#zone_id', '#zone_id')]),\n", + " 'links': OrderedDict([('ID', 'ID'),\n", + " ('INODE', 'INODE'),\n", + " ('JNODE', 'JNODE'),\n", + " ('LENGTH', 'LENGTH'),\n", + " ('TYPE', 'TYPE'),\n", + " ('MODES', 'MODES'),\n", + " ('LANES', 'LANES'),\n", + " ('VDF', 'VDF'),\n", + " ('DATA1', 'DATA1'),\n", + " ('DATA2', 'DATA2'),\n", + " ('DATA3', 'DATA3'),\n", + " ('VOLAX', 'VOLAX'),\n", + " ('@area_type', '@area_type'),\n", + " ('@assignable', '@assignabl'),\n", + " ('@aux_vol_knr_trn_wlk', '@aux_vol_k'),\n", + " ('@aux_vol_pnr_trn_wlk', '@aux_vol_p'),\n", + " ('@aux_vol_wlk_trn_knr', '@aux_vol_w'),\n", + " ('@aux_vol_wlk_trn_pnr', '@aux_vol_0'),\n", + " ('@aux_vol_wlk_trn_wlk', '@aux_vol_1'),\n", + " ('@bike_link', '@bike_link'),\n", + " ('@bus_only', '@bus_only'),\n", + " ('@capclass', '@capclass'),\n", + " ('@drive_link', '@drive_lin'),\n", + " ('@drive_toll', '@drive_tol'),\n", + " ('@free_flow_speed', '@free_flow'),\n", + " ('@free_flow_time', '@free_flo0'),\n", + " ('@ft', '@ft'),\n", + " ('@lanes', '@lanes'),\n", + " ('@managed', '@managed'),\n", + " ('@rail_link', '@rail_link'),\n", + " ('@segment_id', '@segment_i'),\n", + " ('@tollbooth', '@tollbooth'),\n", + " ('@tollseg', '@tollseg'),\n", + " ('@transit', '@transit'),\n", + " ('@trantime', '@trantime'),\n", + " ('@useclass', '@useclass'),\n", + " ('@walk_link', '@walk_link'),\n", + " ('#a_node', '#a_node'),\n", + " ('#b_node', '#b_node'),\n", + " ('#cntype', '#cntype'),\n", + " ('#link_county', '#link_coun'),\n", + " ('#link_id', '#link_id'),\n", + " ('#shstgeometryid', '#shstgeome')]),\n", + " 'turns': {},\n", + " 'transit_lines': OrderedDict([('ID', 'ID'),\n", + " ('MODE', 'MODE'),\n", + " ('VEHICLE', 'VEHICLE'),\n", + " ('HEADWAY', 'HEADWAY'),\n", + " ('SPEED', 'SPEED'),\n", + " ('DESC', 'DESC'),\n", + " ('NUM_SEGS', 'NUM_SEGS'),\n", + " ('LAYOVER_TI', 'LAYOVER_TI'),\n", + " ('DATA1', 'DATA1'),\n", + " ('DATA2', 'DATA2'),\n", + " ('DATA3', 'DATA3'),\n", + " ('@iboard_penalty', '@iboard_pe'),\n", + " ('@invehicle_factor', '@invehicle'),\n", + " ('@orig_hdw', '@orig_hdw'),\n", + " ('@xboard_penalty', '@xboard_pe'),\n", + " ('#description', '#descripti'),\n", + " ('#faresystem', '#faresyste'),\n", + " ('#line_haul_name', '#line_haul'),\n", + " ('#mode', '#mode'),\n", + " ('#short_name', '#short_nam'),\n", + " ('#src_mode', '#src_mode'),\n", + " ('#src_veh', '#src_veh'),\n", + " ('#time_period', '#time_peri'),\n", + " ('#vehtype', '#vehtype')]),\n", + " 'transit_segments': OrderedDict([('SEG_ID', 'SEG_ID'),\n", + " ('LINE_ID', 'LINE_ID'),\n", + " ('SEG_NUM', 'SEG_NUM'),\n", + " ('INODE', 'INODE'),\n", + " ('JNODE', 'JNODE'),\n", + " ('DWELL_TIME', 'DWELL_TIME'),\n", + " ('TTF', 'TTF'),\n", + " ('DWT_IS_FAC', 'DWT_IS_FAC'),\n", + " ('CAN_ALIGHT', 'CAN_ALIGHT'),\n", + " ('CAN_BOARD', 'CAN_BOARD'),\n", + " ('DATA1', 'DATA1'),\n", + " ('DATA2', 'DATA2'),\n", + " ('DATA3', 'DATA3'),\n", + " ('VOLTR', 'VOLTR'),\n", + " ('TIMTR', 'TIMTR'),\n", + " ('BOARD', 'BOARD'),\n", + " ('@aboard_knr_trn_wlk', '@aboard_kn'),\n", + " ('@aboard_pnr_trn_wlk', '@aboard_pn'),\n", + " ('@aboard_wlk_trn_knr', '@aboard_wl'),\n", + " ('@aboard_wlk_trn_pnr', '@aboard_w0'),\n", + " ('@aboard_wlk_trn_wlk', '@aboard_w1'),\n", + " ('@base_timtr', '@base_timt'),\n", + " ('@board_cost', '@board_cos'),\n", + " ('@ccost', '@ccost'),\n", + " ('@dboard_knr_trn_wlk', '@dboard_kn'),\n", + " ('@dboard_pnr_trn_wlk', '@dboard_pn'),\n", + " ('@dboard_wlk_trn_knr', '@dboard_wl'),\n", + " ('@dboard_wlk_trn_pnr', '@dboard_w0'),\n", + " ('@dboard_wlk_trn_wlk', '@dboard_w1'),\n", + " ('@from_level_1', '@from_leve'),\n", + " ('@from_level_2', '@from_lev0'),\n", + " ('@from_level_3', '@from_lev1'),\n", + " ('@iboard_knr_trn_wlk', '@iboard_kn'),\n", + " ('@iboard_pnr_trn_wlk', '@iboard_pn'),\n", + " ('@iboard_wlk_trn_knr', '@iboard_wl'),\n", + " ('@iboard_wlk_trn_pnr', '@iboard_w0'),\n", + " ('@iboard_wlk_trn_wlk', '@iboard_w1'),\n", + " ('@invehicle_cost', '@invehicle'),\n", + " ('@nntime', '@nntime'),\n", + " ('@schedule_time', '@schedule_'),\n", + " ('@trantime_seg', '@trantime_'),\n", + " ('#stop_name', '#stop_name')])},\n", + " 'num_nodes_exported': 0,\n", + " 'num_links_exported': 0,\n", + " 'num_turns_exported': 0,\n", + " 'num_transit_lines_exported': 1252,\n", + " 'num_transit_segments_exported': 228921,\n", + " 'values_truncated': 12151,\n", + " 'NaNs_exported': 0}" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Output transit shapefile\n", + "for i in range(11,16):\n", + " scenario = transit_bank.scenario(i)\n", + " network_to_shapefile(\n", + " export_path = \"../../output_summaries/Scenario_{i}\",\n", + " scenario = scenario,\n", + " transit_shapes = 'LINES_AND_SEGMENTS',\n", + " selection = {\n", + " \"link\":'none',\n", + " \"node\":'none',\n", + " \"turn\": 'none',\n", + " 'transit_line': 'all'\n", + " }\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "77d9c95c", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing scenario 11\n", + "Processing scenario 12\n", + "Processing scenario 13\n", + "Processing scenario 14\n", + "Processing scenario 15\n" + ] + } + ], + "source": [ + "# Output hwy shapefile\n", + "for i in range(11,16):\n", + " print(f'Processing scenario {i}')\n", + " scenario = highway_bank.scenario(i)\n", + " network_to_shapefile(\n", + " export_path = f\"../../output_summaries/Scenario_{i}\",\n", + " scenario = scenario,\n", + " selection = {\n", + " \"link\":'all',\n", + " \"node\":'all',\n", + " \"turn\": 'all',\n", + " 'transit_line': 'none'\n", + " }\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "307b3f46", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scenario.has_traffic_results" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "7f11b082", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [ + "highway_bank = Emmebank('../Database_highway/emmebank')\n", + "hwy_scenario = highway_bank.scenario(12)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "5dcac564", + "metadata": { + "show_input": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hwy_scenario.has_traffic_results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33e46a55", + "metadata": { + "show_input": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + }, + "modeller": { + "desktop_app_port": "4242" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tm2py/setup_model/setup.py b/tm2py/setup_model/setup.py index e5633173..52b85a80 100644 --- a/tm2py/setup_model/setup.py +++ b/tm2py/setup_model/setup.py @@ -447,10 +447,6 @@ def _copy_emme_project_and_database(self): Copy EMME project from template project and then copy the emme networks databases based on the EMME version found in the sys.path. """ - - - python_path = pathlib.Path(sys.executable).resolve() - # copy template emme project self._copy_folder( self.setup_config.EMME_TEMPLATE_PROJECT_DIR, @@ -470,20 +466,9 @@ def _copy_emme_project_and_database(self): self.logger.error(error_str) raise ValueError(error_str) - EMME_VERSION = part.replace(" ", "_") - self.logger.info(f"Found EMME version in Python path: {EMME_VERSION}") - break - - # simplified fallback: just look for any EMME* folder - if not EMME_VERSION: - fallback_base = pathlib.Path(r"C:\Program Files\Bentley\OpenPaths") - if fallback_base.exists(): - for candidate in sorted(fallback_base.glob("EMME*"), reverse=True): - # take the first match you find - EMME_VERSION = candidate.name.replace(" ", "_") - self.logger.info(f"Falling back to OpenPaths install: {EMME_VERSION}") - break - + EMME_VERSION = None + for part in emme_path.parts: + if part.startswith("EMME"): EMME_VERSION = part.replace(" ","_") # replace spaces with underscores self.logger.info(f"Found EMME version in emme_path: {EMME_VERSION}") break @@ -500,38 +485,24 @@ def _copy_emme_project_and_database(self): 'active_north': 'emme_maz_active_modes_network_subregion_north', 'active_south': 'emme_maz_active_modes_network_subregion_south' } - for network_type in DATABASE_TO_SOURCE.keys(): - source_file = ( - self.setup_config.INPUT_EMME_NETWORK_DIR - / f"Database_{network_type}_{EMME_VERSION}.zip" - ) + source_file = self.setup_config.INPUT_EMME_NETWORK_DIR / f"Database_{network_type}_{EMME_VERSION}.zip" dest_dir = self.model_dir / "emme_project" / f"Database_{network_type}" - - # make sure the parent folder exists - dest_dir.parent.mkdir(parents=True, exist_ok=True) - if source_file.exists(): - # only remove if it was there - if dest_dir.exists(): - shutil.rmtree(dest_dir) - # unzip into the parent; this will recreate dest_dir + # remove what was there before + shutil.rmtree(dest_dir) + # unzip the EMME version of the ntework with zipfile.ZipFile(source_file, 'r') as zf: zf.extractall(dest_dir.parent) self.logger.info(f"Unzipped {source_file} to {dest_dir}") - + + # otherwise, copy folder else: - # copy into a fresh folder - # ensure dest_dir is there so _copy_folder won't fail - dest_dir.mkdir(parents=True, exist_ok=True) self._copy_folder( - self.setup_config.INPUT_EMME_NETWORK_DIR - / DATABASE_TO_SOURCE[network_type] - / "Database", + self.setup_config.INPUT_EMME_NETWORK_DIR / DATABASE_TO_SOURCE[network_type] / "Database", dest_dir ) - def _replace_in_file(self, filepath: pathlib.Path, regex_dict: dict[str, str]): """ Copies `filepath` to `filepath.original`