def save_gauss_function_test():
    points = DataSet.import_dataset(
        './datasets/Feynman_with_units/cut/I.6.2a-1000')

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     200, 220)
    test_derivations(planes, calc_1_6_20_a, verbose=True)
    plane_creator.write_plane(planes, './chosen_datasets/gauss_200_220')
    DataSet.write_dataset(points, './chosen_points_datasets/gauss_200_220')
def save_moved_circle():
    r, xc, yc = 6, 1, 2
    points = generate_circle_points(1000, r, xc, yc)
    func = circle_func(r, xc, yc)

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     100, 150)
    test_derivations(planes, func, verbose=False)
    #plane_creator.write_plane(planes, './chosen_datasets/moved_circle_6_1_2_100_150')
    DataSet.write_dataset(
        points, './chosen_points_datasets/moved_circle_6_1_2_100_150')
def generate_harmonic_oscillator_nonlinear_points_test():
    dataset = DataSet.import_dataset('./datasets/hmo_nl')
    points = dataset.data
    dataset_points = []
    for point in points:
        x = point[0]
        x_dot = point[1]
        x_dot_dot = 0.25 * x_dot * math.sin(x) + 11.4 * math.cos(x)
        dataset_points.append([x, x_dot, x_dot_dot])

    return DataSet(dataset_points)
def save_moved_ellipse():
    ra, rb, xc, yc = 2.5, 5, 3, 4.5
    points = generate_ellipse_points(1000, ra, rb, xc, yc)
    func = ellipse_func(ra, rb, xc, yc)

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     150, 200)
    test_derivations(planes, func, verbose=False)
    plane_creator.write_plane(
        planes, './chosen_datasets/moved_ellipse_2.5_5_3_4.5_100_150')
    DataSet.write_dataset(
        points, './chosen_points_datasets/moved_ellipse_2.5_5_3_4.5_100_150')
def save_sphere():
    radius = 5
    points = DataSet(generate_sphere(radius, 30))
    sphere_func = sphere_calc_func(radius, 0, 0, 0)

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     250, 300)
    test_derivations(planes, sphere_func, verbose=False)
    plane_creator.write_plane(planes, './chosen_datasets/sphere_5_0_0_250_300')
def gauss_function_test(low, high):
    points = DataSet.import_dataset(
        './datasets/Feynman_with_units/cut/I.6.2a-1000')

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     low, high)
    #plot_kernel_with_dataset3D(points)
    error = test_derivations(planes, calc_1_6_20_a, verbose=False)
    return error
def only_points_dataset(low, high):
    points = DataSet.import_dataset('./datasets/Feynman_with_units/cut/I.18.4')
    calc_func = calc_1_18_4

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     low, high)
    #plot_kernel_with_dataset3D(points)
    error = test_derivations(planes, calc_func, verbose=False)
    return error
def generate_ellipse_points(no_points, ra, rb, xc, yc):
    points = []
    for i in range(no_points):
        t = random.random()
        angle = 2 * math.pi * t
        x = math.cos(angle) * ra + xc
        y = math.sin(angle) * rb + yc
        points.append([x, y])
    return DataSet(points)
def generate_square_points(no_points, low_range, high_range):
    points = []
    for i in range(no_points):
        point = []
        var = random.random() * (high_range - low_range) + low_range
        point.append(var)
        point.append(var * var)
        points.append(point)

    return DataSet(points)
def sphere_test(low, high):
    radius = 5
    points = DataSet(generate_sphere(radius, 20))
    sphere_func = sphere_calc_func(radius, 0, 0, 0)

    planes = DataPreprocessor.get_planes_for_dataset(plane_creator, points,
                                                     low, high)
    #plot_kernel_with_dataset3D(points)
    error = test_derivations(planes, sphere_func, verbose=False)
    return error
def generate_circle_points(no_points, radius, xc, yc):
    points = []
    for i in range(no_points):
        t = random.random()
        angle = 2 * math.pi * t
        x = math.cos(angle) * radius + xc
        y = math.sin(angle) * radius + yc
        points.append([x, y])

    return DataSet(points)
def generate_hyperbola_points(no_points, low_range, high_range):
    points = []
    for i in range(no_points):
        x = random.random() * (high_range - low_range) + low_range
        y_squared = x**3 + x - 1.5
        y = math.sqrt(y_squared)
        points.append([x, -y])
        points.append([x, y])
        i += 1

    return DataSet(points)
def generate_harmonic_oscillator_points(no_points, low_range, high_range):
    points = []
    for i in range(no_points):
        t = random.random() * (high_range - low_range) + low_range
        x = math.exp(0.05 * t) * (math.cos(1.73133 * t) -
                                  0.0288795 * math.sin(1.73133 * t))
        x_dot = math.exp(0.05 * t) * (5.5265 * 10e-8 * math.cos(1.73133 * t) -
                                      1.73277 * math.sin(1.73133 * t))
        x_dot_dot = -3 * x + 0.1 * x_dot
        points.append([x, x_dot, x_dot_dot])

    return DataSet(points)
def generate_linear_points1(no_points, low_range, high_range):
    points = []
    for i in range(no_points):
        point = []
        mult = 1.0
        for j in range(2):
            var = random.random() * (high_range - low_range) + low_range
            point.append(var)
            mult *= var
        point.append(mult)
        points.append(point)

    return DataSet(points)
                    test_bench(plane_creator, src_filename, calc_func)


if __name__ == '__main__':
    dataset_name = "I.6.2a"
    calc_func = calc_1_6_20_a
    no_samples = 1000
    lows = [10, 20, 30, 40, 50, 60, 100, 200, 300]
    highs = [20, 30, 40, 50, 60, 70, 150, 250, 350]
    plane_creator = MultiDimEllipseCreator()

    cut = True
    process = True
    calc_error = True
    verbose = False

    original_filename = f"./datasets/Feynman_with_units/original/{dataset_name}"
    cut_filename = f"./datasets/Feynman_with_units/cut/{dataset_name}-{no_samples}"

    if cut:
        DataSet.cut_dataset(original_filename, cut_filename, no_samples)
    for low, high in zip(lows, highs):
        processed_filename = f"./poc/{dataset_name}-{no_samples}-{low}-{high}"
        if process:
            DataPreprocessor.preprocess_dataset(plane_creator, cut_filename,
                                                low, high, processed_filename)
        if calc_error:
            test_bench(plane_creator,
                       processed_filename,
                       calc_func,
                       verbose=verbose)