import numpy as np
from numba import njit


@njit
def dp_formula_with_numba(a: np.ndarray, b: float, x: np.ndarray):
    """ formula dp """
    q = a**.5
    print((b - 1) / q)
    print((b - 1) / (a**.5))
    term1 = np.arcsinh((b - 1) / (a ** .5))
    return ((1 - b) * np.arcsinh(b / (a ** .5)) - ((b ** 2 - 2 * b + a + 1) ** .5) + ((b ** 2 + a) ** .5) +
            term1 * (b - 1)) * ((1 - x ** 2) ** .5)


def dp_formula(a, b, x):
    """ formula dp """
    print((b -1)/ (a**.5))
    term1 = np.arcsinh((b - 1) / (a ** .5))
    return ((1 - b) * np.arcsinh(b / (a ** .5)) - ((b ** 2 - 2 * b + a + 1) ** .5) + ((b ** 2 + a) ** .5) +
            term1 * (b - 1)) * ((1 - x ** 2) ** .5)


Nx = 7
Nint = int(Nx/2)
XX1 = np.arange(0, Nint + 1) / Nint
XX1[0] = 0.0025
XX1[Nint] = 0.9999
b_int = 0
a_int = (0.25 * XX1) ** 2
print("a_int: " + str(a_int) + "   dtype:" + str(a_int.dtype) + "   type:" + str(type(a_int)))
print("b_int: " + str(b_int) + "   type:" + str(type(b_int)))
print("XX1: " + str(XX1) + "   dtype:" + str(XX1.dtype) + "   type:" + str(type(XX1)))
print()
print()
w_numba = dp_formula_with_numba(a_int, b_int, XX1)
w = dp_formula(a_int, b_int, XX1)
print("")
print('With numba: ' + str(w_numba))
print('With numpy: ' + str(w))