# Note that the functions load, store, and meta are not checked here since they
# depend on their environments
# @COPYRIGHT@
[docs]def showtype(i):
if type(i) is int:
return 'length-%i array' % i
else:
return str(i)
[docs]class Syntax(object):
[docs] def check(self, child_types):
if not len(child_types) in self.arg_lengths:
raise TypeError('Number of arguments to %s must be in the set %s' %
(self.name, str(list(self.arg_lengths))))
(expectArgs, ret) = self.expecter(child_types)
for i in range(len(expectArgs)):
if expectArgs[i] != child_types[i]:
raise TypeError(
'Expected %s as argument %i to %s based on the types of other arguments, but received %s'
% (showtype(expectArgs[i]), i + 1, self.name,
showtype(child_types[i])))
return ret
[docs]class SimpleSyntax(Syntax):
[docs] def __init__(self, name, ret_type, arg_types):
self.name = name
self.ret_type = ret_type
self.args = arg_types
self.arg_lengths = set([len(self.args)])
[docs] def expecter(self, child_types):
args = self.args # for convenience
d = {}
expectArgs = []
def typeConvert(d, a):
if isinstance(a, str) or a >= 0:
return a
else:
return d[a]
for i in range(len(args)):
if isinstance(child_types[i], str) \
and not isinstance(args[i], str):
raise TypeError('Unexpected string to argument %i of %s' %
(i + 1, self.name))
if isinstance(args[i], int) and args[i] < 0:
d[args[i]] = child_types[i]
expectArgs.append(typeConvert(d, args[i]))
return (expectArgs, typeConvert(d, self.ret_type))
[docs]class ThreadSyntax(Syntax):
[docs] def __init__(self, name):
self.name = name
self.arg_lengths = set([1])
[docs] def expecter(self, child_types):
a = child_types[0]
if isinstance(type(a), str):
raise TypeError('Unexpected string to threaded function %s' %
self.name)
return ([a], a)
[docs]class BinaryThreadSyntax(Syntax):
[docs] def __init__(self, name):
self.name = name
self.arg_lengths = set([2])
[docs] def expecter(self, child_types):
a = child_types[0]
b = child_types[1]
if isinstance(type(a), str) or isinstance(type(b), str):
raise TypeError('Unexpected string to binary threaded function %s' %
self.name)
if a == 1:
return ([a, b], b)
if b == 1:
return ([a, b], a)
return ([a, a], a)
[docs]class ArraySyntax(Syntax):
[docs] def __init__(self):
self.name = 'array'
[docs] def check(self, child_types):
for t in child_types:
if isinstance(type(t), str):
raise TypeError('Unexpected string to "array" function')
return sum(child_types)
[docs]class RMSDSyntax(Syntax):
[docs] def __init__(self):
self.name = 'rmsd'
self.arg_lengths = set([2, 4])
[docs] def expecter(self, child_types):
argtypes = [3 * child_types[1], child_types[1]]
if len(child_types) == 3:
argtypes.append(child_types[1])
return (argtypes, 1)
[docs]def getFcnSigs():
FcnSigs = {}
def AddSyntax(syn):
FcnSigs[syn.name] = syn
AddSyntax(ArraySyntax())
AddSyntax(MetaSyntax())
AddSyntax(RMSDSyntax())
AddSyntax(ThreadSyntax('sqrt'))
AddSyntax(ThreadSyntax('sin'))
AddSyntax(ThreadSyntax('cos'))
AddSyntax(ThreadSyntax('acos'))
AddSyntax(ThreadSyntax('log'))
AddSyntax(ThreadSyntax('exp'))
AddSyntax(ThreadSyntax('sign'))
AddSyntax(ThreadSyntax('mass'))
AddSyntax(BinaryThreadSyntax('+'))
AddSyntax(BinaryThreadSyntax('-'))
AddSyntax(BinaryThreadSyntax('*'))
AddSyntax(BinaryThreadSyntax('/'))
AddSyntax(BinaryThreadSyntax('atan2'))
AddSyntax(BinaryThreadSyntax('mod'))
AddSyntax(BinaryThreadSyntax('^'))
AddSyntax(SimpleSyntax('print', -1, ['string', -1]))
AddSyntax(SimpleSyntax('angle', 1, [3, 3]))
AddSyntax(SimpleSyntax('angle_radians', 1, [3, 3]))
AddSyntax(SimpleSyntax('angle_gid', 1, [1, 1, 1]))
AddSyntax(SimpleSyntax('angle_gid_radians', 1, [1, 1, 1]))
AddSyntax(SimpleSyntax('dihedral', 2, [3, 3, 3]))
AddSyntax(SimpleSyntax('dihedral_radians', 1, [3, 3, 3]))
AddSyntax(SimpleSyntax('dihedral_gid', 2, [1, 1, 1, 1]))
AddSyntax(SimpleSyntax('dihedral_gid_radians', 1, [1, 1, 1, 1]))
AddSyntax(SimpleSyntax('pow', -1, [-1, -2]))
AddSyntax(SimpleSyntax('cross', 3, [3, 3]))
AddSyntax(SimpleSyntax('delta', 3, [1, 1]))
AddSyntax(SimpleSyntax('dist', 1, [1, 1]))
AddSyntax(SimpleSyntax('dot', 1, [-1, -1]))
AddSyntax(SimpleSyntax('elem', 1, [-1, 1]))
AddSyntax(SimpleSyntax('length', 1, [-1]))
AddSyntax(SimpleSyntax('min', 1, [-1]))
AddSyntax(SimpleSyntax('max', 1, [-1]))
AddSyntax(SimpleSyntax('min_image', 3, [3]))
AddSyntax(SimpleSyntax('norm2', 1, [-1]))
AddSyntax(SimpleSyntax('norm', 1, [-1]))
AddSyntax(SimpleSyntax('pos', 3, [1]))
AddSyntax(SimpleSyntax('sum', 1, [-1]))
AddSyntax(SimpleSyntax('time', 1, []))
AddSyntax(SimpleSyntax('pos_inner_prod', 3, [-1, -1]))
AddSyntax(SimpleSyntax('center_of_mass', 3, [-1]))
AddSyntax(SimpleSyntax('center_of_geometry', 3, [-1]))
AddSyntax(SimpleSyntax('ncoordination', 1, [1, 1, 1, -1, -2]))
AddSyntax(SimpleSyntax('contact_map', 1, [1, -1]))
AddSyntax(SimpleSyntax('rad_gyration', 1, [-1]))
AddSyntax(SimpleSyntax('rmsd_torsion', 1, [-1, -2]))
AddSyntax(SimpleSyntax('helix', 1, [1, -1, -2]))
AddSyntax(SimpleSyntax('gibbs_min', 1, [1, -1]))
AddSyntax(SimpleSyntax('gibbs_max', 1, [1, -1]))
AddSyntax(SimpleSyntax('whim', 3, [-1, -1]))
return FcnSigs