Source code for schrodinger.application.desmond.enhanced_sampling.FcnTypes

# 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 MetaSyntax(Syntax):
[docs] def __init__(self): self.name = 'meta' self.arg_lengths = set([3])
[docs] def expecter(self, child_types): t = child_types[2] if isinstance(type(t), str): raise TypeError('Invalid string to meta') return ([1, 1 + t, t], 1)
[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