248 self.
fOut.write(
"\n/* Declare factories */\n\n")
249 modelSubclassList = []
250 integratorSubclassList = []
251 tabulatedFunctionSubclassList = []
252 for classNode
in findNodes(self.
doc.getroot(),
"compounddef", kind=
"class", prot=
"public"):
253 className =
getText(
"compoundname", classNode)
255 if (className.split(
"::")[-1],)
in self.
skipMethods:
257 for baseNodePnt
in findNodes(classNode,
"basecompoundref", prot=
"public"):
258 if "refid" in baseNodePnt.attrib:
259 baseNodeID=baseNodePnt.attrib[
"refid"]
261 baseName =
getText(
"compoundname", baseNode)
262 if baseName ==
'OpenMM::Model':
263 modelSubclassList.append(shortClassName)
264 elif baseName
in (
'OpenMM::Integrator'):
265 integratorSubclassList.append(shortClassName)
266 elif baseName ==
'OpenMM::TabulatedFunction':
267 tabulatedFunctionSubclassList.append(shortClassName)
269 self.
fOut.write(
"%factory(OpenMM::Model& OpenMM::System::getForce")
270 for name
in sorted(modelSubclassList):
271 self.
fOut.write(
",\n OpenMM::%s" % name)
272 self.
fOut.write(
");\n\n")
274 self.
fOut.write(
"%factory(OpenMM::Model* OpenMM_XmlSerializer__cloneForce")
275 for name
in sorted(modelSubclassList):
276 self.
fOut.write(
",\n OpenMM::%s" % name)
277 self.
fOut.write(
");\n\n")
279 self.
fOut.write(
"%factory(OpenMM::Model* OpenMM_XmlSerializer__deserializeForce")
280 for name
in sorted(modelSubclassList):
281 self.
fOut.write(
",\n OpenMM::%s" % name)
282 self.
fOut.write(
");\n\n")
284 self.
fOut.write(
"%factory(OpenMM::Model& OpenMM::CustomCVForce::getCollectiveVariable")
285 for name
in sorted(modelSubclassList):
286 self.
fOut.write(
",\n OpenMM::%s" % name)
287 self.
fOut.write(
");\n\n")
289 self.
fOut.write(
"%factory(OpenMM::Integrator* OpenMM_XmlSerializer__cloneIntegrator")
290 for name
in sorted(integratorSubclassList):
291 self.
fOut.write(
",\n OpenMM::%s" % name)
292 self.
fOut.write(
");\n\n")
294 self.
fOut.write(
"%factory(OpenMM::Integrator* OpenMM_XmlSerializer__deserializeIntegrator")
295 for name
in sorted(integratorSubclassList):
296 self.
fOut.write(
",\n OpenMM::%s" % name)
297 self.
fOut.write(
");\n\n")
299 self.
fOut.write(
"%factory(OpenMM::Integrator& OpenMM::Context::getIntegrator")
300 for name
in sorted(integratorSubclassList):
301 self.
fOut.write(
",\n OpenMM::%s" % name)
302 self.
fOut.write(
");\n\n")
304 self.
fOut.write(
"%factory(OpenMM::Integrator& OpenMM::CompoundIntegrator::getIntegrator")
305 for name
in sorted(integratorSubclassList):
306 self.
fOut.write(
",\n OpenMM::%s" % name)
307 self.
fOut.write(
");\n\n")
309 self.
fOut.write(
"%factory(OpenMM::TabulatedFunction* OpenMM_XmlSerializer__cloneTabulatedFunction")
310 for name
in sorted(tabulatedFunctionSubclassList):
311 self.
fOut.write(
",\n OpenMM::%s" % name)
312 self.
fOut.write(
");\n\n")
314 self.
fOut.write(
"%factory(OpenMM::TabulatedFunction* OpenMM_XmlSerializer__deserializeTabulatedFunction")
315 for name
in sorted(tabulatedFunctionSubclassList):
316 self.
fOut.write(
",\n OpenMM::%s" % name)
317 self.
fOut.write(
");\n\n")
321 for items
in methodList:
322 (shortClassName, memberNode,
323 shortMethDefinition, methName,
324 isConstructors, isDestructor, templateType, templateName) = items
325 if shortMethDefinition ==
'TabulatedFunction& getTabulatedFunction':
326 self.
fOut.write(
"%factory(OpenMM::TabulatedFunction& OpenMM::")
327 self.
fOut.write(
"%s::%s" % (shortClassName, methName))
328 for name
in sorted(tabulatedFunctionSubclassList):
329 self.
fOut.write(
",\n OpenMM::%s" % name)
330 self.
fOut.write(
");\n\n")
332 self.
fOut.write(
"%factory(OpenMM::VirtualSite& OpenMM::System::getVirtualSite, OpenMM::TwoParticleAverageSite, OpenMM::ThreeParticleAverageSite, OpenMM::OutOfPlaneSite, OpenMM::LocalCoordinatesSite);\n\n")
333 self.
fOut.write(
"\n")
422 for items
in methodList:
423 (shortClassName, memberNode,
424 shortMethDefinition, methName,
425 isConstructors, isDestructor, templateType, templateName) = items
427 mArgsstring =
getText(
"argsstring", memberNode)
429 pExceptions =
" %s" %
getText(
'exceptions', memberNode)
432 self.
fOut.write(
"%s%s%s%s;\n" % (INDENT, shortMethDefinition,
433 mArgsstring, pExceptions))
435 for items
in methodList:
436 (shortClassName, memberNode,
437 shortMethDefinition, methName,
438 isConstructors, isDestructor, templateType, templateName) = items
440 mArgsstring =
getText(
"argsstring", memberNode)
442 pExceptions =
" %s" %
getText(
'exceptions', memberNode)
445 self.
fOut.write(
"%s%s%s%s;\n" % (INDENT, shortMethDefinition,
446 mArgsstring, pExceptions))
449 self.
fOut.write(
"\n")
450 methodsWithOutputArgs = set()
451 for items
in methodList:
453 (shortClassName, memberNode,
454 shortMethDefinition, methName,
455 isConstructors, isDestructor, templateType, templateName) = items
456 if isConstructors
or isDestructor:
continue
458 key = (shortClassName, methName)
460 self.
fOut.write(
'%%feature("autodoc", "%s") %s;\n' %
464 for pNode
in paramList:
468 pType =
getText(
'type/ref', pNode)
469 pName =
getText(
'declname', pNode)
470 key = (shortClassName, methName, pName)
471 if pType.find(
'&')>=0
and \
472 'const' not in pType.split():
474 eType = pType.split()[0]
477 simpleType = re.sub(eType,
'int', pType)
480 self.
fOut.write(
"%s%%apply %s OUTPUT { %s %s };\n" %
481 (INDENT, simpleType, pType, pName))
482 clearOutput =
"%s%s%%clear %s %s;\n" \
483 % (clearOutput, INDENT, pType, pName)
484 methodsWithOutputArgs.add((shortClassName, methName))
486 mArgsstring =
getText(
"argsstring", memberNode)
488 pExceptions =
" %s" %
getText(
'exceptions', memberNode)
491 if memberNode.attrib[
"virt"].strip()!=
'non-virtual':
492 if 'virtual' not in shortMethDefinition.split():
493 shortMethDefinition=
"virtual %s" % shortMethDefinition
494 if( len(templateType) > 0 ):
495 self.
fOut.write(
"%stemplate<%s %s> %s%s%s;\n" % (INDENT, templateType, templateName, shortMethDefinition, mArgsstring, pExceptions))
497 self.
fOut.write(
"%s%s%s%s;\n" % (INDENT, shortMethDefinition, mArgsstring, pExceptions))
499 self.
fOut.write(clearOutput)
502 for items
in methodList:
503 (shortClassName, memberNode,
504 shortMethDefinition, methName,
505 isConstructors, isDestructor, templateType, templateName) = items
506 paramList =
findNodes(memberNode,
'param')
512 mArgsstring =
getText(
"argsstring", memberNode)
517%pythonprepend OpenMM::{shortClassName}::{methName}{mArgsstring} %{{{{{{0}}
518%}}}}'''.format(shortClassName=shortClassName, methName=methName, mArgsstring=mArgsstring)
520 key = (shortClassName, methName)
521 for argNum
in self.
configModule.STEAL_OWNERSHIP.get(key, []):
522 argName =
getText(
'declname', paramList[argNum])
525 if not {argName}.thisown:
526 s = ("the %s object does not own its corresponding OpenMM object"
527 % self.__class__.__name__)
528 raise Exception(s)'''.format(argName=argName)
532 if key
not in methodsWithOutputArgs:
539 if len(argUnits) > 0
and isConstructors:
542 for i, units
in enumerate(argUnits):
543 if units
is not None:
545 argName =
'args[%s]' % i
547 argName =
getText(
'declname', paramList[i])
549 if unit.is_quantity({argName}):
550 {argName} = {argName}.value_in_unit({units})'''.format(argName=argName, units=units)
552 for argNum
in self.
configModule.REQUIRE_ORDERED_SET.get(key, []):
553 argName =
getText(
'declname', paramList[argNum])
556 {argName} = list({argName})'''.format(argName=argName)
563 key = (shortClassName, methName)
567 returnType =
getText(
"type", memberNode)
573 elif methName.startswith(
'get')
and returnType
not in (
'void',
'int',
'bool',
'std::string',
'const std::string &'):
574 s =
'do not know how to add units to %s %s::%s' \
575 % (returnType, shortClassName, methName)
578 valueUnits=[
None, ()]
581 if valueUnits[0]
is not None:
582 sys.stdout.write(
"%s.%s() returns %s\n" %
583 (shortClassName, methName, valueUnits[0]))
584 if len(valueUnits[1])>0:
585 addText =
"%s%sval[%d]=unit.Quantity(val[%d], %s)\n" \
591 addText =
"%s%sval=unit.Quantity(val, %s)\n" \
592 % (addText, INDENT, valueUnits[0])
594 for vUnit
in valueUnits[1]:
595 if vUnit
is not None and key
in methodsWithOutputArgs:
596 addText =
"%s%sval[%s]=unit.Quantity(val[%s], %s)\n" \
597 % (addText, INDENT, index, index, vUnit)
602 argName =
getText(
'declname', paramList[argNum])
603 addText =
"%s%s%s.thisown=0\n" \
604 % (addText, INDENT, argName)
611 for pNode
in paramList:
615 pType =
getText(
'type/ref', pNode)
618 defaultValue =
getText(
'defval', pNode)
621 if defaultValue !=
"":
622 defaultValue =
"=%s" %defaultValue
623 pName =
getText(
'declname', pNode)
624 self.
fOutPythonappend.write(
"%s%s %s%s" % (sepChar, pType, pName, defaultValue))
627 if pType.find(
'&')>=0
and \
628 'const' not in pType.split()
and \
630 len(valueUnits[1])>0:
632 unitType=valueUnits[1][outputIndex]
634 s =
"missing unit type for %s.%s() arg named %s" \
635 % (shortClassName, methName, pName)
637 sys.stdout.write(
"%s.%s() returns %s as %s\n" %
638 (shortClassName, methName,
641 if memberNode.attrib[
"const"]==
"yes":
652 for items
in methodList:
653 (shortClassName, memberNode,
654 shortMethDefinition, methName,
655 isConstructors, isDestructor, templateType, templateName ) = items
658 signatureParams =
findNodes(memberNode,
'param')
659 assert len(
findNodes(memberNode,
'detaileddescription')) == 1
660 dNode =
findNodes(memberNode,
'detaileddescription')[0]
663 description=
getText(
'para', dNode)
667 params =
findNodes(dNode,
'para/parameterlist/parameteritem')
669 paramString = [
'Parameters',
'----------']
670 returnString = [
'Returns',
'-------']
673 if len(signatureParams) != len(params):
674 raise ValueError(
'docstring in %s.%s does not match the signature' % (shortClassName, methName))
676 for pNode, pSignatureNode
in zip(params, signatureParams):
677 parameterNameNode =
findNodes(pNode,
'parameternamelist/parametername')[0]
678 argDoc =
getText(
'parameterdescription/para', pNode)
682 isOutput = parameterNameNode.get(
'direction') ==
'out'
684 returnString.extend([
'%s : %s' % (argName, argType),
' %s' % argDoc])
686 paramString.extend([
'%s : %s' % (argName, argType),
' %s' % argDoc])
689 returnSection =
findNodes(dNode,
'para/simplesect')
690 if len(returnSection) > 0:
691 returnNode = returnSection[0]
692 if returnNode.get(
'kind') ==
'return':
695 returnString.extend([argType,
' %s' %
getNodeText(returnNode).strip()])
698 ([description] + [
'']
if len(description) > 0
else []) +
699 (paramString + [
'']
if len(paramString) > 2
else []) +
700 (returnString
if len(returnString) > 2
else [])).strip()
702 dString = re.sub(
r'([^\\])"',
r'\g<1>\"', dString)
703 s =
'%%feature("docstring") OpenMM::%s::%s "%s";' \
704 % (shortClassName, methName, dString)