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
c1e5ec2f
"vscode:/vscode.git/clone" did not exist on "af95a5349e5de9b4bbcd67d8e012400a3e8811ba"
Commit
c1e5ec2f
authored
Sep 30, 2019
by
peastman
Browse files
Add ability to enforce units on input arguments
parent
a9ea2b9b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
58 additions
and
5 deletions
+58
-5
wrappers/python/src/swig_doxygen/swigInputBuilder.py
wrappers/python/src/swig_doxygen/swigInputBuilder.py
+29
-2
wrappers/python/src/swig_doxygen/swigInputConfig.py
wrappers/python/src/swig_doxygen/swigInputConfig.py
+7
-3
wrappers/python/tests/TestAPIUnits.py
wrappers/python/tests/TestAPIUnits.py
+22
-0
No files found.
wrappers/python/src/swig_doxygen/swigInputBuilder.py
View file @
c1e5ec2f
...
@@ -446,6 +446,7 @@ class SwigInputBuilder:
...
@@ -446,6 +446,7 @@ class SwigInputBuilder:
#write only non Constructor and Destructor methods and python mods
#write only non Constructor and Destructor methods and python mods
self
.
fOut
.
write
(
"
\n
"
)
self
.
fOut
.
write
(
"
\n
"
)
methodsWithOutputArgs
=
set
()
for
items
in
methodList
:
for
items
in
methodList
:
clearOutput
=
""
clearOutput
=
""
(
shortClassName
,
memberNode
,
(
shortClassName
,
memberNode
,
...
@@ -479,6 +480,7 @@ class SwigInputBuilder:
...
@@ -479,6 +480,7 @@ class SwigInputBuilder:
(
INDENT
,
simpleType
,
pType
,
pName
))
(
INDENT
,
simpleType
,
pType
,
pName
))
clearOutput
=
"%s%s%%clear %s %s;
\n
"
\
clearOutput
=
"%s%s%%clear %s %s;
\n
"
\
%
(
clearOutput
,
INDENT
,
pType
,
pName
)
%
(
clearOutput
,
INDENT
,
pType
,
pName
)
methodsWithOutputArgs
.
add
((
shortClassName
,
methName
))
mArgsstring
=
getText
(
"argsstring"
,
memberNode
)
mArgsstring
=
getText
(
"argsstring"
,
memberNode
)
try
:
try
:
...
@@ -503,6 +505,9 @@ class SwigInputBuilder:
...
@@ -503,6 +505,9 @@ class SwigInputBuilder:
paramList
=
findNodes
(
memberNode
,
'param'
)
paramList
=
findNodes
(
memberNode
,
'param'
)
# write pythonprepend blocks
# write pythonprepend blocks
if
isConstructors
:
mArgsstring
=
''
# specifying args to constructors seems to prevent append and prepend from working
else
:
mArgsstring
=
getText
(
"argsstring"
,
memberNode
)
mArgsstring
=
getText
(
"argsstring"
,
memberNode
)
if
self
.
fOutPythonprepend
and
\
if
self
.
fOutPythonprepend
and
\
len
(
paramList
)
and
\
len
(
paramList
)
and
\
...
@@ -523,6 +528,28 @@ class SwigInputBuilder:
...
@@ -523,6 +528,28 @@ class SwigInputBuilder:
s = ("the %s object does not own its corresponding OpenMM object"
s = ("the %s object does not own its corresponding OpenMM object"
% self.__class__.__name__)
% self.__class__.__name__)
raise Exception(s)'''
.
format
(
argName
=
argName
)
raise Exception(s)'''
.
format
(
argName
=
argName
)
# Convert input arguments to the proper units, if specified.
if
key
not
in
methodsWithOutputArgs
:
if
key
in
self
.
configModule
.
UNITS
:
argUnits
=
self
.
configModule
.
UNITS
[
key
][
1
]
elif
(
"*"
,
methName
)
in
self
.
configModule
.
UNITS
:
argUnits
=
self
.
configModule
.
UNITS
[(
"*"
,
methName
)][
1
]
else
:
argUnits
=
()
if
len
(
argUnits
)
>
0
and
(
self
.
SWIG_COMPACT_ARGUMENTS
or
isConstructors
):
textInside
+=
'''
args = list(args)'''
for
i
,
units
in
enumerate
(
argUnits
):
if
units
is
not
None
:
if
self
.
SWIG_COMPACT_ARGUMENTS
or
isConstructors
:
argName
=
'args[%s]'
%
i
else
:
argName
=
getText
(
'declname'
,
paramList
[
i
])
textInside
+=
'''
if unit.is_quantity({argName}):
{argName} = {argName}.value_in_unit({units})'''
.
format
(
argName
=
argName
,
units
=
units
)
for
argNum
in
self
.
configModule
.
REQUIRE_ORDERED_SET
.
get
(
key
,
[]):
for
argNum
in
self
.
configModule
.
REQUIRE_ORDERED_SET
.
get
(
key
,
[]):
if
self
.
SWIG_COMPACT_ARGUMENTS
:
if
self
.
SWIG_COMPACT_ARGUMENTS
:
argName
=
'args[%s]'
%
argNum
argName
=
'args[%s]'
%
argNum
...
@@ -568,7 +595,7 @@ class SwigInputBuilder:
...
@@ -568,7 +595,7 @@ class SwigInputBuilder:
%
(
addText
,
INDENT
,
valueUnits
[
0
])
%
(
addText
,
INDENT
,
valueUnits
[
0
])
for
vUnit
in
valueUnits
[
1
]:
for
vUnit
in
valueUnits
[
1
]:
if
vUnit
is
not
None
:
if
vUnit
is
not
None
and
key
in
methodsWithOutputArgs
:
addText
=
"%s%sval[%s]=unit.Quantity(val[%s], %s)
\n
"
\
addText
=
"%s%sval[%s]=unit.Quantity(val[%s], %s)
\n
"
\
%
(
addText
,
INDENT
,
index
,
index
,
vUnit
)
%
(
addText
,
INDENT
,
index
,
index
,
vUnit
)
index
+=
1
index
+=
1
...
...
wrappers/python/src/swig_doxygen/swigInputConfig.py
View file @
c1e5ec2f
...
@@ -117,9 +117,6 @@ SKIP_METHODS = [('State', 'getPositions'),
...
@@ -117,9 +117,6 @@ SKIP_METHODS = [('State', 'getPositions'),
# The build script assumes method args that are non-const references are
# The build script assumes method args that are non-const references are
# used to output values. This list gives excpetions to this rule.
# used to output values. This list gives excpetions to this rule.
NO_OUTPUT_ARGS
=
[(
'LocalEnergyMinimizer'
,
'minimize'
,
'context'
),
NO_OUTPUT_ARGS
=
[(
'LocalEnergyMinimizer'
,
'minimize'
,
'context'
),
(
'System'
,
'getDefaultPeriodicBoxVectors'
,
'a'
),
(
'System'
,
'getDefaultPeriodicBoxVectors'
,
'b'
),
(
'System'
,
'getDefaultPeriodicBoxVectors'
,
'c'
),
(
'Platform'
,
'setPropertyValue'
,
'context'
),
(
'Platform'
,
'setPropertyValue'
,
'context'
),
(
'AmoebaTorsionTorsionForce'
,
'setTorsionTorsionGrid'
,
'grid'
),
(
'AmoebaTorsionTorsionForce'
,
'setTorsionTorsionGrid'
,
'grid'
),
(
'AmoebaVdwForce'
,
'setParticleExclusions'
,
'exclusions'
),
(
'AmoebaVdwForce'
,
'setParticleExclusions'
,
'exclusions'
),
...
@@ -175,8 +172,14 @@ UNITS = {
...
@@ -175,8 +172,14 @@ UNITS = {
(
"*"
,
"getDefaultPressureX"
)
:
(
"unit.bar"
,
()),
(
"*"
,
"getDefaultPressureX"
)
:
(
"unit.bar"
,
()),
(
"*"
,
"getDefaultPressureY"
)
:
(
"unit.bar"
,
()),
(
"*"
,
"getDefaultPressureY"
)
:
(
"unit.bar"
,
()),
(
"*"
,
"getDefaultPressureZ"
)
:
(
"unit.bar"
,
()),
(
"*"
,
"getDefaultPressureZ"
)
:
(
"unit.bar"
,
()),
(
"*"
,
"setDefaultPressure"
)
:
(
None
,
(
"unit.bar"
,)),
(
"*"
,
"setDefaultPressureX"
)
:
(
None
,
(
"unit.bar"
,)),
(
"*"
,
"setDefaultPressureY"
)
:
(
None
,
(
"unit.bar"
,)),
(
"*"
,
"setDefaultPressureZ"
)
:
(
None
,
(
"unit.bar"
,)),
(
"*"
,
"getDefaultSurfaceTension"
)
:
(
"unit.bar*unit.nanometer"
,
()),
(
"*"
,
"getDefaultSurfaceTension"
)
:
(
"unit.bar*unit.nanometer"
,
()),
(
"*"
,
"setDefaultSurfaceTension"
)
:
(
None
,
(
"unit.bar*unit.nanometer"
,)),
(
"*"
,
"getDefaultTemperature"
)
:
(
"unit.kelvin"
,
()),
(
"*"
,
"getDefaultTemperature"
)
:
(
"unit.kelvin"
,
()),
(
"*"
,
"setDefaultTemperature"
)
:
(
None
,
(
"unit.kelvin"
,)),
(
"*"
,
"getErrorTolerance"
)
:
(
None
,
()),
(
"*"
,
"getErrorTolerance"
)
:
(
None
,
()),
(
"*"
,
"getEwaldErrorTolerance"
)
:
(
None
,
()),
(
"*"
,
"getEwaldErrorTolerance"
)
:
(
None
,
()),
(
"*"
,
"getFriction"
)
:
(
"1/unit.picosecond"
,
()),
(
"*"
,
"getFriction"
)
:
(
"1/unit.picosecond"
,
()),
...
@@ -459,6 +462,7 @@ UNITS = {
...
@@ -459,6 +462,7 @@ UNITS = {
(
"System"
,
"getVirtualSite"
)
:
(
None
,
()),
(
"System"
,
"getVirtualSite"
)
:
(
None
,
()),
(
"DrudeLangevinIntegrator"
,
"getDrudeTemperature"
)
:
(
"unit.kelvin"
,
()),
(
"DrudeLangevinIntegrator"
,
"getDrudeTemperature"
)
:
(
"unit.kelvin"
,
()),
(
"DrudeLangevinIntegrator"
,
"getMaxDrudeDistance"
)
:
(
"unit.nanometer"
,
()),
(
"DrudeLangevinIntegrator"
,
"getMaxDrudeDistance"
)
:
(
"unit.nanometer"
,
()),
(
"MonteCarloMembraneBarostat"
,
"MonteCarloMembraneBarostat"
)
:
(
None
,
(
"unit.bar"
,
"unit.bar*unit.nanometer"
,
"unit.kelvin"
,
None
,
None
,
None
)),
(
"MonteCarloMembraneBarostat"
,
"getXYMode"
)
:
(
None
,
()),
(
"MonteCarloMembraneBarostat"
,
"getXYMode"
)
:
(
None
,
()),
(
"MonteCarloMembraneBarostat"
,
"getZMode"
)
:
(
None
,
()),
(
"MonteCarloMembraneBarostat"
,
"getZMode"
)
:
(
None
,
()),
(
"DrudeLangevinIntegrator"
,
"getDrudeFriction"
)
:
(
"1/unit.picosecond"
,
()),
(
"DrudeLangevinIntegrator"
,
"getDrudeFriction"
)
:
(
"1/unit.picosecond"
,
()),
...
...
wrappers/python/tests/TestAPIUnits.py
View file @
c1e5ec2f
...
@@ -1176,6 +1176,28 @@ class TestAPIUnits(unittest.TestCase):
...
@@ -1176,6 +1176,28 @@ class TestAPIUnits(unittest.TestCase):
self
.
assertEqual
(
force
.
getDefaultTemperature
(),
298.15
*
kelvin
)
self
.
assertEqual
(
force
.
getDefaultTemperature
(),
298.15
*
kelvin
)
self
.
assertAlmostEqualUnit
(
force
.
getDefaultCollisionFrequency
(),
1
/
picosecond
)
self
.
assertAlmostEqualUnit
(
force
.
getDefaultCollisionFrequency
(),
1
/
picosecond
)
def
testMonteCarloMembraneBarostat
(
self
):
""" Tests the MonteCarloMembraneBarostat API features """
force
=
MonteCarloMembraneBarostat
(
1.0
,
1.5
,
300
,
MonteCarloMembraneBarostat
.
XYAnisotropic
,
MonteCarloMembraneBarostat
.
ZFixed
,
25
)
self
.
assertEqual
(
force
.
getDefaultPressure
(),
1.0
*
bar
)
self
.
assertEqual
(
force
.
getDefaultSurfaceTension
(),
1.5
*
bar
*
nanometer
)
self
.
assertEqual
(
force
.
getDefaultTemperature
(),
300
*
kelvin
)
self
.
assertEqual
(
force
.
getXYMode
(),
MonteCarloMembraneBarostat
.
XYAnisotropic
)
self
.
assertEqual
(
force
.
getZMode
(),
MonteCarloMembraneBarostat
.
ZFixed
)
self
.
assertEqual
(
force
.
getFrequency
(),
25
)
force
=
MonteCarloMembraneBarostat
(
1.1
*
bar
,
2.0
*
bar
*
nanometer
,
350
*
kelvin
,
MonteCarloMembraneBarostat
.
XYAnisotropic
,
MonteCarloMembraneBarostat
.
ZFixed
,
25
)
self
.
assertEqual
(
force
.
getDefaultPressure
(),
1.1
*
bar
)
self
.
assertEqual
(
force
.
getDefaultSurfaceTension
(),
2.0
*
bar
*
nanometer
)
self
.
assertEqual
(
force
.
getDefaultTemperature
(),
350
*
kelvin
)
force
.
setDefaultPressure
(
1.2
*
bar
)
force
.
setDefaultSurfaceTension
(
2.5
*
bar
*
nanometer
)
force
.
setDefaultTemperature
(
298.15
)
self
.
assertEqual
(
force
.
getDefaultPressure
(),
1.2
*
bar
)
self
.
assertEqual
(
force
.
getDefaultSurfaceTension
(),
2.5
*
bar
*
nanometer
)
self
.
assertEqual
(
force
.
getDefaultTemperature
(),
298.15
*
kelvin
)
def
testDrudeSCFIntegrator
(
self
):
def
testDrudeSCFIntegrator
(
self
):
""" Tests the DrudeSCFIntegrator API features """
""" Tests the DrudeSCFIntegrator API features """
integrator
=
DrudeSCFIntegrator
(
0.002
)
integrator
=
DrudeSCFIntegrator
(
0.002
)
...
...
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