The MODDAMP option specifies a weighting factor that damps out oscillations between iterations when you use the Gauss-Seidel method for solving simultaneous equations in a model. MODDAMP can allow the solution of models that would otherwise never converge because the oscillation between equations is stable. In these cases, the oscillations never decay without damping.
With the Gauss-Seidel method, Oracle OLAP tests each model equation for convergence or divergence in each iteration over a block of simultaneous equations. The tests are made by comparing the results of the current iteration to the results from the previous iteration. When MODDAMP specifies a weighting factor that is greater than zero, the value that Oracle OLAP tests and stores after each iteration is a weighted average of the current and previous results. For equations that oscillate between iterations, you can therefore use MODDAMP to damp out the oscillations and either prevent divergence or speed up the convergence of the equations.
DECIMAL
MODDAMP = {n|0.00}
A decimal value, greater than or equal to zero and less than one, that specifies the weighting factor. The closer MODDAMP is to 0.00, the more weight is given to the value from the current iteration. The default value is 0.00, which gives full weight to the current iteration.
When MODDAMP is greater than zero, Oracle OLAP calculates the weighted average for the current iteration as follows.
calcvalue * (1 - MODDAMP) + weightavg
where:
calcvalue is the value calculated from the model equation in the current iteration.
weightavg is the weighted average calculated in the previous iteration.
Specifying the Solution Method
The MODDAMP option is used only with the Gauss-Seidel method for solving simultaneous equations. The MODSIMULTYPE option determines the solution method that is being used. The possible settings for MODSIMULTYPE are GAUSS
, for the Gauss-Seidel method, and AITKENS
, for the Aitkens delta-squared method.
Effect of MODDAMP on Convergence Speed
MODDAMP is used in calculating the results of all model equations in every simultaneous block, whether they oscillate between iterations or not. For equations that do not oscillate, convergence is slowed down when the value of MODDAMP is greater than zero. Therefore, when your model contains some equations that oscillate and some that do not, you might be able to speed up overall convergence by setting MODDAMP to a small nonzero value, such as 0.20
. A small nonzero value will slow down the convergence of non-oscillating equations only slightly, while speeding up the convergence of oscillating equations.
When the model equation does not converge or diverge on the current iteration, the weighted average calculated in the current iteration is stored. In the next iteration, Oracle OLAP uses this stored average as weightavg (that is, the weighted average calculated in the previous iteration) in the formula for the weighted average.
In the first iteration over a block, Oracle OLAP uses the starting value of the target variable (or dimension value) as the weightavg (that is, the weighted average calculated in the previous iteration).
In tests for convergence and divergence in each iteration, Oracle OLAP compares the results of the current iteration to the results from the previous iteration. When MODDAMP is greater than zero, Oracle OLAP tests a comparison value that is calculated as follows.
(weightavg - weightavg) / (weightavg PLUS MODGAMMA)
where weightavg is the weighted average calculated in the previous iteration
For an explanation of the test for convergence, see the MODTOLERANCE option. For an explanation of the test for divergence, see the MODOVERFLOW option.
Options to Control the Solution of Simultaneous Blocks
Altering the value of MODDAMP is just one of the steps you can take in attempting to speed up or attain convergence of a simultaneous block. MODEL lists additional options that you can use to control the solution of simultaneous blocks and provides information on running and debugging models.
Example 6-50 Using the Default MODDAMP Value
The following statements trace a model called income.bud
, specify that the Gauss-Seidel method should be used for solving simultaneous blocks, limit a dimension, and run the income.bud
model.
MODTRACE = YES MODSIMULTYPE = 'GAUSS' LIMIT division TO 'Camping' income.bud budget
These statements produce the following output.
(MOD= INCOME.BUD) BLOCK 1: SIMULTANEOUS (MOD= INCOME.BUD) ITERATION 1: EVALUATION (MOD= INCOME.BUD) revenue = marketing * 300 - cogs ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 35) = 368.650399101 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 36) = 369.209604252 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 37) = 368.718556135 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 38) = 369.149674626 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 39) = 368.771110244 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 40) = 369.103479583 (MOD= INCOME.BUD) END BLOCK 1
The MODDAMP option is set to its default value of 0.00. The equation for the Revenue line item converged in 40 iterations over a block of simultaneous equations. In the trace lines, you can see the results that were calculated for the Revenue line item in the final 6 iterations.
Example 6-51 Setting MODDAMP to Speed Up the Convergence of a Model
The following statements change the value of MODDAMP and run the income.bud
model.
MODDAMP = 0.2 income.bud budget
These statements produce the following output.
(MOD= INCOME.BUD) BLOCK 1: SIMULTANEOUS (MOD= INCOME.BUD) ITERATION 1: EVALUATION (MOD= INCOME.BUD) revenue = marketing * 300 - cogs (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 1) = 276.200000000 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 2) = 416.187139753 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 3) = 368.021098186 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 4) = 367.209906847 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 5) = 369.271224267 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 6) = 368.965397407 (MOD= INCOME.BUD) END BLOCK 1
In "Using the Default MODDAMP Value", the equation for the Revenue
line item converged in 40 iterations. With MODDAMP set to 0.2
in the current example, the same equation converged in just 6 iterations.