From a7e32f502539fd3a99bcab3d6d82096c91a01228 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 28 Apr 2009 16:04:29 +0000 Subject: [PATCH] trunk preprocessor: added two more symbolic simplication rules, particularly useful for the static model * x-x=0 * x/x=1 git-svn-id: https://www.dynare.org/svn/dynare/trunk@2640 ac1d8469-bf42-47a9-8791-bf33cf982152 --- preprocessor/DataTree.cc | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/preprocessor/DataTree.cc b/preprocessor/DataTree.cc index aa44d82bb..d7469dff4 100644 --- a/preprocessor/DataTree.cc +++ b/preprocessor/DataTree.cc @@ -112,14 +112,16 @@ DataTree::AddPlus(NodeID iArg1, NodeID iArg2) NodeID DataTree::AddMinus(NodeID iArg1, NodeID iArg2) { - if (iArg1 != Zero && iArg2 != Zero) - return AddBinaryOp(iArg1, oMinus, iArg2); - else if (iArg1 != Zero) + if (iArg2 == Zero) return iArg1; - else if (iArg2 != Zero) + + if (iArg1 == Zero) return AddUMinus(iArg2); - else + + if (iArg1 == iArg2) return Zero; + + return AddBinaryOp(iArg1, oMinus, iArg2); } NodeID @@ -170,17 +172,23 @@ DataTree::AddTimes(NodeID iArg1, NodeID iArg2) NodeID DataTree::AddDivide(NodeID iArg1, NodeID iArg2) { - if (iArg1 != Zero && iArg2 != Zero && iArg2 != One) - return AddBinaryOp(iArg1, oDivide, iArg2); - else if (iArg2 == One) + if (iArg2 == One) return iArg1; - else if (iArg1 == Zero && iArg2 != Zero) - return Zero; - else + + // This test should be before the next two, otherwise 0/0 won't be rejected + if (iArg2 == Zero) { - cerr << "Division by zero!" << endl; + cerr << "ERROR: Division by zero!" << endl; exit(EXIT_FAILURE); } + + if (iArg1 == Zero) + return Zero; + + if (iArg1 == iArg2) + return One; + + return AddBinaryOp(iArg1, oDivide, iArg2); } NodeID @@ -250,7 +258,7 @@ DataTree::AddLog(NodeID iArg1) return Zero; else { - cerr << "log(0) isn't available" << endl; + cerr << "ERROR: log(0) not defined!" << endl; exit(EXIT_FAILURE); } } @@ -263,7 +271,7 @@ NodeID DataTree::AddLog10(NodeID iArg1) return Zero; else { - cerr << "log10(0) isn't available" << endl; + cerr << "ERROR: log10(0) not defined!" << endl; exit(EXIT_FAILURE); } }