Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
bdc71cd4
"platforms/vscode:/vscode.git/clone" did not exist on "801c43ee422da26aeca82f74a3dd201e53f37d2a"
Commit
bdc71cd4
authored
Nov 24, 2009
by
Peter Eastman
Browse files
Added some optimizations
parent
b5edab67
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
28 additions
and
0 deletions
+28
-0
libraries/lepton/src/ParsedExpression.cpp
libraries/lepton/src/ParsedExpression.cpp
+22
-0
tests/TestParser.cpp
tests/TestParser.cpp
+6
-0
No files found.
libraries/lepton/src/ParsedExpression.cpp
View file @
bdc71cd4
...
...
@@ -167,6 +167,16 @@ ExpressionTreeNode ParsedExpression::substituteSimplerExpression(const Expressio
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
second
*
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
0
].
getOperation
())
->
getValue
()),
children
[
0
].
getChildren
()[
0
]);
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
second
),
children
[
0
]);
}
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
&&
children
[
1
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// The two negations cancel
return
ExpressionTreeNode
(
new
Operation
::
Multiply
(),
children
[
0
].
getChildren
()[
0
],
children
[
1
].
getChildren
()[
0
]);
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
&&
children
[
1
].
getOperation
().
getId
()
==
Operation
::
MULTIPLY_CONSTANT
)
// Negate the constant
return
ExpressionTreeNode
(
new
Operation
::
Multiply
(),
children
[
0
].
getChildren
()[
0
],
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
-
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
1
].
getOperation
())
->
getValue
()),
children
[
1
].
getChildren
()[
0
]));
if
(
children
[
1
].
getOperation
().
getId
()
==
Operation
::
NEGATE
&&
children
[
0
].
getOperation
().
getId
()
==
Operation
::
MULTIPLY_CONSTANT
)
// Negate the constant
return
ExpressionTreeNode
(
new
Operation
::
Multiply
(),
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
-
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
0
].
getOperation
())
->
getValue
()),
children
[
0
].
getChildren
()[
0
]),
children
[
1
].
getChildren
()[
0
]);
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// Pull the negation out so it can possibly be optimized further
return
ExpressionTreeNode
(
new
Operation
::
Negate
(),
ExpressionTreeNode
(
new
Operation
::
Multiply
(),
children
[
0
].
getChildren
()[
0
],
children
[
1
]));
if
(
children
[
1
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// Pull the negation out so it can possibly be optimized further
return
ExpressionTreeNode
(
new
Operation
::
Negate
(),
ExpressionTreeNode
(
new
Operation
::
Multiply
(),
children
[
0
],
children
[
1
].
getChildren
()[
0
]));
break
;
}
case
Operation
::
DIVIDE
:
...
...
@@ -184,6 +194,14 @@ ExpressionTreeNode ParsedExpression::substituteSimplerExpression(const Expressio
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
0
].
getOperation
())
->
getValue
()
/
denominator
),
children
[
0
].
getChildren
()[
0
]);
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
1.0
/
denominator
),
children
[
0
]);
// Replace a divide with a multiply
}
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
&&
children
[
1
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// The two negations cancel
return
ExpressionTreeNode
(
new
Operation
::
Divide
(),
children
[
0
].
getChildren
()[
0
],
children
[
1
].
getChildren
()[
0
]);
if
(
children
[
1
].
getOperation
().
getId
()
==
Operation
::
NEGATE
&&
children
[
0
].
getOperation
().
getId
()
==
Operation
::
MULTIPLY_CONSTANT
)
// Negate the constant
return
ExpressionTreeNode
(
new
Operation
::
Divide
(),
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
-
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
0
].
getOperation
())
->
getValue
()),
children
[
0
].
getChildren
()[
0
]),
children
[
1
].
getChildren
()[
0
]);
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// Pull the negation out so it can possibly be optimized further
return
ExpressionTreeNode
(
new
Operation
::
Negate
(),
ExpressionTreeNode
(
new
Operation
::
Divide
(),
children
[
0
].
getChildren
()[
0
],
children
[
1
]));
if
(
children
[
1
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// Pull the negation out so it can possibly be optimized further
return
ExpressionTreeNode
(
new
Operation
::
Negate
(),
ExpressionTreeNode
(
new
Operation
::
Divide
(),
children
[
0
],
children
[
1
].
getChildren
()[
0
]));
break
;
}
case
Operation
::
POWER
:
...
...
@@ -216,6 +234,8 @@ ExpressionTreeNode ParsedExpression::substituteSimplerExpression(const Expressio
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
-
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
0
].
getOperation
())
->
getValue
()),
children
[
0
].
getChildren
()[
0
]);
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
CONSTANT
)
// Negate a constant
return
ExpressionTreeNode
(
new
Operation
::
Constant
(
-
getConstantValue
(
children
[
0
])));
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// The two negations cancel
return
children
[
0
].
getChildren
()[
0
];
break
;
}
case
Operation
::
MULTIPLY_CONSTANT
:
...
...
@@ -224,6 +244,8 @@ ExpressionTreeNode ParsedExpression::substituteSimplerExpression(const Expressio
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
node
.
getOperation
())
->
getValue
()
*
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
children
[
0
].
getOperation
())
->
getValue
()),
children
[
0
].
getChildren
()[
0
]);
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
CONSTANT
)
// Multiply two constants
return
ExpressionTreeNode
(
new
Operation
::
Constant
(
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
node
.
getOperation
())
->
getValue
()
*
getConstantValue
(
children
[
0
])));
if
(
children
[
0
].
getOperation
().
getId
()
==
Operation
::
NEGATE
)
// Combine a multiply and a negate into a single multiply
return
ExpressionTreeNode
(
new
Operation
::
MultiplyConstant
(
-
dynamic_cast
<
const
Operation
::
MultiplyConstant
*>
(
&
node
.
getOperation
())
->
getValue
()),
children
[
0
].
getChildren
()[
0
]);
}
}
return
ExpressionTreeNode
(
node
.
getOperation
().
clone
(),
children
);
...
...
tests/TestParser.cpp
View file @
bdc71cd4
...
...
@@ -178,6 +178,12 @@ int main() {
verifyEvaluation
(
"2*(3*x)"
,
4.0
,
4.0
,
24.0
);
verifyEvaluation
(
"2*x/3"
,
1.0
,
4.0
,
2.0
/
3.0
);
verifyEvaluation
(
"x*2/3"
,
1.0
,
4.0
,
2.0
/
3.0
);
verifyEvaluation
(
"5*(-x)*(-y)"
,
1.0
,
4.0
,
20.0
);
verifyEvaluation
(
"5*(-x)*(y)"
,
1.0
,
4.0
,
-
20.0
);
verifyEvaluation
(
"5*(x)*(-y)"
,
1.0
,
4.0
,
-
20.0
);
verifyEvaluation
(
"5*(-x)/(-y)"
,
1.0
,
4.0
,
1.25
);
verifyEvaluation
(
"5*(-x)/(y)"
,
1.0
,
4.0
,
-
1.25
);
verifyEvaluation
(
"5*(x)/(-y)"
,
1.0
,
4.0
,
-
1.25
);
verifyEvaluation
(
"x*w; w = 5"
,
3.0
,
1.0
,
15.0
);
verifyEvaluation
(
"a+b^2;a=x-b;b=3*y"
,
2.0
,
3.0
,
74.0
);
verifyInvalidExpression
(
"1..2"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment