MODTRACEオプションは、モデルの実行中に、モデルの各方程式をファイルに記録するかどうかを制御するオプションです。MODTRACEは、モデルの実行をトレースすることによって問題を検出するためのデバッグ・ツールとして主に使用されます。
パラメータ
各方程式の計算前にそれぞれのモデル方程式のテキストが現行の出力ファイルに送信され、その後、計算の結果が現行の出力ファイルに送信されます。
DBGOUTFILE文を使用してデバッグ・ファイルを指定した場合、MODTRACEの出力は、現行の出力ファイルではなくデバッグ・ファイルに送信されます。
(デフォルト)モデルの実行中、モデル方程式のテキストと結果はファイルに送信されません。
使用上の注意
解決順序のプレビュー
MODTRACEでは、モデルの方程式は解決される順序で現行の出力ファイルに送信されます。モデルの実行前に、MODEL.COMPRPTプログラムを使用して、解決順序のプレビューを取得できます。モデルが大きく複雑な場合、プレビューは特に有用です。モデルのコンパイル後に実行できるMODEL.COMPRPT
プログラムで、コンパイラがブロックにモデル方程式をどのように編成したか、およびブロックと方程式が解決される順序を示すレポートを生成できます。
トレース情報の理解
MODTRACEでは、トレースの各行に現行のモデルの名前が表示されます。トレースには次の種類の行が含まれます。
ブロック。ブロック行には、実行するプロックのブロック番号とブロック・タイプが表示されます。ブロックのタイプには、単純、ステップフォワード、ステップバックワードおよび連立があります。ステップフォワードまたはステップバックワードのブロックでは、ブロック行に、処理されるディメンションが表示されます。ディメンション間の依存がある連立ブロックのブロック行には、依存関係にあるディメンションが表示されます。モデルのブロックの詳細は、MODELコマンドを参照してください。
反復。これらの行は連立ブロックの場合に出力され、現行のブロックで実行される反復の回数が指定されます。Aitkens解法を使用する場合は、次の予測反復が識別されます。(使用する解法は、MODSIMULTYPEオプションで決定します。)
方程式。計算される方程式です。
結果。結果行は各方程式行の後にあり、方程式によって代入される結果が表示されます。結果が代入された変数および各モデル・ディメンションの現行の値が表示されます。連立ブロックでは、現行の反復の回数も表示されます。たとえば、actual
がソリューション変数で、モデル・ディメンションがline
およびmonth
の場合、連立ブロックの結果行は次のようなものになります。
(MOD= INCOME.CALC) ACTUAL (LINE OPR.INCOME MONTH 'JAN96' ITER 1) = 108.9600000
ディメンションベースの方程式を指定したMODTRACEの使用
ディメンションベースの方程式を含むモデルを実行すると、ソリューション変数のすべてのディメンションがOracle OLAPによって自動的にループ処理されます。トレースでは、結果行にDIMENSION文にリストされている各ディメンションの現行値が表示されますが、DIMENSION文にリストされていない追加のディメンションの現行値は表示されません。DIMENSION文の使用の詳細は、DIMENSION(モデル内)を参照してください。
つまり、モデル・ディメンションがline
およびmonth
で、ソリューション変数がline
、month
およびdivision
によってディメンション化されている場合、division
の現行値は結果行には表示されません。division
のステータスにある最初の値に対しモデルが実行され、その後、ステータスにある2番目の値に対しモデルが実行されます(以降同様)。
変数に値を代入するモデルを実行すると、それらの変数のディメンション(またはコンポジットのベース)すべてが自動的にループ処理されます。この場合、変数の各ディメンションの現行の値がトレースに表示されます。
例
例5-63 MODTRACEを使用したモデルのデバッグ
次の文で、income.budget
という名前のモデルを定義します。
DEFINE income.budget MODEL LD Model for estimating budget items MODEL DIMENSION line month Opr.Income = Gross.Margin - Marketing Gross.Margin = Revenue - Cogs Revenue = LAG(Revenue, 1, month) * 1.02 Cogs = LAG(Cogs, 1, month) * 1.01 Marketing = LAG(Opr.Income, 1, month) * 0.20 END
このモデルは、損益計算書の予算明細項目についての予測を行います。モデル方程式は、line
ディメンションを基礎としています。次の文で、モデルをコンパイルし、MODEL.COMPRPTプログラムを実行します。
COMPILE income.budget MODEL.COMPRPT income.budget
MODEL.COMPRPT
文によって生成されるコンパイル・レポートは次のとおりです。
MODEL INCOME.BUDGET <LINE MONTH> BLOCK 1 (SIMPLE) INCOME.BUDGET 4: revenue = lag(revenue, 1, month) * 1.02 INCOME.BUDGET 5: cogs = lag(cogs, 1, month) * 1.01 INCOME.BUDGET 3: gross.margin = revenue - cogs BLOCK 2 (STEP-FORWARD <MONTH>) INCOME.BUDGET 6: marketing = lag(opr.income, 1, month) * 0.20 INCOME.BUDGET 2: opr.income = gross.margin - marketing END BLOCK 2 END BLOCK 1
このモデルをデバッグする場合、モデルを実行する前にMODTRACEをオンにすることで、実行状況を行ごとにトレースできます。
次の文で、ディメンションを制限し、トレースを指定して、モデルを実行します。
LIMIT month TO 'Jan97' TO 'Mar97' LIMIT division TO 'Camping' MODTRACE = YES income.budget budget
これらの文によって、次のような行ごとの結果が生成されます。
(MOD= INCOME.BUDGET) BLOCK 1: SIMPLE (MOD= INCOME.BUDGET) revenue = lag(revenue, 1, month) * 1.02 (MOD= INCOME.BUDGET) BUDGET (LINE REVENUE MONTH 'JAN97') = 744491.1966 (MOD= INCOME.BUDGET) BUDGET (LINE REVENUE MONTH 'FEB97') = 759381.020532 (MOD= INCOME.BUDGET) BUDGET (LINE REVENUE MONTH 'MAR97') = 774568.64094264 (MOD= INCOME.BUDGET) cogs = lag(cogs, 1, month) * 1.01 (MOD= INCOME.BUDGET) BUDGET (LINE COGS MONTH 'JAN97') = 382386.2323 (MOD= INCOME.BUDGET) BUDGET (LINE COGS MONTH 'FEB97') = 386210.094623 (MOD= INCOME.BUDGET) BUDGET (LINE COGS MONTH 'MAR97') = 390072.19556923 (MOD= INCOME.BUDGET) gross.margin = revenue - cogs (MOD= INCOME.BUDGET) BUDGET (LINE GROSS.MARGIN MONTH 'JAN97') = 362104.9643 (MOD= INCOME.BUDGET) BUDGET (LINE GROSS.MARGIN MONTH 'FEB97') = 373170.925909 (MOD= INCOME.BUDGET) BUDGET (LINE GROSS.MARGIN MONTH 'MAR97') = 384496.44537341 (MOD= INCOME.BUDGET) BLOCK 2 STEP-FORWARD <MONTH> (MOD= INCOME.BUDGET) marketing = lag(opr.income, 1, month) * 0.20 (MOD= INCOME.BUDGET) BUDGET (LINE MARKETING MONTH 'JAN97') = 39938.192 (MOD= INCOME.BUDGET) opr.income = gross.margin - marketing (MOD= INCOME.BUDGET) BUDGET (LINE OPR.INCOME MONTH 'JAN97') = 322166.7723 (MOD= INCOME.BUDGET) marketing = lag(opr.income, 1, month) * 0.20 (MOD= INCOME.BUDGET) BUDGET (LINE MARKETING MONTH 'FEB97') = 64433.35446 (MOD= INCOME.BUDGET) opr.income = gross.margin - marketing (MOD= INCOME.BUDGET) BUDGET (LINE OPR.INCOME MONTH 'FEB97') = 308737.571449 (MOD= INCOME.BUDGET) marketing = lag(opr.income, 1, month) * 0.20 (MOD= INCOME.BUDGET) BUDGET (LINE MARKETING MONTH 'MAR97') = 61747.5142898 (MOD= INCOME.BUDGET) opr.income = gross.margin - marketing (MOD= INCOME.BUDGET) BUDGET (LINE OPR.INCOME MONTH 'MAR97') = 322748.93108361 (MOD= INCOME.BUDGET) END BLOCK 2 (MOD= INCOME.BUDGET) END BLOCK 1
単純ブロックであるBlock 1では、方程式は一度に1つずつ解決され、各方程式が解決されるごとにmonth
のステータスにある3つの値がループ処理されます。month
ディメンションにおけるステップフォワード・ブロックであるBlock 2では、month
のステータスにある値全体が段階的に処理され、各月についてのブロックにあるすべての方程式が順番に解決されます。