def summand(k): exp_arg = -((dim - 1 - 2 * k)**2) / 2 / variances erf_arg_2 = (gs.pi * variances - (dim - 1 - 2 * k) * 1j) / gs.sqrt(2 * variances) sign = (-1.0)**k comb_2 = gs.comb(k, dim - 1) return sign * comb_2 * gs.exp(exp_arg) * gs.real(gs.erf(erf_arg_2))
def _normalization_factor_odd_dim(self, variances): """Compute the normalization factor - odd dimension.""" dim = self.dim half_dim = int((dim + 1) / 2) area = 2 * gs.pi**half_dim / math.factorial(half_dim - 1) comb = gs.comb(dim - 1, half_dim - 1) erf_arg = gs.sqrt(variances / 2) * gs.pi first_term = (area / (2**dim - 1) * comb * gs.sqrt(gs.pi / (2 * variances)) * gs.erf(erf_arg)) def summand(k): exp_arg = -((dim - 1 - 2 * k)**2) / 2 / variances erf_arg_2 = (gs.pi * variances - (dim - 1 - 2 * k) * 1j) / gs.sqrt(2 * variances) sign = (-1.0)**k comb_2 = gs.comb(k, dim - 1) return sign * comb_2 * gs.exp(exp_arg) * gs.real(gs.erf(erf_arg_2)) if half_dim > 2: sum_term = gs.sum( gs.stack([summand(k)] for k in range(half_dim - 2))) else: sum_term = summand(0) coef = area / 2 / erf_arg * gs.pi**0.5 * (-1.0)**(half_dim - 1) return first_term + coef / 2**(dim - 2) * sum_term
def summand(k): exp_arg = -((dim - 1 - 2 * k)**2) / 2 / variances erf_arg_1 = (dim - 1 - 2 * k) * 1j / gs.sqrt(2 * variances) erf_arg_2 = (gs.pi * variances - (dim - 1 - 2 * k) * 1j) / gs.sqrt(2 * variances) sign = (-1.0)**k comb = gs.comb(dim - 1, k) erf_terms = gs.imag(gs.erf(erf_arg_2) + gs.erf(erf_arg_1)) return sign * comb * gs.exp(exp_arg) * erf_terms