def helper(self, *args, **kwargs): if any(needsSampling(arg) for arg in itertools.chain(args, kwargs.values())): return VectorMethodDistribution(method, self, args, kwargs) elif any(needsLazyEvaluation(arg) for arg in itertools.chain(args, kwargs.values())): # see analogous comment in distributionFunction return makeDelayedFunctionCall(helper, (self,) + args, kwargs) else: return method(self, *args, **kwargs)
def handler2(self, *args): if needsSampling(self): return VectorOperatorDistribution(op, self, args) elif any(needsSampling(arg) for arg in args): return VectorMethodDistribution(method, self, args, {}) elif any(needsLazyEvaluation(arg) for arg in args): # see analogous comment in distributionFunction return makeDelayedFunctionCall(handler2, args, {}) else: return method(self, *args)
def helper(*args): if needsSampling(instance): return VectorOperatorDistribution(op, instance, args) elif any(needsSampling(arg) for arg in args): return VectorMethodDistribution(method, instance, args, {}) elif any(needsLazyEvaluation(arg) for arg in args): # see analogous comment in distributionFunction return makeDelayedFunctionCall(helper, args, {}) else: return wrapped(*args)
def helper(*args, **kwargs): args = tuple(toDistribution(arg) for arg in args) kwargs = { name: toDistribution(arg) for name, arg in kwargs.items() } if any(needsSampling(arg) for arg in itertools.chain(args, kwargs.values())): return MethodDistribution(method, instance, args, kwargs) elif any(needsLazyEvaluation(arg) for arg in itertools.chain(args, kwargs.values())): # see analogous comment in distributionFunction return makeDelayedFunctionCall(helper, args, kwargs) else: return wrapped(*args, **kwargs)
def helper(*args, **kwargs): args = tuple(toDistribution(arg) for arg in args) kwargs = { name: toDistribution(arg) for name, arg in kwargs.items() } if any(needsSampling(arg) for arg in itertools.chain(args, kwargs.values())): return FunctionDistribution(wrapped, args, kwargs, support, valueType) elif any(needsLazyEvaluation(arg) for arg in itertools.chain(args, kwargs.values())): # recursively call this helper (not the original function), since the # delayed arguments may evaluate to distributions, in which case we'll # have to make a FunctionDistribution return makeDelayedFunctionCall(helper, args, kwargs) else: return wrapped(*args, **kwargs)