{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n\n# Public transport assignment with skimming\n\nIn this example, we build on the transit assignment example and add skimming to it.\n\nWe use data from Coquimbo, a city in La Serena Metropolitan Area in Chile.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        ".. admonition:: References\n\n  WE HIGHLY RECOMMEND YOU READ THE DOCUMENTATION ON SKIMMING BEFORE PROCEEDING\n\n  * :doc:`../../public_transport`\n\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        ".. seealso::\n    Several functions, methods, classes and modules are used in this example:\n\n    * :func:`aequilibrae.transit.Transit`\n    * :func:`aequilibrae.transit.TransitGraphBuilder`\n    * :func:`aequilibrae.paths.TransitClass`\n    * :func:`aequilibrae.paths.TransitAssignment`\n    * :func:`aequilibrae.matrix.AequilibraeMatrix`\n\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Imports for example construction\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "from os.path import join\nfrom tempfile import gettempdir\nfrom uuid import uuid4\n\nimport numpy as np\n\nfrom aequilibrae.matrix import AequilibraeMatrix\nfrom aequilibrae.paths import TransitAssignment, TransitClass\nfrom aequilibrae.project.database_connection import database_connection\nfrom aequilibrae.transit import Transit\nfrom aequilibrae.transit.transit_graph_builder import TransitGraphBuilder\nfrom aequilibrae.utils.create_example import create_example"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Let's create an empty project on an arbitrary folder.\nfldr = join(gettempdir(), uuid4().hex)\n\nproject = create_example(fldr, \"coquimbo\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Let's create our ``Transit`` object.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "data = Transit(project)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Graph building\nLet's build the transit network. We'll disable ``outer_stop_transfers`` and ``walking_edges``\nbecause Coquimbo doesn't have any parent stations.\n\nFor the OD connections we'll use the ``overlapping_regions`` method and create some accurate line geometry later.\nCreating the graph should only take a moment. By default zoning information is pulled from the project network.\nIf you have your own zoning information add it using ``graph.add_zones(zones)`` then ``graph.create_graph()``.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "graph = data.create_graph(\n    with_outer_stop_transfers=False,\n    with_walking_edges=False,\n    blocking_centroid_flows=False,\n    connector_method=\"overlapping_regions\"\n)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Connector project matching\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "project.network.build_graphs()\ngraph.create_line_geometry(method=\"connector project match\", graph=\"c\")\ndata.save_graphs()\ndata.load()\n\n# Reading back into AequilibraE\npt_con = database_connection(\"transit\")\ngraph_db = TransitGraphBuilder.from_db(pt_con, project.network.periods.default_period.period_id)\ngraph_db.vertices.drop(columns=\"geometry\")\n\n# To perform an assignment we need to convert the graph builder into a graph.\ntransit_graph = graph_db.to_transit_graph()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Mock demand matrix\nzones = len(transit_graph.centroids)\nmat = AequilibraeMatrix()\nmat.create_empty(zones=zones, matrix_names=['pt'], memory_only=True)\nmat.index = transit_graph.centroids[:]\nmat.matrices[:, :, 0] = np.full((zones, zones), 1.0)\nmat.computational_view()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Hyperpath generation/assignment\nWe'll create a ``TransitAssignment`` object as well as a ``TransitClass``.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Create the assignment class\nassigclass = TransitClass(name=\"pt\", graph=transit_graph, matrix=mat)\n\nassig = TransitAssignment()\n\nassig.add_class(assigclass)\n\n# Set assignment\nassig.set_time_field(\"trav_time\")\nassig.set_frequency_field(\"freq\")\nassig.set_skimming_fields([\"trav_time\", \"boardings\", \"freq\"])\nassig.set_algorithm(\"os\")\nassigclass.set_demand_matrix_core(\"pt\")\n\n# Perform the assignment for the transit classes added\nassig.execute()\n\n# We can use the get_skim_results() method to retrieve the skims\nassig.get_skim_results()[\"pt\"].matrix[\"boardings\"].sum()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Saving results\nWe'll be saving the skimming results.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "assig.save_results(table_name='hyperpath example')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Wrapping up\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "project.close()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "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.10.18"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}