Over the past years, EMME/2 macros for solving various types of
problems have been developed at the EMME/2 Support Center.
Most often, these macros were written as a direct result of an
exchange with an EMME/2 user asking whether this or that problem could be
solved efficiently with EMME/2. Our policy has always been to
make such macros freely available to all EMME/2 users. In the
beginning, they were included on INRO's famous SHARE diskettes,
now they can be downloaded directly via Internet from the
section of our web site (
The use of these macros is twofold: First and foremost, they can, of course, be used to perform the task they were written for. But secondly, and probably as important for those EMME/2 users who write their own macros, they may also serve as ``real-life'' examples illustrating the various macro writing techniques.
As several new macros have been added to our collection during the last year, we thought that it might be interesting to list an inventory in EMME/2 News. Besides giving a short description on the task each macro performs, the inventory also includes technical notes on the macro writing techniques used. The latter may be of interest to EMME/2 macro writers, as the described techniques are by no means limited to the particular application. For a more structured introduction to the various macro writing techniques, a tutorial for EMME/2 macro writing, including many practical exercises, is available for downloading at our web site.
Here is the list of all macros that are currently available from the EMME/2 Support Center:
|Accumulates boardings and alightings along the stops of a transit line to produce segment volumes.
put(get()) to propagate information from one expression
evaluation to the next.
|This is a small macro containing only a network calculator expression which computes turning angle of a turn I-J-K. The result of the expression is the turning angle in degrees: =-180 for U-turns, -180< <0 for left turns, =0 for straight-through and 0< <180 for right turns.
Just basic trigonometry and some sub-expression optimization using the
|A macro to perform 3-dimensional balancing based on group-to-group totals. Unlike the 3-dimensional balancing available in module 3.22, the 3rd dimension totals are not given as an explicit list, but correspond to the group-to-group totals of an aggregate matrix and there is no explicit limitation of the number of 3rd dimension constraints.
|Uses matrix calculator 3.21 to implement a 3.22-type balancing procedure. Note the handling of the flexible file naming and the operating system specific external commands.
|Performs 2-dimensional matrix balancing in the case where several different production types are given (up to 4). For each production type a production vector and a friction matrix is specified. This macro can be used for doubly constrained demand models with stratified multiple productions and unstratified single attractions.
|Uses matrix calculator 3.21 to implement a 3.22-type balancing procedure. Could be easily extended to more than 4 production types.
|Bellman's shortest path algorithm implemented using module 2.41. It computes the shortest distances (based on an arbitrary link distance measure) from the root node to all other nodes by iteratively solving the Bellman equation. Useful for didactical purposes, and also for various location type problems where node-to-node distances are needed.
|Note the use of a scalar for detecting the termination of the algorithm.
|Auto demand matrix adjustment procedure based on the gradient method. This macro iteratively adjusts an auto demand matrix in order to improve the fit between a set of observed link counts and the corresponding assigned auto volumes.
t6 are used for easy
customization of the macro regarding submatrix selection, type of
assignment and count post specific weights.
|Transit demand matrix adjustment procedure based on the gradient method. This macro iteratively adjusts a transit demand matrix in order to improve the fit between a set of observed transit segment counts and the corresponding assigned transit volumes.
|A nice future extension to this macro would be to allow for total link counts as alternative to segment counts.
|Small macro to check for errors during execution of another macro. The macro takes as an argument another macro (plus corresponding parameters, if any). It executes the specified macro and returns the total number of errors (both fatal errors and warnings) which occurred during the execution. Especially useful for detecting warnings (e.g. batch input errors) which might otherwise remain undetected.
|A nice little example of a ``wrapper'' macro, i.e. a macro which does its job by calling another macro as specified in the parameters along with some pre- and post-processing.
Extract 1st leg impedance matrix or 2nd leg impedance matrix from a given total impedance and an intermediate zone matrix .
See also macro
for the corresponding operation on
|Uses some rather tricky convolutions to obtain the desired results efficiently.
|Multiple linear regression on arbitrary matrix data. The regression can contain 4 independent variables (or 3 variables plus a constant). The variables can be specified as arbitrary matrices or matrix expressions. The output consists of the regression coefficients, t-statistics, SST, SSE, and .
A good example how
put(get()) constructs can be used to compute
several side results (in this case the entire matrix X'X) with just one
single expression evaluation. This saves a lot of matrix I/O compared with the
|This macro implement a logit type intermediate destination choice model for mixed mode trips (e.g. Park+Ride or Kiss+Ride) which computes intermediate demand matrices for the first and the second trip leg. No explicit capacities at intermediate destinations are taken into account.
|This macro implements a full logit model efficiently, essentially by using convolutions to perform matrix multiplications.
|Implementation of German air pollution model MLuS-92. This is a rather coarse model based on lookup tables which was developed in 1992 by the German "Forschungsgesellschaft für Strassen- und Verkehrswesen".
Multi-dimensional lookup tables are implemented by mixing the
use of the
get()/put() stack with macro conditionals
|Macro which compares two scenarios and reports differences in network topology, i.e. nodes, links and/or transit lines which are in one scenario but not in the other. Optionally, the macro can also compare the values of specified numerical attributes.
|This macro makes extensive use of temporary attributes in network calculator.
|Macro for generating arbitrary network histograms. It supports numerical output on screen or into result file, as well as generating a plot of the histogram using module 4.13. The term histogram is used here for forming sums of an arbitrary network expression by any kind of classification.
Macro uses the recently introduced intrinsic
puti() to calculate
histogram with one single expression. Extensive use of fast macros
loops and floating point registers.
|Multiple linear regression on any network data. The regression can contain 4 independent variables (or 3 variables plus a constant). The variables can be specified as any kind of network attributes or expressions. The output consists of the regression coefficients, t-statistics, SST, SSE, and .
Based on the same expression ``engine'' as
Note how the linear equation is solved explicitly by
using Cramer's rule.
|Generic macro to efficiently compute opposing volumes on turns based on turning angles. For each turn, this macro classifies the other turns at the same intersection according to their relative origin (rear, right, left, front) and destination (front, right, left, rear). The opposing flow of the turn is then computed using a user specified 4x4 coefficient matrix. This coefficient matrix can easily be customized to special situations and priority schemes. The computation for all intersection of the appropriate type are carried out in parallel.
|This is one of the more complex macros. Among many other things, it shows nicely how to ``climb up and down'' the hierarchy tree of the network calculator by moving turn information to the link and node level and back again.
|Logit model for Park+Ride parking choice with explicit capacities at parking lots. This macro computes intermediate demand matrices for the first and the second trip leg.
Based on the convolution engine used in
with explicit parking lot capacities is solved by a successive dual
coordinate ascent method.
|Plots the itinerary of one or several transit lines in an optimally adjusted network window.
|The coordinates of the optimal window are computed in module 2.41 and saved in scalars from which they are accessed in module 2.23.
|This macro computes the opposing volumes for round-about intersections. As the opposing volume only depends on the incoming link of the round-about, the result is stored as an attribute of the incoming link. This macro will compute the opposing volumes for all round-about nodes in parallel.
Uses the same type of angle calculations as macro
is less complex, since the opposing volumes are fully defined by the
geometry of incoming links.
Aggregates the segment times between consecutive stops of one or several
transit lines and generates a report or punch file with the stop-to-stop
times and distances. See also macro
|Shows nicely how module 2.41 can be used to generate arbitrary network reports or punch files.
Splits stop-to-stop transit times onto the segments between two consecutive
stops. The splitting is done proportionally to the segment lengths.
For the reverse type of operation see macro
A good example showing how to use the
put(get()) technique combined
with the N-type segment attributes for propagating
information forth and back along the segments of a transit line.
Splits a demand matrix into two intermediate
demand matrices (first leg) and (second leg),
given an intermediate zone matrix .
See also macro
for the corresponding operation on
|A rather basic application of convolution techniques. Note the heavy use of compound macro statements.
|Implementation of a stochastic auto assignment using pseudo random time perturbations. At each outer iteration, a shortest path or equilibrium assignment is generated using a new set of time perturbations. The results of the outer iterations are averaged to obtain the final assignment result.
|This macro contains useful expressions to compute various types of pseudo random numbers (Uniform, Normal, Exponential and Gumble distributions). Do not modify the part using module 1.11, nor try to use this technique on your own -- dangerous!
|This macro implements the necessary convolution computations to implement an activity chaining demand model for 3-legged trips.
|This is rather complex, so there is no point looking at this macro unless you have read and understood the corresponding theoretical paper.
Most of these macros, when called without any parameters, will display a short explanation of their functionality and detailed instructions regarding their calling sequence. For macros identified with an asterisk (*), a paper containing more detailed information on the topic (including the relevant mathematical developments) is also available on the same web site.
All macros mentioned above are not part of the EMME/2 software as such. They are distributed as is, i.e. with no explicit or implied warranty of any kind. Detailed information regarding the conditions of use are contained in the header section of each macro.