Transformations and expressions provide the key to adapting STEM to a wide range
of applications. Can you explain the difference between calculations made in the
Editor and those performed at run-time? This technical article looks into the mechanics
of evaluating expressions and compares four classes of calculation in STEM.

Expressions in the STEM Model Editor
STEM allows you to create links between different inputs, and to calculate inputs
using algebraic expressions, just like you can in a spreadsheet. As a simple example,
consider a Resource whose capital cost is known, but for which the maintenance cost
must be estimated at 5% of the capital cost. In the illustration below, you can
see that a simple formula is used to calculate this value, nicely illustrating both
the concept of an ‘internal reference’ and the use of a formula.

An internal reference is just a text label used to identify another input, analogous
to a cell reference in a spreadsheet. Rather than having to look up or remember
these labels, you can just click with the mouse while editing a formula to pick
up references to other inputs.
STEM automatically re-evaluates a formula whenever any of the ‘precedents’ (i.e.
the references made within the formula) are modified. This process is confined to
the Editor, and the calculated values are stored in the .DTM file when a model is
saved.
Time series
Expressions can also be used to relate and calculate time-series inputs. Whereas
the example above calculates just a single value, a formula entered for a time-series
input calculates a series of values for each year or period of the model run. For
example, if two complementary services are provided to the same customer base, then
you might define the penetration for the second service as:
- "Service 1".Penetration.RefValue
The resultant input is calculated for each period in turn, applying the same formula
to each of the corresponding values of the first input.
User Data
In addition to creating linkages between the standard STEM inputs, time-series expressions
can also be used to reference unbound User Data as user-defined inputs, providing
a completely flexible mechanism for extending the set of distinct inputs to a model.
For example, for a piece of equipment imported from abroad, you might define User
1 and User 2 as Nominal cost and Exchange rate respectively (by selecting Rename
Field from the Edit menu in the User Data dialog), and then link these through to
the Capital Cost with a suitable formula, as shown below.

Linked defaults
Sometimes you may wish to share a common set of assumptions between several inputs.
For example, a set of lifetime data might be shared by several Resources, while
specifying different unit capacities. By selecting Defaults from the icon menu for
an element, you can identify a source element from which all unset values should
be inferred in the target element. Alternatively, and more intuitively, you can
use drag-and-drop to create this relationship directly. STEM captures this dependency
as a formula for the target element, which acts on each field in turn, except where
an explicit value has been entered.
In the following illustration, the value entered for the Unit Capacity of Resource
2 overrides the default values linked from Resource 1.

External references
STEM provides comprehensive linkages with Excel and other database tools. Selecting
Links from the File menu in the Editor enables you to create an ‘external reference’
to scalar and time-series data from Excel spreadsheets, any ODBC-compliant database
or the inputs and results of a STEM model. The syntax for a link to Excel might
look like this:
‘C:\DATA[COSTS.XLS]Sheet3’!$A$2
which is the same format as is used in Excel for an inter-workbook link. The syntax
for linking to databases is described in detail in Section 5 of the User Guide.
Rather than create many parallel links between a STEM model and the same external
file, you can use the defaults mechanism to link several or all inputs for a given
element with one formula. This formula can reference a range of cells in a spreadsheet,
or rows in a database query, where the individual data are identified by labels
within the external file.

Run-time expressions and the STEM Model Engine
Transformations were first introduced in STEM 3.0 to satisfy a widespread desire
to model ‘equipment-driven demand’, that is to say a requirement for secondary equipment
to be dimensioned directly in terms of the installation of some primary equipment.
A simple example would be various services for differing customer segments requiring
a copper loop to an exchange, and then each copper loop requiring a line card at
the exchange. Mapping the demand directly from cooper loop to line card avoids the
need to repeat separate links from each service to the line card, as well as offering
a more intuitive representation of the actual network architecture.

