def exp(inp): if isinstance(inp, ooarray): return ooarray([exp(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(exp(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.exp(inp) return oofun(st_exp, inp, d = lambda x: Diag(np.exp(x)), vectorized = True, criticalPoints = False)
def arcsinh(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([arcsinh(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(arcsinh(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.arcsinh(inp) return oofun(st_arcsinh, inp, d = lambda x: Diag(1.0/np.sqrt(1+x**2)), vectorized = True, criticalPoints = False)
def abs(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([abs(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(abs(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.abs(inp) return oofun(st_abs, inp, d = lambda x: Diag(np.sign(x)), vectorized = True, _interval_ = ZeroCriticalPointsInterval(inp, np.abs))
def log2(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([log2(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(log2(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.log2(inp) r = oofun(st_log2, inp, d = lambda x: Diag(INV_LOG_2/x), vectorized = True, _interval_ = log_interval(np.log2, inp)) r.attach((inp>1e-300)('log2_domain_zero_bound_%d' % r._id, tol=-1e-7)) return r
def sin(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([sin(elem) for elem in inp]) elif hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(sin(inp.values), inp.probabilities.copy())._update(inp) elif not isinstance(inp, oofun): return np.sin(inp) return oofun(st_sin, inp, d = lambda x: Diag(np.cos(x)), vectorized = True, criticalPoints = TrigonometryCriticalPoints)
def sign(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([sign(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(sign(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.sign(inp) r = oofun(st_sign, inp, vectorized = True, d = lambda x: 0.0) r.criticalPoints = False return r
def arccosh(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([arccosh(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(arccosh(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.arccosh(inp) r = oofun(st_arccosh, inp, d = lambda x: Diag(1.0/np.sqrt(x**2-1.0)), vectorized = True) F0, shift = 0.0, 1.0 r._interval_ = lambda domain, dtype: nonnegative_interval(inp, np.arccosh, domain, dtype, F0, shift) return r
def arctanh(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([arctanh(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(arctanh(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.arctanh(inp) r = oofun(st_arctanh, inp, d = lambda x: Diag(1.0/(1.0-x**2)), vectorized = True, criticalPoints = False) r.getDefiniteRange = get_box1_DefiniteRange r._interval_ = lambda domain, dtype: box_1_interval(inp, np.arctanh, domain, dtype, -np.inf, np.inf) return r
def tan(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([tan(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(tan(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.tan(inp) # TODO: move it outside of tan definition def interval(*args): raise 'interval for tan is unimplemented yet' r = oofun(st_tan, inp, d = lambda x: Diag(1.0 / np.cos(x) ** 2), vectorized = True, interval = interval) return r
def arccos(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([arccos(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(arccos(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.arccos(inp) r = oofun(st_arccos, inp, d = lambda x: Diag(-1.0 / np.sqrt(1.0 - x**2)), vectorized = True) r.getDefiniteRange = get_box1_DefiniteRange F_l, F_u = np.arccos((-1, 1)) r._interval_ = lambda domain, dtype: box_1_interval(inp, np.arccos, domain, dtype, F_l, F_u) r.attach((inp>-1)('arccos_domain_lower_bound_%d' % r._id, tol=-1e-7), (inp<1)('arccos_domain_upper_bound_%d' % r._id, tol=-1e-7)) return r
def sqrt(inp, attachConstraints = True): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([sqrt(elem) for elem in inp]) if hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(sqrt(inp.values), inp.probabilities.copy())._update(inp) if not isinstance(inp, oofun): return np.sqrt(inp) # def fff(x): # print x # return np.sqrt(x) r = oofun(st_sqrt, inp, d = lambda x: Diag(0.5 / np.sqrt(x)), vectorized = True) F0 = 0.0 r._interval_ = lambda domain, dtype: nonnegative_interval(inp, np.sqrt, domain, dtype, F0) if attachConstraints: r.attach((inp>0)('sqrt_domain_zero_bound_%d' % r._id, tol=-1e-7)) return r
# #if not isinstance(inp, oofun): return np.sin(inp) # def d(x): # return np.cos(x) # return oofun(lambda x: np.sin(x), inp, d = d) try: import distribution hasStochastic = True except: hasStochastic = False #hasStochastic = False st_sin = (lambda x: \ distribution.stochasticDistribution(sin(x.values), x.probabilities.copy())._update(x) \ if isinstance(x, distribution.stochasticDistribution)\ else np.array([sin(elem) for elem in x.flat]).view(multiarray) if isinstance(x, multiarray) and isinstance(x.flat[0], distribution.stochasticDistribution) else np.sin(x))\ if hasStochastic\ else np.sin def sin(inp): if isinstance(inp, ooarray) and any([isinstance(elem, oofun) for elem in atleast_1d(inp)]): return ooarray([sin(elem) for elem in inp]) elif hasStochastic and isinstance(inp, distribution.stochasticDistribution): return distribution.stochasticDistribution(sin(inp.values), inp.probabilities.copy())._update(inp) elif not isinstance(inp, oofun): return np.sin(inp) return oofun(st_sin, inp, d = lambda x: Diag(np.cos(x)), vectorized = True, criticalPoints = TrigonometryCriticalPoints)