def simulateHestonModel( T, N, R, mu, kappa, vBar, sigmaV, rho, x0, v0 ) : deltaT = T / (float)(N - 1) x = [af.constant(x0, R, dtype=af.Dtype.f32), af.constant(0, R, dtype=af.Dtype.f32)] v = [af.constant(v0, R, dtype=af.Dtype.f32), af.constant(0, R, dtype=af.Dtype.f32)] sqrtDeltaT = math.sqrt(deltaT) sqrtOneMinusRhoSquare = math.sqrt(1-rho**2) m = af.constant(0, 2, dtype=af.Dtype.f32) m[0] = rho m[1] = sqrtOneMinusRhoSquare zeroArray = af.constant(0, R, 1, dtype=af.Dtype.f32) for t in range(1, N) : tPrevious = (t + 1) % 2 tCurrent = t % 2 dBt = af.randn(R, 2, dtype=af.Dtype.f32) * sqrtDeltaT vLag = af.maxof(v[tPrevious], zeroArray) sqrtVLag = af.sqrt(vLag) x[tCurrent] = x[tPrevious] + (mu - 0.5 * vLag) * deltaT + sqrtVLag * dBt[:, 0] v[tCurrent] = vLag + kappa * (vBar - vLag) * deltaT + sigmaV * (sqrtVLag * af.matmul(dBt, m)) return (x[tCurrent], af.maxof(v[tCurrent], zeroArray))
def black_scholes(S, X, R, V, T): # S = Underlying stock price # X = Strike Price # R = Risk free rate of interest # V = Volatility # T = Time to maturity d1 = af.log(S / X) d1 = d1 + (R + (V * V) * 0.5) * T d1 = d1 / (V * af.sqrt(T)) d2 = d1 - (V * af.sqrt(T)) cnd_d1 = cnd(d1) cnd_d2 = cnd(d2) C = S * cnd_d1 - (X * af.exp((-R) * T) * cnd_d2) P = X * af.exp((-R) * T) * (1 - cnd_d2) - (S * (1 -cnd_d1)) return (C, P)
def band_energy(p1, p2): if (p_space_grid == 'cartesian'): p_x = p1 p_y = p2 elif (p_space_grid == 'polar2D'): p_x = p1 * af.cos(p2) p_y = p1 * af.sin(p2) else: raise NotImplementedError('Unsupported coordinate system in p_space') p = af.sqrt(p_x**2. + p_y**2.) E_upper = p * fermi_velocity af.eval(E_upper) return (E_upper)
def initialize_f(q1, q2, p1, p2, p3, params): m = params.mass k = params.boltzmann_constant rho_b = params.rho_background T_b = params.temperature_background p1_bulk = params.p1_bulk_background p2_bulk = params.p2_bulk_background p3_bulk = params.p3_bulk_background pert_real = params.pert_real pert_imag = params.pert_imag k_q1 = params.k_q1 k_q2 = params.k_q2 # Calculating the perturbed density: rho = rho_b + (pert_real * af.cos(k_q1 * q1 + k_q2 * q2) - pert_imag * af.sin(k_q1 * q1 + k_q2 * q2)) # Depending on the dimensionality in velocity space, the # distribution function is assigned accordingly: if (params.p_dim == 3): f = rho * (m / (2 * np.pi * k * T_b))**(3 / 2) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T_b)) \ * af.exp(-m * (p2 - p2_bulk)**2 / (2 * k * T_b)) \ * af.exp(-m * (p3 - p3_bulk)**2 / (2 * k * T_b)) elif (params.p_dim == 2): f = rho * (m / (2 * np.pi * k * T_b)) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T_b)) \ * af.exp(-m * (p2 - p2_bulk)**2 / (2 * k * T_b)) else: f = rho * af.sqrt(m / (2 * np.pi * k * T_b)) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T_b)) af.eval(f) return (f)
def band_velocity(p1, p2): # Note :This function is only meant to be called once to initialize the vel vectors p_x, p_y = get_p_x_and_p_y(p1, p2) p = af.sqrt(p_x**2. + p_y**2.) p_hat = [p_x / (p + 1e-20), p_y / (p + 1e-20)] if (fermi_surface_shape == 'circle'): v_f_hat = p_hat elif (fermi_surface_shape == 'hexagon'): # Need to get theta for normal_to_hexagon_unit_vec() if (p_space_grid == 'cartesian'): p_x_local = p1 p_y_local = p2 theta = af.atan(p_y_local / p_x_local) elif (p_space_grid == 'polar2D'): # In polar2D coordinates, p1 = radius and p2 = theta r = p1 theta = p2 else: raise NotImplementedError( 'Unsupported coordinate system in p_space') v_f_hat = normal_to_hexagon_unit_vec(theta) # Quadratic dispersion m = effective_mass(p1, p2) v_f = p / m if (dispersion == 'linear' or zero_temperature): v_f = fermi_velocity upper_band_velocity = [v_f * v_f_hat[0], v_f * v_f_hat[1]] return (upper_band_velocity)
def sqrt_det_g(q1, q2, q1_start_local_left=None, q2_start_local_bottom=None): jac = jacobian_dx_dq(q1, q2, q1_start_local_left, q2_start_local_bottom) dx_dq1 = jac[0][0] dx_dq2 = jac[0][1] dy_dq1 = jac[1][0] dy_dq2 = jac[1][1] g_11 = (dx_dq1)**2. + (dy_dq1)**2. g_12 = dx_dq1 * dx_dq2 + dy_dq1 * dy_dq2 g_21 = g_12 g_22 = (dx_dq2)**2. + (dy_dq2)**2. det_g = g_11 * g_22 - g_12 * g_21 return (af.sqrt(det_g))
def band_velocity(p1, p2): if (p_space_grid == 'cartesian'): p_x = p1 p_y = p2 elif (p_space_grid == 'polar2D'): p_x = p1 * af.cos(p2) p_y = p1 * af.sin(p2) else : raise NotImplementedError('Unsupported coordinate system in p_space') p = af.sqrt(p_x**2. + p_y**2.) p_hat = [p_x / (p + 1e-20), p_y / (p + 1e-20)] v_f = fermi_velocity upper_band_velocity = [ v_f * p_hat[0], v_f * p_hat[1]] af.eval(upper_band_velocity[0], upper_band_velocity[1]) return(upper_band_velocity)
def sqrt_det_g(q1, q2): jac = jacobian_dx_dq(q1, q2) dx_dq1 = jac[0][0] dx_dq2 = jac[0][1] dy_dq1 = jac[1][0] dy_dq2 = jac[1][1] g_11 = (dx_dq1)**2. + (dy_dq1)**2. g_12 = dx_dq1 * dx_dq2 + dy_dq1 * dy_dq2 g_21 = g_12 g_22 = (dx_dq2)**2. + (dy_dq2)**2. det_g = g_11 * g_22 - g_12 * g_21 return (af.sqrt(det_g))
def initialize_f(q1, q2, p1, p2, p3, params): m = params.mass_particle k = params.boltzmann_constant rho_b = params.rho_background T_b = params.temperature_background # Calculating the perturbed density: rho = rho_b + 0.01 * af.exp(-(q1 - 0.5)**2 - (q2 - 0.5)**2) T = T_b + 0.01 * af.exp(-(q1 - 0.5)**2 - (q2 - 0.5)**2) p1_bulk = 0.01 * af.exp(-(q1 - 0.5)**2 - (q2 - 0.5)**2) p2_bulk = 0.01 * af.exp(-(q1 - 0.5)**2 - (q2 - 0.5)**2) p3_bulk = 0.01 * af.exp(-(q1 - 0.5)**2 - (q2 - 0.5)**2) # Depending on the dimensionality in velocity space, the # distribution function is assigned accordingly: if (params.p_dim == 3): f = rho_b * (m / (2 * np.pi * k * T))**(3 / 2) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T)) \ * af.exp(-m * (p2 - p2_bulk)**2 / (2 * k * T)) \ * af.exp(-m * (p3 - p3_bulk)**2 / (2 * k * T)) elif (params.p_dim == 2): f = rho_b * (m / (2 * np.pi * k * T)) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T)) \ * af.exp(-m * (p2 - p2_bulk)**2 / (2 * k * T)) else: f = rho_b \ * af.sqrt(m / (2 * np.pi * k * T)) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T)) af.eval(f) return (f)
def f0(p1, p2, p3, n, T, p1_bulk, p2_bulk, p3_bulk, params): """Return the Local MB distribution.""" m = params.mass_particle k = params.boltzmann_constant if (params.p_dim == 3): f0 = n * (m / (2 * np.pi * k * T))**(3 / 2) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T)) \ * af.exp(-m * (p2 - p2_bulk)**2 / (2 * k * T)) \ * af.exp(-m * (p3 - p3_bulk)**2 / (2 * k * T)) elif (params.p_dim == 2): f0 = n * (m / (2 * np.pi * k * T)) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T)) \ * af.exp(-m * (p2 - p2_bulk)**2 / (2 * k * T)) else: f0 = n * af.sqrt(m / (2 * np.pi * k * T)) \ * af.exp(-m * (p1 - p1_bulk)**2 / (2 * k * T)) af.eval(f0) return (f0)
def simulateHestonModel(T, N, R, mu, kappa, vBar, sigmaV, rho, x0, v0): deltaT = T / (float)(N - 1) x = [ af.constant(x0, R, dtype=af.Dtype.f32), af.constant(0, R, dtype=af.Dtype.f32) ] v = [ af.constant(v0, R, dtype=af.Dtype.f32), af.constant(0, R, dtype=af.Dtype.f32) ] sqrtDeltaT = math.sqrt(deltaT) sqrtOneMinusRhoSquare = math.sqrt(1 - rho**2) m = af.constant(0, 2, dtype=af.Dtype.f32) m[0] = rho m[1] = sqrtOneMinusRhoSquare zeroArray = af.constant(0, R, 1, dtype=af.Dtype.f32) for t in range(1, N): tPrevious = (t + 1) % 2 tCurrent = t % 2 dBt = af.randn(R, 2, dtype=af.Dtype.f32) * sqrtDeltaT vLag = af.maxof(v[tPrevious], zeroArray) sqrtVLag = af.sqrt(vLag) x[tCurrent] = x[tPrevious] + ( mu - 0.5 * vLag) * deltaT + sqrtVLag * dBt[:, 0] v[tCurrent] = vLag + kappa * (vBar - vLag) * deltaT + sigmaV * ( sqrtVLag * af.matmul(dBt, m)) return (x[tCurrent], af.maxof(v[tCurrent], zeroArray))
def simple_arith(verbose=False): display_func = _util.display_func(verbose) print_func = _util.print_func(verbose) a = af.randu(3, 3) b = af.constant(4, 3, 3) display_func(a) display_func(b) c = a + b d = a d += b display_func(c) display_func(d) display_func(a + 2) display_func(3 + a) c = a - b d = a d -= b display_func(c) display_func(d) display_func(a - 2) display_func(3 - a) c = a * b d = a d *= b display_func(c * 2) display_func(3 * d) display_func(a * 2) display_func(3 * a) c = a / b d = a d /= b display_func(c / 2.0) display_func(3.0 / d) display_func(a / 2) display_func(3 / a) c = a % b d = a d %= b display_func(c % 2.0) display_func(3.0 % d) display_func(a % 2) display_func(3 % a) c = a**b d = a d **= b display_func(c**2.0) display_func(3.0**d) display_func(a**2) display_func(3**a) display_func(a < b) display_func(a < 0.5) display_func(0.5 < a) display_func(a <= b) display_func(a <= 0.5) display_func(0.5 <= a) display_func(a > b) display_func(a > 0.5) display_func(0.5 > a) display_func(a >= b) display_func(a >= 0.5) display_func(0.5 >= a) display_func(a != b) display_func(a != 0.5) display_func(0.5 != a) display_func(a == b) display_func(a == 0.5) display_func(0.5 == a) a = af.randu(3, 3, dtype=af.Dtype.u32) b = af.constant(4, 3, 3, dtype=af.Dtype.u32) display_func(a & b) display_func(a & 2) c = a c &= 2 display_func(c) display_func(a | b) display_func(a | 2) c = a c |= 2 display_func(c) display_func(a >> b) display_func(a >> 2) c = a c >>= 2 display_func(c) display_func(a << b) display_func(a << 2) c = a c <<= 2 display_func(c) display_func(-a) display_func(+a) display_func(~a) display_func(a) display_func(af.cast(a, af.Dtype.c32)) display_func(af.maxof(a, b)) display_func(af.minof(a, b)) display_func(af.rem(a, b)) a = af.randu(3, 3) - 0.5 b = af.randu(3, 3) - 0.5 display_func(af.abs(a)) display_func(af.arg(a)) display_func(af.sign(a)) display_func(af.round(a)) display_func(af.trunc(a)) display_func(af.floor(a)) display_func(af.ceil(a)) display_func(af.hypot(a, b)) display_func(af.sin(a)) display_func(af.cos(a)) display_func(af.tan(a)) display_func(af.asin(a)) display_func(af.acos(a)) display_func(af.atan(a)) display_func(af.atan2(a, b)) c = af.cplx(a) d = af.cplx(a, b) display_func(c) display_func(d) display_func(af.real(d)) display_func(af.imag(d)) display_func(af.conjg(d)) display_func(af.sinh(a)) display_func(af.cosh(a)) display_func(af.tanh(a)) display_func(af.asinh(a)) display_func(af.acosh(a)) display_func(af.atanh(a)) a = af.abs(a) b = af.abs(b) display_func(af.root(a, b)) display_func(af.pow(a, b)) display_func(af.pow2(a)) display_func(af.sigmoid(a)) display_func(af.exp(a)) display_func(af.expm1(a)) display_func(af.erf(a)) display_func(af.erfc(a)) display_func(af.log(a)) display_func(af.log1p(a)) display_func(af.log10(a)) display_func(af.log2(a)) display_func(af.sqrt(a)) display_func(af.cbrt(a)) a = af.round(5 * af.randu(3, 3) - 1) b = af.round(5 * af.randu(3, 3) - 1) display_func(af.factorial(a)) display_func(af.tgamma(a)) display_func(af.lgamma(a)) display_func(af.iszero(a)) display_func(af.isinf(a / b)) display_func(af.isnan(a / a)) a = af.randu(5, 1) b = af.randu(1, 5) c = af.broadcast(lambda x, y: x + y, a, b) display_func(a) display_func(b) display_func(c) @af.broadcast def test_add(aa, bb): return aa + bb display_func(test_add(a, b))
def sqrt(x): if isinstance(x, afnumpy.ndarray): s = arrayfire.sqrt(x.d_array) return afnumpy.ndarray(x.shape, dtype=pu.typemap(s.dtype()), af_array=s) else: return numpy.sqrt(x)
def sqrt(arr): return af.sqrt(arr)
a = af.abs(a) b = af.abs(b) af.display(af.root(a, b)) af.display(af.pow(a, b)) af.display(af.pow2(a)) af.display(af.exp(a)) af.display(af.expm1(a)) af.display(af.erf(a)) af.display(af.erfc(a)) af.display(af.log(a)) af.display(af.log1p(a)) af.display(af.log10(a)) af.display(af.log2(a)) af.display(af.sqrt(a)) af.display(af.cbrt(a)) a = af.round(5 * af.randu(3,3) - 1) b = af.round(5 * af.randu(3,3) - 1) af.display(af.factorial(a)) af.display(af.tgamma(a)) af.display(af.lgamma(a)) af.display(af.iszero(a)) af.display(af.isinf(a/b)) af.display(af.isnan(a/a)) a = af.randu(5, 1) b = af.randu(1, 5) c = af.broadcast(lambda x,y: x+y, a, b)
def simple_arith(verbose = False): display_func = _util.display_func(verbose) print_func = _util.print_func(verbose) a = af.randu(3,3,dtype=af.Dtype.u32) b = af.constant(4, 3, 3, dtype=af.Dtype.u32) display_func(a) display_func(b) c = a + b d = a d += b display_func(c) display_func(d) display_func(a + 2) display_func(3 + a) c = a - b d = a d -= b display_func(c) display_func(d) display_func(a - 2) display_func(3 - a) c = a * b d = a d *= b display_func(c * 2) display_func(3 * d) display_func(a * 2) display_func(3 * a) c = a / b d = a d /= b display_func(c / 2.0) display_func(3.0 / d) display_func(a / 2) display_func(3 / a) c = a % b d = a d %= b display_func(c % 2.0) display_func(3.0 % d) display_func(a % 2) display_func(3 % a) c = a ** b d = a d **= b display_func(c ** 2.0) display_func(3.0 ** d) display_func(a ** 2) display_func(3 ** a) display_func(a < b) display_func(a < 0.5) display_func(0.5 < a) display_func(a <= b) display_func(a <= 0.5) display_func(0.5 <= a) display_func(a > b) display_func(a > 0.5) display_func(0.5 > a) display_func(a >= b) display_func(a >= 0.5) display_func(0.5 >= a) display_func(a != b) display_func(a != 0.5) display_func(0.5 != a) display_func(a == b) display_func(a == 0.5) display_func(0.5 == a) display_func(a & b) display_func(a & 2) c = a c &= 2 display_func(c) display_func(a | b) display_func(a | 2) c = a c |= 2 display_func(c) display_func(a >> b) display_func(a >> 2) c = a c >>= 2 display_func(c) display_func(a << b) display_func(a << 2) c = a c <<= 2 display_func(c) display_func(-a) display_func(+a) display_func(~a) display_func(a) display_func(af.cast(a, af.Dtype.c32)) display_func(af.maxof(a,b)) display_func(af.minof(a,b)) display_func(af.rem(a,b)) a = af.randu(3,3) - 0.5 b = af.randu(3,3) - 0.5 display_func(af.abs(a)) display_func(af.arg(a)) display_func(af.sign(a)) display_func(af.round(a)) display_func(af.trunc(a)) display_func(af.floor(a)) display_func(af.ceil(a)) display_func(af.hypot(a, b)) display_func(af.sin(a)) display_func(af.cos(a)) display_func(af.tan(a)) display_func(af.asin(a)) display_func(af.acos(a)) display_func(af.atan(a)) display_func(af.atan2(a, b)) c = af.cplx(a) d = af.cplx(a,b) display_func(c) display_func(d) display_func(af.real(d)) display_func(af.imag(d)) display_func(af.conjg(d)) display_func(af.sinh(a)) display_func(af.cosh(a)) display_func(af.tanh(a)) display_func(af.asinh(a)) display_func(af.acosh(a)) display_func(af.atanh(a)) a = af.abs(a) b = af.abs(b) display_func(af.root(a, b)) display_func(af.pow(a, b)) display_func(af.pow2(a)) display_func(af.exp(a)) display_func(af.expm1(a)) display_func(af.erf(a)) display_func(af.erfc(a)) display_func(af.log(a)) display_func(af.log1p(a)) display_func(af.log10(a)) display_func(af.log2(a)) display_func(af.sqrt(a)) display_func(af.cbrt(a)) a = af.round(5 * af.randu(3,3) - 1) b = af.round(5 * af.randu(3,3) - 1) display_func(af.factorial(a)) display_func(af.tgamma(a)) display_func(af.lgamma(a)) display_func(af.iszero(a)) display_func(af.isinf(a/b)) display_func(af.isnan(a/a)) a = af.randu(5, 1) b = af.randu(1, 5) c = af.broadcast(lambda x,y: x+y, a, b) display_func(a) display_func(b) display_func(c) @af.broadcast def test_add(aa, bb): return aa + bb display_func(test_add(a, b))
a = af.abs(a) b = af.abs(b) af.display(af.root(a, b)) af.display(af.pow(a, b)) af.display(af.pow2(a)) af.display(af.exp(a)) af.display(af.expm1(a)) af.display(af.erf(a)) af.display(af.erfc(a)) af.display(af.log(a)) af.display(af.log1p(a)) af.display(af.log10(a)) af.display(af.log2(a)) af.display(af.sqrt(a)) af.display(af.cbrt(a)) a = af.round(5 * af.randu(3, 3) - 1) b = af.round(5 * af.randu(3, 3) - 1) af.display(af.factorial(a)) af.display(af.tgamma(a)) af.display(af.lgamma(a)) af.display(af.iszero(a)) af.display(af.isinf(a / b)) af.display(af.isnan(a / a)) a = af.randu(5, 1) b = af.randu(1, 5) c = af.broadcast(lambda x, y: x + y, a, b)