A key attribute of a Transformation is that, within each period of the model run
cycle, STEM waits until it has calculated the demand for all the inputs of a Transformation
before calculating the Transformations own Output, and then proceeds to calculate
demand for any dependent elements. The ‘size’ of each input is defined by the input
Basis, in this example the demand for line cards being the number of loops actually
in use.
The simple Resource Transformation simply passes on demand, whereas, in general,
most Transformations actually modify their inputs.
Predefined Transformations
There are several ‘built-in’ Transformations for which the model engine performs
a standard parameterised calculation, as shown in the following table. Here the
Output of the Transformation is always calculated in the same way, but with the
influence of various input parameters, such as a multiplier, or a grade of service
for the Erlang B Transformation. These alternatives are accessed from the Type menu
in the Input and Transformation dialog.
Type
|
Parameters
|
Output
|
Multiplier
|
Time-series multiplier
|
A linear multiple of the input
|
Input–output mapping
|
Mapping, usually an interpolated look-up
|
A time-invariant non-linear mapping
|
Erlang B formula
|
Grade of service;sites
|
Number of circuits required (note: input is carried traffic, rather than offered
traffic
|
Time lag
|
Integer time lag
|
Input from earlier year
|
Expression Transformations
The most general Transformation element accepts a variable number of inputs (up
to 20 in STEM 6.2) and calculates its output from a user-defined expression. Although
this formula is entered in the Editor, it is not evaluated until run-time, as it
acts on intermediate results from the model engine, as identified by the bases of
the various Transformation inputs.
The canonical application is to sum a number of separate demands, such as two different
kinds of cards requiring slots on a shelf in a cabinet. In this case, Installed
Units is selected as the basis for both inputs, since this is what directly drives
space required on the shelf.

An Expression Transformation allocates costs in fixed proportions between its inputs
by default, but here the cost allocation basis is set to Input Proportions, prescribing
that costs should be allocated in proportion to the respective numbers of cards.
However, in this case, all costs will be ultimately fed back to the services driving
the line card.
The expression for such a Transformation is known as a ‘run-time’ expression, in
contrast to other expressions which are evaluated directly in the Editor. A run-time
expression may also include internal references to other inputs, so that for example
you can define additional parameters in User Data. However, it is important to understand
that, while User Data may be defined by a time-series formula or linked to Excel,
this is not possible for Transformation inputs, which serve only to identify intermediate
results for selected input elements.
The final technicality relates to copying run-time expressions. As far as the Editor
is concerned, a run-time expression is a value, so there is no distinction between
paste values and paste formulae for such a field. Moreover, if you link defaults
from one Expression Transformation to another, the form of the expression from the
first Transformation will be reproduced in the second. In contrast, a time-series
expression for the original User1 would yield only a set of default time-series
values for the second element.
Expression syntax for derived results
The STEM model engine is concerned with network business operations: the forecast
of demand and revenues, and the calculated incremental and total installation of
all types of equipment and other cost drivers. The investment required to fund this
business activity is calculated separately by an iterative process in the Results
program, with reference to the operational results from the model engine and certain
financial inputs from the Editor.
The reasons for this separation are twofold. Firstly, the calculations in the Results
program are done ‘on demand’, with no additional disk space requirements. (This
applies not just to the investment layer, but also to all intrinsic summations of
network revenues over Service elements and network costs over Resource elements.)
Nowadays, disk space is no great concern; the more persuasive factor is the flexibility
of the ‘derived results’ mechanism which delivers these financial results.
Derived results
Select Define Results… from the Config menu in the Results program to explore this
feature for yourself. For each type of result, you will see a large number of pre-defined
derived results. For example, Service Operating Profit is defined as:
Revenue – "Operating
Charge"
This single definition applies consistently to all Service elements. The terms in
this expression relate to other Service results; when the result is calculated for
a given Service, the Results engine automatically addresses the respective results
for this element.

Network aggregation
Expressions for derived results can contain all the usual arithmetic operators and
algebraic functions. Special treatment is given to the sum() function. The conventional
use is to sum several other results, for example:
sum (a, b, c)
but if, for a network result, you write:
sum (Services.Revenue)
then this single-argument sum performs a sum of the given results over all the elements
of the given type. This method is used to evaluate all the network totals for revenue
and cost.
Collections
You can calculate automatic aggregations over arbitrary sets of elements by defining
Collections in the Editor. For example, if you select the two card Resources in
the example above and click the Collection button on the toolbar, the Editor will
create a Collection element, effectively grouping these two Resources. The Collection
provides a unified interface to the input assumptions for both Resources, and automatically
appears in the list of Elements in the Choose elements to draw dialog in the Results
program.

Derived network results may also refer to results for individual named elements,
most usefully for Collections, which can be used to provide a categorised breakdown
of costs versus revenues. ‘Defining results’ is explained in more detail in Section
4 of the User Guide.