diff --git a/.github/workflows/discovery.yml b/.github/workflows/discovery.yml new file mode 100644 index 00000000..0298c382 --- /dev/null +++ b/.github/workflows/discovery.yml @@ -0,0 +1,46 @@ +name: EPDE Discovery (slow) tests + +on: + workflow_dispatch: + +jobs: + discovery: + runs-on: ubuntu-latest + timeout-minutes: 360 + + strategy: + fail-fast: false + matrix: + python-version: ["3.11"] + operator: ["DeepXDEBasedFitness", "PIC", "L2LRFitness"] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install torch + echo "PYTHONPATH=$PYTHONPATH:$(pwd)" >> $GITHUB_ENV + + - name: Run discovery tests + run: | + pytest tests/functional/ -m functional \ + --discovery --report \ + --operators ${{ matrix.operator }} \ + --ignore=tests/functional/tests/test_ns.py \ + --timeout=3600 + + - name: Upload reports + uses: actions/upload-artifact@v4 + if: always() + with: + name: reports-${{ matrix.operator }} + path: reports/ diff --git a/.github/workflows/test-functional.yml b/.github/workflows/test-functional.yml new file mode 100644 index 00000000..0e3546a5 --- /dev/null +++ b/.github/workflows/test-functional.yml @@ -0,0 +1,47 @@ +name: EPDE Core Tests + +on: + workflow_dispatch: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + test: + name: pytest (${{ matrix.python-version }}) / ${{ matrix.split }} + runs-on: ubuntu-latest + timeout-minutes: 30 + + strategy: + fail-fast: false + matrix: + python-version: ["3.11"] + operator: ["L2LRFitness"] + split: [1, 2, 3, 4] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install torch + pip install pytest-xdist pytest-split pytest-timeout + echo "PYTHONPATH=$PYTHONPATH:$(pwd)" >> $GITHUB_ENV + + - name: Run split tests + run: | + pytest tests/functional/ \ + --splits 4 --group ${{ matrix.split }} \ + --durations=20 \ + --timeout=600 \ + -m "not slow" \ + --operators ${{ matrix.operator }} diff --git a/.gitignore b/.gitignore index 9904af17..35075865 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ coverage.xml *.py,cover .hypothesis/ .pytest_cache/ +reports/ # Translations *.mo diff --git a/epde/integrate/deepxde_integration.py b/epde/integrate/deepxde_integration.py index f1aa347b..c334fa6f 100644 --- a/epde/integrate/deepxde_integration.py +++ b/epde/integrate/deepxde_integration.py @@ -9,6 +9,8 @@ import deepxde as dde from abc import ABC, abstractmethod +os.makedirs(os.path.expanduser('~/.deepxde'), exist_ok=True) + class SolverStrategy(ABC): @abstractmethod def solve(self, eq_list: List[Equation], var_names: List[str], diff --git a/epde/operators/utils/parameters/default_parameters_multi_objective.json b/epde/operators/utils/parameters/default_parameters_multi_objective.json index 6fa1c831..c513e429 100644 --- a/epde/operators/utils/parameters/default_parameters_multi_objective.json +++ b/epde/operators/utils/parameters/default_parameters_multi_objective.json @@ -30,10 +30,20 @@ "penalty_coeff" : 0.2, "pinn_loss_mult" : 1e4 }, - "DeepXDEBasedFitness" : { - "penalty_coeff" : 0.2, - "pinn_loss_mult" : 1e4 - }, + "DeepXDEBasedFitness": { + "deepxde_config": { + "net": [95, 100, 95], + "activation": "tanh", + "optimizer": "adam", + "lr": 1e-3, + "num_domain": 1000, + "num_boundary": 200, + "num_initial": 200, + "epochs": 2000 + }, + "penalty_coeff": 0.2, + "error_metric": "rmse" + }, "ParetoLevelsCrossover" : { }, diff --git a/projects/pic/data/ac/ac.py b/projects/pic/data/ac/ac.py index aaad1e69..72e2d85c 100644 --- a/projects/pic/data/ac/ac.py +++ b/projects/pic/data/ac/ac.py @@ -78,15 +78,13 @@ def prepare_suboperators(fitness_operator: CompoundOperator, operator_params: di sparsity = LASSOSparsity() coeff_calc = LinRegBasedCoeffsEquation() - # sparsity = map_operator_between_levels(sparsity, 'gene level', 'chromosome level') - # coeff_calc = map_operator_between_levels(coeff_calc, 'gene level', 'chromosome level') - - fitness_operator.set_suboperators({'sparsity': sparsity, - 'coeff_calc': coeff_calc}) - fitness_cond = lambda x: not getattr(x, 'fitness_calculated') + fitness_operator.set_suboperators({'sparsity': sparsity, 'coeff_calc': coeff_calc}) fitness_operator.params = operator_params - fitness_operator = map_operator_between_levels(fitness_operator, 'gene level', 'chromosome level', - objective_condition=fitness_cond) + + if 'chromosome level' not in fitness_operator._tags: + fitness_cond = lambda x: not getattr(x, 'fitness_calculated') + fitness_operator = map_operator_between_levels(fitness_operator, 'gene level', 'chromosome level', + objective_condition=fitness_cond) return fitness_operator def ac_data(filename: str): @@ -98,6 +96,14 @@ def ac_data(filename: str): return grids, data +def get_pic_network_summary(operator): + if operator.adapter is None or operator.adapter.net is None: + return None + net = operator.adapter.net + total_params = sum(p.numel() for p in net.parameters()) + layers = [str(layer) for layer in net.layers] if hasattr(net, 'layers') else [] + return {'total_parameters': total_params, 'layers': layers} + def AC_test(operator: CompoundOperator, foldername: str, noise_level: int = 0): # Test scenario to evaluate performance on Allen-Cahn equation eq_ac_symbolic = '0.0001 * d^2u/dx1^2{power: 1.0} + -5.0 * u{power: 3.0} + 5.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' @@ -172,40 +178,45 @@ def ac_discovery(foldername, noise_level): if __name__ == "__main__": import torch from epde.operators.utils.default_parameter_loader import EvolutionaryParams + global_var.solution_guess_nn = None print(torch.cuda.is_available()) print(f"CUDA version linked with PyTorch: {torch.version.cuda}") # Operator = fitness.SolverBasedFitness # Replace by the developed PIC-based operator. - # Operator = fitness.PIC - #Operator = fitness.L2LRFitness - Operator = fitness.DeepXDEBasedFitness + #Operator = fitness.PIC + Operator = fitness.L2LRFitness + #Operator = fitness.DeepXDEBasedFitness params = EvolutionaryParams() - #operator_params = params.get_default_params_for_operator('DiscrepancyBasedFitnessWithCV') #{"penalty_coeff": 0.2, "pinn_loss_mult": 1e4} - try: - operator_params = params.get_default_params_for_operator('DeepXDEBasedFitness') - except Exception as e: - print(f"Предупреждение: не удалось загрузить параметры для DeepXDEBasedFitness: {e}") - print("Использую ручную конфигурацию.") - operator_params = { - "deepxde_config": { - "net": [50, 50, 50], - "activation": "tanh", - "optimizer": "adam", - "lr": 1e-3, - "num_domain": 1000, - "num_boundary": 200, - "num_initial": 200, - "iterations": 2 - }, - "penalty_coeff": 0.2, - "error_metric": "rmse" - } + operator_params = params.get_default_params_for_operator('DiscrepancyBasedFitnessWithCV') #{"penalty_coeff": 0.2, "pinn_loss_mult": 1e4} + #operator_params = params.get_default_params_for_operator('PIC') + + # try: + # operator_params = params.get_default_params_for_operator('DeepXDEBasedFitness') + # except Exception as e: + # print(f"Предупреждение: не удалось загрузить параметры для DeepXDEBasedFitness: {e}") + # print("Использую ручную конфигурацию.") + # operator_params = { + # "deepxde_config": { + # "net": [50, 50, 50], + # "activation": "tanh", + # "optimizer": "adam", + # "lr": 1e-3, + # "num_domain": 1000, + # "num_boundary": 200, + # "num_initial": 200, + # "iterations": 2 + # }, + # "penalty_coeff": 0.2, + # "error_metric": "rmse" + # } print('operator_params ', operator_params) + fit_operator = prepare_suboperators(Operator(list(operator_params.keys())), operator_params) + #get_pic_network_summary(fit_operator) # Paths directory = os.path.dirname(os.path.realpath(__file__)) ac_folder_name = os.path.join(directory) - #AC_test(fit_operator, ac_folder_name, 0) - ac_discovery(ac_folder_name, 0) + AC_test(fit_operator, ac_folder_name, 0) + # ac_discovery(ac_folder_name, 0) diff --git a/projects/pic/data/burgers/burgers.py b/projects/pic/data/burgers/burgers.py index 2943a3d5..f09c8176 100644 --- a/projects/pic/data/burgers/burgers.py +++ b/projects/pic/data/burgers/burgers.py @@ -49,6 +49,9 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, for var in all_vars: correct_eq.vals[var].main_var_to_explain = var correct_eq.vals[var].metaparameters = metaparams + correct_eq.vals[var].weights_internal = np.ones(len(correct_eq.vals[var].structure) - 1) + correct_eq.vals[var].weights_internal_evald = True + correct_eq.vals[var].weights_final_evald = True print(correct_eq.text_form) incorrect_eq = translate_equation(eq_incorrect_symbolic, search_obj.pool, @@ -56,6 +59,9 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, for var in all_vars: incorrect_eq.vals[var].main_var_to_explain = var incorrect_eq.vals[var].metaparameters = metaparams + incorrect_eq.vals[var].weights_internal = np.ones(len(incorrect_eq.vals[var].structure) - 1) + incorrect_eq.vals[var].weights_internal_evald = True + incorrect_eq.vals[var].weights_final_evald = True print(incorrect_eq.text_form) fit_operator.apply(correct_eq, {}) @@ -109,8 +115,8 @@ def burgers_data(filename: str): def burgers_sindy_test(operator: CompoundOperator, foldername: str, noise_level: int = 0): # Test scenario to evaluate performance on Allen-Cahn equation - eq_burgers_symbolic = '0.0001 * d^2u/dx1^2{power: 1.0} + -5.0 * u{power: 3.0} + 5.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' - eq_burgers_incorrect = '-1.0 * d^2u/dx0^2{power: 1.0} + 1.5 * u{power: 1.0} + -0.0 = du/dx0{power: 1.0}' + eq_burgers_symbolic = '-1.0 * u{power: 1.0} * du/dx1{power: 1.0} + 0.01 * d^2u/dx1^2{power: 1.0} + 0.0 = du/dx0{power: 1.0}' + eq_burgers_incorrect = '0.02 * d^2u/dx1^2{power: 1.0} + -0.98 * u{power: 1.0} * du/dx1{power: 1.0} + 0.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' grid, data = burgers_sindy_data(os.path.join(foldername, 'burgers.mat')) noised_data = noise_data(data, noise_level) @@ -240,6 +246,6 @@ def burgers_sindy_discovery(foldername, noise_level): directory = os.path.dirname(os.path.realpath(__file__)) burgers_folder_name = os.path.join(directory) - burgers_discovery(burgers_folder_name, 0) + # burgers_discovery(burgers_folder_name, 0) # burgers_sindy_test(fit_operator, burgers_folder_name, 0) - # burgers_sindy_discovery(burgers_folder_name, 0) + burgers_sindy_discovery(burgers_folder_name, 0) diff --git a/projects/pic/data/kdv/kdv.py b/projects/pic/data/kdv/kdv.py index f31e0dd1..fab95f0a 100644 --- a/projects/pic/data/kdv/kdv.py +++ b/projects/pic/data/kdv/kdv.py @@ -26,8 +26,8 @@ def load_pretrained_PINN(ann_filename): try: - with open(ann_filename, 'rb') as data_input_file: - data_nn = pickle.load(data_input_file) + import torch + data_nn = torch.load(ann_filename, map_location=torch.device('cpu')) except FileNotFoundError: print('No model located, proceeding with ann approx. retraining.') data_nn = None @@ -47,6 +47,9 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, for var in all_vars: correct_eq.vals[var].main_var_to_explain = var correct_eq.vals[var].metaparameters = metaparams + correct_eq.vals[var].weights_internal = np.ones(len(correct_eq.vals[var].structure) - 1) + correct_eq.vals[var].weights_internal_evald = True + correct_eq.vals[var].weights_final_evald = True print(correct_eq.text_form) incorrect_eq = translate_equation(eq_incorrect_symbolic, search_obj.pool, @@ -54,6 +57,9 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, for var in all_vars: incorrect_eq.vals[var].main_var_to_explain = var incorrect_eq.vals[var].metaparameters = metaparams + incorrect_eq.vals[var].weights_internal = np.ones(len(correct_eq.vals[var].structure) - 1) + incorrect_eq.vals[var].weights_internal_evald = True + incorrect_eq.vals[var].weights_final_evald = True print(incorrect_eq.text_form) fit_operator.apply(correct_eq, {}) @@ -143,7 +149,7 @@ def KdV_test(operator: CompoundOperator, foldername: str, noise_level: int = 0): grid, data = kdv_data(os.path.join(foldername, 'data.csv')) # grid, data = kdv_data(os.path.join(foldername, 'Kdv.mat')) noised_data = noise_data(data, noise_level) - data_nn = load_pretrained_PINN(os.path.join(foldername, 'kdv_0_ann.pickle')) + data_nn = None #load_pretrained_PINN(os.path.join(foldername, 'kdv_0_ann.pickle')) print('Shapes:', data.shape, grid[0].shape) dimensionality = 1 @@ -153,7 +159,7 @@ def KdV_test(operator: CompoundOperator, foldername: str, noise_level: int = 0): epde_search_obj = EpdeSearch(use_solver = False, use_pic=True, boundary = 10, coordinate_tensors = (grid[0], grid[1]), verbose_params = {'show_iter_idx' : True}, - device = 'cuda') + device = 'cuda' if torch.cuda.is_available() else 'cpu') custom_trigonometric_eval_fun = { 'cos(t)sin(x)': lambda *grids, **kwargs: (np.cos(grids[0]) * np.sin(grids[1])) ** kwargs['power']} @@ -200,7 +206,7 @@ def KdV_h_test(operator: CompoundOperator, foldername: str, noise_level: int = 0 epde_search_obj = EpdeSearch(use_solver = False, use_pic=True, boundary = 20, coordinate_tensors = (grid[0], grid[1]), verbose_params = {'show_iter_idx' : True}, - device = 'cuda') + device = 'cuda' if torch.cuda.is_available() else 'cpu') epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) #'epochs_max': 5e4 @@ -232,7 +238,7 @@ def KdV_sga_test(operator: CompoundOperator, foldername: str, noise_level: int = epde_search_obj = EpdeSearch(use_solver = False, use_pic=True, boundary = 10, coordinate_tensors = (grid[0], grid[1]), verbose_params = {'show_iter_idx' : True}, - device = 'cuda') + device = 'cuda' if torch.cuda.is_available() else 'cpu') epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) #'epochs_max': 5e4 @@ -254,7 +260,7 @@ def kdv_discovery(foldername, noise_level): epde_search_obj = EpdeSearch(use_solver=False, use_pic=True, boundary=5, - coordinate_tensors=grid, device='cuda') + coordinate_tensors=grid, device='cuda' if torch.cuda.is_available() else 'cpu') # epde_search_obj.set_preprocessor(default_preprocessor_type='ANN', # preprocessor_kwargs={'epochs_max' : 1e3}) @@ -307,7 +313,7 @@ def kdv_h_discovery(foldername, noise_level): epde_search_obj = EpdeSearch(use_solver=False, use_pic=True, boundary=20, - coordinate_tensors=grid, device='cuda') + coordinate_tensors=grid, device='cuda' if torch.cuda.is_available() else 'cpu') # epde_search_obj.set_preprocessor(default_preprocessor_type='ANN', # preprocessor_kwargs={'epochs_max' : 1e3}) @@ -363,7 +369,7 @@ def kdv_sga_discovery(foldername, noise_level): epde_search_obj = EpdeSearch(use_solver=False, use_pic=True, boundary=20, - coordinate_tensors=grid, device='cuda') + coordinate_tensors=grid, device='cuda' if torch.cuda.is_available() else 'cpu') epde_search_obj.set_preprocessor(default_preprocessor_type='ANN', preprocessor_kwargs={'epochs_max' : 1e3}) @@ -421,7 +427,7 @@ def kdv_sindy_discovery(foldername, noise_level): epde_search_obj = EpdeSearch(use_solver=False, use_pic=True, boundary=(40, 100), - coordinate_tensors=grid, device='cuda') + coordinate_tensors=grid, device='cuda' if torch.cuda.is_available() else 'cpu') # epde_search_obj.set_preprocessor(default_preprocessor_type='ANN', # preprocessor_kwargs={'epochs_max' : 1e3}) @@ -470,8 +476,8 @@ def kdv_sindy_discovery(foldername, noise_level): from epde.operators.utils.default_parameter_loader import EvolutionaryParams print("CUDA available:", torch.cuda.is_available()) # Operator = fitness.SolverBasedFitness # Replace by the developed PIC-based operator. - # Operator = fitness.PIC - Operator = fitness.L2LRFitness + Operator = fitness.PIC + # Operator = fitness.L2LRFitness params = EvolutionaryParams() operator_params = params.get_default_params_for_operator('DiscrepancyBasedFitnessWithCV') #{"penalty_coeff": 0.2, "pinn_loss_mult": 1e4} # operator_params = {"penalty_coeff": 0.2, "pinn_loss_mult": 1e4} @@ -482,11 +488,11 @@ def kdv_sindy_discovery(foldername, noise_level): directory = os.path.dirname(os.path.realpath(__file__)) kdv_folder_name = os.path.join(directory) - # KdV_test(fit_operator, kdv_folder_name, 0) + KdV_test(fit_operator, kdv_folder_name, 0) # KdV_h_test(fit_operator, kdv_folder_name, 0) # KdV_sga_test(fit_operator, kdv_folder_name, 0) # kdv_discovery(kdv_folder_name, 0) # kdv_h_discovery(kdv_folder_name, 0) # kdv_sga_discovery(kdv_folder_name, 5) - kdv_sindy_discovery(kdv_folder_name, 0) \ No newline at end of file + # kdv_sindy_discovery(kdv_folder_name, 0) \ No newline at end of file diff --git a/projects/pic/data/lorenz/lorenz.py b/projects/pic/data/lorenz/lorenz.py index 0ff74cf6..c78e9c90 100644 --- a/projects/pic/data/lorenz/lorenz.py +++ b/projects/pic/data/lorenz/lorenz.py @@ -26,6 +26,19 @@ import scipy.io as scio +original_set_adapter = fitness.PIC.set_adapter +def patched_set_adapter(self, net=None): + from epde.integrate import SolverAdapter + compiling_params = {'mode': 'autograd', 'tol':0.01, 'lambda_bound': 100} + optimizer_params = {} + training_params = {'epochs': 1e3, 'info_string_every': 1e3} + early_stopping_params = {'patience': 4, 'no_improvement_patience': 250} + self.adapter = SolverAdapter(net=net, use_cache=False, device='cpu') + self.adapter.set_compiling_params(**compiling_params) + self.adapter.set_optimizer_params(**optimizer_params) + self.adapter.set_early_stopping_params(**early_stopping_params) + self.adapter.set_training_params(**training_params) +fitness.PIC.set_adapter = patched_set_adapter def load_pretrained_PINN(ann_filename): try: @@ -74,10 +87,14 @@ def prepare_suboperators(fitness_operator: CompoundOperator, operator_params: di sparsity = LASSOSparsity() coeff_calc = LinRegBasedCoeffsEquation() + # Поднимаем подоператоры на уровень хромосомы для работы с SoEq + sparsity = map_operator_between_levels(sparsity, 'gene level', 'chromosome level') + coeff_calc = map_operator_between_levels(coeff_calc, 'gene level', 'chromosome level') + fitness_operator.set_suboperators({'sparsity': sparsity, 'coeff_calc': coeff_calc}) fitness_operator.params = operator_params - # Применяем маппинг только для операторов уровня 'gene level' + # Маппинг самого fitness_operator if 'chromosome level' not in fitness_operator._tags: fitness_cond = lambda x: not getattr(x, 'fitness_calculated') fitness_operator = map_operator_between_levels(fitness_operator, 'gene level', 'chromosome level', @@ -156,14 +173,14 @@ def lorenz_test(fit_operator, noise_level=0): z = data[:end, 2] correct_eqs = [ - '10.0 * v{power: 1.0} + -10.0 * u{power: 1.0} = du/dx0{power: 1.0}', - '28.0 * u{power: 1.0} + -1.0 * u{power: 1.0} * w{power: 1.0} + -1.0 * v{power: 1.0} = dv/dx0{power: 1.0}', - '1.0 * u{power: 1.0} * v{power: 1.0} + -2.6666666666666665 * w{power: 1.0} = dw/dx0{power: 1.0}' + '10.0 * v{power: 1.0} + -10.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}', + '28.0 * u{power: 1.0} + -1.0 * u{power: 1.0} * w{power: 1.0} + -1.0 * v{power: 1.0} + 0.0 = dv/dx0{power: 1.0}', + '1.0 * u{power: 1.0} * v{power: 1.0} + -2.6666666666666665 * w{power: 1.0} + 0.0 = dw/dx0{power: 1.0}' ] incorrect_eqs = [ - '10.0 * v{power: 1.0} + -10.0 * u{power: 1.0} + 0.1 * u{power: 1.0} = du/dx0{power: 1.0}', - '28.0 * u{power: 1.0} + -1.0 * u{power: 1.0} * w{power: 1.0} + -1.0 * v{power: 1.0} + 0.1 * v{power: 1.0} = dv/dx0{power: 1.0}', - '1.0 * u{power: 1.0} * v{power: 1.0} + -2.6666666666666665 * w{power: 1.0} + 0.1 * w{power: 1.0} = dw/dx0{power: 1.0}' + '10.0 * v{power: 1.0} + -10.0 * u{power: 1.0} + 0.1 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}', + '28.0 * u{power: 1.0} + -1.0 * u{power: 1.0} * w{power: 1.0} + -1.0 * v{power: 1.0} + 0.1 * v{power: 1.0} + 0.0 = dv/dx0{power: 1.0}', + '1.0 * u{power: 1.0} * v{power: 1.0} + -2.6666666666666665 * w{power: 1.0} + 0.1 * w{power: 1.0} + 0.0 = dw/dx0{power: 1.0}' ] epde_search_obj = EpdeSearch( @@ -226,16 +243,17 @@ def lorenz_discovery(noise_level): return epde_search_obj - if __name__ == "__main__": import torch from epde.operators.utils.default_parameter_loader import EvolutionaryParams print(torch.cuda.is_available()) + global_var.solution_guess_nn = None # Operator = fitness.SolverBasedFitness # Replace by the developed PIC-based operator. Operator = fitness.PIC #Operator = fitness.L2LRFitness params = EvolutionaryParams() operator_params = params.get_default_params_for_operator('PIC')#'DiscrepancyBasedFitnessWithCV') #{"penalty_coeff": 0.2, "pinn_loss_mult": 1e4} + #operator_params = params.get_default_params_for_operator('DiscrepancyBasedFitnessWithCV') #{"penalty_coeff": 0.2, "pinn_loss_mult": 1e4} # Operator = fitness.DeepXDEBasedFitness # params = EvolutionaryParams() # @@ -261,5 +279,19 @@ def lorenz_discovery(noise_level): # print('operator_params ', operator_params) fit_operator = prepare_suboperators(Operator(list(operator_params.keys())), operator_params) - lorenz_discovery(0) - #lorenz_test(fit_operator, noise_level=0) + #lorenz_discovery(0) + lorenz_test(fit_operator, noise_level=0) + + + def get_pic_network_summary(operator): + if operator.adapter is None or operator.adapter.net is None: + return None + net = operator.adapter.net + total_params = sum(p.numel() for p in net.parameters()) + layers = [str(layer) for layer in net.layers] if hasattr(net, 'layers') else [] + return {'total_parameters': total_params, 'layers': layers} + + + pic_info = get_pic_network_summary(fit_operator) + print("PIC network summary:", pic_info) + diff --git a/projects/pic/data/lv/lv.py b/projects/pic/data/lv/lv.py index 51d61687..fa0821d8 100644 --- a/projects/pic/data/lv/lv.py +++ b/projects/pic/data/lv/lv.py @@ -135,4 +135,4 @@ def lv_discovery(noise_level): print('operator_params ', operator_params) fit_operator = prepare_suboperators(Operator(list(operator_params.keys())), operator_params) - lv_discovery(0) + #lv_discovery(0) diff --git a/projects/pic/data/ns/ns.py b/projects/pic/data/ns/ns.py index 081fb59a..b0ea4643 100644 --- a/projects/pic/data/ns/ns.py +++ b/projects/pic/data/ns/ns.py @@ -7,6 +7,9 @@ from typing import Tuple, List import numpy as np +import copy +from epde.interface.token_family import TFPool +from epde.structure.main_structures import SoEq, Chromosome from epde.interface.prepared_tokens import CustomTokens, PhasedSine1DTokens, ConstantToken, CustomEvaluator from epde.interface.equation_translator import translate_equation from epde.interface.interface import EpdeSearch @@ -71,6 +74,81 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, return all([correct_eq.vals[var].coefficients_stability < incorrect_eq.vals[var].coefficients_stability for var in all_vars]) +def create_equation_from_str(eq_str, target_var, base_pool, all_vars): + # Отладочная информация + print(f"\n[DEBUG] target_var = {target_var}, eq_str = {eq_str}") + print("[DEBUG] Families in pool:") + for fam in base_pool.families: + var_name = getattr(fam, 'variable', None) + tokens = getattr(fam, 'tokens', []) + print(f" variable={var_name}, tokens={tokens}, demands_equation={fam.status.get('demands_equation', False)}") + + # Сохраняем оригинальные состояния demands_equation для семейств других переменных + original_states = {} + for fam in base_pool.families: + if hasattr(fam, 'variable') and fam.variable is not None and fam.variable != target_var: + original_states[fam] = fam.status.get('demands_equation', False) + fam.status['demands_equation'] = False + try: + soeq = translate_equation(eq_str, base_pool, all_vars=[target_var]) + eq = soeq.vals[target_var] + except Exception as e: + print(f"[DEBUG] Translation failed: {e}") + raise + finally: + for fam, state in original_states.items(): + fam.status['demands_equation'] = state + return eq + +def compare_systems(correct_symbolic_list, incorrect_symbolic_list, search_obj, all_vars, fit_operator): + metaparams = {('sparsity', var): {'optimizable': False, 'value': 1E-6} for var in all_vars} + + correct_eqs = {} + for var, eq_str in zip(all_vars, correct_symbolic_list): + eq = create_equation_from_str(eq_str, var, search_obj.pool, all_vars) + eq.main_var_to_explain = var + eq.metaparameters = metaparams + eq.weights_internal = np.ones(len(eq.structure) - 1) + eq.weights_internal_evald = True + eq.weights_final_evald = True + correct_eqs[var] = eq + + correct_system = SoEq(search_obj.pool, metaparams) + correct_system.vals = Chromosome(correct_eqs, {}) + correct_system.moeadd_set = True + print("Correct system:") + print(correct_system.text_form) + + incorrect_eqs = {} + for var, eq_str in zip(all_vars, incorrect_symbolic_list): + eq = create_equation_from_str(eq_str, var, search_obj.pool, all_vars) + eq.main_var_to_explain = var + eq.metaparameters = metaparams + eq.weights_internal = np.ones(len(eq.structure) - 1) + eq.weights_internal_evald = True + eq.weights_final_evald = True + incorrect_eqs[var] = eq + + incorrect_system = SoEq(search_obj.pool, metaparams) + incorrect_system.vals = Chromosome(incorrect_eqs, {}) + incorrect_system.moeadd_set = True + print("Incorrect system:") + print(incorrect_system.text_form) + + fit_operator.apply(correct_system, {}) + fit_operator.apply(incorrect_system, {}) + + correct_stability = [correct_system.vals[var].coefficients_stability for var in all_vars] + incorrect_stability = [incorrect_system.vals[var].coefficients_stability for var in all_vars] + print("Correct stability:", correct_stability) + print("Incorrect stability:", incorrect_stability) + + correct_fitness = [correct_system.vals[var].fitness_value for var in all_vars] + incorrect_fitness = [incorrect_system.vals[var].fitness_value for var in all_vars] + print("Correct fitness:", correct_fitness) + print("Incorrect fitness:", incorrect_fitness) + + return all(cs < incs for cs, incs in zip(correct_stability, incorrect_stability)) def prepare_suboperators(fitness_operator: CompoundOperator, operator_params: dict) -> CompoundOperator: sparsity = LASSOSparsity() @@ -113,10 +191,21 @@ def ns_data(filename: str): def ns_test(operator: CompoundOperator, foldername: str, noise_level: int = 0): - # Test scenario to evaluate performance on Allen-Cahn equation - eq_ac_symbolic = '0.0001 * d^2u/dx1^2{power: 1.0} + -5.0 * u{power: 3.0} + 5.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' - eq_ac_incorrect = '4.976781518840499 * u{power: 1.0} + 0.0001 * d^2u/dx1^2{power: 1.0} + -4.974425220166616 * u{power: 3.0} + 0.0 * du/dx1{power: 1.0} * d^2u/dx0^2{power: 1.0} + 0.002262543822130977 = du/dx0{power: 1.0}' + # Базовые строки для переменной u + eq_u_correct = '0.0001 * d^2u/dx1^2{power: 1.0} + -5.0 * u{power: 3.0} + 5.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' + eq_u_incorrect = '4.976781518840499 * u{power: 1.0} + 0.0001 * d^2u/dx1^2{power: 1.0} + -4.974425220166616 * u{power: 3.0} + 0.0 * du/dx1{power: 1.0} * d^2u/dx0^2{power: 1.0} + 0.002262543822130977 = du/dx0{power: 1.0}' + + # Для v и p – заменяем u на v/p и производные соответственно + def replace_var(s, old, new): + return s.replace(f'u', new).replace(f'du/dx0', f'd{new}/dx0').replace(f'd^2u/dx1^2', f'd^2{new}/dx1^2') + + eq_v_correct = replace_var(eq_u_correct, 'u', 'v') + eq_v_incorrect = replace_var(eq_u_incorrect, 'u', 'v') + eq_p_correct = replace_var(eq_u_correct, 'u', 'p') + eq_p_incorrect = replace_var(eq_u_incorrect, 'u', 'p') + correct_system = [eq_u_correct, eq_v_correct, eq_p_correct] + incorrect_system = [eq_u_incorrect, eq_v_incorrect, eq_p_incorrect] grid, data = ns_data(os.path.join(foldername, 'cylinder_nektar_wake.mat')) # noised_data = noise_data(data, noise_level) # data_nn = load_pretrained_PINN(os.path.join(foldername, 'ac_ann_pretrained.pickle')) @@ -131,10 +220,11 @@ def ns_test(operator: CompoundOperator, foldername: str, noise_level: int = 0): epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) - epde_search_obj.create_pool(data=data, variable_names=["u", "v", "p"], max_deriv_order=(1, 2, 2), + epde_search_obj.create_pool(data=data, variable_names=["u", "v", "p"], max_deriv_order=(2, 2, 2), additional_tokens=[])#, data_nn=data_nn - assert compare_equations([eq_ac_symbolic] * 3, [eq_ac_incorrect] * 3, epde_search_obj) + assert compare_systems(correct_system, incorrect_system, epde_search_obj, all_vars=['u', 'v', 'p'], + fit_operator=fit_operator) def ns_discovery(foldername, noise_level): @@ -199,5 +289,5 @@ def ns_discovery(foldername, noise_level): directory = os.path.dirname(os.path.realpath(__file__)) ns_folder_name = os.path.join(directory) - # ns_test(fit_operator, ns_folder_name, 0) - ns_discovery(ns_folder_name, 0) + ns_test(fit_operator, ns_folder_name, 0) + # ns_discovery(ns_folder_name, 0) diff --git a/projects/pic/data/wave/wave.py b/projects/pic/data/wave/wave.py index 43d54785..501d3e12 100644 --- a/projects/pic/data/wave/wave.py +++ b/projects/pic/data/wave/wave.py @@ -47,7 +47,9 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, for var in all_vars: correct_eq.vals[var].main_var_to_explain = var correct_eq.vals[var].metaparameters = metaparams - correct_eq.vals[var].simplified = True + correct_eq.vals[var].weights_internal = np.ones(len(correct_eq.vals[var].structure) - 1) + correct_eq.vals[var].weights_internal_evald = True + correct_eq.vals[var].weights_final_evald = True print(correct_eq.text_form) incorrect_eq = translate_equation(eq_incorrect_symbolic, search_obj.pool, @@ -55,7 +57,9 @@ def compare_equations(correct_symbolic: str, eq_incorrect_symbolic: str, for var in all_vars: incorrect_eq.vals[var].main_var_to_explain = var incorrect_eq.vals[var].metaparameters = metaparams - incorrect_eq.vals[var].simplified = True + incorrect_eq.vals[var].weights_internal = np.ones(len(incorrect_eq.vals[var].structure) - 1) + incorrect_eq.vals[var].weights_internal_evald = True + incorrect_eq.vals[var].weights_final_evald = True print(incorrect_eq.text_form) fit_operator.apply(correct_eq, {}) @@ -193,5 +197,5 @@ def wave_discovery(foldername, noise_level): directory = os.path.dirname(os.path.realpath(__file__)) wave_folder_name = os.path.join(directory) - # wave_test(fit_operator, wave_folder_name, 0) - wave_discovery(wave_folder_name, 0) \ No newline at end of file + wave_test(fit_operator, wave_folder_name, 0) + # wave_discovery(wave_folder_name, 0) \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/__init__.py b/tests/functional/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/comparasion.py b/tests/functional/comparasion.py new file mode 100644 index 00000000..b90484e3 --- /dev/null +++ b/tests/functional/comparasion.py @@ -0,0 +1,77 @@ +from abc import ABC, abstractmethod +import numpy as np +from epde.interface.equation_translator import translate_equation +from epde.interface.token_family import TFPool +from epde.structure.main_structures import SoEq, Chromosome +import copy + + +class ComparisonStrategy(ABC): + @abstractmethod + def build(self, symbolic, search_obj, all_vars): + pass + + @abstractmethod + def compare(self, correct_obj, incorrect_obj, fit_operator, all_vars): + pass + + +class SingleEquationComparison(ComparisonStrategy): + def build(self, symbolic, search_obj, all_vars): + metaparams = {("sparsity", var): {"optimizable": False, "value": 1e-6} for var in all_vars} + eq = translate_equation(symbolic, search_obj.pool, all_vars=all_vars) + for var in all_vars: + eq.vals[var].main_var_to_explain = var + eq.vals[var].metaparameters = metaparams + eq.vals[var].weights_internal = np.ones(len(eq.vals[var].structure) - 1) + eq.vals[var].weights_internal_evald = True + eq.vals[var].weights_final_evald = True + + _, _, features = eq.vals[var].evaluate(normalize=False, return_val=False) + assert len(eq.vals[var].weights_final[:-1]) == (features.shape[1]), "Different number of features. Check the structure of the equation." + + return eq + + def compare(self, correct_obj, incorrect_obj, fit_operator, all_vars): + fit_operator.apply(correct_obj, {}) + fit_operator.apply(incorrect_obj, {}) + return all( + correct_obj.vals[var].coefficients_stability < incorrect_obj.vals[var].coefficients_stability + for var in all_vars + ) + + +class SystemComparison(ComparisonStrategy): + def _create_eq(self, eq_str, target_var, base_pool, all_vars): + families_copy = [copy.deepcopy(fam) for fam in base_pool.families] + for fam in families_copy: + if hasattr(fam, "variable") and fam.variable is not None and fam.variable != target_var: + fam.status["demands_equation"] = False + temp_pool = TFPool(families_copy) + soeq = translate_equation(eq_str, temp_pool, all_vars=[target_var]) + return soeq.vals[target_var] + + def build(self, symbolic_list, search_obj, all_vars): + metaparams = {("sparsity", var): {"optimizable": False, "value": 1e-6} for var in all_vars} + eqs = {} + for var, eq_str in zip(all_vars, symbolic_list): + eq = self._create_eq(eq_str, var, search_obj.pool, all_vars) + eq.main_var_to_explain = var + eq.metaparameters = metaparams + eq.weights_internal = np.ones(len(eq.structure) - 1) + eq.weights_internal_evald = True + eq.weights_final_evald = True + eqs[var] = eq + + system = SoEq(search_obj.pool, metaparams) + system.vals = Chromosome(eqs, {}) + system.moeadd_set = True + return system + + def compare(self, correct_obj, incorrect_obj, fit_operator, all_vars): + fit_operator.apply(correct_obj, {}) + fit_operator.apply(incorrect_obj, {}) + return all( + correct_obj.vals[var].coefficients_stability < incorrect_obj.vals[var].coefficients_stability + for var in all_vars + ) \ No newline at end of file diff --git a/tests/functional/conftest.py b/tests/functional/conftest.py new file mode 100644 index 00000000..60cb0ba2 --- /dev/null +++ b/tests/functional/conftest.py @@ -0,0 +1,43 @@ +from pathlib import Path +import pytest + +def pytest_addoption(parser): + parser.addoption( + "--discovery", + action="store_true", + default=False, + help="Run discovery mode instead of equation comparison", + ) + parser.addoption( + "--report", + action="store_true", + default=False, + help="Save discovery report files", + ) + parser.addoption( + "--report-dir", + action="store", + default="reports", + help="Base directory for reports", + ) + parser.addoption( + "--operators", + action="store", + default="DeepXDEBasedFitness,PIC,L2LRFitness", + help="Comma-separated list of operators to test", + ) + +@pytest.fixture +def runtime_options(request): + operators = request.config.getoption("--operators") + operator_list = [op.strip() for op in operators.split(",") if op.strip()] + return { + "discovery": request.config.getoption("--discovery"), + "report": request.config.getoption("--report"), + "report_dir": Path(request.config.getoption("--report-dir")), + "operators": operator_list, + } + +def pytest_configure(config): + config.addinivalue_line("markers", "functional: functional tests") + config.addinivalue_line("markers", "discovery: discovery tests") \ No newline at end of file diff --git a/tests/functional/operator_factory.py b/tests/functional/operator_factory.py new file mode 100644 index 00000000..cbbfb9bf --- /dev/null +++ b/tests/functional/operator_factory.py @@ -0,0 +1,39 @@ +from epde.operators.common.coeff_calculation import LinRegBasedCoeffsEquation +from epde.operators.common.sparsity import LASSOSparsity +from epde.operators.utils.operator_mappers import map_operator_between_levels +from epde.operators.utils.template import CompoundOperator +import epde.operators.common.fitness as fitness + +class FitnessOperatorFactory: + @staticmethod + def create(name: str, params: dict) -> CompoundOperator: + cls_map = { + "PIC": fitness.PIC, + "DeepXDEBasedFitness": fitness.DeepXDEBasedFitness, + "L2LRFitness": fitness.L2LRFitness, + } + if name not in cls_map: + raise ValueError(f"Unknown operator: {name}") + + operator = cls_map[name](list(params.keys())) + sparsity = LASSOSparsity() + coeff_calc = LinRegBasedCoeffsEquation() + if name == 'PIC': + sparsity = map_operator_between_levels(sparsity, 'gene level', 'chromosome level') + coeff_calc = map_operator_between_levels(coeff_calc, 'gene level', 'chromosome level') + + operator.set_suboperators({ + "sparsity": sparsity, + "coeff_calc": coeff_calc, + }) + operator.params = params + + if 'chromosome level' not in operator._tags: + fitness_cond = lambda x: not getattr(x, "fitness_calculated", False) + operator = map_operator_between_levels( + operator, + 'gene level', + "chromosome level", + objective_condition=fitness_cond, + ) + return operator \ No newline at end of file diff --git a/tests/functional/scenarios/__init__.py b/tests/functional/scenarios/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/ac/AC.mat b/tests/functional/scenarios/ac/AC.mat new file mode 100644 index 00000000..cd18945f Binary files /dev/null and b/tests/functional/scenarios/ac/AC.mat differ diff --git a/tests/functional/scenarios/ac/__init__.py b/tests/functional/scenarios/ac/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/ac/ac.py b/tests/functional/scenarios/ac/ac.py new file mode 100644 index 00000000..0b9a894e --- /dev/null +++ b/tests/functional/scenarios/ac/ac.py @@ -0,0 +1,147 @@ +import os +import json +import pickle +import torch +import pytest +from datetime import datetime + +import numpy as np +from epde.interface.interface import EpdeSearch + +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SingleEquationComparison +from tests.functional.utils.timer import Timer + + +class ACTest(EquationTestTemplate): + strategy = SingleEquationComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u"] + + def correct_symbolic(self): + return '0.0001 * d^2u/dx1^2{power: 1.0} + -5.0 * u{power: 3.0} + 5.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' + + def incorrect_symbolic(self): + return ' 0.0001 * d^2u/dx1^2{power: 1.0} + -4.976781518840499 * u{power: 3.0} + 4.974425220166616 * u{power: 1.0} + 0.0 * du/dx1{power: 1.0} * d^2u/dx1^2{power: 1.0} + 0.002262543822130977 = du/dx0{power: 1.0}' + + def load_data(self): + return np.load(os.path.join(self.foldername, "ac_data.npy")) + + def load_pretrained_PINN(self): + ann_path = os.path.join(self.foldername, "ac_ann_pretrained.pickle") + try: + with open(ann_path, "rb") as f: + return pickle.load(f) + except FileNotFoundError: + print("No model located, proceeding without pretrained ANN.") + return None + + @staticmethod + def noise_data(data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def make_additional_tokens(self): + return [] + + def make_search(self): + grid, data = self.ac_data() + data_nn = self.load_pretrained_PINN() + + epde_search_obj = EpdeSearch( + use_solver=False, + use_pic=True, + boundary=(5, 12), + coordinate_tensors=(grid[0], grid[1]), + verbose_params={"show_iter_idx": True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type="FD", preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=["u"], + max_deriv_order=(2, 3), + additional_tokens=self.make_additional_tokens(), + data_nn=data_nn, + ) + return epde_search_obj + + def ac_data(self): + t = np.linspace(0.0, 1.0, 51) + x = np.linspace(-1.0, 0.984375, 128) + data = self.load_data() + grids = np.meshgrid(t, x, indexing="ij") + return grids, data + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "ac" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + _, data = self.ac_data() + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=1) + + with Timer() as t: + search_obj.fit( + data=noised_data, + variable_names=["u"], + max_deriv_order=(2, 3), + derivs=None, + equation_terms_max_number=5, + data_fun_pow=3, + additional_tokens=self.make_additional_tokens(), + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-12, 1e-0), + fourier_layers=False, + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + + report = { + "scenario": "AllenCahn", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": t.elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=5) + + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + text = eq_to_text(eq) + equations_list.append({"equation": text}) + clusters_json.append( + { + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + } + ) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + return search_obj, t.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/ac/ac_ann_pretrained.pickle b/tests/functional/scenarios/ac/ac_ann_pretrained.pickle new file mode 100644 index 00000000..5f35f05a Binary files /dev/null and b/tests/functional/scenarios/ac/ac_ann_pretrained.pickle differ diff --git a/tests/functional/scenarios/ac/ac_data.npy b/tests/functional/scenarios/ac/ac_data.npy new file mode 100644 index 00000000..bbf0abbf Binary files /dev/null and b/tests/functional/scenarios/ac/ac_data.npy differ diff --git a/tests/functional/scenarios/burgers/__init__.py b/tests/functional/scenarios/burgers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/burgers/burgers.mat b/tests/functional/scenarios/burgers/burgers.mat new file mode 100644 index 00000000..7060b54f Binary files /dev/null and b/tests/functional/scenarios/burgers/burgers.mat differ diff --git a/tests/functional/scenarios/burgers/burgers.py b/tests/functional/scenarios/burgers/burgers.py new file mode 100644 index 00000000..1cf553f5 --- /dev/null +++ b/tests/functional/scenarios/burgers/burgers.py @@ -0,0 +1,199 @@ +import os +import json +import pickle +from datetime import datetime +import torch +import pytest + +import numpy as np +import pandas as pd +from scipy.io import loadmat + +from epde.interface.interface import EpdeSearch +from epde import TrigonometricTokens, CacheStoredTokens + +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SingleEquationComparison +from tests.functional.utils.timer import Timer + + +def load_pretrained_PINN(ann_filename): + try: + with open(ann_filename, "rb") as data_input_file: + data_nn = pickle.load(data_input_file) + except FileNotFoundError: + print("No model located, proceeding without pretrained ANN.") + data_nn = None + return data_nn + + +class BurgersTest(EquationTestTemplate): + strategy = SingleEquationComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u"] + + def correct_symbolic(self): + # Оставил в стиле вашего текущего сценария. + # Если это не истинная формула Burgers, замените на нужную. + return '-1.0 * u{power: 1.0} * du/dx1{power: 1.0} + 0.01 * d^2u/dx1^2{power: 1.0} + 0.0 = du/dx0{power: 1.0}' + + def incorrect_symbolic(self): + return '0.02 * d^2u/dx1^2{power: 1.0} + -0.98 * u{power: 1.0} * du/dx1{power: 1.0} + 0.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' + + @staticmethod + def noise_data(data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "burgers" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "Burgers", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=5) + + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append( + { + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + } + ) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def load_burgers_sindy_data(self, filename): + burg = loadmat(filename) + t = np.ravel(burg["t"]) + x = np.ravel(burg["x"]) + data = np.real(burg["usol"]) + data = np.transpose(data) + grids = np.meshgrid(t, x, indexing="ij") + return grids, data + + def load_burgers_csv_data(self, filename): + df = pd.read_csv(filename, header=None) + u = df.values + data = np.transpose(u) + t = np.linspace(0, 1, 101) + x = np.linspace(-1000, 0, 101) + grids = np.meshgrid(t, x, indexing="ij") + return grids, data + + def make_additional_tokens_sindy(self): + return [] + + def make_additional_tokens_discovery(self, grid): + custom_grid_tokens = CacheStoredTokens( + token_type="grid", + token_labels=["t", "x"], + token_tensors={"t": grid[0], "x": grid[1]}, + params_ranges={"power": (1, 1)}, + params_equality_ranges=None, + ) + trig_tokens = TrigonometricTokens(dimensionality=dimensionality, freq=(0.999, 1.001)) + return [custom_grid_tokens] + + def make_search(self): + grid, data = self.load_burgers_sindy_data(os.path.join(self.foldername, "burgers.mat")) + + epde_search_obj = EpdeSearch( + use_solver=False, + use_pic=True, + boundary=10, + coordinate_tensors=(grid[0], grid[1]), + verbose_params={"show_iter_idx": True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type="FD", preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=["u"], + max_deriv_order=(2, 2), + additional_tokens=self.make_additional_tokens_sindy(), + ) + return epde_search_obj + + @pytest.mark.slow + def run_sindy_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + grid, data = self.load_burgers_sindy_data(os.path.join(self.foldername, "burgers.mat")) + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=15) + + with Timer() as t: + search_obj.fit( + data=noised_data, + variable_names=["u"], + max_deriv_order=(2, 3), + derivs=None, + equation_terms_max_number=5, + data_fun_pow=3, + additional_tokens=[], + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-5, 1e2), + fourier_layers=False, + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, t.elapsed, search_obj) + + return search_obj, t.elapsed + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + grid, data = self.load_burgers_csv_data(os.path.join(self.foldername, "burgers_sln_100.csv")) + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=2) + + with Timer() as t: + search_obj.fit( + data=noised_data, + variable_names=["u"], + max_deriv_order=(2, 3), + derivs=None, + equation_terms_max_number=5, + data_fun_pow=3, + additional_tokens=self.make_additional_tokens_discovery(grid), + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-5, 1e2), + fourier_layers=False, + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, t.elapsed, search_obj) + + return search_obj, t.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/kdv/__init__.py b/tests/functional/scenarios/kdv/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/kdv/data.csv b/tests/functional/scenarios/kdv/data.csv new file mode 100644 index 00000000..8ae7959d --- /dev/null +++ b/tests/functional/scenarios/kdv/data.csv @@ -0,0 +1,81 @@ +0.,-0.0019739670361023504,-0.006482645226773692,-0.011103392763830326,-0.015700143444398944,-0.020235802943216728,-0.02470395778230241,-0.02908901432257807,-0.03337537892496579,-0.037547630513554545,-0.04159453933875758,-0.045507815908937335,-0.04927920397573234,-0.05290044729078114,-0.05636348686561739,-0.059664981522786986,-0.06280622683491628,-0.06578869461806558,-0.06861385668829521,-0.07128318486166546,-0.07379815095423667,-0.07616127837011323,-0.07837848856315749,-0.08045548051635663,-0.08239791319189388,-0.08421144555195238,-0.08590173655871532,-0.08747444517436587,-0.08893523036108718,-0.09028981269053701,-0.09154353377389204,-0.09270123247737576,-0.09376773786557728,-0.09474787900308573,-0.09564648495449028,-0.09646838478438005,-0.09721840755734416,-0.09790092667096612,-0.09851884711905769,-0.09907517369741872,-0.09957292859520192,-0.10001513400156002,-0.10040481210564577,-0.10074498509661187,-0.10103867516361106,-0.10128851304740741,-0.1014960077630678,-0.101662872440963,-0.10179083695609314,-0.10188163118345839,-0.1019369849980589,-0.10195862827489481,-0.10194829088896627,-0.10190745563427599,-0.10183693429131115,-0.10173769883724228,-0.1016107322959189,-0.10145701769119056,-0.1012775380469068,-0.10107327638691715,-0.10084521573507116,-0.10059419245983903,-0.10032066112805348,-0.10002518535297272,-0.09970833551722458,-0.09937068200343686,-0.09901279519423736,-0.09863524547225389,-0.09823860322011427,-0.09782334909376511,-0.09738974000378742,-0.09693810792105838,-0.09646878908513885,-0.09598211973558969,-0.09547843611197177,-0.09495807445384592,-0.09442137100077302,-0.09386860184491955,-0.09329991110711766,-0.09271550848552544,-0.09211560677215941 +0.,-0.0016827356743069305,-0.005699306484276352,-0.009862637312572349,-0.014046124125652351,-0.018211274499067086,-0.022347489387504985,-0.02643612766243583,-0.030458548195329407,-0.03439650771858643,-0.03823670027881357,-0.04196875865371007,-0.04558234267214657,-0.0490671121629937,-0.05241295908821429,-0.05561496929442621,-0.05867304502799478,-0.061587237982828696,-0.06435759985283668,-0.0669841823319274,-0.06946703711400962,-0.07180738806938917,-0.07401033070454667,-0.07608078364254015,-0.07802362197896917,-0.07984372080943328,-0.08154595522953201,-0.08313520033486485,-0.08461633122103139,-0.08599441462908822,-0.08727452825807816,-0.08846119390477515,-0.08955891822493882,-0.0905722078743288,-0.09150556950870478,-0.09236350978382633,-0.0931505353554531,-0.09387076710813631,-0.09452705480893615,-0.09512230903444867,-0.09565945472598184,-0.09614141682484363,-0.09657112027234205,-0.09695149000978504,-0.09728545097848058,-0.09757556704588378,-0.09782335901123775,-0.09803052884864064,-0.09819879386937155,-0.09832987138470968,-0.09842547870593413,-0.09848733314432402,-0.0985171520111585,-0.09851641692463536,-0.09848596320963444,-0.09842677374604705,-0.09833984187123594,-0.09822616092256384,-0.09808672423739354,-0.09792252515308772,-0.09773455700700917,-0.09752367055156447,-0.09729033986925088,-0.09703514043236126,-0.09675865422417143,-0.09646146322795723,-0.09614414942699451,-0.09580729480455906,-0.09545148134392677,-0.0950772030647288,-0.0946847299245921,-0.09427440147377768,-0.09384656138655564,-0.09340155333719617,-0.09293972099996942,-0.0924614080491455,-0.0919669581589946,-0.09145665471802553,-0.09093064758371086,-0.09038915127754803,-0.08983238340580608 +0.,-0.001397935068260118,-0.004934068651071725,-0.008650822211266718,-0.012430776899261295,-0.01623407285466089,-0.0200460373916657,-0.023845061975867752,-0.027609538072859083,-0.03131847422879924,-0.03495654223308178,-0.038511351174607515,-0.041970531169094105,-0.04532171233225922,-0.048552790783568354,-0.05165731910321899,-0.05463384109360421,-0.05748102400965097,-0.06019753510628628,-0.06278204163843709,-0.0652332108610304,-0.06755099945347037,-0.06973969664434265,-0.07180345948036179,-0.07374639807700152,-0.0755726225497355,-0.07728624301403741,-0.07889136958538093,-0.08039211237923978,-0.08179289992389929,-0.08309855186499249,-0.08431328016034283,-0.08544127642213398,-0.08648673226254962,-0.08745383929377341,-0.088346789127989,-0.08916977337738002,-0.08992666612530759,-0.09062026292401384,-0.0912533820372255,-0.0918288531359577,-0.09234950589122567,-0.09281816997404457,-0.0932376750554296,-0.09361085080639589,-0.09394019551263179,-0.09422724126299119,-0.09447367889068997,-0.0946812131903396,-0.09485154895655161,-0.09498639098393746,-0.09508744406710866,-0.09515641300067672,-0.0951947780345639,-0.09520339733632081,-0.095183264261791,-0.09513538204761275,-0.09506075393042429,-0.0949603831468639,-0.09483527293356983,-0.09468642652718033,-0.09451470857719622,-0.09432061213202708,-0.09410472413407142,-0.09386763778330219,-0.09360994627969234,-0.09333224282321483,-0.0930351206138426,-0.09271917285154863,-0.09238490651297732,-0.0920326042467503,-0.09166261293635179,-0.09127528344706533,-0.09087096664417459,-0.09045001339296316,-0.09001277455871466,-0.08955960100671273,-0.08909078320141925,-0.08860647658457328,-0.0881069003375254,-0.08759227671632984 +0.,-0.0011189839837563134,-0.004186276636480559,-0.00746727725886084,-0.010853422827001373,-0.01430350728207466,-0.017798900532834033,-0.02131510702623893,-0.024827631209248812,-0.028312807538264033,-0.03175333923284621,-0.03513486576468753,-0.038443041785249585,-0.04166352194599397,-0.04478225971152079,-0.047791313623718995,-0.050687903746799344,-0.05346934850349645,-0.05613296631654499,-0.05867607560867959,-0.061095994802634904,-0.06339144557232525,-0.06556593029573408,-0.06762286315204634,-0.06956560809367067,-0.07139752907301569,-0.07312199004249005,-0.07474235495450234,-0.0762619877614612,-0.07768469435551198,-0.07901504219822143,-0.08025694061032061,-0.08141427349544951,-0.0824909247572481,-0.08349077829935636,-0.08441771802541423,-0.08527562783906169,-0.08606814073803118,-0.08679799912617772,-0.0874679308581138,-0.0880806723074831,-0.08863895984792922,-0.08914552985309583,-0.08960311869662657,-0.0900144627521651,-0.0903819960269634,-0.09070726143884915,-0.09099193869980983,-0.09123772013808258,-0.09144629808190458,-0.09161936485951298,-0.09175861279914492,-0.09186573422903759,-0.09194220784929678,-0.09198891398755085,-0.09200685605222476,-0.09199704676788481,-0.09196049885909727,-0.09189822505042845,-0.09181123806644462,-0.09170055063171208,-0.09156704081451754,-0.09141122009293151,-0.0912336864915935,-0.09103504404390113,-0.09081589678325205,-0.09057684874304386,-0.09031850395667423,-0.09004146645754077,-0.08974625577917493,-0.0894331669169813,-0.08910255384052929,-0.08875477436104322,-0.08839018628974758,-0.08800914743786672,-0.08761201561662509,-0.08719914863724709,-0.08677084382608694,-0.08632726206866947,-0.08586862703659613,-0.08539516546458017 +0.,-0.0008453497095434117,-0.0034553244919101373,-0.006311375457070504,-0.009313420346417502,-0.012418919892155229,-0.015605406494484166,-0.01884557811776108,-0.022112132726342756,-0.025378804837595324,-0.02862638263707249,-0.031838589987069246,-0.03499916026363336,-0.0380918268428126,-0.04110065362947476,-0.04401624401091277,-0.04683452884894447,-0.04955151322675397,-0.052163202227525435,-0.05466560093444299,-0.057054714430690774,-0.059328061410497526,-0.06148837663965373,-0.06353835005900975,-0.06548061819859864,-0.06731781758845339,-0.06905258475860701,-0.07068755623909255,-0.072225368559943,-0.07366922050145783,-0.07502343321014208,-0.07629162054432508,-0.07747736600572229,-0.0785842530960492,-0.07961586531702133,-0.08057578617035413,-0.08146759915776312,-0.08229470190361042,-0.08305978476731192,-0.08376548709616827,-0.08441445393594436,-0.08500933033240504,-0.08555276133131517,-0.0860473919784396,-0.08649586731954317,-0.08690055839567933,-0.08726301851919446,-0.08758491630493902,-0.08786793166874568,-0.08811374452644717,-0.08832403479387621,-0.08850048238686553,-0.08864476722124781,-0.08875836627534232,-0.08884218137007988,-0.08889722554682251,-0.08892452061005422,-0.08892508836425896,-0.08889995061392074,-0.08885012916352351,-0.08877664581755129,-0.0886803915923032,-0.08856189587028956,-0.08842176737213857,-0.0882606205827227,-0.08807906998691446,-0.08787773006958632,-0.08765721531561078,-0.08741814020986033,-0.08716103644814979,-0.08688621103755084,-0.08659402478631704,-0.0862848422059891,-0.08595902780810774,-0.08561694610421366,-0.08525896160584757,-0.0848854388245502,-0.08449668173933755,-0.0840928565475631,-0.08367419123725664,-0.0832409168460627 +0.,-0.0005765463689142343,-0.0027406535697998653,-0.005182531289462095,-0.007810163672629213,-0.010579684102660256,-0.013464910414488883,-0.016435814638377795,-0.019462368804589722,-0.022515781651465366,-0.025574979787076894,-0.028621825329475506,-0.03163818442474857,-0.03460592321898347,-0.03750726899718959,-0.04033140863418387,-0.04307301815782038,-0.04572682465839316,-0.04828755522619628,-0.05074993695152378,-0.05310869692466971,-0.05536018272293,-0.05750638059054207,-0.0595492747747366,-0.061490793040938574,-0.06333286315457295,-0.06507741288106472,-0.06672636998583885,-0.06828166223432032,-0.06974589675730584,-0.07112315424592841,-0.07241676024423865,-0.07363000513108593,-0.07476617928531963,-0.0758285730857891,-0.0768204769113437,-0.07774518114083283,-0.07860585372814088,-0.07940513411602497,-0.08014557504457458,-0.08082973219844419,-0.08146016126228821,-0.08203941792076107,-0.08257005785851719,-0.083054636760211,-0.083495464019297,-0.08389410292804604,-0.0842522110327628,-0.08457145589479499,-0.08485350507549033,-0.08510002613619655,-0.08531268663826137,-0.08549315414303252,-0.08564290374345451,-0.08576285810006276,-0.08585403947149574,-0.08591747833783556,-0.08595420517916429,-0.08596525047556408,-0.08595164470711705,-0.0859144183539053,-0.08585447491617085,-0.08577236116464768,-0.08566869613176836,-0.08554410437378786,-0.08539921044696118,-0.08523463890754326,-0.08505101431178914,-0.08484896121595377,-0.08462902308823404,-0.08439151861913098,-0.08413681520851317,-0.08386528382274608,-0.08357729542819523,-0.08327322099122604,-0.08295343147820407,-0.08261829785549475,-0.08226813054917811,-0.08190310094229404,-0.08152344116282127,-0.0811293863726999 +0.,-0.00031213325129466935,-0.0020417506970298884,-0.004080199015764125,-0.006343081216768771,-0.008785203125502176,-0.011376793416543641,-0.014085178627653903,-0.016877685296593715,-0.019723070500124232,-0.02259845268706429,-0.025483885887963326,-0.028359422852030535,-0.03120511632847512,-0.03400140971357309,-0.03673611184262304,-0.03940267810980384,-0.04199459278665877,-0.04450534014473114,-0.04692840445556422,-0.04925726999070132,-0.05148714490558614,-0.053619285896008784,-0.05565498997093673,-0.057595494699856316,-0.059442037652253865,-0.0611958563976157,-0.06285818850542815,-0.06443027154517754,-0.0659141363902884,-0.06731362911968178,-0.06863179408450706,-0.06987163579224667,-0.07103615875038302,-0.07212836746639857,-0.07315126644777574,-0.07410786020199697,-0.07500109270079074,-0.07583355361112402,-0.0766077109641923,-0.07732603304784551,-0.07799098814993352,-0.07860504455830623,-0.07917067056081352,-0.07969033444530531,-0.08016628528035653,-0.0806000959383834,-0.08099341293020038,-0.08134789152466695,-0.0816651869906426,-0.0819469545969868,-0.08219484961255905,-0.08241052730621884,-0.08259546072929477,-0.08275059273907977,-0.08287695440000477,-0.08297558446739163,-0.08304752169656218,-0.08309380484283832,-0.08311547266154191,-0.08311356390799482,-0.08308899410833694,-0.0830423269126887,-0.0829741912835441,-0.0828852214707425,-0.0827760517241233,-0.08264731629352588,-0.08249964942878965,-0.08233368537975394,-0.08214997900115982,-0.08194886034383139,-0.08173070315300236,-0.08149588460506339,-0.08124478187640523,-0.0809777721434185,-0.08069523258249396,-0.08039754037002227,-0.08008501217625326,-0.07975782444746908,-0.07941621327372539,-0.07906041776108208 +0.,-0.0000517131638285203,-0.0013581463627927166,-0.0030038709814081237,-0.004911634021052078,-0.007034908473095571,-0.009340461164040822,-0.011793053369668818,-0.014357446365760546,-0.01700001958492582,-0.019696136710534946,-0.02242409707984237,-0.025162193609608495,-0.027888719216593756,-0.030582385885471935,-0.0332296627616844,-0.03582281863411951,-0.03835412993530336,-0.040815873097762065,-0.043200324554021716,-0.045499760736608406,-0.04770828190086978,-0.04982643407039221,-0.0518548453769814,-0.053794081667904586,-0.055644708790428994,-0.05740729259182185,-0.05908239891935039,-0.06067059362028184,-0.06217334662550562,-0.06359427522268596,-0.06493614966384284,-0.06620169580828819,-0.06739363951533392,-0.06851470664429198,-0.06956762305447425,-0.07055511460519272,-0.07147990695532154,-0.07234454114183626,-0.07315140238319973,-0.0739028735321763,-0.07460133744153022,-0.07524917696402585,-0.07584877495242745,-0.07640251425949936,-0.07691258495380457,-0.0773805690990216,-0.07780810220787336,-0.07819682732280615,-0.07854838748626633,-0.07886442574070021,-0.07914658512855419,-0.07939650869227459,-0.07961566729178304,-0.0798050233473632,-0.07996561632206806,-0.08009849285025922,-0.08020469956629828,-0.08028528310454688,-0.08034129009936664,-0.08037376718511917,-0.0803836414612771,-0.08037149295461746,-0.08033796017869436,-0.0802836867017779,-0.08020931609213824,-0.08011549191804547,-0.08000285774776969,-0.07987205714958102,-0.07972365598251109,-0.07955799533840183,-0.07937545506281385,-0.07917641829850317,-0.07896126818822576,-0.07873038787473757,-0.07848416050079464,-0.07822296920915293,-0.07794713671334937,-0.07765684440256618,-0.07735233215067165,-0.07703384282720896 +0.,0.0002050691970409376,-0.0006894129209278741,-0.001953075942298855,-0.0035153142104823874,-0.005328258483807942,-0.007355342436394132,-0.009558842010913973,-0.0119010331500405,-0.014345991497859624,-0.01686737933256032,-0.01944179438578137,-0.02204582299237961,-0.024656051487211898,-0.027249512628460183,-0.029811374121187527,-0.032332751999164244,-0.03480474962335828,-0.03721847035473762,-0.039565017554270186,-0.04183549458292395,-0.04402292513784267,-0.04612716336221684,-0.04814818677261877,-0.05008590786728974,-0.05194023914447099,-0.05371109310240378,-0.055398382239329365,-0.05700201905348899,-0.058522927764708355,-0.05996450266378637,-0.061329246968334965,-0.06261961508300569,-0.06383806141245006,-0.06498704036131965,-0.066069006334266,-0.06708641373594065,-0.06804177555884944,-0.06893758535477738,-0.06977614742284059,-0.0705597611393948,-0.07129072588079562,-0.07197134102339878,-0.07260390594355993,-0.07319072001763477,-0.07373391563945624,-0.07423508368303659,-0.07469584870455526,-0.07511784159009159,-0.07550269322572505,-0.075852034497535,-0.07616749629160088,-0.07645070949400211,-0.07670314262913829,-0.07692577705422501,-0.0771196602281692,-0.07728584627246456,-0.07742538930860489,-0.07753934345808398,-0.07762876284239559,-0.07769470158303349,-0.07773809790529104,-0.07775954771501661,-0.07775969870080192,-0.0777392033771133,-0.07769871425841716,-0.07763888385917986,-0.07756036469386776,-0.07746380927694724,-0.07734979409273143,-0.0772186709576059,-0.07707082557394179,-0.07690664680869096,-0.07672652352880521,-0.07653084460123637,-0.07631999889293627,-0.07609437527085672,-0.07585430229246304,-0.07559996617045239,-0.07533161038461925,-0.07504948138772148 +0.,0.00045852885399268943,-0.000035162806719566406,-0.0009273774048138871,-0.002153643461186823,-0.0036647368665139466,-0.005420887727813197,-0.007381966203194316,-0.009507842450767055,-0.011760361955088432,-0.014111538887927698,-0.016536322121102613,-0.01900964430839535,-0.02150643810358811,-0.024002108899625892,-0.026480561114665666,-0.028931791690903923,-0.03134576545844305,-0.033712447247385445,-0.03602180188783347,-0.03826379420988953,-0.04043040250724008,-0.04252080775554871,-0.04453435501396881,-0.04647032169903125,-0.04832798522726687,-0.0501066230152065,-0.051805512479380984,-0.05342393103632117,-0.05496227233765943,-0.05642371344189389,-0.057810497565964805,-0.059124814821769046,-0.060368855321203445,-0.06154480917616489,-0.06265486649855022,-0.06370121740025632,-0.06468616782784659,-0.06561216498766723,-0.0664814341492728,-0.06729619316751558,-0.06805865989724781,-0.06877105219332179,-0.06943558791058976,-0.070054484903904,-0.07062981921653486,-0.07116319015774077,-0.071656211372602,-0.0721105016646514,-0.07252767983742178,-0.07290936469444598,-0.07325717503925686,-0.07357272967538724,-0.07385749465260809,-0.07411246964568535,-0.07433870971106175,-0.07453727606982893,-0.07470922994307849,-0.07485563255190213,-0.07497754511739145,-0.0750760288606381,-0.07515203268997184,-0.07520616789717283,-0.07523909097300967,-0.07525146300904044,-0.0752439450968233,-0.07521719832791636,-0.07517188379387774,-0.07510866258626556,-0.07502812143868763,-0.07493062257776627,-0.07481655732092815,-0.07468632001891044,-0.07454030502245024,-0.07437890668228464,-0.07420251934915081,-0.07401153737378588,-0.0738062949594341,-0.07358698302311534,-0.07335384847361628,-0.07310714116762411 +0.,0.000708942137253008,0.0006049532318426397,0.00007362801896750493,-0.0008261714853856914,-0.002043851264252998,-0.0035365678685283066,-0.005261864771533797,-0.007177285446591652,-0.009242518554491808,-0.011427983355153788,-0.013707032236264355,-0.016052996693560143,-0.018439208222777805,-0.020839496362355752,-0.02323654029005981,-0.02561925132334269,-0.02797649006361303,-0.030297117112279486,-0.03256999307075068,-0.034783978540435266,-0.0369300373712842,-0.03900669600524877,-0.04101268509279754,-0.04294666512501375,-0.0448072965929806,-0.04659323998778128,-0.04830315580049901,-0.04993570452221699,-0.05149076428607336,-0.05297130065061284,-0.05437930383252807,-0.055716706778915076,-0.056985442436869836,-0.05818744375348838,-0.059324643675866706,-0.06039897515110081,-0.06141254267138303,-0.06236774822979248,-0.06326673995151895,-0.06411165612009609,-0.0649046350190575,-0.06564781493193683,-0.06634333414226772,-0.06699333093358377,-0.06759982632028982,-0.068164427676209,-0.06868873778436349,-0.06917436344306578,-0.0696229114506284,-0.07003598860536385,-0.07041520170558466,-0.07076215754960334,-0.07107831957788784,-0.07136470516930193,-0.07162237658397184,-0.07185240175946389,-0.0720558486333444,-0.07223378514317971,-0.07238727922653615,-0.07251739882098004,-0.07262510307957978,-0.07271101819087307,-0.07277580907824542,-0.07282014504453023,-0.07284469539256092,-0.07285012942517088,-0.07283711644519354,-0.0728063257554623,-0.07275835396578904,-0.07269357340048097,-0.0726123807522081,-0.07251517561704181,-0.07240235759105339,-0.07227432627031415,-0.07213148125089543,-0.07197422212886855,-0.07180288855614296,-0.07161767603460827,-0.07141883472647517,-0.07120661771449749 +0.,0.0009565482082669966,0.0012312479108689048,0.00105031225997561,0.0004675254783971755,-0.00046513183384721754,-0.00170187267659509,-0.0031979924211091443,-0.0049087864386520835,-0.0067918595492716055,-0.008816089160890855,-0.010953283152004677,-0.01317522397464518,-0.015453694080844484,-0.017760998286722444,-0.020078628467849496,-0.022394443578070113,-0.0246962340405356,-0.02697179027839728,-0.029208902714806445,-0.03139536177291442,-0.033521147616029916,-0.03558415070988351,-0.03758250523085243,-0.0395142727844079,-0.0413775149760211,-0.04317029341116321,-0.044890669695305425,-0.04653670543391894,-0.04810777819310279,-0.049606647728588485,-0.05103505822181778,-0.05239469254697549,-0.05368723357824641,-0.05491436418981535,-0.05607776725586711,-0.05717912565058649,-0.05822034797148765,-0.05920379211965748,-0.060131530955651616,-0.0610056251363405,-0.06182813531859456,-0.06260112215928428,-0.06332664631528007,-0.0640067684434524,-0.0646434558471719,-0.06523832359683306,-0.06579296366577522,-0.066308970927703,-0.06678794025632098,-0.06723146652533375,-0.0676411446084459,-0.06801856937936207,-0.06836520153842153,-0.06868207556023291,-0.06897026051925341,-0.06923083069087195,-0.0694648603504775,-0.06967342377345899,-0.06985759523520535,-0.07001844901110552,-0.07015695406489261,-0.07027375099610175,-0.07036951279463323,-0.0704449166122463,-0.07050063960070023,-0.07053735891175428,-0.0705557516971677,-0.07055649510869977,-0.07054019526200604,-0.0705072342677645,-0.07045801395622325,-0.07039293893252309,-0.07031241380180478,-0.07021684316920905,-0.0701066316398767,-0.06998218381894847,-0.0698438446106794,-0.06969181398151307,-0.06952634517335494,-0.06934769431909125 +0.,0.0012015507798186509,0.0018439990639612031,0.0020030173329277827,0.001727846103400254,0.0010718701401769897,0.00008369040716639086,-0.0011898184013662406,-0.002701781591155603,-0.004407792683980113,-0.006275240036685644,-0.008274438597203814,-0.01037567348722443,-0.012549229828437317,-0.01476593846443839,-0.01700614170943531,-0.019256679190362315,-0.02150430495271147,-0.02373577304197487,-0.025937837503644562,-0.028097252383212635,-0.030203044701105304,-0.0322524874003536,-0.034243135998860696,-0.03617247113584502,-0.03803797345052497,-0.039837123582118925,-0.041567402169845294,-0.04322628985292248,-0.044812678482688835,-0.046329127676233074,-0.04777714250504735,-0.04915816282175509,-0.05047362847897972,-0.05172497932934467,-0.052913655225473345,-0.05404109601998919,-0.055109019942975436,-0.0561197419188893,-0.05707526141607869,-0.057977563401799034,-0.058828632843305764,-0.05963045470785435,-0.06038501396270021,-0.061094295575098816,-0.06176021445075094,-0.062384392993098434,-0.06296841242095179,-0.06351385576666364,-0.06402230606258666,-0.06449534634107344,-0.06493455963447667,-0.06534152897514897,-0.0657177121961169,-0.06606416026499923,-0.06638194868558188,-0.06667215769672044,-0.06693586753727057,-0.06717415844608784,-0.0673881106620279,-0.06757880442394636,-0.06774721807652241,-0.0678940061484543,-0.06801984933344227,-0.06812543227319906,-0.06821143960943742,-0.06827855598387006,-0.06832746603820976,-0.06835885441416922,-0.06837333636594925,-0.06837130348129888,-0.06835316249243543,-0.06831932277937235,-0.06827019372212309,-0.06820618470070106,-0.06812770509511974,-0.06803516428539257,-0.06792891223310771,-0.06780915324914509,-0.06767614348287822,-0.06753014194294049 +0.,0.0014441194395856587,0.0024434514706921486,0.0029320570231625535,0.002955165491904008,0.0025675836390090952,0.001820597593381362,0.0007631746868646407,-0.0005557177486972371,-0.002089733987716984,-0.003804825855530908,-0.005669866521985756,-0.007653695060565243,-0.009725150544753106,-0.011853640186134932,-0.014018394283975394,-0.016205265942160815,-0.018400006365709605,-0.020588366759640195,-0.022756098328970988,-0.024888952278720417,-0.026975032809323583,-0.02901101369404969,-0.03099388948379779,-0.03292057764490448,-0.03478799564370633,-0.03659306094653994,-0.03833269101974188,-0.04000380332964873,-0.041604818760599606,-0.043138102418959885,-0.044604927149835445,-0.04600649679306866,-0.04734401518850191,-0.048618686175977574,-0.04983171359533803,-0.05098430128642565,-0.05207798260363175,-0.05311503060073666,-0.05409737321818319,-0.05502692166230969,-0.055905587139454545,-0.056735280855956124,-0.05751791401815279,-0.058255397832382934,-0.05894959611422877,-0.05960213823941534,-0.060214594729918774,-0.06078853686244453,-0.06132553591369808,-0.06182716316038489,-0.0622949898792104,-0.0627305873468801,-0.06313541040502413,-0.06351052591637617,-0.06385701543343918,-0.06417596478854061,-0.06446845981400795,-0.06473558634216865,-0.06497843020535017,-0.06519807723587999,-0.06539551473377604,-0.06557141067847004,-0.06572645310829002,-0.06586133379948333,-0.06597674452829734,-0.06607337707097939,-0.06615192320377683,-0.06621307470293707,-0.06625745559680445,-0.06628546664240141,-0.06629751924056175,-0.06629402731426548,-0.06627540478649259,-0.06624206558022305,-0.06619442361843689,-0.06613289282411407,-0.06605782802222028,-0.06596943774753211,-0.06586798088662767,-0.0657537191515449 +0.,0.0016843912172673085,0.0030298185422140914,0.003837718449099731,0.004149836611968504,0.004022419267510648,0.0035093100443769577,0.002661492141496501,0.0015299487577983472,0.00016289336365346574,-0.0014042415252933692,-0.003138938008058683,-0.005008639942342253,-0.0069807911858438725,-0.009023425230086691,-0.011114697689545434,-0.013239507704979628,-0.015382636905558527,-0.0175288669204514,-0.019662979378827487,-0.02176975590985606,-0.023836407987583942,-0.02585902846239925,-0.027834068480394346,-0.02975789999726156,-0.03162689496869321,-0.03343742535038163,-0.03518586309801915,-0.03686858016729808,-0.03848354111462726,-0.04003292212551207,-0.041517770657840174,-0.04293906150217973,-0.044297769449098884,-0.0455948692891658,-0.04683133581294861,-0.0480081438110155,-0.04912664721596477,-0.05018907830637913,-0.05119729534988797,-0.05215313771115983,-0.05305844475486326,-0.05391505584566682,-0.05472481034823904,-0.0554895476272485,-0.05621108170880691,-0.056891048582262675,-0.05753100813267491,-0.05813251996894253,-0.05869714369996446,-0.05922643893463962,-0.059721965281866934,-0.06018528235054531,-0.06061784186951081,-0.06102072600319689,-0.0613950219765898,-0.061741820849851185,-0.0620622136831427,-0.062357291536625975,-0.06262814547046265,-0.06287586654481439,-0.06310145059342281,-0.06330557857123618,-0.06348894550566685,-0.06365224995572559,-0.06379619048042323,-0.06392146563877056,-0.06402877398977838,-0.06411881409245754,-0.06419221838777808,-0.06424939649562081,-0.06429076425444809,-0.0643167399007066,-0.06432774167084304,-0.06432418780130404,-0.0643064965285363,-0.06427508608898647,-0.06423031597807645,-0.0641723988334014,-0.06410159611065615,-0.06401817205520527 +0.,0.0019224720619184764,0.003603284008996091,0.004720263623086822,0.005312191721491225,0.005436770588624027,0.0051502751366078806,0.004505628363919831,0.0035557532690369265,0.0023506601659857677,0.0009271140951266398,-0.0006810262155472879,-0.0024398597730075034,-0.004315485584225511,-0.00627461288562462,-0.008294359699741495,-0.010358703509252297,-0.012451489350465576,-0.014556562259689902,-0.01665776727323381,-0.01873894942740588,-0.02078645732577157,-0.022795821031080875,-0.0247629657123892,-0.026683735340676782,-0.028553973886923833,-0.03036952532211057,-0.03212623361721722,-0.03381994274322399,-0.03544817545476432,-0.03701292456643898,-0.038515018941043894,-0.03995521123541468,-0.041334254106386956,-0.042652900210796374,-0.04391190220547854,-0.04511201274726909,-0.04625441176071835,-0.047341291833180185,-0.04837444340428174,-0.04935563590573517,-0.050286638769252615,-0.05116922142654623,-0.052005153309328166,-0.05279620384931058,-0.05354413857582338,-0.05425059973467388,-0.05491713663583397,-0.05554529731006584,-0.0561366297881317,-0.056692682100793736,-0.05721500227881413,-0.0577051383529551,-0.05816453882015777,-0.058594300557303775,-0.05899551608999435,-0.059369281344939955,-0.059716692248851046,-0.06003884472843804,-0.0603368347104114,-0.06061175812148157,-0.060864618911383415,-0.06109611053840957,-0.06130693466722522,-0.06149779629157199,-0.0616694004051915,-0.06182245200182534,-0.061957656075215126,-0.06207571761910249,-0.0621772771284371,-0.06226275278081452,-0.062332564623809435,-0.06238713498035542,-0.06242688617338606,-0.06245224052583495,-0.06246362036063567,-0.062461448000721814,-0.062446087420056036,-0.06241775523730397,-0.062376715311565044,-0.06232323425392739 +0.,0.002158438340001228,0.004164003599578568,0.005579931002381911,0.006442543784617902,0.006811015448910282,0.006743927711813309,0.0062960680494156705,0.005522223937806053,0.004474132284865324,0.003189839256353678,0.0017044946442405183,0.00005329441142124468,-0.0017285654792087545,-0.0036065190093734155,-0.005556683444914135,-0.007562146649823886,-0.009605849759926344,-0.011670733911045198,-0.013739740239004115,-0.01579580987962679,-0.01782445817583154,-0.01982067042065285,-0.02177986309428283,-0.023697369567434824,-0.02556852321082216,-0.027388657395158184,-0.029153105491156225,-0.03085720086952962,-0.03249803889212409,-0.03407743451079,-0.03559600473568432,-0.03705428695481114,-0.038452818556174544,-0.039792136927778624,-0.04107277945762744,-0.0422952835337251,-0.04346066044388777,-0.04457106415571861,-0.04562821911431766,-0.04663382671554955,-0.04758958835527892,-0.04849720542937041,-0.04935837933368865,-0.05017481146409829,-0.050948220136859214,-0.051680253498022216,-0.052372450345911224,-0.05302634722434944,-0.05364348067716008,-0.054225387248166335,-0.054773603481191424,-0.055289665920058545,-0.05577501971264495,-0.05623077586291609,-0.05665803182957269,-0.05705788804893444,-0.057431444957320985,-0.057779802991051975,-0.058104062586447076,-0.05840532417982594,-0.058684599422979516,-0.058942593808281596,-0.05918001528960828,-0.05939757495122143,-0.05959598387738293,-0.059775953152354636,-0.05993819386039841,-0.06008341708577615,-0.06021227102164436,-0.06032518209936295,-0.06042257434966993,-0.06050487395762737,-0.060572507108297355,-0.060625899986741984,-0.06066547877802334,-0.06069166966720351,-0.06070484091586741,-0.06070521300124902,-0.06069305202269359,-0.06066862679207002 +0.,0.0023923383002275324,0.004712106706523375,0.00641693702638056,0.00754118787074572,0.008145517284351055,0.008290691306146595,0.00803328735336363,0.0074298828432334514,0.0065338717256199575,0.0053845303493647596,0.0040182503047151204,0.0024714731438261724,0.0007806404188530442,-0.0010184551162918578,-0.0029009665288998185,-0.004849123827472827,-0.006844996640239423,-0.008870654595428157,-0.010908167321267558,-0.012939604445986188,-0.01494967740728624,-0.016932844623336128,-0.018884031028871304,-0.02079807663211565,-0.02266982144129302,-0.02449410546462727,-0.02626576871034226,-0.027979651186661847,-0.02963243515019002,-0.03122576315445197,-0.03276004704713199,-0.03423561575900794,-0.03565279822085766,-0.03701192336345903,-0.03831332011758989,-0.0395573174140281,-0.040744763230496577,-0.04187777397290408,-0.04295800991292285,-0.04398710629501866,-0.044966698363657326,-0.04589842136330462,-0.046783910538426336,-0.04762480113348827,-0.04842276552543487,-0.04917945740480489,-0.0498964051230269,-0.0505751338294151,-0.05121716867328366,-0.05182403480394677,-0.05239725737071862,-0.05293836152291339,-0.0534487889437661,-0.053929664182612636,-0.054382089268077374,-0.0548071687934872,-0.05520600735216899,-0.0555797095374496,-0.05592937994265593,-0.05625612316111483,-0.05656095813645256,-0.05684460192866405,-0.05710776843665579,-0.05735117449489863,-0.05757553693786337,-0.05778157260002084,-0.057969998315841875,-0.0581415309197973,-0.05829682595036242,-0.05843631778985153,-0.058560434228871874,-0.058669605092968924,-0.05876426020768814,-0.05884482939857501,-0.05891174249117497,-0.05896542931103352,-0.059006262217438425,-0.059034465422879684,-0.05905030710650168,-0.05905405811883674 +0.,0.0026241935537964674,0.005247698004806534,0.007231477609434913,0.008608402517790919,0.009440626393924775,0.00979097935015082,0.009717755030810366,0.009279247080244732,0.0085304376798343,0.007511782914025185,0.006260867418702249,0.004815329470186563,0.0032128073447991847,0.0014902725103243288,-0.0003265001642132606,-0.002218914308413207,-0.004168200127545885,-0.0061555878268816765,-0.008162307611690948,-0.010169589687244095,-0.012161370678765066,-0.014131599895490059,-0.016074727720163016,-0.017985117884446934,-0.019857134120004772,-0.021685140158499507,-0.023463499731594114,-0.025186576570951556,-0.0268506539897436,-0.02845720756190747,-0.030006450607940553,-0.031498510357069735,-0.03293351403852189,-0.03431158888152392,-0.035632862115302685,-0.03689746096908508,-0.038106075390259064,-0.03926078526678452,-0.04036318850460699,-0.04141485606754252,-0.042417358919407205,-0.04337226802401711,-0.04428115434518831,-0.045145588846736875,-0.0459671992291441,-0.04674764437170177,-0.04748844224472076,-0.04819110669637905,-0.048857151574854644,-0.04948809072832552,-0.0500854380049697,-0.05065070725296517,-0.051185336576598135,-0.051690463492312475,-0.05216719423980701,-0.0526166372211425,-0.053039900838379686,-0.053438093493579295,-0.053812323588802086,-0.054163699526108784,-0.05449324713439135,-0.05480169457752623,-0.05508976135919974,-0.05535816972775222,-0.055607641931524024,-0.05583890021885551,-0.056052666838087024,-0.05624966403755893,-0.056430554351079625,-0.05659577981021246,-0.056745771744875904,-0.05688096340225179,-0.05700178802952192,-0.057108678873868134,-0.05720206918247225,-0.057282392202516096,-0.0573500242020803,-0.05740519300475079,-0.057448168711878564,-0.05747922405351488 +0.,0.0028540005451844212,0.0057708590516909325,0.008023729615014462,0.009644451077094952,0.010696681193917892,0.011245196348188635,0.011349933553990832,0.011070829825408145,0.01046438754673902,0.00957219262105021,0.008432974505205987,0.00708551986459838,0.0055686153646194,0.003920363677631591,0.0021674316607935245,0.00032921088363891673,-0.0015747212038786096,-0.003524787151805444,-0.005501409510187957,-0.0074850108290725435,-0.009458781743012226,-0.01141618008341218,-0.013351198519380245,-0.015257741434927148,-0.01712971321406358,-0.018961018240800247,-0.020745560899147857,-0.022477245573117095,-0.02415197066421505,-0.025771050137855436,-0.027334505365182782,-0.028842268571007787,-0.030294271980141122,-0.0316904478173935,-0.03303072830757558,-0.03431504567549807,-0.03554393706891578,-0.036719446886430564,-0.03784311246155915,-0.0389164423334949,-0.03994094504143122,-0.04091812912456148,-0.04184950312207906,-0.042736575573177345,-0.043580930752914554,-0.04438423237323178,-0.045147988089844056,-0.045873700543825814,-0.04656287237625153,-0.04721700622819564,-0.04783760474073263,-0.048426170554936934,-0.04898413808281406,-0.049512657232938434,-0.05001283810154839,-0.05048579255548407,-0.0509326324615856,-0.051354469686693105,-0.05175241609764672,-0.052127583561286564,-0.05248100438879813,-0.052813417386860385,-0.053125547327683084,-0.05341812154117644,-0.053691867357250685,-0.053947512105816046,-0.054185783116782744,-0.05440740772006101,-0.0546130550977334,-0.054803174629993845,-0.05497820096832403,-0.055138570565570214,-0.05528471987457863,-0.05541708534819551,-0.05553610343926712,-0.05564221060063969,-0.05573578682130584,-0.05581706341092504,-0.055886312238441656,-0.055943807757383446 +0.,0.0030817319062907064,0.00628164994359512,0.00879385237779953,0.010649583079587934,0.01191400947985709,0.012653739052546138,0.012930280212835293,0.01280514137590477,0.012336277919474902,0.011566356211033186,0.010535202846057457,0.00928270508785077,0.007848750199716158,0.006272525076299707,0.004581552945713073,0.0027959897035648267,0.0009361890127227816,-0.0009774954639452616,-0.0029247100635714845,-0.004885101123288087,-0.006841141829729166,-0.008785816026870008,-0.010712675348302713,-0.012615181597146521,-0.01448679657652064,-0.016320982089544293,-0.0181111999393367,-0.019850911929017067,-0.02153564544586625,-0.023166558168169864,-0.02474348603556669,-0.026266172904472872,-0.027734362631304535,-0.02914779907247782,-0.03050622608440886,-0.03180938752351379,-0.03305767291742993,-0.034253092188034504,-0.035397123874325684,-0.03649121593117634,-0.03753681631345938,-0.03853537297604769,-0.039488333873814174,-0.04039714696163172,-0.041263354327491765,-0.042088624159173166,-0.04287445386478679,-0.043622334972717974,-0.044333759011352086,-0.045010217509074475,-0.045653201994270504,-0.046264203995325534,-0.04684465411933371,-0.04739571409518215,-0.04791849752541351,-0.04841411940199886,-0.04888369471690927,-0.049328338462115796,-0.04974916562958952,-0.05014729121130148,-0.05052375360131608,-0.05087930179066634,-0.0512146654878821,-0.051530576776244445,-0.05182776773903444,-0.052106970459533185,-0.052368917021021755,-0.05261433950678123,-0.052843913403067246,-0.053058095139176545,-0.05325732247328558,-0.05344203485087964,-0.053612671717443994,-0.05376967251846394,-0.05391347669942476,-0.054044523705811746,-0.054163197060696736,-0.05426973143391381,-0.05436440031047891,-0.05444747971457188 +0.,0.0033073379247008433,0.006780110877332813,0.0095419891391409,0.011624035544154757,0.013092929642672339,0.014016997602427923,0.014459248189284046,0.01448269016910324,0.01414666555708376,0.013494872423995982,0.01256818737742055,0.01140755104455819,0.010053904052609624,0.008547471076998266,0.006916596446925861,0.005182169827423681,0.003365289985770517,0.0014870556892451394,-0.000431434294873659,-0.002369081199307105,-0.0043076690184173485,-0.006239724952529882,-0.008158376112508268,-0.010056658320096066,-0.011927607397036797,-0.013764259165074,-0.01555964944595121,-0.017306814061411952,-0.019000923143343194,-0.020642983352620686,-0.022232651652733124,-0.023769490104069955,-0.0252530607670206,-0.02668292570197451,-0.02805864696932111,-0.029379786629449844,-0.030646591716120372,-0.03186103867040111,-0.03302454899833002,-0.03413851189405386,-0.03520431655171946,-0.036223352165473593,-0.03719700792946305,-0.03812667303783464,-0.039013848616347706,-0.03986020697080315,-0.04066723532890297,-0.041436414200868896,-0.04216922409692268,-0.04286714552728608,-0.04353165900218082,-0.04416424503182866,-0.044766330306228674,-0.04533908780582461,-0.04588363429351506,-0.046401087551047326,-0.046892565360168684,-0.04735918550262642,-0.04780206576016783,-0.04822232391454019,-0.048621004046796194,-0.048998864876486935,-0.04935664072036881,-0.049695068091054236,-0.05001488350115563,-0.050316823463285414,-0.05060162449005601,-0.05087002309407984,-0.05112270072467591,-0.0513601205618165,-0.051582723258447705,-0.051790951042680555,-0.051985246142626076,-0.05216605078639533,-0.052333807202099326,-0.05248895761784913,-0.05263188890503874,-0.05276283896690554,-0.052882082756203236,-0.05298989771825666 +0.,0.003530747868360968,0.007266263707156346,0.010268268475992815,0.012568034264270925,0.014233751858804617,0.015335356632892413,0.015937287598305573,0.016103983766815346,0.015896108320205323,0.015358342891776858,0.014532567543457154,0.013460729602078947,0.012184776394474958,0.010745924489239273,0.009173304409429144,0.007488509358677656,0.005713352442240343,0.0038696467653727257,0.0019792054333303403,0.00006384155136870701,-0.0018575676431956596,-0.003777109898310674,-0.005687504144500138,-0.007581376649339034,-0.009451353680402315,-0.011290061505264947,-0.013090126391501894,-0.014844174606688111,-0.016547032643276546,-0.018199561360751078,-0.019801245136840565,-0.0213514707421132,-0.022849624947137166,-0.02429509452248066,-0.025687266238711856,-0.02702552686639895,-0.028309986016342752,-0.029542587627289518,-0.030724697916575425,-0.03185764912353985,-0.032942773487522205,-0.03398140324786189,-0.034974870643898315,-0.03592450791497087,-0.036831776435121005,-0.0376983522691133,-0.038525712531378556,-0.039315326808343876,-0.040068664686436405,-0.04078719575208325,-0.04147238959171153,-0.04212571579174838,-0.042748597013132,-0.043342216922115546,-0.0439076951002741,-0.044446151788051516,-0.044958707225891674,-0.045446481654238424,-0.04591059531353564,-0.04635216844422718,-0.046772250421978044,-0.04717160924166841,-0.047550983504342705,-0.04791111383210958,-0.048252740847077674,-0.048576605171355654,-0.048883447427052175,-0.0491740082362759,-0.0494489746733411,-0.04970881637163006,-0.04995397666993165,-0.05018490037203613,-0.05040203228173374,-0.050605817202814755,-0.050796699939069434,-0.05097512529428802,-0.05114148330353638,-0.05129601497583297,-0.0514389965866066,-0.051570706856222066 +0.,0.0037518714954120082,0.00774011347815377,0.010972805707442117,0.013481795091128318,0.015336779278200801,0.01660919638198719,0.017364846526026767,0.017669529833858798,0.017585166097014465,0.017157373016669104,0.016428988132307202,0.01544291938780377,0.014242074727033814,0.01286861729049056,0.011352429265265473,0.009715777497819177,0.007981159015103347,0.006171070844069647,0.004308010011669759,0.002414473544855346,0.0005099722549289074,-0.001397159186513521,-0.0032992476966378606,-0.005188526238746254,-0.007057227776140823,-0.008897585272123695,-0.010701831689996999,-0.012462199993062854,-0.01417318650320154,-0.01583551143880867,-0.01744849291484727,-0.01901134884964312,-0.020523297161521997,-0.02198355576880969,-0.023391342589831984,-0.024745875542914655,-0.026047131829497028,-0.027297023846384882,-0.028496864248249244,-0.029647930106923466,-0.030751498494240928,-0.03180884648203501,-0.03282125114213907,-0.0337899895463865,-0.03471648451252587,-0.03560241550377277,-0.03644924958811604,-0.03725844552214324,-0.03803146206244198,-0.03876975796559985,-0.03947479198820444,-0.040148022886843354,-0.04079086918143014,-0.0414045246612494,-0.04199011138912959,-0.04254875173739297,-0.043081568078361825,-0.04358968278435841,-0.04407421822770501,-0.04453629678072389,-0.04497697272481405,-0.04539702287965747,-0.04579718981085372,-0.046178217934428424,-0.046540851666407174,-0.04688583542281558,-0.04721391361967926,-0.047525830673023836,-0.04782227894717336,-0.048103734232847147,-0.048370642348801465,-0.04862345047067992,-0.04886260577412607,-0.04908855543478356,-0.04930174662829595,-0.04950262653030685,-0.04969158815604882,-0.04986887549187866,-0.0500347659941772,-0.05018953951571608 +0.,0.003970600412091242,0.008201649951294143,0.01165570429075142,0.01436552519140226,0.016402309183302006,0.01783889376527847,0.018742372032327523,0.019179837079445032,0.019214401691524465,0.018892572812052796,0.018258100073854013,0.017354806548301255,0.016226515306767678,0.01491629131852606,0.013454734296164299,0.011864755177173631,0.010169504852006257,0.008392134211114372,0.006555794144950185,0.0046836355439658925,0.0027957754463776774,0.0009009540748121546,-0.0009927794611653109,-0.0028772808882268266,-0.004744405933044478,-0.006586010322290356,-0.008393949782636554,-0.010160080040755162,-0.011878580565529706,-0.013550036036847676,-0.015173604560114486,-0.016748341567944126,-0.018273302492950567,-0.01974754276774782,-0.021170117824949854,-0.02254008309717066,-0.023857288330815084,-0.025123615322397635,-0.02634032487083736,-0.02750864064822322,-0.02862978632664417,-0.029704985578189198,-0.030735462074947248,-0.031722439489007305,-0.032667303261430004,-0.03357173589175255,-0.03443719446779788,-0.035265127009602604,-0.03605698153720336,-0.03681420607063677,-0.03753824862993945,-0.03823055723514805,-0.03889254615299558,-0.0395254187359852,-0.04013029919501654,-0.04070831171171587,-0.04126058046770953,-0.04178822964462378,-0.04229238342408496,-0.04277416598771934,-0.043234636137278716,-0.04367457906943116,-0.044094740998847,-0.044495869824187365,-0.0448787134441134,-0.045244019757286216,-0.045592536662366956,-0.045925012058016745,-0.04624214326671783,-0.04654441194170921,-0.046832266178936405,-0.04710615532523621,-0.04736652872744545,-0.04761383573240095,-0.04784852568693952,-0.04807104793789799,-0.04828179829835954,-0.048481023602803666,-0.048669002350235,-0.04884601538672601 +0.,0.004186809498108428,0.008650849044487452,0.012317057141925223,0.015219424250913268,0.017430634103331934,0.019024823415168625,0.02007031112681993,0.020635416178682423,0.020784381696932207,0.02056455773270267,0.02002056123140358,0.019197085506065508,0.018138823869719024,0.01688969896656168,0.015480994300832968,0.013936235701988285,0.012279198231639388,0.010533656951398023,0.008723386922875952,0.006872163207684927,0.005000682042130391,0.003118072501602329,0.0012327439210297136,-0.0006467980701263818,-0.0025120478424048615,-0.004354499766344633,-0.006165648212484609,-0.00793698755136369,-0.009662393560998926,-0.011342320425615183,-0.012975772422131306,-0.01456164879054971,-0.016098848770872816,-0.01758627160310305,-0.01902281652724283,-0.02040738278329458,-0.021739697555773978,-0.023021612963221007,-0.02425433963571473,-0.025439049592923278,-0.02657691485451477,-0.027669107440157353,-0.028716799369519142,-0.02972116266226828,-0.03068354654585876,-0.031605636192264634,-0.03248887877463101,-0.03333471166882245,-0.03414457225070355,-0.03491989789613887,-0.03566212598099299,-0.0363726938811305,-0.03705301149757451,-0.03770429118920835,-0.038327658986050256,-0.03892424056068626,-0.03949516158570242,-0.04004154773368474,-0.040564524677219285,-0.04106521808889209,-0.04154469090891945,-0.04200373626588977,-0.04244310371235389,-0.04286354432267043,-0.043265809171197996,-0.04365064933229518,-0.0440188158803206,-0.04437105988963283,-0.04470808331219986,-0.04503037337026327,-0.045338380237321146,-0.045632555233953584,-0.04591334968074067,-0.04618121489826251,-0.046436602207099185,-0.046679962927830804,-0.04691169549030898,-0.047132049447192965,-0.04734130420522237,-0.04753974146823613 +0.,0.004400358248025417,0.009087674336214544,0.012956948007877231,0.016043685705747553,0.01842204294240503,0.020167358719345406,0.021349111729763923,0.022036780666855823,0.022295677331839396,0.022173949458575953,0.02171703713814133,0.020970459653282626,0.01997973628674695,0.018789603803642165,0.017431996183129937,0.015931025308716634,0.014311061094279702,0.01259647345369657,0.010811632300844688,0.008980907549601489,0.007125547931250189,0.005255054851750305,0.0033781822601009932,0.0015037814533499806,-0.0003592962714549792,-0.0022021996172661403,-0.004016077287035756,-0.005792077983716075,-0.007523786797048957,-0.009211532396720283,-0.010854171337795888,-0.012450452885006697,-0.013999126303083627,-0.01549894085675761,-0.01694864581075957,-0.018346990429820423,-0.019693584166680395,-0.020990250364343436,-0.022238151150103365,-0.023438408617215467,-0.02459214485893503,-0.025700481968517368,-0.026764542039217756,-0.0277854471642915,-0.028764511503479376,-0.02970342253546395,-0.030603617583183248,-0.03146652346956017,-0.03229356701751765,-0.0330861750499786,-0.033845774389865926,-0.034573791860102565,-0.035271632882939094,-0.03594051826981988,-0.03658157554514351,-0.03719593155832254,-0.03778471315876955,-0.03834904719589707,-0.038890060519117656,-0.03940887997784386,-0.03990657227237467,-0.04038393802098052,-0.0408417298072332,-0.04128070157862882,-0.041701607282663464,-0.0421052008668332,-0.042492236278634146,-0.04286346746556236,-0.04321960068363518,-0.04356112843196082,-0.04388850276513086,-0.0442021767832634,-0.04450260358647656,-0.04479023627488845,-0.045065527948617165,-0.04532893170778083,-0.045580848419202874,-0.04582153022312005,-0.046051257302588626,-0.046270312087281384 +0.,0.0046110921355604325,0.009512078519964374,0.013575452793177126,0.016838497937569162,0.019376822075565608,0.021266872830801208,0.02257922360770864,0.02338444781072058,0.023748865254981256,0.023721376658496565,0.023348201714740058,0.022675642027817765,0.021749999201835703,0.020616781178653055,0.019308539524370616,0.01784994370791966,0.016265929557404232,0.01458143290092839,0.012821389566596179,0.011010735382511655,0.009171245204848924,0.007312776429776644,0.005444412203873707,0.0035753339998946497,0.0017147232905940397,-0.0001282384512735664,-0.001944369752953614,-0.0037244891416915336,-0.005461903857979059,-0.007156821974400575,-0.00880795835411647,-0.010413918425889176,-0.011973307618481123,-0.013484731360654756,-0.014946795081172505,-0.016358104208796805,-0.017718155229781228,-0.01902874359365293,-0.020290984569285603,-0.02150595202735985,-0.022674719838556276,-0.023798361873555513,-0.024877952003038155,-0.02591456409768482,-0.026909478377599234,-0.027864384260550525,-0.02878070928250103,-0.02965986980328137,-0.030503282182722184,-0.031312362780654086,-0.03208852795690771,-0.0328331940713137,-0.033547761953611845,-0.03423346031707723,-0.0348914178599483,-0.03552276229852093,-0.03612862134909102,-0.03671012272795443,-0.037268394151407064,-0.03780456333574479,-0.0383197003664968,-0.03881461291230276,-0.039290056285257745,-0.039746787007842205,-0.04018556160253655,-0.04060713659182119,-0.04101226849817658,-0.04140171384408311,-0.04177618286746905,-0.04213617305365201,-0.04248213814506594,-0.04281453283043459,-0.04313381179848171,-0.04344042973793106,-0.04373484133750638,-0.044017501285931446,-0.044288812708545684,-0.04454903020198092,-0.0447984345976824,-0.045037308922843904 +0.,0.00481884394362413,0.009924004815912393,0.014172640847054923,0.017604045432965707,0.02029525641168045,0.02232373964735951,0.02376109928106136,0.024678939453844473,0.025144528355865683,0.02520747573152706,0.02491473796633144,0.024313355970118085,0.023450370652726253,0.022372018807903647,0.021111437140345933,0.019693824612932318,0.018144654418036095,0.016489399748030553,0.014753533795288995,0.012962529752184709,0.011138662569883072,0.009292129481933056,0.0074323276154528405,0.005568753328323852,0.0037109029784275567,0.0018682729236454048,0.000050359521858846755,-0.0017333408690506542,-0.003475870311818171,-0.005177321133735109,-0.006836272457118788,-0.008451191933802777,-0.010020547215620644,-0.011542805954405972,-0.013016435801992333,-0.014439904410213297,-0.01581259999756011,-0.017136290981304213,-0.018412047393765136,-0.019640896563885322,-0.020823865820607218,-0.021961982492873292,-0.02305627390962597,-0.024107767399807724,-0.02511771035354826,-0.02608779375817485,-0.027019435424450976,-0.027914041337356813,-0.028773017481872575,-0.029597769842978433,-0.030389704405654593,-0.031150227154881256,-0.03188073421334822,-0.03258246164861428,-0.03325653901639723,-0.03390409459410028,-0.03452625665912661,-0.0351241534888794,-0.03569891336076185,-0.03625166455217713,-0.03678348016259299,-0.03729517447474649,-0.03778750523114727,-0.03826123123553748,-0.03871711129165926,-0.039155904203254766,-0.03957836877406615,-0.03998526380783555,-0.04037730320562773,-0.04075498914990266,-0.041118776880918195,-0.04146912248836629,-0.04180648206193883,-0.042131311691327736,-0.042444067466224936,-0.042745205476322344,-0.04303513092842027,-0.04331410074387574,-0.04358239627809433,-0.04384030103110385 +0.,0.005023435077755908,0.01032338836438571,0.014748576231896187,0.01834050992378652,0.02117763043626181,0.023338334769704205,0.024895194908556628,0.025920782837262003,0.02648325651925823,0.026632891520781365,0.026417338650605686,0.025884335750058295,0.025081620660466295,0.024056117330794945,0.022841515605758932,0.02146351623543279,0.01994810162162207,0.01832125416613232,0.016608956270769092,0.014837190337337946,0.013028705729283756,0.01119402355785483,0.009342839917673732,0.007484950967009553,0.005630152864131413,0.0037882417673084237,0.0019690138348096905,0.0001822652249043365,-0.001564793447453955,-0.0032721435485278194,-0.004938234329822278,-0.006561401642845801,-0.00813998133910685,-0.009672309270113907,-0.01115672128737544,-0.012591553242399916,-0.013976089716393435,-0.015312072934339154,-0.01660052929058302,-0.017842441229355188,-0.019038791194885822,-0.0201905616314051,-0.02129873498314317,-0.02236429369433022,-0.023388453415810292,-0.02437290633305819,-0.02531906059175217,-0.026228311888435503,-0.027102055919651483,-0.027941688381943372,-0.028748604971854445,-0.029524201385927998,-0.030269868924355316,-0.030986850464734532,-0.03167627610806313,-0.03233927439121738,-0.03297697385107356,-0.03359050302450792,-0.034180990448396724,-0.03474956465961623,-0.035297301403882694,-0.0358250211449359,-0.03633348376200186,-0.03682345005081001,-0.037295680807089816,-0.037750936826570734,-0.038189978904982214,-0.038613567838053704,-0.03902242087464732,-0.039417044607017025,-0.03979789558647774,-0.040165431119362265,-0.04052010851200334,-0.040862385070733746,-0.04119271810188626,-0.04151156491179364,-0.04181933261312723,-0.042116280319918924,-0.042402689790602625,-0.04267884487697312 +0.,0.005224676990264974,0.010710157584127272,0.015303318958278758,0.019048071507125786,0.02202422923533838,0.024311036441663558,0.025981971154440692,0.02711051140200917,0.02776564736958186,0.027998278005190103,0.027856706921901446,0.027389327167775788,0.026644531790873036,0.02566989083525095,0.024499615746508555,0.02315988174721877,0.02167715269572081,0.02007789245035388,0.0183885648694572,0.01663563381136998,0.014842297723130813,0.013019385832730665,0.011176878397715629,0.009324856502274482,0.007473401230596037,0.00563259366686909,0.0038125148952824397,0.0020232460000248944,0.0002722379489042484,-0.0014403843781528019,-0.0031129461487534264,-0.004743657306139346,-0.006330727793552274,-0.007872367554233945,-0.009366786531426075,-0.010812194668370382,-0.012207777469590444,-0.01355525178610893,-0.014855601948837041,-0.01610976714972916,-0.017318686580739675,-0.018483299433822993,-0.01960454490093349,-0.020683362174025572,-0.02172093623583632,-0.022718960096732216,-0.02367883229555909,-0.024601938324798768,-0.02548966367693309,-0.02634339384444387,-0.02716451431981294,-0.027954410595522148,-0.028714469032806438,-0.029445938778482547,-0.030149950170773154,-0.03082763170851374,-0.03148011189053977,-0.032108519215686714,-0.03271398218279004,-0.033297629290685214,-0.0338605385672847,-0.03440353622753472,-0.034927383998113695,-0.035432844381932276,-0.035920679881901105,-0.03639165300093085,-0.036846526241932145,-0.037286062107815654,-0.037710980883400955,-0.03812179328521581,-0.03851895699213573,-0.03890293034613315,-0.03927417168918049,-0.03963313936325017,-0.03998029171031463,-0.04031608707234628,-0.04064093429382245,-0.04095509454911167,-0.04125884988223292,-0.04155248437928984 +0.,0.005422372466461648,0.011084235529781807,0.015836926216778704,0.019726909747734066,0.022835339497692276,0.025242226464587507,0.027021894025994805,0.02824866555948922,0.028992306981861525,0.02930429895665492,0.029233556939732376,0.02882908811830256,0.028139899679574146,0.027214167346987502,0.026086593096198,0.024783799706649744,0.02333270514886893,0.021760227393381727,0.02009328441071432,0.018358794171392887,0.016580379238038057,0.014769161398602914,0.012935390481766451,0.011089417837758454,0.009241594816808738,0.007402272769147098,0.005581803045003338,0.0037905369946072643,0.0020361537927349213,0.00031887992192588567,-0.0013594914033026578,-0.0029970500233901898,-0.004591885778776186,-0.006142088509900143,-0.007645748057201538,-0.00910095426111985,-0.010506798038659861,-0.01186497166323109,-0.013176418952075181,-0.014442037451963138,-0.015662724709665964,-0.01683937827195468,-0.017972895685600284,-0.019064174497373795,-0.020114370073074494,-0.021125175872933315,-0.022097980885163793,-0.023034160480319,-0.023935090028952034,-0.024802144901615968,-0.025636700468863884,-0.026440132101248882,-0.027213821103499094,-0.027959022354398642,-0.028676866125468336,-0.02936848058408484,-0.030034993897624818,-0.03067753423346491,-0.03129722975898179,-0.031895208641552104,-0.03247255083091474,-0.033030087866865405,-0.033568583038723385,-0.03408880027625666,-0.03459150350923319,-0.03507745666742098,-0.035547423680588,-0.03600216847850221,-0.03644241407366914,-0.03686867502332498,-0.037281409953692314,-0.03768107806471711,-0.03806813855634529,-0.038443050628522796,-0.038806273481195565,-0.039158266314309534,-0.039499439531672495,-0.0398300562354725,-0.040150398641340936,-0.040460750955819226 +0.,0.005616316963543876,0.011445541141000555,0.016349453513252763,0.02037720471222289,0.023611250464077208,0.026132291072710968,0.028015435684458346,0.02933579344565352,0.03016385058524891,0.030551628598080836,0.03054861448584564,0.030204389171523835,0.029568533578095933,0.028689789344344418,0.027603318382072226,0.02633616451787807,0.024915672905091404,0.023369188697041684,0.021724057047058362,0.0200076231084709,0.018243908958662132,0.016444313598405754,0.014619342052768013,0.0127796014969629,0.010935699106204427,0.009098242055706598,0.007277837520683426,0.005485092676348915,0.003727902941164873,0.0020065918297922265,0.000323065324213894,-0.0013206520300816597,-0.002922535687605963,-0.00448056110287056,-0.005992703730386982,-0.007456939024666763,-0.008872267731401064,-0.010240358320435312,-0.011562115619627724,-0.012838397111586262,-0.014070060278918887,-0.015257962604233581,-0.01640296157013829,-0.017505914659241003,-0.018567948651085107,-0.0195907570790499,-0.020575719434683427,-0.021524201046306563,-0.022437567242240195,-0.0233171833508052,-0.024164414700322448,-0.02498062661911284,-0.02576719523667852,-0.026525380630233783,-0.027256312704783157,-0.02796111900690106,-0.028640927083161898,-0.029296864480140072,-0.029930058744410005,-0.03054163742254609,-0.031132682029470917,-0.031704029007047545,-0.032256442926895064,-0.032790688869811166,-0.03330753191659354,-0.03380773714803986,-0.034292069644947826,-0.03476129448811511,-0.035216137113094396,-0.03565711563633644,-0.036084689454492586,-0.03649931845116009,-0.03690146250993614,-0.03729158151441795,-0.037670135348202724,-0.03803758389488768,-0.03839433894678431,-0.03874066540129875,-0.03907684553514882,-0.03940316356500208 +0.,0.005806299866149755,0.011793990605500801,0.016840955899838594,0.020999138058115884,0.02435225490574284,0.026981621813556934,0.028963075238682807,0.0303724516382451,0.0312809032122562,0.03174095219061974,0.031802617495193385,0.03151601405234621,0.03093125678844727,0.030097614152154607,0.02905067788197764,0.027817886754290307,0.02642698659698397,0.024905723237949987,0.02328184250507973,0.021583090226264548,0.01983386376628743,0.01804582420647158,0.016229717614669334,0.014396392772923277,0.012556698463276018,0.010721483467770153,0.008901596568448286,0.00710788654735302,0.005348453289472292,0.0036237128459299097,0.0019356784405292755,0.00028648337832302333,-0.0013217390356362036,-0.0028868554962957816,-0.004406732698603069,-0.00587923733750543,-0.007303284329186299,-0.008680519091415023,-0.010011808960794245,-0.011297972910014931,-0.01253982991176804,-0.013738198938744554,-0.014893898963635417,-0.016007748959131617,-0.01708084812827842,-0.018114889699325863,-0.01911124371871285,-0.020071265549597376,-0.020996310555137468,-0.021887734098491124,-0.02274689154281636,-0.023575138251271204,-0.02437384505818675,-0.025144276709561476,-0.025887562448162905,-0.026604828914467735,-0.027297202748952646,-0.027965810592094312,-0.028611779084369425,-0.029236234866254665,-0.029840260664994046,-0.030424697405468933,-0.030990310665739235,-0.03153786640630748,-0.03206813058767619,-0.0325818691703479,-0.03307984811482514,-0.03356283338161042,-0.034031552528369126,-0.034486526951482896,-0.03492821664441288,-0.035357082003429054,-0.03577358342480135,-0.036178181304799745,-0.03657133603969417,-0.036953508025754575,-0.037325110274686255,-0.03768640934654949,-0.038037687472035245,-0.0383792287711464 +0.,0.005992105802198225,0.012129498596351733,0.017311489093864235,0.021592894044928458,0.025058650043788606,0.027790616385781907,0.029865299510653597,0.03135920585814892,0.03234410034275023,0.032872966625781236,0.03299631660110531,0.03276476014336799,0.03222890712721478,0.03143851437068222,0.030429573821146756,0.029229893525899428,0.02786759390624686,0.026370795383495675,0.024767618378952506,0.023086183313923973,0.021351238992774788,0.019574693665137373,0.017767520513176222,0.015940795934468236,0.014105596326590312,0.012272998087119354,0.010454077613632262,0.008659911303705945,0.006898791921240745,0.005171223634703997,0.0034793214749230233,0.001825321972517357,0.00021146165810653848,-0.0013600229376899108,-0.002886895284252452,-0.004366918850961551,-0.005798926990516751,-0.0071845427973069665,-0.008524597587997472,-0.00981987335215971,-0.01107115207936512,-0.012279215759185162,-0.013444846381191262,-0.014568825934954885,-0.015652227035446498,-0.016696742226090133,-0.01770373215719345,-0.018674542301011836,-0.019610518129800723,-0.020513005115815507,-0.021383348731311595,-0.022222894448544417,-0.023033007685455093,-0.02381495733125336,-0.024569871674824578,-0.02529887616927433,-0.026003096267708196,-0.02668365742323174,-0.027341685088950546,-0.027978304717970186,-0.028594599900829604,-0.029191415630272673,-0.02976951821943251,-0.030329674241698627,-0.030872650270460534,-0.03139921287910774,-0.03191012864102976,-0.032406164129616104,-0.03288804872748435,-0.03335630683401096,-0.03381139886914897,-0.03425378557420364,-0.034683927690480246,-0.035102285959284066,-0.03550932112192035,-0.03590549391969438,-0.03629121841637786,-0.036666762702276715,-0.037032408858314936,-0.03738844080451635 +0.,0.006173515809439378,0.012451979518110053,0.01776111060418998,0.0221586605322803,0.025730738447937072,0.028559679452224748,0.030722603774115714,0.03229663164258235,0.03335408851842662,0.03394838098674058,0.03413047564858713,0.03395143895494037,0.03346233735677436,0.03271337827192815,0.031740924736731194,0.0305731288149127,0.02923845987288586,0.027765387277063874,0.026182380393859953,0.024517908589687297,0.02279704864609648,0.021031941293822784,0.019233773129857152,0.01741383440671669,0.015583415376918508,0.013753806292979714,0.01193629740741742,0.010142178972748736,0.008379925237040248,0.006650124145180019,0.004954987192844351,0.0032968486963816167,0.0016780429721401971,0.00010090433646845311,-0.001432232894285236,-0.0029190344037724964,-0.004358256170129523,-0.005751499670075376,-0.00709956164421946,-0.008403188597712528,-0.009663127035705335,-0.010880123463348651,-0.012054924385793218,-0.01318827630818981,-0.014281226224144745,-0.015335465611312653,-0.016352345770106785,-0.01733320235315392,-0.018279371013080865,-0.01919218740251439,-0.020072987174081295,-0.02092310598040838,-0.021743903700519776,-0.02253665284553884,-0.02330248046287976,-0.024042510540997986,-0.02475786706834899,-0.0254496740333882,-0.026119055424571096,-0.026767135230353116,-0.027394997559435974,-0.0280034910613315,-0.02859338251737605,-0.029165438851536024,-0.029720426987777826,-0.030259113850067857,-0.030782266362372523,-0.03129065144865822,-0.031785000023179646,-0.032265839213863674,-0.03273362970013522,-0.033188832404030776,-0.03363190824758683,-0.03406331815283987,-0.03448352304182637,-0.03489298383658283,-0.03529211548747228,-0.03568118748292235,-0.03606048165367446,-0.03643028161988138 +0.,0.006350308664162335,0.01276134869962129,0.01818988080507047,0.022696629950966826,0.026368828915373885,0.0292892234348853,0.03153549247383056,0.03318531499653915,0.03431152593354322,0.03496791708397303,0.035205872179974076,0.035076876565493714,0.034632415584479284,0.03392311016140999,0.03298566580555508,0.03184855377258714,0.03054056716404762,0.02909049908147798,0.027527142626419674,0.025879290900414152,0.024172325590898956,0.022418605452447504,0.020629517030101303,0.018816550905120952,0.016991197658767058,0.015164947872300237,0.013349292126981098,0.011555721004070253,0.009792879037124549,0.008061433686326707,0.0063636876643497885,0.004702067729312034,0.003079000639331686,0.001496913152526968,-0.00004176797298387528,-0.0015346159790826058,-0.002980313579902596,-0.004380441317058315,-0.0057357627709509465,-0.007046990432290799,-0.008314836791788181,-0.009540014340153424,-0.01072323556809682,-0.011865212966328705,-0.012966968851737483,-0.01403019325420225,-0.01505622816758441,-0.016046399493002114,-0.01700203313157354,-0.01792445498441684,-0.018814990952650178,-0.019674966937391732,-0.020505737154887255,-0.02130857722135471,-0.022084612659185165,-0.022834965718871916,-0.02356075865090826,-0.024263113705787473,-0.02494315313400285,-0.025601999186047678,-0.026240736147609307,-0.026860215918104547,-0.027461205484704092,-0.02804447186414674,-0.028610782073171272,-0.029160903128516477,-0.02969560204692115,-0.03021564584512407,-0.03072176667961705,-0.03121449413506813,-0.031694288986646585,-0.03216161217613905,-0.03261692464533212,-0.033060687336012445,-0.03349336118996664,-0.033915407148981315,-0.03432724088645453,-0.0347291331572214,-0.035121365444697246,-0.035504220972636454 +0.,0.006522262141595169,0.013057523570974627,0.018597863994694333,0.023207000251797432,0.02697323732462714,0.029979669283843585,0.03230447991854103,0.034025853017813766,0.03521708299878274,0.035932309963583195,0.03622329789292358,0.03614191403397443,0.03574002563390628,0.03506863071215185,0.03416474914430496,0.033057146988793785,0.031774916315885936,0.030347149195849007,0.02880293769895062,0.027171373895458362,0.025478121703952177,0.02373574368029848,0.02195581308710147,0.02015000754611852,0.018330004679107025,0.016507482107824375,0.014694117454027962,0.012901588339475181,0.011138698583687143,0.0094061909823514,0.007706454313237207,0.006042002529799529,0.004415349585493337,0.002829009433773581,0.0012854960280952311,-0.00021267667808674753,-0.0016641221659123842,-0.0030704007011851985,-0.004432244091343617,-0.005750332253328225,-0.007025345104079608,-0.008257962560538375,-0.009448864539645097,-0.010598730958340385,-0.011708560379052345,-0.012780041001014297,-0.013814505551838994,-0.014813270245942374,-0.01577765129774041,-0.01670896492164904,-0.01760852733208423,-0.018477654743461944,-0.019317695584036173,-0.020129928062987294,-0.02091547589814923,-0.02167545933268044,-0.02241099860973937,-0.023123213972484468,-0.023813225664074185,-0.024482153927666957,-0.025131082888775785,-0.025760867294263204,-0.02637227407926722,-0.026966070099995174,-0.027543022212654384,-0.028103897273452184,-0.028649462138595913,-0.029180483664292885,-0.029697694963855256,-0.030201627809661635,-0.030692742912182127,-0.031171501075282118,-0.031638363102827,-0.03209378979868217,-0.032538241966713,-0.0329721804107849,-0.033396021365758824,-0.033810036721697176,-0.034214507520760426,-0.03460971649707892 +0.,0.006689154222568002,0.01334042480024338,0.018985129416858232,0.023689975820743704,0.027544287459405525,0.0306314472192021,0.03303009094968981,0.03481885450042505,0.036071442886194176,0.036842308399266215,0.03718355908444299,0.03714740780055184,0.0367860674064201,0.03615087729083976,0.03527914410354973,0.034199904756907686,0.032942525972090644,0.03153637447027562,0.030010816972639652,0.02839522020035975,0.02671550803021727,0.024984432836201415,0.023213741607723604,0.02141528596015879,0.01960091750888194,0.017782487869268025,0.01597184865669202,0.014180851486528898,0.012418448666854043,0.010685454231890672,0.008984337970116166,0.007317695882992656,0.005688123971982285,0.004098218238547175,0.0025505746841494657,0.0010477893102512938,-0.0004086860816227651,-0.0018203921173916109,-0.0031880301896331643,-0.004512249052316067,-0.00579369745940896,-0.007033024164880508,-0.00823087792269934,-0.009387907486834123,-0.010505088564824298,-0.011584107141736997,-0.012626286716062559,-0.013632933876855347,-0.014605355213169757,-0.015544857314060153,-0.016452746768580925,-0.01733033016578646,-0.018178950019365044,-0.01899988662422889,-0.019794261618119022,-0.020563192971397557,-0.021307798654426627,-0.022029196637568332,-0.022728504891184807,-0.023406841385638158,-0.02406528975318842,-0.02470470719026419,-0.025325860326603465,-0.025929515609070836,-0.026516439484530873,-0.02708739839984816,-0.027643158801887287,-0.02818448713751282,-0.02871211719549137,-0.02922658266980576,-0.029728344049055746,-0.030217861844807167,-0.030695596568625857,-0.031162008732077664,-0.031617558846728414,-0.03206270742414395,-0.03249787110112451,-0.03292332277243892,-0.033339342948217145,-0.03374621378297416 +0.,0.00685076429600335,0.01360997739968531,0.01935175225325993,0.024145768368355934,0.02808231180782913,0.031244997448916435,0.033712861586083796,0.035564940513797175,0.03687530204963613,0.03769867535951675,0.03808747706991394,0.0380942300620751,0.03777145721724767,0.03717080425826099,0.03632983753588964,0.03527784131274958,0.03404443309646144,0.03265923039464587,0.031151850714923497,0.029551911564914966,0.027885574913502315,0.026165769213534473,0.024404402433512423,0.02261348738019431,0.020805036860338324,0.018991063680702632,0.01718358064804541,0.015394600569124842,0.013633213648123806,0.011900301145078982,0.010198408903791156,0.00853020992701049,0.006898377217487157,0.005305583777971311,0.00375450261121312,0.0022478067199627506,0.0007870093198291672,-0.0006294111877143734,-0.0020021271088312012,-0.0033317574149076285,-0.004618921077329969,-0.005864237067484558,-0.007068324356757695,-0.008231801916535721,-0.009355623476083545,-0.010441472422357684,-0.011490663058545533,-0.01250449240607029,-0.013484257486355178,-0.014431255320823393,-0.015346782930898153,-0.01623213733800268,-0.017088655013324457,-0.017917617835397154,-0.018720145090311502,-0.019497352214054443,-0.02025035464261293,-0.020980267811973884,-0.021688207158124265,-0.02237528811705099,-0.023042593498829825,-0.023690982556333604,-0.02432122136502766,-0.024934075718103983,-0.025530311408754544,-0.02611069423017133,-0.02667598997554633,-0.027226964438071505,-0.027764351804719423,-0.028288687428041602,-0.028800431420854127,-0.02930004385131834,-0.029787984787595582,-0.030264714297847193,-0.030730692450234517,-0.031186379312918896,-0.031632191767226994,-0.03206840358289699,-0.0324952946503405,-0.032913146457629446 +0.,0.0070068743193661236,0.013866111855427014,0.019697814634279196,0.024574597818505628,0.028587652347973225,0.031820770864296855,0.034353339639870105,0.03626474494708658,0.03762937070334054,0.0385021884262442,0.03893588854731213,0.038983269087168634,0.03869712806643806,0.03812938320078529,0.03731783399193089,0.03629198899867281,0.03508169310846473,0.03371679120876035,0.03222712818701338,0.030642548930677495,0.028989432046248074,0.027280868574392263,0.025528914961153504,0.023745732650189002,0.021943483085155997,0.020134327709711717,0.018330427967513392,0.01654394530221826,0.014784097429328994,0.013051828907566142,0.011349756781082115,0.009680626109231172,0.008047181951367586,0.00645216936684561,0.004898333415019512,0.0033884191552435586,0.001923997431372601,0.000503565083241786,-0.0008735224072034323,-0.002207855578242752,-0.0035000249681558728,-0.004750621115222517,-0.005960234557722368,-0.007129455833935154,-0.008259217548264999,-0.009351200105430979,-0.010406708643707116,-0.011427030670867774,-0.012413453694687352,-0.013367265222940216,-0.014289752763400757,-0.015182203823843362,-0.016045948703665866,-0.016882270368257513,-0.017692285484459436,-0.018477106696158124,-0.019237846647240063,-0.01997561798159171,-0.020691533343099554,-0.021386705375650062,-0.022062215742414466,-0.022718925364519815,-0.023357599518774096,-0.02397900310483563,-0.024583901022362704,-0.025173058171013635,-0.025747239450446734,-0.026307209760320287,-0.026853703412745317,-0.02738725715901891,-0.027908330585500574,-0.02841738316909309,-0.028914874386699242,-0.02940126371522181,-0.02987701063156357,-0.03034257461262731,-0.03079837262902737,-0.03124467919664458,-0.0316817735014999,-0.03210993628147947 +0.,0.007157270018282383,0.014108765169526255,0.02002340656978474,0.02497669314415511,0.029060661295574386,0.03235922970752332,0.03495208531131844,0.0369189150382763,0.03833437329171596,0.03925364021079553,0.039729645964510604,0.03981542953943895,0.03956402992215834,0.039027603177511014,0.038244155934774836,0.03724339844864422,0.03605538004189646,0.03471015003730886,0.0332377577576587,0.03166825252572327,0.030028208547288014,0.02833086621220741,0.0265884181916746,0.024813162262466704,0.023017396201360875,0.021213417785134258,0.01941352479056399,0.017630014994427234,0.015872223448984105,0.014141154171381664,0.01243949065290036,0.010770045168199497,0.009135629991938395,0.007539057398776354,0.00598313966337269,0.004470689060386715,0.0030033303597530375,0.0015795782741045098,0.00019881480578412894,-0.0011395234684670836,-0.002435999971908107,-0.0036911781277979444,-0.004905621359395557,-0.006079893089959955,-0.007214905629029263,-0.008312336015024202,-0.009373480248149973,-0.010399616372636785,-0.011392022432714881,-0.012351976472614472,-0.013280756536565791,-0.014179640668799075,-0.015049952866293405,-0.015892976690095845,-0.016709825924136258,-0.017501610166299798,-0.018269439014471596,-0.019014422066536772,-0.01973766892038047,-0.02044028917388781,-0.021123363022880863,-0.021787752673656628,-0.022434222364459508,-0.023063535866006235,-0.023676456949013505,-0.024273749384198046,-0.024856176942276573,-0.025424503393965785,-0.025979462907690536,-0.026521593377024092,-0.02705135371441714,-0.027569202660885785,-0.028075598957446126,-0.02857100134511428,-0.02905586856490634,-0.029530659357838412,-0.029995790630806707,-0.030451537518040136,-0.030898178419439974,-0.031335993241970825 +0.,0.007301741873679717,0.014337881921914791,0.020328626898334735,0.025352293194819468,0.029501701835819974,0.032860848219254765,0.03550967176222607,0.037528111881836114,0.03899104893799845,0.039953838749087506,0.04046961786608661,0.04059163278087026,0.04037312998531293,0.039866470950396,0.03910984393913177,0.03813313875946065,0.03696658669109514,0.035640419013747746,0.03418486700713094,0.032630161950957255,0.031003053032455125,0.029316917008426143,0.027584070774811783,0.02581693639124445,0.02402793591735657,0.022229491412780553,0.02043402493714882,0.01865395855009379,0.016898734678738793,0.015169413046493017,0.013468738941556792,0.011799587117260995,0.01016483232693652,0.008567349323914245,0.007010012861525063,0.005495697693099858,0.00402607889702393,0.0025996885165951496,0.0012159338378678116,-0.00012572273364041381,-0.0014258187924118583,-0.0026848919329288757,-0.003903479749673781,-0.005082119837128933,-0.0062217050163497056,-0.007323908575729959,-0.008390017400596016,-0.00942130011773656,-0.010419025353940318,-0.011384461735995976,-0.01231887789069225,-0.013223542444817854,-0.014099772960986176,-0.014948853110505495,-0.01577189353464899,-0.016570000535193627,-0.017344280413916363,-0.01809583947259414,-0.018825784013003923,-0.01953522033692265,-0.020225226856717987,-0.020896666686051918,-0.021550302789166316,-0.022186897576864324,-0.022807213459949054,-0.023412012849223653,-0.02400205815549124,-0.024578111789554945,-0.02514090751163148,-0.02569098410459243,-0.026228799662724768,-0.026754812049727357,-0.027269479129299046,-0.027773258765138684,-0.028266608820945123,-0.028749987160417212,-0.029223810476024747,-0.029688354393713604,-0.030143896448393177,-0.0305907156382848 +0.,0.00744008641544861,0.014553415235473507,0.020613584143543483,0.025701647475643487,0.029911148817467956,0.03332611325385597,0.03602668565811061,0.03809301090353497,0.03960015185730632,0.04060360785850826,0.0411566891991981,0.04131281713131673,0.04112541290680499,0.04064701116301746,0.03991595683540252,0.038962297603783023,0.037816424696263326,0.03650872934094779,0.03506960276594077,0.033529436199346625,0.0319151336165403,0.030240195419292838,0.0285170509825514,0.026758234854690314,0.02497628158408392,0.023183725719106544,0.02139310180813251,0.019616944399536162,0.01786479354836785,0.016137761021364178,0.014438649357634836,0.01277039115840939,0.011135919024917408,0.009538165558388446,0.007980063360052074,0.006464545031137857,0.00499333242618989,0.0035649744004210464,0.0021789023183321904,0.0008346031602324447,-0.00046843609356906756,-0.0017307284627632463,-0.002952786967040952,-0.004135124626093088,-0.005278615555093826,-0.006384928909275975,-0.00745534247852204,-0.008491115514165416,-0.009493507267539534,-0.01046377698997779,-0.011403183932813605,-0.012312987347380401,-0.013194498228686128,-0.01404899987892744,-0.01487759954087064,-0.015681399973842117,-0.016461503937168255,-0.017219014190175425,-0.01795503349219002,-0.018670664602538405,-0.019366983838431346,-0.020044854848539795,-0.020705039092117034,-0.02134829739349612,-0.021975390577010083,-0.02258707946699198,-0.02318412488777485,-0.02376728766369173,-0.024337300886588933,-0.02489470397928658,-0.02543995407682597,-0.02597350802732603,-0.02649582267890567,-0.027007354879683823,-0.027508561477779404,-0.02799989932131133,-0.028481784739965193,-0.028954493726051383,-0.02941830287339653,-0.02987349019648959 +0.,0.0075721072660898696,0.014755327764556347,0.020878397391560527,0.02602501691896734,0.030289389432864904,0.03375552487605173,0.036503727689418466,0.03861430231385573,0.04016245174914117,0.041203787475098105,0.04179176160069803,0.04197993811049042,0.041821880989024715,0.04137026650584393,0.04066357184248063,0.0397319813339025,0.03860602462137544,0.03731623134616531,0.035893131149537995,0.03436725367275937,0.03276563791442608,0.031101895463235142,0.02938855668455867,0.02763825708002383,0.025863632151257816,0.02407731739988781,0.02229194832754099,0.02052016043584455,0.01877158187794517,0.017047372891265348,0.015350388825116926,0.01368361560483346,0.012050039155748518,0.010452645403195647,0.00889442027250841,0.007378349689020368,0.005906198837211863,0.004476532888763641,0.0030888061131490096,0.0017425288441315903,0.00043721141547499887,-0.0008276358390571681,-0.0020525025857012743,-0.00323787849069373,-0.004384619722001257,-0.005494390919426332,-0.006568460792994097,-0.007608079256344706,-0.008614496223118346,-0.00958896160695517,-0.010532725321495358,-0.011447037280379088,-0.012333201776507367,-0.013192501269840333,-0.014026039352660662,-0.014834914999235886,-0.015620227183833546,-0.016383074880721153,-0.01712455706416624,-0.017845772708436326,-0.0185477957283474,-0.019231489940839144,-0.019897615073626754,-0.02054693014240986,-0.021180194162888067,-0.021798166150760998,-0.022401605121728275,-0.022991270091489508,-0.023567893227772068,-0.024132014347755047,-0.02468408948929786,-0.02522457434981252,-0.02575392462671103,-0.02627259601740542,-0.026781044219307687,-0.02727972492982985,-0.027769053969919664,-0.028249307574295227,-0.028720761322308243,-0.029183692172470244 +0.,0.007697616232752562,0.014943592607446947,0.021123197103147008,0.026322674607594753,0.030636823856997505,0.034149596927197816,0.03694141307348577,0.03909269155115147,0.04067873418569681,0.041755233992169676,0.04237575369083665,0.04259396869106978,0.04246355440224111,0.04203729789936797,0.041353784720927225,0.040443315108045816,0.039336536056449704,0.03806409456186484,0.036656637620017175,0.03514481222663266,0.0335557730705843,0.03190323073694417,0.030199805352451488,0.028458222097450706,0.026691206152286328,0.024911482697302825,0.02313177691284468,0.021364813979256395,0.019620300837079902,0.017899442713076925,0.01620514343239264,0.01454043782869435,0.01290836073564937,0.011311946986924995,0.00975423141618854,0.008238248857107318,0.006765804464621244,0.005335479254639484,0.003946749260265534,0.0025991469803895717,0.0012922049139017676,0.00002545555969227231,-0.0012015685833487216,-0.0023893350163310696,-0.003538682694634942,-0.0046512713615003715,-0.005728360658746667,-0.0067711911957586335,-0.007781003581921114,-0.008759038426618918,-0.009706536339236876,-0.010624737929159828,-0.011514940651453623,-0.012378425657184871,-0.013216292640027829,-0.014029636550287092,-0.014819552338267256,-0.015587134954272901,-0.016333479348608623,-0.017059680471579002,-0.01776680953289325,-0.01845573015679867,-0.01912720011734056,-0.019781976403790105,-0.020420816005418476,-0.021044475911496857,-0.021653713111296425,-0.022249284594088353,-0.022831921352198466,-0.023402163355466632,-0.023960465409750917,-0.024507281929731038,-0.02504306733008668,-0.02556827602549756,-0.026083362430643374,-0.026588780960203822,-0.027084946782886563,-0.02757213625336518,-0.02805062386574426,-0.02852068545297249 +0.,0.007816434333345114,0.015118194241908247,0.021348125937815318,0.026594906498292457,0.030953865880678142,0.03450885757337579,0.037340372023995594,0.03952889968014775,0.04114980094711525,0.04225882053805939,0.04290960129891227,0.043155899477369294,0.043051471321125856,0.042649184593010495,0.04198770983829654,0.04109744292584222,0.04000912762660254,0.03875350771153245,0.03736132695158697,0.035863329117721054,0.03428676569145022,0.03264543433449495,0.030952033967605715,0.02921936843841018,0.02746024159453605,0.025687457283611013,0.02391381935326276,0.022152131651118987,0.020412170815409306,0.01869518367309946,0.017004118298089496,0.015342054125597087,0.01371207059083991,0.012117247129035624,0.010560663175401903,0.009045398165156425,0.007573293951572231,0.0061429469456296985,0.004753853835164502,0.003405568129205978,0.0020976433367834502,0.0008296329669262275,-0.00039890947133634194,-0.001588430468974957,-0.002739752479249239,-0.0038545299691182685,-0.004934013519832411,-0.005979434465541741,-0.00699202414039637,-0.007973013878546377,-0.008923635014141862,-0.009845118881332928,-0.010738755960434922,-0.011605825633649654,-0.012447423451747645,-0.013264640105839946,-0.014058566287037604,-0.014830292686451642,-0.015580909995193116,-0.01631150890437305,-0.017023157620466522,-0.0177167192200051,-0.0183929493056293,-0.019052602626728605,-0.019696433932692475,-0.020325197972910384,-0.020939649496771802,-0.021540543253666198,-0.022128608813749333,-0.02270438606183947,-0.023268328440059403,-0.02382088895139646,-0.024362520598837943,-0.024893676385371183,-0.025414809313983495,-0.0259263723876622,-0.02642877998187125,-0.02692230845040122,-0.027407231133872452,-0.02788382267265419 +0.,0.007928392821307806,0.015279129412375999,0.021553339535321046,0.0268420121089089,0.03124094350996949,0.034833849824677264,0.037701250197186294,0.03992366377165061,0.04157647034073077,0.04271543724044279,0.043394257677855215,0.04366673887505532,0.04358668805413039,0.043207024258351975,0.04256648023008225,0.04169552766056599,0.04062498699889535,0.03938567869416245,0.03800842319545945,0.03652404095187845,0.03495986177832659,0.033329758767407236,0.03164649893023388,0.029922954035359016,0.028171995851335167,0.026406496146714847,0.02463932669005058,0.022883359249894885,0.02114843129516194,0.019435827956934108,0.017748537438949694,0.016089679581061375,0.014462374223121832,0.012869741204983732,0.011314900366499757,0.009800971547522581,0.008329830115419483,0.006900087450018113,0.005511259817716142,0.004162920616337334,0.00285464324370545,0.0015860010976442287,0.00035656757597745097,-0.00083408392347115,-0.0019867600380709203,-0.0031031095804719177,-0.004184374074905031,-0.005231775604803108,-0.006246536253599029,-0.0072298781047256434,-0.008183023241615826,-0.009107193747702452,-0.010003672990490688,-0.010873738130244712,-0.0117184803343426,-0.012538985803113759,-0.013336340736887591,-0.01411163133599348,-0.014865943800760837,-0.015600364331519043,-0.01631595783802244,-0.017013586500153735,-0.017694003535788115,-0.018357961245293472,-0.01900621192903768,-0.01963950788738862,-0.020258601420714187,-0.02086424482938225,-0.02145716601916852,-0.02203790455632175,-0.022606912390547747,-0.023164640987208624,-0.02371154181166646,-0.024248066329283356,-0.024774666005421407,-0.02529179230544271,-0.02579985867310761,-0.02629914134220483,-0.026789912434081114,-0.02727244533198531 +0.,0.008033334151042374,0.015426407985440963,0.02173900726831632,0.02706430517916233,0.03149849954327777,0.03512513203494654,0.038024709120797855,0.040277737267460895,0.041959577508414156,0.04312599148147567,0.04383069371217836,0.04412751325658754,0.044070279170768514,0.04371193308226866,0.043091247662356905,0.042238751094653866,0.04118532089384653,0.03996183457462184,0.03859916965166678,0.03712820363966832,0.035576326668879305,0.033957475893931235,0.03228447597820294,0.03057025613170094,0.02882774556443175,0.027069873486401906,0.02530956910761793,0.02355976163808636,0.02183034073467646,0.02012262663031051,0.018439643648606268,0.016784547947809016,0.015160495686164035,0.013570643021916589,0.01201814611331196,0.010506161118595427,0.009036593823351919,0.007608070172795302,0.006220124968699487,0.004872350410255251,0.0035643386966533646,0.00229568202708458,0.0010659726007396886,-0.00012519738319056507,-0.0012786194081198096,-0.0023959362563305683,-0.0034783803944296926,-0.0045271646750678525,-0.0055435019508957555,-0.006528605074564074,-0.007483686898723506,-0.00840996027602475,-0.009308701322005505,-0.010181184529027668,-0.011028496444371146,-0.011851718549606552,-0.012651932326304504,-0.013430219256035587,-0.014187660820370427,-0.014925338500879615,-0.01564431362180526,-0.01634544712368702,-0.017029489630623677,-0.017697190789104617,-0.018349300245619225,-0.018986567646656877,-0.019609742638706972,-0.020219574868258886,-0.020816790339097974,-0.021401928069604212,-0.021975438391401786,-0.022537771109281995,-0.023089376028036124,-0.023630702952455472,-0.024162201687331325,-0.02468432203745498,-0.02519747637900931,-0.025701940708484698,-0.026197985864523418,-0.02668588391109368 +0.,0.008131112913583585,0.015560053779207567,0.021905312969585755,0.02726211430673517,0.03172699212432034,0.035383278377337395,0.03831142659846698,0.04059189032038975,0.042299974708847214,0.04349140812770584,0.04421989810055973,0.04453926710119169,0.044503337603384506,0.04416504583457757,0.04356318266900239,0.042728313929948664,0.041691355071855216,0.0404832215491608,0.03913482881630423,0.03767709232772428,0.036137444954745385,0.03452987682483353,0.03286726008276246,0.031162571169055225,0.029428786524234873,0.027678882588824456,0.025925835803347036,0.02418262260832566,0.022459176431552222,0.020756849500010336,0.01907869835691569,0.01742791150406445,0.01580767744325278,0.014221184676276826,0.012671621704932747,0.011162177031016707,0.009694783851228527,0.008268082295278265,0.006881624690344571,0.0055350209837223465,0.004227881122706494,0.0029598150545918933,0.0017304327266734654,0.0005393440862460835,-0.0006142278337473382,-0.0017319194114132253,-0.002814954050915216,-0.003864535389401395,-0.004881867064019885,-0.005868152711918773,-0.006824595970246171,-0.007752400476150194,-0.008652834952996204,-0.009527170786593622,-0.010376489671176959,-0.011201868145159572,-0.012004382746954815,-0.012785110014976014,-0.013545126487636535,-0.014285508703349705,-0.015007314116801162,-0.015711402092876383,-0.016398520457209367,-0.0170694160018047,-0.017724835518666947,-0.01836552579980069,-0.018992233637210518,-0.01960570582290099,-0.02020666622569421,-0.020795653091159633,-0.021373115010155125,-0.021939500006901116,-0.022495256105618006,-0.023040831330526226,-0.023576673705846176,-0.024103231255798278,-0.024620915155740237,-0.025130001049489512,-0.02563075843182001,-0.02612345798754238 +0.,0.008221596870450723,0.015680105328401302,0.022052455602354918,0.027435783535828075,0.03192689524535217,0.03560887927523142,0.03856209707679243,0.040866910101361856,0.04259853156677167,0.043812629726750464,0.04456287750493396,0.044903063100932825,0.0448869747143577,0.044567515900153336,0.043983474552550826,0.0431654357608694,0.04214433428201603,0.04095110487289767,0.039616682290421305,0.03817200129149389,0.03664452036032282,0.03504827179027463,0.03339616530537635,0.03170121463573242,0.029976433511447305,0.028234835662625444,0.0264894348193713,0.024753244711789326,0.023036234348526564,0.021339784937952966,0.019666981452915122,0.01802104087596372,0.016405180189649433,0.014822616376522928,0.013276566419134876,0.011770247300035959,0.010305616709061688,0.008881328601896773,0.007496951854566523,0.006152113143587214,0.004846439145475116,0.0035795565367464795,0.002351091993917595,0.0011606721935047064,7.534071566657127e-6,-0.0011099519745364356,-0.002193000277438747,-0.003242805269345864,-0.004260561382463413,-0.005247463048996983,-0.006204704701152189,-0.007133480771134649,-0.008035052448934077,-0.00891068758266202,-0.009761462784295205,-0.010588449428239052,-0.011392718888898971,-0.012175342540680353,-0.012937391757988623,-0.013679937915229168,-0.01440403431828145,-0.015110538426579884,-0.015800195066899572,-0.01647374798037102,-0.017131940908124713,-0.01777551759129115,-0.01840522177100083,-0.01902179718838424,-0.019625965348998103,-0.02021826350511881,-0.02079913838709487,-0.021369036121478464,-0.02192840283482176,-0.022477684653676954,-0.02301732770459621,-0.02354777811413171,-0.024069445726227837,-0.02458260571866613,-0.02508752618336818,-0.02558447636830112 +0.,0.008304667823867328,0.015786616660698322,0.02218064993601424,0.027585672942277123,0.0320986992497125,0.03580254182706333,0.03877743199825872,0.04110360108722782,0.042856135302566024,0.044090616684057775,0.04486065667953898,0.04521998224686552,0.045222320343893264,0.04492051529260016,0.04435333136757899,0.043551355031075295,0.04254552219533438,0.04136676877260156,0.04004603067512211,0.03861424381514134,0.03709887560968923,0.03551398999572957,0.033872524644456815,0.032187520905919545,0.030472020130166363,0.028739063667245858,0.027001692867206623,0.025272949080097258,0.02356282893343154,0.021872739699917876,0.02020579110293958,0.018565224855616055,0.0169542826710667,0.015376206262410893,0.013834237342768035,0.012331617625257522,0.010870326464280565,0.009449031305121473,0.008067316629680087,0.006724824859379676,0.005421198415643493,0.004156079719894779,0.0029291111935568098,0.0017399352580528184,0.0005878021636788956,-0.000528910548234101,-0.0016114081253904662,-0.0026608758008355373,-0.0036784988076146905,-0.004665462378773266,-0.005622951747356631,-0.00655215214641015,-0.007454317090397978,-0.008330710466279409,-0.0091824035782709,-0.010010462419435082,-0.01081595298283457,-0.011599941261531962,-0.012363493248589891,-0.013107674937070957,-0.013833535209637949,-0.01454192929711789,-0.015233598831296718,-0.015909284310223135,-0.016569726231945817,-0.017215665094513458,-0.017847841395974753,-0.018466995634378383,-0.019073846728413675,-0.019668930721135798,-0.02025269236554255,-0.020825575776279026,-0.021388025067990278,-0.0219404843553214,-0.02248339775291746,-0.023017209375423533,-0.023542327607472595,-0.024059027049544362,-0.02456757433381546,-0.025068237215820646 +0.,0.00838022255173301,0.015879657991001998,0.02229012715368458,0.027712159170650265,0.03224291129606777,0.035964890207615424,0.038958160146558174,0.04130278535416097,0.04307369097657423,0.04432634746287944,0.045114278630882104,0.04549112395290591,0.04551052290127451,0.04522523471597117,0.04467397995602066,0.043887329045328084,0.042896201395845095,0.0417315164195233,0.04042419352831433,0.03900515213416981,0.03750185235685051,0.03592837954152341,0.034297689945706505,0.03262284314220532,0.030916898703825448,0.029192916203372426,0.02746395521365182,0.025743075307469204,0.024040292998289695,0.022357038802208764,0.020696443625416713,0.01906177027452389,0.017456281556140627,0.015883240276877257,0.01434590924334412,0.012847551262151554,0.011390164613340381,0.009972429917333573,0.008593946352666092,0.00725437113608389,0.0059533614843329035,0.0046905746141590555,0.003465667742308307,0.0022782980855265726,0.0011277286438204873,0.000012344467952326264,-0.0010690505870983124,-0.0021176325561709994,-0.003134577474105344,-0.00412106137574092,-0.005078260295917327,-0.006007350269474166,-0.006909576992305013,-0.007786199974626129,-0.008638284991077213,-0.00946689243952862,-0.010273082717850695,-0.01105791622391377,-0.011822453355588203,-0.012567754510744326,-0.013294863879297755,-0.014004634147067513,-0.014697803558952035,-0.015375109181855405,-0.016037288082681688,-0.016685077328334963,-0.017319213985719308,-0.01794043512173879,-0.018549456849340017,-0.01914681379107377,-0.019732948608605805,-0.020308303293247783,-0.020873319836311337,-0.021428440229108135,-0.021974106462949818,-0.022510760529148043,-0.0230388092278432,-0.02355852647312522,-0.024070177382536518,-0.024574028165594685 +0.,0.008448173594723687,0.015959316463712056,0.0223811354903409,0.027815635974454002,0.03236005581123194,0.03609656603652708,0.039105027936071526,0.04146530279559743,0.04325212164358694,0.04452081868109657,0.04532480466245382,0.045717606053785755,0.045752749321219435,0.0454828834844589,0.04494666583456907,0.04417463382863047,0.04319767321522489,0.042046669742934105,0.04075250916033988,0.039346077216024,0.03785481095387214,0.03629280718073128,0.03467303165182429,0.033008553038929,0.03131244001382331,0.02959776124828507,0.027877585414092153,0.026164981183022438,0.024469977451461265,0.022794025254400833,0.02114027322487575,0.019512001739425664,0.017912491174590216,0.016345021906909032,0.014812874312921763,0.013319328769168044,0.011866399832209476,0.010452781004809376,0.009078085286749981,0.007741983775378709,0.00644414756804297,0.005184247762090157,0.0039619554548677004,0.0027769417437229884,0.0016284818381669377,0.0005149686605524311,-0.0005647848093139781,-0.0016119454041471552,-0.002627679956662005,-0.0036131552995733985,-0.00456953826559623,-0.005497995687445393,-0.006399765298557734,-0.007276101824848858,-0.00812806529322487,-0.008956710295966983,-0.009763091425356394,-0.010548263273674292,-0.011313280433201886,-0.012059197496220362,-0.012787053695285249,-0.013497698861673804,-0.014191867665696488,-0.014870293559156159,-0.015533709993855642,-0.016182850421597793,-0.016818448294185454,-0.017441237063421454,-0.01805192982238187,-0.018651059566556345,-0.019239066755114536,-0.01981639114737424,-0.02038347250265323,-0.020940750580269302,-0.02148866513954024,-0.022027655939783834,-0.02255812807420647,-0.023080354663672007,-0.023594599258114645,-0.02410112646936107 +0.,0.00850845011335272,0.016025696803212048,0.022453940793714516,0.02789651470521274,0.032450674906010564,0.036198228726558944,0.039218799697845697,0.04159201135085865,0.04339236852895164,0.04467504523983029,0.04549331446049383,0.045900564852256985,0.04595018507643445,0.045694689503870234,0.04517265314858269,0.04441456405586156,0.04345125764119105,0.04231356932005534,0.04103233450793859,0.039638388620325,0.03815913029938229,0.036608658157789,0.034999938632901025,0.03334604064587607,0.0316600331178719,0.02995498497004625,0.028243965123556845,0.02654004249956145,0.024853251104888924,0.023185059865693497,0.021538631797987234,0.019917261438527033,0.01832424332406977,0.016762871991372337,0.015236441977191617,0.013748247818284499,0.01230031778852914,0.010891358001631792,0.009520994437178142,0.00818891119336469,0.006894792368387934,0.005638322060444348,0.004419184367730447,0.0032370633884427026,0.0020912460256650987,0.0009801334319522895,-0.00009745226150127966,-0.0011426686764551344,-0.0021566734346688396,-0.003140624157901923,-0.00409567846791394,-0.005022993986464445,-0.005923800339859427,-0.006799347070345577,-0.007650688242572056,-0.008478872436254498,-0.009284948231108524,-0.010069964206849748,-0.010834968943193801,-0.011581011019856296,-0.012309124452370382,-0.0130201559149047,-0.013714836319643615,-0.01439389532339846,-0.015058062582980548,-0.015708067755201213,-0.016344640496871784,-0.016968510464803566,-0.017580387522838452,-0.018180802837648766,-0.018770194557517345,-0.019349000103825835,-0.019917656897955858,-0.02047660236128906,-0.021026273915207068,-0.02156710898109153,-0.022099510825531528,-0.022623751671647166,-0.023140093450618772,-0.023648799126727866 +0.,0.00856099860320326,0.016078921983791652,0.02250882710455469,0.02795522479939285,0.03251532878027437,0.036270555817484534,0.039300257950427374,0.041683787218506935,0.043495391188567815,0.04479006043504579,0.045620906161985296,0.04604115514802638,0.046104034171809034,0.04586189923514096,0.045353224608510136,0.044608432964407085,0.043658293209386995,0.04253357425000502,0.04126504499281636,0.03988347434437616,0.03841620767306908,0.03687733603379884,0.03527981800418788,0.033636714180002004,0.031961085157007095,0.030265991530968994,0.02856449389765353,0.026869652852826578,0.025191500472365513,0.023531521042826485,0.02189288873168438,0.02027890894031133,0.01869288707007948,0.017138128522360952,0.015617938698527891,0.014135622999952437,0.012693220948589384,0.011289451018815105,0.009923951362587983,0.008596418234251689,0.007306547888149891,0.006054036578626238,0.0048385805600244134,0.003659876086688058,0.0025172212635541273,0.0014090258281940398,0.000334121094193977,-0.00070864133547364,-0.0017204098578364282,-0.002702332869921968,-0.003655558768757866,-0.004581235951371731,-0.005480585791532271,-0.006354852256792349,-0.007205083238626346,-0.008032321100594476,-0.008837608206256948,-0.009621986919173953,-0.010386499602905708,-0.01113218862101241,-0.01186008251732422,-0.012571024513398596,-0.013265741583880213,-0.013944959414722805,-0.01460940369188009,-0.0152598001013058,-0.015896874328953665,-0.0165213520607774,-0.017133939726798497,-0.01773516646798607,-0.018325468016073033,-0.018905279351231343,-0.019475035453632925,-0.02003517130344974,-0.020586121880853712,-0.021128322166016796,-0.021662173482001865,-0.02218794705205072,-0.022705903139184396,-0.02321630301201172 +0.,0.00860578371510127,0.01611913381315106,0.02254609715161091,0.027992214209727556,0.03255459608541949,0.03631424327139571,0.039350203631378144,0.0417415250290887,0.04356216762881733,0.044866916029766626,0.045708696383849126,0.046140550228250726,0.046215519100157275,0.04598577761893816,0.04548968138698841,0.04475757222718619,0.043820136855493755,0.042708061987873344,0.04145203434028719,0.040082740628697544,0.03862745853018167,0.037100262471903636,0.0355140949040792,0.03388199979758811,0.03221702112331014,0.030532202852125042,0.02884058895491257,0.027155223402552497,0.025486129530034967,0.023834804550676318,0.022204430664431424,0.020598320955978636,0.019019788509996333,0.01747214641116287,0.015958707744156603,0.014482785593655916,0.013046428350409717,0.011648366620032762,0.01028824995348054,0.008965785951646094,0.00768068221542247,0.006432646345702689,0.005221385943379812,0.004046608609346854,0.0029076231828090225,0.001802848337141916,0.0007311246037885349,-0.00030868717079754124,-0.0013177261401627707,-0.0022971314578535736,-0.003248042277416399,-0.0041715977523976945,-0.005069010857943374,-0.005941519604367769,-0.006790165502630412,-0.007615984499899806,-0.00842001254334445,-0.009203285580132826,-0.009966839557433441,-0.010711710422414778,-0.011438920997530319,-0.012149310763371567,-0.012843602581715484,-0.013522517995773465,-0.014186778548756893,-0.014837105783877168,-0.015474221244345682,-0.01609884647337382,-0.016711684267362043,-0.017313261549620703,-0.017904011532350817,-0.018484366653859975,-0.01905475935245574,-0.0196156220664457,-0.020167387234137423,-0.020710487293838495,-0.021245321510961725,-0.02177216000917446,-0.022291261335587464,-0.022802885016646107 +0.,0.008642788998626895,0.01614649350419098,0.022566072836996368,0.028007949818228243,0.03256907426508936,0.03633000574622769,0.039369456308614395,0.041766137999220604,0.04359369440837109,0.04490668230860737,0.04575782023489552,0.04619994184127971,0.0462858807818041,0.04606760798484238,0.045583343001242456,0.04486333181165864,0.04393816375396855,0.04283842816604977,0.04159471438577991,0.040237611751036566,0.03879431628511136,0.03727887701230852,0.035704212262275825,0.034083341357078016,0.03242928361877982,0.030755058369445996,0.029073684931141264,0.02739818262593037,0.0257385594696691,0.024096323265979228,0.022474661240948938,0.0208768910956537,0.01930633053116899,0.01776629724857028,0.016260108948933042,0.014791083333332749,0.013361275371924384,0.011969427592679422,0.010615200206246653,0.009298311385602059,0.008018479303721626,0.006775422133581321,0.005568858048157143,0.0043985052204250485,0.0032636827803204033,0.002162818683563861,0.0010947627193943496,0.00005838500148878825,-0.0009474443564759427,-0.001923855240822925,-0.002871977537875267,-0.003792941133956078,-0.00468795045887563,-0.005558237191768808,-0.006404836259289727,-0.007228776995299337,-0.008031088733658591,-0.008812800808228414,-0.009574942552869769,-0.010318543301443583,-0.011044619910380284,-0.01175400783817132,-0.012447425662442974,-0.013125590615716819,-0.013789219930514414,-0.014439030839357332,-0.015075740574767144,-0.015700066369265405,-0.016312707190620137,-0.016914187557509733,-0.01750493806225489,-0.018085388503212247,-0.01865596867873843,-0.01921710838719009,-0.01976923742692384,-0.02031278559629633,-0.020848149991738143,-0.02137559954013314,-0.021895391026500653,-0.022407782190179838 +0.,0.008672017604120317,0.016161182220685518,0.022569095698399592,0.028002917829714178,0.032559379880720093,0.03631857685720779,0.03935885438223079,0.04175855807884259,0.04359098673618736,0.04491044813129262,0.04576943132931854,0.046220540174272295,0.046316378510161064,0.046108691968428,0.04563554720506172,0.04492707984986484,0.04401376716906484,0.0429260864288892,0.04169451489556541,0.040349529835320946,0.03891823211049246,0.03741463686326936,0.035851630584243364,0.034242200198431064,0.032599332630849076,0.030936014806514013,0.029265233650442472,0.027599976087651065,0.025950228468394676,0.02431750694733201,0.022705000883008673,0.02111602964042451,0.019553912584579378,0.018021969080473117,0.016523518493105578,0.015061880187476614,0.013639113513538317,0.01225397273298827,0.010906128010929673,0.009595307353089262,0.008321238765193764,0.007083650252969891,0.005882269822144389,0.004716825478443961,0.003586646222941018,0.002490169635786373,0.0014262548084358873,0.00039378115053977656,-0.0006083719282517805,-0.0015813250182885679,-0.0025261987099203975,-0.0034441135934970804,-0.004336265406203974,-0.005203879130772019,-0.006047982909279931,-0.006869599268652375,-0.007669750735814014,-0.00844945983768949,-0.009209749101203474,-0.00995164105328061,-0.010676146344725268,-0.01138409613807893,-0.012076204559537338,-0.012753184366876707,-0.013415748317873236,-0.01406460917030314,-0.014700479681942628,-0.0153240726105679,-0.015936082905091378,-0.01653703249761287,-0.017127349262809403,-0.017707460263516776,-0.018277792562570772,-0.018838773222807206,-0.019390829307061857,-0.019934387878170527,-0.020469843755042974,-0.02099746457309876,-0.021517505310571377,-0.022030221876212314 +0.,0.00869349296314942,0.016163401588576713,0.02255552733892707,0.027977624136883008,0.03252614891106507,0.0362807094139326,0.039319255263120446,0.041719736076263454,0.043555078548322385,0.04487932096594802,0.045744701780852125,0.046203573812286944,0.046308289879504715,0.04611034941119105,0.04564764986422872,0.04495020249249307,0.04404835829042557,0.042972468252467706,0.04175288337306098,0.04041995464664687,0.03900067472276987,0.037509016678958194,0.035957827722937805,0.03436005491011416,0.03272864529589274,0.031076545935679024,0.02941670388487849,0.027762066198896606,0.02612259144765706,0.02449980199470447,0.02289688655000229,0.02131716330440514,0.019763950448767647,0.018240566173944425,0.016750328670790102,0.015296556130159294,0.013881310171804887,0.012503356622465642,0.011162374930495118,0.009858102230151558,0.0085902756556932,0.007358632341378268,0.006162909421465015,0.0050028440302116554,0.00387777464406616,0.0027861488050413834,0.001726834955715929,0.0006987218354802154,-0.0002993018162753747,-0.001268347260160423,-0.0022095257567845373,-0.0031239485667573256,-0.004012802586822937,-0.004877305746900504,-0.005718479207714532,-0.006537338498878321,-0.007334899150005173,-0.008112176690708366,-0.00887018665060121,-0.009609944559296982,-0.010332454627425701,-0.011038543455066325,-0.011728920553663973,-0.01240429404603958,-0.013065372055014055,-0.013712862703408329,-0.014347474114043328,-0.014969914409739963,-0.01558087433511457,-0.016180873058804144,-0.016770335642614567,-0.017349686320755665,-0.017919349327437252,-0.018479748896869166,-0.01903130926326122,-0.01957445466082325,-0.02010957752519608,-0.020636944108215125,-0.0211568075380395,-0.02166942185072847 +0.,0.008707259366087508,0.016153374206226728,0.022525749856046686,0.027932594660460705,0.03247003701197959,0.03621717561240786,0.03925153550571188,0.04165064173585802,0.04348702253299119,0.044814426866476235,0.04568482213728811,0.046150289634546024,0.04626291064736918,0.04607391819321356,0.04562102476323735,0.04493410369314703,0.04404336599813411,0.04297902269339011,0.041771284794106536,0.040450363315474906,0.039043130097480366,0.037563508267729216,0.03602429858177721,0.03443840102832395,0.03281871559606904,0.031178142273712097,0.02952958104995273,0.027885931913490543,0.02625711977072425,0.024644671148902446,0.023051771440891933,0.021481734939624828,0.019937875938033256,0.01842350872904932,0.01694194760560515,0.015496506860632864,0.014089248363079714,0.012718949355676426,0.011385297932803885,0.010088039688099583,0.008826920215201003,0.007601685107745614,0.006412079959370917,0.005257850363714374,0.004138343900542692,0.0030520184063215997,0.001997751728142369,0.0009744419739244623,-0.000019012748412694774,-0.000983714330949641,-0.0019207646657669413,-0.0028312656449451597,-0.0037163951764921394,-0.004577363790014155,-0.005415185471562641,-0.006230868566283211,-0.0070254214193214756,-0.007799852375823026,-0.008555169780933479,-0.009292381979798425,-0.010012486513387372,-0.01071630516018799,-0.011404542657488921,-0.012077902336743059,-0.012737087529403274,-0.01338280156692246,-0.014015747780753504,-0.01463662950234928,-0.01524613309136309,-0.015844774781178156,-0.01643297672798643,-0.0170111602466776,-0.017579746652141327,-0.01813915725926731,-0.018689813382945206,-0.01923213633806471,-0.019766516074036337,-0.020293217369585753,-0.020812491460832278,-0.02132459047032909 +0.,0.008713382598485689,0.016131344083261924,0.022480166203509656,0.027868375654338116,0.03239171976084155,0.036128767220695295,0.03915659093802525,0.0415522638169573,0.043387890163467537,0.04471691046405633,0.04559100133481252,0.046061952735510704,0.046181554625925506,0.046000754098113966,0.045557063447072235,0.0448802050300232,0.04400023666710846,0.0429472161784696,0.041751201384248204,0.04044225010458586,0.03904710122771337,0.03757962034374978,0.03605255486095559,0.034478750779343224,0.032871054098925136,0.031242310819713764,0.02960536694172155,0.027973068464960935,0.02635530098031441,0.024753593230305147,0.023171124734535392,0.021611203278351247,0.020077136647098825,0.018572232626124202,0.017099799000773495,0.0156631435563928,0.01426432647963656,0.012902136299501394,0.011576269153077056,0.010286478459225352,0.009032517636808072,0.007814140104686992,0.006631099281723921,0.005483148586780629,0.004369644354453933,0.0032890550432398955,0.0022402679626109374,0.0012221906328256362,0.0002337305741425365,-0.0007262046931797857,-0.0016587076488827777,-0.002564870772707887,-0.003445862835198116,-0.004302886627127701,-0.005136948769984602,-0.005949050240474486,-0.006740192015303013,-0.007511375071175829,-0.0082636003847986,-0.008997868932876971,-0.00971517136229768,-0.010416324378245915,-0.011102027788315727,-0.011772979979927435,-0.012429879340501333,-0.013073424257457729,-0.013704313118216935,-0.014323244310199247,-0.014930899632186658,-0.01552779221563081,-0.01611434122080048,-0.01669096495492855,-0.017258081725247888,-0.017816109838991383,-0.01836546760339191,-0.01890657332568235,-0.01943981436885746,-0.019965453951622643,-0.02048374137733682,-0.020994926815442603 +0.,0.008711950411035122,0.016097577124505758,0.02241920059839967,0.027785534025922008,0.03229189290406208,0.0360162957634791,0.03903533679079522,0.041425610172632535,0.043258771730208416,0.04458793495703579,0.045464466649989245,0.04593984634314011,0.046065553570559734,0.04589223067579961,0.045457175061434735,0.044789945526607505,0.04392043397104563,0.04287853229447682,0.04169413239662879,0.04039712617722924,0.039014107884385946,0.0375588782810283,0.03604412480669527,0.03448263282533695,0.03288718770090348,0.03127057479734497,0.029645579478611555,0.028024987108653355,0.02641863854158528,0.024828062883255418,0.023256431335936568,0.021707042681594332,0.020183195702194304,0.018688189179702056,0.017225321896083196,0.015797892633303313,0.014407958053034813,0.013054317859816152,0.011736675663936762,0.010454792110235908,0.00920842784355285,0.00799734350872683,0.0068212997505971255,0.005680057214002972,0.004572980663300255,0.0034985495014082206,0.0024556605625197674,0.001443230828060821,0.00046017727945727534,-0.0004945831018649456,-0.00142213333447994,-0.002323556436961807,-0.00320001189327339,-0.004052694425892179,-0.00488260310524676,-0.005690731358777571,-0.006478072613925046,-0.007245620298129601,-0.007994367838831678,-0.008725308663471692,-0.009439426305495716,-0.010137532152526168,-0.01082032093074256,-0.011488485934564136,-0.012142720458410116,-0.012783717796699741,-0.013412171243852244,-0.014028774094286853,-0.014634203414749629,-0.015228969073218773,-0.01581348714610939,-0.0163881728469612,-0.0169534413893139,-0.01750970798670722,-0.01805738785268086,-0.01859689620077454,-0.019128617710151244,-0.019652813955232332,-0.02016973226705498,-0.020679620823467 +0.,0.008703073165316695,0.016052361463752093,0.022343298783127078,0.027684657559708538,0.0321712725279619,0.035880592639156265,0.03888870776193701,0.04127170776494945,0.04310077631193432,0.04442868204242338,0.04530646359579963,0.04578527168317617,0.04591625701566613,0.04574973905268157,0.04532278614061476,0.044664781420317844,0.0438054386346813,0.0427744715265956,0.0416015938389512,0.04031651931463856,0.03894568632611868,0.03750282381731922,0.0360005529106964,0.034451591960707406,0.03286865932180943,0.031264473348459665,0.029651752395115298,0.02804321481623353,0.026448651538048012,0.024869590273911914,0.023309191576495213,0.02177074284214456,0.020257531467206602,0.018772844848027964,0.017319970380955306,0.015902195462335275,0.014521571474601487,0.01317690920579611,0.01186791920358894,0.010594368774343443,0.009356025224423083,0.0081526558601913,0.006984027988011571,0.005849908914247337,0.004749671531204308,0.0036818065032884896,0.002645220256209864,0.0016388392863979572,0.0006615900902822659,-0.0002876008357076853,-0.0012098069951423927,-0.0021061018915923537,-0.0029776355729784097,-0.003825594373119647,-0.004650969628250681,-0.005454747038832931,-0.0062379123053278125,-0.007001451128196726,-0.007746349207901094,-0.008473592244902316,-0.009184156444903871,-0.00987884764116885,-0.010558355330511327,-0.011223367569026038,-0.011874572412807692,-0.012512657917951019,-0.01313831214055074,-0.013752223136701573,-0.014355063074668125,-0.01494733840255184,-0.015529462027310082,-0.016101845984999214,-0.01666490231167559,-0.017219043043395568,-0.01776468021621551,-0.018302225866191773,-0.018832061893988613,-0.019354448148131108,-0.01986962994885906,-0.020377853444985626 +0.,0.008686884289014686,0.01599600785342249,0.022252928342225472,0.027566355163627973,0.03203059524171143,0.035722509245329326,0.038717658088753625,0.04109160268625631,0.04291503174929431,0.044240351848978496,0.045118255819897174,0.045599547846858865,0.04573503211467209,0.04557468774572773,0.04515534039884144,0.044506185934689454,0.043656748190108494,0.04263655100193524,0.04147511820700638,0.04020197364215863,0.03884338901965388,0.03741301476920747,0.035923399620515294,0.034387188818692634,0.03281702760885479,0.031225561236117066,0.029625434945594737,0.028029293982403117,0.02644687438243758,0.024879700804363386,0.023330920930694766,0.02180380850348196,0.020301637264775206,0.018827680956624737,0.017385213321080808,0.015977508100193657,0.014606609730703051,0.01327134000946419,0.011971415919334732,0.01070661089852113,0.00947669838522982,0.008281451817667228,0.007120644634039808,0.005994050272553979,0.004901049474710215,0.003840144477741632,0.0028102513701262245,0.0018103062221508715,0.0008392451041024239,-0.00010399591373223919,-0.0010204807610662595,-0.001911273367612781,-0.0027775141954917773,-0.003620380878700345,-0.0044408568394654745,-0.005239919876622784,-0.0060185477890078885,-0.006777718375456387,-0.0075184094348039006,-0.008241598765886027,-0.008948255037418158,-0.009639178299011349,-0.0103150526738736,-0.010976560838034879,-0.011624385467525134,-0.01225920923837432,-0.0128817148266124,-0.01349258490826932,-0.014092486591391139,-0.014681922752980166,-0.015261303047194731,-0.0158310362509968,-0.01639153114134833,-0.016943196495211286,-0.017486441089547625,-0.018021673701319317,-0.01854927336077637,-0.019069498111644212,-0.01958259122587488,-0.020088796786746025 +0.,0.008663540802116341,0.015928849990561513,0.022148578963521452,0.0274312570813529,0.03187061833254622,0.03554291708037034,0.038523161602985724,0.04088636017855283,0.04270268463527072,0.0440241628937807,0.044901125025883566,0.045384011679270475,0.0455232635016326,0.045368502506252045,0.044956298558997555,0.04431564909385003,0.0434758767776515,0.04246630427724398,0.041316254259469484,0.04005504939117002,0.03870878439091212,0.03729102477783337,0.03581424108400356,0.0342909996169241,0.032733866684096426,0.031155408593021974,0.02956819165120218,0.027984782166138485,0.02641485655049697,0.024859934844135633,0.02332314974943019,0.02180775919768098,0.02031702112018836,0.018854193448252666,0.01742253411317425,0.01602530104625347,0.01466453015994319,0.013339054204645458,0.01204859612950455,0.010792935009239741,0.009571849918570302,0.008385119932215485,0.007232524124894577,0.0061138415713268245,0.0050284606064304,0.003974895346370328,0.002952071618046294,0.001958935129402,0.0009944315883811203,0.000057506702927356406,-0.0008528938190156101,-0.0017378242695041003,-0.002598415374811899,-0.003435835767043585,-0.00425106077790342,-0.005045060133002446,-0.005818803557951703,-0.006573260778362211,-0.007309401519845017,-0.008028195508011142,-0.008730603670352078,-0.00941742005095383,-0.010089323258853821,-0.010746990451827797,-0.011391098787651485,-0.012022325424100618,-0.012641347518950942,-0.013248842229978179,-0.0138454714479091,-0.014431734332491845,-0.015008037203975417,-0.015574785500766344,-0.016132384661271135,-0.016681240123896324,-0.017221757327048424,-0.017754341709133956,-0.018279369340741352,-0.01879709638447157,-0.019307764027472786,-0.019811614251918172 +0.,0.00863322370038704,0.015851244840780827,0.02203076269168276,0.027280015079617408,0.031692119894952166,0.03534270781887612,0.038306211753970705,0.04065706460281739,0.04246490023273114,0.04378135195964655,0.04465637081898181,0.0451400175980626,0.04528235308421461,0.04513262608565401,0.044727138094432975,0.04409467744490005,0.043264354853052994,0.042265281034889544,0.04112656670640744,0.03987732258360444,0.03854345650697191,0.03713844298655615,0.03567466882183235,0.03416461582507141,0.032620765808544235,0.03105560058452171,0.029481601965274752,0.027911251763074258,0.026354162262756727,0.02481184741797324,0.02328742295117083,0.02178412893831999,0.020305205455391225,0.018853892578355028,0.0174334303831819,0.016047058945842345,0.014696804163187594,0.013381509702605182,0.012100904043769204,0.010854771436802762,0.009642896131828949,0.008465062378970845,0.0073210544283515595,0.006210656530094166,0.0051332643795369785,0.004087404272436264,0.0030720118541525537,0.0020860425390195917,0.0011284517413710931,0.0001981948755408018,-0.0007057726441375593,-0.0015844954033302698,-0.0024390942421705303,-0.0032707284979294235,-0.004080365238532739,-0.0048689659477749395,-0.0056374921094504826,-0.0063869052073538095,-0.007118166725279386,-0.007832238147021652,-0.00853007245960532,-0.009212457487138557,-0.009880066187542913,-0.010533570065642605,-0.011173640626261822,-0.011800949374224774,-0.012416167814355672,-0.013019967451478704,-0.013613004806507458,-0.014195775180849099,-0.01476868148190478,-0.015332125732153368,-0.015886509954073712,-0.01643223617014468,-0.016969706402845123,-0.017499322674653907,-0.01802145800989859,-0.018536366616321624,-0.019044287560644354,-0.019545460689214224 +0.,0.008596138344988609,0.015763572920268,0.02190001414450795,0.027113302607634327,0.031495898933685915,0.035122793361109884,0.038067821609021536,0.040404819396536215,0.0422028623944561,0.0435131739792652,0.044385310556727196,0.0448689374141173,0.04501371983871071,0.044868518009801926,0.04446935298559628,0.04384479379897655,0.043023728914999976,0.04203504679872378,0.04090763591520519,0.03967038472950144,0.038349004767138185,0.03695687372803521,0.03550628941259594,0.03400964384945264,0.03247932906723758,0.03092773709458302,0.029367259960121246,0.02781028969248454,0.026266370171633684,0.02473700789474498,0.023225299714029816,0.021734465916671254,0.02026772678985238,0.018828302620756264,0.01741941369656598,0.016044280304464604,0.014704916921239016,0.013400178113601904,0.012129797488910337,0.010893564045550964,0.009691266781910427,0.00852269469637536,0.007387636787332418,0.00628588205316823,0.005216833339258078,0.004179029416208855,0.0031714158322330476,0.0021929577816836537,0.0012426204589136376,0.0003193690582759961,-0.0005778312258762973,-0.0014500151991902704,-0.0022982936651371045,-0.00312381638230943,-0.003927541984823916,-0.004710423549039492,-0.005473414151315087,-0.006217466868009609,-0.006943534775481994,-0.007652570950091152,-0.008345520244109924,-0.009023164054590424,-0.00968616955496186,-0.01033520246584132,-0.01097092850784588,-0.011594013401592626,-0.012205122867698643,-0.012804922626781004,-0.013394063682002431,-0.0139730373403597,-0.01454224301958883,-0.015102079250907133,-0.0156529445655319,-0.016195237494680444,-0.01672935656957006,-0.01725570032141805,-0.017774638644292542,-0.0182864237198884,-0.018791292459716315,-0.019289482540370377 +0.,0.008552514814726929,0.015666238562788874,0.021756890717543047,0.026931814944345676,0.031282775459554275,0.03488410588297246,0.037809023858711356,0.04013074703088214,0.04191777347261134,0.04322090190940786,0.04408927919653874,0.044572160156852184,0.044718799613196386,0.04457765435702131,0.0441844534760241,0.043567536969851155,0.042755561230571254,0.04177718265025316,0.04066105762096565,0.03943584253477749,0.03812704360906891,0.036747936226459214,0.03531072418997832,0.03382770472519236,0.03231117505766747,0.03077343241296979,0.02922677401666545,0.0276834970943206,0.026153073068373774,0.024636999700367222,0.023138353191630552,0.02166033221859818,0.020206135457704527,0.018778961585384012,0.01738200927807106,0.016018477212200087,0.014690367125733734,0.01339654448298509,0.012136747649045043,0.01091076997747807,0.009718404821848638,0.008559445535721202,0.00743368547266025,0.006340917986230226,0.005280552883766543,0.004251141699821056,0.003251639974210564,0.002281022759867313,0.0013382651097235197,0.0004223420767114316,-0.0004677712862367271,-0.0013330999261887324,-0.0021747444592634486,-0.0029938447907711364,-0.0037913509541581967,-0.00456820745564024,-0.005325358801432877,-0.006063749497751697,-0.006784324050812316,-0.0074880269668303225,-0.008175794774003806,-0.008848402242690743,-0.009506510631942168,-0.010150779750271524,-0.010781869406192229,-0.011400439408217718,-0.012007149564861428,-0.012602659684636777,-0.013187615109576301,-0.013762503021305597,-0.014327719273116291,-0.014883658831579709,-0.015430716663267167,-0.01596928773475,-0.016499767012599517,-0.017022549463387052,-0.017538001769552405,-0.018046374018224863,-0.018547900931620707,-0.01904281798329941 +0.,0.00850260821640888,0.015559670160581912,0.021601972764280608,0.026736269321594286,0.031053590562730538,0.034627597865076444,0.03753087080231738,0.03983598894813874,0.04161085420813109,0.04290582658578659,0.04376962912528388,0.04425109188294908,0.04439904491510832,0.04426152752068718,0.04387396581309255,0.04326446149764343,0.04246142954634598,0.041493284931206346,0.040388442624230685,0.039175317597425145,0.03787920220435202,0.03651326428969047,0.03508960892992041,0.033620433798279635,0.03211793656800591,0.030594314912337026,0.02906176650451077,0.02753248901776493,0.02601587758287748,0.02451342002435463,0.02302817022285554,0.02156330353526577,0.0201219953184709,0.01870742092935648,0.01732275572480808,0.01597117506171127,0.01465466670418252,0.013372107021782048,0.012123238800526638,0.010907859390600995,0.009725766142189828,0.008576756405477826,0.007460627530649714,0.00637717686789017,0.005325821020255684,0.004305124567484874,0.0033140531341707274,0.0023515917154332236,0.0014167253063923101,0.0005084389021679654,-0.00037428250211985555,-0.0012324539113511969,-0.00206716560353245,-0.0028795473656769424,-0.0036705404667896316,-0.004441080683052589,-0.005192103790647882,-0.00592454556575756,-0.0066393417845637,-0.007337428223248349,-0.00801973290162373,-0.008687023771347877,-0.00933995605058911,-0.009979183511100817,-0.010605359924636359,-0.011219139062949116,-0.011821174697792465,-0.012412120600919768,-0.01299261631447482,-0.01356314476911301,-0.014124098180820067,-0.014675867879954157,-0.015218845196873425,-0.01575342146193604,-0.016279988005500155,-0.01679893615792393,-0.01731062931139581,-0.017815315392954664,-0.018313226901902815,-0.018804597075877182 +0.,0.00844669905197053,0.015444320319483944,0.021435863695477807,0.026527404988900827,0.030809206422427585,0.034354242043171425,0.03723443425342556,0.03952170545548322,0.041283343630381095,0.04256925659707596,0.04342772999069837,0.04390715546452395,0.04405592467182832,0.04392164596970189,0.04353943200989037,0.042937137406629286,0.04214292683700003,0.04118496497808397,0.040091416506962504,0.038890446100717,0.0376071241326334,0.036254505980928824,0.03484459353117093,0.033389480420554916,0.03190126028627601,0.030392026765529424,0.02887387349551037,0.027358894113414068,0.025856403846336216,0.02436787947138149,0.022896350986821433,0.021444968831036415,0.020016883442406815,0.018615245259312994,0.01724320472013533,0.0159039122632542,0.014599340528499611,0.013328376814313585,0.012090768023208479,0.01088631517693886,0.009714819297259305,0.008576081405924365,0.007469902524688626,0.0063960836753066365,0.0053540481122415625,0.00434237373554703,0.00336003635205523,0.0024060309875354137,0.0014793526677567988,0.0005789964184886353,-0.00029604273449985205,-0.0011467697654394362,-0.0019742644633319066,-0.0027796462410287727,-0.003563847442412312,-0.004327794956574033,-0.005072415672605442,-0.005798636479598027,-0.006507384266643303,-0.007199585922832755,-0.007876160780159312,-0.008537869786905055,-0.009185361997228931,-0.009819285024714327,-0.010440286482944603,-0.011049013985503144,-0.01164611514597333,-0.012232237577938522,-0.012808014889342748,-0.013373925639273154,-0.013930358335475915,-0.014477700602368044,-0.01501634006436654,-0.015546664345888419,-0.016069061071350678,-0.01658391786517033,-0.01709159475319318,-0.017592337439426158,-0.018086376167222508,-0.018573941905938564 +0.,0.008385093465644143,0.015320666042506904,0.021259190106881078,0.026305983288479533,0.030550506335782664,0.03406503139615972,0.03692080548777832,0.03918907562880612,0.040936498917027914,0.0422125181131781,0.04306496850650861,0.04354179037524228,0.04369092399760197,0.043559533992838725,0.043182409569952236,0.042587149914812966,0.041801661003805425,0.0408538488133141,0.0397716193197235,0.038582878499418105,0.03731246706768939,0.035973323302175314,0.034577341694799583,0.033136507625189396,0.03166280647297196,0.030168223617774496,0.028664744439224198,0.027164354316948282,0.025676285185602523,0.024202001762269176,0.022744508707314506,0.021306930049341605,0.01989238981695357,0.018504012038753473,0.01714492074334441,0.015818239959329468,0.014525926136502847,0.013266877545195017,0.012040844931828092,0.010847632697511558,0.009687045243354906,0.008558886970467599,0.007462962279959143,0.006399075572939,0.005366656632829448,0.0043642969499222565,0.0033909826149594513,0.0024457187775541356,0.0015275105873193803,0.0006353631938682887,-0.00023171825318606137,-0.0010747286042305897,-0.001894737008213235,-0.00269285225685318,-0.003469997611296527,-0.004227090919306816,-0.004965050028647582,-0.0056847927870823465,-0.006387237042374653,-0.007073300642288019,-0.007743894056347179,-0.008399771051925072,-0.009041574399390491,-0.009669945435966517,-0.010285525498876201,-0.010888955925342622,-0.01148087805258885,-0.012061933217837944,-0.012632748964852086,-0.01319379936533955,-0.013745469149777543,-0.014288142168735645,-0.014822202272783417,-0.01534803331249044,-0.015866019138426276,-0.016376543601160504,-0.016879963286501827,-0.017376521614835088,-0.01786644654114612,-0.018349966734722955 +0.,0.00831812347649674,0.01518920887379054,0.02107260187022179,0.026072787699587128,0.030278394716572336,0.03376097910242379,0.03659109516060407,0.03883929719457574,0.04057159524395842,0.04183695470642318,0.04268274824803538,0.043156452463351515,0.04330554394692803,0.043176731435307064,0.04280447120957625,0.04221609914433235,0.0414392545752335,0.04050157683793784,0.03943070526810352,0.038254279201388686,0.03699690245554129,0.03567139187025651,0.03428953059934785,0.03286319180198895,0.031404248637353506,0.029924574264615186,0.028436041842947672,0.02695052453152464,0.025477167808215934,0.024017423422167956,0.022574269344562855,0.02115080180837839,0.019750117046592325,0.01837531129218239,0.017029480778126365,0.015715721737401996,0.014435973448812976,0.013189145220477955,0.01197499140143223,0.010793319512060997,0.009643937072749463,0.008526651603882801,0.007441270625846231,0.0063876016590249255,0.0053650809151608,0.004372313740451868,0.0034082966153426548,0.002472044911094072,0.0015625739989669997,0.0006788992502223496,-0.00017996396387899154,-0.001015000272076135,-0.0018272680320282932,-0.0026178651759772814,-0.0033877057277634983,-0.0041376983423899736,-0.004868751674859736,-0.005581774380175797,-0.006277675113341192,-0.006957362529358933,-0.007621738065323398,-0.008271548137112629,-0.00890742911483729,-0.009530015944361746,-0.010139943571550328,-0.010737846942267398,-0.011324361002377308,-0.011900120697744399,-0.01246574738217292,-0.013021710528747689,-0.013568391023528024,-0.014106168877134048,-0.01463542410018586,-0.015156536703303589,-0.01566988669710733,-0.016175854092217206,-0.016674791962967988,-0.01716694138764426,-0.01765252800109781,-0.01813177814137431 +0.,0.008246147175176573,0.015050475016608856,0.02087677220057015,0.02582862386042373,0.029993797073679315,0.033443118478385034,0.036246433208047935,0.03847358639617506,0.04018992561925308,0.04144392715793122,0.04228248943490788,0.04275261371384622,0.04290130125840941,0.04277479342586028,0.042407204570748765,0.0418255998228383,0.041057344399173475,0.04012980351679885,0.039070342392759035,0.03790632624409859,0.03666211518861076,0.03535040058927511,0.033982850572285124,0.03257122236863847,0.031127273209332885,0.029662760325366064,0.028189440947735726,0.026719072307439577,0.02526071048633805,0.02381579346843695,0.02238727128682736,0.020978211096305086,0.019591680051665943,0.018230745307705725,0.016898474019220257,0.015597933341005345,0.014331044484682745,0.013096727888005045,0.011894741292082768,0.01072489510797497,0.009586999746740703,0.008480865619439,0.007406303137128931,0.0063631227108695235,0.005350766901805607,0.004367855174287711,0.0034133945082989777,0.00248641059904902,0.0015859291417474194,0.0007109758316037898,-0.00013942363617228015,-0.0009662435663712,-0.001770531373918655,-0.002553373901614185,-0.0033156757844375728,-0.004058336335982371,-0.004782254869842137,-0.005488330699610405,-0.006177463138880736,-0.006850551501246666,-0.007508488026003019,-0.008152011613714557,-0.008781752121039292,-0.009398337990641678,-0.010002397665186133,-0.010594559587337108,-0.01117545219975904,-0.01174570394511636,-0.01230592986556897,-0.012856594728699811,-0.013398075510851714,-0.013930748318372876,-0.014454989257611467,-0.014971174434915684,-0.015479679956633699,-0.0159808819291137,-0.01647512984590941,-0.016962662386626828,-0.01744370283488935,-0.017918475166967648 +0.,0.00816954888486748,0.014905015425430287,0.020672397700047255,0.025574319567585737,0.029697659969311237,0.03311250289929376,0.035887968732703675,0.03809317784471137,0.03979280070121311,0.04103481324913537,0.04186562870088781,0.04233176199976611,0.042479728089065964,0.04235529009444627,0.04199221192467644,0.041417280975848125,0.04065758132676647,0.03974019705623668,0.038692212243063934,0.037540710966053416,0.03630980327591602,0.0350120513194867,0.03365900475777045,0.032262301437886554,0.030833579206954335,0.029384475912093103,0.02792662940042218,0.02647167751906088,0.02502858423959676,0.02359877309822214,0.02218516504181137,0.020790796965936317,0.019418705766168855,0.018071928338080825,0.016753501577244107,0.01546646237923056,0.014212713076755744,0.012991185356977655,0.011801640172843464,0.010643890628413614,0.009517749827748537,0.008423030874908645,0.007359546873954389,0.006327110928946179,0.005325171893100075,0.004352363608301507,0.003407703667889223,0.0024902281977330566,0.0015989733237028068,0.0007329751716683066,-0.00010873013250063684,-0.0009271064629342147,-0.0017231901401573385,-0.002498056695757906,-0.0032526012272758864,-0.003987713560996726,-0.004704283523205874,-0.005403200940188757,-0.00608535563823083,-0.006751637443617522,-0.007402929236986739,-0.008039962246397886,-0.008663359705084528,-0.009273743443779544,-0.009871735293215788,-0.010457957084126127,-0.011033030647243433,-0.011597577813300562,-0.012152207195117897,-0.012697378752114801,-0.013233465487426689,-0.013760839540547595,-0.014279873050971531,-0.014790938158192535,-0.015294407001704624,-0.01579065172100182,-0.016280018161578497,-0.016762742549533194,-0.017239045786828323,-0.017709149458062037 +0.,0.00808873928645114,0.01475340587203163,0.020460198377895415,0.025310724753070737,0.029390950956971418,0.03277020570225059,0.03551686987324673,0.03769932435429832,0.03938154860044145,0.040611007538466484,0.04143361885080382,0.04189540082262687,0.04204237173910907,0.04191980628040068,0.04156110986592578,0.0409927856100731,0.040241629887855006,0.03933443907428392,0.03829800954437224,0.037159137673132385,0.03594167750930896,0.0346580585426028,0.03331970878071972,0.03193814348067052,0.030524877899466042,0.029091427294117095,0.027649306921634517,0.026210032039029132,0.024782472016839707,0.02336803537573249,0.021969612927889164,0.0205902102289374,0.01923283283450489,0.017900486300219284,0.016596176181708274,0.015322908034599533,0.014082564584755045,0.012874088916736536,0.011697245045047568,0.010551848599638524,0.009437715210459783,0.0083546605074617,0.007302500120594673,0.0062810496798090575,0.005289764294429672,0.004327292440519567,0.00339266244253344,0.002484920968078178,0.0016031146847606346,0.0007462902601876972,-0.00008650563803377226,-0.0008962263422969109,-0.0016838969268429967,-0.0024505813983877805,-0.0031971651713755037,-0.003924528441584631,-0.00463355140479363,-0.005325114256780947,-0.006000097193325055,-0.006659380410204403,-0.007303837272994715,-0.00793419118660581,-0.008551058654030518,-0.009155054788381292,-0.00974679470277056,-0.010326893510310763,-0.010895966324114346,-0.011454628257293743,-0.012003481379556303,-0.012542980743643226,-0.013073495317737731,-0.013595393213576463,-0.014109042542896036,-0.014614811417433099,-0.015113067948924268,-0.01560418024910618,-0.016088490450106015,-0.016566232271381556,-0.01703762420340476,-0.017502885409780088 +0.,0.008004155507877222,0.014596246985665693,0.020240917646906612,0.025038711438834398,0.029074658499181505,0.03241732007145912,0.035134323658168466,0.03729329676181074,0.038957514665977556,0.04017392112319909,0.04098792860459603,0.04144504904198379,0.0415907943671778,0.04146994123118295,0.04111552899716986,0.04055377038772011,0.039811167958047865,0.038914224263367304,0.03788944185889261,0.036763323299837974,0.03555946112575309,0.034290149023520115,0.03296669040717837,0.03160047498518185,0.030202892465984593,0.028785332558040617,0.027359184969803944,0.0259358394097286,0.02452406837679689,0.023125264919214208,0.02174228876515314,0.020378113149517995,0.019035711307213092,0.01771805647314273,0.016428121882211218,0.01516888076932287,0.013942195608101593,0.012747021054755432,0.011583124064846264,0.010450322657544437,0.009348434852020292,0.008277278667444151,0.007236672122986373,0.006226433237817277,0.005246023362457525,0.004294105860582906,0.0033697199094643083,0.002471922833898422,0.0015997719586819034,0.0007523246086114404,-0.00007136189151630224,-0.0008722302169046594,-0.001651294043446557,-0.002409605647482371,-0.0031480406175580194,-0.0038674693783725686,-0.004568762354625084,-0.005252789971014613,-0.005920422652240226,-0.006572530823000973,-0.0072099781818275,-0.007833480166391507,-0.008443646445695476,-0.009041085312493565,-0.009626405059539902,-0.010200213979588634,-0.01076312036539391,-0.011315732509709863,-0.011858645829249479,-0.012392310375747465,-0.012917091022349822,-0.013433351793721049,-0.01394145671452563,-0.014441769809428066,-0.014934655103092841,-0.015420476620184451,-0.015899572716125337,-0.016372174552372044,-0.016838498178556188,-0.01729876030841394 +0.,0.007916261177741427,0.014434164267282699,0.0200153222962092,0.02475917366889933,0.0287497918649561,0.032054958905709904,0.034741535843611566,0.03687638373111189,0.0385220612554861,0.03972498138645872,0.040530042328470794,0.040982240594128236,0.041126572696037,0.041007308291654866,0.04065711360454245,0.040101905291767374,0.039367886417400466,0.038481260045512576,0.03746822924017453,0.03635499706545719,0.03516488946564231,0.033910061468476006,0.032601689200999574,0.03125103411187191,0.02986935764975195,0.028467921263298623,0.027057986401170856,0.02565081451202758,0.02425507916765245,0.022872157587623038,0.02150487756627976,0.020156179137625102,0.01882900233566155,0.01752628719439158,0.01625097374781767,0.015006002029942303,0.013793213697462382,0.012611575173847634,0.011460856265037981,0.01034087727339356,0.009251458501274503,0.008192420251040925,0.007163582825052975,0.006164766525670763,0.005195438950298164,0.0042542785992327236,0.0033403356282413156,0.002452678139220469,0.0015903742340666808,0.0007524920146764778,-0.00006190041705363551,-0.0008537349592271541,-0.0016240137372103235,-0.002373777099842863,-0.0031038906697316362,-0.0038152149624489204,-0.004508610493566988,-0.005184937778658096,-0.005845057333294522,-0.006489829673048524,-0.007120108681854109,-0.00773660169272983,-0.008339911439889314,-0.008930639295818561,-0.00950938663300355,-0.010076754823930277,-0.010633345241084736,-0.011179759256952906,-0.01171658552928589,-0.012244269018846999,-0.012763170445202168,-0.013273649688090396,-0.013776066627250672,-0.014270781142421996,-0.014758153113343359,-0.015238542419753759,-0.015712283579077252,-0.016179605145424523,-0.01664072069851113,-0.017095844473557716 +0.,0.007825546443071435,0.014267808077805417,0.019784202440412808,0.024473027419016007,0.02841738100702931,0.03168425466809575,0.03433973073530666,0.036449891541753404,0.03807656748949947,0.03926563172939063,0.04006145975316564,0.040508524199916955,0.04065129770873701,0.040533534583901985,0.040187521323599505,0.03963887328221424,0.03891348880071066,0.03803726622005324,0.03703610388120642,0.03593590012513467,0.034759709627160636,0.03351954617963026,0.03222645617682798,0.030891570344398104,0.02952601940798489,0.028140934093232643,0.026747445125785637,0.025356683231288174,0.02397722120552569,0.02261042016699473,0.021259075227214267,0.019926092441635394,0.018614377865709207,0.01732683755488679,0.01606637756461923,0.014835903950357611,0.01363723706522841,0.012469355308585525,0.011332031276178553,0.010225087478752504,0.009148346427052397,0.008101630631823224,0.007084762603810019,0.006097564853757769,0.005139511251636636,0.004209295676821286,0.0033059793933257306,0.0024286414046807165,0.0015763607144169583,0.0007482163260651987,-0.000056712756843840646,-0.0008393475307794373,-0.0016006784183995322,-0.002341733652725958,-0.00306336875303071,-0.0037664341901019714,-0.004451780434727917,-0.00512025795769671,-0.005772717229796533,-0.006410008721815545,-0.007032976360027229,-0.0076423192423068845,-0.008238633070084447,-0.008822512198335762,-0.009394550982036655,-0.00995534377616297,-0.010505484935690541,-0.0110455688155952,-0.011576177212696366,-0.0120977499115288,-0.012610643420922767,-0.013115213419128767,-0.013611815584397304,-0.014100805594978883,-0.014582539129124,-0.01505737186508317,-0.015525634423195336,-0.015987552703340003,-0.016443337786211015,-0.016893201399766508 +0.,0.007732527951320722,0.014097853600458043,0.0195483714451114,0.0241812104838756,0.028078476418833244,0.0313063592179583,0.03393015099461004,0.03601514386214773,0.03762242898971409,0.038797331288489875,0.03958369567932446,0.04002546306173411,0.04016657433523509,0.040050260677597614,0.03970842279588786,0.03916636994330508,0.03844969093942995,0.03758397460384318,0.03659480975612544,0.035507785215857415,0.034345680116682695,0.03312036470607295,0.031842753449388916,0.030523844136510343,0.02917463455731696,0.027806122501688537,0.026429305759504803,0.025055182120645517,0.023692221951861225,0.022341770056513544,0.021006588217674094,0.01968954784054681,0.018393520330335637,0.0171213770922445,0.01587598953147733,0.014660229053238067,0.013475894294922384,0.012321975840933046,0.01119824904697221,0.01010453858963183,0.009040669145503874,0.008006465391180283,0.007001752003253037,0.00602635365831407,0.0050797505437929534,0.004160652150848176,0.0032681309857163737,0.0024012770829888374,0.0015591804772568261,0.0007409312031116275,-0.000054380704855492926,-0.0008276652120532674,-0.001579900886406361,-0.0023121036662862573,-0.0030251188327327636,-0.003719786678308901,-0.004396947495577684,-0.005057441577102114,-0.005702109215445215,-0.006331790703169984,-0.006947319870425548,-0.007549387456787449,-0.008138582035526387,-0.008715490849330498,-0.009280701140887906,-0.009834800152886748,-0.01037837512801516,-0.01091201330896126,-0.011436289533798038,-0.011951638330822849,-0.012458411942163473,-0.012956961789087009,-0.013447639292860558,-0.01393079587475122,-0.014406782956026092,-0.014875951957952284,-0.015338629547171861,-0.015795038925585644,-0.01624538864531051,-0.016689887897741812 +0.,0.007637748796570306,0.013925000777148812,0.019308665828744617,0.023884682341874883,0.027734148971228462,0.030922443625066024,0.03351405742864261,0.035573481507213255,0.037161057601340614,0.03832155463809275,0.03909827966998279,0.03953463454958628,0.03967402112947875,0.03955914025090962,0.03922150131612142,0.03868610312172727,0.03797822059519017,0.03712312866397313,0.036146102255539166,0.03507241629735128,0.033924570495215106,0.032714289491258694,0.03145235387908306,0.030149626554877892,0.02881697041483293,0.027465248355137892,0.0261053232719825,0.024748058061556475,0.023401819189728355,0.02206793495427891,0.02074913327147109,0.01944825033566953,0.01816812234123886,0.01691158548254369,0.01568147595394866,0.014480629949818401,0.013310824049536232,0.01217106121509115,0.011061119563943443,0.009980825929828213,0.00893000714648055,0.007908490047635535,0.006916101467028272,0.005952668238393837,0.0050176769297319065,0.00410985286252194,0.003228279923646186,0.0023720593134578154,0.001540292232309968,0.0007320798805558132,-0.00005347654145150234,-0.0008172758333588301,-0.0015602845567064,-0.0022835061868281417,-0.0029877756339529746,-0.0036739228809757785,-0.004342777910791435,-0.004995170706294808,-0.005631931250380784,-0.006253889525944227,-0.006861869133323219,-0.007456552338560298,-0.008038520493784142,-0.0086083536368294,-0.009166631805530697,-0.009713935037722672,-0.010250843371239967,-0.010777936843917204,-0.011295783241663002,-0.011804811762542783,-0.012305370326955622,-0.01279780604447753,-0.013282466024684504,-0.01375969737715256,-0.014229847211457697,-0.014693262637175923,-0.015150266313504272,-0.015601078704703446,-0.01604590580375628,-0.016484954235043498 diff --git a/tests/functional/scenarios/kdv/kdv.py b/tests/functional/scenarios/kdv/kdv.py new file mode 100644 index 00000000..e7387df0 --- /dev/null +++ b/tests/functional/scenarios/kdv/kdv.py @@ -0,0 +1,213 @@ +import os +import json +from datetime import datetime +import scipy.io as scio + +import numpy as np +import torch +import pytest +from epde.interface.prepared_tokens import CustomTokens, CustomEvaluator +from epde.interface.interface import EpdeSearch +from epde import TrigonometricTokens +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SingleEquationComparison +from tests.functional.utils.timer import Timer + + +class KdVTest(EquationTestTemplate): + strategy = SingleEquationComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u"] + + def correct_symbolic(self): + return '-6.0 * du/dx1{power: 1.0} * u{power: 1.0} + -1.0 * d^3u/dx1^3{power: 1.0} + \ + 1.0 * cos(t)sin(x){power: 1.0} + \ + 0.0 = du/dx0{power: 1.0}' + + def incorrect_symbolic(self): + return '0.04 * d^2u/dx1^2{power: 1} + 0. = d^2u/dx0^2{power: 1}' + + def load_data(self): + filename = os.path.join(self.foldername, "data.csv") + data = np.loadtxt(filename, delimiter=",").T + shape = 80 + t = np.linspace(0, 1, shape + 1) + x = np.linspace(0, 1, shape + 1) + grids = np.meshgrid(t, x, indexing="ij") + return grids, data + + def load_kdv_sindy_data(self): + filename = os.path.join(self.foldername, "kdv_sindy.mat") + data = scio.loadmat(filename) + t = np.ravel(data["t"]) + x = np.ravel(data["x"]) + u = np.real(data["usol"]) + u = np.transpose(u) + grids = np.meshgrid(t, x, indexing="ij") + return grids, u + + @staticmethod + def noise_data(data, noise_level): + return noise_level * np.std(data) * np.random.normal(size=data.shape) + data + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "kdv" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def make_custom_tokens(self): + custom_trigonometric_eval_fun = { + "cos(t)sin(x)": lambda *grids, **kwargs: ( + np.cos(grids[0]) * np.sin(grids[1]) + ) ** kwargs["power"] + } + custom_trig_evaluator = CustomEvaluator( + custom_trigonometric_eval_fun, + eval_fun_params_labels=["power"], + ) + return CustomTokens( + token_type="trigonometric", + token_labels=["cos(t)sin(x)"], + evaluator=custom_trig_evaluator, + params_ranges={"power": (1, 1)}, + params_equality_ranges={}, + meaningful=True, + unique_token_type=True, + ) + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "KdV", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=5) + + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append( + { + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + } + ) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def make_search(self): + grid, data = self.load_data() + + epde_search_obj = EpdeSearch( + use_solver=False, + use_pic=True, + boundary=10, + coordinate_tensors=(grid[0], grid[1]), + verbose_params={"show_iter_idx": True}, + device="cuda" if torch.cuda.is_available() else "cpu", + ) + epde_search_obj.set_preprocessor(default_preprocessor_type="FD", preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=["u"], + max_deriv_order=(2, 3), + additional_tokens=[self.make_custom_tokens()], + ) + return epde_search_obj + + def make_search_sindy(self): + grid, data = self.load_kdv_sindy_data() + + epde_search_obj = EpdeSearch( + use_solver=False, + use_pic=True, + boundary=(40, 100), + coordinate_tensors=grid, + verbose_params={"show_iter_idx": True}, + device="cuda" if torch.cuda.is_available() else "cpu", + ) + epde_search_obj.set_preprocessor(default_preprocessor_type="poly", preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=["u"], + max_deriv_order=(2, 3), + additional_tokens=[], + ) + return epde_search_obj + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + _, data = self.load_data() + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=5) + + with Timer() as t: + search_obj.fit( + data=noised_data, + variable_names=["u"], + max_deriv_order=(2, 3), + derivs=None, + equation_terms_max_number=10, + data_fun_pow=3, + additional_tokens=[self.make_custom_tokens()], + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-5, 1e-2), + fourier_layers=False, + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, t.elapsed, search_obj) + + return search_obj, t.elapsed + + @pytest.mark.slow + def run_sindy_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + grid, data = self.load_kdv_sindy_data() + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=1) + + with Timer() as t: + search_obj.fit( + data=noised_data, + variable_names=["u"], + max_deriv_order=(2, 3), + derivs=None, + equation_terms_max_number=5, + data_fun_pow=3, + additional_tokens=[], + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-12, 1e-0), + fourier_layers=False, + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name + "_sindy") + self._save_report(report_dir, operator_name + "_sindy", t.elapsed, search_obj) + + return search_obj, t.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/kdv/kdv_sindy.mat b/tests/functional/scenarios/kdv/kdv_sindy.mat new file mode 100644 index 00000000..3d9cd081 Binary files /dev/null and b/tests/functional/scenarios/kdv/kdv_sindy.mat differ diff --git a/tests/functional/scenarios/ks/__init__.py b/tests/functional/scenarios/ks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/ks/ks.py b/tests/functional/scenarios/ks/ks.py new file mode 100644 index 00000000..e11a7d6c --- /dev/null +++ b/tests/functional/scenarios/ks/ks.py @@ -0,0 +1,156 @@ +import os +import json +from datetime import datetime +from typing import List +import pytest +import numpy as np +import scipy.io as scio +import torch +from epde.interface.prepared_tokens import CustomTokens, CustomEvaluator +from epde.interface.interface import EpdeSearch +from epde import TrigonometricTokens, CacheStoredTokens + +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SingleEquationComparison +from tests.functional.utils.timer import Timer + + +class KSTest(EquationTestTemplate): + strategy = SingleEquationComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u"] + + def correct_symbolic(self): + return "-1.0 * d^2u/dx1^2{power: 1.0} + -1.0 * d^4u/dx1^4{power: 1.0} + -1.0 * u{power: 1.0} * du/dx1{power: 1.0} + 0.0 = du/dx0{power: 1.0}" + + def incorrect_symbolic(self): + return "-1.0 * d^2u/dx1^2{power: 1.0} + 1.5 * u{power: 1.0} + -0.0 = du/dx0{power: 1.0}" + + @staticmethod + def noise_data(data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def load_ks_data(self, filename): + data = scio.loadmat(filename) + t = np.ravel(data["tt"]) + x = np.ravel(data["x"]) + u = data["uu"].T + grids = np.meshgrid(t, x, indexing="ij") + return grids, u + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "ks" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "KS", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=5) + + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append( + { + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + } + ) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def make_search(self): + grid, data = self.load_ks_data(os.path.join(self.foldername, "kuramoto_sivishinky.mat")) + + epde_search_obj = EpdeSearch( + use_solver=False, + use_pic=True, + boundary=(50, 400), + coordinate_tensors=grid, + verbose_params={"show_iter_idx": True}, + device="cuda" if torch.cuda.is_available() else "cpu", + ) + epde_search_obj.set_preprocessor(default_preprocessor_type="FD", preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=["u"], + max_deriv_order=(1, 4), + additional_tokens=[], + ) + return epde_search_obj + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + grid, data = self.load_ks_data(os.path.join(self.foldername, "kuramoto_sivishinky.mat")) + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=3) + + custom_grid_tokens = CacheStoredTokens( + token_type="grid", + token_labels=["t", "x"], + token_tensors={"t": grid[0], "x": grid[1]}, + params_ranges={"power": (1, 1)}, + params_equality_ranges=None, + ) + + custom_trigonometric_eval_fun = { + "cos(t)sin(x)": lambda *grids, **kwargs: (np.cos(grids[0]) * np.sin(grids[1])) ** kwargs["power"] + } + custom_trig_evaluator = CustomEvaluator(custom_trigonometric_eval_fun, eval_fun_params_labels=["power"]) + custom_trig_tokens = CustomTokens( + token_type="trigonometric", + token_labels=["cos(t)sin(x)"], + evaluator=custom_trig_evaluator, + params_ranges={"power": (1, 1)}, + params_equality_ranges={}, + meaningful=True, + unique_token_type=True, + ) + + with Timer() as t: + search_obj.fit( + data=noised_data, + variable_names=["u"], + max_deriv_order=(1, 4), + derivs=None, + equation_terms_max_number=7, + data_fun_pow=1, + additional_tokens=[custom_grid_tokens, custom_trig_tokens], + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-12, 1e-0), + fourier_layers=False, + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, t.elapsed, search_obj) + + return search_obj, t.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/ks/kuramoto_sivishinky.mat b/tests/functional/scenarios/ks/kuramoto_sivishinky.mat new file mode 100644 index 00000000..bb2ed7e1 Binary files /dev/null and b/tests/functional/scenarios/ks/kuramoto_sivishinky.mat differ diff --git a/tests/functional/scenarios/lorenz/__init__.py b/tests/functional/scenarios/lorenz/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/lorenz/lorenz.npy b/tests/functional/scenarios/lorenz/lorenz.npy new file mode 100644 index 00000000..8fea5966 Binary files /dev/null and b/tests/functional/scenarios/lorenz/lorenz.npy differ diff --git a/tests/functional/scenarios/lorenz/lorenz.py b/tests/functional/scenarios/lorenz/lorenz.py new file mode 100644 index 00000000..b41df3ed --- /dev/null +++ b/tests/functional/scenarios/lorenz/lorenz.py @@ -0,0 +1,170 @@ +import os +import json +import pickle +import torch +from datetime import datetime +import pytest +import numpy as np +from epde.interface.interface import EpdeSearch +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SystemComparison +from epde import TrigonometricTokens, GridTokens +from tests.functional.utils.timer import Timer + +class LorenzTest(EquationTestTemplate): + strategy = SystemComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + self.dimensionality = None + + def all_vars(self): + return ["u", "v", "w"] + + def correct_symbolic(self): + return [ + '10.0 * v{power: 1.0} + -10.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}', + '28.0 * u{power: 1.0} + -1.0 * u{power: 1.0} * w{power: 1.0} + -1.0 * v{power: 1.0} + 0.0 = dv/dx0{power: 1.0}', + '1.0 * u{power: 1.0} * v{power: 1.0} + -2.6666666666666665 * w{power: 1.0} + 0.0 = dw/dx0{power: 1.0}' + ] + + def incorrect_symbolic(self): + return [ + '10.0 * v{power: 1.0} + -10.0 * u{power: 1.0} + 0.1 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}', + '28.0 * u{power: 1.0} + -1.0 * u{power: 1.0} * w{power: 1.0} + -1.0 * v{power: 1.0} + 0.1 * v{power: 1.0} + 0.0 = dv/dx0{power: 1.0}', + '1.0 * u{power: 1.0} * v{power: 1.0} + -2.6666666666666665 * w{power: 1.0} + 0.1 * w{power: 1.0} + 0.0 = dw/dx0{power: 1.0}' + ] + + def load_pretrained_PINN(self): + lorenz_path = os.path.join(self.foldername, "lorenz_pretrained.pickle") + try: + with open(lorenz_path, 'rb') as f: + return pickle.load(f) + except FileNotFoundError: + print('No model located, proceeding with ann approx. retraining.') + return None + + def make_additional_tokens(self): + return [] + + @staticmethod + def noise_data(data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def make_additional_tokens(self): + trig_tokens = TrigonometricTokens(freq=(2 - 1e-8, 2 + 1e-8), dimensionality=self.dimensionality) + grid_tokens = GridTokens(["x_0"], dimensionality=self.dimensionality, max_power=2) + return [trig_tokens] + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "lorenz" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "Lorenz", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=1) + + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append( + { + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + } + ) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def make_search(self): + t, data = self.lorenz_data() + end = 1000 + t = t[:end] + x = data[:end, 0] + y = data[:end, 1] + z = data[:end, 2] + + self.dimensionality = x.ndim - 1 + + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, + use_pic=True, + boundary=(100,), + coordinate_tensors=[t], + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=[x, y, z], + variable_names=['u', 'v', 'w'], + max_deriv_order=1, + additional_tokens=[], + ) + return epde_search_obj + + def lorenz_data(self): + t = np.load(os.path.join(os.path.dirname(__file__), 't.npy')) + data = np.load(os.path.join(os.path.dirname(__file__), 'lorenz.npy')) + return t, data + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + t, data = self.lorenz_data() + noised_data = self.noise_data(data, self.noise_level) + end = 1000 + t = t[:end] + x = noised_data[:end, 0] + y = noised_data[:end, 1] + z = noised_data[:end, 2] + + epde_search_obj = EpdeSearch(use_solver=False, multiobjective_mode=True, use_pic=True, boundary=(100), + coordinate_tensors=[t, ], verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu') + + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', + preprocessor_kwargs={}) + + popsize = 16 + epde_search_obj.set_moeadd_params(population_size=popsize, training_epochs=5) + + factors_max_number = {'factors_num': [1, 2], 'probas': [0.8, 0.2]} + + with Timer() as tim: + epde_search_obj.fit(data=[x, y, z], variable_names=['u', 'v', 'w'], max_deriv_order=(1,), + equation_terms_max_number=5, data_fun_pow=1, additional_tokens= self.make_additional_tokens(), + equation_factors_max_number=factors_max_number, + eq_sparsity_interval=(1e-8, 1e-0)) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, tim.elapsed, epde_search_obj) + + return search_obj, tim.elapsed + diff --git a/tests/functional/scenarios/lorenz/t.npy b/tests/functional/scenarios/lorenz/t.npy new file mode 100644 index 00000000..6e33a553 Binary files /dev/null and b/tests/functional/scenarios/lorenz/t.npy differ diff --git a/tests/functional/scenarios/lv/__init__.py b/tests/functional/scenarios/lv/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/lv/data_20.npy b/tests/functional/scenarios/lv/data_20.npy new file mode 100644 index 00000000..2e882cc8 Binary files /dev/null and b/tests/functional/scenarios/lv/data_20.npy differ diff --git a/tests/functional/scenarios/lv/lv.py b/tests/functional/scenarios/lv/lv.py new file mode 100644 index 00000000..4dd4c7d4 --- /dev/null +++ b/tests/functional/scenarios/lv/lv.py @@ -0,0 +1,159 @@ +import os +import json +import numpy as np +import torch +from datetime import datetime +import pytest +from epde.interface.interface import EpdeSearch +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SystemComparison +from epde import TrigonometricTokens, GridTokens +from tests.functional.utils.timer import Timer + +class LotkaVolterraTest(EquationTestTemplate): + strategy = SystemComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + self.dimensionality = 0 # только время + + def all_vars(self): + return ["u", "v"] + + def correct_symbolic(self): + return [ + '0.6666666666666666 * u{power: 1.0} + -1.3333333333333333 * u{power: 1.0} * v{power: 1.0} + 0.0 = du/dx0{power: 1.0}', + '1.0 * u{power: 1.0} * v{power: 1.0} + -1.0 * v{power: 1.0} + 0.0 = dv/dx0{power: 1.0}' + ] + + def incorrect_symbolic(self): + return [ + '0.66 * u{power: 1.0} + -1.33 * u{power: 1.0} * v{power: 1.0} + 0.0 * u{power: 2.0} + 0.001 = du/dx0{power: 1.0}', + '0.99 * u{power: 1.0} * v{power: 1.0} + -0.99 * v{power: 1.0} + 0.0 * v{power: 2.0} + 0.001 = dv/dx0{power: 1.0}' + ] + + def lv_data(self): + """Загружает временную сетку и данные (x, y) из .npy файлов.""" + t = np.load(os.path.join(self.foldername, 't_20.npy')) # путь к файлу времени + data = np.load(os.path.join(self.foldername, 'data_20.npy')) # два столбца: u, v + return t, data + + def make_additional_tokens(self): + # Для LV можно использовать тригонометрические и сеточные токены, как в lv_discovery + trig_tokens = TrigonometricTokens(freq=(2 - 1e-8, 2 + 1e-8), dimensionality=self.dimensionality) + grid_tokens = GridTokens(["x_0"], dimensionality=self.dimensionality, max_power=2) + return [trig_tokens, grid_tokens] + + @staticmethod + def noise_data(data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "lv" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "LotkaVolterra", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=1) + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append({ + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + }) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def make_search(self): + t, data = self.lv_data() + # обрежем данные, если нужно + end = 150 # как в lv_discovery + t = t[:end] + u = data[:end, 0] + v = data[:end, 1] + + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, + use_pic=True, + boundary=15, + coordinate_tensors=[t], + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=[u, v], + variable_names=['u', 'v'], + max_deriv_order=1, + additional_tokens=self.make_additional_tokens(), + ) + return epde_search_obj + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + t, data = self.lv_data() + noised_data = self.noise_data(data, self.noise_level) + end = 150 + t = t[:end] + u = noised_data[:end, 0] + v = noised_data[:end, 1] + + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, + use_pic=True, + boundary=15, + coordinate_tensors=[t], + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + + popsize = 16 + epde_search_obj.set_moeadd_params(population_size=popsize, training_epochs=5) + + factors_max_number = {'factors_num': [1, 2], 'probas': [0.8, 0.2]} + + with Timer() as tim: + epde_search_obj.fit( + data=[u, v], + variable_names=['u', 'v'], + max_deriv_order=1, + equation_terms_max_number=7, + data_fun_pow=3, + additional_tokens=self.make_additional_tokens(), + equation_factors_max_number=factors_max_number, + eq_sparsity_interval=(1e-8, 1e-0), + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, tim.elapsed, epde_search_obj) + + return search_obj, tim.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/lv/t_20.npy b/tests/functional/scenarios/lv/t_20.npy new file mode 100644 index 00000000..b269f59f Binary files /dev/null and b/tests/functional/scenarios/lv/t_20.npy differ diff --git a/tests/functional/scenarios/ns/__init__.py b/tests/functional/scenarios/ns/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/ns/cylinder_nektar_wake.mat b/tests/functional/scenarios/ns/cylinder_nektar_wake.mat new file mode 100644 index 00000000..0098e409 Binary files /dev/null and b/tests/functional/scenarios/ns/cylinder_nektar_wake.mat differ diff --git a/tests/functional/scenarios/ns/ns.py b/tests/functional/scenarios/ns/ns.py new file mode 100644 index 00000000..7a86425b --- /dev/null +++ b/tests/functional/scenarios/ns/ns.py @@ -0,0 +1,165 @@ +import os +import json +import torch +from datetime import datetime +import numpy as np +import scipy.io as scio +import pytest +from epde.interface.interface import EpdeSearch +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SystemComparison +from tests.functional.utils.timer import Timer + +class NavierStokesTest(EquationTestTemplate): + strategy = SystemComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u", "v", "p"] + + def correct_symbolic(self): + eq_u_correct = '0.0001 * d^2u/dx1^2{power: 1.0} + -5.0 * u{power: 3.0} + 5.0 * u{power: 1.0} + 0.0 = du/dx0{power: 1.0}' + eq_v_correct = eq_u_correct.replace('u', 'v').replace('du/dx0', 'dv/dx0').replace('d^2u/dx1^2', 'd^2v/dx1^2') + eq_p_correct = eq_u_correct.replace('u', 'p').replace('du/dx0', 'dp/dx0').replace('d^2u/dx1^2', 'd^2p/dx1^2') + return [eq_u_correct, eq_v_correct, eq_p_correct] + + def incorrect_symbolic(self): + eq_u_incorrect = '4.976781518840499 * u{power: 1.0} + 0.0001 * d^2u/dx1^2{power: 1.0} + -4.974425220166616 * u{power: 3.0} + 0.0 * du/dx1{power: 1.0} * d^2u/dx0^2{power: 1.0} + 0.002262543822130977 = du/dx0{power: 1.0}' + eq_v_incorrect = eq_u_incorrect.replace('u', 'v').replace('du/dx0', 'dv/dx0').replace('d^2u/dx1^2', 'd^2v/dx1^2').replace('du/dx1', 'dv/dx1') + eq_p_incorrect = eq_u_incorrect.replace('u', 'p').replace('du/dx0', 'dp/dx0').replace('d^2u/dx1^2', 'd^2p/dx1^2').replace('du/dx1', 'dp/dx1') + return [eq_u_incorrect, eq_v_incorrect, eq_p_incorrect] + + def ns_data(self): + """Загружает данные из .mat файла и формирует сетки.""" + mat = scio.loadmat(os.path.join(self.foldername, 'cylinder_nektar_wake.mat')) + U_star = mat['U_star'] + P_star = mat['p_star'] + t_star = mat['t'] + X_star = mat['X_star'] + + N = X_star.shape[0] + T = t_star.shape[0] + t_train = 50 # как в ns_test + + x = np.unique(X_star[:, 0:1].flatten()) + y = np.unique(X_star[:, 1:2].flatten()) + t = t_star.flatten() + + u = U_star[:, 0, :].T.reshape(*t.shape, *y.shape, *x.shape)[:t_train] + v = U_star[:, 1, :].T.reshape(*t.shape, *y.shape, *x.shape)[:t_train] + p = P_star.T.reshape(*t.shape, *y.shape, *x.shape)[:t_train] + + grids = np.meshgrid(t[:t_train], y, x, indexing='ij') + data = [u, v, p] + return grids, data + + def noise_data(self, data, noise_level): + return [d + noise_level * 0.01 * np.std(d) * np.random.normal(size=d.shape) for d in data] + + def make_additional_tokens(self): + return [] + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "ns" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "NavierStokes", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=1) + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append({ + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + }) + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def make_search(self): + """Создаёт EpdeSearch для тестового режима (сравнение).""" + grids, data = self.ns_data() + t, y, x = grids + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, + use_pic=True, + boundary=10, + coordinate_tensors=(t, y, x), + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=['u', 'v', 'p'], + max_deriv_order=(2,2,2), + additional_tokens=[], + ) + return epde_search_obj + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + """Режим поиска уравнений (discovery).""" + grids, data = self.ns_data() + noised_data = self.noise_data(data, self.noise_level) + t, y, x = grids + + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, + use_pic=True, + boundary=[21,21,46], + coordinate_tensors=(t, y, x), + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + + popsize = 64 + epde_search_obj.set_moeadd_params(population_size=popsize, training_epochs=15) + + factors_max_number = {'factors_num': [1, 2], 'probas': [0.8, 0.2]} + + with Timer() as tim: + epde_search_obj.fit( + data=noised_data, + variable_names=['u', 'v', 'p'], + max_deriv_order=(1,2,2), + equation_terms_max_number=20, + data_fun_pow=1, + additional_tokens=[], + equation_factors_max_number=factors_max_number, + eq_sparsity_interval=(1e-12, 1e-0), + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, tim.elapsed, epde_search_obj) + + return search_obj, tim.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/vdp/__init__.py b/tests/functional/scenarios/vdp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/vdp/vdp.py b/tests/functional/scenarios/vdp/vdp.py new file mode 100644 index 00000000..fadf597f --- /dev/null +++ b/tests/functional/scenarios/vdp/vdp.py @@ -0,0 +1,133 @@ +import os +import torch +import numpy as np +from datetime import datetime +import json +import pytest +from epde.interface.interface import EpdeSearch +from epde import TrigonometricTokens, GridTokens +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SingleEquationComparison +from tests.functional.utils.timer import Timer + +class VanDerPolTest(EquationTestTemplate): + strategy = SingleEquationComparison() + + def __init__(self, foldername = "", noise_level = 0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u"] + + def correct_symbolic(self): + return "-0.2 * u{power: 2.0} * du/dx0{power: 1.0} + 0.2 * du/dx0{power: 1.0} + -1.0 * u{power: 1.0} + -0.0 = d^2u/dx0^2{power: 1.0}" + + def incorrect_symbolic(self): + return '-1.0 * d^2u/dx0^2{power: 1.0} + 1.5 * x_0{power: 1.0, dim: 0.0} + -4.0 * u{power: 1.0} + -0.0 = du/dx0{power: 1.0} * sin{power: 1.0, freq: 2.0, dim: 0.0}' + + def load_data(self): + return np.load(os.path.join(self.foldername, "vdp_data.npy")) + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "vdp" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + @staticmethod + def make_additional_tokens(): + trig_tokens = TrigonometricTokens(freq=(2 - 1e-8, 2 + 1e-8), dimensionality=0) + grid_tokens = GridTokens(["x_0"], dimensionality=0, max_power=2) + return [grid_tokens, trig_tokens] + + @staticmethod + def noise_data(data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def make_search(self): + step = 0.05 + steps_num = 320 + t = np.arange(0., step * steps_num, step) + + epde_search_obj = EpdeSearch( + use_solver=False, + use_pic=True, + boundary=2, + coordinate_tensors=[t], + verbose_params={"show_iter_idx": True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type="FD", preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=self.load_data(), + variable_names=["u"], + max_deriv_order=(2,), + additional_tokens=self.make_additional_tokens(), + ) + return epde_search_obj + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + data = self.load_data() + noised_data = self.noise_data(data, self.noise_level) + + search_obj.set_moeadd_params(population_size=16, training_epochs=1) + + with Timer() as t: + search_obj.fit( + data=[noised_data], + variable_names=["u"], + max_deriv_order=(2, 3), + equation_terms_max_number=5, + data_fun_pow=3, + additional_tokens=self.make_additional_tokens(), + equation_factors_max_number={"factors_num": [1, 2], "probas": [0.65, 0.35]}, + eq_sparsity_interval=(1e-5, 1e-0), + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + + report = { + "scenario": "VanDerPol", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": t.elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=5) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + text = eq.text_form + if "\n" in text: + eq_part, meta_part = text.split("\n", 1) + else: + eq_part, meta_part = text, None + + equations_list.append({ + "equation": eq_part.strip(), + "parameters": meta_part + }) + clusters_json.append({ + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list + }) + + # Сохраняем как JSON + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + return search_obj, t.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/vdp/vdp_ann_pretrained.pickle b/tests/functional/scenarios/vdp/vdp_ann_pretrained.pickle new file mode 100644 index 00000000..c17f73b8 Binary files /dev/null and b/tests/functional/scenarios/vdp/vdp_ann_pretrained.pickle differ diff --git a/tests/functional/scenarios/vdp/vdp_data.npy b/tests/functional/scenarios/vdp/vdp_data.npy new file mode 100644 index 00000000..05a824cf Binary files /dev/null and b/tests/functional/scenarios/vdp/vdp_data.npy differ diff --git a/tests/functional/scenarios/wave/__init__.py b/tests/functional/scenarios/wave/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/functional/scenarios/wave/ann_pretrained.pickle b/tests/functional/scenarios/wave/ann_pretrained.pickle new file mode 100644 index 00000000..7e56ad9d Binary files /dev/null and b/tests/functional/scenarios/wave/ann_pretrained.pickle differ diff --git a/tests/functional/scenarios/wave/wave.py b/tests/functional/scenarios/wave/wave.py new file mode 100644 index 00000000..b13419ff --- /dev/null +++ b/tests/functional/scenarios/wave/wave.py @@ -0,0 +1,149 @@ +import os +import json +import torch +from datetime import datetime +import numpy as np +import pytest +from epde.interface.interface import EpdeSearch +from tests.functional.templates import EquationTestTemplate +from tests.functional.comparasion import SingleEquationComparison +from tests.functional.utils.timer import Timer + +class WaveTest(EquationTestTemplate): + strategy = SingleEquationComparison() + + def __init__(self, foldername="", noise_level=0): + if foldername == "": + foldername = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.foldername = foldername + self.noise_level = noise_level + + def all_vars(self): + return ["u"] + + def correct_symbolic(self): + # Волновое уравнение: d^2u/dt^2 = c^2 * d^2u/dx^2, c^2 = 0.04 + return '0.04 * d^2u/dx1^2{power: 1.0} + 0.0 = d^2u/dx0^2{power: 1.0}' + + def incorrect_symbolic(self): + # Неправильное уравнение (близкое, с лишним множителем du/dx0) + return '0.04 * d^2u/dx1^2{power: 1.0} * du/dx0{power: 1.0} + 0.0 = d^2u/dx0^2{power: 1.0} * du/dx0{power: 1.0}' + + def wave_data(self): + """Загружает данные из CSV и формирует сетки.""" + shape = 80 + data = np.loadtxt(os.path.join(self.foldername, 'wave_sln_80.csv'), delimiter=',').T + t = np.linspace(0, 1, shape + 1) + x = np.linspace(0, 1, shape + 1) + grids = np.meshgrid(t, x, indexing='ij') + return grids, data + + def noise_data(self, data, noise_level): + return noise_level * 0.01 * np.std(data) * np.random.normal(size=data.shape) + data + + def make_additional_tokens(self): + return [] + + def make_report_dir(self, base_dir, operator_name): + stamp = datetime.now().strftime("%Y%m%d_%H%M%S") + report_dir = base_dir / "wave" / operator_name / stamp + report_dir.mkdir(parents=True, exist_ok=True) + return report_dir + + def _save_report(self, report_dir, operator_name, elapsed, search_obj): + report = { + "scenario": "Wave", + "operator": operator_name, + "noise_level": self.noise_level, + "elapsed_sec": elapsed, + } + (report_dir / "summary.json").write_text( + json.dumps(report, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + raw_clusters = search_obj.equations(only_print=False, num=1) + def eq_to_text(eq): + return getattr(eq, "text_form", str(eq)) + + clusters_json = [] + for idx, cluster in enumerate(raw_clusters): + equations_list = [] + for eq in cluster: + equations_list.append({"equation": eq_to_text(eq)}) + clusters_json.append({ + "cluster_id": idx, + "size": len(equations_list), + "equations": equations_list, + }) + + (report_dir / "equations.json").write_text( + json.dumps(clusters_json, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def make_search(self): + """Создаёт объект EpdeSearch для тестового режима (сравнение правильного/неправильного).""" + grids, data = self.wave_data() + t = grids[0] + x = grids[1] + + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, # важно для совместимости с SingleEquationComparison + use_pic=True, + boundary=5, + coordinate_tensors=(t, x), + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + epde_search_obj.create_pool( + data=data, + variable_names=['u'], + max_deriv_order=(2,2), + additional_tokens=[], + ) + return epde_search_obj + + @pytest.mark.slow + def run_discovery(self, search_obj, report_dir=None, operator_name="unknown"): + """Режим поиска уравнений.""" + grids, data = self.wave_data() + noised_data = self.noise_data(data, self.noise_level) + t = grids[0] + x = grids[1] + + epde_search_obj = EpdeSearch( + use_solver=False, + multiobjective_mode=True, + use_pic=True, + boundary=20, + coordinate_tensors=(t, x), + verbose_params={'show_iter_idx': True}, + device='cuda' if torch.cuda.is_available() else 'cpu', + ) + epde_search_obj.set_preprocessor(default_preprocessor_type='FD', preprocessor_kwargs={}) + + popsize = 16 + epde_search_obj.set_moeadd_params(population_size=popsize, training_epochs=5) + + factors_max_number = {'factors_num': [1, 2], 'probas': [0.65, 0.35]} + + with Timer() as tim: + epde_search_obj.fit( + data=noised_data, + variable_names=['u'], + max_deriv_order=(2,3), + equation_terms_max_number=5, + data_fun_pow=3, + additional_tokens=[], + equation_factors_max_number=factors_max_number, + eq_sparsity_interval=(1e-6, 1e-4), + ) + + if report_dir is not None: + report_dir = self.make_report_dir(report_dir, operator_name) + self._save_report(report_dir, operator_name, tim.elapsed, epde_search_obj) + + return search_obj, tim.elapsed \ No newline at end of file diff --git a/tests/functional/scenarios/wave/wave_sln_80.csv b/tests/functional/scenarios/wave/wave_sln_80.csv new file mode 100644 index 00000000..8271838d --- /dev/null +++ b/tests/functional/scenarios/wave/wave_sln_80.csv @@ -0,0 +1,81 @@ +0.,0.,0.,0.,0.,0.,0.,-2.7755575615628914e-17,0.,-2.7755575615628914e-17,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,-5.551115123125783e-17,0.,0.,0.,-5.551115123125783e-17,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,-1.1102230246251565e-16,0.,0.,0.,0.,0.,-1.1102230246251565e-16,0.,0.,-1.1102230246251565e-16,-1.1102230246251565e-16,0.,-1.1102230246251565e-16,-1.1102230246251565e-16,0.,0.,0.,0.,-1.1102230246251565e-16,-1.1102230246251565e-16,-1.1102230246251565e-16,-1.1102230246251565e-16,0.,-1.1102230246251565e-16,-1.1102230246251565e-16,0.,-1.1102230246251565e-16,0.,0.,-1.1102230246251565e-16,0.,0. +0.015236700444775542,0.015629737779308622,0.016505908665018415,0.017950013769348044,0.019946551701977205,0.02249165124808092,0.025556894470016994,0.029137850458229392,0.033199212528312594,0.03771163814732004,0.042657044656658705,0.04801191780551678,0.0537322970546639,0.05976311006218682,0.06607101715849356,0.0726336535700843,0.07941760623294467,0.08636502619752107,0.09342409259131931,0.10055941879130023,0.1077386220351638,0.11491925493319594,0.12205454341628308,0.12910574440442632,0.1360319367413519,0.14279363793432442,0.14935899637559175,0.15570946852516954,0.1618133544793618,0.1676288510340067,0.1731242600062013,0.1782972409191675,0.18315111894324515,0.18765732535867147,0.19178045973010338,0.19551170889050312,0.19888265251186843,0.20190401159568405,0.20455406731215997,0.20681524230905707,0.20870794819210287,0.21026302088359794,0.2114967667964151,0.21242566155733383,0.2130689732527663,0.21345083102076284,0.21359444961691054,0.21352410684507278,0.213273139001751,0.21287762673595556,0.2123691799328129,0.2117648310770298,0.21107994182676348,0.21035535139150252,0.2096419769063158,0.2089800308619567,0.2083820088976429,0.20785610469086058,0.20742962847379065,0.2071378125554567,0.20701101588016302,0.2070622760476073,0.20729057025459974,0.20770740296987178,0.20833469858190656,0.2091924071922906,0.210286135835849,0.21160697720268895,0.21315255384565257,0.2149232976133284,0.21691605156584648,0.21912024822991483,0.22152402050843634,0.2241143054177428,0.2268757299461417,0.22979107450321234,0.23284210463716803,0.23600637665754431,0.2392612188868879,0.2425842289264194,0.2459499047200676 +0.0594138678223934,0.0600457947133418,0.06139967722655963,0.06360246291240297,0.06663541720795771,0.07049380143373625,0.0751429520900542,0.08057730621789251,0.08675337941036088,0.09363484096779952,0.10119920576024827,0.10941715437212209,0.118233808280081,0.12757984375747372,0.13741274445336582,0.14770351804514448,0.1584089925016815,0.16945432689545223,0.18077116905218066,0.19231330096317947,0.2040383661155703,0.2158892771834372,0.22779918281687317,0.2397129795702366,0.25157700663800775,0.2633384248924724,0.2749476048254859,0.28636695339817186,0.2975490667729932,0.3084377466929431,0.318986029344765,0.3291746024981573,0.33899137809203744,0.34839264085966537,0.35732797352893886,0.36577435227746213,0.37375203229398046,0.3812602734764911,0.38826285118550186,0.3947284646985953,0.400668476847483,0.40610726378779183,0.41105313724393927,0.41551446031430794,0.41950372339533976,0.42304103985854596,0.4261485708179493,0.4288491704386036,0.43117399919136296,0.43315787697034225,0.43483378245422627,0.4362236705372044,0.43734823900075737,0.43825273731949105,0.43899292576145266,0.4396157548051062,0.44014315108201085,0.44059252160668727,0.44100137664563915,0.4414166062398634,0.4418807146707909,0.44241833902127303,0.4430387386461236,0.44376559497340734,0.44463534924129533,0.44568269486337736,0.4469260301690415,0.44836551475164893,0.45000976661930847,0.451874562126041,0.45397087194917685,0.4562961947279651,0.4588458895369823,0.4616173873140585,0.46460570111478106,0.46780027239018784,0.47118654713711655,0.4747484933204104,0.47846768376144105,0.48232358765122696,0.4862921191514561 +0.13027529650318628,0.13105512713271866,0.1326356436899898,0.13515792139363075,0.13860665989766016,0.14297790649732064,0.14824287794598356,0.15439673843840152,0.16140277986464177,0.16923007560264447,0.1778593738448951,0.18726545113933407,0.1974009678451978,0.20820535061814074,0.21964071807152888,0.23168061230486114,0.24428582227575557,0.25738825872116305,0.2709240235869117,0.2848504514473645,0.29912834197855687,0.3137028845845417,0.32850497783970006,0.3434779240392565,0.3585718360818642,0.37373620622663944,0.3889147785964542,0.40405542832657526,0.4191064755287746,0.4340138098706491,0.44872666529552685,0.4632058267667777,0.4774183988234222,0.4913154190967705,0.5048446209039867,0.5179693217852637,0.5306800908669255,0.5429563147999137,0.5547539171454086,0.5660326479081291,0.5767820929325913,0.5870028631545651,0.5966846541614861,0.6058169409776722,0.6143935207229237,0.6224167099111094,0.6298947326140509,0.6368355562361271,0.6432502961643636,0.6491534855025496,0.6545629703452408,0.6594966133637056,0.6639723379624787,0.6680194335644212,0.6716734247747614,0.674968353833109,0.6779296389866307,0.6805801494128622,0.6829547846856919,0.6850956695645655,0.687043546142735,0.6888292103649387,0.6904735540273523,0.6920079830043533,0.693474279511848,0.6949137841472721,0.6963564548799576,0.6978171075623766,0.6993180259891255,0.7008920223580424,0.7025676122360064,0.7043569867004373,0.7062699364078335,0.7083225853970945,0.7105297276420707,0.7128974110714535,0.715424974359666,0.7181152607153198,0.7209665266439081,0.7239722628393781,0.7271234757659525 +0.22562332606158886,0.22650754850181865,0.2281752832903043,0.23076487994357314,0.23426711745178003,0.23867950825913414,0.24398404753214403,0.2501774382753796,0.2572359215290715,0.2651391664858787,0.2738744085434847,0.28342475852769256,0.2937583018118999,0.30483325960316854,0.3166226278952331,0.32910680169549406,0.34225694342545004,0.35602285716346377,0.370355444811837,0.38522247120652037,0.400594177360736,0.41642676436127574,0.43265966040133463,0.4492433492642271,0.4661396315234164,0.4833082447886096,0.5006946613978283,0.5182393956064734,0.5358941154345758,0.5536151504561679,0.5713553551943586,0.5890601197319578,0.6066790334260922,0.6241647865154146,0.6414708830931921,0.6585511878274402,0.6753649944704783,0.6918726915340363,0.7080281260966377,0.7237870816651781,0.7391161670955406,0.7539888901689072,0.7683751943159464,0.782244474374511,0.795569817123577,0.8083322038332799,0.8205214172411068,0.832126019412347,0.8431318366357833,0.8535272359383954,0.8633085853624922,0.8724836574900552,0.8810616943597986,0.8890475970300404,0.8964469594208018,0.9032717910350606,0.9095441412415001,0.9152862664794887,0.9205217234173748,0.9252776300432018,0.929583249446442,0.9334683608574457,0.9369607643168988,0.9400925951531376,0.9429017945610463,0.9454274436676965,0.9477049168630959,0.9497611621812976,0.9516280298705468,0.9533489699768711,0.9549647593346218,0.9565008376897417,0.9579805602287477,0.9594367128973409,0.9609022858556384,0.9624002464729076,0.9639456627557449,0.9655613511009183,0.9672644311566742,0.9690657004139247,0.9709752171072361 +0.3433188552680024,0.34429771278909505,0.34599365639140195,0.34853358461374884,0.3519143380749088,0.35613492360433396,0.3611882140673701,0.3670725544787916,0.37377745302373405,0.3812935487877521,0.3896148722758275,0.398733297112143,0.4086331162966872,0.41929263516116566,0.43069680985792524,0.4428338668576026,0.45568672660482334,0.46922554329514327,0.48341891839591644,0.4982467332415835,0.5136902243223407,0.5297195268440186,0.5462879690427598,0.5633574541909114,0.5809034483855924,0.5988983947467247,0.6172952288394133,0.6360349816200717,0.6550771974081796,0.6743912989170628,0.6939379874234968,0.7136556275345627,0.7334843445322653,0.7533828742967451,0.7733140341023206,0.7932281731127897,0.8130618735174439,0.8327628765250384,0.8522876161192317,0.8715925264400539,0.8906271201055824,0.9093432656376479,0.9276959105603706,0.9456391374888329,0.9631295688135888,0.980129994252125,0.9966129997253321,1.0125492954650368,1.0279024641517571,1.0426375043276197,1.0567299801546204,1.0701744236090578,1.0829678368301834,1.095090637870131,1.1065192927777066,1.1172422472445935,1.1272719503734485,1.1366236315627096,1.1453045431496365,1.1533217746056392,1.1606873561017905,1.1674229696754286,1.1735557597398327,1.1791111584580445,1.1841154579764717,1.188597417812417,1.1925896804555212,1.1961243062432805,1.199235150253485,1.2019660923593658,1.2043605153950114,1.2064509540977162,1.2082686540175513,1.2098551601342828,1.2112536799427276,1.212498479907711,1.2136167181255697,1.2146452349006174,1.2156155865038119,1.2165531612890383,1.2174844124056012 +0.4812813560806589,0.48236709783738885,0.48408585638535995,0.48654987533155536,0.4897605167184538,0.4937179336678458,0.49842321581102006,0.5038760309910757,0.5100760765136303,0.5170225218581498,0.5247147639368244,0.5331516187954191,0.5423301856323491,0.5522449332932956,0.5628907383001067,0.574262572553767,0.5863534036347463,0.5991508304955075,0.6126393297013836,0.6268093585990947,0.6416517655715699,0.657149759183428,0.6732719832751406,0.6899927398402016,0.7072994599775874,0.725176275402854,0.7435869298694023,0.7624800323332748,0.7818250887872057,0.8016036398827348,0.8217860224018703,0.84231291260621,0.8631245845495622,0.88418816924171,0.9054765317423136,0.9269426261514947,0.9485135720475038,0.9701331495646974,0.991763784264429,1.0133663752006499,1.0348826092925845,1.056252672868292,1.077424173972152,1.098343593498165,1.1189585590728541,1.1392204944821294,1.1590895274486324,1.1785236908189416,1.1974720048011291,1.2158838028013814,1.2337188501786376,1.250957874981744,1.2675844307829152,1.2835595916152531,1.298837835865549,1.3133875576989815,1.3272071505064988,1.3402995844860273,1.3526542225091926,1.3642573700119074,1.3751016929879312,1.3851951834562113,1.3945565160683087,1.4031981767563924,1.411129372552107,1.418362555007583,1.424919789865314,1.4308296979291537,1.4361197970295083,1.44082380545333,1.444977177228297,1.4486114617089325,1.4517580288266494,1.4544569980830524,1.4567512076183395,1.4586777649481817,1.4602692753768243,1.4615672173354346,1.462609641450633,1.4634302771030356,1.4640653741926821 +0.6374888876374862,0.6387059887342419,0.640473457591708,0.6428890244551705,0.6459564313035575,0.6496764730192754,0.6540546833790044,0.6590915445452734,0.6647924602714262,0.6711615026700001,0.6782012525846329,0.6859146679814269,0.69430644052964,0.7033809576162041,0.7131395183251913,0.7235817364963089,0.7347074058859395,0.7465160311729181,0.7590036664243839,0.7721681923785327,0.7860072207889343,0.8005140790651052,0.8156714579255948,0.8314648838902247,0.8478902264086992,0.8649404450093634,0.8825913282122888,0.9008042087932728,0.9195587935190339,0.93884584572774,0.9586453635754297,0.9789084298260848,0.9995841750928847,1.0206488646551382,1.042084408666644,1.063851494761242,1.0858813971810606,1.1081224874578917,1.130545268350574,1.1531178151672279,1.175783714986508,1.198482470547853,1.2211625159912085,1.2437709718101426,1.266254720980249,1.2885618892403694,1.3106464997139697,1.3324606734296778,1.3539482129270541,1.3750523232097507,1.3957240656162984,1.4159320372463133,1.4356473421813125,1.4548194912994876,1.4733910179847072,1.4913166486982423,1.5085787850622292,1.5251651468216212,1.5410485172727704,1.556196983266134,1.5705848853331221,1.5842033753607012,1.5970565378621915,1.6091400085357082,1.6204434610746354,1.630959935992062,1.6406950916000174,1.6496663354232204,1.6578877818190252,1.665374586639199,1.672145515726165,1.678223332214002,1.683631837867532,1.6884000819410816,1.6925603257933721,1.6961437142976878,1.6991806982828406,1.7017074750568364,1.7037596583032402,1.7053716059514017,1.7065810749161767 +0.8099781102479722,0.8113554611822111,0.8132109631567033,0.8156295753284537,0.8186153789440175,0.8221693188478206,0.8262977470598145,0.831001442263162,0.8362871512402021,0.8421602792626837,0.848624411128833,0.8556838427486281,0.8633456562389542,0.8716178154249463,0.880504378155364,0.8900072981750128,0.9001297026620103,0.9108769634873302,0.9222517212356137,0.9342557797396477,0.9468903529516015,0.9601551884242594,0.9740441574829637,0.9885516152584504,1.0036779635021627,1.019421574586085,1.0357697438067812,1.0526990826261284,1.0701984323507283,1.088264310155107,1.1068852284074764,1.1260280026777565,1.145656686416293,1.16575621122982,1.186315663408673,1.2073067995733426,1.2286758685730848,1.2503824540901036,1.272405928759027,1.294722989567207,1.3172871269568844,1.3400466056216886,1.362957570558167,1.3859747480991027,1.4090514601490052,1.4321399653616882,1.4551946473107304,1.4781684633876353,1.5010087168386015,1.5236614807592057,1.5460765032904684,1.568213718227077,1.5900347013249523,1.611485739587179,1.6325076570542307,1.6530489742642414,1.6730770244601336,1.6925641225716679,1.7114701091993507,1.7297498020304791,1.7473628597045685,1.7642834041362847,1.7804978017096829,1.7959839447849046,1.810712747109742,1.8246580020917773,1.8378062568950864,1.8501583663707732,1.8617106817984688,1.872455307591704,1.882389155280297,1.89152030973288,1.8998590006352833,1.9074161546947548,1.9142058162427635,1.9202459066625406,1.9255577792407774,1.930164092779578,1.9340900668880776,1.9373631881198146,1.9400145635545702 +0.9968442993850283,0.998409364869181,1.0003922529526041,1.0028671808358471,1.0058371121692047,1.0093027801471817,1.0132687441305506,1.017735679253383,1.0227084875962005,1.0281912641854412,1.0341869500185918,1.0406990560234222,1.0477331407120007,1.0552958737559133,1.0633911614874374,1.0720213876848455,1.0811901395824899,1.0909036580728302,1.101166794420958,1.111982341909793,1.1233524746577412,1.1352799271603735,1.147766190443581,1.1608115886837966,1.1744178117089838,1.1885856217372859,1.203311894243716,1.2185882315343628,1.2344107230189598,1.2507785817796535,1.2676870193689889,1.2851202994059934,1.303059816844883,1.3214978679305887,1.340428651419003,1.3598361075388494,1.3796874678669582,1.3999570904949223,1.4206328302300768,1.4417001593899517,1.4631273308522923,1.4848775261723342,1.5069190162525428,1.5292186243426737,1.5517409774620852,1.5744479425138698,1.59729971208009,1.6202556235218775,1.6432729645223576,1.6663074576501256,1.689313878581493,1.712248227743401,1.7350669666318885,1.7577204808996774,1.780156329950205,1.802323952799794,1.8241793338179835,1.8456821988496592,1.8667847548624126,1.88743495503907,1.9075833469982584,1.9271898731797208,1.9462236994679474,1.9646472868454554,1.9824166357884125,1.9994896834940423,2.0158348041423344,2.0314343973356093,2.0462662035274826,2.060299567141539,2.0735089532017996,2.0858848373381713,2.097420627033088,2.108105950686059,2.1179329512736293,2.1269018936238866,2.1350199390298,2.1422910999145452,2.1487246185314817,2.1543351018171686,2.159140382231858 +1.1962413596768555,1.1980163068386782,1.2001570314769452,1.2027284419572781,1.2057317751469843,1.2091673869004738,1.21303692617295,1.217340756209576,1.2220805113115754,1.227257747940783,1.2328739509308309,1.2389307967535315,1.245430422763479,1.25237571544976,1.2597688198487116,1.2676113945536787,1.2759057769658702,1.2846560647601755,1.2938663965221286,1.30353875219126,1.3136746544508708,1.3242773268518686,1.3353523436570451,1.3469032593087369,1.3589311050217745,1.3714370044686384,1.3844245362039718,1.3978973347945438,1.4118564604399308,1.4263017977113044,1.4412331949289539,1.4566503091735794,1.4725503722066655,1.4889312528783996,1.5057904761028356,1.523123005434679,1.5409173881483216,1.5591628049215471,1.5778542236588484,1.5969848651415595,1.6165387946398353,1.6364960942983375,1.6568385184309264,1.677546408858369,1.6985975918075578,1.7199663039128161,1.7416222264803818,1.7635346500040423,1.785674169354029,1.8080097467142864,1.8305055773435666,1.8531190974186496,1.8758069884208757,1.8985289735420832,1.9212447428441184,1.9439104037477701,1.96647664065219,1.9888960465617214,2.0111194344821772,2.033094832511936,2.0547703854288026,2.076097389600037,2.09703198150374,2.117526424262572,2.1375281945932363,2.1569855275218996,2.175853121318384,2.194096803257547,2.2116785467761058,2.2285500241370255,2.244667379140638,2.2600039835784362,2.2745364414967417,2.288234299179238,2.3010686593934073,2.3130212065096023,2.324082426569261,2.3342365072015956,2.3434743400392333,2.3517940189086004,2.359195982832271 +1.4063818058080408,1.4083744001180527,1.41067378862542,1.4133344026158379,1.4163570417902802,1.4197419601443397,1.4234901385211582,1.4276018580921503,1.4320780525984913,1.4369197207647155,1.4421279784316905,1.4477040630850322,1.4536493880962524,1.4599660216038948,1.4666557554930884,1.473720159109646,1.4811613499157081,1.488982933890292,1.4971889279907162,1.5057814218141599,1.5147621779478158,1.5241348029971271,1.5339059685552874,1.5440804294976518,1.5546597938000242,1.565646075145891,1.5770451633920355,1.5888646486079367,1.6011079776791746,1.6137763885344958,1.6268723283456692,1.6404014253532224,1.6543675798894015,1.668771995521713,1.6836149158700502,1.698897012791806,1.7146172673291749,1.7307730384914977,1.7473635653221389,1.7643869192383754,1.7818367759878988,1.7997041446180617,1.8179799264133671,1.8366536562717406,1.8557127203183368,1.8751415409254202,1.8949200412925942,1.9150276253913658,1.9354455397045656,1.9561535012567224,1.9771260504275503,1.9983293494459893,2.0197280375571016,2.0412925935348847,2.062994388727275,2.0847994978605064,2.1066644093237445,2.1285454982024037,2.1504005271277684,2.1721859342992342,2.193856652503564,2.215366119950648,2.2366684931618774,2.2577166532698736,2.2784609315802666,2.2988513500385506,2.318839996022441,2.338384425605211,2.3574401175002095,2.3759553847233126,2.3938810193318365,2.4111792258839393,2.4278149281275,2.4437462770096703,2.4589318790347416,2.4733393633143463,2.4869434804835326,2.4997138870471924,2.511625575206124,2.5226594330545895,2.532797498702224 +1.625536898634125,1.6277599471729256,1.6302329277021108,1.6330001835511516,1.6360623836472565,1.6394197369372692,1.6430730703242953,1.6470226122796228,1.6512691462447906,1.6558135043053694,1.6606566131136185,1.6657994994915821,1.671243327393898,1.6769897686069173,1.6830403384894335,1.689396422831379,1.6960598276307097,1.7030334797254167,1.7103207121859785,1.7179235217055786,1.725843726844344,1.734084561942625,1.7426517365530731,1.7515496450636892,1.7607802633151295,1.7703459896968086,1.780252498298144,1.7905073467950907,1.8011145743119097,1.8120762596547833,1.8233958584606316,1.8350804815413027,1.8471363371629788,1.8595662871175689,1.8723722462048868,1.8855577354881938,1.8991271912811114,1.9130828325673277,1.9274263170558563,1.9421587094198833,1.9572801991886117,1.9727897484609762,1.9886851183464709,2.004962817166154,2.021617889652833,2.0386436494114673,2.056030188136605,2.0737668013030826,2.0918441129898917,2.110251469095007,2.1289740807863304,2.1479898733161256,2.1672748070910584,2.1868108344896404,2.206580993428272,2.226563017031089,2.2467244086519518,2.267030729671087,2.287450839212398,2.307953641663957,2.328505468717523,2.3490676526331953,2.3695986227941455,2.3900578307681033,2.4104044986729525,2.430596640251802,2.4505901584155856,2.470340194142307,2.4898017974975115,2.5089276039393322,2.527670367459845,2.5459861738128025,2.563832876517252,2.5811634021104894,2.597930073671492,2.6140909035267104,2.629607894878088,2.6444406567914784,2.658551656683457,2.671906703213879,2.684471508091469 +1.852036528011046,1.8545007468100885,1.857160117006226,1.8600492726867477,1.8631689629904362,1.8665193949352086,1.8701016001148092,1.8739157852075128,1.8779629821729347,1.8822441543383952,1.8867601924139814,1.891512108246857,1.8965012060155815,1.901729166031715,1.9071973661172625,1.9129070104983643,1.9188596396815458,1.925057599751017,1.931503407105516,1.938198909320311,1.9451459033789176,1.9523469313123571,1.9598057637525965,1.967525631934408,1.9755087518334946,1.9837575986897351,1.9922762205295235,2.001069812291779,2.0101418939550384,2.0194950130501232,2.029132575880544,2.0390602642814977,2.049283616011413,2.059805947133835,2.070630030368361,2.0817600993800895,2.0932021412919117,2.1049604794697103,2.117037796435613,2.129436660508313,2.1421608882653103,2.1552143207665075,2.168599182997956,2.1823166421470415,2.1963671855905345,2.2107509468732536,2.225466666356392,2.2405120270833083,2.25588498182701,2.271582540030831,2.287599395275823,2.303925665230337,2.3205494176555557,2.3374630539308443,2.3546597362003743,2.3721285050977308,2.3898500981035746,2.407802035321227,2.4259657690932523,2.4443238089188837,2.4628556508745216,2.481533854053012,2.500325566134882,2.519200538367348,2.538130177047233,2.557084077808468,2.576026568191152,2.5949159128433603,2.6137119483636346,2.632376844881934,2.650870745453816,2.669149190880843,2.687168307797365,2.704881904927629,2.722242356937338,2.739203652632772,2.755720171192274,2.771746950037106,2.787239083859575,2.8021520427102016,2.816440138719723 +2.0842692338458892,2.086983313266128,2.089839717332982,2.092863713452294,2.0960560292624466,2.09941685448851,2.1029472551019066,2.1066474144568845,2.11051844135895,2.1145613170218005,2.1187768524557784,2.123165990157212,2.1277300581805307,2.132470690751126,2.1373891313877773,2.142486421734882,2.147763894556418,2.153223523800747,2.158867317044857,2.1646969419910254,2.1707140715276596,2.1769207713980947,2.1833196622322686,2.1899132181033347,2.196703647178868,2.2036933169667696,2.2108852209602197,2.2182830276952625,2.225889788980104,2.233708170433014,2.241741357049781,2.249993895998691,2.258470581730005,2.267174811315031,2.276109711425748,2.2852796304014023,2.294690876215519,2.3043486012072734,2.314256030723621,2.3244165428706944,2.3348356426774064,2.345519460930736,2.356472611436312,2.367698979474214,2.379202281841732,2.39098658638468,2.4030556907019545,2.415412425804061,2.4280593350823567,2.4409983536109037,2.4542304029818305,2.4677539851418775,2.481565869966901,2.4956654874064115,2.510052682283342,2.5247244961852626,2.5396721334445647,2.5548834718498625,2.5703498300173973,2.586063816833856,2.602015287194881,2.6181873870847525,2.6345574057337933,2.6511054488599983,2.6678138735453705,2.684663112016197,2.701627464518704,2.7186733601203543,2.7357691999390212,2.7528874781108894,2.769997724344447,2.7870613732758027,2.8040393165904844,2.8208920745641604,2.8375784254917438,2.8540556715045007,2.8702791310529907,2.8862060009875554,2.9017917934515256,2.9169904993919187,2.9317544515434677 +2.3206822645819782,2.3236529545223377,2.326715101380448,2.329884949950957,2.333163117359178,2.336549763331552,2.340045839794187,2.343651507491188,2.34736780477337,2.3511956370356772,2.355135704545098,2.3591888417942615,2.3633563104127346,2.367639670825615,2.372040059427661,2.37655839915956,2.3811958989072344,2.385954392602436,2.390835714424348,2.395841376047429,2.40097288901125,2.4062321124155255,2.4116213489404275,2.4171427947958133,2.422798501837311,2.428590653309058,2.4345218677783333,2.440595280861626,2.446813675072047,2.453179615416945,2.4596960651606787,2.4663670113964042,2.4731967610391368,2.480188617690613,2.4873457342748777,2.4946722843026015,2.5021742145749672,2.5098566632791615,2.5177231069838695,2.525777258222346,2.534024878366951,2.542472403779364,2.551125197935632,2.5599882937158873,2.5690667988760336,2.5783662746597837,2.5878924381638586,2.5976503970596627,2.6076448987047374,2.6178803805625694,2.6283609875105602,2.6390898485811363,2.6500689407933886,2.6613015128896764,2.672790941982734,2.6845390176043544,2.696544160982253,2.7088022465398227,2.7213113680368894,2.734070547296443,2.7470767972487478,2.7603222159857936,2.773794197405877,2.787482137529234,2.8013772502499217,2.815469098297036,2.829742081767611,2.8441737905259736,2.8587431974315836,2.873432641799284,2.8882216056760512,2.903081822029141,2.9179835666375094,2.9328978952548392,2.9477942473919247,2.962638703870056,2.977394260085618,2.992025451060699,3.006494429382132,3.0207610031327117,3.0347833070668844 +2.559781547742296,2.5630137334451946,2.5662885005199225,2.5696134244825313,2.572989003886347,2.5764153702716945,2.57989334917102,2.5834230863070884,2.587005546146395,2.5906415671511067,2.59433175687824,2.5980768646732164,2.6018781170032206,2.605737073094925,2.609654823520223,2.6136322231278433,2.61767044001825,2.621771347669927,2.6259368164215497,2.6301682575868877,2.6344670458684143,2.6388349966869953,2.643274487662065,2.647787668003214,2.6523764094743356,2.6570427099812015,2.6617890999560263,2.6666185580162405,2.67153366825437,2.676536810535919,2.6816307016000294,2.6868188981570094,2.6921051798100777,2.6974926155802352,2.7029841884471235,2.7085836278733186,2.714295930265278,2.720125603643489,2.726076101499849,2.7321510867389827,2.7383556248218657,2.7446952169421355,2.7511748886166516,2.757799708465584,2.7645749046105115,2.771505969176497,2.7785986215548384,2.7858584025233286,2.793290620549212,2.800900516503373,2.8086934324360264,2.816674649190563,2.8248489452924637,2.8332212065185876,2.841796203264066,2.8505781951908338,2.8595703656500024,2.868774496084896,2.878193123191774,2.8878291082330856,2.8976842328186465,2.907757775043555,2.9180461867816203,2.92854670231239,2.9392574803831817,2.9501755033176096,2.961294437514211,2.972603561465387,2.98409256093531,2.9957527070698227,3.007573077891688,3.0195372504147806,3.031626753995537,3.0438244766448275,3.056112049468994,3.068466857020522,3.0808629528799383,3.0932749488641065,3.1056750211569333,3.1180328497938756,3.1303167051812677 +2.800131667247712,2.8036284400599603,2.8071209157895947,2.810608354872547,2.814091140428483,2.8175693768880574,2.8210437660149177,2.824514439690898,2.827982289587907,2.831448089973912,2.8349123614895118,2.8383757742016327,2.8418395225975983,2.8453051696919305,2.8487737723614512,2.8522461337284053,2.8557233981905603,2.859207498432461,2.862700370976188,2.866203354808382,2.8697177182873137,2.873245275211582,2.87678855158135,2.880349712270697,2.88393047557034,2.8875326889323,2.8911588866537676,2.894812031446835,2.898494566774038,2.9022086909190317,2.9059569155171605,2.9097425142602944,2.9135688607582386,2.9174387858836615,2.9213550602327794,2.9253209875148505,2.9293406841429044,2.9334179882123133,2.9375562113953424,2.9417588194738604,2.9460300487055813,2.9503743071917525,2.954795993630438,2.9592998054157764,2.9638906051954743,2.9685732860061878,2.9733528890399983,2.978234616080022,2.983223620763893,2.9883251496758447,2.9935447072350843,2.9988882313331606,3.00436165974335,3.009970361141907,3.0157194701677716,3.021614323686732,3.027660717236745,3.033864031360295,3.0402293299737377,3.046761523795786,3.053465208587298,3.0603444556967183,3.067402211929995,3.07464123399423,3.082064407427504,3.089673924491306,3.0974704342966257,3.105452584780371,3.113618638198638,3.121966817063592,3.1304939451455436,3.13919387762272,3.1480583133924633,3.157080357900924,3.166252255962685,3.1755621074775213,3.184995051539288,3.194535878522595,3.2041672681807314,3.2138696704150727,3.2236224722342084 +3.0403558807569477,3.0441186113917804,3.047832167952347,3.0514878508157377,3.0550859410089233,3.0586265165531032,3.0621101721219404,3.0655370218545404,3.0689078915576817,3.0722234904609094,3.0754842484470153,3.078690748869704,3.0818441364745617,3.0849459301788587,3.087997123855565,3.0909984537483064,3.0939510008545605,3.0968566449505768,3.0997172670786903,3.102534130933681,3.1053084235326094,3.108041888657885,3.110736994130827,3.113395825199052,3.1160200003909058,3.118611263342752,3.121172051596442,3.1237052078589356,3.1262130499840253,3.1286976528485106,3.1311613858114122,3.1336073265374056,3.1360386169858696,3.1384579262491625,3.1408678739536695,3.1432715342349935,3.145672644061899,3.148074730693189,3.1504809513747163,3.1528945982931744,3.1553195420453157,3.157759741316722,3.1602192886857976,3.1627026563699534,3.1652144824845765,3.1677593584498327,3.1703419818826033,3.1729673415528175,3.175640488284853,3.17836663609114,3.181151290282374,3.184000503770985,3.186920539044756,3.1899170085887865,3.1929953337501997,3.196161379054717,3.199421937111991,3.202783834161492,3.206253318378082,3.2098363935568766,3.213539106485225,3.217367788725717,3.221328504456898,3.2254268642400508,3.2296683244100897,3.234057988636474,3.2386003918262456,3.243299338970363,3.2481580525125855,3.253179168611131,3.258364496392377,3.26371438230702,3.2692274346185273,3.274903313650196,3.2807410967398756,3.2867366383536893,3.292883530445608,3.299174738015728,3.3056015535315106,3.3121534624242486,3.3188191561236735 +3.279136136466174,3.2831645475835303,3.287100904993115,3.2909289032238167,3.294648725599805,3.298260424519772,3.3017644915736457,3.3051610230361104,3.3084507793352045,3.311634405033921,3.31471224180613,3.3176847878641307,3.320553134670814,3.3233187481459043,3.325982559869542,3.3285452460870344,3.3310078263122884,3.333372115075696,3.3356399309508955,3.3378124803124307,3.3398908947911465,3.3418768616129277,3.34377279510978,3.3455807260119186,3.3473022103087136,3.3489389302899695,3.3504932743667295,3.3519680483078953,3.353365506659263,3.3546876424035954,3.3559367527786508,3.3571158707802136,3.3582280771511233,3.3592759457989114,3.3602619881484177,3.3611891778535163,3.3620611435948673,3.3628812757995,3.3636525930599683,3.364378234513067,3.365061886967814,3.365707292149053,3.3663183215607257,3.3668992186147157,3.3674543669993224,3.3679880586938458,3.3685046102573493,3.3690086644221044,3.3695050284605808,3.3699986855822104,3.370494825870469,3.370999030029533,3.3715171476224106,3.372054624693846,3.3726168360278788,3.373209564581724,3.3738394000453216,3.3745131613790567,3.375237200912551,3.376017687211379,3.376860979890546,3.3777739751708977,3.378763755168454,3.3798369853510555,3.3810001023495886,3.3822594454426897,3.3836213809311206,3.385092328238988,3.386678172808249,3.388384073306888,3.390214835278408,3.392174914658495,3.3942676716887683,3.3964969657756705,3.3988663014650626,3.4013772631069887,3.4040300584095626,3.4068242109557625,3.409758120035776,3.4128289399126226,3.4160332798464816 +3.5152130320067343,3.519505271847032,3.5236645754880778,3.5276673858127654,3.5315137928949354,3.5352038244595474,3.538737873332999,3.5421160181733065,3.545338955553582,3.5484072667412656,3.5513212082115975,3.5540811953892715,3.55668826524495,3.559143826277765,3.561448748678204,3.563603652832732,3.565609498030385,3.5674680264403733,3.5691809894309774,3.5707495460917955,3.5721747872319014,3.573458349953302,3.5746025940571298,3.575609508293674,3.576480609484808,3.577217544672938,3.5778226775696127,3.5782988192308736,3.5786481990681973,3.578872759425132,3.578974771140147,3.57895730937043,3.5788234972237007,3.578575863910439,3.5782168525406903,3.577749426588638,3.5771772860581463,3.5765038137892082,3.575731923078687,3.5748646408143308,3.57390561854135,3.572858569241299,3.571727246466442,3.570515720270211,3.569228168106062,3.567868661800237,3.566441214210064,3.5649501385253095,3.563399989677736,3.561795477895918,3.560141389918993,3.558442628353821,3.5567043277586636,3.55493160409579,3.553129644095588,3.551303860542539,3.5494600416847715,3.5476042161200407,3.545742258535078,3.5438800046405547,3.5420234821976866,3.540179134262003,3.5383537212340204,3.5365538039959015,3.5347857883239553,3.5330561460477856,3.5313716377055897,3.529739420185347,3.5281663198309494,3.5266585939729875,3.525222482450889,3.5238645387257366,3.5225908945332747,3.5214076338384475,3.520320657998665,3.519335251558241,3.5184561770142357,3.5176876194716544,3.5170331807899102,3.5164957897049653,3.51607804023269 +3.74738581113184,3.7519385267983267,3.756319420669926,3.7604980382469217,3.7644743810222536,3.7682484535730927,3.7718205553959816,3.775190749149541,3.778359672672756,3.7813278491137163,3.7840954551661468,3.7866628294272666,3.7890309617822586,3.7912012150287855,3.7931744029184538,3.794951089908275,3.796532179108369,3.7979193558979962,3.7991143158360376,3.8001181631603456,3.800931934325997,3.801557212329425,3.801996304881442,3.8022511479074192,3.8023232020775426,3.8022140588735853,3.8019260315836574,3.801461885616375,3.8008237944298955,3.8000136372804865,3.7990336257605937,3.797886787091838,3.796576190551423,3.7951042955652157,3.7934734694940135,3.791686605018694,3.7897473313360233,3.7876589445884745,3.7854242642912035,3.7830462169700736,3.7805283468537794,3.777874251519416,3.77508755037245,3.7721721596355877,3.7691320879802808,3.7659712273559527,3.7626933776729996,3.7593026311800344,3.7558033474541803,3.752200032700068,3.7484972228430795,3.7446994773144464,3.7408115786473015,3.736838413363679,3.7327849839531972,3.728656462098344,3.724458259936945,3.720196041035554,3.7158754304839743,3.71150207501266,3.7070818247324864,3.7026209148442373,3.6981259625140797,3.6936034856731985,3.6890598969811097,3.6845017574351253,3.679936034445234,3.6753702377044197,3.670811681827622,3.6662672533733613,3.6617439946814923,3.6572495399660316,3.6527914412570333,3.648377050776648,3.644013674262054,3.6397086088495767,3.6354690880364977,3.6313018637026966,3.627213471230751,3.623210165620848,3.6192980378388713 +3.9745123897680283,3.979320800555536,3.9839205005804392,3.9882744921164583,3.992382692621926,3.9962450847217035,3.9998618793805525,4.003233124085946,4.006359401017505,4.009241178179054,4.011878556444374,4.014271801395983,4.016421858285575,4.018330046697213,4.0199971262063565,4.021423607044032,4.022610338020068,4.023558949970465,4.024271083982462,4.024747790372995,4.024990051852836,4.024999397372704,4.024778080364329,4.024327983200555,4.023650513613271,4.02274721033425,4.021620333891681,4.020272598011353,4.018706123646821,4.016922736718301,4.014924596412705,4.012714680707123,4.010296010149684,4.007670989351303,4.004841929024858,4.001811669341651,3.9985837930776995,3.9951615423559166,3.991547672847885,3.987745046041203,3.9837571486896888,3.9795875248366577,3.975239722643072,3.9707175713957654,3.9660249872511524,3.961165773718115,3.956143635651993,3.9509625538300464,3.9456267731292254,3.9401406748354404,3.934508651146287,3.9287350757656716,3.9228245225721894,3.916781721243113,3.910611530268567,3.904318935189962,3.897909068125005,3.8913872705169568,3.884758935008869,3.8780295259066526,3.87120468460185,3.8642903382479488,3.8572927370099537,3.8502181324335334,3.843072751772794,3.835862988923326,3.828595599759577,3.8212778099810722,3.8139167908260587,3.806519495005242,3.799093083266648,3.791645276227677,3.7841838980830973,3.7767165865569736,3.769251022178058,3.7617951550190556,3.754357112713569,3.746944682444691,3.739565680637451,3.7322279143303656,3.7249391497531152 +4.195509315890845,4.200567286558889,4.205381653836823,4.209909230876402,4.214149855646921,4.2181034900146575,4.2217702612079755,4.225150202371351,4.2282438430840426,4.231051599188463,4.233573499747603,4.2358097411906215,4.237761226590983,4.239429234794191,4.2408144736694915,4.241917401282546,4.242738814343543,4.243280291679535,4.243543421781479,4.2435292024025495,4.243238563563509,4.2426729809675425,4.2418346531307956,4.24072540888084,4.239346605382002,4.237699730614971,4.235786990875006,4.233611043724873,4.231173959646619,4.228477517689426,4.2255238287152315,4.22231581874499,4.2188564606308745,4.215148113896547,4.211193045596388,4.206994054020732,4.202554687161441,4.197878152673401,4.192967163982479,4.187824542736901,4.182453749240373,4.176858311184631,4.1710417488057185,4.165007854744671,4.158760510352024,4.152303496672028,4.145640507812421,4.138775497032018,4.131712661757426,4.124456327745696,4.1170108356953685,4.109380509110876,4.1015698471834385,4.093583499161135,4.085426233074058,4.077102923524628,4.068618550136575,4.0599782395964805,4.051187222516626,4.042250834248533,4.033174546930324,4.0239640045406455,4.01462505798516,4.00516363946753,3.995585740959433,3.985897500182475,3.9761052890723567,3.966215765327025,3.956235650692703,3.946171661829399,3.9360306968634333,3.92582000550551,3.9155470025386556,3.9052190346935527,3.8948435417397365,3.8844282617608528,3.873981178483411,3.863510090618589,3.853022958290794,3.8425278854282645,3.8320330151794986 +4.409351768049737,4.4146518820983065,4.419675496165399,4.42437358832907,4.428745921610071,4.4327924382987405,4.436513186661152,4.43990818631328,4.4429779172036215,4.445722745982267,4.448142634042226,4.45023771264329,4.4520088450528945,4.453457271621389,4.4545836516527375,4.455388394397641,4.455872247749683,4.456036741677119,4.455883415537148,4.455413218073821,4.454627030264165,4.4535262784226015,4.45211311077069,4.450389306643144,4.448356175314058,4.446015156800132,4.443368407634177,4.440418534747446,4.437167560970569,4.433617219568997,4.429769574966166,4.425627505125437,4.421193937248785,4.416471186278587,4.411461475406371,4.406167560363272,4.400592951089089,4.394740817034347,4.3886138284820975,4.382214765315706,4.375547054203622,4.368614195109709,4.361419673391152,4.353967241466376,4.3462607413838965,4.338303922047138,4.330100452509798,4.321654250311391,4.3129694639667475,4.304050364841256,4.294901241693293,4.285526367351829,4.275930174212499,4.266117238284261,4.256092246340694,4.245859978667455,4.235425295785705,4.224793165348217,4.213968685073117,4.202957072704578,4.1917636553304884,4.180393861105891,4.16885324768912,4.157147497127455,4.145282399834998,4.133263873047213,4.121097980382406,4.108790946410361,4.096349124308784,4.0837789857498334,4.071087155706395,4.0582804631123635,4.045365921466257,4.032350562122259,4.019241534736068,4.006046268059586,3.992772443470737,3.979427687315782,3.96601983956493,3.9525569498918824,3.939047155737406 +4.615073553147262,4.620607186099383,4.625833418207076,4.630697746468614,4.635199863497272,4.639339693191069,4.643117209630554,4.646532419719543,4.649585756753555,4.652277541164436,4.654607670813166,4.65657621577302,4.658184001890592,4.6594322332912315,4.660321523831306,4.6608522372396495,4.661025075834661,4.6608415238773935,4.6603030750075956,4.659410632389721,4.658165031444522,4.656567652807718,4.654620598828365,4.652325603162623,4.649683929683292,4.646696973003497,4.643366843981323,4.639696103831259,4.63568673013428,4.631340411184876,4.626659166401517,4.621645828668323,4.616303280585643,4.610633792467979,4.6046395429683145,4.598323243715055,4.591688361789027,4.584738023493319,4.577474854500107,4.5699015903559745,4.562021615508176,4.553838389171275,4.545355353676408,4.536576216625671,4.527504775251489,4.518144735440817,4.508499725324193,4.498573617624605,4.488370510727838,4.477894623482699,4.467150192802591,4.456141440408322,4.444872741196404,4.433348608759898,4.421573662999948,4.409552612485786,4.397290238438539,4.384791414419299,4.3720611469598,4.359104563046172,4.345926887440954,4.33253342175005,4.318929565430419,4.305120852221738,4.291112939080796,4.2769115984573505,4.26252271099624,4.247952264619489,4.233206392779312,4.2182913869362055,4.203213672735002,4.187979810657655,4.17259653961478,4.157070662799955,4.141409109348686,4.125619050427585,4.109707881865742,4.093683040242601,4.077552170079771,4.061323126738992,4.045003877382206 +4.811767094367434,4.817524487036785,4.822945573415884,4.82797072336265,4.832599563625538,4.836832000897019,4.840667939855841,4.844107375514247,4.847150697518924,4.849798183064049,4.852049670583909,4.85390517291869,4.855365480906571,4.8564317647868025,4.857104595916806,4.857384295465076,4.857271523141104,4.856767720501526,4.855874338485047,4.854592237549115,4.8529222103880425,4.850865594891761,4.8484244506290395,4.8456004683684055,4.842394868987422,4.838809004051951,4.834844941338376,4.830505198753248,4.825791710723183,4.820706122534992,4.815250410404472,4.809427363378754,4.803239820054949,4.796690007846434,4.789780062809306,4.782512653150656,4.774891201339378,4.766918790281821,4.758598003834766,4.749931535847686,4.740922727759475,4.73157499528622,4.721891739445711,4.711876628281563,4.701533420126969,4.690865781624016,4.679877303306934,4.668571821236726,4.656953395127763,4.645026205547539,4.632794454255993,4.620262334879984,4.60743419497714,4.594314509505321,4.580907855222003,4.567218902185136,4.553252405339431,4.539013212319102,4.52450628902524,4.509736712799924,4.494709657693189,4.479430380481111,4.463904230289434,4.448136679146492,4.432133317550362,4.415899843587439,4.39944205207756,4.382765829349833,4.365877195578475,4.348782320086397,4.331487489598422,4.313999094116106,4.296323673444683,4.278467862657898,4.2604384186256015,4.242242277980548,4.223886547297808,4.205378437530465,4.186725326253795,4.16793476240132,4.1490144128026065 +4.998583421333205,5.004553753079981,5.0101608681936165,5.015340363275406,5.020091803751708,5.024415080296105,5.028310032969688,5.031776645712905,5.034815267528638,5.037426135351597,5.039609032287844,5.041363917890414,5.042691550396217,5.0435930684857695,5.044069003946136,5.04411963832204,5.043745591651463,5.042948265728192,5.041729071734515,5.040088830353087,5.038028294480997,5.035548762202791,5.032652253272952,5.029340418500576,5.025614438636824,5.021475625065321,5.016926005396232,5.011968057142443,5.006603674371039,5.000834462080409,4.994662356003798,4.988090104073762,4.9811205034656885,4.973755741289295,4.965997913574465,4.9578496475397404,4.949314323089743,4.940394981872456,4.931094168516501,4.921414537676888,4.911359389637794,4.900932098023125,4.890136024640402,4.878974800624189,4.867452148059626,4.855571696449079,4.843337000189168,4.830751861346572,4.817820305297703,4.804546479410916,4.790934555163144,4.776988702742217,4.762713249006778,4.748112638345798,4.733191413768782,4.7179542177361,4.702405792285911,4.686550977132923,4.670394714238779,4.653942047537956,4.637198120138914,4.620168171478326,4.602857537679991,4.585271662515139,4.567416098098823,4.549296499310798,4.530918618059695,4.512288298785475,4.493411501486423,4.4742943121967285,4.4549429227216795,4.435363617806152,4.415562803133991,4.395546995928531,4.37532282751212,4.354897055083999,4.334276557281497,4.313468349293646,4.292479571014504,4.271317491186722,4.249989494379218 +5.174732160727835,5.180903622708599,5.186686952506652,5.192013327295526,5.19688225572222,5.201293613627981,5.205247181240746,5.2087429322482395,5.2117811780154195,5.214362118193631,5.2164854846529565,5.218151187598436,5.219359955068341,5.2201128965022185,5.220410507026522,5.220253031474429,5.219641053122496,5.218575936889505,5.217059057080765,5.215091197579823,5.212673074491417,5.209805949032212,5.206491803984637,5.202732253229696,5.198528440653562,5.193881640752359,5.188793844137117,5.1832674912303105,5.177304439144936,5.170906256009326,5.1640748406149175,5.15681290374636,5.149123205452326,5.141007896004062,5.132469034679701,5.123509211777622,5.114131770091559,5.1043397144610605,5.094135553004345,5.083521903928565,5.0725020309081845,5.061079270934013,5.049256949670364,5.037038662537341,5.024428096119548,5.011428844438714,4.998044426911214,4.984278610855913,4.970135386425396,4.955618865908516,4.940733186549184,4.925482486202744,4.909871059591844,4.893903315828597,4.87758376136939,4.860917003364526,4.843907751940126,4.826560815048263,4.808881098144,4.790873605589687,4.772543440478265,4.753895804146517,4.73493599325144,4.715669406910857,4.696101549065097,4.676238023124912,4.656084526385289,4.635646845245477,4.614930874491818,4.593942626282128,4.572688211945636,4.551173827518701,4.52940577606647,4.507390477754955,4.485134461568931,4.462644357655836,4.439926897009238,4.416988952924326,4.39383750601778,4.370479647599395,4.346922582201131 +5.339481524759377,5.34584139316859,5.351790208341798,5.357255081800982,5.3622354699565165,5.36673123500397,5.370742102123307,5.374268035569405,5.377309312076515,5.379866096992224,5.381938075048823,5.383525111049468,5.384627905243409,5.3852475401592175,5.385384477191901,5.385038927399424,5.38421144023438,5.382903346678769,5.381115987101975,5.378850111539112,5.376106402257682,5.372886086559349,5.36919111321438,5.365023062143984,5.360383043333125,5.355272297360355,5.349692780832249,5.3436469001170135,5.3371364783188575,5.330163049571892,5.32272847863865,5.314835442194979,5.306486666154499,5.297684266707697,5.28843026905287,5.2787272293375755,5.268578456062475,5.257986919825799,5.246955094648832,5.235485564616915,5.223581559086196,5.211246380621956,5.198483320650099,5.185295940484727,5.171687892611537,5.157662736834772,5.143223958214947,5.128375290029127,5.113120688816407,5.097464233459224,5.081410027770423,5.064962176245326,5.0481249407571696,5.0309026975160105,5.0132999202086985,4.995321183695546,4.976971166858452,4.958254647701644,4.939176500133477,4.919741695903721,4.899955306228443,4.879822503115831,4.859348556343044,4.838538834990242,4.817398809611171,4.795934049810164,4.774150221646384,4.75205308461798,4.729648501409315,4.7069424434069775,4.683940980276651,4.660650270701853,4.6370765746078595,4.613226265057946,4.589105820079605,4.564721812298384,4.540080909752902,4.515189911894358,4.490055718795846,4.464685333187558,4.4390858674142155 +5.492158307785596,5.498693017089647,5.504795746311915,5.510389895047848,5.515474872013892,5.5200505269465925,5.524116534763551,5.5276728511067725,5.530719721088023,5.53325727873154,5.535285165730218,5.536803205431894,5.537812072708054,5.538312825508803,5.538305894427567,5.537791459683049,5.5367700398418265,5.535242934890441,5.533211454205306,5.530676316919837,5.527638174413503,5.524098223022606,5.520058380460659,5.51552019564985,5.510484747633333,5.504953246035822,5.49892761643795,5.492410234158767,5.485402891249766,5.4779070907691345,5.469924666392095,5.46145826370599,5.452510577489472,5.443083692704282,5.433179603268816,5.422800834050593,5.411950662187994,5.4006320268007535,5.388847370438852,5.376599245641548,5.363890850054737,5.350725454413315,5.337106318234245,5.323036970804864,5.308521032454199,5.293562030674391,5.278163417728282,5.26232889433031,5.246062385285122,5.229367937903735,5.212249623860317,5.194711514410874,5.176757838691263,5.158392942020436,5.139621268124316,5.120447361717338,5.100875870746412,5.08091154381088,5.06055922617717,5.039823861373196,5.01871049354451,4.997224269684519,4.975370438444112,4.953154346689881,4.930581440415874,4.907657265976776,4.884387471275191,4.860777805217518,4.836834117232698,4.812562359104087,4.787968583498669,4.763058942448704,4.737839689660897,4.712317183445854,4.6864978850021775,4.660388355833715,4.63399525767217,4.607325365894267,4.580385557778737,4.553182813227877,4.525724218586125 +5.632147882407264,5.638843098575324,5.645087401745068,5.650800833261112,5.655982758688597,5.6606330164916905,5.664751236111604,5.668337365397552,5.6713916208480155,5.6739141081450635,5.675904430040694,5.677362372374366,5.678288587052865,5.6786841097836795,5.678549343287961,5.677884439877926,5.676689890170479,5.6749669661028666,5.672716949002252,5.669940530028103,5.666638332594917,5.662811525005713,5.658461996852757,5.653591268982554,5.648200392417273,5.642290548745015,5.635863635426439,5.628921999609383,5.621467405234172,5.613501327275154,5.605025571286511,5.596042754644355,5.586555543903205,5.5765659958686475,5.566076076311203,5.555088281883978,5.54360586140178,5.531631725710833,5.519168289184005,5.506218076168215,5.492784255993453,5.478870071027497,5.464478752515721,5.4496138015294155,5.434278810185851,5.418477277718649,5.402212628077988,5.385488533808874,5.368308891741964,5.350677721313683,5.332599066322213,5.314076970180983,5.295115634445218,5.275719376932074,5.255892613994376,5.235639863210812,5.214965745839268,5.193874984430531,5.172372397736033,5.150462902495787,5.128151516503394,5.1054433615700745,5.082343662540675,5.058857741363134,5.034991017782641,5.01074901201119,4.986137347387621,4.96116175073079,4.935828047341365,4.910142161194983,4.884110117234729,4.857738042692599,4.831032164793685,4.803998812482956,4.776644415924537,4.74897550463217,4.720998707429295,4.692720759465298,4.6641484956932135,4.63528885097291,4.606148863996769 +5.758894168935592,5.76573486264412,5.772107704114742,5.777929730072219,5.783200267472944,5.787919144695343,5.792085950490517,5.795700625735024,5.798763361323977,5.801274237579054,5.803232822410058,5.804638868095411,5.80549300599126,5.805796251899242,5.805548983599469,5.804751328433326,5.8034037520070845,5.801507501155503,5.799063832103167,5.796073410976466,5.792536836165089,5.788455250884063,5.783830519555429,5.77866413789896,5.772957131863447,5.766710657949287,5.7599265884497495,5.752607245297722,5.744754367281863,5.736369404255278,5.727454136616115,5.718011156500426,5.708043105218473,5.697552014389252,5.6865398246040195,5.675009007284987,5.6629627859424785,5.6504040461478215,5.637335177044723,5.623758677738558,5.609677692253717,5.595095437641842,5.580015119834963,5.564440214567206,5.548374288608423,5.531820815847809,5.514783194873928,5.497265072874151,5.479270321364179,5.4608029344758275,5.441866930676436,5.422466327990078,5.402605302631555,5.382288147241096,5.361519253088987,5.34030311267771,5.318644322143981,5.296547579060811,5.2740176773441005,5.2510595090059,5.227678067246343,5.203878449470203,5.179665856583161,5.15504558655946,5.130023034951941,5.104603697981041,5.078793175631327,5.052597172311297,5.026021490587818,4.999072030888613,4.971754794937675,4.9440758881632805,4.91604151617126,4.887657984638901,4.85893169999996,4.829869169214458,4.800476999413262,4.770761900214366,4.740730681137098,4.71039025152135,4.679747623152912 +5.871899650882129,5.878870170731086,5.88535789254314,5.891277202012279,5.896627392028618,5.9014082820714595,5.905619424988336,5.90926075550334,5.912332441918822,5.914834542178389,5.916766593448489,5.918128318394169,5.918920330236102,5.919143627208373,5.9187985650821995,5.917885249164413,5.916404122990708,5.914356411242103,5.911743347989244,5.908565577267525,5.90482367538311,5.900518763410146,5.895652683554479,5.890226909360123,5.884242444650615,5.877700423788162,5.870602696853463,5.8629515635232785,5.854748740393962,5.845995655158257,5.836694066021837,5.826846542850569,5.816455704686985,5.8055235609335805,5.794052029972612,5.782043560976666,5.769501355159245,5.756428275812771,5.742826689814091,5.728699073992947,5.714048550077015,5.6988783128397165,5.683191545879153,5.6669917025230845,5.65028232711818,5.633066871168897,5.615348710897684,5.597131471033088,5.578419000553712,5.559215271002003,5.539524278227507,5.51935001754955,5.498696642372087,5.477568422672067,5.455969727090842,5.433905025362922,5.4113788905268025,5.388395996834986,5.364961115342316,5.341079115498213,5.316754967833965,5.291993746592317,5.266800629254769,5.241180890991165,5.215139905065267,5.18868314558002,5.161816190230148,5.1345447208110695,5.106874518057094,5.078811461690542,5.050361533056727,5.021530817212745,4.992325500577575,4.962751869203481,4.932816310243209,4.902525313385527,4.871885470077385,4.840903473509267,4.809586118068446,4.777940299385429,4.74597301518261 +5.970725368461157,5.977809514184574,5.98439790929551,5.990402642007766,5.995822975687562,6.000658722101672,6.004909402980811,6.008574947716843,6.011655505030546,6.014151113470257,6.016061283558017,6.017385712293437,6.018124997177844,6.018280121217395,6.017851421107408,6.016838983057118,6.0152432314726925,6.013065371831919,6.0103066190020575,6.006967597870891,6.003048865603586,5.9985515240825045,5.993477396255239,5.9878279364429545,5.981604129290257,5.97480708996892,5.967438649304051,5.959501087678191,5.950996102447803,5.941925102092586,5.932289825576764,5.922092823455914,5.91133669546222,5.900023431735021,5.88815493140024,5.875733624335101,5.862762692408144,5.849244979587045,5.835182833445876,5.82057871150319,5.805435716143557,5.789757022804999,5.773545795720066,5.756805468802841,5.739539566974174,5.721751522336444,5.703444691720913,5.684622680408647,5.66528931788606,5.645448556172888,5.625104371577986,5.604260739827647,5.582921794674067,5.561091786533471,5.538775064510244,5.515976078723255,5.492699382406201,5.468949629891619,5.444731572589066,5.420050060483531,5.3949100445933444,5.369316579380838,5.34327482241967,5.316790029350598,5.289867554226159,5.262512852063155,5.234731481402531,5.206529104739731,5.177911484010845,5.148884480844357,5.119454058736355,5.089626284971746,5.059407328969885,5.028803459532442,4.997821046815745,4.96646656482266,4.934746590391061,4.902667801623074,4.870236978730736,4.8374610041542025,4.804346862252133 +6.054990892309186,6.062171987960312,6.068846373458553,6.074924193054724,6.08040468513346,6.0852876549355805,6.089572597861914,6.0932594387923755,6.096348309877871,6.098839233254681,6.100731696899468,6.102025376094573,6.102720855038943,6.102819103851601,6.102320443085623,6.101224942790037,6.0995330111832695,6.097245837491829,6.09436462033158,6.090889968386968,6.086822422625521,6.082163068688218,6.076913713224238,6.071075794286422,6.064650280288112,6.057638270159854,6.050041578430062,6.041862469151194,6.033102623394494,6.0237634333763115,6.013846621773028,6.003354722792798,5.992290319818323,5.9806553866826535,5.9684518062117915,5.955681991946158,5.942349109366966,5.928455986077347,5.914004953317839,5.898998452265974,5.883439568924632,5.867331462348183,5.850677280380932,5.833480440525525,5.8157444512847984,5.797472728353374,5.778668612160909,5.759335691565452,5.739477779614464,5.7190988118789905,5.698202748214973,5.6767935478849365,5.654875328163035,5.632452323009045,5.6095288650774995,5.5861093880205095,5.56219842856414,5.537800624517414,5.512920710837453,5.48756352110624,5.461733989939065,5.43543715534837,5.4086781584492245,5.381462238532358,5.353794733394812,5.325681081851452,5.297126826254068,5.268137612914368,5.238719187749656,5.208877396578275,5.178618187197131,5.147947611287812,5.11687182292952,5.085397075505846,5.053529723857979,5.021276227133847,4.98864314773974,4.955637149082716,4.9222649970634285,4.888533560204068,4.854449808888537 +6.12437432937036,6.131635296512254,6.138380586834161,6.1445187541124335,6.15004901629234,6.154971173275318,6.159284698919381,6.162989514412806,6.166085738348761,6.168573379435024,6.170451907201967,6.1717209791630205,6.172381168632415,6.172433435183821,6.171878086162276,6.170715178394318,6.168945106853015,6.166569047466736,6.163588185553098,6.160003116538194,6.155814368135927,6.1510230126973156,6.145630843534211,6.13963928538704,6.133049293387422,6.125861953175871,6.118079065944705,6.109702882382342,6.1007350702333945,6.091177008405885,6.081030406247355,6.070297784586935,6.058981713426627,6.047084153256774,6.034606973566703,6.02155257452835,6.007924108210933,5.993724388827344,5.978955734256843,5.963620572310161,5.947721975587778,5.931263089739585,5.914247049206951,5.896677258075057,5.878557211426009,5.859890311542145,5.840679885452209,5.820929508596896,5.800642980584674,5.779824223539854,5.758477183878317,5.736605807438433,5.714214198055715,5.691306576216279,5.667887261081511,5.643960672809095,5.619531334640987,5.594603870880807,5.569183002960372,5.543273550923112,5.516880435828042,5.490008682104975,5.4626634172173985,5.434849866826328,5.406573355151897,5.377839307413851,5.348653252276968,5.319020822233919,5.288947749467907,5.2584398662188825,5.227503106686222,5.196143508782262,5.164367212840795,5.132180458719142,5.0995895878200255,5.066601045784187,5.033221381514396,4.9994572452714,4.965315389924918,4.9308026710992,4.895926046415914 +6.178612328009123,6.185935758910088,6.192736539059795,6.198921985224274,6.204491299451588,6.209444277490338,6.2137803764429025,6.217499514626263,6.2206018000883185,6.22308723109218,6.224955262821059,6.226205538967971,6.226838624380668,6.226855470430053,6.226256374187772,6.2250413821959,6.223210879125031,6.220766030559514,6.217708011472859,6.214037406978448,6.209754734481191,6.204861055994505,6.199358154455357,6.193247444248874,6.186529870175512,6.1792065075380815,6.171279147154912,6.16275002931839,6.153620811406562,6.1438928619753375,6.13356788000394,6.122648375913487,6.111136909296632,6.099035430264826,6.086345797933446,6.073070402075102,6.059212384324936,6.044774548479689,6.029759202026285,6.0141687623789455,5.998006291712941,5.981274925251037,5.963977787010473,5.946118270642443,5.92769986079313,5.90872594931539,5.889199852818969,5.869125136313471,5.848505588957529,5.827345122419915,5.8056476726690445,5.783417175115578,5.7606577231561005,5.737373526794965,5.713568894689524,5.689248236496927,5.664416064981364,5.639076993951778,5.613235734302397,5.586897095509705,5.560065988047533,5.532747425748434,5.504946525412207,5.47666850202425,5.44791866915252,5.418702441329702,5.389025336437543,5.358892976049682,5.328311081466072,5.297285474141204,5.265822077435377,5.23392691821519,5.201606125715248,5.168865928942713,5.135712658509895,5.10215274905788,5.068192738359026,5.033839266017404,4.999099074240095,4.963979007999113,4.928486014426036 +6.217500063822873,6.224868294637783,6.23170889339763,6.237928293303056,6.243525685047016,6.248500861411807,6.252853267531437,6.256582819671946,6.25968961834871,6.262173654364204,6.264034372653648,6.265271407038249,6.2658853163179575,6.2658770460041096,6.265246885829964,6.2639948749913845,6.262121390799772,6.259627591450338,6.256514644527387,6.252783127777743,6.248433551242437,6.243466969550383,6.237885158227143,6.231689524260602,6.224881005071436,6.217460668577961,6.209430298187836,6.200792126766951,6.191547804288058,6.1816986919121355,6.171246481211858,6.160193675173457,6.148542825953705,6.136295876249147,6.123454677763456,6.110021612839763,6.095999815659309,6.08139208257658,6.066200713652054,6.050428118870161,6.034077352956372,6.017151543682386,5.999653807614234,5.981587530942709,5.962956190851202,5.943763171734369,5.924011782748467,5.903705581440313,5.882848349495924,5.861443991107162,5.839496434766802,5.817009608413468,5.7939875979649385,5.770434605937677,5.746354933495336,5.721752982798663,5.696633259114109,5.671000368744589,5.64485901507542,5.61821400007175,5.591070226689598,5.563432701232262,5.535306532950381,5.506696929291172,5.477609196302464,5.448048740993828,5.4180210736990615,5.387531808401047,5.356586658843724,5.325191438995556,5.29335206472898,5.261074555363347,5.2283650326149615,5.195229718046183,5.161674934863244,5.127707110305018,5.093332774744829,5.058558560590787,5.023391202887334,4.987837539488848,4.951904510476935 +6.240891223220927,6.248286407156036,6.255150970285742,6.261390815677118,6.267005127210075,6.271993695887126,6.276355959661244,6.2800918335678935,6.283201413602864,6.285684686092192,6.287541089822292,6.288770252691259,6.289372729870238,6.289349463354649,6.288700738474621,6.287426590018223,6.285527390881232,6.283004294825159,6.279858465000568,6.27609047473421,6.271700829648659,6.266690579941927,6.261061496692431,6.254814982449461,6.247951970205636,6.2404735234483715,6.232381421138624,6.223677891686031,6.21436458061987,6.204442844663867,6.193914370946445,6.182781657992497,6.171047253496819,6.1587130957065686,6.145781031877932,6.132253439895827,6.118133449468446,6.103423852484265,6.088126944547478,6.072245131184191,6.055781462649196,6.038739062242489,6.0211210420588275,6.002930783812694,5.98417176020979,5.964847351169471,5.944960861375031,5.924515843895784,5.903516075935861,5.881965457203365,5.859867911707917,5.83722736290717,5.814047892235844,5.790333697722747,5.766089076041438,5.7413184248625875,5.716026244964905,5.690217138163243,5.663895803347811,5.637067037983548,5.60973574052503,5.581906912776504,5.5535856594893795,5.524777183604798,5.4954867866590265,5.465719871146651,5.435481942884969,5.404778611334214,5.373615585711001,5.341998675460344,5.309933791924567,5.277426949874713,5.244484266473148,5.211111958747057,5.1773163453706585,5.143103849028511,5.108480995508423,5.073454412726503,5.038030831208947,5.002217084268895,4.966020107469362 +6.248698025168768,6.256102205668344,6.2629747691189985,6.269221441877786,6.274841405553606,6.279834450555718,6.284200012443411,6.2879380058419585,6.291048525240611,6.293531555473251,6.295386533276694,6.296613084574661,6.297211763328674,6.297183510362156,6.296528609537508,6.295247094173529,6.293339335694104,6.290806486382809,6.2876497079122595,6.283869572135829,6.279466583203254,6.274441789835547,6.268796961628697,6.262533499652424,6.255652335423298,6.248154530951733,6.240041863716409,6.231316560641503,6.221980265775066,6.2120343343616575,6.201480452048202,6.190321115872413,6.178558872041654,6.166195657319771,6.153233317480231,6.139674228921662,6.125521519860936,6.1107779806975415,6.09544590555008,6.079527698458347,6.063026408186453,6.045945156543108,6.0282870541324,6.01005548117691,5.991253908890022,5.9718857156991945,5.951954204795997,5.9314629277576065,5.910415660296269,5.888816300628312,5.866668771271497,5.843976994191983,5.820745049334383,5.796977133237676,5.772677541086308,5.747850669063332,5.722501016463074,5.696633183620805,5.6702518679412055,5.6433618653996085,5.615968072963715,5.588075490960799,5.559689222678239,5.530814469579129,5.501456531704539,5.471620810052562,5.441312808958915,5.410538136423044,5.379302500175123,5.347611708136548,5.315471670121076,5.28288839938945,5.249868011572831,5.216416722140739,5.182540848190233,5.14824681080734,5.1135411341483845,5.0784304444766315,5.042921470618004,5.00702104413442,4.970736098819935 +6.240891223220926,6.248286407156036,6.255150970285742,6.261390815677118,6.267005127210074,6.271993695887126,6.276355959661244,6.2800918335678935,6.283201413602863,6.285684686092192,6.287541089822292,6.288770252691259,6.289372729870238,6.28934946335465,6.288700738474621,6.287426590018224,6.285527390881232,6.283004294825159,6.279858465000569,6.27609047473421,6.27170082964866,6.266690579941928,6.261061496692431,6.254814982449462,6.247951970205636,6.2404735234483715,6.232381421138624,6.223677891686031,6.21436458061987,6.204442844663866,6.193914370946445,6.182781657992497,6.171047253496818,6.158713095706568,6.145781031877931,6.132253439895827,6.118133449468446,6.103423852484264,6.0881269445474775,6.072245131184191,6.055781462649196,6.038739062242488,6.021121042058827,6.002930783812693,5.984171760209789,5.96484735116947,5.94496086137503,5.924515843895783,5.903516075935861,5.881965457203364,5.859867911707916,5.837227362907169,5.814047892235843,5.790333697722746,5.766089076041437,5.741318424862587,5.716026244964904,5.690217138163243,5.66389580334781,5.637067037983547,5.60973574052503,5.581906912776503,5.5535856594893795,5.524777183604797,5.495486786659026,5.465719871146651,5.435481942884969,5.404778611334214,5.373615585711,5.341998675460344,5.309933791924566,5.277426949874712,5.244484266473148,5.211111958747056,5.1773163453706585,5.14310384902851,5.1084809955084225,5.073454412726502,5.038030831208947,5.002217084268894,4.966020107469362 +6.217500063822873,6.224868294637783,6.231708893397629,6.237928293303055,6.2435256850470155,6.248500861411806,6.252853267531437,6.256582819671945,6.25968961834871,6.262173654364205,6.264034372653648,6.26527140703825,6.2658853163179575,6.2658770460041096,6.265246885829965,6.263994874991385,6.262121390799773,6.259627591450338,6.256514644527387,6.252783127777744,6.248433551242437,6.243466969550384,6.237885158227144,6.231689524260602,6.2248810050714365,6.21746066857796,6.209430298187836,6.200792126766951,6.191547804288058,6.181698691912135,6.171246481211857,6.160193675173456,6.1485428259537045,6.136295876249147,6.123454677763455,6.110021612839762,6.095999815659308,6.0813920825765795,6.066200713652052,6.05042811887016,6.03407735295637,6.017151543682385,5.999653807614233,5.981587530942707,5.9629561908512,5.943763171734367,5.924011782748465,5.903705581440311,5.882848349495922,5.86144399110716,5.839496434766801,5.817009608413467,5.793987597964938,5.770434605937676,5.7463549334953345,5.721752982798662,5.696633259114107,5.671000368744587,5.6448590150754185,5.618214000071749,5.591070226689597,5.563432701232261,5.535306532950379,5.506696929291172,5.477609196302463,5.448048740993827,5.4180210736990615,5.387531808401046,5.356586658843723,5.325191438995554,5.293352064728978,5.261074555363345,5.228365032614961,5.195229718046181,5.161674934863243,5.127707110305017,5.093332774744828,5.058558560590785,5.023391202887333,4.987837539488846,4.951904510476934 +6.178612328009122,6.185935758910087,6.192736539059795,6.198921985224274,6.204491299451588,6.209444277490338,6.213780376442902,6.217499514626263,6.2206018000883185,6.2230872310921805,6.224955262821059,6.226205538967971,6.226838624380669,6.226855470430054,6.226256374187773,6.225041382195901,6.223210879125032,6.220766030559515,6.217708011472859,6.2140374069784485,6.209754734481191,6.204861055994506,6.199358154455358,6.1932474442488745,6.186529870175513,6.1792065075380815,6.171279147154912,6.1627500293183894,6.153620811406561,6.143892861975336,6.133567880003939,6.122648375913486,6.111136909296631,6.099035430264825,6.086345797933445,6.073070402075101,6.059212384324935,6.044774548479688,6.029759202026283,6.014168762378943,5.998006291712939,5.981274925251034,5.963977787010471,5.946118270642441,5.927699860793127,5.9087259493153885,5.889199852818967,5.869125136313469,5.8485055889575275,5.8273451224199135,5.805647672669043,5.783417175115576,5.760657723156099,5.737373526794963,5.713568894689522,5.689248236496925,5.664416064981363,5.639076993951776,5.613235734302395,5.586897095509703,5.560065988047532,5.532747425748433,5.504946525412205,5.476668502024249,5.447918669152518,5.418702441329701,5.389025336437542,5.358892976049681,5.328311081466071,5.297285474141202,5.2658220774353754,5.233926918215189,5.201606125715246,5.1688659289427115,5.135712658509894,5.102152749057878,5.068192738359024,5.033839266017402,4.999099074240093,4.963979007999111,4.928486014426034 +6.12437432937036,6.131635296512253,6.138380586834161,6.1445187541124335,6.15004901629234,6.154971173275318,6.159284698919381,6.162989514412806,6.166085738348761,6.168573379435025,6.170451907201967,6.171720979163021,6.172381168632416,6.172433435183822,6.171878086162276,6.170715178394319,6.168945106853016,6.166569047466736,6.163588185553098,6.160003116538194,6.155814368135927,6.1510230126973156,6.145630843534211,6.13963928538704,6.133049293387422,6.125861953175871,6.118079065944704,6.109702882382341,6.100735070233393,6.091177008405884,6.081030406247353,6.070297784586933,6.058981713426626,6.047084153256773,6.034606973566701,6.021552574528348,6.007924108210932,5.993724388827343,5.978955734256841,5.963620572310158,5.947721975587776,5.931263089739583,5.914247049206948,5.896677258075055,5.878557211426006,5.859890311542142,5.840679885452207,5.820929508596894,5.800642980584672,5.779824223539852,5.758477183878315,5.736605807438432,5.714214198055713,5.691306576216277,5.66788726108151,5.643960672809093,5.619531334640985,5.594603870880805,5.5691830029603695,5.54327355092311,5.51688043582804,5.490008682104972,5.462663417217396,5.434849866826326,5.406573355151894,5.377839307413849,5.348653252276966,5.3190208222339175,5.288947749467904,5.258439866218881,5.227503106686219,5.19614350878226,5.164367212840793,5.132180458719139,5.099589587820024,5.066601045784184,5.0332213815143945,4.999457245271398,4.965315389924915,4.9308026710991975,4.895926046415911 +6.054990892309187,6.062171987960313,6.068846373458554,6.074924193054725,6.080404685133461,6.085287654935582,6.089572597861915,6.093259438792377,6.096348309877873,6.098839233254683,6.1007316968994685,6.102025376094574,6.102720855038945,6.102819103851602,6.102320443085624,6.101224942790038,6.0995330111832695,6.097245837491829,6.09436462033158,6.090889968386968,6.086822422625521,6.082163068688218,6.076913713224238,6.071075794286421,6.064650280288112,6.057638270159854,6.050041578430062,6.0418624691511935,6.033102623394493,6.023763433376311,6.013846621773027,6.003354722792797,5.992290319818322,5.980655386682653,5.968451806211791,5.955681991946157,5.942349109366965,5.9284559860773465,5.914004953317837,5.898998452265973,5.88343956892463,5.867331462348183,5.850677280380931,5.833480440525523,5.815744451284798,5.797472728353373,5.778668612160909,5.759335691565451,5.739477779614462,5.719098811878989,5.698202748214971,5.676793547884936,5.654875328163033,5.632452323009044,5.609528865077498,5.586109388020509,5.562198428564138,5.537800624517412,5.512920710837451,5.487563521106237,5.461733989939063,5.435437155348367,5.408678158449223,5.381462238532356,5.35379473339481,5.3256810818514495,5.2971268262540665,5.268137612914367,5.238719187749654,5.208877396578273,5.178618187197128,5.147947611287809,5.116871822929517,5.085397075505845,5.053529723857976,5.0212762271338445,4.9886431477397375,4.955637149082714,4.922264997063426,4.888533560204065,4.854449808888535 +5.97072536846116,5.9778095141845755,5.984397909295513,5.990402642007767,5.995822975687564,6.000658722101675,6.004909402980813,6.008574947716845,6.011655505030548,6.01415111347026,6.016061283558019,6.017385712293438,6.018124997177845,6.018280121217397,6.01785142110741,6.01683898305712,6.0152432314726925,6.01306537183192,6.010306619002058,6.006967597870891,6.003048865603587,5.998551524082504,5.993477396255239,5.987827936442954,5.981604129290257,5.97480708996892,5.967438649304051,5.959501087678191,5.950996102447803,5.941925102092586,5.932289825576764,5.922092823455914,5.91133669546222,5.900023431735021,5.88815493140024,5.875733624335101,5.862762692408144,5.849244979587044,5.835182833445876,5.82057871150319,5.805435716143556,5.7897570228049995,5.773545795720066,5.756805468802841,5.739539566974174,5.721751522336444,5.703444691720914,5.684622680408647,5.665289317886059,5.645448556172887,5.625104371577986,5.604260739827647,5.582921794674066,5.56109178653347,5.538775064510243,5.515976078723253,5.492699382406199,5.468949629891618,5.444731572589064,5.420050060483529,5.394910044593343,5.369316579380836,5.343274822419668,5.316790029350596,5.289867554226157,5.262512852063153,5.234731481402529,5.2065291047397295,5.177911484010843,5.148884480844355,5.119454058736353,5.089626284971744,5.059407328969883,5.0288034595324405,4.997821046815743,4.9664665648226585,4.934746590391058,4.90266780162307,4.870236978730733,4.8374610041542,4.804346862252129 +5.87189965088213,5.878870170731089,5.8853578925431425,5.89127720201228,5.896627392028621,5.901408282071461,5.905619424988338,5.909260755503341,5.912332441918824,5.914834542178391,5.916766593448491,5.918128318394172,5.918920330236105,5.919143627208375,5.9187985650822,5.9178852491644145,5.916404122990708,5.914356411242104,5.911743347989244,5.908565577267525,5.90482367538311,5.900518763410145,5.895652683554478,5.8902269093601225,5.884242444650615,5.877700423788161,5.870602696853463,5.8629515635232785,5.854748740393961,5.845995655158257,5.836694066021837,5.826846542850568,5.816455704686984,5.8055235609335805,5.794052029972611,5.782043560976666,5.769501355159244,5.7564282758127705,5.742826689814091,5.728699073992946,5.714048550077014,5.6988783128397165,5.683191545879152,5.666991702523084,5.6502823271181795,5.6330668711688965,5.615348710897684,5.597131471033088,5.578419000553711,5.559215271002002,5.539524278227506,5.519350017549549,5.498696642372085,5.477568422672066,5.4559697270908405,5.43390502536292,5.411378890526801,5.388395996834984,5.3649611153423145,5.341079115498211,5.316754967833964,5.291993746592314,5.266800629254767,5.241180890991163,5.215139905065264,5.188683145580017,5.161816190230146,5.134544720811068,5.106874518057092,5.078811461690539,5.0503615330567255,5.021530817212743,4.992325500577573,4.962751869203478,4.932816310243206,4.902525313385524,4.871885470077381,4.840903473509264,4.8095861180684425,4.777940299385426,4.7459730151826065 +5.758894168935594,5.7657348626441225,5.7721077041147435,5.777929730072222,5.783200267472947,5.787919144695346,5.792085950490519,5.795700625735026,5.79876336132398,5.801274237579056,5.8032328224100596,5.804638868095413,5.805493005991263,5.805796251899244,5.805548983599471,5.804751328433328,5.803403752007085,5.801507501155504,5.799063832103168,5.796073410976467,5.792536836165091,5.788455250884064,5.78383051955543,5.77866413789896,5.772957131863448,5.766710657949287,5.75992658844975,5.752607245297722,5.744754367281864,5.736369404255278,5.727454136616115,5.718011156500426,5.708043105218474,5.697552014389252,5.6865398246040195,5.675009007284987,5.6629627859424785,5.650404046147821,5.637335177044723,5.623758677738557,5.609677692253716,5.595095437641841,5.580015119834962,5.564440214567205,5.548374288608422,5.531820815847807,5.514783194873926,5.49726507287415,5.479270321364178,5.460802934475826,5.441866930676434,5.422466327990076,5.402605302631552,5.382288147241095,5.361519253088984,5.3403031126777085,5.318644322143979,5.296547579060809,5.274017677344098,5.251059509005898,5.227678067246341,5.203878449470201,5.179665856583158,5.155045586559458,5.13002303495194,5.104603697981038,5.078793175631326,5.052597172311295,5.026021490587816,4.999072030888611,4.971754794937672,4.944075888163278,4.916041516171258,4.887657984638898,4.858931699999958,4.829869169214455,4.800476999413259,4.770761900214363,4.740730681137094,4.710390251521346,4.67974762315291 +5.632147882407265,5.638843098575325,5.6450874017450685,5.650800833261113,5.655982758688598,5.660633016491691,5.664751236111606,5.668337365397553,5.671391620848016,5.673914108145064,5.675904430040695,5.6773623723743665,5.678288587052866,5.67868410978368,5.678549343287962,5.677884439877927,5.67668989017048,5.674966966102867,5.672716949002253,5.6699405300281045,5.666638332594919,5.662811525005714,5.658461996852758,5.653591268982554,5.648200392417275,5.642290548745015,5.63586363542644,5.628921999609383,5.621467405234173,5.613501327275154,5.605025571286511,5.596042754644355,5.586555543903205,5.5765659958686475,5.5660760763112025,5.555088281883977,5.543605861401779,5.531631725710832,5.519168289184004,5.506218076168214,5.492784255993451,5.478870071027495,5.464478752515718,5.449613801529413,5.434278810185848,5.4184772777186465,5.402212628077985,5.3854885338088705,5.36830889174196,5.350677721313679,5.332599066322209,5.31407697018098,5.2951156344452155,5.275719376932071,5.255892613994372,5.235639863210809,5.214965745839265,5.193874984430528,5.172372397736031,5.150462902495784,5.128151516503391,5.105443361570072,5.082343662540673,5.0588577413631315,5.034991017782638,5.010749012011187,4.986137347387619,4.9611617507307875,4.935828047341363,4.91014216119498,4.884110117234726,4.857738042692596,4.831032164793681,4.803998812482952,4.776644415924533,4.748975504632167,4.720998707429292,4.692720759465295,4.664148495693209,4.635288850972906,4.606148863996766 +5.492158307785597,5.498693017089648,5.504795746311916,5.510389895047849,5.515474872013893,5.520050526946593,5.524116534763552,5.527672851106773,5.5307197210880235,5.533257278731541,5.535285165730219,5.5368032054318945,5.537812072708055,5.538312825508804,5.538305894427569,5.53779145968305,5.536770039841828,5.535242934890443,5.533211454205308,5.530676316919839,5.5276381744135055,5.524098223022609,5.520058380460662,5.515520195649851,5.510484747633336,5.504953246035824,5.4989276164379515,5.4924102341587675,5.485402891249768,5.477907090769135,5.469924666392096,5.461458263705991,5.452510577489473,5.443083692704282,5.433179603268816,5.422800834050593,5.411950662187994,5.400632026800753,5.388847370438851,5.376599245641546,5.363890850054735,5.350725454413312,5.337106318234242,5.3230369708048615,5.308521032454196,5.293562030674387,5.278163417728279,5.262328894330307,5.246062385285119,5.2293679379037314,5.2122496238603135,5.19471151441087,5.176757838691261,5.158392942020433,5.139621268124312,5.120447361717336,5.1008758707464095,5.080911543810878,5.060559226177168,5.039823861373194,5.018710493544508,4.9972242696845175,4.97537043844411,4.953154346689879,4.930581440415872,4.907657265976774,4.884387471275189,4.860777805217516,4.836834117232695,4.812562359104083,4.787968583498666,4.7630589424487,4.737839689660894,4.71231718344585,4.686497885002174,4.660388355833711,4.633995257672167,4.607325365894264,4.580385557778732,4.553182813227872,4.525724218586121 +5.339481524759378,5.345841393168591,5.351790208341799,5.357255081800983,5.362235469956517,5.366731235003971,5.370742102123308,5.374268035569406,5.377309312076516,5.379866096992225,5.381938075048824,5.383525111049469,5.38462790524341,5.385247540159218,5.385384477191903,5.385038927399425,5.384211440234383,5.382903346678771,5.381115987101977,5.378850111539115,5.376106402257685,5.372886086559352,5.3691911132143835,5.365023062143986,5.360383043333128,5.355272297360357,5.3496927808322505,5.343646900117015,5.33713647831886,5.330163049571894,5.322728478638652,5.314835442194981,5.3064866661545,5.297684266707698,5.288430269052871,5.278727229337576,5.2685784560624755,5.257986919825799,5.246955094648831,5.235485564616914,5.2235815590861945,5.211246380621954,5.198483320650096,5.185295940484726,5.171687892611534,5.157662736834769,5.143223958214945,5.128375290029124,5.113120688816404,5.097464233459222,5.081410027770421,5.064962176245324,5.048124940757168,5.030902697516009,5.013299920208697,4.995321183695544,4.97697116685845,4.958254647701642,4.939176500133475,4.919741695903719,4.899955306228441,4.879822503115829,4.8593485563430425,4.83853883499024,4.817398809611169,4.795934049810162,4.774150221646382,4.7520530846179785,4.729648501409312,4.706942443406974,4.683940980276647,4.66065027070185,4.637076574607855,4.613226265057943,4.5891058200796015,4.56472181229838,4.5400809097528985,4.515189911894353,4.490055718795841,4.4646853331875525,4.43908586741421 +5.174732160727834,5.180903622708599,5.186686952506651,5.192013327295525,5.196882255722219,5.201293613627981,5.205247181240746,5.208742932248239,5.211781178015419,5.214362118193631,5.2164854846529565,5.218151187598435,5.219359955068341,5.2201128965022185,5.220410507026522,5.220253031474429,5.219641053122497,5.218575936889506,5.217059057080766,5.215091197579824,5.212673074491418,5.209805949032214,5.206491803984639,5.202732253229697,5.198528440653563,5.19388164075236,5.188793844137118,5.183267491230311,5.177304439144937,5.170906256009327,5.164074840614918,5.156812903746361,5.149123205452327,5.141007896004062,5.132469034679701,5.123509211777622,5.114131770091559,5.10433971446106,5.094135553004344,5.083521903928564,5.072502030908182,5.0610792709340116,5.0492569496703625,5.037038662537339,5.0244280961195456,5.011428844438711,4.998044426911211,4.9842786108559105,4.970135386425394,4.955618865908513,4.940733186549181,4.925482486202742,4.9098710595918424,4.893903315828595,4.877583761369388,4.860917003364524,4.843907751940123,4.826560815048261,4.808881098143997,4.790873605589685,4.7725434404782625,4.753895804146515,4.734935993251437,4.715669406910854,4.696101549065094,4.676238023124909,4.6560845263852855,4.635646845245473,4.614930874491814,4.593942626282123,4.572688211945631,4.551173827518696,4.529405776066465,4.507390477754949,4.485134461568926,4.46264435765583,4.439926897009234,4.41698895292432,4.393837506017774,4.370479647599389,4.346922582201125 +4.998583421333204,5.004553753079981,5.010160868193616,5.0153403632754054,5.020091803751707,5.024415080296104,5.028310032969687,5.031776645712904,5.0348152675286375,5.037426135351596,5.039609032287844,5.041363917890413,5.042691550396216,5.043593068485769,5.044069003946136,5.04411963832204,5.043745591651463,5.042948265728193,5.041729071734515,5.040088830353087,5.0380282944809975,5.035548762202791,5.032652253272952,5.029340418500576,5.025614438636825,5.021475625065321,5.016926005396232,5.011968057142443,5.00660367437104,5.00083446208041,4.994662356003799,4.988090104073763,4.9811205034656885,4.973755741289295,4.965997913574465,4.9578496475397404,4.949314323089743,4.940394981872455,4.9310941685165,4.921414537676887,4.911359389637793,4.900932098023124,4.890136024640401,4.878974800624187,4.867452148059625,4.855571696449078,4.843337000189166,4.830751861346571,4.817820305297701,4.804546479410915,4.790934555163143,4.776988702742216,4.762713249006777,4.7481126383457966,4.733191413768781,4.717954217736098,4.7024057922859095,4.686550977132921,4.6703947142387765,4.653942047537952,4.63719812013891,4.620168171478324,4.602857537679988,4.585271662515136,4.56741609809882,4.5492964993107945,4.53091861805969,4.512288298785471,4.493411501486419,4.474294312196724,4.454942922721675,4.435363617806147,4.4155628031339855,4.395546995928526,4.3753228275121145,4.354897055083993,4.334276557281491,4.313468349293639,4.292479571014497,4.271317491186715,4.249989494379211 +4.811767094367433,4.817524487036783,4.8229455734158835,4.8279707233626485,4.8325995636255366,4.836832000897018,4.840667939855839,4.844107375514246,4.847150697518923,4.849798183064047,4.852049670583908,4.853905172918688,4.85536548090657,4.856431764786802,4.857104595916805,4.857384295465076,4.857271523141103,4.856767720501525,4.855874338485046,4.854592237549114,4.8529222103880425,4.8508655948917605,4.848424450629039,4.845600468368405,4.842394868987421,4.83880900405195,4.834844941338375,4.830505198753248,4.825791710723183,4.820706122534992,4.815250410404472,4.809427363378754,4.803239820054949,4.796690007846433,4.789780062809306,4.782512653150655,4.774891201339377,4.76691879028182,4.7585980038347655,4.7499315358476855,4.740922727759474,4.731574995286219,4.72189173944571,4.711876628281562,4.701533420126968,4.690865781624015,4.679877303306934,4.668571821236725,4.656953395127762,4.645026205547538,4.6327944542559925,4.620262334879984,4.607434194977139,4.594314509505319,4.580907855222002,4.567218902185134,4.553252405339429,4.5390132123191,4.524506289025236,4.509736712799921,4.494709657693185,4.479430380481107,4.46390423028943,4.448136679146487,4.432133317550359,4.415899843587434,4.399442052077555,4.382765829349829,4.365877195578471,4.348782320086393,4.331487489598417,4.313999094116101,4.296323673444677,4.278467862657892,4.260438418625595,4.242242277980542,4.223886547297802,4.205378437530459,4.186725326253788,4.1679347624013126,4.1490144128025985 +4.615073553147262,4.620607186099383,4.625833418207076,4.630697746468614,4.635199863497272,4.639339693191069,4.643117209630553,4.646532419719543,4.649585756753555,4.652277541164436,4.654607670813166,4.65657621577302,4.658184001890591,4.6594322332912315,4.660321523831306,4.66085223723965,4.661025075834661,4.6608415238773935,4.6603030750075956,4.659410632389722,4.658165031444522,4.656567652807718,4.654620598828365,4.652325603162623,4.649683929683292,4.646696973003498,4.643366843981324,4.63969610383126,4.635686730134282,4.631340411184878,4.626659166401518,4.621645828668325,4.616303280585644,4.610633792467981,4.6046395429683145,4.598323243715056,4.5916883617890285,4.584738023493319,4.577474854500107,4.569901590355975,4.5620216155081765,4.5538383891712755,4.545355353676409,4.536576216625672,4.527504775251491,4.518144735440818,4.508499725324194,4.498573617624606,4.488370510727839,4.477894623482699,4.467150192802592,4.456141440408323,4.444872741196404,4.433348608759897,4.421573662999948,4.409552612485786,4.397290238438538,4.384791414419299,4.3720611469597985,4.359104563046169,4.345926887440951,4.332533421750047,4.318929565430415,4.3051208522217355,4.291112939080794,4.276911598457347,4.262522710996238,4.247952264619485,4.233206392779309,4.218291386936202,4.203213672734997,4.187979810657651,4.172596539614775,4.157070662799951,4.141409109348682,4.125619050427581,4.109707881865738,4.093683040242595,4.077552170079765,4.061323126738987,4.0450038773822 +4.409351768049738,4.414651882098308,4.419675496165401,4.424373588329072,4.428745921610073,4.432792438298741,4.436513186661153,4.439908186313281,4.442977917203623,4.445722745982269,4.448142634042227,4.4502377126432915,4.452008845052895,4.4534572716213905,4.454583651652739,4.455388394397643,4.455872247749685,4.456036741677121,4.45588341553715,4.455413218073822,4.454627030264166,4.453526278422602,4.452113110770691,4.450389306643146,4.44835617531406,4.446015156800134,4.4433684076341775,4.440418534747447,4.437167560970572,4.433617219568999,4.429769574966168,4.42562750512544,4.421193937248788,4.4164711862785895,4.411461475406372,4.406167560363275,4.4005929510890915,4.394740817034349,4.3886138284821,4.382214765315709,4.375547054203625,4.368614195109711,4.361419673391155,4.353967241466378,4.346260741383898,4.33830392204714,4.330100452509801,4.3216542503113935,4.312969463966749,4.304050364841257,4.294901241693295,4.285526367351831,4.2759301742125,4.266117238284262,4.256092246340695,4.245859978667455,4.235425295785705,4.224793165348218,4.213968685073116,4.202957072704576,4.191763655330487,4.180393861105889,4.1688532476891185,4.157147497127453,4.145282399834996,4.133263873047211,4.121097980382404,4.108790946410358,4.096349124308781,4.083778985749831,4.071087155706392,4.058280463112361,4.045365921466254,4.0323505621222555,4.019241534736065,4.006046268059582,3.992772443470734,3.9794276873157783,3.966019839564926,3.9525569498918784,3.9390471557374016 +4.195509315890846,4.20056728655889,4.205381653836824,4.209909230876403,4.214149855646923,4.218103490014658,4.221770261207977,4.225150202371352,4.228243843084043,4.231051599188464,4.233573499747604,4.235809741190622,4.237761226590985,4.2394292347941915,4.240814473669493,4.241917401282548,4.242738814343544,4.243280291679536,4.24354342178148,4.24352920240255,4.2432385635635095,4.242672980967544,4.241834653130796,4.240725408880841,4.2393466053820035,4.237699730614972,4.235786990875007,4.233611043724874,4.231173959646622,4.228477517689428,4.225523828715234,4.222315818744992,4.218856460630876,4.215148113896549,4.211193045596389,4.206994054020734,4.202554687161442,4.197878152673403,4.19296716398248,4.1878245427369025,4.182453749240374,4.176858311184633,4.17104174880572,4.1650078547446725,4.158760510352025,4.15230349667203,4.1456405078124225,4.13877549703202,4.131712661757427,4.124456327745697,4.1170108356953685,4.109380509110877,4.101569847183438,4.093583499161135,4.085426233074057,4.077102923524627,4.068618550136575,4.05997823959648,4.051187222516625,4.042250834248531,4.033174546930322,4.023964004540644,4.014625057985159,4.005163639467528,3.995585740959431,3.985897500182473,3.976105289072355,3.9662157653270222,3.956235650692701,3.9461716618293967,3.9360306968634307,3.925820005505507,3.915547002538653,3.90521903469355,3.8948435417397334,3.8844282617608497,3.8739811784834077,3.8635100906185857,3.853022958290791,3.842527885428261,3.8320330151794946 +3.9745123897680292,3.979320800555537,3.98392050058044,3.9882744921164592,3.992382692621927,3.9962450847217044,3.9998618793805534,4.003233124085947,4.006359401017506,4.009241178179055,4.011878556444375,4.014271801395984,4.016421858285576,4.018330046697215,4.019997126206358,4.021423607044033,4.022610338020069,4.023558949970466,4.0242710839824625,4.024747790372997,4.024990051852837,4.024999397372705,4.02477808036433,4.024327983200556,4.023650513613273,4.022747210334252,4.021620333891683,4.020272598011354,4.0187061236468224,4.0169227367183025,4.0149245964127065,4.012714680707124,4.010296010149687,4.007670989351305,4.004841929024859,4.001811669341652,3.998583793077701,3.995161542355918,3.9915476728478865,3.9877450460412045,3.9837571486896897,3.979587524836659,3.9752397226430727,3.9707175713957663,3.9660249872511533,3.961165773718116,3.9561436356519937,3.9509625538300472,3.9456267731292254,3.9401406748354404,3.9345086511462863,3.9287350757656716,3.9228245225721885,3.916781721243112,3.9106115302685662,3.904318935189961,3.897909068125004,3.8913872705169563,3.8847589350088683,3.878029525906651,3.8712046846018486,3.8642903382479474,3.857292737009952,3.850218132433532,3.8430727517727923,3.8358629889233242,3.8285955997595753,3.8212778099810705,3.8139167908260565,3.80651949500524,3.799093083266646,3.791645276227675,3.784183898083095,3.7767165865569714,3.769251022178056,3.7617951550190534,3.754357112713566,3.7469446824446884,3.7395656806374484,3.732227914330363,3.724939149753112 +3.747385811131839,3.751938526798326,3.7563194206699255,3.7604980382469213,3.764474381022253,3.7682484535730927,3.771820555395981,3.775190749149541,3.7783596726727557,3.7813278491137163,3.7840954551661468,3.786662829427267,3.7890309617822586,3.7912012150287855,3.7931744029184538,3.794951089908275,3.7965321791083695,3.7979193558979962,3.799114315836038,3.800118163160346,3.8009319343259973,3.8015572123294255,3.8019963048814422,3.8022511479074197,3.8023232020775435,3.8022140588735858,3.801926031583658,3.8014618856163755,3.800823794429896,3.8000136372804874,3.7990336257605946,3.797886787091839,3.796576190551424,3.795104295565216,3.7934734694940135,3.7916866050186946,3.7897473313360233,3.7876589445884745,3.785424264291203,3.783046216970073,3.7805283468537785,3.777874251519416,3.775087550372449,3.772172159635587,3.7691320879802794,3.765971227355952,3.7626933776729987,3.7593026311800335,3.7558033474541785,3.7522000327000664,3.7484972228430777,3.7446994773144446,3.7408115786472997,3.7368384133636767,3.732784983953195,3.728656462098342,3.724458259936943,3.720196041035552,3.7158754304839725,3.7115020750126577,3.7070818247324846,3.702620914844235,3.6981259625140774,3.6936034856731967,3.6890598969811075,3.684501757435123,3.6799360344452317,3.6753702377044175,3.6708116818276197,3.666267253373359,3.66174399468149,3.657249539966029,3.6527914412570306,3.648377050776645,3.6440136742620512,3.639708608849574,3.635469088036495,3.631301863702694,3.6272134712307484,3.623210165620845,3.6192980378388677 +3.5152130320067343,3.519505271847032,3.5236645754880778,3.5276673858127654,3.531513792894936,3.535203824459548,3.5387378733329995,3.542116018173307,3.5453389555535826,3.5484072667412665,3.5513212082115984,3.5540811953892724,3.5566882652449507,3.559143826277766,3.5614487486782047,3.563603652832733,3.565609498030386,3.567468026440374,3.5691809894309783,3.570749546091797,3.5721747872319027,3.5734583499533032,3.574602594057131,3.575609508293675,3.5764806094848094,3.5772175446729393,3.577822677569614,3.578298819230875,3.5786481990681986,3.5788727594251335,3.5789747711401483,3.5789573093704314,3.578823497223702,3.57857586391044,3.578216852540691,3.577749426588639,3.5771772860581468,3.5765038137892087,3.575731923078687,3.5748646408143308,3.5739056185413496,3.572858569241299,3.571727246466441,3.57051572027021,3.569228168106061,3.567868661800236,3.566441214210063,3.5649501385253086,3.563399989677735,3.5617954778959167,3.5601413899189915,3.5584426283538195,3.5567043277586623,3.5549316040957883,3.5531296440955864,3.551303860542537,3.5494600416847697,3.547604216120039,3.5457422585350766,3.5438800046405534,3.5420234821976853,3.5401791342620017,3.538353721234019,3.5365538039959,3.5347857883239535,3.533056146047784,3.531371637705588,3.529739420185346,3.528166319830948,3.526658593972986,3.5252224824508875,3.523864538725735,3.522590894533273,3.5214076338384452,3.5203206579986626,3.5193352515582386,3.5184561770142335,3.517687619471652,3.517033180789908,3.5164957897049627,3.5160780402326868 +3.279136136466175,3.2831645475835316,3.2871009049931157,3.290928903223818,3.2946487255998065,3.298260424519774,3.3017644915736475,3.3051610230361117,3.308450779335206,3.3116344050339226,3.3147122418061317,3.317684787864132,3.3205531346708157,3.3233187481459057,3.3259825598695434,3.328545246087036,3.33100782631229,3.3333721150756976,3.3356399309508973,3.3378124803124325,3.339890894791148,3.3418768616129295,3.343772795109782,3.34558072601192,3.347302210308715,3.348938930289971,3.350493274366731,3.3519680483078966,3.353365506659265,3.3546876424035963,3.355936752778652,3.357115870780215,3.358228077151124,3.3592759457989123,3.360261988148419,3.3611891778535172,3.362061143594868,3.3628812757995004,3.3636525930599688,3.364378234513068,3.3650618869678146,3.365707292149054,3.3663183215607257,3.3668992186147157,3.367454366999323,3.3679880586938458,3.3685046102573497,3.369008664422105,3.3695050284605803,3.3699986855822104,3.370494825870469,3.3709990300295325,3.3715171476224106,3.3720546246938454,3.3726168360278783,3.3732095645817237,3.373839400045321,3.374513161379056,3.37523720091255,3.3760176872113785,3.3768609798905453,3.377773975170897,3.3787637551684537,3.3798369853510546,3.3810001023495877,3.3822594454426884,3.3836213809311193,3.3850923282389873,3.3866781728082476,3.3883840733068866,3.3902148352784067,3.392174914658493,3.3942676716887665,3.3964969657756683,3.3988663014650604,3.4013772631069865,3.404030058409561,3.40682421095576,3.409758120035774,3.4128289399126204,3.4160332798464785 +3.0403558807569473,3.04411861139178,3.0478321679523463,3.0514878508157373,3.0550859410089233,3.058626516553103,3.06211017212194,3.0655370218545404,3.0689078915576813,3.072223490460909,3.075484248447015,3.0786907488697035,3.0818441364745617,3.0849459301788587,3.0879971238555646,3.090998453748306,3.09395100085456,3.0968566449505763,3.09971726707869,3.1025341309336807,3.1053084235326085,3.108041888657884,3.1107369941308263,3.113395825199051,3.1160200003909044,3.1186112633427507,3.121172051596441,3.1237052078589342,3.126213049984024,3.1286976528485093,3.131161385811411,3.1336073265374043,3.1360386169858687,3.138457926249161,3.1408678739536686,3.1432715342349926,3.1456726440618983,3.148074730693188,3.150480951374715,3.152894598293173,3.155319542045315,3.1577597413167213,3.1602192886857967,3.1627026563699525,3.1652144824845756,3.167759358449832,3.1703419818826024,3.1729673415528166,3.175640488284852,3.178366636091139,3.181151290282373,3.1840005037709846,3.1869205390447553,3.1899170085887856,3.1929953337501984,3.196161379054716,3.19942193711199,3.202783834161491,3.20625331837808,3.2098363935568752,3.2135391064852237,3.2173677887257157,3.221328504456896,3.225426864240049,3.2296683244100874,3.2340579886364713,3.238600391826243,3.2432993389703606,3.248158052512583,3.253179168611128,3.2583644963923737,3.263714382307017,3.269227434618524,3.2749033136501926,3.280741096739872,3.2867366383536862,3.2928835304456046,3.2991747380157244,3.3056015535315075,3.312153462424245,3.31881915612367 +2.800131667247713,2.803628440059961,2.807120915789595,2.810608354872548,2.814091140428484,2.8175693768880583,2.8210437660149186,2.824514439690899,2.827982289587907,2.8314480899739127,2.834912361489512,2.838375774201633,2.8418395225975983,2.845305169691931,2.8487737723614517,2.8522461337284057,2.8557233981905608,2.8592074984324616,2.8627003709761882,2.866203354808382,2.8697177182873133,2.8732452752115814,2.87678855158135,2.880349712270696,2.883930475570339,2.8875326889322994,2.891158886653767,2.894812031446834,2.898494566774037,2.9022086909190303,2.9059569155171596,2.9097425142602935,2.9135688607582377,2.9174387858836606,2.921355060232779,2.92532098751485,2.9293406841429044,2.9334179882123133,2.9375562113953424,2.9417588194738604,2.9460300487055817,2.950374307191753,2.9547959936304387,2.9592998054157764,2.963890605195475,2.968573286006188,2.973352889039999,2.9782346160800226,2.983223620763894,2.988325149675845,2.993544707235085,2.998888231333161,3.004361659743351,3.0099703611419075,3.015719470167772,3.021614323686732,3.0276607172367456,3.033864031360295,3.0402293299737373,3.0467615237957855,3.0534652085872978,3.0603444556967174,3.0674022119299935,3.0746412339942286,3.0820644074275028,3.0896739244913043,3.097470434296623,3.1054525847803687,3.113618638198636,3.121966817063589,3.1304939451455405,3.139193877622717,3.1480583133924602,3.1570803579009206,3.166252255962682,3.175562107477518,3.184995051539285,3.1945358785225912,3.2041672681807283,3.213869670415069,3.2236224722342053 +2.559781547742295,2.5630137334451937,2.5662885005199216,2.5696134244825304,2.5729890038863457,2.5764153702716937,2.579893349171019,2.5834230863070875,2.587005546146394,2.5906415671511054,2.5943317568782387,2.598076864673215,2.6018781170032192,2.6057370730949243,2.6096548235202217,2.613632223127842,2.6176704400182493,2.621771347669926,2.625936816421549,2.6301682575868863,2.634467045868412,2.6388349966869935,2.643274487662063,2.647787668003212,2.652376409474334,2.6570427099811993,2.6617890999560245,2.6666185580162387,2.6715336682543684,2.6765368105359166,2.681630701600027,2.6868188981570076,2.6921051798100755,2.6974926155802335,2.702984188447122,2.7085836278733173,2.714295930265277,2.7201256036434875,2.7260761014998476,2.7321510867389813,2.738355624821865,2.7446952169421346,2.7511748886166507,2.7577997084655825,2.7645749046105106,2.7715059691764967,2.778598621554838,2.785858402523328,2.7932906205492114,2.8009005165033725,2.8086934324360264,2.8166746491905625,2.824848945292463,2.8332212065185876,2.841796203264065,2.8505781951908333,2.859570365650002,2.868774496084895,2.878193123191773,2.8878291082330843,2.897684232818645,2.907757775043553,2.918046186781618,2.9285467023123877,2.9392574803831795,2.9501755033176074,2.9612944375142085,2.9726035614653843,2.9840925609353075,2.995752707069819,3.007573077891685,3.0195372504147775,3.0316267539955333,3.0438244766448244,3.0561120494689904,3.068466857020519,3.0808629528799347,3.093274948864103,3.10567502115693,3.1180328497938725,3.1303167051812646 +2.320682264581978,2.3236529545223377,2.326715101380448,2.3298849499509564,2.333163117359178,2.3365497633315515,2.340045839794187,2.3436515074911886,2.3473678047733695,2.3511956370356772,2.355135704545098,2.359188841794262,2.363356310412735,2.367639670825615,2.372040059427661,2.3765583991595602,2.381195898907235,2.385954392602436,2.390835714424348,2.3958413760474295,2.40097288901125,2.4062321124155255,2.411621348940427,2.4171427947958133,2.4227985018373106,2.428590653309058,2.4345218677783333,2.4405952808616256,2.446813675072047,2.453179615416945,2.4596960651606787,2.4663670113964042,2.4731967610391368,2.480188617690613,2.4873457342748777,2.494672284302602,2.5021742145749677,2.5098566632791615,2.5177231069838695,2.525777258222346,2.534024878366951,2.542472403779364,2.551125197935632,2.5599882937158873,2.5690667988760336,2.5783662746597837,2.587892438163859,2.597650397059663,2.6076448987047374,2.61788038056257,2.6283609875105607,2.6390898485811363,2.6500689407933886,2.661301512889677,2.6727909419827336,2.6845390176043544,2.696544160982253,2.7088022465398227,2.721311368036889,2.7340705472964424,2.7470767972487473,2.7603222159857927,2.773794197405876,2.787482137529233,2.8013772502499203,2.8154690982970347,2.8297420817676096,2.8441737905259723,2.8587431974315822,2.873432641799282,2.8882216056760495,2.903081822029139,2.9179835666375076,2.932897895254838,2.947794247391923,2.9626387038700543,2.9773942600856156,2.9920254510606963,3.00649442938213,3.02076100313271,3.0347833070668826 +2.08426923384589,2.0869833132661286,2.0898397173329823,2.0928637134522945,2.096056029262447,2.099416854488511,2.1029472551019075,2.106647414456886,2.110518441358951,2.1145613170218014,2.1187768524557797,2.1231659901572133,2.1277300581805325,2.1324706907511275,2.1373891313877786,2.1424864217348834,2.14776389455642,2.153223523800749,2.1588673170448587,2.164696941991027,2.1707140715276614,2.1769207713980965,2.18331966223227,2.189913218103336,2.19670364717887,2.2036933169667714,2.2108852209602214,2.2182830276952643,2.2258897889801066,2.233708170433016,2.2417413570497833,2.2499938959986934,2.2584705817300073,2.267174811315033,2.27610971142575,2.2852796304014045,2.294690876215521,2.304348601207275,2.314256030723622,2.324416542870696,2.3348356426774077,2.3455194609307366,2.3564726114363133,2.367698979474215,2.379202281841733,2.390986586384681,2.403055690701955,2.4154124258040617,2.4280593350823576,2.4409983536109046,2.4542304029818314,2.4677539851418784,2.4815658699669014,2.495665487406412,2.5100526822833427,2.5247244961852626,2.539672133444565,2.5548834718498625,2.5703498300173977,2.586063816833856,2.6020152871948814,2.6181873870847525,2.6345574057337937,2.6511054488599988,2.6678138735453705,2.684663112016197,2.701627464518704,2.7186733601203543,2.7357691999390212,2.7528874781108894,2.7699977243444467,2.7870613732758023,2.8040393165904844,2.820892074564161,2.8375784254917433,2.8540556715045002,2.8702791310529903,2.8862060009875545,2.9017917934515247,2.916990499391918,2.9317544515434673 +1.852036528011045,1.8545007468100874,1.8571601170062249,1.8600492726867466,1.863168962990435,1.8665193949352077,1.8701016001148085,1.8739157852075121,1.877962982172934,1.8822441543383945,1.886760192413981,1.891512108246857,1.8965012060155817,1.9017291660317153,1.9071973661172628,1.9129070104983643,1.9188596396815463,1.9250575997510175,1.9315034071055162,1.9381989093203114,1.945145903378918,1.9523469313123578,1.959805763752597,1.9675256319344085,1.9755087518334955,1.983757598689736,1.9922762205295244,2.00106981229178,2.0101418939550397,2.0194950130501246,2.0291325758805447,2.039060264281499,2.0492836160114143,2.059805947133836,2.070630030368362,2.0817600993800904,2.0932021412919126,2.1049604794697108,2.1170377964356133,2.1294366605083135,2.14216088826531,2.1552143207665075,2.168599182997956,2.182316642147041,2.196367185590534,2.210750946873253,2.2254666663563913,2.240512027083308,2.2558849818270095,2.2715825400308307,2.287599395275823,2.3039256652303366,2.320549417655555,2.3374630539308434,2.3546597362003734,2.37212850509773,2.3898500981035737,2.407802035321226,2.425965769093252,2.444323808918883,2.462855650874521,2.4815338540530116,2.5003255661348818,2.5192005383673477,2.538130177047232,2.5570840778084674,2.5760265681911516,2.59491591284336,2.613711948363634,2.6323768448819336,2.6508707454538154,2.6691491908808427,2.6871683077973647,2.704881904927629,2.722242356937338,2.7392036526327717,2.7557201711922734,2.7717469500371053,2.787239083859574,2.802152042710201,2.8164401387197224 +1.625536898634125,1.6277599471729256,1.630232927702111,1.6330001835511516,1.6360623836472565,1.6394197369372694,1.6430730703242957,1.6470226122796232,1.651269146244791,1.65581350430537,1.6606566131136193,1.665799499491583,1.6712433273938991,1.6769897686069184,1.6830403384894344,1.6893964228313798,1.6960598276307108,1.7030334797254179,1.7103207121859796,1.7179235217055797,1.7258437268443452,1.7340845619426264,1.7426517365530745,1.7515496450636903,1.7607802633151308,1.7703459896968101,1.7802524982981456,1.7905073467950923,1.8011145743119117,1.812076259654785,1.8233958584606333,1.8350804815413047,1.8471363371629805,1.8595662871175707,1.8723722462048884,1.8855577354881956,1.899127191281113,1.913082832567329,1.9274263170558577,1.9421587094198847,1.9572801991886126,1.9727897484609769,1.9886851183464718,2.004962817166155,2.021617889652834,2.0386436494114677,2.0560301881366057,2.073766801303083,2.091844112989892,2.1102514690950076,2.128974080786331,2.147989873316126,2.167274807091059,2.1868108344896404,2.206580993428272,2.226563017031089,2.2467244086519513,2.267030729671087,2.2874508392123984,2.307953641663957,2.3285054687175233,2.3490676526331953,2.369598622794146,2.3900578307681033,2.410404498672952,2.430596640251802,2.4505901584155856,2.4703401941423073,2.4898017974975115,2.5089276039393327,2.5276703674598453,2.5459861738128025,2.5638328765172522,2.58116340211049,2.597930073671492,2.6140909035267104,2.629607894878088,2.6444406567914784,2.658551656683457,2.671906703213879,2.684471508091469 +1.4063818058080395,1.4083744001180516,1.4106737886254188,1.4133344026158368,1.416357041790279,1.4197419601443386,1.4234901385211574,1.4276018580921495,1.4320780525984906,1.4369197207647149,1.4421279784316898,1.4477040630850315,1.453649388096252,1.4599660216038943,1.4666557554930877,1.4737201591096452,1.4811613499157075,1.4889829338902913,1.4971889279907158,1.5057814218141592,1.514762177947815,1.5241348029971264,1.533905968555287,1.5440804294976513,1.5546597938000235,1.5656460751458905,1.577045163392035,1.5888646486079363,1.6011079776791743,1.6137763885344956,1.626872328345669,1.6404014253532224,1.6543675798894015,1.668771995521713,1.68361491587005,1.6988970127918057,1.7146172673291749,1.7307730384914972,1.7473635653221389,1.7643869192383752,1.7818367759878986,1.7997041446180613,1.817979926413367,1.8366536562717402,1.8557127203183368,1.8751415409254197,1.8949200412925937,1.9150276253913656,1.9354455397045653,1.956153501256722,1.97712605042755,1.9983293494459888,2.019728037557101,2.041292593534884,2.062994388727274,2.0847994978605056,2.1066644093237437,2.128545498202403,2.150400527127768,2.172185934299234,2.1938566525035634,2.2153661199506467,2.2366684931618765,2.257716653269873,2.2784609315802653,2.2988513500385497,2.31883999602244,2.3383844256052106,2.3574401175002087,2.3759553847233117,2.3938810193318356,2.4111792258839384,2.427814928127499,2.4437462770096694,2.458931879034741,2.4733393633143455,2.4869434804835318,2.499713887047191,2.5116255752061227,2.522659433054588,2.532797498702223 +1.1962413596768555,1.1980163068386782,1.2001570314769452,1.2027284419572781,1.2057317751469843,1.2091673869004738,1.21303692617295,1.2173407562095762,1.2220805113115756,1.2272577479407831,1.2328739509308309,1.2389307967535315,1.245430422763479,1.25237571544976,1.2597688198487116,1.2676113945536784,1.27590577696587,1.2846560647601752,1.2938663965221284,1.30353875219126,1.3136746544508706,1.3242773268518684,1.335352343657045,1.3469032593087367,1.358931105021774,1.371437004468638,1.3844245362039713,1.3978973347945434,1.4118564604399306,1.4263017977113042,1.4412331949289536,1.4566503091735794,1.4725503722066655,1.4889312528783996,1.5057904761028356,1.5231230054346792,1.5409173881483216,1.5591628049215471,1.5778542236588486,1.5969848651415597,1.6165387946398355,1.6364960942983378,1.6568385184309267,1.6775464088583694,1.6985975918075584,1.7199663039128166,1.7416222264803822,1.7635346500040427,1.7856741693540295,1.8080097467142868,1.830505577343567,1.85311909741865,1.8758069884208761,1.8985289735420834,1.9212447428441186,1.9439104037477701,1.96647664065219,1.9888960465617214,2.0111194344821772,2.0330948325119365,2.0547703854288026,2.0760973896000365,2.09703198150374,2.117526424262572,2.137528194593236,2.156985527521899,2.1758531213183834,2.1940968032575467,2.2116785467761053,2.228550024137025,2.2446673791406377,2.260003983578436,2.2745364414967413,2.2882342991792375,2.301068659393407,2.313021206509602,2.3240824265692606,2.334236507201595,2.343474340039233,2.3517940189086,2.3591959828322704 +0.9968442993850288,0.9984093648691816,1.0003922529526046,1.0028671808358478,1.0058371121692051,1.009302780147182,1.013268744130551,1.0177356792533838,1.0227084875962011,1.0281912641854418,1.0341869500185923,1.0406990560234224,1.047733140712001,1.0552958737559137,1.0633911614874378,1.0720213876848457,1.0811901395824899,1.0909036580728302,1.101166794420958,1.1119823419097932,1.1233524746577412,1.1352799271603735,1.147766190443581,1.1608115886837966,1.1744178117089836,1.1885856217372857,1.2033118942437158,1.2185882315343626,1.2344107230189596,1.2507785817796533,1.2676870193689886,1.2851202994059934,1.303059816844883,1.3214978679305887,1.340428651419003,1.3598361075388496,1.3796874678669582,1.3999570904949223,1.420632830230077,1.4417001593899519,1.4631273308522925,1.4848775261723344,1.5069190162525432,1.5292186243426742,1.5517409774620856,1.5744479425138702,1.5972997120800905,1.620255623521878,1.643272964522358,1.6663074576501262,1.6893138785814936,1.7122482277434017,1.7350669666318892,1.7577204808996778,1.7801563299502057,1.8023239527997945,1.824179333817984,1.84568219884966,1.8667847548624128,1.887434955039071,1.9075833469982588,1.927189873179721,1.9462236994679478,1.9646472868454559,1.9824166357884128,1.9994896834940425,2.015834804142335,2.0314343973356093,2.046266203527483,2.060299567141539,2.0735089532017996,2.0858848373381713,2.0974206270330886,2.1081059506860593,2.1179329512736293,2.1269018936238866,2.1350199390298004,2.1422910999145452,2.1487246185314817,2.1543351018171686,2.159140382231858 +0.8099781102479716,0.8113554611822106,0.8132109631567027,0.8156295753284533,0.8186153789440169,0.8221693188478201,0.826297747059814,0.8310014422631614,0.8362871512402016,0.842160279262683,0.8486244111288324,0.8556838427486272,0.8633456562389534,0.8716178154249455,0.8805043781553631,0.8900072981750118,0.9001297026620094,0.910876963487329,0.9222517212356126,0.9342557797396468,0.9468903529516005,0.9601551884242583,0.9740441574829626,0.9885516152584493,1.0036779635021615,1.0194215745860837,1.0357697438067799,1.052699082626127,1.070198432350727,1.0882643101551057,1.106885228407475,1.1260280026777554,1.1456566864162916,1.165756211229819,1.1863156634086718,1.2073067995733415,1.2286758685730836,1.2503824540901025,1.2724059287590261,1.294722989567206,1.3172871269568835,1.3400466056216878,1.3629575705581658,1.385974748099102,1.4090514601490045,1.4321399653616875,1.4551946473107296,1.4781684633876346,1.501008716838601,1.5236614807592053,1.546076503290468,1.5682137182270768,1.5900347013249518,1.6114857395871784,1.6325076570542305,1.6530489742642411,1.6730770244601332,1.6925641225716679,1.7114701091993503,1.7297498020304793,1.7473628597045683,1.7642834041362843,1.7804978017096826,1.7959839447849044,1.8107127471097415,1.8246580020917766,1.8378062568950857,1.8501583663707726,1.8617106817984683,1.8724553075917036,1.8823891552802963,1.8915203097328794,1.8998590006352827,1.9074161546947543,1.9142058162427626,1.9202459066625397,1.9255577792407768,1.930164092779577,1.9340900668880767,1.9373631881198135,1.9400145635545694 +0.6374888876374863,0.638705988734242,0.6404734575917082,0.6428890244551706,0.6459564313035577,0.6496764730192756,0.6540546833790045,0.6590915445452735,0.6647924602714261,0.6711615026700001,0.6782012525846329,0.6859146679814268,0.6943064405296399,0.703380957616204,0.7131395183251912,0.7235817364963086,0.7347074058859392,0.7465160311729179,0.7590036664243834,0.7721681923785325,0.7860072207889339,0.8005140790651046,0.8156714579255945,0.8314648838902242,0.8478902264086987,0.8649404450093628,0.8825913282122881,0.9008042087932723,0.9195587935190332,0.9388458457277393,0.9586453635754292,0.9789084298260842,0.9995841750928841,1.0206488646551375,1.0420844086666436,1.0638514947612414,1.0858813971810601,1.108122487457891,1.1305452683505732,1.1531178151672272,1.1757837149865076,1.1984824705478523,1.221162515991208,1.2437709718101422,1.2662547209802484,1.2885618892403692,1.3106464997139693,1.3324606734296776,1.353948212927054,1.375052323209751,1.3957240656162984,1.4159320372463136,1.435647342181313,1.454819491299488,1.4733910179847078,1.491316648698243,1.5085787850622299,1.525165146821622,1.541048517272771,1.5561969832661349,1.570584885333123,1.5842033753607019,1.5970565378621921,1.6091400085357088,1.620443461074636,1.6309599359920628,1.6406950916000183,1.649666335423221,1.6578877818190259,1.6653745866391996,1.6721455157261658,1.6782233322140025,1.6836318378675328,1.6884000819410825,1.6925603257933728,1.6961437142976883,1.699180698282841,1.7017074750568366,1.7037596583032406,1.705371605951402,1.7065810749161772 +0.48128135608065803,0.48236709783738796,0.48408585638535906,0.48654987533155447,0.4897605167184531,0.4937179336678449,0.4984232158110193,0.5038760309910748,0.5100760765136293,0.5170225218581489,0.5247147639368235,0.5331516187954182,0.5423301856323481,0.5522449332932947,0.5628907383001058,0.574262572553766,0.5863534036347453,0.5991508304955067,0.6126393297013825,0.6268093585990937,0.6416517655715688,0.657149759183427,0.6732719832751395,0.6899927398402005,0.7072994599775863,0.725176275402853,0.7435869298694013,0.7624800323332737,0.7818250887872045,0.8016036398827336,0.821786022401869,0.8423129126062088,0.8631245845495612,0.8841881692417088,0.9054765317423124,0.9269426261514935,0.9485135720475026,0.9701331495646961,0.9917637842644277,1.0133663752006485,1.0348826092925831,1.0562526728682906,1.0774241739721506,1.0983435934981634,1.1189585590728528,1.1392204944821283,1.159089527448631,1.1785236908189405,1.1974720048011283,1.2158838028013805,1.2337188501786367,1.2509578749817434,1.2675844307829145,1.2835595916152527,1.2988378358655488,1.3133875576989813,1.3272071505064988,1.3402995844860275,1.3526542225091926,1.3642573700119072,1.3751016929879314,1.3851951834562113,1.3945565160683087,1.4031981767563924,1.411129372552107,1.4183625550075827,1.424919789865314,1.4308296979291537,1.4361197970295083,1.4408238054533302,1.444977177228297,1.4486114617089325,1.4517580288266492,1.4544569980830522,1.456751207618339,1.4586777649481815,1.4602692753768238,1.4615672173354342,1.4626096414506324,1.463430277103035,1.4640653741926815 +0.34331885526800204,0.3442977127890947,0.34599365639140167,0.3485335846137484,0.3519143380749086,0.3561349236043337,0.3611882140673699,0.3670725544787913,0.37377745302373366,0.3812935487877518,0.38961487227582725,0.39873329711214267,0.4086331162966869,0.41929263516116544,0.430696809857925,0.4428338668576023,0.4556867266048231,0.4692255432951431,0.4834189183959162,0.4982467332415833,0.5136902243223405,0.5297195268440185,0.5462879690427596,0.5633574541909112,0.5809034483855922,0.5988983947467246,0.6172952288394133,0.6360349816200715,0.6550771974081794,0.6743912989170626,0.6939379874234965,0.7136556275345626,0.7334843445322651,0.753382874296745,0.7733140341023204,0.7932281731127894,0.8130618735174436,0.8327628765250381,0.8522876161192313,0.8715925264400537,0.890627120105582,0.9093432656376474,0.9276959105603702,0.9456391374888322,0.9631295688135881,0.9801299942521247,0.9966129997253318,1.0125492954650366,1.0279024641517571,1.04263750432762,1.0567299801546204,1.0701744236090582,1.0829678368301838,1.0950906378701317,1.1065192927777072,1.1172422472445944,1.1272719503734494,1.1366236315627107,1.1453045431496374,1.1533217746056401,1.1606873561017919,1.16742296967543,1.173555759739834,1.1791111584580456,1.184115457976473,1.1885974178124183,1.1925896804555225,1.1961243062432818,1.1992351502534864,1.2019660923593671,1.2043605153950128,1.2064509540977175,1.2082686540175527,1.209855160134284,1.2112536799427287,1.2124984799077119,1.2136167181255706,1.2146452349006183,1.2156155865038127,1.2165531612890392,1.217484412405602 +0.22562332606158914,0.22650754850181887,0.22817528329030454,0.2307648799435733,0.2342671174517803,0.23867950825913448,0.24398404753214442,0.25017743827537986,0.25723592152907176,0.265139166485879,0.2738744085434851,0.283424758527693,0.2937583018119003,0.304833259603169,0.31662262789523354,0.3291068016954945,0.3422569434254506,0.3560228571634644,0.37035544481183763,0.38522247120652103,0.40059417736073666,0.4164267643612764,0.43265966040133536,0.4492433492642278,0.46613963152341725,0.48330824478861045,0.5006946613978291,0.5182393956064741,0.5358941154345767,0.5536151504561688,0.5713553551943596,0.5890601197319587,0.6066790334260931,0.6241647865154156,0.6414708830931931,0.658551187827441,0.6753649944704792,0.6918726915340373,0.7080281260966385,0.7237870816651789,0.7391161670955414,0.7539888901689081,0.7683751943159473,0.7822444743745116,0.7955698171235778,0.8083322038332807,0.8205214172411079,0.8321260194123481,0.8431318366357845,0.8535272359383967,0.8633085853624938,0.8724836574900569,0.8810616943598003,0.8890475970300423,0.8964469594208037,0.9032717910350627,0.9095441412415024,0.915286266479491,0.920521723417377,0.9252776300432042,0.9295832494464444,0.9334683608574483,0.9369607643169013,0.94009259515314,0.9429017945610488,0.9454274436676992,0.9477049168630984,0.9497611621813002,0.9516280298705495,0.953348969976874,0.9549647593346247,0.9565008376897445,0.9579805602287504,0.9594367128973437,0.960902285855641,0.9624002464729101,0.9639456627557474,0.9655613511009209,0.9672644311566765,0.9690657004139269,0.9709752171072382 +0.1302752965031863,0.13105512713271866,0.1326356436899898,0.13515792139363075,0.13860665989766013,0.1429779064973207,0.14824287794598362,0.15439673843840165,0.16140277986464194,0.16923007560264466,0.17785937384489534,0.1872654511393343,0.1974009678451981,0.20820535061814108,0.2196407180715292,0.23168061230486148,0.24428582227575596,0.2573882587211635,0.27092402358691225,0.2848504514473651,0.29912834197855753,0.3137028845845423,0.3285049778397007,0.34347792403925725,0.358571836081865,0.3737362062266403,0.38891477859645496,0.40405542832657604,0.4191064755287755,0.43401380987065,0.4487266652955278,0.46320582676677874,0.47741839882342313,0.49131541909677157,0.5048446209039876,0.5179693217852647,0.5306800908669264,0.5429563147999147,0.5547539171454093,0.56603264790813,0.5767820929325923,0.587002863154566,0.596684654161487,0.6058169409776731,0.6143935207229246,0.6224167099111102,0.6298947326140519,0.6368355562361282,0.6432502961643646,0.6491534855025506,0.6545629703452419,0.6594966133637068,0.6639723379624798,0.6680194335644225,0.6716734247747627,0.6749683538331105,0.6779296389866323,0.6805801494128636,0.6829547846856934,0.6850956695645671,0.6870435461427368,0.6888292103649404,0.6904735540273542,0.6920079830043551,0.6934742795118496,0.6949137841472739,0.6963564548799593,0.6978171075623785,0.6993180259891273,0.7008920223580443,0.7025676122360084,0.7043569867004392,0.7062699364078354,0.7083225853970965,0.7105297276420725,0.7128974110714554,0.7154249743596677,0.7181152607153216,0.7209665266439099,0.7239722628393798,0.727123475765954 +0.059413867822393926,0.06004579471334232,0.061399677226560125,0.06360246291240347,0.06663541720795811,0.0704938014337368,0.07514295209005473,0.08057730621789319,0.08675337941036161,0.0936348409678003,0.10119920576024899,0.10941715437212288,0.11823380828008183,0.1275798437574746,0.13741274445336674,0.14770351804514537,0.1584089925016824,0.16945432689545323,0.1807711690521818,0.1923133009631807,0.20403836611557163,0.21588927718343845,0.22779918281687456,0.23971297957023804,0.25157700663800914,0.26333842489247383,0.2749476048254873,0.2863669533981733,0.29754906677299486,0.30843774669294477,0.3189860293447667,0.32917460249815916,0.3389913780920393,0.3483926408596673,0.3573279735289408,0.3657743522774642,0.3737520322939824,0.3812602734764932,0.3882628511855039,0.39472846469859735,0.40066847684748524,0.4061072637877941,0.41105313724394144,0.41551446031431016,0.4195037233953423,0.42304103985854824,0.42614857081795193,0.42884917043860615,0.4311739991913654,0.43315787697034447,0.4348337824542287,0.4362236705372069,0.4373482390007599,0.43825273731949344,0.43899292576145493,0.43961575480510856,0.44014315108201346,0.44059252160668955,0.4410013766456416,0.44141660623986617,0.44188071467079354,0.44241833902127553,0.4430387386461263,0.44376559497340995,0.4446353492412979,0.44568269486337997,0.44692603016904403,0.44836551475165154,0.4500097666193112,0.45187456212604366,0.45397087194917957,0.4562961947279679,0.4588458895369851,0.4616173873140614,0.4646057011147839,0.46780027239019073,0.47118654713711927,0.47474849332041325,0.478467683761444,0.4823235876512297,0.4862921191514587 +0.015236700444775887,0.015629737779308973,0.016505908665018738,0.01795001376934837,0.019946551701977424,0.02249165124808122,0.025556894470017282,0.029137850458229832,0.03319921252831307,0.03771163814732053,0.04265704465665909,0.048011917805517196,0.05373229705466432,0.05976311006218723,0.06607101715849402,0.07263365357008474,0.07941760623294503,0.08636502619752151,0.09342409259131987,0.10055941879130086,0.10773862203516439,0.11491925493319649,0.12205454341628362,0.12910574440442701,0.13603193674135247,0.14279363793432492,0.14935899637559222,0.15570946852517004,0.16181335447936246,0.16762885103400735,0.173124260006202,0.17829724091916832,0.1831511189432459,0.18765732535867224,0.19178045973010424,0.19551170889050407,0.1988826525118693,0.20190401159568497,0.2045540673121609,0.20681524230905796,0.20870794819210392,0.21026302088359902,0.2114967667964161,0.21242566155733492,0.21306897325276766,0.2134508310207639,0.21359444961691176,0.21352410684507403,0.21327313900175215,0.21287762673595637,0.21236917993281396,0.21176483107703076,0.21107994182676465,0.2103553513915033,0.20964197690631653,0.20898003086195743,0.20838200889764386,0.2078561046908611,0.20742962847379134,0.20713781255545777,0.2070110158801638,0.20706227604760802,0.20729057025460068,0.20770740296987256,0.20833469858190728,0.20919240719229137,0.21028613583584965,0.21160697720268976,0.21315255384565343,0.21492329761332915,0.21691605156584734,0.21912024822991577,0.22152402050843722,0.22411430541774366,0.22687572994614266,0.2297910745032134,0.23284210463716895,0.2360063766575454,0.23926121888688895,0.24258422892642037,0.24594990472006842 +0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0. diff --git a/tests/functional/templates.py b/tests/functional/templates.py new file mode 100644 index 00000000..5709b166 --- /dev/null +++ b/tests/functional/templates.py @@ -0,0 +1,39 @@ +from abc import ABC, abstractmethod +from tests.functional.utils import Timer + +class EquationTestTemplate(ABC): + strategy = None + + @abstractmethod + def make_search(self): + pass + + @abstractmethod + def correct_symbolic(self): + pass + + @abstractmethod + def incorrect_symbolic(self): + pass + + @abstractmethod + def all_vars(self): + pass + + def run(self, fit_operator, do_discovery=False): + search_obj = self.make_search() + + if do_discovery: + return self.run_discovery(search_obj) + + correct_obj = self.strategy.build(self.correct_symbolic(), search_obj, self.all_vars()) + incorrect_obj = self.strategy.build(self.incorrect_symbolic(), search_obj, self.all_vars()) + + with Timer() as t: + ok = self.strategy.compare(correct_obj, incorrect_obj, fit_operator, self.all_vars()) + + return ok, t.elapsed + + + def run_discovery(self, search_obj): + raise NotImplementedError \ No newline at end of file diff --git a/tests/functional/tests/test_ac.py b/tests/functional/tests/test_ac.py new file mode 100644 index 00000000..b793e521 --- /dev/null +++ b/tests/functional/tests/test_ac.py @@ -0,0 +1,47 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.ac.ac import ACTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_ac(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = ACTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_burgers_discovery.py b/tests/functional/tests/test_burgers_discovery.py new file mode 100644 index 00000000..88e530c0 --- /dev/null +++ b/tests/functional/tests/test_burgers_discovery.py @@ -0,0 +1,47 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.burgers.burgers import BurgersTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_burgers_discovery(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = BurgersTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_burgers_sindy.py b/tests/functional/tests/test_burgers_sindy.py new file mode 100644 index 00000000..3f204dd2 --- /dev/null +++ b/tests/functional/tests/test_burgers_sindy.py @@ -0,0 +1,47 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.burgers.burgers import BurgersTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_burgers_sindy(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = BurgersTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_sindy_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_kdv_discovery.py b/tests/functional/tests/test_kdv_discovery.py new file mode 100644 index 00000000..12924f56 --- /dev/null +++ b/tests/functional/tests/test_kdv_discovery.py @@ -0,0 +1,48 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.kdv.kdv import KdVTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_kdv(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = KdVTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_kdv_sindy.py b/tests/functional/tests/test_kdv_sindy.py new file mode 100644 index 00000000..82dcbd21 --- /dev/null +++ b/tests/functional/tests/test_kdv_sindy.py @@ -0,0 +1,48 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.kdv.kdv import KdVTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_kdv_discovery_sindy(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = KdVTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() # если для sindy нужен отдельный pool, см. ниже + search_obj, elapsed = scenario.run_sindy_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_ks.py b/tests/functional/tests/test_ks.py new file mode 100644 index 00000000..cddad23e --- /dev/null +++ b/tests/functional/tests/test_ks.py @@ -0,0 +1,48 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.ks.ks import KSTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_ks(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = KSTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_lorenz.py b/tests/functional/tests/test_lorenz.py new file mode 100644 index 00000000..62e9b101 --- /dev/null +++ b/tests/functional/tests/test_lorenz.py @@ -0,0 +1,48 @@ +import pytest + +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.lorenz.lorenz import LorenzTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_lorenz(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = LorenzTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_lv.py b/tests/functional/tests/test_lv.py new file mode 100644 index 00000000..61362d85 --- /dev/null +++ b/tests/functional/tests/test_lv.py @@ -0,0 +1,46 @@ +import pytest +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.lv.lv import LotkaVolterraTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_lv(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = LotkaVolterraTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_ns.py b/tests/functional/tests/test_ns.py new file mode 100644 index 00000000..7c1bd31f --- /dev/null +++ b/tests/functional/tests/test_ns.py @@ -0,0 +1,45 @@ +import pytest +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.ns.ns import NavierStokesTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_ns(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = NavierStokesTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_vdp.py b/tests/functional/tests/test_vdp.py new file mode 100644 index 00000000..f7537c7f --- /dev/null +++ b/tests/functional/tests/test_vdp.py @@ -0,0 +1,46 @@ +import pytest +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.vdp.vdp import VanDerPolTest + +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_vdp(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = VanDerPolTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/tests/test_wave.py b/tests/functional/tests/test_wave.py new file mode 100644 index 00000000..505a7a85 --- /dev/null +++ b/tests/functional/tests/test_wave.py @@ -0,0 +1,46 @@ +import pytest +from tests.functional.operator_factory import FitnessOperatorFactory +from tests.functional.scenarios.wave.wave import WaveTest +from epde.operators.utils.default_parameter_loader import EvolutionaryParams + +operator_params_l2lr = EvolutionaryParams().get_default_params_for_operator( + "DiscrepancyBasedFitnessWithCV" +) + +operator_params_deepxde = EvolutionaryParams().get_default_params_for_operator( + 'DeepXDEBasedFitness' +) + +operator_params_pic = EvolutionaryParams().get_default_params_for_operator( + 'PIC' +) + +ALL_CASES = [ + ("DeepXDEBasedFitness", operator_params_deepxde), + ("PIC", operator_params_pic), + ("L2LRFitness", operator_params_l2lr), +] + +@pytest.mark.functional +@pytest.mark.parametrize("operator_name, params", ALL_CASES) +def test_wave(operator_name, params, runtime_options): + import epde.globals as global_var + global_var.solution_guess_nn = None + if operator_name not in runtime_options["operators"]: + pytest.skip(f"{operator_name} skipped by --operators") + + operator = FitnessOperatorFactory.create(operator_name, params) + scenario = WaveTest(noise_level=0) + + if runtime_options["discovery"]: + search_obj = scenario.make_search() + search_obj, elapsed = scenario.run_discovery( + search_obj, + report_dir=runtime_options["report_dir"] if runtime_options["report"] else None, + operator_name=operator_name, + ) + assert elapsed < 600 + else: + ok, elapsed = scenario.run(operator) + assert ok + assert elapsed < 60 \ No newline at end of file diff --git a/tests/functional/utils/__init__.py b/tests/functional/utils/__init__.py new file mode 100644 index 00000000..c3347407 --- /dev/null +++ b/tests/functional/utils/__init__.py @@ -0,0 +1 @@ +from .timer import Timer \ No newline at end of file diff --git a/tests/functional/utils/timer.py b/tests/functional/utils/timer.py new file mode 100644 index 00000000..db15d315 --- /dev/null +++ b/tests/functional/utils/timer.py @@ -0,0 +1,9 @@ +from time import perf_counter + +class Timer: + def __enter__(self): + self.start = perf_counter() + return self + + def __exit__(self, exc_type, exc, tb): + self.elapsed = perf_counter() - self.start \ No newline at end of file