Skip to main content
`Ctrl`+`K`

Note

Go to the end to download the full example code.

# Running IPF without an AequilibraE model

In this example, we show you how to use AequilibraE’s IPF function without a model. This is a complement to the application in Forecasting.

Let’s consider that you have an OD-matrix, the future production and future attraction values.

How would your trip distribution matrix using IPF look like?

The data used in this example comes from Table 5.6 in Ortúzar & Willumsen (2011).

References

- AequilibraE Matrix

- Validation & Benchmarking

See also

Several functions, methods, classes and modules are used in this example:

- `aequilibrae.matrix.AequilibraeMatrix()`

- `aequilibrae.distribution.Ipf()`

    # Imports
    from os.path import join
    from tempfile import gettempdir

    import numpy as np
    import pandas as pd

    from aequilibrae.distribution import Ipf
    from aequilibrae.matrix import AequilibraeMatrix

    folder = gettempdir()

    matrix = np.array([[5, 50, 100, 200], [50, 5, 100, 300],
                       [50, 100, 5, 100], [100, 200, 250, 20]], dtype="float64")
    future_prod = np.array([400, 460, 400, 702], dtype="float64")
    future_attr = np.array([260, 400, 500, 802], dtype="float64")

    num_zones = matrix.shape[0]

    mtx = AequilibraeMatrix()
    mtx.create_empty(file_name=join(folder, "matrix.aem"), zones=num_zones)
    mtx.index[:] = np.arange(1, num_zones + 1)[:]
    mtx.matrices[:, :, 0] = matrix[:]
    mtx.computational_view()

    args = {
        "entries": mtx.index.shape[0],
        "field_names": ["productions", "attractions"],
        "data_types": [np.float64, np.float64],
        "file_path": join(folder, "vectors.aem"),
    }

    vectors = pd.DataFrame({"productions": future_prod, "attractions":future_attr}, index=mtx.index)

    args = {
        "matrix": mtx,
        "vectors": vectors,
        "row_field": "productions",
        "column_field": "attractions",
        "nan_as_zero": True,
    }
    fratar = Ipf(**args)
    fratar.fit()

    fratar.output.matrix_view

    array([[  5.19523253,  43.60117896,  97.1907419 , 254.02026689],
           [ 44.70942645,   3.75225496,  83.64095928, 327.90930057],
           [ 76.67583276, 128.70094592,   7.17213428, 187.45277887],
           [133.41950826, 223.94562016, 311.99616454,  32.61765367]])

    for line in fratar.report:
        print(line)

      #####    IPF computation    #####

    Target convergence criteria: 0.0001
    Maximum iterations: 5000

    Rows/columns: 4
    Total of seed matrix:                   1,635.0000
    Total of target vectors:                1,962.0000

    Iteration,   Convergence
    7   ,   0.0000902085

    Running time: 0.001s

Total running time of the script: (0 minutes 0.044 seconds)

Gallery generated by Sphinx-Gallery