Formulae and Functions
Formulae can be entered as substitutes for specific values into most fields in EMarket to control the derivation of variable values at run time. A formula can contain any combination of:
- Constants
- Variables
- Operators
- Entities and Traits
- Functions
Constants
Constants can be:
- Numbers: Integers or Reals (e.g. 1, 2.5, -3), they can also be entered in scientific notation e.g. '3E+10'.
- Strings: Written inside double quotes e.g. "A Node"
- Dates: Must be enclosed in single quotes e.g '1/3/2004' or '14 April 2005'
Warning: The format for entering dates should compatible with the computer's local date (locality) setting
Variables
Variables can be regarded as user-defined Entity.Traits which can be defined in the Volatility Matrix or the Schedule. Previously defined variables can be used in formulae.
Note: EMarket provides a 'system' variable the user need not define: 'DateTime' which is of type 'Date' and gives the current simulation date as the model runs.
Operators
Operators are all pre-defined in EMarket. Their purpose is to separate a formula into parts that are then combined to give a single value.
The following operators are shown in descending order of precedence.
Operator | Meaning | Example | Parameter Type | Return Type |
---|---|---|---|---|
\ | Integer Division | 3\2 = 1 | Real; Int | Int |
% | Modulus | 7%5 = 2 | Real; Int | Int |
/ | Division | 3/2 = 1.5 | Real; Int | Real |
* | Multiplication | 5*4.2 = 21 | Real; Int | Real |
- | Subtraction | 7-3.2 = 3.8 | Real; Int | Real |
+ | Addition | 3.5+1.5 = 5 | Real; Int | Real |
Functions
Functions provide a powerful mechanism for deriving field and variable data values from input parameters.
A function has the form FunctionName(Parameter1, Parameter2, ...)
An operator is used in a Function in the following form: <Parameter1>Operator<Parameter2>.
EMarket provides the following function types:
- Arithmetic functions
- Logic functions
- Run information functions
- Time functions
- Other functions
Note: Logic operators and functions evaluate to one for a result that is true (for example 6 = 6), and zero for false.
Arithmetic Functions
The following table lists EMarket's Arithmetic functions:
Function | Purpose | Parameters | Return Type | Example | Result |
---|---|---|---|---|---|
Sqrt | Square root of a number | Integer or Real | Real | Sqrt(546.94) | 23.387 |
Abs | Absolute value of a number | Integer or Real | Real | Abs(-19.1) | 19.1 |
Int | Integer portion of a number | Integer or Real | Integer | Int(45.786) | 45 |
Sum | Total value of numbers in an array | Value Array (Exclude Value), Integer or Real | Real | Sum(Node.Price) | |
Max | Maximum value of numbers in an array, optionally excluding values with value over an exclude value | Value Array (Exclude Value), Integer or Real | Real | Max(Generator.Generation) | |
Min | Minimum value of numbers in an array | Value Array (Exclude Value), Integer or Real | Real | Min(Generator.Generation) | |
StdDev | Standard deviation of numbers in an array | Value Array (Exclude Value), Integer or Real | Real | StdDev(Generator.Generation) | |
Avg | Average value of numbers in an array | Value Array (Exclude Value), Integer or Real | Real | Avg(Generator.Generation) | |
WgtAvg | Average of numbers in an array, weighted by numbers in another array | Value Array (Weights Array), Integer or Real | Real | WgtAvg(Generator.Generation,Generator.Cost) | |
Choke | Returns a collared value (i.e. the value of the referenced variable is returned if it falls within the specified range otherwise the relevant minimum or maximum value is returned) | Integer or Real | Real | Choke(500,200,Generator.Generation) |
Logic Functions
The following table lists EMarket3's Logic functions:
Operator | Purpose | Parameters | Return Value | Example | Result |
---|---|---|---|---|---|
= | Whether two numbers are Equal | 2 numbers, Integer or Real | 0 or 1 | 5 = 6 | 0 |
< | Whether first number is less than the second | 2 numbers, Integer or Real | 0 or 1 | -2 < 7 | 1 |
> | Whether first number is Greater than the second | 2 numbers, Integer or Real | 0 or 1 | 9 > 7 | 1 |
AND | Whether two numbers are both non-zero | 2 numbers, Integer or Real | 0 or 1 | And(6=6,4<3) | 0 |
OR | Whether either of two numbers are non-zero | 2 numbers, Integer or Real | 0 or 1 | OR(3<5, 2>3) | 1 |
Between | Whether a number is between two limits | Number: lower limit; upper limit, Integer, real or date | 0 or 1 | Between(5.7,9.7) | 0 |
Run Information Functions
The following table lists EMarket's Run information functions:
Function | Purpose | Parameters | Return Type |
---|---|---|---|
Date | Date of current Tick | None | Date |
TP | TP number of current Tick | None | Integer |
Version | The position of a Run in a Batch sequence. For first Run, Version is zero. | None | Integer |
Time Functions
The following table lists EMarket's Time functions:
Function | Purpose | Parameters | Return Type | Example | Result |
---|---|---|---|---|---|
GetDate | Converts a date to a day number | Date | Integer | GetDate('1/4/2004') | |
hh | Gets the half hourly TP from a date | 'DateTime' | Integer | hh(DateTime) | |
4h | Gets the number of the block of 4 hourly trading periods for a given date (e.g. 1 = TP 1-8) | 'DateTime' | Integer | 4h(DateTime) | |
6h | Gets the number of the block of 6 hourly trading periods for a given date (e.g. 0 = TP 1-12) | 'DateTime' | Integer | 6h(DateTime) | |
DOW | Gets the weekday for a date, 0 = Sunday | Date | Integer | Dow('14/6/2004') | 1 |
WO | Whether a date is a week day rather than a weekend or holiday, 1 = Weekend; 0 = Weekday | Date | 0 or 1 | WO('13/6/2004') | 1 |
WODN | 0=Week Night(WN); 1=Week Day(WD); 2=Other Night(ON); 3=Other Day(OF) | Date (and time) | 0 to 3 | WODN('1/5/2004 22:00') | 3 |
WODN6 | 0=Week Night(WN); 1=Week Day(WD); 2=Other Night(ON); 3=Other Day(OF). Using A night period running from Midnight to 6am (not to 8am as in WODN) | Date (and time) | 0 to 3 | WODN6('1/5/2004 22:00') | 3 |
Month | Gets the month from a date, 0 = January | Date | 0 to 11 | Month('1/5/2004') | 4 |
WeekOfYear | Gets the week from a date, 0 = 1st full week in April | Date | 0 to 51 | WeekOfYear('1/5/2004') | 4 |
DateDiff | Calculates the number of days between two date/times | Date 1, Date2 | Real | DateDiff('1/5/2004', '5/5/004') | 4 |
DateSeq | Gets the position of a required date within a list of ordered dates | Date required, Lists of dates | Integer | DateSeq('5 / 4 / 2004', '1 / 4 / 2004', '2 / 4 / 2004', '3 / 4 / 2004', '4 / 4 / 2004', '5 / 4 / 2004') | 5 |
TimeSeries | Given a date ordered sequence of values, finds the value for a required date | List of (value, last date applies) | Real | TimeSeries(735 , ' 1/04/2004 ', 760 , ' 1/04/2005 ', 840) |
Other Functions
The following table lists EMarket's other functions:
Function | Purpose | Parameters | Return Type | Example | Result |
---|---|---|---|---|---|
ArrayTable | Uses two indices to retrieve a value from an array (matrix) | Index1, Index2, Value array. May be real or Integer | Real or Integer | ArrayTable(p,q,m,n, V00, V01, V02, ...V0m, V10, V11, ... Vnm) where p,q represent the position of the array; m,n represent the numbers of columns and rows in the array; 0<= p < m and 0 <= q < n would return Vpq. E.g. ArrayTable(1, 1, 2, 3, 4, 32.1, 6.3, 1.8, 31, 5). This defines a 2 * 3 matrix, and looks for the entry indexed by 1, 1. Note that if the indices are out of bounds no error will be given, and an indeterminate value will be returned. |
31 |
Index | Gets the number in given position (index) in a list of numbers. First number has position zero. | 1 or more numbers, can be integers or real | Real | Index(p, V0, V1, V2, ... Vm) where p is the position (index) in a list of numbers. E.g. Index(3, 4.5, 7, 8.9, -23.4) |
-23.4 |
PieceWiseLinear | Generates a value based on an extrapolation of existing data. Given a target value (p) and a set of x, y pairings defining a function, the PieceWiseLinear function will find the y value corresponding to p. This function is included primarily for use in defining Demand elasticity. | Set of x,y value pairings, can be integers or real | Real or Integer | PieceWiseLinear(p, x1, y1, x2, y2, ...xn, yn) where p is the target value. Note that you can use internal model variables as the target value, as in this example: PieceWiseLinear(HydroSystem:Waitaki.SystemMWV, 0, 1, 80, 1, 150, 0.8, 400, 0.64) |