From d1fe06c15220d99d2795d9578091370a62621996 Mon Sep 17 00:00:00 2001 From: forestbat Date: Fri, 24 Jun 2022 16:56:19 +0800 Subject: [PATCH 01/19] add some files --- .github/workflows/publish-to-pypi.yml | 36 +++++++++++++++++++++++++++ .readthedocs.yaml | 23 +++++++++++++++++ MANIFEST.in | 1 + hydromodel/example/__init__.py | 0 setup.py | 23 +++++++++++++++++ test/__init__.py | 0 6 files changed, 83 insertions(+) create mode 100644 .github/workflows/publish-to-pypi.yml create mode 100644 .readthedocs.yaml create mode 100644 MANIFEST.in create mode 100644 hydromodel/example/__init__.py create mode 100644 setup.py create mode 100644 test/__init__.py diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml new file mode 100644 index 0000000..11a4285 --- /dev/null +++ b/.github/workflows/publish-to-pypi.yml @@ -0,0 +1,36 @@ +name: Publish Python distributions to PyPI + +on: push + +jobs: + build-n-publish: + name: Build and publish Python distributions to PyPI + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - name: Set up Python 3.9 + uses: actions/setup-python@v1 + with: + python-version: 3.9 + + - name: Install pypa/build + run: >- + python -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: >- + python -m + build + --sdist + --wheel + --outdir dist/ + . + + - name: Publish distribution to PyPI + if: startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..8b0c447 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,23 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-20.04 + tools: + python: "3.9" + # You can also specify other tool versions: + # nodejs: "16" + # rust: "1.55" + # golang: "1.17" + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/source/conf.py + +# If using Sphinx, optionally build your docs in additional formats such as PDF +# formats: +# - pdf \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..57fdc18 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include XXX *.csv *.txt # 打包需包含csv、txt为后缀的文件;XXX为包名 \ No newline at end of file diff --git a/hydromodel/example/__init__.py b/hydromodel/example/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..29b5c04 --- /dev/null +++ b/setup.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +# -*- coding:utf-8 -*- + +from setuptools import setup, find_packages + +setup( + name="", # 输入项目名称 + version="", # 输入版本号 + keywords=[""], # 输入关键词 + description="", # 输入概述 + long_description="", # 输入描述 + + url="", # 输入项目Github仓库的链接 + author="", # 输入作者名字 + author_email="", # 输入作者邮箱 + license="", # 此为声明文件,一般填写 MIT_license + + packages=find_packages(), + include_package_data=True, + platforms="any", + install_requires=[""], # 输入项目所用的包 + python_requires='>= ', # Python版本要求 +) diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 From 615aaf7f44ebcff5050d6cae96ab0b29d7afc14a Mon Sep 17 00:00:00 2001 From: forestbat Date: Sun, 24 Sep 2023 16:00:48 +0800 Subject: [PATCH 02/19] add wangjingyi's code --- requirements.txt | 13 + test/runxaj.yaml | 46 ++ test/test_xaj_bmi.py | 308 ++++++++++ xaj/__init__.py | 0 xaj/calibrate_ga_xaj_bmi.py | 381 ++++++++++++ xaj/calibrate_sceua_xaj_bmi.py | 209 +++++++ xaj/configuration.py | 27 + xaj/constant_unit.py | 63 ++ xaj/dockerfile | 13 + xaj/params.py | 122 ++++ xaj/xaj_bmi.py | 292 +++++++++ xaj/xajmodel.py | 1060 ++++++++++++++++++++++++++++++++ 12 files changed, 2534 insertions(+) create mode 100644 requirements.txt create mode 100644 test/runxaj.yaml create mode 100644 test/test_xaj_bmi.py create mode 100644 xaj/__init__.py create mode 100644 xaj/calibrate_ga_xaj_bmi.py create mode 100644 xaj/calibrate_sceua_xaj_bmi.py create mode 100644 xaj/configuration.py create mode 100644 xaj/constant_unit.py create mode 100644 xaj/dockerfile create mode 100644 xaj/params.py create mode 100644 xaj/xaj_bmi.py create mode 100644 xaj/xajmodel.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..57a82b9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +python=3.10 +ipykernel +numpy +numba +pandas +scikit-learn +deap +spotpy=1.5.14 +seaborn +tqdm +pytest +hydrodataset +bmipy \ No newline at end of file diff --git a/test/runxaj.yaml b/test/runxaj.yaml new file mode 100644 index 0000000..ae57a87 --- /dev/null +++ b/test/runxaj.yaml @@ -0,0 +1,46 @@ +# xaj model configuration +# The current model runs on the daily time step + start_time_str: "1990-01-01" + end_time_str: "2009-12-31" + time_units: "days" + # The current model runs on the hourly time step + # basin_area: "66400" + # start_time_str: "2021-06-01 00:00:00" + # end_time_str: "2021-08-31 23:00:00" + # time_units: "hours" +# initial condition + forcing_data: "/hydromodel/example/01013500_lump_p_pe_q.txt" + json_file: "/hydromodel/example/data_info.json" + npy_file: "/hydromodel/example/basins_lump_p_pe_q.npy" + # forcing_file: "/home/wangjingyi/code/hydro-model-xaj/scripts/尼尔基降雨.csv" + warmup_length: 360 + basin_area: 2252.7 + + + train_period: ["1990-01-01", "2000-12-31"] + test_period: ["2001-01-01", "2009-12-31"] + period: ["1990-01-01", "2009-12-31"] + cv_fold: 1 + algorithm: "SCE_UA" + +#model_info + model_name: "xaj_mz" + source_type: "sources" + source_book: "HF" + +#algorithm_SCE_UA + # algorithm_name: "SCE_UA" + # random_seed: 1234 + # rep: 2 + # ngs: 2 + # kstop: 1 + # peps: 0.001 + # pcento: 0.001 +#algorithm_GA + algorithm_name: "GA" + random_seed: 1234 + run_counts: 3 + pop_num: 50 + cross_prob: 0.5 + mut_prob: 0.5 + save_freq: 1 \ No newline at end of file diff --git a/test/test_xaj_bmi.py b/test/test_xaj_bmi.py new file mode 100644 index 0000000..0ee679b --- /dev/null +++ b/test/test_xaj_bmi.py @@ -0,0 +1,308 @@ +import logging + +import definitions +from xaj.configuration import read_config +from xaj.xaj_bmi import xajBmi + +logging.basicConfig(level=logging.INFO) + +import pandas as pd +import os +from pathlib import Path +import numpy as np +import fnmatch +import socket +from datetime import datetime + +from hydromodel.utils import hydro_utils +from hydromodel.data.data_preprocess import ( + cross_valid_data, + split_train_test, +) +from xaj.calibrate_sceua_xaj_bmi import calibrate_by_sceua +from xaj.calibrate_ga_xaj_bmi import ( + calibrate_by_ga, + show_ga_result, +) +from hydromodel.visual.pyspot_plots import show_calibrate_result, show_test_result +from hydromodel.data.data_postprocess import ( + renormalize_params, + read_save_sceua_calibrated_params, + save_streamflow, + summarize_metrics, + summarize_parameters, +) +from hydromodel.utils import hydro_constant + + +def test_bmi(): + ''' + model = xajBmi() + print(model.get_component_name()) + model.initialize("runxaj.yaml") + print("Start time:", model.get_start_time()) + print("End time:", model.get_end_time()) + print("Current time:", model.get_current_time()) + print("Time step:", model.get_time_step()) + print("Time units:", model.get_time_units()) + print(model.get_input_var_names()) + print(model.get_output_var_names()) + + discharge = [] + ET = [] + time = [] + while model.get_current_time() <= model.get_end_time(): + time.append(model.get_current_time()) + model.update() + + discharge=model.get_value("discharge") + ET=model.get_value("ET") + + results = pd.DataFrame({ + 'discharge': discharge.flatten(), + 'ET': ET.flatten(), + }) + results.to_csv('/home/wangjingyi/code/hydro-model-xaj/scripts/xaj.csv') + model.finalize() + ''' + # 模型率定 + config = read_config(os.path.relpath("runxaj.yaml")) + forcing_data = Path(str(definitions.ROOT_DIR) + str(config['forcing_data'])) + train_period = config['train_period'] + test_period = config['test_period'] + # period = config['period'] + json_file = Path(str(definitions.ROOT_DIR) + str(config['json_file'])) + npy_file = Path(str(definitions.ROOT_DIR) + str(config['npy_file'])) + cv_fold = config['cv_fold'] + warmup_length = config['warmup_length'] + # model_info + model_name = config['model_name'] + source_type = config['source_type'] + source_book = config['source_book'] + # algorithm + algorithm_name = config['algorithm_name'] + + if not (cv_fold > 1): + # no cross validation + periods = np.sort( + [train_period[0], train_period[1], test_period[0], test_period[1]] + ) + if cv_fold > 1: + cross_valid_data(json_file, npy_file, periods, warmup_length, cv_fold) + else: + split_train_test(json_file, npy_file, train_period, test_period) + + kfold = [ + int(f_name[len("data_info_fold"): -len("_test.json")]) + for f_name in os.listdir(os.path.dirname(forcing_data)) + if fnmatch.fnmatch(f_name, "*_fold*_test.json") + ] + kfold = np.sort(kfold) + for fold in kfold: + print(f"Start to calibrate the {fold}-th fold") + train_data_info_file = os.path.join( + os.path.dirname(forcing_data), f"data_info_fold{str(fold)}_train.json" + ) + train_data_file = os.path.join( + os.path.dirname(forcing_data), f"basins_lump_p_pe_q_fold{str(fold)}_train.npy" + ) + test_data_info_file = os.path.join( + os.path.dirname(forcing_data), f"data_info_fold{str(fold)}_test.json" + ) + test_data_file = os.path.join( + os.path.dirname(forcing_data), f"basins_lump_p_pe_q_fold{str(fold)}_test.npy" + ) + if ( + os.path.exists(train_data_info_file) is False + or os.path.exists(train_data_file) is False + or os.path.exists(test_data_info_file) is False + or os.path.exists(test_data_file) is False + ): + raise FileNotFoundError( + "The data files are not found, please run datapreprocess4calibrate.py first." + ) + data_train = hydro_utils.unserialize_numpy(train_data_file) + data_test = hydro_utils.unserialize_numpy(test_data_file) + data_info_train = hydro_utils.unserialize_json_ordered(train_data_info_file) + data_info_test = hydro_utils.unserialize_json_ordered(test_data_info_file) + current_time = datetime.now().strftime("%b%d_%H-%M-%S") + # one directory for one model + one hyperparam setting and one basin + save_dir = os.path.join(os.path.dirname(forcing_data), current_time + "_" + socket.gethostname() + "_fold" + str(fold)) + if algorithm_name == "SCE_UA": + random_seed = config['random_seed'] + rep = config['rep'] + ngs = config['ngs'] + kstop = config['kstop'] + peps = config['peps'] + pcento = config['pcento'] + for i in range(len(data_info_train["basin"])): + basin_id = data_info_train["basin"][i] + basin_area = data_info_train["area"][i] + # one directory for one model + one hyperparam setting and one basin + spotpy_db_dir = os.path.join( + save_dir, + basin_id, + ) + + if not os.path.exists(spotpy_db_dir): + os.makedirs(spotpy_db_dir) + db_name = os.path.join(spotpy_db_dir, "SCEUA_" + model_name) + sampler = calibrate_by_sceua( + data_train[:, i: i + 1, 0:2], + data_train[:, i: i + 1, -1:], + db_name, + warmup_length=warmup_length, + model={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }, + algorithm={ + 'name': algorithm_name, + 'random_seed': random_seed, + 'rep': rep, + 'ngs': ngs, + 'kstop': kstop, + 'peps': peps, + 'pcento': pcento + }, + ) + + show_calibrate_result( + sampler.setup, + db_name, + warmup_length=warmup_length, + save_dir=spotpy_db_dir, + basin_id=basin_id, + train_period=data_info_train["time"], + basin_area=basin_area, + ) + params = read_save_sceua_calibrated_params( + basin_id, spotpy_db_dir, db_name + ) + + model = xajBmi() + model.initialize(os.path.relpath("runxaj.yaml"), params, data_test[:, i: i + 1, 0:2]) + j = 0 + while j <= len(data_info_test["time"]): + model.update() + j += 1 + q_sim = model.get_value("discharge") + + qsim = hydro_constant.convert_unit( + q_sim, + unit_now="mm/day", + unit_final=hydro_constant.unit["streamflow"], + basin_area=basin_area, + ) + + qobs = hydro_constant.convert_unit( + data_test[warmup_length:, i: i + 1, -1:], + unit_now="mm/day", + unit_final=hydro_constant.unit["streamflow"], + basin_area=basin_area, + ) + test_result_file = os.path.join( + spotpy_db_dir, + "test_qsim_" + model_name + "_" + str(basin_id) + ".csv", + ) + pd.DataFrame(qsim.reshape(-1, 1)).to_csv( + test_result_file, + sep=",", + index=False, + header=False, + ) + test_date = pd.to_datetime( + data_info_test["time"][warmup_length:] + ).values.astype("datetime64[D]") + show_test_result( + basin_id, test_date, qsim, qobs, save_dir=spotpy_db_dir + ) + elif algorithm_name == "GA": + random_seed = config['random_seed'] + run_counts = config['run_counts'] + pop_num = config['pop_num'] + cross_prob = config['cross_prob'] + mut_prob = config['mut_prob'] + save_freq = config['save_freq'] + for i in range(len(data_info_train["basin"])): + basin_id = data_info_train["basin"][i] + basin_area = data_info_train["area"][i] + # one directory for one model + one hyperparam setting and one basin + deap_db_dir = os.path.join(save_dir, basin_id) + + if not os.path.exists(deap_db_dir): + os.makedirs(deap_db_dir) + calibrate_by_ga( + data_train[:, i: i + 1, 0:2], + data_train[:, i: i + 1, -1:], + deap_db_dir, + warmup_length=warmup_length, + model={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }, + ga_param={ + 'name': algorithm_name, + 'random_seed': random_seed, + 'run_counts': run_counts, + 'pop_num': pop_num, + 'cross_prob': cross_prob, + 'mut_prob': mut_prob, + 'save_freq': save_freq + }, + ) + show_ga_result( + deap_db_dir, + warmup_length=warmup_length, + basin_id=basin_id, + the_data=data_train[:, i: i + 1, :], + the_period=data_info_train["time"], + basin_area=basin_area, + model_info={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }, + train_mode=True, + ) + show_ga_result( + deap_db_dir, + warmup_length=warmup_length, + basin_id=basin_id, + the_data=data_test[:, i: i + 1, :], + the_period=data_info_test["time"], + basin_area=basin_area, + model_info={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }, + train_mode=False, + ) + else: + raise NotImplementedError( + "We don't provide this calibrate method! Choose from 'SCE_UA' or 'GA'!" + ) + summarize_parameters(save_dir, model_info={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }) + renormalize_params(save_dir, model_info={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }) + summarize_metrics(save_dir, model_info={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book + }) + save_streamflow(save_dir, model_info={ + 'name': model_name, + 'source_type': source_type, + 'source_book': source_book, + }, fold=fold) + print(f"Finish calibrating the {fold}-th fold") diff --git a/xaj/__init__.py b/xaj/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xaj/calibrate_ga_xaj_bmi.py b/xaj/calibrate_ga_xaj_bmi.py new file mode 100644 index 0000000..555b671 --- /dev/null +++ b/xaj/calibrate_ga_xaj_bmi.py @@ -0,0 +1,381 @@ +"""Calibrate XAJ model using DEAP""" +import os +import pickle +import random +import sys +from pathlib import Path + +import numpy as np +import pandas as pd +from deap import base, creator +from deap import tools +from tqdm import tqdm + +sys.path.append(os.path.dirname(Path(os.path.abspath(__file__)).parent.parent)) +import definitions +from hydromodel.models.model_config import MODEL_PARAM_DICT +from hydromodel.utils import hydro_constant, hydro_utils +from hydromodel.utils import stat +from hydromodel.utils.stat import statRmse +from hydromodel.visual.hydro_plot import plot_sim_and_obs, plot_train_iteration +from xaj.xaj_bmi import xajBmi + + +def evaluate(individual, x_input, y_true, warmup_length, model): + """ + Calculate fitness for optimization + + Parameters + ---------- + individual + individual is the params of XAJ (see details in xaj.py); we initialize all parameters in range [0,1] + x_input + input of XAJ + y_true + observation data; we use the part after warmup period + warmup_length + the length of warmup period + model + model's name: "xaj", "xaj_mz", "gr4j", or "hymod" + + Returns + ------- + float + fitness + """ + # print("Calculate fitness:") + # NOTE: Now only support one basin's calibration for once now + params = np.array(individual).reshape(1, -1) + if model["name"] in ["xaj", "xaj_mz"]: + # xaj model's output include streamflow and evaporation now, + # but now we only calibrate the model with streamflow + model = xajBmi() + model.initialize(os.path.relpath('runxaj.yaml'), params, x_input) + while model.get_current_time() <= model.get_end_time('train'): + model.update() + sim = model.get_value("discharge") + sim = np.expand_dims(sim, 0) + sim = np.expand_dims(sim, 1) + sim = np.transpose(sim, [2, 1, 0]) + else: + raise NotImplementedError("We don't provide this model now") + rmses = statRmse(y_true[warmup_length:, :, :], sim) + rmse = rmses.mean(axis=0) + # print(f"-----------------RMSE: {str(rmse)}------------------------") + return rmse + + +def checkBounds(min, max): + """ + A decorator to set bounds for individuals in a population + + Parameters + ---------- + min + the lower bound of individuals + max + the upper bound of individuals + + Returns + ------- + Function + a wrapper for clipping data into a given bound + """ + + def decorator(func): + def wrapper(*args, **kargs): + offspring = func(*args, **kargs) + for child in offspring: + for i in range(len(child)): + if child[i] > max: + child[i] = max + elif child[i] < min: + child[i] = min + return offspring + + return wrapper + + return decorator + + +MIN = 0 +MAX = 1 + + +def calibrate_by_ga( + input_data, observed_output, deap_dir, warmup_length=30, model=None, ga_param=None +): + """ + Use GA algorithm to find optimal parameters for hydrologic models + + Parameters + ---------- + input_data + the input data for model + observed_output + the "true" values, i.e. observations + deap_dir + the directory to save the results + warmup_length + the length of warmup period + model + the model setting + ga_param + random_seed: 1234 + run_counts: int = 40, running counts + pop_num: int = 50, the number of individuals in the population + cross_prob: float = 0.5, the probability with which two individuals are crossed + mut_prob: float=0.5, the probability for mutating an individual + + Returns + ------- + toolbox.population + optimal_params + """ + if model is None: + model = { + "name": "xaj_mz", + "source_type": "sources", + "source_book": "HF", + } + if ga_param is None: + ga_param = { + "random_seed": 1234, + "run_counts": 5, + "pop_num": 50, + "cross_prob": 0.5, + "mut_prob": 0.5, + "save_freq": 1, + } + np.random.seed(ga_param["random_seed"]) + param_num = len(MODEL_PARAM_DICT[model["name"]]["param_name"]) + creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) + creator.create("Individual", list, fitness=creator.FitnessMin) + toolbox = base.Toolbox() + toolbox.register("attribute", random.random) + toolbox.register( + "individual", + tools.initRepeat, + creator.Individual, + toolbox.attribute, + n=param_num, + ) + toolbox.register("population", tools.initRepeat, list, toolbox.individual) + + toolbox.register("mate", tools.cxTwoPoint) + toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1) + toolbox.register("select", tools.selTournament, tournsize=3) + toolbox.register( + "evaluate", + evaluate, + x_input=input_data, + y_true=observed_output, + warmup_length=warmup_length, + model=model, + ) + + toolbox.decorate("mate", checkBounds(MIN, MAX)) + toolbox.decorate("mutate", checkBounds(MIN, MAX)) + pop = toolbox.population(n=ga_param["pop_num"]) + # cxpb is the probability with which two individuals are crossed + # mutpb is the probability for mutating an individual + cxpb, mutpb = ga_param["cross_prob"], ga_param["mut_prob"] + + # save the best individual + halloffame = tools.HallOfFame(maxsize=1) + logbook = tools.Logbook() + stats = tools.Statistics(lambda ind: ind.fitness.values) + stats.register("avg", np.mean) + stats.register("min", np.min) + + # Evaluate the entire population for the first time + print("Initiliazing population...") + fitnesses = map(toolbox.evaluate, pop) + for ind, fit in zip(pop, fitnesses): + ind.fitness.values = fit + halloffame.update(pop) + record = stats.compile(pop) + logbook.record(gen=0, evals=len(pop), **record) + cp = dict( + population=pop, + generation=0, + halloffame=halloffame, + logbook=logbook, + rndstate=random.getstate(), + ) + with open(os.path.join(deap_dir, "epoch0.pkl"), "wb") as cp_file: + pickle.dump(cp, cp_file) + + for gen in tqdm(range(ga_param["run_counts"]), desc="GA calibrating"): + + print(f"Generation {gen} started...") + # Select the next generation individuals + offspring = toolbox.select(pop, len(pop)) + # Clone the selected individuals + offspring = list(map(toolbox.clone, offspring)) + + # Apply crossover and mutation on the offspring + for child1, child2 in zip(offspring[::2], offspring[1::2]): + if random.random() < cxpb: + toolbox.mate(child1, child2) + del child1.fitness.values + del child2.fitness.values + + for mutant in offspring: + if random.random() < mutpb: + toolbox.mutate(mutant) + del mutant.fitness.values + + # Evaluate the individuals with an invalid fitness + invalid_ind = [ind for ind in offspring if not ind.fitness.valid] + fitnesses = map(toolbox.evaluate, invalid_ind) + for ind, fit in tqdm( + zip(invalid_ind, fitnesses), + desc=f"{str(gen + 1)} generation fitness calculating", + ): + ind.fitness.values = fit + + halloffame.update(offspring) + record = stats.compile(offspring) + # +1 means start from 1, 0 means initial generation + logbook.record(gen=gen + 1, evals=len(invalid_ind), **record) + # The population is entirely replaced by the offspring + pop[:] = offspring + print( + f"Best individual of {str(gen + 1)}" + + f" generation is: {halloffame[0]}, {halloffame[0].fitness.values}" + ) + if gen % ga_param["save_freq"] == 0: + # Fill the dictionary using the dict(key=value[, ...]) constructor + cp = dict( + population=pop, + generation=gen + 1, + halloffame=halloffame, + logbook=logbook, + rndstate=random.getstate(), + ) + + with open( + os.path.join(deap_dir, f"epoch{str(gen + 1)}.pkl"), "wb" + ) as cp_file: + pickle.dump(cp, cp_file) + print(f"Files of generation {gen} saved.") + top10 = tools.selBest(pop, k=10) + return pop + + +def show_ga_result( + deap_dir, + warmup_length, + basin_id, + the_data, + the_period, + basin_area, + model_info, + result_unit="mm/day", + train_mode=True, +): + """ + show the result of GA + """ + # https://stackoverflow.com/questions/61065222/python-deap-and-multiprocessing-on-windows-attributeerror + creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) + creator.create("Individual", list, fitness=creator.FitnessMin) + with open(os.path.join(deap_dir, "epoch2.pkl"), "rb") as cp_file: + cp = pickle.load(cp_file) + pop = cp["population"] + logbook = cp["logbook"] + halloffame = cp["halloffame"] + print(f"Best individual is: {halloffame[0]}, {halloffame[0].fitness.values}") + train_test_flag = "train" if train_mode else "test" + + model = xajBmi() + model.initialize("runxaj.yaml", np.array(list(halloffame[0])).reshape(1, -1), the_data[:, :, 0:2]) + while model.get_current_time() <= model.get_end_time('train'): + model.update() + best_simulation = model.get_value("discharge") + + convert_unit_sim = hydro_constant.convert_unit( + np.array(best_simulation).reshape(1, -1), + # best_simulation, + result_unit, + hydro_constant.unit["streamflow"], + basin_area=basin_area, + ) + convert_unit_obs = hydro_constant.convert_unit( + np.array(the_data[warmup_length:, :, -1:]).reshape(1, -1), + result_unit, + hydro_constant.unit["streamflow"], + basin_area=basin_area, + ) + # save calibrated results of calibration period + the_result_file = os.path.join( + deap_dir, + f"{train_test_flag}_qsim_" + model_info["name"] + "_" + str(basin_id) + ".csv", + ) + pd.DataFrame(convert_unit_sim.reshape(-1, 1)).to_csv( + the_result_file, + sep=",", + index=False, + header=False, + ) + # calculation rmse、nashsutcliffe and bias for training period + stat_error = stat.statError( + convert_unit_obs, + convert_unit_sim, + ) + print(f"{train_test_flag}ing metrics:", basin_id, stat_error) + hydro_utils.serialize_json_np( + stat_error, os.path.join(deap_dir, f"{train_test_flag}_metrics.json") + ) + t_range = pd.to_datetime(the_period[warmup_length:]).values.astype("datetime64[D]") + save_fig = os.path.join(deap_dir, f"{train_test_flag}_results.png") + if train_mode: + save_param_file = os.path.join(deap_dir, basin_id + "_calibrate_params.txt") + pd.DataFrame(list(halloffame[0])).to_csv( + save_param_file, sep=",", index=False, header=True + ) + fit_mins = logbook.select("min") + plot_train_iteration(fit_mins, os.path.join(deap_dir, "train_iteration.png")) + plot_sim_and_obs( + t_range, + convert_unit_sim.flatten(), + convert_unit_obs.flatten(), + save_fig, + ) + + +if __name__ == "__main__": + data_dir = os.path.join( + definitions.ROOT_DIR, + "hydromodel", + "example", + "exp004", + ) + deap_dir = os.path.join( + data_dir, + "Dec25_16-33-56_LAPTOP-DNQOPPMS_fold0_HFsources", + "60668", + ) + train_data_info_file = os.path.join(data_dir, "data_info_fold0_train.json") + train_data_file = os.path.join(data_dir, "basins_lump_p_pe_q_fold0_train.npy") + data_train = hydro_utils.unserialize_numpy(train_data_file) + data_info_train = hydro_utils.unserialize_json_ordered(train_data_info_file) + model_info = { + "name": "xaj_mz", + "source_type": "sources", + "source_book": "HF", + } + train_period = data_info_train["time"] + basin_area = data_info_train["area"][0] + + show_ga_result( + deap_dir, + 365, + "60668", + data_train[:, 0:1, :], + train_period, + basin_area, + model_info, + result_unit="mm/day", + ) diff --git a/xaj/calibrate_sceua_xaj_bmi.py b/xaj/calibrate_sceua_xaj_bmi.py new file mode 100644 index 0000000..ac7cf9b --- /dev/null +++ b/xaj/calibrate_sceua_xaj_bmi.py @@ -0,0 +1,209 @@ +from typing import Union +import numpy as np +import spotpy +from spotpy.parameter import Uniform, ParameterSet +from spotpy.objectivefunctions import rmse +from hydromodel.models.model_config import MODEL_PARAM_DICT +from xaj.xaj_bmi import xajBmi + + +class SpotSetup(object): + def __init__( + self, + p_and_e, + qobs, + warmup_length=30, + model={ + "name": "xaj_mz", + "source_type": "sources", + "source_book": "HF", + }, + obj_func=None, + ): + """ + Set up for Spotpy + + Parameters + ---------- + p_and_e + inputs of model + qobs + observation data + warmup_length + GR4J model need warmup period + model + we support "gr4j", "hymod", and "xaj" + model_func_param + parameters of model function + obj_func + objective function, typically RMSE + """ + self.parameter_names = MODEL_PARAM_DICT[model["name"]]["param_name"] + self.model = model + self.params = [] + for par_name in self.parameter_names: + # All parameters' range are [0,1], we will transform them to normal range in the model + self.params.append(Uniform(par_name, low=0.0, high=1.0)) + # Just a way to keep this example flexible and applicable to various examples + self.obj_func = obj_func + # Load Observation data from file + self.p_and_e = p_and_e + # chose observation data after warmup period + self.true_obs = qobs[warmup_length:, :, :] + self.warmup_length = warmup_length + + def parameters(self): + return spotpy.parameter.generate(self.params) + + def simulation(self, x: ParameterSet) -> Union[list, np.array]: + """ + run xaj model + + Parameters + ---------- + x + the parameters of xaj. This function only has this one parameter. + + Returns + ------- + Union[list, np.array] + simulated result from xaj + """ + # Here the model is started with one parameter combination + # parameter, 2-dim variable: [basin=1, parameter] + params = np.array(x).reshape(1, -1) + model = xajBmi() + # xaj model's output include streamflow and evaporation now, + # but now we only calibrate the model with streamflow + + model.initialize('runxaj.yaml', params, self.p_and_e) + while model.get_current_time() <= model.get_end_time('train'): + model.update() + sim=model.get_value("discharge") + sim = np.expand_dims(sim, 0) + sim = np.expand_dims(sim, 1) + sim = np.transpose(sim, [2,1,0]) + return sim[:, 0, 0] + + def evaluation(self) -> Union[list, np.array]: + """ + read observation values + + Returns + ------- + Union[list, np.array] + observation + """ + # TODO: we only support one basin's calibration now + + return self.true_obs[:, 0, 0] + + def objective_function( + self, + simulation: Union[list, np.array], + evaluation: Union[list, np.array], + params=None, + ) -> float: + """ + A user defined objective function to calculate fitness. + + Parameters + ---------- + simulation: + simulation results + evaluation: + evaluation results + params: + parameters leading to the simulation + + Returns + ------- + float + likelihood + """ + # SPOTPY expects to get one or multiple values back, + # that define the performance of the model run + print(simulation.shape, evaluation.shape) + if not self.obj_func: + # This is used if not overwritten by user + like = rmse(evaluation, simulation) + else: + # Way to ensure flexible spot setup class + like = self.obj_func(evaluation, simulation) + return like + + +def calibrate_by_sceua( + p_and_e, + qobs, + dbname, + warmup_length=30, + model={ + "name": "xaj_mz", + "source_type": "sources", + "source_book": "HF", + }, + algorithm={ + "name": "SCE_UA", + "random_seed": 1234, + "rep": 1000, + "ngs": 1000, + "kstop": 500, + "peps": 0.001, + "pcento": 0.001, + }, +): + """ + Function for calibrating model by SCE-UA + + Now we only support one basin's calibration in one sampler + + Parameters + ---------- + p_and_e + inputs of model + qobs + observation data + dbname + where save the result file of sampler + warmup_length + the length of warmup period + model + we support "gr4j", "hymod", and "xaj", parameters for hydro model + calibrate_algo + calibrate algorithm. For example, if you want to calibrate xaj model, + and use sce-ua algorithm -- random seed=2000, rep=5000, ngs=7, kstop=3, peps=0.1, pcento=0.1 + + Returns + ------- + None + """ + random_seed = algorithm["random_seed"] + rep = algorithm["rep"] + ngs = algorithm["ngs"] + kstop = algorithm["kstop"] + peps = algorithm["peps"] + pcento = algorithm["pcento"] + np.random.seed(random_seed) # Makes the results reproduceable + + # Initialize the xaj example + # In this case, we tell the setup which algorithm we want to use, so + # we can use this exmaple for different algorithms + spot_setup = SpotSetup( + p_and_e, + qobs, + warmup_length=warmup_length, + model=model, + obj_func=spotpy.objectivefunctions.rmse, + ) + # Select number of maximum allowed repetitions + sampler = spotpy.algorithms.sceua( + spot_setup, + dbname=dbname, + dbformat="csv", + random_state=random_seed, + ) + # Start the sampler, one can specify ngs, kstop, peps and pcento id desired + sampler.sample(rep, ngs=ngs, kstop=kstop, peps=peps, pcento=pcento) + print("Calibrate Finished!") + return sampler diff --git a/xaj/configuration.py b/xaj/configuration.py new file mode 100644 index 0000000..708f736 --- /dev/null +++ b/xaj/configuration.py @@ -0,0 +1,27 @@ +import yaml +import numpy as np +from xaj.xajmodel import xaj_state as xaj_state + + +def read_config(config_file): + with open(config_file, encoding='utf8') as f: + config = yaml.safe_load(f) + return config + + +def extract_forcing(forcing_data): + # p_and_e_df = forcing_data[["rainfall[mm]", "TURC [mm d-1]"]] + p_and_e_df = forcing_data[["prcp(mm/day)", "petfao56(mm/day)"]] + p_and_e = np.expand_dims(p_and_e_df.values, axis=1) + return p_and_e_df, p_and_e + + +def warmup(p_and_e_warmup, params_state, warmup_length, model_info): + q_sim, es, *w0, w1, w2, s0, fr0, qi0, qg0 = xaj_state( + p_and_e_warmup, + params_state, + warmup_length=warmup_length, + model_info=model_info, + return_state=True, + ) + return q_sim, es, *w0, w1, w2, s0, fr0, qi0, qg0 diff --git a/xaj/constant_unit.py b/xaj/constant_unit.py new file mode 100644 index 0000000..f09eef7 --- /dev/null +++ b/xaj/constant_unit.py @@ -0,0 +1,63 @@ +""" +Author: Wenyu Ouyang +Date: 2022-12-08 09:24:54 +LastEditTime: 2022-12-08 09:51:54 +LastEditors: Wenyu Ouyang +Description: some constant for hydro model +FilePath: /hydro-model-xaj/hydromodel/utils/hydro_constant.py +Copyright (c) 2021-2022 Wenyu Ouyang. All rights reserved. +""" +# unify the unit of each variable +unit = {"streamflow": "m3/s"} +def convert_unit(data, unit_now, unit_final, **kwargs): + """ + convert unit of variable + + Parameters + ---------- + data + data to be converted + unit_now + unit of variable now + unit_final + unit of variable after conversion + **kwargs + other parameters required for conversion + + Returns + ------- + data + data after conversion + """ + if unit_now == "mm/day" and unit_final == "m3/s": + result = mm_per_day_to_m3_per_sec(basin_area=kwargs["basin_area"], q=data) + else: + raise ValueError("unit conversion not supported") + return result + + +def mm_per_day_to_m3_per_sec(basin_area, q): + """ + trans mm/day to m3/s for xaj models + + Parameters + ---------- + basin_area + we need to know the area of a basin so that we can perform this transformation + q + original streamflow data + + Returns + ------- + + """ + # 1 ft3 = 0.02831685 m3 + # ft3tom3 = 2.831685e-2 + # 1 km2 = 10^6 m2 + km2tom2 = 1e6 + # 1 m = 1000 mm + mtomm = 1000 + # 1 day = 24 * 3600 s + daytos = 24 * 3600 + q_trans = q * basin_area * km2tom2 / (mtomm * daytos) + return q_trans diff --git a/xaj/dockerfile b/xaj/dockerfile new file mode 100644 index 0000000..af94fa3 --- /dev/null +++ b/xaj/dockerfile @@ -0,0 +1,13 @@ +FROM ewatercycle/wflow-grpc4bmi +MAINTAINER wangjingyi <1160527180@qq.com> + +# Install grpc4bmi +RUN pip install grpc4bmi==0.2.8 + +# Set environment +WORKDIR /home +ENV BMI_MODULE=bmixaj +ENV BMI_CLASS=Bmixaj +ENV BMI_PORT=55555 +ENTRYPOINT ["run-bmi-server", "--name", "xaj.xaj_bmi.xajBmi", "--path", "/home/wangjingyi/code/hydro-model-xaj/xaj"] +EXPOSE 55555 \ No newline at end of file diff --git a/xaj/params.py b/xaj/params.py new file mode 100644 index 0000000..49f3393 --- /dev/null +++ b/xaj/params.py @@ -0,0 +1,122 @@ +""" +Author: Wenyu Ouyang +Date: 2022-10-25 21:16:22 +LastEditTime: 2022-12-25 16:06:05 +LastEditors: Wenyu Ouyang +Description: some basic config for hydro-model-xaj models +FilePath: \hydro-model-xaj\hydromodel\models\model_config.py +Copyright (c) 2021-2022 Wenyu Ouyang. All rights reserved. +""" +from collections import OrderedDict + +# NOTE: Don't change the parameter settings + +MODEL_PARAM_DICT = { + "xaj": { + "param_name": [ + # Allen, R.G., L. Pereira, D. Raes, and M. Smith, 1998. + # Crop Evapotranspiration, Food and Agriculture Organization of the United Nations, + # Rome, Italy. FAO publication 56. ISBN 92-5-104219-5. 290p. + "K", # ratio of potential evapotranspiration to reference crop evaporation generally from Allen, 1998 + "B", # The exponent of the tension water capacity curve + "IM", # The ratio of the impervious to the total area of the basin + "UM", # Tension water capacity in the upper layer + "LM", # Tension water capacity in the lower layer + "DM", # Tension water capacity in the deepest layer + "C", # The coefficient of deep evapotranspiration + "SM", # The areal mean of the free water capacity of surface soil layer + "EX", # The exponent of the free water capacity curve + "KI", # Outflow coefficients of interflow + "KG", # Outflow coefficients of groundwater + "CS", # The recession constant of channel system + "L", # Lag time + "CI", # The recession constant of the lower interflow + "CG", # The recession constant of groundwater storage + ], + "param_range": OrderedDict( + { + "K": [0.1, 0.1], + "B": [0.1, 0.1], + "IM": [0.1, 0.1], + "UM": [10, 10.0], + "LM": [70.0, 70.0], + "DM": [80.0, 80.0], + "C": [0.1, 0.1], + "SM": [50, 50], + "EX": [1.2, 1.2], + "KI": [0.3, 0.3], + "KG": [0.3, 0.3], + "CS": [0.5, 0.5], + "L": [5.0, 5.0], # unit is day + "CI": [0.5, 0.5], + "CG": [0.98, 0.98], + } + ), + }, + "xaj_mz": { + "param_name": [ + # Allen, R.G., L. Pereira, D. Raes, and M. Smith, 1998. + # Crop Evapotranspiration, Food and Agriculture Organization of the United Nations, + # Rome, Italy. FAO publication 56. ISBN 92-5-104219-5. 290p. + "K", # ratio of potential evapotranspiration to reference crop evaporation generally from Allen, 1998 + "B", # The exponent of the tension water capacity curve + "IM", # The ratio of the impervious to the total area of the basin + "UM", # Tension water capacity in the upper layer + "LM", # Tension water capacity in the lower layer + "DM", # Tension water capacity in the deepest layer + "C", # The coefficient of deep evapotranspiration + "SM", # The areal mean of the free water capacity of surface soil layer + "EX", # The exponent of the free water capacity curve + "KI", # Outflow coefficients of interflow + "KG", # Outflow coefficients of groundwater + "A", # parameter of mizuRoute + "THETA", # parameter of mizuRoute + "CI", # The recession constant of the lower interflow + "CG", # The recession constant of groundwater storage + "KERNEL", # kernel size of mizuRoute unit hydrograph when using convolution method + ], + "param_range": OrderedDict( + { + "K": [0.1, 1.0], + "B": [0.1, 0.4], + "IM": [0.01, 0.1], + "UM": [0.0, 20.0], + "LM": [60.0, 90.0], + "DM": [60.0, 120.0], + "C": [0.0, 0.2], + "SM": [1.0, 100.0], + "EX": [1.0, 1.5], + "KI": [0.0, 0.7], + "KG": [0.0, 0.7], + "A": [0.0, 2.9], + "THETA": [0.0, 6.5], + "CI": [0.0, 0.9], + "CG": [0.98, 0.998], + "KERNEL": [1, 15], + } + ), + }, + "gr4j": { + "param_name": ["x1", "x2", "x3", "x4"], + "param_range": OrderedDict( + { + "x1": [100.0, 1200.0], + "x2": [-5.0, 3.0], + "x3": [20.0, 300.0], + "x4": [1.1, 2.9], + } + ), + }, + "hymod": { + "param_name": ["cmax", "bexp", "alpha", "ks", "kq"], + "param_range": OrderedDict( + { + "cmax": [1.0, 500.0], + "bexp": [0.1, 2.0], + "alpha": [0.1, 0.99], + "ks": [0.001, 0.10], + "kq": [0.1, 0.99], + } + ), + }, +} diff --git a/xaj/xaj_bmi.py b/xaj/xaj_bmi.py new file mode 100644 index 0000000..f8fc628 --- /dev/null +++ b/xaj/xaj_bmi.py @@ -0,0 +1,292 @@ +from typing import Tuple +from bmipy import Bmi +import numpy as np + +from xaj import configuration +from xaj.xajmodel import xaj_route, xaj_runoff +import datetime +import logging + +logger = logging.getLogger(__name__) + +PRECISION = 1e-5 + + +class xajBmi(Bmi): + """Empty model wrapped in a BMI interface.""" + name = "hydro-model-xaj" + input_var_names = ("precipitation", "ETp") + output_var_names = ("ET", "discharge") + var_units = {"precipitation": "mm/day", "ETp": "mm/day", "discharge": "mm/day", "ET": "mm/day"} + + def __init__(self): + """Create a BmiHeat model that is ready for initialization.""" + self.time_step = 0 + + def initialize(self, config_file, params, p_and_e): + try: + logger.info("xaj: initialize_model") + config = configuration.read_config(config_file) + model_name = config['model_name'] + source_type = config['source_type'] + source_book = config['source_book'] + # forcing_data = pd.read_csv(config['forcing_data']) + model_info = { + 'model_name': model_name, + 'source_type': source_type, + 'source_book': source_book, + + } + # p_and_e_df, p_and_e = configuration.extract_forcing(forcing_data) + p_and_e_warmup = p_and_e[0:config['warmup_length'], :, :] + self.q_sim_state, self.es_state, self.w0, self.w1, self.w2, self.s0, self.fr0, self.qi0, self.qg0 = configuration.warmup( + p_and_e_warmup, params, config['warmup_length'], model_info) + + self.params = params + self.warmup_length = config['warmup_length'] + self._start_time_str = config['start_time_str'] + self._end_time_str = config['end_time_str'] + self._time_units = config['time_units'] + # self.p_and_e_df = p_and_e_df + self.p_and_e = p_and_e + self.config = config + self.model_info = model_info + + train_period = config['train_period'] + test_period = config['test_period'] + self.train_start_time_str = train_period[0] + self.train_end_time_str = train_period[1] + self.test_start_time_str = test_period[0] + self.test_end_time_str = test_period[1] + + except: + import traceback + traceback.print_exc() + raise + + def update(self): + """Update model for a single time step.""" + + self.time_step += 1 + p_and_e_sim = self.p_and_e[self.warmup_length:self.time_step + self.warmup_length] + # p_and_e_sim = self.p_and_e[0:self.time_step] + self.runoff_im, self.rss_, self.ris_, self.rgs_, self.es_runoff, self.rss = xaj_runoff(p_and_e_sim, + w0=self.w0, s0=self.s0, + fr0=self.fr0, + params_runoff=self.params, + return_state=False, + model_info=self.model_info, + ) + if self.time_step + self.warmup_length >= self.p_and_e.shape[0]: + q_sim, es = xaj_route(p_and_e_sim, + params_route=self.params, + model_info=self.model_info, + runoff_im=self.runoff_im, + rss_=self.rss_, + ris_=self.ris_, + rgs_=self.rgs_, + rss=self.rss, + qi0=self.qi0, + qg0=self.qg0, + es=self.es_runoff, + ) + self.p_sim = p_and_e_sim[:, :, 0] + self.e_sim = p_and_e_sim[:, :, 1] + # q_sim = convert_unit( + # q_sim, + # unit_now="mm/day", + # unit_final=unit["streamflow"], + # basin_area=float(self.basin_area), + # ) + self.q_sim = q_sim[:, :, :] + self.es = es[:, :, :] + + def update_until(self, time): + while self.get_current_time() + 0.001 < time: + self.update() + + def finalize(self) -> None: + """Finalize model.""" + self.model = None + + def get_component_name(self) -> str: + return "xaj" + + def get_input_item_count(self) -> int: + return len(self.input_var_names) + + def get_output_item_count(self) -> int: + return len(self.output_var_names) + + def get_input_var_names(self) -> Tuple[str]: + return self.input_var_names + + def get_output_var_names(self) -> Tuple[str]: + return self.output_var_names + + def get_var_grid(self, name: str) -> int: + raise NotImplementedError() + + def get_var_type(self, name: str) -> str: + return 'float64' + + def get_var_units(self, name: str) -> str: + return self.var_units[name] + + def get_var_itemsize(self, name: str) -> int: + return np.dtype(self.get_var_type(name)).itemsize + + def get_var_nbytes(self, name: str) -> int: + return self.get_value_ptr(name).nbytes + + def get_var_location(self, name: str) -> str: + raise NotImplementedError() + + def get_start_time(self, period): + if period == 'train': + return self.start_Time(self.train_start_time_str) + if period == 'test': + return self.start_Time(self.test_start_time_str) + # return self.start_Time(self._start_time_str) + + def get_current_time(self): + # return self.start_Time(self._start_time_str) + datetime.timedelta(self.time_step+self.warmup_length) + if self._time_units == 'hours': + time_step = datetime.timedelta(hours=self.time_step) + elif self._time_units == 'days': + time_step = datetime.timedelta(days=self.time_step) + return self.start_Time(self._start_time_str) + time_step + + def get_end_time(self, period): + if period == 'train': + return self.end_Time(self.train_end_time_str) + if period == 'test': + return self.end_Time(self.test_end_time_str) + # return self.end_Time(self._end_time_str) + + def get_time_units(self) -> str: + return self._time_units + + def get_time_step(self) -> float: + return 1 + + def get_value(self, name: str) -> None: + logger.info("getting value for var %s", name) + return self.get_value_ptr(name).flatten() + + def get_value_ptr(self, name: str) -> np.ndarray: + if name == 'discharge': + return self.q_sim + elif name == 'ET': + return self.es + + def get_value_at_indices( + self, name: str, inds: np.ndarray + ) -> np.ndarray: + + return self.get_value_ptr(name).take(inds) + + def set_value(self, name: str, src: np.ndarray): + + val = self.get_value_ptr(name) + val[:] = src.reshape(val.shape) + + def set_value_at_indices( + self, name: str, inds: np.ndarray, src: np.ndarray + ) -> None: + val = self.get_value_ptr(name) + val.flat[inds] = src + + # Grid information + def get_grid_rank(self, grid: int) -> int: + raise NotImplementedError() + + def get_grid_size(self, grid: int) -> int: + raise NotImplementedError() + + def get_grid_type(self, grid: int) -> str: + raise NotImplementedError() + + # Uniform rectilinear + def get_grid_shape(self, grid: int, shape: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_spacing(self, grid: int, spacing: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_origin(self, grid: int, origin: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + # Non-uniform rectilinear, curvilinear + def get_grid_x(self, grid: int, x: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_y(self, grid: int, y: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_z(self, grid: int, z: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_node_count(self, grid: int) -> int: + raise NotImplementedError() + + def get_grid_edge_count(self, grid: int) -> int: + raise NotImplementedError() + + def get_grid_face_count(self, grid: int) -> int: + raise NotImplementedError() + + def get_grid_edge_nodes(self, grid: int, edge_nodes: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_face_edges(self, grid: int, face_edges: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_face_nodes(self, grid: int, face_nodes: np.ndarray) -> np.ndarray: + raise NotImplementedError() + + def get_grid_nodes_per_face( + self, grid: int, nodes_per_face: np.ndarray + ) -> np.ndarray: + raise NotImplementedError() + + def start_Time(self, _start_time_str): + + try: + if " " in _start_time_str: + date, time = _start_time_str.split(" ") + else: + date = _start_time_str + time = None + year, month, day = date.split("-") + self._startTime = datetime.date(int(year), int(month), int(day)) + + if time: + hour, minute, second = time.split(":") + # self._startTime = self._startTime.replace(hour=int(hour), + # minute=int(minute), + # second=int(second)) + self._startTime = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), + int(second)) + except ValueError: + raise ValueError("Invalid start date format!") + + return self._startTime + + def end_Time(self, _end_time_str): + + try: + if " " in _end_time_str: + date, time = _end_time_str.split(" ") + else: + date = _end_time_str + time = None + year, month, day = date.split("-") + self._endTime = datetime.date(int(year), int(month), int(day)) + + if time: + hour, minute, second = time.split(":") + self._endTime = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), int(second)) + except ValueError: + raise ValueError("Invalid start date format!") + return self._endTime diff --git a/xaj/xajmodel.py b/xaj/xajmodel.py new file mode 100644 index 0000000..2027955 --- /dev/null +++ b/xaj/xajmodel.py @@ -0,0 +1,1060 @@ +""" +Core code for XinAnJiang model +""" +import logging +from typing import Union +import numpy as np +from numba import jit +from scipy.special import gamma + +from xaj.params import MODEL_PARAM_DICT + +PRECISION = 1e-5 + + +@jit +def calculate_evap(lm, c, wu0, wl0, prcp, pet) -> tuple[np.array, np.array, np.array]: + """ + Three-layers evaporation model from "Watershed Hydrologic Simulation" written by Prof. RenJun Zhao. + The book is Chinese, and its name is 《流域水文模拟》; + The three-layers evaporation model is described in Page 76; + The method is same with that in Page 22-23 in "Hydrologic Forecasting (5-th version)" written by Prof. Weimin Bao. + This book's Chinese name is 《水文预报》 + + Parameters + ---------- + lm + average soil moisture storage capacity of lower layer + c + coefficient of deep layer + wu0 + initial soil moisture of upper layer; update in each time step + wl0 + initial soil moisture of lower layer; update in each time step + prcp + basin mean precipitation + pet + potential evapotranspiration + + Returns + ------- + tuple[np.array,np.array,np.array] + eu/el/ed are evaporation from upper/lower/deeper layer, respectively + """ + eu = np.where(wu0 + prcp >= pet, pet, wu0 + prcp) + ed = np.where((wl0 < c * lm) & (wl0 < c * (pet - eu)), c * (pet - eu) - wl0, 0.0) + el = np.where( + wu0 + prcp >= pet, + 0.0, + np.where( + wl0 >= c * lm, + (pet - eu) * wl0 / lm, + np.where(wl0 >= c * (pet - eu), c * (pet - eu), wl0), + ), + ) + return eu, el, ed + + +@jit +def calculate_prcp_runoff(b, im, wm, w0, pe) -> tuple[np.array, np.array]: + """ + Calculates the amount of runoff generated from rainfall after entering the underlying surface. + + Same in "Watershed Hydrologic Simulation" and "Hydrologic Forecasting (5-th version)" + + Parameters + ---------- + b + B; exponent coefficient + im + IMP; imperiousness coefficient + wm + average soil moisture storage capacity + w0 + initial soil moisture + pe + net precipitation + + Returns + ------- + tuple[np.array,np.array] + r -- runoff; r_im -- runoff of impervious part + """ + wmm = wm * (1.0 + b) + a = wmm * (1.0 - (1.0 - w0 / wm) ** (1.0 / (1.0 + b))) + if np.isnan(a).any(): + raise ArithmeticError("Please check if w0>wm or b is a negative value!") + r_cal = np.where( + pe > 0.0, + np.where( + pe + a < wmm, + # 1e-5 is a precision which we set to guarantee float's calculation is correct + pe - (wm - w0) + wm * (1.0 - np.minimum(a + pe, wmm) / wmm) ** (1.0 + b), + pe - (wm - w0), + ), + np.full(pe.shape, 0.0), + ) + r = np.maximum(r_cal, 0.0) + # separate impervious part with the other + r_im_cal = pe * im + r_im = np.maximum(r_im_cal, 0.0) + return r, r_im + + +def calculate_w_storage( + um, lm, dm, wu0, wl0, wd0, eu, el, ed, pe, r +) -> tuple[np.array, np.array, np.array]: + """ + Update the soil moisture values of the three layers. + + According to the equation 2.60 in the book《水文预报》 + + Parameters + ---------- + um + average soil moisture storage capacity of the upper layer + lm + average soil moisture storage capacity of the lower layer + dm + average soil moisture storage capacity of the deep layer + wu0 + initial values of soil moisture in upper layer + wl0 + initial values of soil moisture in lower layer + wd0 + initial values of soil moisture in deep layer + eu + evaporation of the upper layer; it isn't used in this function + el + evaporation of the lower layer + ed + evaporation of the deep layer + pe + net precipitation; it is able to be negative value in this function + r + runoff + + Returns + ------- + tuple[np.array,np.array,np.array] + wu,wl,wd -- soil moisture in upper, lower and deep layer + """ + # pe>0: the upper soil moisture was added firstly, then lower layer, and the final is deep layer + # pe<=0: no additional water, just remove evapotranspiration, + # but note the case: e >= p > 0 + # (1) if wu0 + p > e, then e = eu (2) else, wu must be zero + wu = np.where( + pe > 0.0, + np.where(wu0 + pe - r < um, wu0 + pe - r, um), + np.where(wu0 + pe > 0.0, wu0 + pe, 0.0), + ) + # calculate wd before wl because it is easier to cal using where statement + wd = np.where( + pe > 0.0, + np.where(wu0 + wl0 + pe - r > um + lm, wu0 + wl0 + wd0 + pe - r - um - lm, wd0), + wd0 - ed, + ) + # water balance (equation 2.2 in Page 13, also shown in Page 23) + # if wu0 + p > e, then e = eu; else p must be used in upper layer, + # so no matter what the case is, el didn't include p, neither ed + wl = np.where(pe > 0.0, wu0 + wl0 + wd0 + pe - r - wu - wd, wl0 - el) + # the water storage should be in reasonable range + wu_ = np.clip(wu, a_min=0.0, a_max=um) + wl_ = np.clip(wl, a_min=0.0, a_max=lm) + wd_ = np.clip(wd, a_min=0.0, a_max=dm) + return wu_, wl_, wd_ + + +def generation(p_and_e, k, b, im, um, lm, dm, c, wu0=None, wl0=None, wd0=None) -> tuple: + """ + Single-step runoff generation in XAJ. + + Parameters + ---------- + p_and_e + precipitation and potential evapotranspiration + k + ratio of potential evapotranspiration to reference crop evaporation + b + exponent parameter + um + average soil moisture storage capacity of the upper layer + lm + average soil moisture storage capacity of the lower layer + dm + average soil moisture storage capacity of the deep layer + im + impermeability coefficient + c + coefficient of deep layer + wu0 + initial values of soil moisture in upper layer + wl0 + initial values of soil moisture in lower layer + wd0 + initial values of soil moisture in deep layer + + Returns + ------- + tuple[tuple, tuple] + (r, rim, e, pe), (wu, wl, wd); all variables are np.array + """ + # make sure physical variables' value ranges are correct + prcp = np.maximum(p_and_e[:, 0], 0.0) + # get potential evapotranspiration + pet = np.maximum(p_and_e[:, 1] * k, 0.0) + # wm + wm = um + lm + dm + if wu0 is None: + # just an initial value + wu0 = 0.6 * um + if wl0 is None: + wl0 = 0.6 * lm + if wd0 is None: + wd0 = 0.6 * dm + w0_ = wu0 + wl0 + wd0 + + # w0 need locate in correct range so that following calculation could be right + # To make sure float data's calculation is correct, we'd better minus a precision (1e-5) + w0 = np.minimum(w0_, wm - 1e-5) + + # Calculate the amount of evaporation from storage + eu, el, ed = calculate_evap(lm, c, wu0, wl0, prcp, pet) + e = eu + el + ed + + # Calculate the runoff generated by net precipitation + prcp_difference = prcp - e + pe = np.maximum(prcp_difference, 0.0) + r, rim = calculate_prcp_runoff(b, im, wm, w0, pe) + # Update wu, wl, wd + wu, wl, wd = calculate_w_storage( + um, lm, dm, wu0, wl0, wd0, eu, el, ed, prcp_difference, r + ) + + return (r, rim, e, pe), (wu, wl, wd) + + +def sources(pe, r, sm, ex, ki, kg, s0=None, fr0=None, book="HF") -> tuple: + """ + Divide the runoff to different sources + + We use the initial version from the paper of the inventor of the XAJ model -- Prof. Renjun Zhao: + "Analysis of parameters of the XinAnJiang model". Its Chinese name is <<新安江模型参数的分析>>, + which could be found by searching in "Baidu Xueshu". + The module's code can also be found in "Watershed Hydrologic Simulation" (WHS) Page 174. + It is nearly same with that in "Hydrologic Forecasting" (HF) Page 148-149 + We use the period average runoff as input and the unit period is day so we don't need to difference it as books show + + We also provide code for formula from《水文预报》"Hydrologic Forecasting" (HF) the fifth version. Page 40-41 and 150-151; + the procedures in 《工程水文学》"Engineering Hydrology" (EH) the third version are different we also provide. + they are in the "sources5mm" function. + + Parameters + ------------ + pe + net precipitation + r + runoff from xaj_generation + sm + areal mean free water capacity of the surface layer + ex + exponent of the free water capacity curve + ki + outflow coefficients of the free water storage to interflow relationships + kg + outflow coefficients of the free water storage to groundwater relationships + s0 + free water capacity of last period + fr0 + runoff area of last period + + Return + ------------ + tuple[tuple, tuple] + rs -- surface runoff; ri-- interflow runoff; rg -- groundwater runoff; + s1 -- final free water capacity; + all variables are numpy array + + """ + # maximum free water storage capacity in a basin + ms = sm * (1.0 + ex) + if fr0 is None: + fr0 = 0.1 + if s0 is None: + s0 = 0.5 * sm + # For free water storage, because s is related to fr and s0 and fr0 are both values of last period, + # we have to trans the initial value of s from last period to this one. + # both WHS(流域水文模拟)'s sample code and HF(水文预报) use s = fr0 * s0 / fr. + # I think they both think free water reservoir as a cubic tank. Its height is s and area of bottom rectangle is fr + # we will have a cubic tank with varying bottom and height, + # and fixed boundary (in HF sm is fixed) or none-fixed boundary (in EH smmf is not fixed) + # but notice r's list like" [1,0] which 1 is the 1st period's runoff and 0 is the 2nd period's runoff + # after 1st period, the s1 could not be zero, but in the 2nd period, fr=0, then we cannot set s=0, because some water still in the tank + # fr's formula could be found in Eq. 9 in "Analysis of parameters of the XinAnJiang model", + # Here our r doesn't include rim, so there is no need to remove rim from r; this is also the method in 《水文预报》(HF) + + # NOTE: when r is 0, fr should be 0, however, s1 may not be zero and it still hold some water, + # then fr can not be 0, otherwise when fr is used as denominator it lead to error, + # so we have to deal with this case later, for example, when r=0, we cannot use pe * fr to replace r + # because fr get the value of last period, and it is not 0 + fr = np.copy(fr0) + if any(fr == 0.0): + raise ArithmeticError( + "Please check fr's value, fr==0.0 will cause error in the next step!" + ) + # r=0, then r/pe must be 0 + fr_mask = r > 0.0 + fr[fr_mask] = r[fr_mask] / pe[fr_mask] + if np.isnan(fr).any(): + raise ArithmeticError("Please check pe's data! there may be 0.0") + + # if fr=0, then we cannot get ss, but ss should not be 0, because s1 of last period may not be 0 and it still hold some water + ss = np.copy(s0) + # same initialization for s + s = np.copy(s0) + + ss[fr_mask] = fr0[fr_mask] * s0[fr_mask] / fr[fr_mask] + + if book == "HF": + ss = np.minimum(ss, sm) + au = ms * (1.0 - (1.0 - ss / sm) ** (1.0 / (1.0 + ex))) + if np.isnan(au).any(): + raise ValueError( + "Error: NaN values detected. Try set clip function or check your data!!!" + ) + # the first condition should be r > 0.0, when r=0, rs must be 0, fig 6-12 in EH or fig 5-4 in HF + # so we have to use "pe" carefully!!! when r>0.0, we use pe, otherwise we don't use it!!! + rs = np.full(r.shape, 0.0) + rs[fr_mask] = np.where( + pe[fr_mask] + au[fr_mask] < ms[fr_mask], + # equation 2-85 in HF + fr[fr_mask] + * ( + pe[fr_mask] + - sm[fr_mask] + + ss[fr_mask] + + sm[fr_mask] + * ( + ( + 1 + - np.minimum(pe[fr_mask] + au[fr_mask], ms[fr_mask]) + / ms[fr_mask] + ) + ** (1 + ex[fr_mask]) + ) + ), + # equation 2-86 in HF + fr[fr_mask] * (pe[fr_mask] + ss[fr_mask] - sm[fr_mask]), + ) + rs = np.minimum(rs, r) + + # ri's mask is not same as rs's, because last period's s may not be 0 + # and in this time, ri and rg could be larger than 0 + # we need firstly calculate the updated s, s's mask is same as fr_mask, + # when r==0, then s will be equal to last period's + # equation 2-87 in HF, some free water leave or save, so we update free water storage + s[fr_mask] = ss[fr_mask] + (r[fr_mask] - rs[fr_mask]) / fr[fr_mask] + s = np.minimum(s, sm) + if np.isnan(s).any(): + raise ArithmeticError("Please check fr's data! there may be 0.0") + + elif book == "EH": + # smmf should be with correpond with s + smmf = ms * (1 - (1 - fr) ** (1 / ex)) + smf = smmf / (1 + ex) + ss = np.minimum(ss, smf) + au = smmf * (1 - (1 - ss / smf) ** (1 / (1 + ex))) + if np.isnan(au).any(): + raise ValueError( + "Error: NaN values detected. Try set clip function or check your data!!!" + ) + + # rs's mask is keep with fr_mask + rs = np.full(r.shape, 0.0) + rs[fr_mask] = np.where( + pe[fr_mask] + au[fr_mask] < smmf[fr_mask], + ( + pe[fr_mask] + - smf[fr_mask] + + ss[fr_mask] + + smf[fr_mask] + * ( + 1 + - np.minimum(pe[fr_mask] + au[fr_mask], smmf[fr_mask]) + / smmf[fr_mask] + ) + ** (ex[fr_mask] + 1) + ) + * fr[fr_mask], + (pe[fr_mask] + ss[fr_mask] - smf[fr_mask]) * fr[fr_mask], + ) + rs = np.minimum(rs, r) + s[fr_mask] = ss[fr_mask] + (r[fr_mask] - rs[fr_mask]) / fr[fr_mask] + s = np.minimum(s, smf) + else: + raise ValueError("Please set book as 'HF' or 'EH'!") + # the following part is same for both HF and EH. Even the formula is different, but their meaning is same + # equation 2-88 in HF, next interflow and ground water will be released from the updated free water storage + # We use the period average runoff as input and the general unit period is day. + # Hence, we directly use ki and kg rather than ki_{Δt} in books. + ri = ki * s * fr + rg = kg * s * fr + # ri = np.where(s < PRECISION, np.full(r.shape, 0.0), ki * s * fr) + # rg = np.where(s < PRECISION, np.full(r.shape, 0.0), kg * s * fr) + # equation 2-89 in HF; although it looks different with that in WHS, they are actually same + # Finally, calculate the final free water storage + s1 = s * (1 - ki - kg) + # s1 = np.where(s1 < PRECISION, np.full(s1.shape, 0.0), s1) + return (rs, ri, rg), (s1, fr) + + +def sources5mm( + pe, + runoff, + sm, + ex, + ki, + kg, + s0=None, + fr0=None, + time_interval_hours=24, + book="HF", +): + """ + Divide the runoff to different sources according to books -- 《水文预报》HF 5th edition and 《工程水文学》EH 3rd edition + + Parameters + ---------- + pe + net precipitation + runoff + runoff from xaj_generation + sm + areal mean free water capacity of the surface layer + ex + exponent of the free water capacity curve + ki + outflow coefficients of the free water storage to interflow relationships + kg + outflow coefficients of the free water storage to groundwater relationships + s0 + initial free water capacity + fr0 + initial area of generation + time_interval_hours + 由于Ki、Kg、Ci、Cg都是以24小时为时段长定义的,需根据时段长转换 + book + the methods in 《水文预报》HF 5th edition and 《工程水文学》EH 3rd edition are different, + hence, both are provided, and the default is the former -- "ShuiWenYuBao"; + the other one is "GongChengShuiWenXue" + + Returns + ------- + tuple[tuple, tuple] + rs_s -- surface runoff; rss_s-- interflow runoff; rg_s -- groundwater runoff; + (fr_ds[-1], s_ds[-1]): state variables' final value; + all variables are numpy array + """ + # 由于Ki、Kg都是以24小时为时段长定义的,需根据时段长转换 + hours_per_day = 24 + # 非整除情况,时段+1 + residue_temp = hours_per_day % time_interval_hours + if residue_temp != 0: + residue_temp = 1 + period_num_1d = int(hours_per_day / time_interval_hours) + residue_temp + # 当kss+kg>1时,根式为偶数运算时,kss_period会成为复数,这里会报错;另外注意分母可能为0,kss不可取0 + # 对kss+kg的取值进行限制 + kss_period = (1 - (1 - (ki + kg)) ** (1 / period_num_1d)) / (1 + kg / ki) + kg_period = kss_period * kg / ki + + # 流域最大点自由水蓄水容量深 + smm = sm * (1 + ex) + if s0 is None: + s0 = 0.50 * sm + if fr0 is None: + fr0 = 0.1 + # don't use np.where here, because it will cause some warning + fr = np.copy(fr0) + fr_mask = runoff > 0.0 + fr[fr_mask] = runoff[fr_mask] / pe[fr_mask] + if np.all(runoff < 5): + n = 1 + else: + # when modeling multiple basins, the number of divides is not the same, so we use the maximum number + r_max = np.max(runoff) + residue_temp = r_max % 5 + if residue_temp != 0: + residue_temp = 1 + n = int(r_max / 5) + residue_temp + rn = runoff / n + pen = pe / n + kss_d = (1 - (1 - (kss_period + kg_period)) ** (1 / n)) / ( + 1 + kg_period / kss_period + ) + kg_d = kss_d * kg_period / kss_period + # kss_d = kss_period + # kg_d = kg_period + rs = np.full(runoff.shape, 0.0) + rss = np.full(runoff.shape, 0.0) + rg = np.full(runoff.shape, 0.0) + + s_ds = [] + fr_ds = [] + s_ds.append(s0) + fr_ds.append(fr0) + + for j in range(n): + fr0_d = fr_ds[j] + s0_d = s_ds[j] + # equation 5-32 in HF, but strange, cause each period, rn/pen is same, fr_d should be same + # fr_d = 1 - (1 - fr) ** (1 / n) + fr_d = fr + + ss_d = np.copy(s0_d) + s_d = np.copy(s0_d) + s1_d = np.copy(s0_d) + + ss_d[fr_mask] = fr0_d[fr_mask] * s0_d[fr_mask] / fr_d[fr_mask] + + if book == "HF": + ss_d = np.minimum(ss_d, sm) + # ms = smm + au = smm * (1.0 - (1.0 - ss_d / sm) ** (1.0 / (1.0 + ex))) + if np.isnan(au).any(): + raise ValueError( + "Error: NaN values detected. Try set clip function or check your data!!!" + ) + rs_j = np.full(rn.shape, 0.0) + rs_j[fr_mask] = np.where( + pen[fr_mask] + au[fr_mask] < smm[fr_mask], + # equation 5-26 in HF + fr_d[fr_mask] + * ( + pen[fr_mask] + - sm[fr_mask] + + ss_d[fr_mask] + + sm[fr_mask] + * ( + ( + 1 + - np.minimum(pen[fr_mask] + au[fr_mask], smm[fr_mask]) + / smm[fr_mask] + ) + ** (1 + ex[fr_mask]) + ) + ), + # equation 5-27 in HF + fr_d[fr_mask] * (pen[fr_mask] + ss_d[fr_mask] - sm[fr_mask]), + ) + rs_j = np.minimum(rs_j, rn) + s_d[fr_mask] = ss_d[fr_mask] + (rn[fr_mask] - rs_j[fr_mask]) / fr_d[fr_mask] + s_d = np.minimum(s_d, sm) + + elif book == "EH": + smmf = smm * (1 - (1 - fr_d) ** (1 / ex)) + smf = smmf / (1 + ex) + ss_d = np.minimum(ss_d, smf) + au = smmf * (1 - (1 - ss_d / smf) ** (1 / (1 + ex))) + if np.isnan(au).any(): + raise ValueError( + "Error: NaN values detected. Try set clip function or check your data!!!" + ) + rs_j = np.full(rn.shape, 0.0) + rs_j[fr_mask] = np.where( + pen[fr_mask] + au[fr_mask] < smmf[fr_mask], + ( + pen[fr_mask] + - smf[fr_mask] + + ss_d[fr_mask] + + smf[fr_mask] + * ( + 1 + - np.minimum(pen[fr_mask] + au[fr_mask], smmf[fr_mask]) + / smmf[fr_mask] + ) + ** (ex[fr_mask] + 1) + ) + * fr_d[fr_mask], + (pen[fr_mask] + ss_d[fr_mask] - smf[fr_mask]) * fr_d[fr_mask], + ) + rs_j = np.minimum(rs_j, rn) + s_d[fr_mask] = ss_d[fr_mask] + (rn[fr_mask] - rs_j[fr_mask]) / fr_d[fr_mask] + s_d = np.minimum(s_d, smf) + + else: + raise NotImplementedError( + "We don't have this implementation! Please chose 'HF' or 'EH'!!" + ) + rss_j = s_d * kss_d * fr_d + rg_j = s_d * kg_d * fr_d + s1_d = s_d * (1 - kss_d - kg_d) + + rs = rs + rs_j + rss = rss + rss_j + rg = rg + rg_j + # 赋值s_d和fr_d到数组中,以给下一段做初值 + s_ds.append(s1_d) + fr_ds.append(fr_d) + + return (rs, rss, rg), (s_ds[-1], fr_ds[-1]) + + +@jit +def linear_reservoir(x, weight, last_y=None) -> np.array: + """ + Linear reservoir's release function + + Parameters + ---------- + x + the input to the linear reservoir + weight + the coefficient of linear reservoir + last_y + the output of last period + + Returns + ------- + np.array + one-step forward result + """ + weight1 = 1 - weight + if last_y is None: + last_y = np.full(weight.shape, 0.001) + y = weight * last_y + weight1 * x + return y + + +def uh_conv(x, uh_from_gamma): + """ + Function for 1d-convolution calculation + + Parameters + ---------- + x + x is a sequence-first variable; the dim of x is [seq, batch, feature=1]; + feature must be 1 + uh_from_gamma + unit hydrograph from uh_gamma; the dim: [len_uh, batch, feature=1]; + feature must be 1 + + Returns + ------- + np.array + convolution + """ + outputs = np.full(x.shape, 0.0) + time_length, batch_size, feature_size = x.shape + if feature_size > 1: + logging.error("We only support one-dim convolution now!!!") + for i in range(batch_size): + uh = uh_from_gamma[:, i, 0] + inputs = x[:, i, 0] + outputs[:, i, 0] = np.convolve(inputs, uh)[:time_length] + return outputs + + +def uh_gamma(a, theta, len_uh=15): + """ + A simple two-parameter Gamma distribution as a unit-hydrograph to route instantaneous runoff from a hydrologic model + The method comes from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ + + Parameters + ---------- + a + shape parameter + theta + timescale parameter + len_uh + the time length of the unit hydrograph + Returns + ------- + torch.Tensor + the unit hydrograph, dim: [seq, batch, feature] + """ + # dims of a: time_seq (same all time steps), batch, feature=1 + m = a.shape + if len_uh > m[0]: + raise RuntimeError( + "length of unit hydrograph should be smaller than the whole length of input" + ) + # aa > 0, here we set minimum 0.1 (min of a is 0, set when calling this func); First dimension of a is repeat + aa = np.maximum(0.0, a[0:len_uh, :, :]) + 0.1 + # theta > 0, here set minimum 0.5 + theta = np.maximum(0.0, theta[0:len_uh, :, :]) + 0.5 + # len_f, batch, feature + t = np.expand_dims( + np.swapaxes(np.tile(np.arange(0.5, len_uh * 1.0), (m[1], 1)), 0, 1), axis=-1 + ) + denominator = gamma(aa) * (theta**aa) + # [len_f, m[1], m[2]] + w = 1 / denominator * (t ** (aa - 1)) * (np.exp(-t / theta)) + w = w / w.sum(0) # scale to 1 for each UH + return w + + +def xaj_runoff( + p_and_e, + params_runoff: Union[np.array, list], + *w0, s0, fr0, + **kwargs, +) -> Union[tuple, np.array]: + model_name = kwargs["name"] if "name" in kwargs else "xaj" + source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" + source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" + # params + param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] + if model_name == "xaj": + route_method = "CSL" + elif model_name == "xaj_mz": + route_method = "MZ" + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + xaj_params = [ + (value[1] - value[0]) * params_runoff[:, i] + value[0] + for i, (key, value) in enumerate(param_ranges.items()) + ] + k = xaj_params[0] + b = xaj_params[1] + im = xaj_params[2] + um = xaj_params[3] + lm = xaj_params[4] + dm = xaj_params[5] + c = xaj_params[6] + sm = xaj_params[7] + ex = xaj_params[8] + ki_ = xaj_params[9] + kg_ = xaj_params[10] + # ki+kg should be smaller than 1; if not, we scale them + ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) + kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) + + + # w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) + inputs = p_and_e[:, :, :] + runoff_ims_ = np.full(inputs.shape[:2], 0.0) + rss_ = np.full(inputs.shape[:2], 0.0) + ris_ = np.full(inputs.shape[:2], 0.0) + rgs_ = np.full(inputs.shape[:2], 0.0) + es_ = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w0 + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + else: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + # impevious part is pe * im + runoff_ims_[i, :] = rim + # so for non-imprvious part, the result should be corrected + rss_[i, :] = rs * (1 - im) + ris_[i, :] = ri * (1 - im) + rgs_[i, :] = rg * (1 - im) + es_[i, :] = e + # seq, batch, feature + runoff_im = np.expand_dims(runoff_ims_, axis=2) + rss = np.expand_dims(rss_, axis=2) + es = np.expand_dims(es_, axis=2) + return runoff_im, rss_,ris_, rgs_, es,rss + +def xaj_route( + p_and_e, + params_route: Union[np.array, list], + ris_, + rgs_, + rss_, + rss, + runoff_im, + qi0, + qg0, + es, + **kwargs, +)-> Union[tuple, np.array]: + + model_name = kwargs["name"] if "name" in kwargs else "xaj" + source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" + source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" + # params + param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] + if model_name == "xaj": + route_method = "CSL" + elif model_name == "xaj_mz": + route_method = "MZ" + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + xaj_params = [ + (value[1] - value[0]) * params_route[:, i] + value[0] + for i, (key, value) in enumerate(param_ranges.items()) + ] + k = xaj_params[0] + b = xaj_params[1] + im = xaj_params[2] + um = xaj_params[3] + lm = xaj_params[4] + dm = xaj_params[5] + c = xaj_params[6] + sm = xaj_params[7] + ex = xaj_params[8] + ki_ = xaj_params[9] + kg_ = xaj_params[10] + # ki+kg should be smaller than 1; if not, we scale them + ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) + kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) + if route_method == "CSL": + cs = xaj_params[11] + l = xaj_params[12] + + elif route_method == "MZ": + # we will use routing method from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ + a = xaj_params[11] + theta = xaj_params[12] + # make it as a parameter + kernel_size = int(xaj_params[15]) + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + ci = xaj_params[13] + cg = xaj_params[14] + + inputs = p_and_e[:, :, :] + qs = np.full(inputs.shape[:2], 0.0) + if route_method == "CSL": + qt = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs_ = rss_[i] + qt[i, :] = qs_ + qi + qg + + for j in range(len(l)): + lag = int(l[j]) + for i in range(0,lag): + qs[i, j] = qt[i, j] + if i == lag: + break + for i in range(lag, inputs.shape[0]): + qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j] + + elif route_method == "MZ": + rout_a = a.repeat(rss.shape[0]).reshape(rss.shape) + rout_b = theta.repeat(rss.shape[0]).reshape(rss.shape) + conv_uh = uh_gamma(rout_a, rout_b, kernel_size) + qs_ = uh_conv(runoff_im + rss, conv_uh) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs[i, :] = qs_[i, :, 0] + qi + qg + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CSL' or 'MZ'!" + ) + + # seq, batch, feature + q_sim = np.expand_dims(qs, axis=2) + return q_sim, es + +def xaj_state( + p_and_e, + params: Union[np.array, list], + return_state=True, + warmup_length=365, + **kwargs, +) -> Union[tuple, np.array]: + # default values for some function parameters + model_name = kwargs["name"] if "name" in kwargs else "xaj" + source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" + source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" + # params + param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] + if model_name == "xaj": + route_method = "CSL" + elif model_name == "xaj_mz": + route_method = "MZ" + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + xaj_params = [ + (value[1] - value[0]) * params[:, i] + value[0] + for i, (key, value) in enumerate(param_ranges.items()) + ] + k = xaj_params[0] + b = xaj_params[1] + im = xaj_params[2] + um = xaj_params[3] + lm = xaj_params[4] + dm = xaj_params[5] + c = xaj_params[6] + sm = xaj_params[7] + ex = xaj_params[8] + ki_ = xaj_params[9] + kg_ = xaj_params[10] + # ki+kg should be smaller than 1; if not, we scale them + ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) + kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) + if route_method == "CSL": + cs = xaj_params[11] + l = xaj_params[12] + + elif route_method == "MZ": + # we will use routing method from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ + a = xaj_params[11] + theta = xaj_params[12] + # make it as a parameter + kernel_size = int(xaj_params[15]) + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + ci = xaj_params[13] + cg = xaj_params[14] + + + # initialize state values + # if warmup_length > 0: + # p_and_e_warmup = p_and_e[0:warmup_length, :, :] + # _q, _e, *w0, s0, fr0, qi0, qg0 = xaj_state( + # p_and_e_warmup, + # params, + # return_state=True, + # warmup_length=0, + # **kwargs, + # ) + # else: + w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) + s0 = 0.5 * sm + fr0 = np.full(ex.shape, 0.1) + qi0 = np.full(ci.shape, 0.1) + qg0 = np.full(cg.shape, 0.1) + + #state_variables + # inputs = p_and_e[warmup_length:, :, :] + inputs = p_and_e[:, :, :] + runoff_ims_ = np.full(inputs.shape[:2], 0.0) + rss_ = np.full(inputs.shape[:2], 0.0) + ris_ = np.full(inputs.shape[:2], 0.0) + rgs_ = np.full(inputs.shape[:2], 0.0) + es_ = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w0 + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + else: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + # impevious part is pe * im + runoff_ims_[i, :] = rim + # so for non-imprvious part, the result should be corrected + rss_[i, :] = rs * (1 - im) + ris_[i, :] = ri * (1 - im) + rgs_[i, :] = rg * (1 - im) + es_[i, :] = e + # seq, batch, feature + runoff_im = np.expand_dims(runoff_ims_, axis=2) + rss = np.expand_dims(rss_, axis=2) + es = np.expand_dims(es_, axis=2) + + qs = np.full(inputs.shape[:2], 0.0) + + if route_method == "CSL": + qt = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs_ = rss_[i] + qt[i, :] = qs_ + qi + qg + + for j in range(len(l)): + # print(range(len(l))) + lag = int(l[j]) + for i in range(0,lag): + qs[i, j] = qt[i, j] + if i == lag: + break + for i in range(lag, inputs.shape[0]): + # print(inputs.shape[0]) + qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j] + + elif route_method == "MZ": + rout_a = a.repeat(rss.shape[0]).reshape(rss.shape) + rout_b = theta.repeat(rss.shape[0]).reshape(rss.shape) + conv_uh = uh_gamma(rout_a, rout_b, kernel_size) + qs_ = uh_conv(runoff_im + rss, conv_uh) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs[i, :] = qs_[i, :, 0] + qi + qg + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CSL' or 'MZ'!" + ) + + # seq, batch, feature + q_sim = np.expand_dims(qs, axis=2) + if return_state: + return q_sim, es, *w, s, fr, qi, qg From 3a64eca73ec773f55430843e2571fd8aef906e3a Mon Sep 17 00:00:00 2001 From: forestbat Date: Sun, 24 Sep 2023 16:21:38 +0800 Subject: [PATCH 03/19] add requirements.txt --- requirements.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 57a82b9..74513e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,7 @@ seaborn tqdm pytest hydrodataset -bmipy \ No newline at end of file +bmipy +pyyaml +requests +spotpy \ No newline at end of file From 15e90fa6defbd826fdbf31c199e5f520ac2afb37 Mon Sep 17 00:00:00 2001 From: forestbat Date: Mon, 9 Oct 2023 12:02:44 +0800 Subject: [PATCH 04/19] add dmca_esr.py and its test to util directory --- hydromodel/example/division_flow.csv | 9132 ++++++++++++++++++++++++++ hydromodel/example/division_rain.csv | 9132 ++++++++++++++++++++++++++ hydromodel/utils/dmca_esr.py | 223 + setup.py | 12 +- test/test_session_division.py | 35 + 5 files changed, 18528 insertions(+), 6 deletions(-) create mode 100644 hydromodel/example/division_flow.csv create mode 100644 hydromodel/example/division_rain.csv create mode 100644 hydromodel/utils/dmca_esr.py create mode 100644 test/test_session_division.py diff --git a/hydromodel/example/division_flow.csv b/hydromodel/example/division_flow.csv new file mode 100644 index 0000000..23dddb9 --- /dev/null +++ b/hydromodel/example/division_flow.csv @@ -0,0 +1,9132 @@ +flow +0.571000 +0.623000 +1.202000 +1.342000 +0.898000 +0.809000 +1.246000 +1.352000 +1.295000 +1.079000 +2.093000 +2.941000 +1.445000 +1.013000 +0.889000 +1.128000 +2.489000 +1.490000 +1.161000 +2.640000 +1.253000 +1.134000 +1.556000 +2.974000 +1.834000 +5.458000 +2.490000 +3.318000 +3.036000 +6.627000 +7.136000 +5.402000 +4.535000 +3.582000 +2.730000 +4.550000 +2.556000 +2.157000 +5.923000 +4.910000 +2.828000 +2.263000 +2.398000 +2.180000 +2.633000 +2.563000 +2.032000 +1.613000 +3.662000 +2.329000 +6.635000 +7.500000 +3.195000 +1.987000 +1.600000 +2.795000 +3.957000 +5.038000 +3.106000 +2.626000 +2.191000 +1.884000 +2.408000 +3.148000 +2.185000 +1.609000 +1.420000 +1.328000 +1.323000 +1.217000 +1.086000 +0.957000 +1.127000 +1.003000 +0.903000 +1.054000 +0.814000 +0.737000 +0.691000 +0.664000 +0.628000 +0.600000 +0.576000 +0.625000 +0.610000 +0.574000 +0.544000 +0.512000 +0.497000 +0.480000 +0.466000 +0.460000 +0.468000 +0.462000 +0.444000 +0.437000 +0.558000 +0.489000 +0.440000 +0.432000 +0.423000 +0.408000 +0.408000 +0.402000 +0.398000 +0.443000 +0.466000 +0.547000 +0.601000 +0.693000 +0.540000 +0.532000 +0.513000 +0.448000 +0.408000 +0.370000 +0.357000 +0.442000 +0.370000 +0.340000 +0.325000 +0.308000 +0.288000 +0.282000 +0.264000 +0.264000 +0.269000 +0.271000 +0.288000 +0.324000 +0.336000 +0.326000 +0.329000 +0.302000 +0.301000 +0.343000 +0.523000 +0.439000 +0.367000 +0.326000 +0.300000 +0.281000 +0.264000 +0.253000 +0.240000 +0.233000 +0.234000 +0.221000 +0.216000 +0.221000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.217000 +0.216000 +0.250000 +0.275000 +0.281000 +0.252000 +0.240000 +0.219000 +0.216000 +0.211000 +0.192000 +0.192000 +0.192000 +0.192000 +0.193000 +0.192000 +0.357000 +0.510000 +0.430000 +0.331000 +0.283000 +0.273000 +0.274000 +0.243000 +0.233000 +0.340000 +0.518000 +0.387000 +0.361000 +0.871000 +1.293000 +0.594000 +0.520000 +0.770000 +0.459000 +0.360000 +0.297000 +0.264000 +0.248000 +0.231000 +0.224000 +0.216000 +0.214000 +0.192000 +0.192000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.164000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.132000 +0.120000 +0.120000 +0.141000 +0.130000 +0.143000 +0.136000 +0.140000 +0.129000 +0.128000 +0.144000 +0.144000 +0.144000 +0.144000 +0.168000 +0.203000 +0.256000 +0.197000 +0.169000 +0.235000 +0.384000 +0.257000 +0.195000 +0.171000 +0.169000 +0.182000 +0.179000 +0.168000 +0.168000 +0.168000 +0.168000 +0.151000 +0.154000 +0.152000 +0.154000 +0.189000 +0.168000 +0.145000 +0.144000 +0.144000 +0.144000 +0.137000 +0.132000 +0.144000 +0.144000 +0.144000 +0.385000 +0.291000 +0.345000 +0.239000 +0.194000 +0.211000 +0.282000 +0.245000 +0.211000 +0.192000 +0.237000 +0.382000 +0.350000 +0.268000 +0.608000 +0.434000 +1.169000 +2.291000 +0.816000 +0.448000 +0.383000 +0.560000 +1.638000 +0.723000 +0.455000 +0.361000 +0.322000 +0.354000 +0.354000 +0.337000 +1.057000 +1.089000 +0.710000 +0.490000 +0.391000 +0.355000 +0.448000 +1.001000 +0.611000 +1.467000 +1.183000 +2.243000 +1.524000 +0.812000 +0.601000 +0.489000 +0.442000 +0.404000 +0.369000 +0.360000 +0.348000 +0.336000 +0.313000 +0.362000 +0.377000 +0.364000 +0.483000 +0.633000 +3.105000 +1.603000 +1.282000 +1.179000 +0.810000 +0.610000 +0.522000 +0.462000 +0.446000 +1.296000 +1.478000 +0.920000 +0.668000 +0.555000 +0.485000 +0.439000 +0.405000 +0.381000 +0.360000 +0.336000 +0.354000 +2.367000 +3.967000 +3.237000 +3.337000 +4.229000 +3.028000 +1.545000 +1.176000 +0.991000 +1.268000 +1.093000 +0.900000 +0.792000 +2.635000 +2.359000 +4.112000 +2.081000 +1.580000 +3.850000 +5.786000 +2.820000 +5.538000 +3.642000 +2.301000 +3.005000 +6.235000 +6.114000 +3.000000 +2.490000 +4.822000 +6.084000 +2.895000 +3.212000 +3.763000 +4.021000 +3.327000 +2.638000 +1.911000 +1.543000 +1.332000 +1.181000 +1.836000 +3.473000 +2.817000 +3.001000 +1.742000 +1.315000 +1.162000 +1.261000 +1.136000 +0.997000 +0.926000 +0.873000 +0.823000 +0.775000 +0.748000 +0.717000 +0.686000 +0.671000 +0.635000 +0.610000 +0.600000 +0.600000 +0.600000 +0.607000 +0.596000 +0.576000 +0.587000 +0.564000 +0.741000 +1.955000 +2.023000 +1.875000 +1.658000 +1.807000 +4.145000 +6.295000 +6.887000 +10.533000 +9.859000 +5.826000 +3.800000 +4.019000 +4.712000 +3.131000 +2.322000 +2.329000 +5.529000 +5.185000 +3.128000 +3.143000 +3.401000 +2.721000 +2.370000 +1.915000 +1.640000 +1.489000 +1.372000 +1.260000 +1.745000 +2.309000 +3.532000 +5.635000 +3.643000 +2.994000 +1.920000 +1.522000 +1.304000 +1.196000 +1.097000 +1.015000 +0.938000 +0.891000 +0.851000 +0.829000 +1.406000 +3.599000 +1.519000 +1.891000 +1.694000 +1.794000 +2.036000 +1.307000 +1.027000 +0.894000 +0.814000 +0.753000 +0.694000 +0.656000 +0.629000 +0.596000 +0.576000 +0.592000 +0.608000 +0.632000 +0.623000 +0.584000 +0.571000 +0.544000 +0.515000 +0.493000 +0.467000 +0.456000 +0.477000 +0.537000 +0.503000 +0.450000 +0.469000 +0.480000 +0.480000 +0.462000 +0.453000 +0.428000 +0.408000 +0.385000 +0.373000 +0.364000 +0.360000 +0.360000 +0.360000 +0.360000 +0.360000 +0.360000 +0.348000 +0.336000 +0.316000 +0.312000 +0.312000 +0.297000 +0.300000 +0.293000 +0.288000 +0.288000 +0.288000 +0.288000 +0.287000 +0.280000 +0.317000 +0.300000 +0.288000 +0.279000 +0.269000 +0.264000 +0.269000 +1.053000 +1.092000 +0.691000 +0.789000 +0.662000 +0.659000 +0.510000 +0.483000 +0.487000 +0.463000 +0.637000 +0.638000 +0.549000 +0.949000 +0.701000 +0.509000 +0.438000 +0.445000 +0.383000 +0.354000 +0.322000 +0.295000 +0.300000 +0.288000 +0.309000 +0.340000 +0.295000 +0.264000 +0.271000 +0.264000 +0.396000 +0.376000 +0.294000 +0.264000 +0.244000 +0.240000 +0.237000 +0.216000 +0.216000 +0.216000 +0.216000 +0.246000 +0.232000 +0.216000 +0.216000 +0.216000 +0.252000 +0.277000 +0.231000 +0.206000 +0.192000 +0.192000 +0.192000 +0.192000 +0.181000 +0.168000 +0.168000 +0.182000 +0.225000 +0.324000 +0.247000 +0.226000 +0.213000 +0.230000 +0.222000 +0.194000 +0.192000 +0.176000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.199000 +0.215000 +0.177000 +0.168000 +0.168000 +0.168000 +0.153000 +0.145000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.146000 +0.162000 +0.168000 +0.193000 +0.193000 +0.168000 +0.168000 +0.168000 +0.188000 +0.318000 +0.732000 +0.460000 +0.402000 +0.338000 +0.322000 +0.688000 +0.401000 +0.304000 +0.360000 +0.614000 +0.409000 +0.724000 +0.464000 +0.462000 +1.067000 +0.505000 +0.396000 +0.352000 +0.315000 +0.426000 +0.505000 +0.376000 +0.452000 +0.947000 +0.672000 +0.408000 +0.330000 +0.294000 +0.264000 +0.262000 +0.240000 +0.240000 +0.240000 +0.240000 +0.230000 +0.367000 +1.306000 +3.442000 +2.623000 +3.005000 +2.477000 +2.348000 +1.120000 +0.849000 +2.746000 +1.666000 +0.848000 +3.304000 +2.662000 +1.713000 +1.758000 +1.655000 +1.859000 +1.114000 +0.962000 +3.271000 +4.272000 +1.714000 +2.366000 +1.754000 +1.176000 +0.959000 +0.877000 +0.793000 +0.718000 +0.725000 +0.689000 +0.614000 +0.563000 +0.532000 +0.513000 +0.481000 +0.456000 +0.449000 +0.428000 +0.397000 +0.384000 +0.375000 +0.327000 +0.352000 +0.364000 +0.361000 +0.360000 +0.344000 +0.638000 +1.396000 +2.971000 +1.252000 +5.531000 +4.166000 +4.817000 +1.870000 +1.270000 +1.069000 +0.897000 +0.792000 +0.717000 +0.663000 +0.634000 +0.626000 +0.701000 +1.691000 +1.495000 +4.334000 +3.044000 +1.608000 +2.392000 +2.337000 +1.400000 +1.144000 +1.029000 +0.915000 +0.817000 +0.749000 +0.701000 +0.666000 +0.633000 +0.609000 +0.576000 +0.544000 +0.498000 +0.480000 +0.471000 +0.456000 +0.439000 +0.419000 +0.415000 +0.403000 +0.408000 +0.394000 +0.385000 +0.609000 +1.485000 +2.219000 +1.190000 +0.831000 +0.684000 +0.614000 +0.584000 +0.593000 +0.614000 +0.669000 +0.787000 +0.886000 +1.000000 +0.694000 +0.597000 +0.600000 +0.623000 +0.994000 +1.149000 +3.151000 +1.673000 +0.986000 +0.799000 +0.694000 +0.693000 +0.758000 +0.619000 +0.718000 +0.709000 +0.679000 +0.598000 +0.532000 +0.484000 +0.495000 +0.522000 +0.562000 +1.413000 +1.241000 +2.837000 +1.827000 +0.992000 +0.872000 +0.920000 +0.719000 +0.897000 +0.814000 +1.189000 +1.786000 +1.227000 +0.894000 +0.735000 +0.696000 +0.691000 +0.633000 +0.582000 +0.863000 +3.373000 +6.672000 +3.420000 +3.401000 +2.571000 +1.935000 +1.576000 +1.307000 +1.276000 +1.221000 +0.931000 +0.806000 +0.772000 +0.734000 +0.988000 +3.695000 +3.850000 +2.520000 +2.403000 +1.634000 +1.161000 +0.977000 +0.872000 +0.820000 +0.778000 +0.796000 +0.798000 +0.865000 +1.118000 +0.876000 +0.748000 +1.297000 +1.026000 +0.710000 +0.613000 +0.560000 +0.551000 +0.519000 +0.502000 +0.579000 +0.641000 +0.554000 +0.783000 +1.730000 +0.795000 +0.555000 +0.453000 +0.410000 +0.388000 +0.367000 +0.343000 +0.336000 +0.336000 +0.329000 +0.326000 +0.343000 +0.324000 +0.297000 +0.288000 +0.311000 +0.314000 +0.318000 +0.289000 +0.288000 +0.282000 +0.312000 +0.345000 +0.358000 +0.394000 +0.341000 +0.308000 +0.281000 +0.264000 +0.250000 +0.233000 +0.216000 +0.228000 +0.216000 +0.216000 +0.206000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.173000 +0.168000 +0.168000 +0.172000 +0.245000 +0.203000 +0.192000 +0.198000 +0.301000 +0.543000 +0.384000 +0.278000 +0.245000 +0.298000 +0.312000 +0.297000 +0.268000 +0.439000 +0.324000 +0.260000 +0.235000 +0.221000 +0.216000 +0.217000 +0.565000 +0.381000 +0.315000 +0.316000 +0.265000 +0.233000 +0.216000 +0.255000 +0.308000 +0.239000 +0.210000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.209143 +0.226286 +0.468522 +0.766000 +0.471000 +0.329000 +1.010000 +0.724000 +0.399000 +0.307000 +0.264000 +0.245538 +0.240000 +0.225231 +0.214286 +0.199500 +0.216000 +0.216000 +0.216000 +0.252571 +0.544000 +1.156000 +0.939000 +0.655636 +2.666000 +1.120000 +0.619000 +1.120000 +0.804000 +0.482000 +0.380727 +0.958000 +1.158000 +0.683000 +0.806000 +0.506000 +0.481043 +1.206261 +1.275000 +0.736000 +0.654000 +0.510000 +0.404870 +0.384000 +0.364235 +0.406909 +1.580870 +3.152000 +1.241000 +0.787000 +0.655636 +0.600000 +0.535304 +0.482182 +0.457091 +0.731000 +0.655000 +1.364000 +2.010000 +1.113000 +0.776000 +0.621000 +0.534261 +0.482182 +0.439200 +0.405600 +0.384000 +0.368571 +0.360000 +0.384000 +0.480000 +0.397895 +0.369600 +0.355200 +0.336000 +0.336000 +0.314400 +0.312000 +0.312000 +0.370435 +0.598909 +1.122783 +3.213000 +1.902000 +1.286000 +0.878000 +0.703000 +1.870000 +3.358000 +1.279000 +0.915000 +0.736000 +0.747000 +1.072000 +0.722087 +2.470957 +1.835000 +2.095000 +1.341000 +0.926000 +0.793000 +0.999000 +1.478000 +1.104000 +1.301000 +1.187000 +1.672000 +2.298000 +2.909000 +2.665000 +2.170000 +2.755000 +2.249000 +2.060000 +1.656000 +1.518000 +3.928000 +7.559000 +9.963000 +6.200000 +3.454000 +2.372000 +3.319000 +3.686000 +2.463000 +1.857000 +1.556000 +1.808000 +1.587000 +1.356000 +1.264696 +1.218000 +1.150000 +1.760000 +7.064000 +3.545000 +1.948000 +1.404000 +1.190000 +1.061000 +0.953000 +0.865043 +0.844000 +0.923000 +0.849333 +0.762783 +0.701053 +0.684632 +0.651200 +0.614667 +0.606000 +0.712000 +2.522000 +1.407000 +1.332522 +1.473000 +2.651000 +4.211000 +2.474000 +2.200000 +4.987000 +3.316000 +6.465000 +3.958000 +2.584000 +2.955000 +3.076000 +2.477000 +3.792000 +2.491000 +5.135000 +5.309000 +2.621000 +2.145000 +2.106000 +2.327000 +1.846000 +1.524000 +1.365000 +1.242783 +1.137000 +1.058087 +0.985143 +0.980571 +1.030957 +0.990261 +0.948000 +0.960000 +0.944571 +0.893714 +0.827478 +0.783000 +0.753000 +0.709895 +0.688000 +0.653714 +0.650087 +0.614667 +0.588000 +0.545143 +0.559500 +0.552000 +0.534000 +0.553143 +0.606000 +0.567273 +0.544000 +0.663273 +0.824348 +0.740000 +0.677538 +1.238000 +1.149000 +0.837000 +0.707478 +0.641455 +0.591000 +0.576000 +0.582667 +0.589714 +0.532571 +0.501000 +0.583000 +0.569143 +0.710182 +0.564000 +0.505200 +0.604364 +0.539000 +0.494118 +0.525600 +0.483429 +0.438667 +0.421895 +0.408000 +0.409200 +0.437333 +0.500000 +0.477333 +0.430000 +0.559000 +0.668000 +2.867000 +2.244000 +1.042000 +1.355000 +4.157000 +2.239000 +1.369000 +2.038000 +1.527000 +1.069000 +0.895000 +0.816000 +0.741000 +1.348364 +1.484000 +1.051000 +1.035000 +0.808000 +0.968000 +1.286000 +3.891000 +2.038000 +1.264000 +0.999000 +0.845000 +0.751636 +0.682105 +0.625043 +0.582667 +0.543429 +0.524800 +0.504000 +0.480000 +0.458400 +0.477818 +0.542182 +0.557000 +0.504000 +2.663000 +8.637000 +5.222000 +5.092000 +5.287000 +3.063000 +1.804000 +2.208000 +2.190000 +1.423000 +1.128000 +0.965000 +0.864000 +0.812000 +0.797333 +0.757333 +0.737143 +2.186286 +4.308000 +NaN +NaN +0.864000 +NaN +NaN +0.562667 +0.538667 +0.512727 +0.502154 +0.524000 +0.538435 +0.521333 +0.537333 +0.590182 +0.562000 +0.498545 +0.480000 +0.648000 +0.603000 +0.497000 +0.442286 +0.415385 +0.421895 +0.400800 +0.414667 +0.392842 +0.366545 +0.349091 +0.336000 +0.328000 +0.332000 +0.323368 +0.312000 +0.306000 +0.288000 +0.279000 +0.264000 +0.264000 +0.347478 +0.306286 +0.284308 +0.264000 +0.270857 +0.310588 +0.361333 +0.607000 +0.452000 +0.400941 +0.805091 +0.606261 +0.508000 +0.382000 +0.710182 +0.644000 +0.429913 +0.443368 +0.403636 +0.413217 +0.346435 +0.312000 +0.293143 +0.288000 +0.276800 +0.560000 +1.146000 +4.646000 +1.444000 +0.832696 +0.821000 +1.200000 +0.810000 +1.851000 +1.189000 +0.817000 +0.722000 +0.850435 +0.653000 +0.542000 +0.473739 +0.424364 +0.388800 +0.358286 +0.360000 +0.352000 +0.336000 +0.331636 +0.312000 +0.306000 +0.288000 +0.288000 +0.280000 +0.264000 +0.265500 +0.264000 +0.264000 +0.264000 +0.264000 +0.259200 +0.262154 +1.681091 +1.352000 +1.569000 +0.886957 +1.216000 +8.365000 +7.939000 +7.141000 +3.761000 +2.222000 +1.417000 +1.139429 +1.104000 +0.954000 +0.828000 +0.742957 +0.673043 +0.605714 +0.573600 +0.534857 +0.517714 +0.504000 +0.577043 +1.158000 +3.200000 +1.701000 +1.407000 +3.292000 +4.549000 +4.951000 +2.714000 +2.134000 +1.608000 +1.489043 +3.094000 +2.424000 +1.619000 +1.274000 +1.070000 +0.941714 +0.868235 +0.840000 +0.824400 +0.854609 +0.771000 +0.734667 +0.689684 +0.660000 +0.621000 +0.592000 +0.571200 +0.552000 +0.537000 +0.540000 +0.528000 +0.528000 +0.514286 +0.520000 +0.498462 +0.480000 +0.482400 +0.485538 +0.573818 +0.720000 +0.579429 +0.532800 +2.285000 +3.703000 +1.920000 +1.221000 +0.953000 +0.808000 +0.721091 +0.679304 +0.678857 +0.661500 +0.619429 +0.586435 +0.817000 +0.941000 +0.910957 +0.953000 +1.184000 +1.762000 +2.386000 +2.509000 +2.496000 +2.963000 +1.299000 +1.904000 +1.939000 +5.214000 +3.619000 +3.104000 +1.869000 +2.943000 +4.361000 +3.395000 +4.561000 +3.637000 +3.194000 +7.207000 +6.624000 +2.440000 +1.612000 +2.269000 +2.013000 +2.239304 +1.583000 +1.323000 +1.250400 +2.174000 +5.258000 +3.665000 +2.206000 +2.325000 +4.154000 +6.394000 +4.489043 +4.325000 +3.495000 +2.810000 +2.200000 +3.788000 +3.487000 +2.766000 +4.784000 +5.222000 +3.949000 +2.577000 +1.902000 +1.663000 +2.956000 +2.175000 +1.670000 +1.575000 +1.825000 +2.545000 +1.738000 +3.682000 +4.403000 +6.801000 +3.462000 +3.658000 +2.629000 +1.880348 +3.630000 +2.161000 +3.213000 +3.799000 +2.546000 +2.265000 +1.839000 +1.980000 +1.751000 +1.372000 +1.218000 +1.100870 +1.008000 +0.939600 +0.901500 +0.862154 +0.861818 +0.842400 +0.804000 +0.773333 +0.755294 +0.729818 +0.724800 +0.705882 +1.613000 +4.121000 +7.064000 +6.523000 +3.760000 +3.055000 +4.461000 +2.602000 +2.980000 +2.271000 +2.177000 +3.342000 +1.863000 +1.319000 +1.978000 +2.400000 +2.469000 +2.658000 +1.494000 +1.228364 +1.132364 +1.238609 +1.141091 +0.984000 +0.931636 +1.807000 +6.491000 +2.664000 +1.940000 +1.239000 +1.100870 +1.212000 +1.092000 +1.069091 +2.674000 +2.864000 +1.395000 +1.556000 +1.619000 +1.788000 +1.695000 +1.842000 +2.433000 +1.571000 +1.352348 +1.151000 +1.520000 +1.177000 +0.931000 +0.821455 +0.753143 +0.713600 +0.696000 +0.674400 +0.768000 +0.909913 +1.630000 +2.543000 +1.383000 +1.094857 +1.054000 +0.846545 +1.601000 +1.029000 +0.760000 +0.673043 +0.634909 +0.609231 +0.694500 +0.992348 +0.954000 +0.678261 +0.589565 +0.545143 +0.520000 +0.500308 +0.475200 +0.456000 +0.471158 +0.647000 +0.609000 +0.501714 +0.462000 +0.459692 +0.456000 +0.459429 +1.497000 +0.806000 +0.590000 +0.506087 +0.462667 +0.432000 +0.410182 +0.394667 +0.384000 +0.360000 +0.374400 +0.384000 +0.423000 +0.618545 +0.475000 +0.399273 +0.417000 +0.372000 +0.346909 +0.336000 +0.322667 +0.312000 +0.302769 +0.288000 +0.288000 +0.288000 +0.288000 +0.288000 +0.329600 +0.356400 +0.560000 +0.501000 +0.354545 +0.332571 +0.344000 +0.329000 +0.351600 +0.330000 +0.276000 +0.259200 +0.240000 +0.240000 +0.240000 +0.240000 +0.237333 +0.240000 +0.240000 +0.240000 +0.232000 +0.216000 +0.216000 +0.216000 +0.216000 +0.208000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.192000 +0.212000 +0.282286 +0.248727 +0.235500 +0.248471 +0.220364 +0.204000 +0.242824 +0.282783 +0.255158 +0.217600 +0.221143 +0.335000 +0.308000 +0.243692 +0.225600 +0.216000 +0.195692 +0.201231 +0.216000 +0.195000 +0.192000 +0.192000 +0.185143 +0.202909 +0.249333 +0.428000 +0.284000 +0.235765 +0.216000 +0.196364 +0.224000 +0.531273 +0.988000 +0.429000 +0.363600 +0.317000 +0.276000 +0.253895 +0.361000 +0.857000 +0.416000 +0.312000 +0.288000 +0.336000 +0.315429 +0.406957 +0.378545 +0.486857 +1.080000 +1.306000 +2.024000 +1.362783 +1.600000 +2.312000 +1.028000 +0.635000 +0.516522 +0.475765 +0.569333 +0.800000 +0.531000 +0.426000 +0.665739 +2.004000 +0.907000 +0.617000 +0.500000 +0.432000 +0.394000 +0.435000 +1.338000 +1.901000 +0.885000 +0.672000 +0.545739 +0.476400 +0.457263 +0.421333 +0.392000 +0.364500 +0.346909 +0.336000 +0.322667 +0.312000 +0.322286 +0.325333 +0.312000 +0.429000 +1.155000 +0.981000 +2.642000 +3.444000 +1.419130 +1.323000 +1.208000 +0.909000 +0.754909 +0.702000 +0.926182 +1.928000 +1.130000 +0.788400 +1.348000 +1.982000 +3.420000 +1.749000 +1.146000 +0.980727 +1.586000 +1.407000 +1.243826 +3.009000 +5.018000 +5.158000 +3.455000 +2.010000 +1.856000 +2.575000 +3.927000 +3.371000 +1.911000 +1.387000 +1.180000 +1.082000 +0.956727 +0.876571 +0.800348 +0.744000 +0.701053 +0.660632 +0.632571 +0.637200 +1.556000 +4.207000 +3.666000 +3.151000 +4.216000 +4.807000 +2.479000 +3.823000 +4.905000 +3.825000 +4.127000 +2.700000 +1.984000 +1.786000 +2.729739 +2.998000 +2.335000 +1.567000 +1.254000 +1.070182 +0.987000 +1.148727 +1.329000 +3.310000 +3.940000 +8.106000 +7.976000 +6.270000 +4.494000 +2.621000 +1.744000 +1.412000 +1.489000 +4.076000 +2.508000 +1.954000 +2.160000 +1.854000 +3.401000 +2.462000 +1.517000 +1.383000 +1.555000 +1.522000 +1.596522 +3.497000 +2.664000 +2.750000 +2.802000 +5.341000 +4.202000 +3.821000 +2.751000 +2.891000 +3.404000 +3.131000 +7.540000 +6.631000 +4.956000 +10.168000 +9.761000 +6.353000 +5.009000 +3.226000 +2.387000 +2.064000 +1.978435 +1.899000 +1.724870 +2.478000 +6.516000 +5.613000 +4.439000 +3.829333 +NaN +4.658400 +3.440000 +3.926000 +3.767000 +3.886000 +3.386000 +8.074000 +6.033000 +3.147000 +2.299000 +1.811000 +2.285000 +3.902000 +3.281000 +1.922000 +1.540364 +1.450286 +2.173000 +1.699000 +1.491130 +1.384800 +1.423304 +2.387000 +3.162000 +1.815273 +1.537000 +1.507826 +1.231000 +1.408364 +2.284000 +2.215000 +1.570000 +1.203000 +1.062545 +1.116522 +1.167652 +1.369000 +1.515000 +2.300000 +1.748000 +1.291636 +1.307000 +2.302000 +1.771000 +1.308000 +1.089000 +0.963000 +0.881600 +0.818286 +0.770667 +0.714667 +0.677143 +0.660800 +0.636000 +0.604235 +0.572308 +0.552000 +0.548308 +0.532800 +0.528000 +0.553333 +0.568800 +0.552000 +0.559579 +0.522000 +0.839000 +1.151000 +0.899478 +0.720000 +0.598957 +0.545455 +0.512000 +0.487200 +0.480000 +0.458182 +0.453333 +0.432000 +0.432000 +0.420000 +0.432000 +0.421091 +0.408000 +0.408000 +0.408000 +0.408000 +0.399429 +0.384000 +0.384000 +0.384000 +0.441000 +0.505200 +0.477176 +0.484500 +0.432000 +0.391200 +0.381000 +0.368000 +0.504000 +0.625091 +0.485455 +0.454737 +0.608348 +0.541000 +0.474667 +0.422182 +0.393143 +0.379200 +0.392842 +0.397714 +0.375000 +0.352000 +0.357000 +0.336000 +0.316000 +0.324000 +0.336000 +0.315429 +0.310588 +0.288000 +0.288000 +0.288000 +0.294400 +0.288000 +0.282000 +0.300706 +0.334957 +0.289043 +0.264000 +0.264000 +0.264000 +0.251294 +0.240000 +0.224000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.225600 +0.229714 +0.216000 +0.266087 +0.246316 +0.219200 +0.216000 +0.222857 +0.309818 +0.276000 +0.242667 +0.240000 +0.240000 +0.240000 +0.240000 +0.241143 +0.228000 +0.216000 +0.216000 +0.209143 +0.192000 +0.192000 +0.192000 +0.184000 +0.168000 +0.168000 +0.168000 +0.168000 +0.162000 +0.147000 +0.153000 +0.168000 +0.162667 +0.160000 +0.144000 +0.144000 +0.146000 +0.151385 +0.168000 +0.168000 +0.160615 +0.146667 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.136800 +0.125143 +0.141600 +0.142400 +0.150545 +0.145714 +0.144000 +0.144000 +0.144000 +0.144000 +0.144000 +0.156923 +0.178800 +0.176727 +0.168000 +0.210947 +0.548000 +0.549913 +0.384000 +0.418286 +0.609391 +0.413000 +0.328421 +0.284727 +0.248842 +0.231429 +0.240000 +0.222857 +0.216000 +0.192000 +0.192000 +0.192000 +0.192000 +0.325895 +0.332000 +0.404870 +0.293714 +0.275368 +0.248842 +0.230400 +0.216000 +0.282545 +0.412000 +0.848727 +0.646000 +1.685000 +0.793000 +0.597000 +0.414000 +0.338087 +0.298800 +0.275077 +0.257455 +0.240000 +0.227200 +0.227294 +0.294667 +0.392000 +0.290286 +0.296000 +0.273143 +0.241412 +0.238800 +0.262588 +0.567000 +0.455000 +0.345333 +0.307429 +0.274105 +0.258000 +0.240000 +0.225600 +0.224000 +0.216000 +0.209143 +0.201600 +0.192000 +0.193846 +0.216000 +0.216000 +0.248348 +1.531000 +1.124000 +0.564000 +0.459000 +1.734000 +2.764000 +1.042000 +0.694000 +0.579130 +0.547826 +0.619000 +0.654261 +0.848000 +2.300000 +1.253217 +0.946000 +0.753818 +0.690286 +0.628800 +0.562000 +0.500727 +0.529714 +0.880696 +1.080000 +0.826000 +0.867000 +0.800000 +0.674000 +0.603429 +1.043478 +0.746000 +0.618545 +0.584727 +0.584000 +0.592615 +0.596571 +0.566000 +0.506526 +0.480000 +0.469714 +0.592364 +3.156000 +2.395000 +1.292000 +0.872000 +0.704348 +0.627000 +0.538435 +0.558857 +0.504000 +0.540706 +0.644000 +0.640000 +0.786286 +1.292727 +2.030857 +2.257000 +3.272000 +3.423000 +2.634000 +1.560000 +1.722783 +2.189000 +3.180000 +1.685000 +1.217000 +1.029000 +0.921391 +0.837000 +0.786667 +0.785143 +0.745200 +0.699429 +0.652571 +0.601091 +0.553333 +0.528000 +0.528000 +0.528000 +0.537000 +0.602000 +0.670400 +0.651692 +0.664000 +0.816000 +0.818000 +0.705391 +0.616500 +0.549913 +0.560842 +1.454000 +3.486000 +5.778000 +7.412000 +5.683000 +3.534000 +3.523000 +4.322000 +3.074000 +3.169000 +1.760000 +1.375000 +1.339429 +2.178000 +2.228000 +3.202000 +2.314000 +1.582000 +1.325000 +1.180800 +1.111200 +1.204364 +1.555000 +1.720696 +1.438000 +1.130000 +1.001739 +0.977600 +0.900706 +0.822857 +0.779294 +0.826667 +0.848471 +0.783600 +0.780000 +0.826909 +1.060571 +1.142118 +1.085143 +1.116706 +1.089000 +1.193739 +1.420000 +1.405565 +1.373714 +1.178526 +1.036174 +0.925714 +0.857684 +0.795000 +0.726316 +0.682500 +0.640941 +0.606400 +0.578000 +0.560000 +0.555200 +0.548211 +0.528000 +0.523200 +0.589714 +0.557714 +0.528000 +0.519429 +0.488000 +0.458400 +0.460800 +0.480000 +0.483789 +0.751579 +0.658000 +0.519652 +0.471529 +0.520000 +1.290000 +1.148727 +0.962286 +0.745000 +0.657818 +0.576000 +0.536400 +0.621818 +2.180000 +2.324000 +1.128000 +0.816000 +0.688364 +0.609391 +0.554286 +0.515077 +0.482526 +0.492000 +0.540800 +0.620211 +0.592364 +0.499826 +0.459200 +0.432000 +0.432000 +0.432000 +0.434667 +0.512400 +0.502000 +0.597176 +0.770000 +0.597714 +0.484174 +0.516706 +0.841000 +0.584000 +0.708000 +0.789818 +0.634000 +0.493565 +0.470609 +0.408000 +0.402000 +0.377333 +0.360000 +0.449739 +0.378783 +0.336000 +0.316000 +0.321600 +0.312000 +0.296571 +0.282667 +0.264000 +0.264000 +0.252000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.233455 +0.216000 +0.216000 +0.234353 +0.246316 +0.262857 +0.240000 +0.252632 +0.282783 +0.271000 +0.354783 +0.809000 +0.530000 +0.358000 +0.339000 +0.305333 +0.274909 +0.246000 +0.240000 +0.222000 +0.216000 +0.208941 +0.192000 +0.192000 +0.192000 +0.188000 +0.171692 +0.168000 +0.168000 +0.160000 +0.216000 +0.234000 +0.192000 +0.192000 +0.168000 +0.192000 +0.192000 +0.213714 +0.205565 +0.192000 +0.189000 +0.168000 +0.168000 +0.177882 +0.210783 +0.209455 +0.198667 +0.213000 +0.266286 +0.353000 +0.271000 +0.227000 +0.202286 +0.192000 +0.180706 +0.168000 +0.168000 +0.168000 +0.168000 +0.181091 +0.213600 +0.218526 +0.305000 +0.276000 +0.475826 +1.170000 +0.889000 +0.618000 +0.415000 +0.334000 +0.298909 +0.301500 +0.288000 +0.264000 +0.248348 +0.231529 +0.216000 +0.216000 +0.193200 +0.192000 +0.192000 +0.192000 +0.177600 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.168000 +0.172571 +0.414000 +1.891000 +0.811000 +0.452000 +0.336000 +0.612000 +0.841000 +0.581000 +0.394000 +0.342545 +0.312000 +0.288000 +0.261000 +0.240000 +0.226667 +0.216000 +0.216000 +0.244571 +0.462000 +0.486000 +0.464000 +0.595000 +0.511000 +0.623000 +0.405000 +0.344000 +0.331200 +0.394000 +2.031000 +2.631000 +1.992000 +1.109000 +0.643000 +0.802000 +0.890000 +1.400000 +1.214000 +2.120000 +3.018000 +3.690000 +1.606000 +1.008000 +0.960000 +0.751000 +1.983000 +3.136000 +1.132000 +0.853000 +0.716870 +0.643826 +0.807000 +0.704348 +0.698000 +0.879000 +0.689455 +0.712696 +0.643826 +0.637565 +1.921000 +1.863000 +1.049000 +0.815000 +1.218000 +2.309000 +3.683000 +2.109000 +2.805000 +2.666000 +1.534000 +1.065000 +0.871000 +1.455000 +1.263000 +0.936000 +0.810000 +0.745143 +0.677000 +0.619000 +0.825000 +0.812870 +0.712696 +2.050000 +5.853000 +3.333000 +1.704000 +1.207000 +1.027000 +0.885000 +0.784696 +0.720000 +0.708522 +0.747000 +0.893000 +1.139000 +0.942000 +0.802435 +0.744000 +0.685000 +0.633818 +0.600000 +0.614857 +0.626400 +0.609143 +0.574857 +0.552000 +1.091000 +4.256000 +2.015000 +1.088000 +0.828000 +0.731000 +0.681818 +0.686609 +0.636571 +0.592000 +0.559304 +0.548727 +0.524400 +0.526400 +0.696000 +0.581000 +0.520800 +0.494400 +0.466667 +0.453176 +0.432000 +0.448000 +0.432000 +1.635130 +4.537000 +1.381000 +1.325000 +1.735000 +0.927000 +1.269000 +3.539000 +2.524000 +4.104000 +2.301000 +1.221000 +0.946000 +1.783000 +5.928000 +6.225000 +7.360000 +9.342000 +8.267000 +3.968000 +3.865000 +4.004000 +5.647000 +3.822000 +3.332000 +3.615000 +3.342000 +4.567000 +1.963000 +1.453000 +1.425000 +1.326000 +1.091000 +0.966000 +0.898000 +0.874435 +0.806609 +0.758000 +0.727000 +0.821000 +0.748000 +0.686857 +0.661000 +0.762000 +0.792000 +0.673000 +0.611478 +0.608400 +0.905000 +0.776348 +0.701000 +1.059000 +1.299000 +1.051000 +0.690000 +0.581000 +0.530087 +0.497000 +0.476727 +0.445714 +0.450783 +0.440571 +0.469895 +0.447600 +0.426667 +0.408000 +0.382000 +0.360000 +0.360000 +0.360000 +0.357176 +0.336000 +0.336000 +0.336000 +0.334667 +0.314000 +0.325333 +0.314182 +0.312000 +0.312000 +0.324632 +0.344471 +0.386087 +0.377455 +0.394000 +0.496000 +0.375273 +0.326609 +0.302182 +0.316174 +0.822000 +3.859000 +1.334000 +0.786545 +0.919000 +0.854000 +0.832000 +1.005000 +1.086000 +1.131000 +0.679000 +0.523000 +0.505000 +0.697000 +0.568000 +0.552000 +0.528000 +0.495000 +0.432000 +0.387000 +0.360000 +0.336000 +0.318316 +0.309176 +0.288000 +0.283765 +0.264000 +0.257684 +0.247636 +0.240000 +0.240000 +0.240000 +0.254609 +0.266400 +0.264000 +0.274286 +0.255273 +0.262588 +0.724364 +0.838000 +0.513000 +0.415000 +0.370667 +0.341647 +0.326667 +0.294667 +0.308727 +0.324000 +0.389455 +0.734000 +0.536000 +0.420000 +2.084000 +4.143000 +2.196000 +4.670000 +3.005000 +2.144000 +1.919000 +1.629000 +1.882000 +1.286000 +0.992000 +0.763000 +0.642000 +0.571429 +1.156000 +0.853000 +0.585000 +0.555000 +0.681000 +0.539000 +0.475826 +0.449739 +0.426286 +0.408000 +0.384000 +0.360000 +0.346286 +0.336000 +0.346800 +0.401000 +0.399000 +0.412174 +0.547000 +0.419478 +0.381714 +0.351652 +0.374182 +0.389217 +0.367200 +0.329739 +0.309600 +0.288000 +0.280800 +0.264000 +0.264000 +0.246857 +0.240000 +0.240000 +0.240000 +0.425739 +0.502000 +0.327000 +0.278400 +0.264000 +0.252000 +0.240000 +0.242824 +0.262957 +0.240000 +0.260000 +0.291429 +0.300522 +0.264000 +0.264000 +0.306000 +0.300522 +0.310857 +0.535000 +0.685000 +0.484000 +0.671000 +0.687000 +0.484000 +0.393000 +0.416000 +0.347000 +0.294857 +0.267600 +0.264000 +0.242526 +0.240000 +0.240000 +0.702000 +1.967000 +1.114000 +0.482000 +0.371000 +0.340174 +0.298909 +0.271500 +0.251200 +0.240000 +0.229714 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.208421 +0.196571 +0.192000 +0.192000 +0.192000 +0.201143 +0.290400 +0.646000 +0.830000 +1.079000 +0.573000 +0.399000 +0.325714 +0.324000 +0.365714 +0.651000 +0.563000 +0.403000 +0.336000 +0.297000 +0.284000 +0.262800 +0.240000 +0.240000 +0.219000 +0.216000 +0.216000 +0.206118 +0.196364 +0.193333 +0.202286 +0.216000 +0.212000 +0.216000 +0.216000 +0.232000 +0.253200 +0.289043 +0.447000 +0.554000 +0.532174 +0.502000 +0.412571 +0.352696 +0.329143 +0.361000 +0.419478 +0.603130 +1.011130 +1.519000 +3.469000 +1.843000 +0.871000 +0.696000 +0.849000 +0.726000 +0.768000 +1.308000 +2.143000 +3.894000 +2.282000 +1.226000 +0.903000 +0.788000 +0.729000 +0.701000 +1.215000 +0.924000 +2.073000 +3.300000 +5.302000 +4.981000 +2.493000 +1.421000 +1.110000 +0.973000 +0.879000 +0.839000 +2.590000 +4.343000 +3.624000 +2.347000 +1.605000 +2.043000 +5.175000 +6.929000 +5.043000 +2.664000 +2.320000 +1.756000 +2.395000 +2.994000 +4.708000 +5.525000 +6.833000 +5.380000 +3.705000 +2.881000 +3.992000 +7.710000 +8.233000 +4.391000 +2.725000 +2.212000 +3.218000 +3.942000 +3.799000 +3.414000 +2.966000 +6.109000 +4.908000 +3.199000 +2.857000 +3.233000 +2.622000 +2.331000 +1.853000 +1.563000 +1.389000 +1.250087 +1.176000 +1.099000 +1.068000 +1.023652 +0.956727 +0.901000 +0.871000 +0.867000 +0.944000 +1.193000 +1.066000 +1.219000 +1.651000 +3.490000 +1.881000 +1.223000 +1.003000 +0.879000 +0.890000 +0.858000 +0.760364 +0.707478 +0.691000 +0.685091 +0.727304 +0.661000 +0.600000 +0.575000 +0.558000 +0.656000 +0.780522 +0.859000 +3.682000 +5.242000 +4.691000 +3.062000 +5.029000 +7.525000 +3.666000 +2.066000 +3.211000 +2.953000 +2.104000 +1.795000 +1.351000 +1.175000 +1.051000 +0.948000 +0.859000 +0.800000 +0.761143 +0.726545 +0.698182 +0.690947 +0.732000 +0.772000 +1.845000 +1.000000 +0.789000 +0.990000 +1.219000 +0.860727 +0.780522 +3.059000 +5.267000 +5.714000 +4.806000 +3.078000 +2.622000 +4.396000 +4.429000 +5.163000 +4.598000 +2.883000 +1.914000 +1.436000 +1.239000 +1.190000 +1.160348 +1.091000 +1.021091 +0.975652 +1.032000 +2.970000 +3.511000 +1.869000 +1.438909 +1.355000 +1.632000 +NaN +1.366000 +1.131000 +0.976364 +0.882783 +0.819429 +0.764727 +0.734118 +0.754909 +0.922000 +1.141000 +0.802000 +0.700800 +0.896000 +0.848000 +0.692000 +0.614400 +0.560842 +0.519529 +0.490667 +0.473143 +0.456000 +0.450857 +0.432000 +0.432000 +0.426353 +0.408000 +0.405600 +0.387692 +0.408000 +0.524870 +0.983000 +0.688696 +0.581000 +0.531692 +NaN +NaN +NaN +NaN +NaN +NaN +1.656000 +NaN +NaN +NaN +NaN +1.296000 +NaN +2.544000 +NaN +NaN +NaN +NaN +NaN +NaN +0.684571 +0.657600 +0.745091 +0.735652 +0.973565 +1.311000 +0.913000 +0.670000 +0.598857 +0.557053 +0.519429 +0.490800 +0.467294 +0.452571 +0.432000 +0.432000 +0.439200 +0.420000 +0.408000 +0.421500 +0.565000 +0.633000 +0.545000 +0.451200 +0.475429 +0.561391 +0.646000 +0.552000 +NaN +NaN +NaN +NaN +NaN +0.474783 +0.429333 +0.408000 +0.416000 +0.433500 +0.708000 +0.984000 +NaN +0.646957 +1.013000 +0.738000 +0.510000 +0.440842 +0.483130 +0.506000 +0.438261 +0.394800 +0.361412 +0.336000 +0.336000 +0.340800 +0.484000 +0.382909 +0.942000 +0.505000 +0.387273 +0.360000 +0.514435 +0.428571 +0.385714 +0.628000 +0.505091 +0.855000 +0.508000 +0.403000 +0.353143 +0.329455 +0.312000 +NaN +NaN +0.563000 +0.455000 +0.398609 +0.372000 +0.354667 +0.640000 +1.545000 +1.610000 +0.726000 +0.595429 +0.546000 +0.443000 +0.394105 +0.352941 +0.336000 +0.316364 +0.325895 +0.312000 +0.297600 +0.288000 +0.288000 +0.288000 +0.282000 +0.276000 +0.288000 +0.330000 +0.376364 +1.062857 +1.202087 +0.919304 +0.620000 +0.660571 +1.499000 +1.136000 +0.693000 +0.544000 +0.489600 +0.502857 +0.463500 +0.605000 +0.881000 +1.120000 +0.645000 +4.220000 +3.791000 +1.529000 +0.969818 +2.144348 +4.662000 +3.761000 +4.173000 +7.679000 +6.399000 +3.097000 +5.942000 +5.238000 +3.921000 +2.885000 +1.632000 +1.246000 +3.488000 +7.261000 +4.290000 +2.904000 +2.258000 +2.322000 +4.115000 +3.952000 +2.589000 +1.778000 +2.921000 +2.680000 +1.826000 +1.548000 +1.229000 +1.096696 +1.200000 +1.231000 +1.050000 +0.974609 +1.150000 +1.239000 +1.199000 +1.070000 +1.429000 +1.156000 +1.929000 +1.199000 +0.989000 +0.930545 +0.885913 +0.895000 +0.947000 +0.795000 +0.705391 +0.828000 +1.459000 +1.226000 +1.179000 +1.167000 +1.848000 +NaN +NaN +NaN +1.144000 +1.001000 +1.111000 +1.274000 +0.922000 +0.777600 +0.745333 +0.892174 +1.180000 +2.130000 +3.534000 +2.840000 +1.958000 +1.625000 +1.966000 +1.287000 +1.341000 +3.416000 +3.083000 +3.117000 +5.654000 +5.323000 +4.142000 +4.820000 +3.245000 +2.120000 +1.534000 +1.348000 +2.128000 +4.390000 +7.970000 +6.484000 +3.281000 +4.161000 +4.884000 +3.409000 +2.375000 +1.759000 +1.579000 +2.941000 +4.433000 +2.961000 +2.379000 +2.545000 +1.811000 +1.632000 +1.394000 +1.244000 +1.141000 +1.085000 +1.332000 +1.096000 +1.003826 +0.922000 +0.810000 +0.730000 +0.691826 +0.683478 +0.699429 +0.696000 +0.701217 +0.713739 +0.678000 +0.786783 +1.343000 +1.234000 +0.828000 +1.166000 +0.834000 +0.686609 +0.633391 +0.632000 +0.783000 +0.774545 +2.757000 +1.990000 +4.319000 +6.753000 +4.696000 +5.028000 +5.198000 +6.329000 +4.339000 +4.657000 +3.731000 +2.749000 +3.187000 +2.642000 +1.859000 +1.474000 +1.374000 +1.187000 +1.044000 +0.941000 +0.918000 +1.577000 +1.083000 +0.953739 +1.083000 +1.367000 +1.099000 +0.899000 +0.805091 +0.973091 +0.827478 +0.721200 +0.672000 +0.631636 +0.606667 +0.585000 +0.619826 +0.870000 +0.673000 +0.594000 +0.563000 +0.613000 +1.005000 +1.378000 +1.044000 +0.841000 +0.857000 +0.933000 +0.839000 +0.825600 +0.960000 +4.558000 +3.533000 +2.874000 +1.580000 +1.276000 +1.047000 +0.897000 +0.819130 +0.748174 +0.694857 +0.648000 +0.609000 +0.580000 +0.557333 +0.533333 +0.540000 +0.550588 +0.677217 +1.268000 +1.399000 +1.479652 +1.502000 +1.934000 +2.137000 +1.207000 +0.846000 +0.703500 +0.629714 +0.580000 +0.540571 +0.511636 +0.481263 +0.474667 +0.462400 +0.491368 +0.493000 +0.446400 +0.456000 +0.980870 +0.842000 +0.538000 +0.465818 +0.461647 +0.594000 +0.629000 +0.554087 +0.660000 +1.081000 +5.209000 +6.215000 +2.774000 +1.529000 +1.000000 +0.836000 +0.801000 +0.665000 +0.598800 +0.543652 +0.500571 +0.478000 +0.456000 +0.644000 +0.499000 +0.445200 +0.427200 +0.408000 +0.390000 +0.427200 +0.505091 +0.723130 +0.746000 +0.511304 +0.549000 +0.532000 +0.480000 +0.482824 +0.652000 +0.632000 +0.448000 +0.396000 +0.366400 +0.349091 +0.336000 +0.336000 +0.315692 +0.312000 +0.312000 +0.312000 +0.312000 +0.326118 +0.372706 +0.500000 +0.514909 +0.438000 +0.364174 +0.320348 +0.292800 +0.288000 +0.272000 +0.264000 +0.264000 +0.264000 +0.264000 +0.264000 +0.247200 +0.240000 +0.240000 +0.256000 +0.264000 +0.286000 +0.314400 +0.383000 +0.338824 +0.308308 +0.288000 +0.353739 +0.343636 +0.393143 +0.379429 +0.328500 +0.404571 +0.512842 +0.432000 +0.346000 +0.302118 +0.278000 +0.264000 +0.297143 +0.534000 +0.421714 +0.334000 +0.292235 +0.282667 +0.274667 +0.264000 +0.250667 +0.240000 +0.240000 +0.225600 +0.236571 +0.297600 +0.335000 +0.268800 +0.240000 +0.240000 +0.236571 +0.235200 +0.225000 +0.216000 +0.216000 +0.216000 +0.216000 +0.270000 +3.373000 +1.368000 +0.775000 +2.316571 +1.624000 +1.008000 +0.694909 +2.062000 +1.870000 +1.879000 +0.980000 +3.671000 +5.287000 +2.854000 +1.388000 +0.917000 +0.754000 +0.669818 +0.695000 +0.685000 +0.646957 +0.660000 +0.532000 +0.481412 +0.448000 +0.432000 +0.411200 +0.387429 +0.377455 +0.360000 +0.358500 +0.413217 +0.790000 +1.025000 +1.885000 +1.943000 +0.896000 +0.685000 +0.708000 +0.597818 +0.749647 +1.039000 +0.786783 +1.050000 +0.780000 +0.645714 +2.695000 +2.039000 +0.983000 +0.811826 +0.741818 +0.644400 +0.602526 +0.598154 +0.651789 +0.704000 +0.755478 +0.645913 +0.569455 +0.739826 +0.843600 +0.763826 +0.659429 +0.608400 +0.576000 +1.082286 +1.006000 +1.442000 +1.016000 +0.889043 +0.874000 +2.035000 +1.620000 +3.801000 +7.831000 +3.417000 +2.867000 +6.729000 +4.500000 +4.825000 +6.809000 +3.346000 +6.257000 +5.169000 +2.845000 +2.243000 +2.294000 +3.348000 +4.766000 +2.010000 +1.322000 +1.134000 +1.139478 +2.912000 +2.918000 +5.730000 +4.722000 +2.568000 +1.784000 +1.356000 +1.192000 +1.964000 +2.215000 +1.552000 +1.284000 +1.675000 +1.225000 +1.224000 +1.561000 +2.032000 +2.012000 +1.232000 +1.783304 +4.635000 +6.578000 +5.160000 +5.476000 +4.162000 +2.916000 +2.247000 +1.728000 +1.450000 +1.245000 +1.156000 +1.076000 +1.005000 +0.968348 +0.937043 +0.882545 +0.864000 +1.912696 +3.468000 +2.982000 +3.865000 +2.548000 +1.326000 +1.054000 +1.936000 +1.372000 +1.546000 +2.428000 +1.981000 +1.286000 +2.507000 +1.986000 +2.913000 +1.451000 +1.240000 +1.211000 +1.105000 +1.014000 +2.524000 +1.555000 +1.056000 +1.285000 +0.988000 +1.040348 +1.044000 +0.854000 +0.826435 +2.992000 +2.282000 +2.035000 +1.122000 +4.205000 +2.878000 +1.121000 +0.926000 +1.158000 +1.083000 +1.404000 +1.229000 +0.854000 +0.736000 +0.668000 +0.625091 +0.596571 +0.568000 +0.547500 +0.518857 +0.499200 +0.480000 +0.480000 +0.464000 +0.460571 +0.563000 +0.774000 +0.618000 +0.534261 +0.528000 +0.530000 +0.480000 +0.452800 +0.432000 +0.444571 +0.867000 +1.998000 +1.207000 +1.027000 +0.993391 +0.853000 +0.763200 +0.673000 +0.698182 +1.040000 +5.212000 +7.798000 +5.539000 +3.110000 +1.907000 +2.327000 +3.078000 +4.050000 +3.640000 +3.257000 +4.294000 +2.764000 +3.325000 +6.691000 +6.795000 +4.654000 +2.688000 +1.840000 +1.435000 +1.230000 +1.094000 +1.001000 +0.928000 +0.875000 +0.820364 +0.770087 +0.733333 +0.698087 +0.665455 +0.642947 +0.617333 +0.598909 +0.582857 +0.558857 +0.571636 +0.587000 +0.622909 +0.738783 +0.811826 +0.877000 +0.706000 +0.601043 +0.619000 +0.560400 +1.394000 +2.363000 +1.430000 +1.239000 +0.821000 +0.686000 +0.708522 +2.044000 +7.026000 +11.042000 +7.917000 +4.966000 +2.942000 +1.896000 +1.357000 +1.140000 +0.992000 +0.903652 +0.864000 +0.816000 +0.746000 +0.687652 +0.644400 +0.609600 +0.582667 +0.576000 +0.576000 +1.044522 +0.744000 +0.609391 +0.576000 +0.542182 +0.506526 +0.504000 +0.486316 +0.467077 +0.464348 +0.456000 +0.451765 +0.432000 +0.432000 +0.432000 +0.411429 +0.408000 +0.441818 +0.567000 +0.527000 +0.432000 +0.402000 +0.429913 +0.400364 +0.384000 +0.360000 +0.358588 +0.336000 +0.336000 +0.315200 +0.312000 +0.319500 +0.325714 +0.312000 +0.313412 +0.318667 +0.362286 +0.354286 +0.420000 +0.458087 +0.408000 +0.416000 +0.404571 +0.371429 +0.337263 +0.313714 +0.312000 +0.312000 +0.312000 +0.292500 +0.288000 +0.288000 +0.308211 +0.329143 +0.316800 +0.820000 +0.786000 +0.901000 +0.580000 +0.483130 +0.523429 +0.641000 +0.458000 +0.378000 +0.347429 +0.372000 +0.453000 +0.400364 +0.379200 +0.342857 +0.362182 +0.727000 +0.925000 +0.595000 +0.446609 +0.396000 +0.552000 +0.539000 +0.540000 +0.433714 +0.700174 +0.913000 +0.778435 +0.639000 +0.517000 +0.777000 +0.941000 +1.143000 +2.490000 +3.911000 +7.039000 +3.065000 +2.012000 +1.267000 +2.152000 +2.597000 +3.048000 +4.301000 +3.507000 +1.777000 +1.387000 +1.107000 +0.978783 +0.904000 +0.941217 +1.299000 +0.949000 +3.691000 +2.771000 +4.896000 +4.306000 +3.129000 +2.155000 +1.469000 +1.396000 +1.321000 +1.066000 +1.106286 +1.707000 +1.085000 +1.108000 +0.999000 +0.866286 +1.651000 +2.279000 +3.327000 +1.384000 +2.061000 +5.723000 +8.179000 +12.204000 +10.202000 +9.368000 +12.204000 +12.937091 +9.818000 +8.416000 +12.065000 +13.183000 +11.899000 +8.588000 +6.750000 +5.445000 +5.418000 +4.615000 +3.517000 +3.019826 +3.136000 +2.976000 +3.231000 +3.301000 +2.284000 +2.295000 +3.209000 +2.756000 +2.336000 +3.981000 +4.551000 +4.005000 +6.641000 +4.522000 +3.208000 +3.865000 +2.849000 +2.510000 +4.803000 +6.062000 +4.404000 +5.127000 +8.353000 +7.999000 +6.359000 +5.285000 +6.238000 +8.104000 +5.220000 +3.157000 +2.458000 +2.156000 +1.851130 +3.719000 +4.162000 +2.748000 +2.295000 +2.462000 +3.682000 +2.748000 +2.057000 +1.580000 +1.389000 +1.263000 +1.149000 +1.631000 +3.624000 +6.027000 +4.539000 +3.796000 +2.504000 +2.065000 +2.026000 +1.764000 +1.442000 +1.303000 +1.208000 +1.152000 +1.094000 +1.029000 +0.997000 +0.955000 +0.915000 +0.873000 +0.868000 +0.896000 +0.977739 +2.223000 +6.131000 +5.574000 +2.675000 +2.348000 +1.778000 +1.414000 +1.230000 +1.158000 +1.108000 +1.365000 +2.342000 +3.899000 +4.190000 +4.651000 +7.937000 +10.456000 +8.712000 +5.373000 +6.116000 +8.140000 +5.450000 +2.987000 +2.333000 +1.937000 +1.624000 +1.454000 +1.343000 +1.255000 +1.196000 +1.138000 +1.099000 +1.030000 +0.976000 +0.945000 +1.255000 +1.923000 +2.419000 +1.535000 +1.226000 +1.092000 +0.973000 +0.942000 +2.169000 +5.886000 +3.524000 +2.352000 +1.999000 +1.700000 +1.466000 +1.192000 +1.047000 +0.956000 +0.895636 +0.858783 +0.846545 +0.810000 +0.801000 +0.837000 +1.007000 +1.388000 +1.359000 +1.244000 +1.123000 +2.066000 +2.982000 +1.672000 +1.276000 +1.405000 +1.134000 +1.116000 +2.367000 +3.692000 +3.581000 +5.327000 +6.942000 +4.137000 +2.512000 +2.138000 +1.527000 +1.295000 +1.177091 +1.111304 +1.044000 +0.972000 +1.030909 +1.076000 +0.977000 +0.888000 +0.846545 +1.005000 +1.574000 +1.203000 +1.602000 +1.835000 +1.534000 +1.665000 +2.387000 +1.650000 +1.131000 +0.985091 +0.912000 +0.835000 +0.761143 +0.712000 +0.684632 +0.662400 +0.642667 +0.617143 +0.595200 +0.578667 +0.569333 +0.574667 +0.580571 +0.579429 +0.614182 +0.560000 +0.539368 +0.510857 +0.501333 +0.480000 +0.461714 +0.456000 +0.456000 +0.456000 +0.461000 +0.446000 +0.432000 +0.418435 +0.408000 +0.408000 +0.398857 +0.390545 +0.384000 +0.389714 +0.519652 +0.608000 +0.516000 +0.585000 +0.537000 +0.444522 +0.410182 +0.393143 +0.501000 +1.668000 +1.219000 +0.787000 +0.589000 +0.508000 +0.457043 +0.426545 +0.406800 +0.384000 +0.367579 +0.360000 +0.354000 +0.336000 +0.330000 +0.325565 +0.318545 +0.316500 +0.314667 +0.312000 +0.291600 +0.288000 +0.291273 +0.312000 +0.312000 +0.296727 +0.308870 +0.289000 +0.325714 +0.312000 +0.366261 +0.408000 +0.402000 +0.357000 +0.336000 +0.318545 +0.297333 +0.288000 +0.288000 +0.324522 +0.296000 +0.271500 +0.264000 +0.264000 +0.244800 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.252000 +0.397565 +0.653000 +0.599000 +0.399652 +0.375000 +0.885000 +0.898000 +0.588000 +0.458000 +0.468000 +0.800000 +0.614000 +1.144000 +0.892000 +0.534000 +0.414000 +0.366000 +0.360000 +0.332571 +0.310857 +0.288000 +0.266824 +0.264000 +0.277091 +0.285818 +0.264000 +0.259429 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.223000 +0.216000 +0.216000 +0.216000 +0.242286 +0.310957 +0.383000 +0.292000 +0.264000 +0.279000 +0.357913 +0.425739 +0.405000 +0.365217 +0.321818 +0.315000 +0.391636 +1.257000 +0.989000 +5.164000 +3.821000 +1.262000 +2.450000 +3.624000 +2.319000 +1.987000 +1.183000 +1.403000 +1.813000 +2.143000 +4.273000 +2.296000 +1.340000 +1.014261 +0.912000 +0.730000 +0.682435 +1.005000 +0.836000 +0.714000 +2.007000 +1.207000 +2.826000 +4.331000 +5.308000 +5.225000 +3.477000 +2.386000 +2.068000 +1.420000 +1.130000 +0.982000 +0.882000 +0.871000 +0.762000 +0.694957 +0.657143 +0.620870 +0.601043 +0.612522 +1.236000 +1.969000 +1.085000 +0.994000 +1.027000 +1.122000 +1.042000 +0.816000 +0.723000 +0.669000 +0.637565 +0.622909 +0.601043 +0.603000 +3.197000 +1.813000 +0.901000 +0.783273 +1.258000 +0.917000 +2.210000 +2.248000 +2.350000 +2.093000 +1.926000 +1.021000 +1.521000 +3.142000 +5.602000 +3.254000 +2.257000 +1.648000 +1.190000 +1.010087 +0.898435 +0.831000 +0.778435 +0.735652 +0.703000 +0.719000 +0.753391 +0.880000 +0.857000 +0.785000 +1.492000 +1.025000 +1.321000 +2.452000 +1.332000 +0.909000 +2.103000 +2.317000 +1.068000 +0.822000 +0.706000 +0.709565 +0.655000 +0.642000 +0.569739 +0.565895 +0.573913 +0.644000 +0.732000 +0.692000 +0.654261 +1.076000 +1.196000 +0.916000 +0.997000 +1.035000 +1.127000 +2.623000 +1.483000 +1.879000 +3.509000 +2.745000 +1.742000 +3.610000 +2.938000 +4.072000 +5.067000 +3.093000 +3.252000 +3.253000 +3.563000 +4.721000 +7.320000 +7.646000 +6.055000 +5.646000 +5.957000 +3.800000 +3.100000 +5.050000 +6.229000 +6.117000 +8.313000 +5.672000 +5.046000 +3.327000 +2.422000 +1.949000 +1.587000 +1.562000 +3.029000 +3.310000 +2.896000 +4.442000 +2.784000 +2.472000 +7.215000 +9.002000 +6.013000 +4.033000 +2.878000 +2.398957 +3.058000 +2.371000 +1.747000 +2.678000 +2.189000 +1.449000 +1.827000 +4.970000 +2.948000 +1.663000 +1.310000 +1.191652 +1.968000 +2.485000 +1.756000 +1.369000 +1.193739 +1.375000 +1.397000 +1.091000 +0.980870 +0.920348 +0.869217 +0.820800 +0.777818 +0.748571 +0.710857 +0.694857 +0.676174 +0.660522 +0.732571 +0.670909 +0.624000 +0.595200 +0.562667 +0.552000 +0.542400 +0.528000 +0.519529 +0.508800 +0.498353 +0.486316 +0.480000 +0.480000 +0.463200 +0.456000 +0.447429 +0.432000 +0.432000 +0.430909 +0.428727 +0.432000 +0.414261 +0.408000 +0.412000 +0.526909 +0.771000 +1.441000 +1.823000 +0.878000 +0.647000 +0.538435 +0.492000 +0.452870 +0.432000 +0.424500 +0.414000 +0.408000 +0.398400 +0.377333 +0.380400 +0.408000 +0.419478 +0.637091 +0.567000 +0.449739 +0.419478 +0.432000 +0.516522 +0.822000 +0.994000 +0.738000 +2.539000 +2.738000 +1.852000 +1.152000 +0.783000 +1.270957 +2.472000 +1.073000 +0.694000 +1.801000 +1.616000 +0.774000 +0.630000 +0.554000 +0.506286 +0.480000 +0.795000 +1.642000 +0.952000 +0.708522 +0.991000 +3.453000 +3.983000 +1.492000 +0.999000 +0.714000 +0.606261 +0.543273 +0.500000 +0.480000 +0.496364 +0.442909 +0.411273 +0.392400 +0.382400 +0.364800 +0.360000 +0.374118 +0.599000 +0.654261 +0.735000 +1.051000 +2.405000 +0.891000 +0.611000 +0.547826 +0.508000 +0.451200 +0.411600 +0.384000 +0.361500 +0.350118 +0.336000 +0.313714 +0.312000 +0.314526 +0.389455 +0.528000 +0.443000 +0.393818 +0.374857 +0.415000 +0.377739 +0.331200 +0.309474 +0.288000 +0.358400 +2.063000 +2.284000 +5.114000 +10.967000 +8.138000 +4.350000 +2.494000 +1.905000 +1.559000 +1.095000 +1.299130 +2.709000 +1.582000 +1.093000 +0.889000 +1.039000 +0.797000 +0.682435 +0.621714 +0.608842 +0.593143 +0.555273 +0.517500 +0.504000 +0.531000 +0.869000 +0.701000 +0.560000 +0.504000 +0.473333 +0.449333 +0.596000 +0.726000 +0.496364 +0.439304 +0.420923 +0.408000 +0.420632 +0.636000 +1.155000 +0.765913 +2.193000 +1.722000 +0.810000 +0.618783 +0.540000 +0.495600 +0.465000 +0.448500 +0.432000 +0.410824 +0.397714 +0.384000 +0.376615 +0.360000 +0.360000 +0.358400 +0.336000 +0.336000 +0.336000 +0.336000 +0.328500 +0.312000 +0.312000 +0.312000 +0.312000 +0.309333 +0.292800 +0.288000 +0.289412 +0.288000 +0.288000 +0.288000 +0.323000 +0.464727 +0.538000 +1.041000 +0.724174 +0.789600 +0.621000 +0.489391 +0.429913 +2.105000 +7.077000 +5.698000 +2.486000 +1.633000 +5.321000 +4.960000 +6.356000 +3.399000 +2.764000 +1.957000 +1.376000 +4.335000 +6.606000 +5.599000 +3.030000 +2.226000 +3.058000 +1.985000 +3.753000 +2.780000 +2.501000 +2.894000 +3.358000 +3.230000 +7.033000 +5.128000 +3.945000 +2.922000 +2.149000 +1.630000 +2.229000 +3.580000 +3.360000 +2.516000 +1.847000 +1.462000 +1.297000 +1.292000 +1.503000 +1.301000 +1.693000 +3.872000 +4.491000 +2.496000 +2.442000 +1.716000 +1.385739 +1.511000 +1.401000 +1.165000 +1.041000 +0.953739 +0.894261 +0.920348 +1.245000 +3.480000 +3.705000 +2.286000 +1.468000 +1.238000 +1.119000 +2.765000 +4.502000 +5.389000 +5.331000 +3.514000 +4.577000 +5.638000 +3.556000 +6.792000 +8.732000 +7.248000 +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +NaN +0.529143 +0.432000 +0.318000 +0.265000 +0.240000 +0.240000 +0.220000 +0.234000 +0.223000 +0.216000 +0.216000 +0.216000 +0.322000 +0.272000 +0.231000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.213000 +0.193000 +0.192000 +0.192000 +0.192000 +0.192000 +0.203000 +0.226000 +0.239000 +0.222000 +0.216000 +0.216000 +0.209000 +0.192000 +0.192000 +0.192000 +0.192000 +0.184000 +0.200000 +0.522000 +1.126000 +0.851000 +1.958000 +0.749000 +0.457000 +0.364000 +0.322000 +0.306000 +0.302000 +0.469000 +0.747000 +0.420000 +0.333000 +0.294000 +0.265000 +0.249000 +0.253000 +0.396000 +0.327000 +0.300000 +0.615000 +0.370000 +0.298000 +0.268000 +0.248000 +0.240000 +0.227000 +0.216000 +0.216000 +0.216000 +0.228000 +0.220000 +0.224000 +0.240000 +0.258000 +0.244000 +0.352000 +0.299000 +0.301000 +0.378000 +0.369000 +0.440000 +0.584000 +1.839000 +1.305000 +0.696000 +0.475000 +0.393000 +0.347000 +0.312000 +0.306000 +0.292000 +0.306000 +0.416000 +0.452000 +0.692000 +0.719000 +0.480000 +0.406000 +0.710000 +1.438000 +2.180000 +0.902000 +0.596000 +0.479000 +0.418000 +0.558000 +1.895000 +1.337000 +0.850000 +2.026000 +1.596000 +3.851000 +5.495000 +2.515000 +1.356000 +0.983000 +0.814000 +0.709000 +0.629000 +0.580000 +0.660000 +0.844000 +0.824000 +1.747000 +1.486000 +0.896000 +0.705000 +0.659000 +0.591000 +0.556000 +1.261000 +1.505000 +0.943000 +2.382000 +1.167000 +1.688000 +4.002000 +1.831000 +0.932000 +0.721000 +0.579000 +0.634000 +1.554000 +2.216000 +1.591000 +2.433000 +3.273000 +3.449000 +1.902000 +4.523000 +4.165000 +2.506000 +4.222000 +4.269000 +5.266000 +2.849000 +3.759000 +4.259000 +2.838000 +2.848000 +3.654000 +3.290000 +2.232000 +1.512000 +1.387000 +1.404000 +1.124000 +1.035000 +1.012000 +0.903000 +0.875000 +3.387000 +8.980000 +9.323000 +6.892000 +8.355000 +7.702000 +4.935000 +2.838000 +2.350000 +2.203000 +1.531000 +2.089000 +1.472000 +1.186000 +1.092000 +1.075000 +1.014000 +1.000000 +1.131000 +1.024000 +0.920000 +0.853000 +0.793000 +0.740000 +0.714000 +0.748000 +0.709000 +0.683000 +0.697000 +0.710000 +0.758000 +0.766000 +0.792000 +1.099000 +1.485000 +1.040000 +0.885000 +0.852000 +0.816000 +0.718000 +0.664000 +0.638000 +0.614000 +0.599000 +1.724000 +1.386000 +1.465000 +0.831000 +0.857000 +2.372000 +4.471000 +3.271000 +1.670000 +1.127000 +0.985000 +0.944000 +0.895000 +0.809000 +0.725000 +0.661000 +0.620000 +0.590000 +0.607000 +0.874000 +1.901000 +1.933000 +1.970000 +1.187000 +0.940000 +0.801000 +0.716000 +0.699000 +0.650000 +0.600000 +0.564000 +0.539000 +0.559000 +0.838000 +1.470000 +4.930000 +3.630000 +2.114000 +1.310000 +1.264000 +0.903000 +0.760000 +0.785000 +0.776000 +0.917000 +1.020000 +0.884000 +0.732000 +0.643000 +0.581000 +0.567000 +1.168000 +0.833000 +0.870000 +0.664000 +0.857000 +0.716000 +0.631000 +0.733000 +0.577000 +0.520000 +0.478000 +0.450000 +0.427000 +0.408000 +0.389000 +0.384000 +0.378000 +0.372000 +0.360000 +0.343000 +0.336000 +0.336000 +0.333000 +0.312000 +0.312000 +0.337000 +0.361000 +0.336000 +0.336000 +0.323000 +0.348000 +0.313000 +0.308000 +0.288000 +0.288000 +0.279000 +0.264000 +0.264000 +0.264000 +0.264000 +0.254000 +0.240000 +0.240000 +0.240000 +0.257000 +0.316000 +0.310000 +0.333000 +0.319000 +0.537000 +1.964000 +0.974000 +0.705000 +0.503000 +0.584000 +0.423000 +0.423000 +0.496000 +0.554000 +1.112000 +1.390000 +1.656000 +1.270000 +0.622000 +0.475000 +0.573000 +0.676000 +0.486000 +0.410000 +0.371000 +0.340000 +0.317000 +0.312000 +0.333000 +0.455000 +0.476000 +0.357000 +0.394000 +0.365000 +0.329000 +0.289000 +0.265000 +0.264000 +0.283000 +0.265000 +0.242000 +0.240000 +0.240000 +0.223000 +0.216000 +0.223000 +0.321000 +0.902000 +0.501000 +0.416000 +0.339000 +0.326000 +3.894000 +9.167000 +7.888000 +6.307000 +4.086000 +1.949000 +1.157000 +0.949000 +1.222000 +2.211000 +4.284000 +5.765000 +2.789000 +1.473000 +2.735000 +3.831000 +2.969000 +1.730000 +1.480000 +1.016000 +1.136000 +1.158000 +0.815000 +0.706000 +0.640000 +0.588000 +0.556000 +0.532000 +0.509000 +0.490000 +0.476000 +0.456000 +0.477000 +0.511000 +1.760000 +2.777000 +1.716000 +1.194000 +0.715000 +0.757000 +0.812000 +1.009000 +3.767000 +3.178000 +1.325000 +0.932000 +0.725000 +0.604000 +0.538000 +0.521000 +0.492000 +0.527000 +0.546000 +0.587000 +1.045000 +1.757000 +3.169000 +2.543000 +1.932000 +0.943000 +0.711000 +0.605000 +0.545000 +0.500000 +0.532000 +1.022000 +1.125000 +0.898000 +1.700000 +2.159000 +1.214000 +1.147000 +4.563000 +7.167000 +8.585000 +9.112000 +7.125000 +5.458000 +3.731000 +2.601000 +2.236000 +2.648000 +2.289000 +1.556000 +1.284000 +1.171000 +1.109000 +1.122000 +1.035000 +1.053000 +1.143000 +1.044000 +0.999000 +0.936000 +0.849000 +0.798000 +0.793000 +0.728000 +0.709000 +0.787000 +0.960000 +0.832000 +0.715000 +0.636000 +0.699000 +1.451000 +0.916000 +0.770000 +0.691000 +0.745000 +0.729000 +0.977000 +0.766000 +0.668000 +0.617000 +0.580000 +0.559000 +0.552000 +0.532000 +0.528000 +0.556000 +0.532000 +0.508000 +0.486000 +0.480000 +0.480000 +0.476000 +0.892000 +1.790000 +1.636000 +1.673000 +0.981000 +0.735000 +0.617000 +0.966000 +2.395000 +3.338000 +3.237000 +1.635000 +0.947000 +2.376000 +2.917000 +1.239000 +2.100000 +3.244000 +2.589000 +2.020000 +1.490000 +2.324000 +2.437000 +2.328000 +7.873000 +9.762000 +7.614000 +6.265000 +4.243000 +3.387000 +2.562000 +1.736000 +1.611000 +1.537000 +3.044000 +2.154000 +2.572000 +2.577000 +1.492000 +1.116000 +0.981000 +1.023000 +1.411000 +1.552000 +1.600000 +1.480000 +1.300000 +1.061000 +0.952000 +0.892000 +0.845000 +0.817000 +0.779000 +0.750000 +0.777000 +0.746000 +0.695000 +1.191000 +1.775000 +1.219000 +2.369000 +1.139000 +0.906000 +0.817000 +0.774000 +0.791000 +0.757000 +0.697000 +0.709000 +0.827000 +1.030000 +1.416000 +3.333000 +3.857000 +4.157000 +3.019000 +2.314000 +1.977000 +1.800000 +1.624000 +2.079000 +1.682000 +1.309000 +1.322000 +1.709000 +1.672000 +2.115000 +3.541000 +1.860000 +1.161000 +1.677000 +4.562000 +3.658000 +2.080000 +1.355000 +1.069000 +0.921000 +0.852000 +0.948000 +0.890000 +0.788000 +0.730000 +0.715000 +2.570000 +3.817000 +1.788000 +1.203000 +1.045000 +0.935000 +0.850000 +0.783000 +0.742000 +0.826000 +2.998000 +1.949000 +1.083000 +0.849000 +0.805000 +0.697000 +0.675000 +0.682000 +1.542000 +4.331000 +6.099000 +4.517000 +5.057000 +3.158000 +2.493000 +1.628000 +1.250000 +1.065000 +0.951000 +0.878000 +1.132000 +1.287000 +1.011000 +0.932000 +0.888000 +0.856000 +1.070000 +2.416000 +1.400000 +0.976000 +0.845000 +0.764000 +0.736000 +0.748000 +0.681000 +0.621000 +0.585000 +0.558000 +0.541000 +0.528000 +0.512000 +0.504000 +0.504000 +0.518000 +0.558000 +0.882000 +0.723000 +0.970000 +1.882000 +1.172000 +0.811000 +0.647000 +0.557000 +0.500000 +0.458000 +0.432000 +0.453000 +0.457000 +0.531000 +0.568000 +0.830000 +0.790000 +0.515000 +0.438000 +0.404000 +0.384000 +0.382000 +0.396000 +0.407000 +0.396000 +0.428000 +0.412000 +0.492000 +0.512000 +2.890000 +0.859000 +0.555000 +0.456000 +0.394000 +0.385000 +0.383000 +0.360000 +0.352000 +0.336000 +0.336000 +0.395000 +0.379000 +0.335000 +0.322000 +0.336000 +0.378000 +0.608000 +0.523000 +0.420000 +0.348000 +0.311000 +0.288000 +0.288000 +0.288000 +0.288000 +0.288000 +0.279000 +0.264000 +0.264000 +0.264000 +0.264000 +0.264000 +0.250000 +0.240000 +0.240000 +0.240000 +0.240000 +0.275000 +0.804000 +0.920000 +0.691000 +0.519000 +0.416000 +0.353000 +0.316000 +0.312000 +0.295000 +0.276000 +0.264000 +0.264000 +0.264000 +0.264000 +0.272000 +0.295000 +0.350000 +0.344000 +0.333000 +0.275000 +0.264000 +0.254000 +0.240000 +0.229000 +0.231000 +0.239000 +0.239000 +0.423000 +0.425000 +0.319000 +0.279000 +0.263000 +0.265000 +0.336000 +0.354000 +0.374000 +0.313000 +0.268000 +0.245000 +0.240000 +0.231000 +0.217000 +0.272000 +2.071000 +1.145000 +0.603000 +0.413000 +0.342000 +0.433000 +1.023000 +0.883000 +0.518000 +0.409000 +0.356000 +0.321000 +0.312000 +0.288000 +0.298000 +0.381000 +0.320000 +0.311000 +0.374000 +0.837000 +0.891000 +1.053000 +1.073000 +0.626000 +0.445000 +0.376000 +0.332000 +0.312000 +0.305000 +0.290000 +0.284000 +0.264000 +0.289000 +0.872000 +0.814000 +0.503000 +0.400000 +0.353000 +0.325000 +0.312000 +0.334000 +0.521000 +1.192000 +1.182000 +1.401000 +7.183000 +6.571000 +4.305000 +2.801000 +1.398000 +1.030000 +1.357000 +1.101000 +1.149000 +3.817000 +4.573000 +4.862000 +2.812000 +3.047000 +2.788000 +6.082000 +4.273000 +3.009000 +3.009000 +2.688000 +1.523000 +1.158000 +0.998000 +0.865000 +0.758000 +0.686000 +0.633000 +0.608000 +0.576000 +0.547000 +0.535000 +0.552000 +0.553000 +0.875000 +2.169000 +2.049000 +1.132000 +0.996000 +1.859000 +4.132000 +4.743000 +3.036000 +2.063000 +2.698000 +1.974000 +1.283000 +1.087000 +1.010000 +0.962000 +0.904000 +0.831000 +0.776000 +0.742000 +0.677000 +0.613000 +0.582000 +0.576000 +0.573000 +0.583000 +0.653000 +0.678000 +0.602000 +0.558000 +0.583000 +0.638000 +0.605000 +0.569000 +1.407000 +4.150000 +2.250000 +1.194000 +0.957000 +0.839000 +0.769000 +0.694000 +0.651000 +0.618000 +0.616000 +3.798000 +4.267000 +1.352000 +0.952000 +0.906000 +0.825000 +0.985000 +1.057000 +1.094000 +1.622000 +1.987000 +1.072000 +0.813000 +0.723000 +0.663000 +0.620000 +0.586000 +0.624000 +0.798000 +0.691000 +0.600000 +0.560000 +0.524000 +0.512000 +0.501000 +0.489000 +0.488000 +0.482000 +0.610000 +0.875000 +0.573000 +0.489000 +0.491000 +0.855000 +0.825000 +2.106000 +3.074000 +2.601000 +1.942000 +1.013000 +0.794000 +1.079000 +1.555000 +1.312000 +2.796000 +4.896000 +2.309000 +1.537000 +1.764000 +1.429000 +1.040000 +0.878000 +0.780000 +0.710000 +0.645000 +0.610000 +0.683000 +2.025000 +2.335000 +2.235000 +1.398000 +1.056000 +1.067000 +4.559000 +4.790000 +2.956000 +1.881000 +1.433000 +1.916000 +2.090000 +1.394000 +1.069000 +1.009000 +2.020000 +4.465000 +5.507000 +6.155000 +6.544000 +3.739000 +5.341000 +6.627000 +5.759000 +6.375000 +4.577000 +2.778000 +2.045000 +1.623000 +1.588000 +1.796000 +1.472000 +1.204000 +1.378000 +1.179000 +1.128000 +1.012000 +0.895000 +0.816000 +0.770000 +0.809000 +0.819000 +0.781000 +0.709000 +0.681000 +0.634000 +0.619000 +0.606000 +0.610000 +0.562000 +0.532000 +0.528000 +0.547000 +0.533000 +0.519000 +0.491000 +0.477000 +0.456000 +0.715000 +0.786000 +0.611000 +0.524000 +0.482000 +0.467000 +0.504000 +0.532000 +0.609000 +1.637000 +1.239000 +1.556000 +1.662000 +1.152000 +1.839000 +4.493000 +7.702000 +5.188000 +3.889000 +2.072000 +1.340000 +1.098000 +0.945000 +0.850000 +0.766000 +0.720000 +0.675000 +0.620000 +0.579000 +0.554000 +0.533000 +0.516000 +0.489000 +0.474000 +0.454000 +0.435000 +0.432000 +0.431000 +0.431000 +0.408000 +0.405000 +0.384000 +0.384000 +0.384000 +0.384000 +0.384000 +0.407000 +0.446000 +0.424000 +0.384000 +0.384000 +0.384000 +0.366000 +0.356000 +0.336000 +0.322000 +0.312000 +0.312000 +0.292000 +0.288000 +0.288000 +0.288000 +0.265000 +0.274000 +0.296000 +0.374000 +0.310000 +0.286000 +0.264000 +0.264000 +0.241000 +0.240000 +0.240000 +0.240000 +0.237000 +0.240000 +0.231000 +0.253000 +0.238000 +0.217000 +0.216000 +0.216000 +0.216000 +0.216000 +0.213000 +0.216000 +0.239000 +0.558000 +1.070000 +0.628000 +0.397000 +0.326000 +0.321000 +0.290000 +0.264000 +0.246000 +0.245000 +0.240000 +0.261000 +0.382000 +0.307000 +0.279000 +0.264000 +0.361000 +2.299000 +2.192000 +1.597000 +1.813000 +0.858000 +0.638000 +0.525000 +0.438000 +0.404000 +0.556000 +0.823000 +0.528000 +0.473000 +0.572000 +1.925000 +4.166000 +3.405000 +1.222000 +0.892000 +1.207000 +0.783000 +0.562000 +0.478000 +0.432000 +0.407000 +0.437000 +0.425000 +1.603000 +1.122000 +0.616000 +0.504000 +0.443000 +0.414000 +0.398000 +0.385000 +0.430000 +0.386000 +0.498000 +0.611000 +0.597000 +0.481000 +0.851000 +0.562000 +0.483000 +0.527000 +0.884000 +1.503000 +0.932000 +1.816000 +2.226000 +1.080000 +0.706000 +0.653000 +0.604000 +1.310000 +1.076000 +0.670000 +0.556000 +0.493000 +0.461000 +0.453000 +0.607000 +1.443000 +1.169000 +0.886000 +1.371000 +0.890000 +0.720000 +3.948000 +4.869000 +2.141000 +1.643000 +1.142000 +0.925000 +1.197000 +0.830000 +0.669000 +0.599000 +0.560000 +0.520000 +0.493000 +0.484000 +0.480000 +0.482000 +0.555000 +1.869000 +1.143000 +0.912000 +0.709000 +1.281000 +1.577000 +1.181000 +1.985000 +2.262000 +3.105000 +2.011000 +1.670000 +3.494000 +4.687000 +6.093000 +3.061000 +2.341000 +2.777000 +2.056000 +1.534000 +1.802000 +1.924000 +6.049000 +6.466000 +9.084000 +8.007000 +7.520000 +7.732000 +3.968000 +4.087000 +7.010000 +4.608000 +4.508000 +7.011000 +6.057000 +3.759000 +2.558000 +1.888000 +1.443000 +1.263000 +1.146000 +1.081000 +1.030000 +0.977000 +0.928000 +0.892000 +0.988000 +1.065000 +3.674000 +7.561000 +5.377000 +3.398000 +3.004000 +3.096000 +2.845000 +2.124000 +2.285000 +4.312000 +5.682000 +9.328000 +9.496000 +10.018000 +8.124000 +6.406000 +4.591000 +2.847000 +2.604000 +4.683000 +7.803000 +6.711000 +7.187000 +5.504000 +3.587000 +2.798000 +2.961000 +2.443000 +2.279000 +2.210000 +1.656000 +1.383000 +1.257000 +1.155000 +1.075000 +1.001000 +0.949000 +0.920000 +0.881000 +0.837000 +0.802000 +0.776000 +0.903000 +2.563000 +5.042000 +5.211000 +3.173000 +2.419000 +1.763000 +2.739000 +2.698000 +1.816000 +1.563000 +1.723000 +2.216000 +3.420000 +3.001000 +2.416000 +1.997000 +1.678000 +3.484000 +4.463000 +3.766000 +2.183000 +1.597000 +3.786000 +4.577000 +3.993000 +2.253000 +1.537000 +1.322000 +1.183000 +1.096000 +0.993000 +0.913000 +0.871000 +0.836000 +0.853000 +1.165000 +1.566000 +1.041000 +0.917000 +0.865000 +1.338000 +1.127000 +0.909000 +0.814000 +0.755000 +0.705000 +0.685000 +0.727000 +0.776000 +0.665000 +0.612000 +0.588000 +0.569000 +0.552000 +0.533000 +0.510000 +0.499000 +0.487000 +0.504000 +0.484000 +0.480000 +0.466000 +0.456000 +0.454000 +0.447000 +0.432000 +0.425000 +0.408000 +0.408000 +0.408000 +0.408000 +0.408000 +0.420000 +0.887000 +0.972000 +0.570000 +0.454000 +0.411000 +0.384000 +0.368000 +0.359000 +0.345000 +0.336000 +0.336000 +0.336000 +0.315000 +0.319000 +0.312000 +0.351000 +0.404000 +0.948000 +1.023000 +1.582000 +2.348000 +0.844000 +0.644000 +0.705000 +0.865000 +1.051000 +0.683000 +0.504000 +0.429000 +0.391000 +0.372000 +0.356000 +0.336000 +0.336000 +0.343000 +0.344000 +0.336000 +0.325000 +0.310000 +0.288000 +0.289000 +0.413000 +0.337000 +0.309000 +0.288000 +0.287000 +0.264000 +0.264000 +0.264000 +0.272000 +0.393000 +3.400000 +8.641000 +7.546000 +4.052000 +2.135000 +2.108000 +5.061000 +2.687000 +2.420000 +2.219000 +2.424000 +6.355000 +4.232000 +2.368000 +1.901000 +2.049000 +2.603000 +5.301000 +4.917000 +5.860000 +3.483000 +2.900000 +3.281000 +2.220000 +1.303000 +1.047000 +0.900000 +0.813000 +0.779000 +1.305000 +1.612000 +1.713000 +1.807000 +1.456000 +1.153000 +2.009000 +2.736000 +2.317000 +1.506000 +1.298000 +1.055000 +0.898000 +1.916000 +1.592000 +1.001000 +0.796000 +0.695000 +0.640000 +0.604000 +0.568000 +0.550000 +0.838000 +0.894000 +0.600000 +0.525000 +0.487000 +0.465000 +0.456000 +0.466000 +0.469000 +0.483000 +1.294000 +2.336000 +1.076000 +0.722000 +0.790000 +1.663000 +0.941000 +0.687000 +0.587000 +0.517000 +0.474000 +0.444000 +0.426000 +0.408000 +0.408000 +0.389000 +0.382000 +0.360000 +0.360000 +0.360000 +0.357000 +0.336000 +0.336000 +0.336000 +0.334000 +0.312000 +0.312000 +0.312000 +0.312000 +0.312000 +0.312000 +0.290000 +0.288000 +0.288000 +0.296000 +0.312000 +0.344000 +0.513000 +0.555000 +0.514000 +0.447000 +1.230000 +0.883000 +0.554000 +0.437000 +0.408000 +0.492000 +0.474000 +0.390000 +0.360000 +0.358000 +0.346000 +0.346000 +0.326000 +0.312000 +0.387000 +0.652000 +0.666000 +0.474000 +0.422000 +0.390000 +0.362000 +0.367000 +0.647000 +0.456000 +0.373000 +0.338000 +0.320000 +0.312000 +0.312000 +0.300000 +0.288000 +0.288000 +0.288000 +0.288000 +1.138000 +0.687000 +0.468000 +0.393000 +0.364000 +0.336000 +0.322000 +0.312000 +0.290000 +0.288000 +0.288000 +0.286000 +0.376000 +0.391000 +0.428000 +0.368000 +0.330000 +0.363000 +0.322000 +0.302000 +0.349000 +1.133000 +2.737000 +2.519000 +2.453000 +1.244000 +0.842000 +0.898000 +0.819000 +0.612000 +0.544000 +0.825000 +1.068000 +2.787000 +3.939000 +4.479000 +2.350000 +1.390000 +3.508000 +3.800000 +3.237000 +3.951000 +5.297000 +3.723000 +1.956000 +1.248000 +1.026000 +0.891000 +0.792000 +0.741000 +0.684000 +0.664000 +0.635000 +0.610000 +0.583000 +0.546000 +0.543000 +0.572000 +0.669000 +0.736000 +3.786000 +7.295000 +7.817000 +4.693000 +2.609000 +5.893000 +4.920000 +3.205000 +4.398000 +6.095000 +3.776000 +3.850000 +4.157000 +5.513000 +9.001000 +6.231000 +3.323000 +3.384000 +4.917000 +5.899000 +5.134000 +5.546000 +5.778000 +4.799000 +5.332000 +10.512000 +10.015000 +8.171000 +6.208000 +3.957000 +3.189000 +2.410000 +1.894000 +2.287000 +2.696000 +5.936000 +3.438000 +2.454000 +3.537000 +3.399000 +5.516000 +3.784000 +2.699000 +2.179000 +1.585000 +1.338000 +1.211000 +1.115000 +1.042000 +0.992000 +0.938000 +0.888000 +0.847000 +0.812000 +0.781000 +0.775000 +0.835000 +2.448000 +1.621000 +1.214000 +1.787000 +2.981000 +1.526000 +1.010000 +4.213000 +3.385000 +1.873000 +1.266000 +1.051000 +0.992000 +1.031000 +1.049000 +3.900000 +1.972000 +2.568000 +3.276000 +4.259000 +3.445000 +2.386000 +1.345000 +1.111000 +0.977000 +0.878000 +0.819000 +0.890000 +1.016000 +1.018000 +1.217000 +1.012000 +0.871000 +0.875000 +1.219000 +3.076000 +5.789000 +6.050000 +3.005000 +3.685000 +2.090000 +1.282000 +1.109000 +1.124000 +1.245000 +1.550000 +1.474000 +1.255000 +1.180000 +2.027000 +1.836000 +1.297000 +1.068000 +1.082000 +0.991000 +0.963000 +1.135000 +0.931000 +0.816000 +0.754000 +0.705000 +0.680000 +0.658000 +0.648000 +0.696000 +0.795000 +0.979000 +2.102000 +5.117000 +3.171000 +1.508000 +1.089000 +0.979000 +0.932000 +0.809000 +0.724000 +0.672000 +0.633000 +0.599000 +0.572000 +0.547000 +0.528000 +0.524000 +0.504000 +0.504000 +0.495000 +0.467000 +0.456000 +0.442000 +0.432000 +0.430000 +0.410000 +0.407000 +0.384000 +0.384000 +0.412000 +0.484000 +0.655000 +0.496000 +0.464000 +0.562000 +0.637000 +0.790000 +0.640000 +0.498000 +0.527000 +0.697000 +0.518000 +0.433000 +0.391000 +0.384000 +0.384000 +0.384000 +0.392000 +0.360000 +0.347000 +0.349000 +0.856000 +1.859000 +0.830000 +1.984000 +4.276000 +2.227000 +0.816000 +0.648000 +0.838000 +0.821000 +0.619000 +0.547000 +0.486000 +0.480000 +0.497000 +0.461000 +0.464000 +0.651000 +2.140000 +3.077000 +1.618000 +2.234000 +4.051000 +5.220000 +3.112000 +1.239000 +0.881000 +0.725000 +0.653000 +0.634000 +0.655000 +0.760000 +0.722000 +0.564000 +0.501000 +0.467000 +0.443000 +0.426000 +0.404000 +0.384000 +0.384000 +0.366000 +0.379000 +0.894000 +2.221000 +1.224000 +0.925000 +0.941000 +0.678000 +0.688000 +0.760000 +0.685000 +1.541000 +3.355000 +2.273000 +2.710000 +1.805000 +1.106000 +0.898000 +2.879000 +7.391000 +5.351000 +6.615000 +4.000000 +2.262000 +1.447000 +1.118000 +0.965000 +1.023000 +1.255000 +1.353000 +0.939000 +0.781000 +0.715000 +0.728000 +0.689000 +1.026000 +2.621000 +2.447000 +6.945000 +12.057000 +12.215000 +9.538000 +7.153000 +5.842000 +4.045000 +2.942000 +2.901000 +2.145000 +1.538000 +1.345000 +1.330000 +1.138000 +1.003000 +0.919000 +0.854000 +0.798000 +0.758000 +0.722000 +0.687000 +0.662000 +0.635000 +0.619000 +0.605000 +0.965000 +1.209000 +0.955000 +0.739000 +3.753000 +3.489000 +1.145000 +2.024000 +1.791000 +1.004000 +2.631000 +2.637000 +1.091000 +0.880000 +2.218000 +2.151000 +1.071000 +0.865000 +0.903000 +1.433000 +5.229000 +3.549000 +1.597000 +2.416000 +2.017000 +2.823000 +4.630000 +1.585000 +1.037000 +0.881000 +0.850000 +1.164000 +1.393000 +1.589000 +1.674000 +1.194000 +1.185000 +1.136000 +1.397000 +3.020000 +6.414000 +6.483000 +4.460000 +2.950000 +1.882000 +1.483000 +1.504000 +1.157000 +1.167000 +1.311000 +1.023000 +0.904000 +0.810000 +0.772000 +0.858000 +1.279000 +1.130000 +1.051000 +1.132000 +1.055000 +0.853000 +0.737000 +0.721000 +0.704000 +0.733000 +0.916000 +1.704000 +2.217000 +2.446000 +5.323000 +2.668000 +1.440000 +1.176000 +2.700000 +8.650000 +6.353000 +3.524000 +3.467000 +2.705000 +2.205000 +3.943000 +3.422000 +2.439000 +1.734000 +1.263000 +1.111000 +1.009000 +0.932000 +0.878000 +0.839000 +0.797000 +0.755000 +0.713000 +0.688000 +0.672000 +0.654000 +0.648000 +0.627000 +0.586000 +0.614000 +0.603000 +0.635000 +0.635000 +4.326000 +6.375000 +2.349000 +1.226000 +1.368000 +1.541000 +2.522000 +3.360000 +4.479000 +2.971000 +2.764000 +5.532000 +3.304000 +2.311000 +3.227000 +2.368000 +2.792000 +4.140000 +2.517000 +1.789000 +1.432000 +1.200000 +2.251000 +2.907000 +2.029000 +1.365000 +1.157000 +1.036000 +0.973000 +1.044000 +1.078000 +0.976000 +1.091000 +1.447000 +2.050000 +4.990000 +4.775000 +3.296000 +2.198000 +1.488000 +1.257000 +1.235000 +1.118000 +1.011000 +0.939000 +0.874000 +0.819000 +0.792000 +0.768000 +0.725000 +0.712000 +0.953000 +1.118000 +0.849000 +0.760000 +1.480000 +2.181000 +1.509000 +1.335000 +0.933000 +0.945000 +0.785000 +0.703000 +0.650000 +0.605000 +0.576000 +0.563000 +0.544000 +0.528000 +0.512000 +0.504000 +0.485000 +0.496000 +0.559000 +0.810000 +0.817000 +0.996000 +0.711000 +0.602000 +0.551000 +0.500000 +0.473000 +0.456000 +0.438000 +0.432000 +0.435000 +0.452000 +0.758000 +0.741000 +0.619000 +0.544000 +0.473000 +0.438000 +0.416000 +0.408000 +0.402000 +0.384000 +0.380000 +0.366000 +0.360000 +0.353000 +0.336000 +0.336000 +0.336000 +0.336000 +0.345000 +0.402000 +1.093000 +1.547000 +0.664000 +0.517000 +0.479000 +0.572000 +0.573000 +0.787000 +1.726000 +1.930000 +1.275000 +0.994000 +0.772000 +0.574000 +0.472000 +0.430000 +0.424000 +0.563000 +0.627000 +0.601000 +0.794000 +0.670000 +0.868000 +1.144000 +0.754000 +0.564000 +0.476000 +0.432000 +0.392000 +0.384000 +0.381000 +0.369000 +0.347000 +0.323000 +0.295000 +0.288000 +0.288000 +0.291000 +0.521000 +1.806000 +0.786000 +0.504000 +0.425000 +0.465000 +0.493000 +0.426000 +0.374000 +0.343000 +0.415000 +0.532000 +0.731000 +0.719000 +0.471000 +0.396000 +0.372000 +0.345000 +0.331000 +0.312000 +0.294000 +0.288000 +0.301000 +0.348000 +0.324000 +0.293000 +0.271000 +0.365000 +0.399000 +0.406000 +0.340000 +0.847000 +0.863000 +0.486000 +0.383000 +0.326000 +0.375000 +0.512000 +0.772000 +1.029000 +1.001000 +1.596000 +8.294000 +8.897000 +4.756000 +2.482000 +1.467000 +2.073000 +1.942000 +2.096000 +0.971000 +0.766000 +0.893000 +0.971000 +2.198000 +1.076000 +0.751000 +0.929000 +0.749000 +0.589000 +0.540000 +0.513000 +0.518000 +0.469000 +0.426000 +0.408000 +0.402000 +0.384000 +0.362000 +0.360000 +0.360000 +0.440000 +0.492000 +0.425000 +0.437000 +0.384000 +0.360000 +0.604000 +0.652000 +0.483000 +0.576000 +0.502000 +1.543000 +1.039000 +0.716000 +0.652000 +0.556000 +2.193000 +2.218000 +2.074000 +3.200000 +1.318000 +0.798000 +0.658000 +0.602000 +0.539000 +0.508000 +0.447000 +0.408000 +0.382000 +0.360000 +0.358000 +0.336000 +0.336000 +0.334000 +0.312000 +0.312000 +0.312000 +0.312000 +0.296000 +0.288000 +0.288000 +0.288000 +0.288000 +0.288000 +0.270000 +0.265000 +0.264000 +0.264000 +0.264000 +0.542000 +0.461000 +0.362000 +0.541000 +0.546000 +0.378000 +0.336000 +0.420000 +0.390000 +0.327000 +0.303000 +0.288000 +0.288000 +0.278000 +0.264000 +0.264000 +0.266000 +0.311000 +0.440000 +0.446000 +0.385000 +0.889000 +2.845000 +1.263000 +0.623000 +0.758000 +0.555000 +0.459000 +1.002000 +5.232000 +3.571000 +2.587000 +2.368000 +1.388000 +0.968000 +2.915000 +5.005000 +1.878000 +1.086000 +0.927000 +1.996000 +4.648000 +5.440000 +2.918000 +4.461000 +6.088000 +9.252000 +7.340000 +5.443000 +4.386000 +4.866000 +4.623000 +5.165000 +7.150000 +7.519000 +5.412000 +3.871000 +10.654000 +12.012000 +8.839000 +7.011000 +6.273000 +4.925000 +5.575000 +7.091000 +6.053000 +4.890000 +3.552000 +2.888000 +2.315000 +1.911000 +1.604000 +2.505000 +3.014000 +3.559000 +3.729000 +2.811000 +2.243000 +1.758000 +1.533000 +1.406000 +1.440000 +1.397000 +1.416000 +2.076000 +3.339000 +2.809000 +2.349000 +2.734000 +2.455000 +1.724000 +1.357000 +1.204000 +1.114000 +1.073000 +0.997000 +0.918000 +0.895000 +0.888000 +1.041000 +2.030000 +2.896000 +2.525000 +2.169000 +4.404000 +7.720000 +6.842000 +7.295000 +4.815000 +2.977000 +3.155000 +5.879000 +4.404000 +3.061000 +2.314000 +1.820000 +2.880000 +2.788000 +2.439000 +1.407000 +1.169000 +1.075000 +1.375000 +1.195000 +1.187000 +2.087000 +1.530000 +1.241000 +1.226000 +1.919000 +1.817000 +1.385000 +1.382000 +1.340000 +1.209000 +1.439000 +1.557000 +1.226000 +1.160000 +1.085000 +0.975000 +0.929000 +0.934000 +0.997000 +1.189000 +2.180000 +6.681000 +5.126000 +3.436000 +2.307000 +1.579000 +1.317000 +1.163000 +1.082000 +1.200000 +1.169000 +1.001000 +0.943000 +0.926000 +0.930000 +1.236000 +1.320000 +1.683000 +1.661000 +1.282000 +1.280000 +1.447000 +1.283000 +1.752000 +1.167000 +1.100000 +1.111000 +2.335000 +4.181000 +4.951000 +2.484000 +1.370000 +2.969000 +5.883000 +5.254000 +2.583000 +2.124000 +2.749000 +1.960000 +2.575000 +1.655000 +1.318000 +1.082000 +0.970000 +0.893000 +0.833000 +0.785000 +0.756000 +0.716000 +0.688000 +0.665000 +0.640000 +0.623000 +0.615000 +0.588000 +0.557000 +0.552000 +0.541000 +0.528000 +0.521000 +0.501000 +0.485000 +0.491000 +0.513000 +0.476000 +0.456000 +0.450000 +0.444000 +0.432000 +0.442000 +0.453000 +0.431000 +0.410000 +0.408000 +0.408000 +0.408000 +0.392000 +0.384000 +0.384000 +0.379000 +0.360000 +0.360000 +0.360000 +0.358000 +0.338000 +0.337000 +0.397000 +0.348000 +0.316000 +0.319000 +0.336000 +0.333000 +0.324000 +0.348000 +0.325000 +0.324000 +0.350000 +0.374000 +0.340000 +0.312000 +0.320000 +0.338000 +0.388000 +0.441000 +0.645000 +0.911000 +0.553000 +0.424000 +0.421000 +0.381000 +0.346000 +0.319000 +0.303000 +0.288000 +0.270000 +0.265000 +0.264000 +0.248000 +0.240000 +0.240000 +0.240000 +0.263000 +0.261000 +0.269000 +0.278000 +0.243000 +0.241000 +0.251000 +0.240000 +0.236000 +0.216000 +0.217000 +0.216000 +0.228000 +0.228000 +0.216000 +0.233000 +0.260000 +0.274000 +0.572000 +0.912000 +0.881000 +0.612000 +0.674000 +1.532000 +3.008000 +3.257000 +0.904000 +0.587000 +0.471000 +0.415000 +0.377000 +0.347000 +0.333000 +0.312000 +0.310000 +0.288000 +0.288000 +0.287000 +0.288000 +0.275000 +0.264000 +0.264000 +0.362000 +0.411000 +0.319000 +0.284000 +0.268000 +0.293000 +0.601000 +0.993000 +0.552000 +0.401000 +0.345000 +0.324000 +0.310000 +2.298000 +1.204000 +0.531000 +0.424000 +0.471000 +0.415000 +0.346000 +0.311000 +0.340000 +0.328000 +0.296000 +0.268000 +0.254000 +0.240000 +0.240000 +0.230000 +0.223000 +0.293000 +0.522000 +0.578000 +0.554000 +0.965000 +2.068000 +0.689000 +0.513000 +0.884000 +0.697000 +0.466000 +0.372000 +0.336000 +0.692000 +1.067000 +0.558000 +0.445000 +1.445000 +0.936000 +0.606000 +0.466000 +0.399000 +0.424000 +0.990000 +0.870000 +2.022000 +1.642000 +3.873000 +2.022000 +1.004000 +1.248000 +0.843000 +0.633000 +0.554000 +0.506000 +0.454000 +0.419000 +0.393000 +0.381000 +0.360000 +0.350000 +0.336000 +0.336000 +0.345000 +0.342000 +0.333000 +1.011000 +1.909000 +0.673000 +0.506000 +0.715000 +1.144000 +0.839000 +0.753000 +1.076000 +0.842000 +0.804000 +4.197000 +3.547000 +6.295000 +5.210000 +1.574000 +0.980000 +2.668000 +4.506000 +2.234000 +5.485000 +5.905000 +2.437000 +1.525000 +1.142000 +1.027000 +0.922000 +0.883000 +1.011000 +0.912000 +1.608000 +2.813000 +2.116000 +1.186000 +0.954000 +0.835000 +0.778000 +0.736000 +0.764000 +0.780000 +0.808000 +0.824000 +0.818000 +0.837000 +0.973000 +0.945000 +0.798000 +0.805000 +0.642000 +3.498000 +4.812000 +2.594000 +2.191000 +2.708000 +2.731000 +2.881000 +1.615000 +1.014000 +0.931000 +0.861000 +0.738000 +0.717000 +0.614000 +0.690000 +0.565000 +0.530000 +0.630000 +1.009000 +1.911000 +2.147000 +1.629000 +1.706000 +1.130000 +0.896000 +0.919000 +1.854000 +1.329000 +1.166000 +2.385000 +2.055000 +4.689000 +6.568000 +4.717000 +4.280000 +3.618000 +7.279000 +7.730000 +3.590000 +1.846000 +1.309000 +1.099000 +0.958000 +0.895000 +0.880000 +0.861000 +0.876000 +1.160000 +1.167000 +0.924000 +0.802000 +0.757000 +0.720000 +0.855000 +1.368000 +3.001000 +7.699000 +9.122000 +8.381000 +7.550000 +4.113000 +3.554000 +2.486000 +2.419000 +3.492000 +4.051000 +4.143000 +3.153000 +3.728000 +2.447000 +1.994000 +2.427000 +2.130000 +1.842000 +1.809000 +2.406000 +1.832000 +2.009000 +3.317000 +2.233000 +1.505000 +1.247000 +1.100000 +1.005000 +0.941000 +0.885000 +0.843000 +0.797000 +0.779000 +1.677000 +4.035000 +2.958000 +2.785000 +1.528000 +1.064000 +0.929000 +0.867000 +0.810000 +0.735000 +0.683000 +0.656000 +0.629000 +0.595000 +0.579000 +0.563000 +0.551000 +0.528000 +0.519000 +0.504000 +0.502000 +0.506000 +0.727000 +1.665000 +1.292000 +0.842000 +1.353000 +3.191000 +1.255000 +0.763000 +0.610000 +0.539000 +0.502000 +0.473000 +0.450000 +0.432000 +0.432000 +0.417000 +0.403000 +0.384000 +0.384000 +0.374000 +0.360000 +0.360000 +0.351000 +0.338000 +0.336000 +0.327000 +0.312000 +0.312000 +0.312000 +0.312000 +0.300000 +0.288000 +0.288000 +0.288000 +0.288000 +0.288000 +0.288000 +0.389000 +0.463000 +0.391000 +0.340000 +0.315000 +0.312000 +0.325000 +0.345000 +0.329000 +0.312000 +0.298000 +0.500000 +0.434000 +0.335000 +0.309000 +0.834000 +1.159000 +0.905000 +0.626000 +0.514000 +0.702000 +0.699000 +0.667000 +0.511000 +0.386000 +0.324000 +0.296000 +0.276000 +0.264000 +0.258000 +0.240000 +0.240000 +0.243000 +0.264000 +0.248000 +0.272000 +0.510000 +1.027000 +0.489000 +0.371000 +0.311000 +0.295000 +0.313000 +0.500000 +0.494000 +0.465000 +1.428000 +1.328000 +0.816000 +0.582000 +0.612000 +0.495000 +0.380000 +0.317000 +0.285000 +0.264000 +0.248000 +0.240000 +0.217000 +0.228000 +0.242000 +0.329000 +1.234000 +1.224000 +0.592000 +0.425000 +0.347000 +0.299000 +0.269000 +0.269000 +0.328000 +0.657000 +1.056000 +0.687000 +1.569000 +1.342000 +0.578000 +0.447000 +0.375000 +0.326000 +0.299000 +0.286000 +0.264000 +0.264000 +0.242000 +0.240000 +0.240000 +0.237000 +0.234000 +0.261000 +0.271000 +0.492000 +0.618000 +0.449000 +0.387000 +0.820000 +4.261000 +2.616000 +1.402000 +0.758000 +0.557000 +0.956000 +0.702000 +0.500000 +0.450000 +0.454000 +0.797000 +0.496000 +0.388000 +0.393000 +0.436000 +0.522000 +0.822000 +0.799000 +0.487000 +0.406000 +0.366000 +0.342000 +0.312000 +0.308000 +0.437000 +0.584000 +3.599000 +1.543000 +0.862000 +0.585000 +0.495000 +0.545000 +1.109000 +0.680000 +0.476000 +0.404000 +0.699000 +2.520000 +0.945000 +0.708000 +1.066000 +1.332000 +1.184000 +0.628000 +0.505000 +0.464000 +0.776000 +0.510000 +0.416000 +0.370000 +0.342000 +0.316000 +0.307000 +0.288000 +0.288000 +0.635000 +1.469000 +0.886000 +0.658000 +1.285000 +2.338000 +3.063000 +5.268000 +2.197000 +0.992000 +0.739000 +0.609000 +0.958000 +1.315000 +0.859000 +0.626000 +0.597000 +0.570000 +0.535000 +0.546000 +0.594000 +0.579000 +0.495000 +0.468000 +0.574000 +1.141000 +0.680000 +0.859000 +0.770000 +1.453000 +1.630000 +1.534000 +0.892000 +0.693000 +0.645000 +0.658000 +0.616000 +0.737000 +1.445000 +0.827000 +0.701000 +0.619000 +0.562000 +0.523000 +0.492000 +0.467000 +0.450000 +0.432000 +0.432000 +0.537000 +1.784000 +2.127000 +1.879000 +2.153000 +0.960000 +1.403000 +1.163000 +1.113000 +1.210000 +2.769000 +2.449000 +1.211000 +1.265000 +3.069000 +7.445000 +6.218000 +2.685000 +4.296000 +3.989000 +5.614000 +3.233000 +2.004000 +1.395000 +1.136000 +0.990000 +1.421000 +2.543000 +3.449000 +2.480000 +2.984000 +2.208000 +3.575000 +2.767000 +2.385000 +2.444000 +2.543000 +2.350000 +2.697000 +3.141000 +3.664000 +7.508000 +6.941000 +6.760000 +3.288000 +2.115000 +1.485000 +1.282000 +1.148000 +1.114000 +1.465000 +1.055000 +0.895000 +0.804000 +0.750000 +0.706000 +0.751000 +0.859000 +1.872000 +2.109000 +1.190000 +0.980000 +1.744000 +2.307000 +2.185000 +1.899000 +1.306000 +1.087000 +0.985000 +0.884000 +0.802000 +0.738000 +0.685000 +0.679000 +0.659000 +0.669000 +0.636000 +0.606000 +0.705000 +0.822000 +0.695000 +0.861000 +1.867000 +1.589000 +1.283000 +0.995000 +0.873000 +2.080000 +0.994000 +0.850000 +1.569000 +5.634000 +2.550000 +1.383000 +0.956000 +0.815000 +0.848000 +0.820000 +0.717000 +0.647000 +0.620000 +0.652000 +1.225000 +1.035000 +0.880000 +1.446000 +0.897000 +0.745000 +0.710000 +0.636000 +0.583000 +0.547000 +0.528000 +0.510000 +0.502000 +0.509000 +0.511000 +0.467000 +0.438000 +0.432000 +0.415000 +0.408000 +0.398000 +0.384000 +0.380000 +0.366000 +0.360000 +0.360000 +0.354000 +0.336000 +0.336000 +0.372000 +0.928000 +1.341000 +1.112000 +1.303000 +1.408000 +1.055000 +0.918000 +1.592000 +1.132000 +1.094000 +1.011000 +0.752000 +0.623000 +0.628000 +1.041000 +3.856000 +5.405000 +3.295000 +2.557000 +2.549000 +1.944000 +1.195000 +4.206000 +9.155000 +7.078000 +3.825000 +5.582000 +4.855000 +2.876000 +1.905000 +1.419000 +1.202000 +1.046000 +0.938000 +1.064000 +1.183000 +2.546000 +8.465000 +7.879000 +4.959000 +2.848000 +2.133000 +1.451000 +1.186000 +1.084000 +1.057000 +1.352000 +1.105000 +0.924000 +0.822000 +0.755000 +0.704000 +0.660000 +0.629000 +0.601000 +0.580000 +0.557000 +0.580000 +0.603000 +0.572000 +0.574000 +0.559000 +0.525000 +0.532000 +0.545000 +1.137000 +4.512000 +5.949000 +3.675000 +1.860000 +1.204000 +0.975000 +1.022000 +4.240000 +5.211000 +3.613000 +1.597000 +1.131000 +0.972000 +2.409000 +5.850000 +5.775000 +3.332000 +1.831000 +1.286000 +1.197000 +2.552000 +2.366000 +1.680000 +1.472000 +1.387000 +1.396000 +1.882000 +3.607000 +6.674000 +7.069000 +3.943000 +2.813000 +3.146000 +4.553000 +3.077000 +2.231000 +1.678000 +1.239000 +1.068000 +1.109000 +2.115000 +2.165000 +1.145000 +0.924000 +0.818000 +0.757000 +0.718000 +0.696000 +0.696000 +0.676000 +0.629000 +0.616000 +0.604000 +0.616000 +0.680000 +0.835000 +0.633000 +1.042000 +2.570000 +1.582000 +1.733000 +1.137000 +0.899000 +0.712000 +0.621000 +0.582000 +0.569000 +0.545000 +1.788000 +1.658000 +2.494000 +2.740000 +1.335000 +1.341000 +1.128000 +0.926000 +0.773000 +0.781000 +1.663000 +1.715000 +1.774000 +1.799000 +1.449000 +2.660000 +1.288000 +0.924000 +0.781000 +0.699000 +0.624000 +0.573000 +0.546000 +0.528000 +0.506000 +0.493000 +0.775000 +0.996000 +0.958000 +0.844000 +1.153000 +0.706000 +0.741000 +0.913000 +0.810000 +0.606000 +0.722000 +1.209000 +0.739000 +0.830000 +8.071000 +13.712000 +14.621000 +12.193000 +9.162000 +7.177000 +6.447000 +5.153000 +4.714000 +5.725000 +4.433000 +3.336000 +2.606000 +2.043000 +1.537000 +1.269000 +1.122000 +3.443000 +5.677000 +3.323000 +2.231000 +2.789000 +4.896000 +5.394000 +4.699000 +3.314000 +2.410000 +1.717000 +1.434000 +1.400000 +1.428000 +1.441000 +1.248000 +1.237000 +1.284000 +1.578000 +1.340000 +2.288000 +2.051000 +2.692000 +2.013000 +1.291000 +1.088000 +1.076000 +1.106000 +1.297000 +1.559000 +1.783000 +1.065000 +0.954000 +1.324000 +1.131000 +0.900000 +1.024000 +1.410000 +1.133000 +2.659000 +3.518000 +5.139000 +4.844000 +4.078000 +5.179000 +9.910000 +12.343000 +13.279000 +11.090000 +8.050000 +6.026000 +4.192000 +3.083000 +2.897000 +2.862000 +2.383000 +2.548000 +3.234000 +3.263000 +4.410000 +2.724000 +2.085000 +1.535000 +1.521000 +5.088000 +6.071000 +4.399000 +3.449000 +2.710000 +3.956000 +9.199000 +9.315000 +8.794000 +7.789000 +5.482000 +4.724000 +5.186000 +6.786000 +6.476000 +8.070000 +7.849000 +9.329000 +7.323000 +4.696000 +3.350000 +2.739000 +2.396000 +2.158000 +1.857000 +1.706000 +1.545000 +1.474000 +1.381000 +1.259000 +1.208000 +1.261000 +1.189000 +1.072000 +1.035000 +1.003000 +0.961000 +0.965000 +0.988000 +1.008000 +1.009000 +0.996000 +1.004000 +3.573000 +8.524000 +8.222000 +9.161000 +8.311000 +5.500000 +3.375000 +2.393000 +1.980000 +2.490000 +2.381000 +2.201000 +1.536000 +1.267000 +1.286000 +1.375000 +1.319000 +1.162000 +2.061000 +4.512000 +3.262000 +2.336000 +1.792000 +1.350000 +1.168000 +1.085000 +1.007000 +0.949000 +0.936000 +0.900000 +0.894000 +0.895000 +0.875000 +0.836000 +0.840000 +0.814000 +0.799000 +0.788000 +0.750000 +0.721000 +0.724000 +1.038000 +2.693000 +1.755000 +1.054000 +0.960000 +0.902000 +0.879000 +1.854000 +3.012000 +5.009000 +4.709000 +3.282000 +2.462000 +1.614000 +1.307000 +1.150000 +1.081000 +1.007000 +0.954000 +0.908000 +0.871000 +0.864000 +0.842000 +0.824000 +0.782000 +0.777000 +0.838000 +0.900000 +0.889000 +1.013000 +1.146000 +1.075000 +0.906000 +0.985000 +1.078000 +1.138000 +2.084000 +3.755000 +2.365000 +1.319000 +1.168000 +2.514000 +1.551000 +0.968000 +0.807000 +0.771000 +0.763000 +0.768000 +0.988000 +0.887000 +0.734000 +0.739000 +0.808000 +0.640000 +0.577000 +0.544000 +0.528000 +0.586000 +0.573000 +0.538000 +0.503000 +0.488000 +0.635000 +1.070000 +0.948000 +0.833000 +0.708000 +0.851000 +2.894000 +1.346000 +1.725000 +5.124000 +2.521000 +1.229000 +1.176000 +0.922000 +0.805000 +0.807000 +0.771000 +0.662000 +0.615000 +0.650000 +0.924000 +0.936000 +0.701000 +0.581000 +0.524000 +0.494000 +0.480000 +0.461000 +0.449000 +0.432000 +0.423000 +0.408000 +0.408000 +0.408000 +0.408000 +0.408000 +0.408000 +0.420000 +0.459000 +0.424000 +0.388000 +0.360000 +0.360000 +0.375000 +0.394000 +0.573000 +0.509000 +0.406000 +0.367000 +0.374000 +0.403000 +0.372000 +0.363000 +0.336000 +0.358000 +0.336000 +0.336000 +0.353000 +0.324000 +0.299000 +0.288000 +0.288000 +0.279000 +0.275000 +0.267000 +0.264000 +0.328000 +0.292000 +0.264000 +0.264000 +0.244000 +0.240000 +0.240000 +0.240000 +0.256000 +0.264000 +0.264000 +0.267000 +0.283000 +0.587000 +3.091000 +1.404000 +0.774000 +0.739000 +1.307000 +0.638000 +0.482000 +0.545000 +4.176000 +2.255000 +0.733000 +0.548000 +0.460000 +0.421000 +0.391000 +0.385000 +0.379000 +0.401000 +0.431000 +0.937000 +0.923000 +1.041000 +0.557000 +0.435000 +0.383000 +0.365000 +0.686000 +0.793000 +0.619000 +0.467000 +0.390000 +0.352000 +0.333000 +0.312000 +0.297000 +0.288000 +0.288000 +0.288000 +0.286000 +0.388000 +1.900000 +1.636000 +0.738000 +0.547000 +0.516000 +0.450000 +0.432000 +0.410000 +0.421000 +0.874000 +1.742000 +0.909000 +0.633000 +0.511000 +0.455000 +0.405000 +0.368000 +0.345000 +0.335000 +0.313000 +0.312000 +0.295000 +0.288000 +0.280000 +0.264000 +0.288000 +0.328000 +0.994000 +2.298000 +1.069000 +0.585000 +0.539000 +0.563000 +0.454000 +0.406000 +0.371000 +0.360000 +0.519000 +2.138000 +3.073000 +2.514000 +1.892000 +0.909000 +2.043000 +2.518000 +2.717000 +4.659000 +6.078000 +3.032000 +4.230000 +3.650000 +4.112000 +4.743000 +2.786000 +1.540000 +1.719000 +1.796000 +3.064000 +5.160000 +2.607000 +2.085000 +1.707000 +1.357000 +2.192000 +1.617000 +1.137000 +1.167000 +1.023000 +0.891000 +1.023000 +0.829000 +0.742000 +0.705000 +0.870000 +0.835000 +4.392000 +5.395000 +3.677000 +2.534000 +1.771000 +1.209000 +1.000000 +0.885000 +0.813000 +0.767000 +0.713000 +0.664000 +0.640000 +0.617000 +0.600000 +2.410000 +1.162000 +0.830000 +1.000000 +1.109000 +0.804000 +0.691000 +0.730000 +0.971000 +1.697000 +2.869000 +4.201000 +1.741000 +3.345000 +4.238000 +4.616000 +6.306000 +5.219000 +7.027000 +7.916000 +5.265000 +3.520000 +6.490000 +5.917000 +3.324000 +5.980000 +4.570000 +5.278000 +5.094000 +4.622000 +3.884000 +5.226000 +6.759000 +5.375000 +5.913000 +7.163000 +5.637000 +3.834000 +3.154000 +3.134000 +2.695000 +3.489000 +3.270000 +3.048000 +3.494000 +4.278000 +2.993000 +3.565000 +4.196000 +3.389000 +3.482000 +4.230000 +5.800000 +5.526000 +6.062000 +5.675000 +3.802000 +4.511000 +5.477000 +5.639000 +3.560000 +3.040000 +5.431000 +5.637000 +4.670000 +5.770000 +6.922000 +4.886000 +3.745000 +6.306000 +7.263000 +7.630000 +8.883000 +6.374000 +4.306000 +4.011000 +3.227000 +3.259000 +3.359000 +4.166000 +4.347000 +4.016000 +2.822000 +2.683000 +3.736000 +2.420000 +1.805000 +2.782000 +2.809000 +1.778000 +1.390000 +1.294000 +2.485000 +1.409000 +1.147000 +1.035000 +0.969000 +0.921000 +0.879000 +0.842000 +0.807000 +0.772000 +0.749000 +0.774000 +0.819000 +1.157000 +1.277000 +1.071000 +0.992000 +0.840000 +0.760000 +0.846000 +1.282000 +3.167000 +2.123000 +1.176000 +1.044000 +2.009000 +1.143000 +1.079000 +1.139000 +1.041000 +1.894000 +2.099000 +1.431000 +0.976000 +0.838000 +0.754000 +0.707000 +0.664000 +0.619000 +0.589000 +0.573000 +0.550000 +0.528000 +0.518000 +0.504000 +0.504000 +0.540000 +0.582000 +0.625000 +0.706000 +0.861000 +0.694000 +0.607000 +0.556000 +0.611000 +1.076000 +0.790000 +0.615000 +0.561000 +0.552000 +0.530000 +0.642000 +1.026000 +1.227000 +3.377000 +3.260000 +3.337000 +2.790000 +1.289000 +0.906000 +0.772000 +0.674000 +0.612000 +0.567000 +0.532000 +0.570000 +0.789000 +1.702000 +3.176000 +3.215000 +1.499000 +1.118000 +3.465000 +3.774000 +1.825000 +1.078000 +0.889000 +0.807000 +0.931000 +2.090000 +1.439000 +0.949000 +1.294000 +1.303000 +0.946000 +0.956000 +0.825000 +0.671000 +0.617000 +0.584000 +0.559000 +0.537000 +0.508000 +0.481000 +0.462000 +0.451000 +0.432000 +0.422000 +0.408000 +0.405000 +0.384000 +0.384000 +0.384000 +0.389000 +0.385000 +0.360000 +0.360000 +0.348000 +0.343000 +0.441000 +0.504000 +0.448000 +0.388000 +0.374000 +0.404000 +0.361000 +0.336000 +0.340000 +0.346000 +0.335000 +0.358000 +0.363000 +0.336000 +0.353000 +0.390000 +0.422000 +0.366000 +0.326000 +0.307000 +0.288000 +0.288000 +0.291000 +0.294000 +0.288000 +0.266000 +0.264000 +0.269000 +0.352000 +0.525000 +0.637000 +0.689000 +0.466000 +0.692000 +0.542000 +0.606000 +0.590000 +0.784000 +1.085000 +0.639000 +0.552000 +0.703000 +0.762000 +0.511000 +0.455000 +0.450000 +0.399000 +0.355000 +0.336000 +0.342000 +0.345000 +0.336000 +0.322000 +0.308000 +0.304000 +0.288000 +0.369000 +0.467000 +0.361000 +0.321000 +0.296000 +0.288000 +0.285000 +0.291000 +0.312000 +0.312000 +0.288000 +0.281000 +0.264000 +0.264000 +0.264000 +0.260000 +0.255000 +0.264000 +0.256000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.240000 +0.218000 +0.216000 +0.217000 +0.238000 +0.216000 +0.216000 +0.216000 +0.216000 +0.216000 +0.252000 +0.653000 +0.625000 +0.553000 +0.716000 +0.924000 +0.765000 +0.680000 +0.678000 +0.862000 +0.881000 +1.595000 +1.127000 +1.216000 +1.351000 +1.314000 +1.815000 +0.898000 +0.679000 +0.887000 +0.664000 +0.644000 +1.309000 +1.823000 +1.416000 +1.180000 +0.963000 +0.782000 +1.340000 +0.956000 +0.840000 +0.688000 +NaN +1.224000 +1.273000 +0.775000 +0.491077 +1.548000 +2.676000 +1.389000 +4.402000 +2.867000 +1.552000 +3.577000 +2.037000 +1.045000 +0.825000 +1.468000 +3.826000 +1.936000 +1.038000 +0.829000 +1.014000 +1.215000 +1.108000 +1.050000 +0.905000 +0.797000 +0.750000 +0.898667 +0.856000 +0.791000 +0.763000 +1.466000 +0.888000 +2.303000 +3.324000 +2.344000 +1.318000 +0.979000 +3.572000 +2.116000 +1.373000 +2.004000 +3.478000 +2.638000 +1.940000 +2.031000 +6.076000 +6.408000 +3.720000 +1.518000 +1.192000 +1.074000 +0.906000 +0.799000 +0.754000 \ No newline at end of file diff --git a/hydromodel/example/division_rain.csv b/hydromodel/example/division_rain.csv new file mode 100644 index 0000000..84e0f7d --- /dev/null +++ b/hydromodel/example/division_rain.csv @@ -0,0 +1,9132 @@ +rain +6.017000 +4.929000 +0.380000 +0.073000 +0.534000 +4.487000 +3.600000 +0.345000 +0.454000 +2.990000 +3.307000 +0.688000 +0.027000 +0.323000 +1.320000 +3.852000 +1.494000 +0.601000 +6.466000 +0.263000 +0.861000 +2.448000 +12.039000 +3.589000 +14.421000 +3.048000 +18.185000 +12.320000 +8.048000 +4.279000 +6.610000 +7.564000 +4.336000 +0.297000 +7.134000 +0.021000 +0.066000 +24.037000 +3.587000 +1.143000 +3.123000 +5.208000 +4.105000 +5.910000 +2.599000 +1.390000 +0.152000 +3.199000 +0.579000 +16.399000 +3.844000 +2.429000 +0.003000 +0.504000 +5.090000 +6.077000 +14.087000 +7.309000 +3.936000 +3.583000 +0.299000 +0.191000 +1.133000 +0.092000 +0.250000 +0.060000 +1.591000 +0.867000 +1.370000 +0.127000 +0.028000 +5.436000 +0.016000 +0.636000 +0.001000 +0.000000 +0.047000 +1.096000 +0.102000 +0.240000 +0.037000 +0.131000 +2.248000 +0.466000 +0.000000 +0.049000 +0.010000 +0.799000 +0.000000 +0.005000 +0.002000 +0.642000 +3.248000 +0.047000 +1.014000 +0.821000 +0.350000 +0.000000 +0.009000 +0.149000 +0.007000 +0.307000 +0.302000 +1.651000 +0.583000 +1.476000 +2.669000 +2.072000 +0.979000 +0.552000 +0.616000 +0.171000 +0.001000 +0.022000 +0.060000 +2.494000 +0.034000 +0.138000 +0.005000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +2.203000 +0.487000 +5.413000 +4.090000 +1.393000 +4.358000 +0.497000 +0.000000 +0.000000 +9.743000 +0.936000 +1.689000 +0.000000 +0.007000 +0.000000 +0.195000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.045000 +0.478000 +0.320000 +0.004000 +0.142000 +1.073000 +0.594000 +0.460000 +2.344000 +4.364000 +0.191000 +4.216000 +4.977000 +0.026000 +0.054000 +1.092000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +2.627000 +2.048000 +1.370000 +4.384000 +24.967000 +0.521000 +1.784000 +0.179000 +1.605000 +5.615000 +0.053000 +0.118000 +9.268000 +3.191000 +0.793000 +0.000000 +13.063000 +2.452000 +0.027000 +7.426000 +0.733000 +0.872000 +0.013000 +0.095000 +0.000000 +0.000000 +0.000000 +4.313000 +0.313000 +0.000000 +0.000000 +0.000000 +0.025000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.726000 +0.117000 +0.676000 +0.806000 +0.000000 +0.000000 +0.000000 +0.000000 +0.017000 +0.381000 +3.093000 +0.053000 +0.061000 +0.995000 +1.288000 +0.209000 +0.000000 +0.282000 +0.838000 +4.614000 +1.823000 +1.657000 +0.000000 +10.416000 +0.041000 +0.398000 +0.000000 +0.000000 +20.916000 +0.736000 +0.011000 +0.000000 +0.145000 +6.152000 +1.643000 +0.722000 +0.418000 +1.667000 +0.303000 +0.013000 +1.105000 +1.476000 +0.239000 +0.002000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.463000 +2.431000 +1.770000 +6.124000 +1.698000 +0.069000 +0.566000 +0.349000 +8.646000 +0.060000 +0.001000 +0.002000 +0.563000 +2.426000 +11.628000 +0.138000 +0.318000 +6.508000 +1.793000 +3.046000 +5.595000 +0.001000 +0.000000 +0.874000 +1.658000 +11.794000 +0.000000 +0.041000 +0.025000 +2.302000 +1.598000 +0.058000 +3.294000 +6.240000 +1.142000 +0.253000 +0.005000 +0.001000 +2.842000 +0.792000 +8.392000 +1.385000 +7.989000 +2.926000 +9.125000 +1.630000 +0.105000 +1.954000 +1.506000 +0.994000 +1.013000 +0.612000 +0.418000 +0.022000 +0.228000 +1.586000 +1.902000 +0.470000 +1.284000 +1.875000 +0.171000 +7.129000 +1.062000 +5.397000 +1.499000 +0.008000 +1.140000 +0.268000 +0.159000 +3.892000 +5.721000 +4.458000 +1.998000 +0.034000 +0.072000 +0.004000 +0.000000 +0.002000 +0.006000 +0.001000 +0.000000 +0.661000 +27.638000 +32.307000 +4.643000 +1.850000 +2.291000 +0.054000 +0.298000 +0.000000 +0.357000 +0.795000 +0.293000 +0.885000 +0.531000 +3.566000 +0.207000 +1.745000 +0.637000 +0.874000 +17.433000 +11.963000 +3.914000 +14.571000 +1.673000 +3.809000 +5.859000 +14.258000 +2.446000 +3.780000 +1.112000 +13.413000 +8.988000 +3.576000 +11.868000 +7.179000 +4.698000 +0.237000 +3.005000 +0.000000 +0.000000 +0.025000 +0.025000 +2.469000 +5.062000 +0.068000 +0.518000 +0.000000 +0.000000 +1.490000 +1.233000 +0.000000 +0.000000 +0.000000 +0.068000 +0.001000 +0.044000 +0.262000 +3.073000 +0.110000 +0.050000 +0.000000 +0.160000 +2.887000 +8.082000 +5.878000 +6.346000 +5.006000 +3.261000 +2.331000 +0.334000 +1.274000 +3.604000 +0.236000 +0.002000 +0.000000 +0.044000 +1.877000 +11.299000 +8.809000 +23.223000 +3.989000 +0.100000 +0.688000 +6.075000 +10.509000 +0.041000 +2.203000 +3.752000 +18.289000 +0.158000 +1.746000 +4.118000 +3.820000 +2.293000 +0.162000 +0.186000 +0.236000 +0.051000 +1.433000 +0.275000 +7.100000 +3.663000 +9.111000 +5.586000 +6.146000 +1.439000 +1.182000 +0.038000 +0.059000 +0.039000 +0.000000 +0.000000 +0.000000 +0.000000 +0.022000 +1.305000 +3.301000 +6.616000 +0.338000 +8.815000 +1.638000 +5.234000 +2.600000 +0.463000 +0.040000 +0.000000 +0.000000 +0.004000 +0.144000 +0.000000 +0.000000 +0.093000 +0.185000 +2.001000 +4.735000 +2.316000 +3.901000 +0.255000 +0.024000 +0.145000 +0.035000 +0.000000 +0.000000 +0.000000 +5.805000 +1.760000 +1.166000 +0.191000 +3.662000 +2.762000 +0.746000 +0.697000 +1.348000 +0.000000 +0.000000 +0.001000 +0.003000 +0.286000 +0.876000 +0.002000 +1.940000 +1.330000 +1.410000 +0.016000 +0.010000 +0.000000 +0.003000 +0.006000 +0.169000 +0.313000 +0.000000 +0.039000 +0.012000 +0.013000 +0.113000 +0.094000 +0.037000 +0.020000 +5.462000 +2.688000 +0.241000 +0.108000 +1.077000 +0.039000 +2.607000 +6.897000 +2.085000 +2.851000 +0.650000 +3.195000 +1.052000 +2.820000 +3.436000 +1.882000 +6.728000 +5.966000 +0.058000 +5.874000 +5.866000 +0.791000 +0.118000 +1.785000 +0.247000 +0.541000 +0.100000 +0.421000 +0.400000 +1.801000 +0.231000 +4.516000 +0.129000 +0.000000 +0.000000 +2.065000 +1.803000 +1.583000 +0.000000 +1.912000 +1.732000 +0.470000 +0.216000 +0.521000 +0.250000 +0.032000 +0.792000 +0.635000 +2.481000 +0.038000 +0.169000 +2.784000 +2.637000 +1.432000 +0.001000 +0.000000 +0.000000 +0.000000 +0.000000 +1.407000 +0.001000 +0.000000 +0.041000 +0.137000 +1.213000 +13.381000 +0.765000 +0.962000 +0.385000 +0.132000 +0.008000 +0.000000 +0.000000 +0.000000 +0.054000 +1.087000 +0.367000 +0.176000 +0.859000 +0.000000 +0.087000 +0.505000 +6.438000 +0.009000 +0.005000 +0.001000 +0.666000 +0.447000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.021000 +0.012000 +0.415000 +0.026000 +0.092000 +2.539000 +0.040000 +7.251000 +0.011000 +0.553000 +0.119000 +0.000000 +4.946000 +1.962000 +0.480000 +3.192000 +0.520000 +10.869000 +0.957000 +4.479000 +3.454000 +0.032000 +2.510000 +0.296000 +1.726000 +0.022000 +6.840000 +0.046000 +5.854000 +5.466000 +0.334000 +0.222000 +0.018000 +0.712000 +6.331000 +0.591000 +0.450000 +3.154000 +2.826000 +0.318000 +0.043000 +0.002000 +0.000000 +0.003000 +0.056000 +0.474000 +0.827000 +0.759000 +0.034000 +0.325000 +3.133000 +11.703000 +22.625000 +5.834000 +6.597000 +6.841000 +6.565000 +0.195000 +1.247000 +5.989000 +1.977000 +0.010000 +11.928000 +2.257000 +7.519000 +10.443000 +4.859000 +0.425000 +0.000000 +4.972000 +15.089000 +4.239000 +0.817000 +9.216000 +0.030000 +0.005000 +0.000000 +1.844000 +0.212000 +0.047000 +0.714000 +0.066000 +0.051000 +0.605000 +0.299000 +0.006000 +0.072000 +0.050000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.027000 +0.021000 +0.000000 +0.016000 +0.023000 +6.654000 +2.091000 +9.815000 +3.993000 +13.137000 +3.605000 +11.081000 +0.033000 +0.509000 +0.065000 +0.001000 +0.019000 +0.468000 +0.149000 +0.114000 +0.363000 +0.194000 +8.470000 +0.146000 +20.348000 +1.098000 +0.062000 +8.364000 +2.287000 +0.024000 +0.014000 +0.110000 +0.000000 +0.000000 +0.012000 +0.006000 +0.000000 +0.218000 +0.565000 +0.057000 +0.000000 +0.000000 +0.000000 +0.000000 +1.126000 +0.000000 +0.000000 +0.006000 +0.049000 +0.020000 +0.000000 +0.021000 +2.807000 +4.577000 +7.398000 +0.031000 +0.000000 +0.000000 +0.261000 +1.335000 +1.777000 +0.248000 +3.434000 +0.887000 +2.709000 +1.131000 +0.378000 +0.563000 +5.911000 +0.129000 +0.430000 +0.308000 +5.274000 +0.459000 +0.114000 +0.003000 +0.102000 +2.252000 +0.418000 +0.040000 +2.705000 +0.380000 +0.457000 +0.025000 +0.142000 +0.039000 +2.237000 +0.088000 +1.348000 +3.728000 +2.670000 +6.399000 +5.503000 +0.399000 +3.340000 +0.002000 +0.007000 +1.660000 +0.614000 +1.547000 +8.537000 +3.873000 +1.320000 +1.043000 +1.167000 +0.846000 +1.499000 +0.648000 +5.615000 +9.629000 +21.875000 +3.529000 +8.560000 +0.820000 +0.060000 +0.066000 +0.912000 +2.165000 +0.715000 +0.003000 +0.000000 +3.346000 +0.756000 +3.278000 +20.232000 +7.423000 +1.264000 +1.579000 +0.727000 +0.005000 +0.057000 +0.187000 +2.135000 +0.347000 +3.612000 +0.765000 +4.357000 +2.241000 +0.846000 +0.205000 +5.647000 +0.194000 +1.528000 +0.181000 +0.564000 +0.752000 +1.709000 +0.407000 +1.537000 +2.624000 +0.341000 +1.354000 +2.821000 +0.005000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +5.571000 +0.368000 +0.000000 +0.034000 +2.474000 +4.052000 +2.278000 +0.337000 +0.104000 +0.259000 +3.199000 +2.124000 +6.474000 +0.899000 +0.144000 +0.119000 +0.070000 +0.877000 +0.000000 +0.002000 +0.092000 +1.102000 +0.071000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +6.356000 +0.273000 +0.691000 +3.088000 +0.000000 +18.035000 +10.357000 +0.013000 +0.009000 +0.991000 +7.507000 +4.787000 +0.158000 +5.042000 +0.995000 +0.224000 +0.025000 +0.136000 +0.300000 +4.098000 +2.476000 +2.412000 +0.087000 +7.400000 +0.005000 +0.535000 +0.008000 +1.022000 +1.901000 +0.093000 +0.000000 +0.027000 +0.000000 +0.006000 +0.004000 +0.000000 +3.262000 +1.012000 +1.920000 +0.021000 +0.432000 +21.187000 +7.164000 +0.021000 +1.328000 +5.989000 +0.973000 +0.000000 +0.545000 +0.019000 +1.162000 +0.090000 +0.000000 +0.003000 +0.017000 +5.871000 +0.890000 +0.254000 +3.208000 +10.801000 +7.481000 +0.946000 +2.004000 +19.670000 +0.631000 +0.240000 +4.065000 +0.867000 +0.000000 +0.000000 +8.088000 +1.021000 +1.012000 +0.714000 +0.002000 +5.319000 +7.115000 +3.311000 +1.298000 +0.451000 +0.002000 +1.679000 +0.197000 +0.772000 +0.739000 +12.474000 +18.093000 +10.772000 +1.855000 +0.525000 +4.348000 +0.624000 +0.113000 +0.350000 +8.048000 +0.018000 +14.059000 +6.681000 +0.285000 +0.003000 +0.039000 +0.235000 +0.067000 +0.159000 +0.293000 +0.136000 +0.090000 +0.008000 +2.734000 +1.550000 +1.976000 +0.045000 +0.099000 +0.027000 +0.635000 +0.280000 +0.288000 +1.400000 +1.658000 +12.622000 +2.381000 +11.884000 +2.130000 +0.695000 +0.089000 +0.114000 +2.187000 +9.401000 +0.678000 +0.259000 +0.069000 +1.069000 +0.981000 +0.159000 +9.630000 +3.318000 +5.618000 +0.889000 +0.011000 +4.064000 +3.541000 +2.998000 +0.497000 +1.335000 +2.842000 +2.704000 +8.118000 +5.380000 +1.829000 +7.699000 +4.537000 +2.649000 +3.249000 +0.042000 +0.973000 +11.717000 +18.664000 +15.900000 +4.096000 +2.307000 +0.472000 +7.625000 +3.608000 +0.095000 +0.449000 +0.036000 +4.093000 +0.281000 +0.351000 +0.373000 +0.072000 +1.094000 +0.396000 +26.421000 +0.001000 +0.000000 +0.003000 +0.000000 +0.000000 +0.044000 +0.013000 +0.450000 +0.104000 +0.000000 +0.000000 +0.014000 +0.063000 +0.000000 +0.006000 +5.463000 +3.888000 +3.320000 +0.183000 +2.136000 +0.179000 +4.642000 +9.066000 +6.897000 +2.668000 +8.997000 +2.362000 +10.860000 +2.901000 +1.265000 +5.004000 +3.974000 +1.463000 +7.789000 +2.271000 +13.449000 +7.623000 +0.316000 +0.220000 +2.955000 +2.902000 +0.206000 +0.132000 +1.577000 +0.071000 +0.003000 +0.005000 +0.009000 +2.936000 +2.154000 +0.015000 +0.863000 +0.644000 +0.641000 +0.249000 +0.002000 +0.009000 +0.000000 +0.017000 +0.073000 +0.090000 +0.245000 +0.170000 +0.036000 +0.012000 +0.163000 +0.005000 +0.002000 +1.233000 +4.114000 +2.373000 +5.241000 +3.831000 +0.078000 +0.119000 +0.226000 +0.100000 +0.003000 +0.000000 +0.017000 +0.073000 +0.238000 +0.678000 +0.576000 +0.502000 +0.036000 +0.613000 +0.745000 +0.379000 +0.208000 +0.000000 +0.120000 +0.928000 +0.632000 +1.178000 +0.151000 +0.000000 +0.000000 +0.000000 +0.082000 +0.466000 +2.442000 +3.421000 +1.903000 +0.434000 +8.823000 +1.308000 +18.489000 +2.210000 +0.228000 +4.544000 +14.987000 +0.703000 +2.026000 +6.110000 +0.065000 +0.000000 +0.027000 +2.392000 +0.069000 +8.645000 +2.672000 +0.934000 +0.878000 +0.151000 +4.316000 +1.662000 +16.790000 +1.140000 +0.017000 +0.007000 +0.003000 +0.003000 +0.048000 +2.133000 +0.204000 +0.000000 +0.588000 +0.057000 +0.006000 +0.000000 +0.058000 +6.284000 +3.830000 +0.000000 +8.308000 +40.363000 +1.878000 +12.538000 +6.151000 +1.050000 +0.074000 +11.339000 +0.683000 +0.000000 +0.000000 +0.000000 +0.000000 +1.977000 +0.622000 +1.014000 +1.869000 +6.122000 +2.918000 +2.025000 +0.855000 +0.551000 +0.008000 +0.000000 +0.000000 +0.000000 +0.000000 +0.528000 +1.641000 +6.612000 +0.583000 +0.000000 +10.028000 +1.701000 +0.006000 +1.717000 +3.299000 +1.186000 +0.000000 +0.089000 +0.401000 +4.269000 +0.037000 +3.544000 +0.887000 +0.000000 +0.000000 +0.005000 +0.104000 +0.000000 +0.035000 +0.192000 +0.233000 +0.000000 +0.000000 +0.003000 +2.219000 +0.221000 +0.990000 +0.868000 +0.014000 +2.717000 +6.292000 +5.103000 +4.588000 +0.289000 +1.972000 +12.784000 +4.854000 +0.025000 +0.546000 +1.641000 +0.372000 +1.928000 +0.874000 +2.008000 +0.287000 +0.636000 +0.151000 +0.835000 +0.041000 +1.563000 +1.782000 +6.289000 +44.571000 +1.113000 +0.846000 +0.303000 +8.594000 +0.028000 +8.246000 +7.797000 +0.009000 +0.061000 +9.574000 +0.859000 +0.063000 +0.000000 +0.186000 +0.066000 +0.057000 +2.338000 +0.938000 +0.024000 +0.297000 +0.011000 +0.000000 +0.000000 +0.018000 +0.000000 +0.016000 +0.000000 +0.114000 +0.585000 +0.000000 +0.006000 +0.000000 +0.218000 +19.165000 +6.504000 +3.782000 +0.543000 +1.274000 +33.725000 +15.232000 +14.016000 +2.430000 +0.429000 +0.000000 +0.018000 +3.777000 +0.994000 +0.184000 +0.022000 +0.311000 +0.694000 +0.534000 +0.038000 +0.005000 +0.688000 +7.755000 +3.254000 +17.281000 +2.137000 +2.051000 +14.990000 +6.502000 +10.067000 +0.791000 +0.921000 +0.119000 +1.654000 +8.149000 +1.233000 +0.913000 +0.230000 +0.001000 +0.000000 +0.000000 +0.113000 +3.328000 +1.690000 +0.383000 +0.009000 +0.338000 +0.007000 +0.016000 +0.000000 +0.029000 +0.179000 +0.307000 +0.023000 +0.000000 +0.002000 +1.280000 +0.450000 +0.117000 +0.116000 +0.244000 +0.722000 +3.549000 +0.199000 +0.032000 +1.032000 +11.483000 +12.989000 +0.007000 +0.000000 +0.000000 +0.000000 +0.000000 +2.150000 +4.701000 +1.480000 +0.021000 +0.054000 +0.541000 +0.193000 +0.175000 +0.000000 +5.509000 +5.903000 +2.158000 +0.698000 +1.708000 +5.693000 +0.682000 +3.543000 +1.773000 +15.953000 +1.208000 +6.709000 +2.195000 +8.742000 +14.614000 +9.228000 +5.287000 +0.360000 +0.838000 +3.326000 +9.237000 +0.125000 +0.566000 +2.786000 +3.475000 +4.706000 +2.568000 +0.201000 +3.472000 +3.237000 +5.509000 +5.849000 +0.331000 +0.422000 +13.053000 +12.352000 +0.340000 +10.123000 +0.975000 +2.300000 +0.439000 +3.688000 +2.151000 +2.239000 +10.237000 +4.634000 +4.652000 +0.549000 +0.666000 +1.211000 +4.085000 +0.344000 +0.328000 +0.317000 +0.109000 +6.685000 +1.230000 +9.670000 +3.192000 +18.969000 +0.270000 +1.306000 +0.683000 +0.375000 +7.079000 +0.039000 +9.948000 +0.704000 +0.583000 +2.034000 +0.551000 +2.360000 +0.063000 +0.000000 +0.000000 +0.000000 +0.015000 +0.086000 +1.846000 +2.607000 +0.251000 +0.000000 +0.000000 +1.258000 +3.817000 +0.207000 +1.668000 +2.208000 +7.189000 +20.186000 +3.838000 +2.380000 +0.414000 +1.321000 +7.454000 +0.124000 +2.968000 +1.525000 +1.041000 +3.358000 +0.502000 +0.116000 +3.247000 +4.001000 +2.337000 +2.672000 +0.314000 +4.588000 +0.402000 +2.951000 +0.257000 +0.178000 +0.008000 +1.724000 +13.965000 +0.017000 +4.450000 +0.002000 +3.070000 +1.033000 +0.721000 +3.818000 +8.772000 +7.883000 +1.114000 +3.453000 +1.177000 +4.386000 +0.022000 +4.509000 +8.514000 +1.291000 +0.376000 +0.001000 +7.080000 +0.145000 +0.109000 +0.121000 +0.212000 +0.024000 +0.126000 +0.154000 +4.192000 +2.996000 +3.521000 +9.273000 +0.900000 +4.185000 +0.907000 +0.506000 +1.434000 +0.000000 +0.000000 +0.000000 +0.134000 +0.506000 +0.942000 +3.949000 +0.066000 +2.627000 +0.104000 +0.076000 +0.002000 +0.000000 +0.005000 +0.000000 +0.000000 +13.193000 +0.009000 +0.021000 +0.010000 +0.000000 +0.116000 +2.201000 +6.650000 +1.283000 +0.000000 +0.000000 +0.109000 +0.078000 +0.027000 +0.000000 +0.000000 +0.000000 +2.280000 +0.754000 +6.899000 +1.566000 +0.136000 +1.193000 +0.025000 +0.514000 +0.475000 +0.024000 +0.000000 +0.000000 +0.000000 +0.000000 +0.094000 +2.261000 +0.066000 +0.276000 +0.623000 +0.016000 +4.485000 +0.048000 +0.000000 +3.428000 +2.606000 +0.442000 +0.299000 +0.002000 +0.126000 +0.000000 +0.033000 +0.018000 +0.088000 +0.876000 +0.064000 +3.274000 +0.367000 +0.000000 +0.004000 +0.186000 +0.301000 +0.400000 +0.000000 +0.176000 +1.316000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +1.266000 +0.013000 +0.000000 +15.844000 +0.309000 +0.564000 +6.186000 +0.003000 +0.000000 +7.464000 +3.704000 +4.237000 +0.094000 +4.510000 +8.085000 +0.575000 +0.001000 +0.068000 +0.311000 +0.053000 +1.230000 +2.107000 +0.024000 +0.000000 +0.000000 +0.000000 +0.128000 +11.583000 +0.250000 +0.055000 +0.000000 +0.003000 +0.000000 +6.294000 +5.434000 +3.402000 +1.153000 +1.966000 +0.982000 +0.030000 +1.709000 +9.262000 +6.106000 +0.017000 +1.757000 +1.416000 +0.247000 +4.351000 +1.107000 +2.945000 +2.911000 +5.884000 +4.077000 +16.186000 +2.745000 +7.309000 +11.301000 +0.466000 +0.004000 +0.072000 +3.332000 +5.577000 +0.379000 +0.003000 +0.053000 +4.583000 +12.236000 +0.028000 +0.150000 +0.000000 +0.000000 +0.096000 +4.904000 +8.796000 +8.093000 +0.561000 +0.006000 +0.005000 +0.346000 +0.056000 +0.003000 +0.000000 +0.000000 +0.000000 +0.007000 +0.001000 +0.882000 +2.262000 +0.001000 +0.000000 +3.521000 +14.748000 +2.133000 +10.248000 +6.056000 +0.301000 +6.475000 +0.463000 +0.618000 +0.403000 +1.237000 +5.152000 +3.284000 +0.295000 +0.093000 +7.779000 +3.214000 +14.964000 +0.500000 +0.114000 +1.115000 +5.874000 +0.949000 +0.716000 +11.283000 +5.303000 +8.927000 +3.699000 +1.611000 +2.121000 +9.254000 +1.600000 +7.724000 +0.066000 +0.039000 +0.478000 +0.169000 +0.108000 +0.107000 +0.013000 +0.011000 +0.005000 +0.007000 +0.112000 +0.070000 +7.498000 +14.779000 +6.201000 +2.013000 +9.473000 +8.537000 +0.867000 +4.316000 +4.330000 +1.476000 +12.380000 +0.221000 +0.456000 +0.232000 +6.185000 +4.772000 +1.346000 +0.025000 +0.006000 +0.012000 +0.255000 +0.128000 +2.370000 +8.859000 +7.666000 +15.998000 +7.883000 +7.365000 +7.777000 +0.057000 +0.003000 +0.809000 +1.991000 +5.716000 +0.127000 +0.323000 +1.611000 +1.671000 +10.288000 +0.016000 +0.052000 +0.242000 +1.463000 +0.404000 +4.005000 +9.683000 +0.489000 +8.420000 +3.297000 +16.700000 +1.547000 +3.421000 +0.243000 +6.793000 +13.570000 +6.353000 +8.231000 +1.960000 +0.284000 +33.501000 +0.858000 +0.122000 +1.620000 +0.113000 +0.094000 +0.129000 +4.390000 +1.885000 +0.715000 +7.981000 +13.132000 +3.714000 +5.691000 +5.428000 +9.724000 +7.115000 +1.679000 +5.932000 +3.469000 +5.179000 +1.240000 +25.408000 +2.088000 +0.263000 +0.029000 +0.492000 +0.991000 +3.478000 +8.754000 +0.971000 +0.394000 +2.022000 +6.661000 +1.011000 +2.051000 +2.807000 +0.649000 +0.006000 +4.856000 +0.057000 +0.075000 +1.002000 +0.882000 +1.297000 +9.353000 +2.583000 +0.148000 +0.009000 +0.000000 +0.000000 +0.022000 +2.385000 +1.902000 +7.502000 +2.470000 +5.753000 +0.062000 +4.655000 +0.613000 +0.063000 +0.000000 +0.035000 +0.600000 +0.149000 +0.000000 +0.000000 +0.000000 +1.149000 +0.029000 +0.000000 +0.000000 +0.000000 +0.004000 +0.019000 +0.005000 +1.881000 +4.391000 +0.923000 +2.482000 +1.532000 +11.492000 +0.050000 +4.452000 +0.000000 +0.000000 +0.000000 +0.000000 +0.025000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.052000 +1.715000 +0.267000 +0.392000 +0.123000 +0.240000 +0.116000 +2.287000 +0.267000 +4.256000 +8.026000 +0.720000 +0.316000 +0.143000 +0.000000 +0.424000 +0.245000 +13.595000 +0.780000 +0.355000 +5.216000 +6.417000 +2.504000 +0.387000 +0.054000 +2.260000 +0.438000 +2.870000 +2.833000 +0.160000 +1.077000 +3.085000 +0.370000 +0.034000 +0.509000 +2.338000 +1.073000 +0.007000 +0.012000 +0.000000 +0.725000 +1.925000 +0.026000 +0.925000 +0.437000 +0.000000 +0.000000 +0.022000 +0.048000 +0.053000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.157000 +0.271000 +0.006000 +1.101000 +0.220000 +1.373000 +0.000000 +0.000000 +0.000000 +2.924000 +0.126000 +5.957000 +5.516000 +1.372000 +0.558000 +5.559000 +2.092000 +0.110000 +0.303000 +2.791000 +0.000000 +0.282000 +0.037000 +0.000000 +0.615000 +0.099000 +0.001000 +0.434000 +0.452000 +0.005000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +3.417000 +0.050000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.010000 +0.844000 +0.067000 +0.355000 +1.318000 +1.839000 +0.114000 +0.711000 +0.005000 +0.120000 +0.000000 +4.549000 +8.101000 +0.124000 +0.692000 +0.765000 +22.979000 +19.572000 +3.494000 +3.857000 +17.284000 +0.938000 +0.062000 +0.064000 +0.012000 +0.062000 +4.317000 +0.244000 +0.566000 +0.326000 +0.000000 +0.273000 +0.539000 +6.723000 +1.447000 +0.485000 +1.993000 +0.026000 +0.013000 +1.205000 +2.314000 +1.055000 +3.049000 +3.763000 +0.375000 +10.052000 +0.627000 +0.148000 +0.057000 +0.008000 +0.048000 +0.010000 +0.000000 +0.000000 +0.269000 +0.049000 +3.502000 +0.023000 +0.077000 +0.812000 +0.000000 +0.124000 +0.013000 +7.781000 +0.803000 +0.335000 +0.420000 +0.046000 +0.000000 +0.043000 +0.651000 +0.249000 +0.016000 +0.000000 +0.000000 +0.000000 +0.425000 +0.232000 +2.970000 +1.875000 +6.561000 +17.607000 +0.140000 +0.016000 +0.322000 +16.088000 +12.996000 +2.366000 +0.031000 +0.000000 +0.013000 +4.203000 +0.423000 +1.527000 +6.108000 +0.839000 +3.765000 +1.928000 +0.216000 +0.819000 +0.011000 +0.130000 +0.709000 +10.651000 +4.151000 +1.819000 +6.885000 +1.649000 +0.551000 +0.009000 +0.013000 +0.038000 +0.388000 +1.451000 +1.582000 +0.777000 +0.194000 +0.017000 +0.198000 +0.892000 +0.187000 +0.507000 +21.597000 +3.379000 +0.606000 +0.009000 +0.344000 +0.000000 +0.000000 +0.003000 +0.353000 +3.067000 +2.468000 +0.400000 +0.110000 +2.533000 +2.659000 +1.863000 +6.970000 +6.947000 +1.361000 +0.309000 +4.999000 +1.181000 +5.505000 +0.180000 +0.018000 +0.042000 +0.013000 +0.000000 +0.061000 +1.572000 +0.415000 +0.429000 +0.000000 +0.000000 +1.171000 +3.984000 +4.072000 +1.135000 +0.001000 +0.000000 +0.000000 +0.000000 +0.285000 +2.694000 +0.194000 +1.407000 +1.773000 +0.745000 +2.346000 +7.049000 +5.381000 +2.793000 +26.488000 +2.942000 +0.134000 +0.516000 +0.977000 +1.556000 +7.753000 +3.102000 +1.905000 +1.982000 +1.680000 +1.375000 +2.202000 +4.079000 +0.275000 +0.001000 +0.000000 +0.001000 +0.264000 +1.655000 +2.648000 +0.229000 +0.004000 +0.621000 +0.357000 +0.426000 +2.933000 +0.002000 +5.850000 +2.272000 +0.091000 +0.000000 +0.314000 +6.356000 +0.881000 +0.054000 +0.236000 +0.116000 +1.977000 +3.199000 +0.627000 +0.076000 +0.205000 +0.633000 +0.048000 +0.644000 +0.067000 +0.085000 +0.310000 +0.006000 +0.001000 +0.000000 +0.000000 +0.004000 +0.025000 +0.071000 +0.187000 +0.003000 +1.652000 +0.272000 +1.080000 +0.041000 +0.377000 +0.006000 +0.781000 +0.635000 +3.381000 +0.252000 +0.704000 +0.163000 +0.000000 +14.544000 +1.265000 +5.343000 +0.823000 +0.295000 +0.397000 +0.527000 +9.030000 +8.915000 +2.727000 +0.010000 +0.000000 +0.056000 +0.593000 +0.002000 +0.028000 +0.133000 +3.629000 +1.960000 +2.659000 +0.045000 +0.000000 +0.001000 +0.213000 +0.540000 +0.284000 +3.834000 +1.847000 +0.308000 +5.239000 +1.264000 +2.066000 +0.089000 +4.928000 +1.609000 +0.922000 +0.774000 +4.335000 +0.256000 +0.072000 +0.498000 +1.032000 +0.077000 +0.217000 +0.274000 +5.256000 +4.695000 +0.079000 +0.374000 +3.368000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.004000 +0.005000 +0.001000 +0.000000 +0.000000 +0.000000 +0.000000 +4.249000 +0.032000 +7.040000 +0.698000 +0.895000 +6.459000 +0.481000 +7.570000 +8.170000 +0.000000 +0.019000 +5.445000 +0.145000 +0.384000 +0.000000 +1.903000 +0.880000 +0.114000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.051000 +6.518000 +1.880000 +0.082000 +0.201000 +0.068000 +1.818000 +7.479000 +0.337000 +0.345000 +0.010000 +0.057000 +0.000000 +0.000000 +0.012000 +7.597000 +3.564000 +0.290000 +1.643000 +11.413000 +1.690000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +1.832000 +1.841000 +6.507000 +6.383000 +7.776000 +0.552000 +10.944000 +4.901000 +11.166000 +0.068000 +0.080000 +0.000000 +1.169000 +3.817000 +0.417000 +0.764000 +0.000000 +0.000000 +0.095000 +0.085000 +0.000000 +0.015000 +0.491000 +0.025000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.578000 +1.075000 +1.410000 +0.360000 +0.000000 +0.003000 +0.377000 +0.591000 +3.002000 +0.513000 +5.859000 +10.492000 +0.130000 +0.354000 +0.217000 +4.445000 +2.984000 +0.180000 +1.766000 +0.032000 +1.910000 +0.004000 +0.026000 +0.136000 +0.530000 +0.000000 +0.405000 +4.820000 +1.908000 +0.045000 +6.148000 +0.808000 +3.487000 +0.035000 +0.018000 +0.003000 +6.885000 +2.450000 +5.086000 +7.227000 +5.288000 +1.271000 +0.428000 +1.599000 +0.991000 +0.557000 +1.843000 +8.476000 +7.747000 +8.224000 +0.012000 +2.703000 +1.193000 +0.340000 +10.670000 +6.363000 +0.001000 +0.898000 +0.158000 +1.234000 +3.785000 +0.122000 +4.156000 +10.231000 +0.596000 +3.567000 +0.356000 +5.572000 +6.977000 +3.650000 +0.008000 +1.183000 +1.903000 +0.427000 +3.846000 +2.275000 +15.085000 +2.195000 +0.018000 +0.019000 +0.004000 +0.022000 +0.073000 +0.150000 +0.000000 +1.022000 +0.906000 +0.258000 +0.389000 +1.043000 +0.295000 +8.640000 +25.918000 +2.919000 +0.000000 +0.168000 +0.540000 +0.223000 +0.607000 +1.382000 +1.211000 +2.897000 +1.479000 +6.150000 +2.143000 +0.283000 +0.244000 +0.040000 +0.006000 +0.917000 +1.258000 +0.001000 +0.011000 +0.011000 +0.039000 +1.374000 +0.215000 +0.024000 +0.000000 +0.045000 +0.064000 +0.250000 +0.147000 +1.542000 +0.299000 +0.405000 +1.375000 +0.253000 +0.435000 +0.065000 +0.024000 +0.579000 +0.012000 +0.005000 +0.000000 +0.150000 +0.652000 +0.149000 +4.204000 +11.444000 +0.186000 +1.253000 +2.178000 +0.119000 +1.452000 +8.218000 +7.872000 +5.462000 +0.546000 +0.005000 +0.176000 +8.681000 +16.866000 +8.606000 +17.329000 +13.381000 +4.846000 +0.699000 +3.209000 +11.242000 +6.035000 +4.593000 +2.698000 +2.392000 +1.204000 +10.255000 +0.001000 +0.030000 +1.859000 +0.046000 +0.027000 +0.011000 +0.400000 +0.066000 +0.002000 +0.013000 +0.234000 +1.838000 +0.177000 +0.083000 +0.171000 +1.585000 +0.999000 +0.105000 +0.000000 +2.799000 +0.853000 +4.763000 +0.525000 +1.119000 +2.855000 +0.091000 +0.000000 +0.007000 +0.000000 +0.025000 +0.156000 +0.884000 +0.526000 +1.141000 +0.175000 +0.025000 +0.000000 +0.001000 +0.000000 +0.005000 +0.000000 +0.000000 +0.017000 +0.004000 +0.008000 +0.000000 +0.055000 +0.114000 +0.037000 +1.417000 +0.035000 +0.139000 +1.071000 +5.782000 +0.971000 +0.508000 +2.786000 +0.006000 +0.000000 +0.025000 +0.000000 +0.000000 +9.056000 +26.613000 +0.381000 +2.024000 +4.336000 +0.691000 +8.439000 +3.222000 +2.301000 +1.596000 +0.000000 +0.000000 +0.226000 +7.767000 +1.398000 +2.559000 +2.397000 +0.748000 +0.040000 +0.001000 +0.000000 +0.034000 +0.021000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.005000 +0.005000 +0.000000 +0.000000 +1.634000 +6.793000 +4.519000 +2.870000 +0.513000 +0.005000 +21.501000 +11.789000 +0.426000 +1.075000 +0.662000 +0.003000 +1.238000 +0.236000 +3.908000 +5.039000 +2.950000 +5.378000 +0.004000 +0.000000 +23.451000 +12.879000 +0.990000 +16.699000 +0.327000 +5.985000 +4.772000 +4.762000 +4.867000 +1.132000 +0.002000 +0.002000 +0.000000 +0.045000 +3.029000 +0.134000 +0.000000 +0.612000 +11.206000 +0.113000 +0.391000 +1.331000 +1.521000 +0.194000 +0.000000 +0.000000 +0.000000 +0.001000 +0.532000 +6.245000 +6.213000 +10.498000 +0.232000 +1.639000 +2.594000 +1.743000 +1.102000 +4.591000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.208000 +0.001000 +10.513000 +0.038000 +0.000000 +0.000000 +1.083000 +0.037000 +0.000000 +0.673000 +4.629000 +0.075000 +6.045000 +0.618000 +0.019000 +0.155000 +5.489000 +3.363000 +1.771000 +0.190000 +19.706000 +0.421000 +0.019000 +6.170000 +0.615000 +0.638000 +1.794000 +0.101000 +0.000000 +0.000000 +0.000000 +1.480000 +1.033000 +0.476000 +0.122000 +2.620000 +4.075000 +0.048000 +0.035000 +0.001000 +0.000000 +0.008000 +0.000000 +0.000000 +0.000000 +0.011000 +0.044000 +0.022000 +0.098000 +0.277000 +1.978000 +0.592000 +0.005000 +0.000000 +0.019000 +0.036000 +5.599000 +3.263000 +0.880000 +15.151000 +2.604000 +0.037000 +0.060000 +0.481000 +2.836000 +3.475000 +5.803000 +0.004000 +0.009000 +0.281000 +0.115000 +0.000000 +0.024000 +0.007000 +0.028000 +0.000000 +0.000000 +0.036000 +0.005000 +0.007000 +1.193000 +0.028000 +0.321000 +0.731000 +0.337000 +0.085000 +4.564000 +0.027000 +0.014000 +11.895000 +3.610000 +0.891000 +0.436000 +0.083000 +0.341000 +0.471000 +0.152000 +5.677000 +0.124000 +8.552000 +7.179000 +9.943000 +0.237000 +0.018000 +0.939000 +3.753000 +2.159000 +1.761000 +8.198000 +6.463000 +12.142000 +0.748000 +0.075000 +0.322000 +1.944000 +0.127000 +1.022000 +1.826000 +0.601000 +6.163000 +7.908000 +11.959000 +8.699000 +0.056000 +0.000000 +0.020000 +1.221000 +0.007000 +2.269000 +13.542000 +11.839000 +2.374000 +0.068000 +1.015000 +5.121000 +15.312000 +10.724000 +1.672000 +0.164000 +2.830000 +1.470000 +4.395000 +3.369000 +14.448000 +1.055000 +14.091000 +6.203000 +1.205000 +2.848000 +4.298000 +22.067000 +0.643000 +0.000000 +0.049000 +0.320000 +7.198000 +3.382000 +4.280000 +3.248000 +1.452000 +15.802000 +4.122000 +0.753000 +1.150000 +3.303000 +1.095000 +0.859000 +0.048000 +0.030000 +0.000000 +0.000000 +0.005000 +0.074000 +1.726000 +0.038000 +0.054000 +0.024000 +0.423000 +0.078000 +4.476000 +1.142000 +0.982000 +0.732000 +3.342000 +3.858000 +0.273000 +0.023000 +0.004000 +0.058000 +1.250000 +0.009000 +0.119000 +0.015000 +0.244000 +2.855000 +0.406000 +0.094000 +0.001000 +0.040000 +0.186000 +4.595000 +5.303000 +7.415000 +4.351000 +8.136000 +17.344000 +3.303000 +12.703000 +4.431000 +1.100000 +0.534000 +8.018000 +1.668000 +2.929000 +0.001000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.005000 +0.000000 +0.000000 +0.025000 +3.281000 +4.306000 +2.773000 +0.073000 +0.000000 +8.931000 +1.329000 +0.016000 +2.350000 +4.778000 +17.275000 +12.804000 +3.260000 +1.996000 +3.209000 +8.940000 +4.471000 +11.539000 +4.169000 +0.195000 +0.001000 +0.168000 +0.040000 +2.643000 +2.149000 +1.866000 +1.563000 +1.727000 +2.051000 +12.426000 +6.164000 +0.550000 +1.067000 +3.155000 +3.536000 +7.353000 +0.550000 +0.041000 +0.013000 +0.632000 +0.446000 +0.120000 +1.055000 +2.432000 +1.136000 +1.946000 +3.136000 +2.876000 +4.410000 +0.082000 +0.043000 +0.010000 +0.007000 +0.000000 +0.000000 +0.000000 +0.005000 +0.408000 +0.163000 +0.004000 +0.364000 +0.082000 +0.096000 +1.094000 +1.441000 +5.852000 +14.293000 +0.023000 +2.652000 +0.860000 +31.571000 +3.915000 +0.000000 +0.000000 +16.909000 +1.567000 +7.688000 +2.951000 +6.482000 +9.978000 +0.097000 +3.796000 +5.217000 +3.530000 +1.407000 +0.155000 +2.350000 +0.131000 +0.392000 +0.147000 +0.144000 +2.799000 +0.813000 +0.923000 +5.554000 +5.933000 +0.299000 +0.024000 +0.333000 +0.189000 +0.013000 +0.019000 +0.101000 +1.128000 +0.000000 +0.014000 +2.791000 +0.215000 +1.613000 +0.490000 +6.705000 +1.831000 +0.901000 +0.330000 +0.009000 +9.015000 +0.943000 +1.737000 +5.598000 +5.299000 +2.326000 +0.726000 +0.117000 +0.015000 +1.661000 +0.997000 +3.132000 +4.600000 +6.560000 +11.816000 +2.363000 +0.000000 +6.944000 +0.091000 +0.036000 +0.433000 +0.790000 +0.103000 +0.016000 +0.018000 +0.022000 +0.715000 +0.728000 +1.478000 +0.028000 +0.297000 +5.079000 +0.000000 +0.022000 +2.314000 +3.569000 +0.317000 +5.133000 +1.450000 +8.392000 +3.233000 +0.001000 +0.000000 +0.104000 +0.046000 +0.141000 +17.529000 +0.137000 +0.001000 +0.002000 +0.219000 +0.443000 +1.525000 +2.984000 +7.967000 +2.518000 +1.174000 +3.781000 +1.742000 +0.001000 +0.049000 +0.019000 +0.075000 +0.192000 +0.012000 +0.000000 +0.000000 +0.000000 +0.047000 +0.000000 +0.005000 +0.081000 +1.297000 +7.820000 +0.694000 +10.237000 +3.141000 +0.898000 +1.013000 +4.218000 +4.208000 +2.088000 +0.556000 +0.000000 +1.592000 +0.046000 +2.871000 +0.074000 +3.562000 +3.936000 +0.282000 +16.824000 +8.710000 +0.155000 +1.082000 +4.986000 +7.328000 +9.837000 +4.403000 +30.219000 +0.660000 +0.684000 +16.882000 +7.693000 +5.258000 +0.204000 +0.027000 +0.210000 +13.966000 +14.645000 +0.413000 +3.331000 +0.025000 +0.004000 +11.166000 +5.534000 +1.875000 +0.000000 +6.430000 +0.162000 +2.444000 +0.993000 +0.061000 +0.080000 +3.982000 +0.118000 +0.042000 +0.449000 +4.264000 +0.361000 +1.402000 +1.376000 +1.723000 +0.191000 +3.616000 +0.059000 +0.668000 +0.439000 +0.063000 +2.279000 +0.103000 +0.233000 +0.046000 +0.176000 +6.012000 +0.194000 +2.350000 +0.907000 +5.930000 +3.688000 +1.741000 +0.071000 +0.013000 +0.693000 +2.225000 +0.824000 +0.121000 +0.054000 +0.923000 +0.647000 +1.098000 +5.277000 +10.820000 +3.764000 +2.003000 +0.605000 +0.370000 +1.213000 +1.396000 +8.137000 +2.723000 +3.586000 +11.170000 +3.650000 +6.157000 +10.063000 +1.161000 +0.262000 +1.516000 +2.375000 +1.602000 +7.323000 +13.890000 +3.832000 +2.704000 +3.760000 +3.059000 +3.804000 +0.216000 +0.014000 +0.970000 +3.467000 +5.265000 +4.105000 +0.872000 +2.303000 +2.139000 +0.430000 +0.047000 +0.032000 +0.219000 +0.113000 +1.006000 +0.325000 +0.722000 +0.000000 +0.184000 +0.053000 +0.063000 +0.058000 +1.238000 +0.202000 +0.133000 +0.257000 +0.301000 +5.451000 +2.657000 +1.275000 +1.483000 +3.735000 +0.049000 +0.349000 +0.631000 +0.407000 +1.058000 +1.062000 +8.118000 +7.247000 +10.791000 +11.885000 +7.876000 +6.854000 +6.397000 +11.518000 +1.083000 +9.970000 +1.789000 +0.611000 +1.115000 +0.088000 +0.001000 +0.120000 +3.539000 +0.012000 +0.229000 +0.000000 +0.099000 +6.385000 +0.313000 +0.400000 +1.801000 +3.514000 +0.413000 +0.162000 +0.127000 +1.611000 +0.059000 +0.610000 +0.024000 +0.412000 +0.028000 +0.440000 +0.765000 +0.947000 +0.076000 +0.546000 +0.050000 +0.730000 +4.134000 +3.879000 +5.472000 +0.155000 +2.968000 +3.518000 +0.424000 +5.756000 +0.704000 +21.816000 +2.885000 +1.906000 +4.757000 +1.378000 +0.021000 +0.854000 +0.116000 +0.005000 +0.000000 +0.003000 +0.013000 +0.000000 +0.000000 +0.000000 +0.000000 +5.390000 +3.545000 +10.304000 +3.192000 +7.102000 +3.792000 +3.861000 +5.563000 +0.310000 +0.005000 +0.000000 +0.000000 +0.000000 +0.000000 +0.002000 +0.716000 +0.441000 +0.275000 +1.724000 +0.225000 +0.242000 +0.000000 +5.777000 +0.517000 +0.451000 +0.001000 +0.175000 +11.741000 +1.793000 +1.992000 +2.440000 +8.292000 +25.962000 +14.270000 +0.848000 +0.000000 +0.090000 +1.585000 +0.284000 +0.126000 +0.007000 +0.030000 +0.259000 +0.025000 +0.996000 +1.626000 +0.324000 +0.310000 +0.155000 +0.000000 +0.000000 +0.000000 +11.288000 +4.984000 +0.049000 +1.346000 +4.783000 +1.128000 +3.361000 +0.238000 +4.157000 +1.056000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.001000 +0.511000 +0.118000 +0.165000 +0.321000 +0.581000 +0.377000 +1.382000 +2.730000 +0.804000 +0.559000 +0.017000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.026000 +0.000000 +0.065000 +3.590000 +0.092000 +4.581000 +0.330000 +14.291000 +0.861000 +0.467000 +1.791000 +9.745000 +2.886000 +0.657000 +0.193000 +3.019000 +4.861000 +6.801000 +0.164000 +0.000000 +0.007000 +0.037000 +0.000000 +8.867000 +0.756000 +0.028000 +0.005000 +1.243000 +0.593000 +0.036000 +0.029000 +0.030000 +0.000000 +0.000000 +0.000000 +0.000000 +8.855000 +0.888000 +0.024000 +0.134000 +1.243000 +0.965000 +0.005000 +0.070000 +0.014000 +0.779000 +0.502000 +0.196000 +1.557000 +29.089000 +0.022000 +10.199000 +8.863000 +2.367000 +0.286000 +2.062000 +16.863000 +1.100000 +2.202000 +1.366000 +14.275000 +11.061000 +1.700000 +0.010000 +0.017000 +0.022000 +1.495000 +1.935000 +0.112000 +0.890000 +0.040000 +0.021000 +0.000000 +0.038000 +0.014000 +0.000000 +0.000000 +0.000000 +0.277000 +0.071000 +4.030000 +8.142000 +4.471000 +8.401000 +1.712000 +0.132000 +2.030000 +0.477000 +0.071000 +4.871000 +1.987000 +2.166000 +3.411000 +0.045000 +0.072000 +16.151000 +1.884000 +0.796000 +0.896000 +0.022000 +0.017000 +0.303000 +1.535000 +0.859000 +2.310000 +0.511000 +0.041000 +0.000000 +0.433000 +9.041000 +0.092000 +0.242000 +0.038000 +0.062000 +2.575000 +0.665000 +2.704000 +0.392000 +1.878000 +0.236000 +2.312000 +4.801000 +5.264000 +21.048000 +3.907000 +2.002000 +7.289000 +4.078000 +7.879000 +9.720000 +0.869000 +20.397000 +2.928000 +0.570000 +4.646000 +4.202000 +1.651000 +2.745000 +0.032000 +0.000000 +0.670000 +4.145000 +6.103000 +2.436000 +14.822000 +2.209000 +3.243000 +0.168000 +0.013000 +0.102000 +3.252000 +0.241000 +0.018000 +0.154000 +1.519000 +1.623000 +1.281000 +2.063000 +3.118000 +1.620000 +0.033000 +1.804000 +7.091000 +17.014000 +5.836000 +11.173000 +0.834000 +0.013000 +0.005000 +0.009000 +0.038000 +0.062000 +0.029000 +1.239000 +0.579000 +1.508000 +0.001000 +0.005000 +0.067000 +2.783000 +5.527000 +3.065000 +3.625000 +0.732000 +0.310000 +0.458000 +3.209000 +0.690000 +1.471000 +4.446000 +2.288000 +0.418000 +6.858000 +0.795000 +10.737000 +0.686000 +1.072000 +3.664000 +1.490000 +1.476000 +2.396000 +0.313000 +0.114000 +2.553000 +0.003000 +0.504000 +1.167000 +0.241000 +0.444000 +5.881000 +2.456000 +1.912000 +0.101000 +7.931000 +0.450000 +0.047000 +0.377000 +1.363000 +0.901000 +4.043000 +1.334000 +0.372000 +0.001000 +0.002000 +0.112000 +0.135000 +0.000000 +0.000000 +0.043000 +0.001000 +0.000000 +0.027000 +0.000000 +0.003000 +8.921000 +0.778000 +0.089000 +0.533000 +4.545000 +0.111000 +0.002000 +0.016000 +0.009000 +0.404000 +12.561000 +11.180000 +0.494000 +0.061000 +0.000000 +0.000000 +0.114000 +0.478000 +0.053000 +9.419000 +13.289000 +23.075000 +0.851000 +0.042000 +0.430000 +5.981000 +1.036000 +10.696000 +8.969000 +3.395000 +9.146000 +1.996000 +3.547000 +16.186000 +12.066000 +1.069000 +0.081000 +0.150000 +0.002000 +0.030000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +3.484000 +3.638000 +5.001000 +4.794000 +2.198000 +7.019000 +0.280000 +0.896000 +0.973000 +2.832000 +10.144000 +12.523000 +4.231000 +1.462000 +1.229000 +0.271000 +3.517000 +10.646000 +23.216000 +27.883000 +0.226000 +5.377000 +0.768000 +0.031000 +1.397000 +0.279000 +0.267000 +0.191000 +0.320000 +2.759000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.258000 +3.055000 +4.638000 +0.310000 +1.305000 +0.306000 +0.000000 +0.000000 +2.338000 +1.864000 +0.074000 +0.032000 +2.019000 +1.383000 +0.040000 +0.083000 +0.940000 +0.070000 +1.298000 +2.424000 +5.247000 +0.040000 +0.022000 +0.410000 +4.230000 +1.148000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.027000 +0.266000 +0.121000 +0.018000 +1.446000 +6.686000 +6.481000 +0.365000 +11.483000 +0.471000 +3.601000 +2.512000 +0.019000 +0.019000 +0.004000 +0.271000 +0.149000 +0.957000 +0.033000 +0.000000 +1.108000 +3.886000 +4.916000 +4.179000 +5.504000 +2.693000 +2.367000 +1.612000 +6.144000 +8.599000 +1.373000 +0.001000 +0.007000 +0.000000 +9.694000 +0.480000 +5.203000 +0.007000 +0.004000 +7.052000 +5.157000 +2.565000 +0.000000 +0.086000 +1.569000 +4.194000 +1.696000 +0.004000 +0.660000 +9.925000 +5.838000 +2.101000 +0.202000 +0.080000 +12.243000 +0.128000 +3.127000 +8.802000 +22.045000 +13.835000 +0.295000 +3.942000 +2.234000 +9.728000 +1.672000 +9.314000 +9.119000 +1.521000 +1.682000 +0.179000 +1.228000 +0.501000 +0.274000 +1.302000 +5.214000 +0.271000 +14.900000 +0.150000 +18.005000 +2.101000 +5.820000 +0.702000 +0.024000 +2.525000 +0.198000 +0.105000 +0.988000 +4.167000 +0.511000 +2.191000 +0.182000 +0.261000 +3.646000 +2.393000 +5.758000 +0.386000 +4.598000 +17.493000 +13.644000 +38.136000 +3.647000 +10.841000 +46.415000 +2.566000 +0.101000 +6.122000 +25.715000 +24.804000 +3.607000 +0.276000 +1.816000 +1.871000 +7.659000 +1.430000 +2.412000 +0.808000 +2.557000 +1.959000 +3.552000 +0.560000 +0.112000 +1.979000 +7.696000 +1.359000 +0.595000 +8.218000 +4.218000 +4.060000 +11.722000 +0.996000 +2.369000 +5.535000 +0.059000 +2.639000 +9.082000 +10.771000 +1.618000 +4.446000 +17.695000 +5.830000 +6.454000 +4.400000 +11.928000 +9.573000 +0.120000 +0.001000 +0.143000 +0.080000 +0.078000 +8.481000 +3.129000 +0.487000 +0.177000 +0.058000 +10.388000 +0.357000 +0.005000 +0.045000 +1.073000 +0.074000 +0.000000 +5.836000 +3.643000 +10.103000 +1.711000 +1.328000 +0.074000 +0.440000 +0.944000 +0.132000 +0.151000 +0.355000 +0.231000 +0.000000 +0.000000 +0.073000 +0.053000 +0.000000 +0.000000 +0.309000 +1.202000 +0.663000 +2.235000 +7.996000 +13.210000 +2.893000 +1.281000 +2.669000 +0.668000 +0.082000 +0.100000 +0.453000 +0.384000 +3.161000 +1.751000 +7.726000 +15.168000 +7.515000 +13.205000 +18.259000 +0.001000 +0.102000 +10.188000 +10.586000 +0.268000 +0.000000 +0.006000 +0.046000 +0.001000 +0.006000 +0.033000 +0.002000 +0.033000 +0.247000 +0.248000 +1.820000 +1.059000 +0.397000 +5.886000 +11.705000 +4.022000 +0.365000 +0.082000 +0.005000 +0.000000 +0.006000 +1.141000 +9.041000 +0.150000 +0.353000 +0.541000 +2.726000 +0.329000 +0.000000 +0.005000 +0.000000 +0.004000 +0.441000 +3.017000 +0.536000 +0.024000 +2.468000 +7.284000 +1.088000 +0.107000 +2.038000 +0.366000 +9.231000 +2.625000 +0.618000 +0.169000 +1.411000 +0.153000 +2.187000 +1.443000 +15.507000 +8.110000 +7.145000 +11.581000 +0.045000 +2.636000 +0.700000 +0.099000 +0.077000 +0.063000 +0.534000 +1.980000 +0.007000 +5.288000 +0.484000 +1.499000 +0.219000 +0.089000 +1.832000 +6.611000 +3.306000 +3.643000 +7.437000 +0.749000 +3.162000 +5.946000 +0.235000 +0.036000 +0.070000 +2.791000 +0.031000 +0.000000 +0.001000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.004000 +0.018000 +0.963000 +2.426000 +0.823000 +4.721000 +1.018000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.007000 +0.018000 +2.229000 +2.206000 +0.071000 +0.528000 +0.172000 +0.603000 +2.101000 +0.011000 +0.000000 +0.000000 +12.418000 +4.891000 +0.353000 +9.685000 +0.159000 +0.011000 +0.000000 +0.000000 +6.257000 +24.608000 +1.257000 +0.503000 +0.008000 +0.579000 +0.129000 +0.000000 +0.000000 +0.000000 +0.000000 +0.002000 +0.095000 +0.012000 +0.070000 +1.289000 +1.331000 +0.000000 +0.009000 +0.000000 +0.000000 +0.008000 +0.740000 +0.702000 +1.852000 +0.003000 +3.229000 +3.777000 +1.039000 +0.636000 +4.171000 +9.237000 +0.424000 +0.589000 +0.017000 +1.579000 +0.200000 +1.555000 +1.138000 +0.024000 +0.020000 +0.009000 +0.046000 +0.007000 +0.000000 +0.010000 +0.132000 +0.695000 +0.000000 +0.810000 +0.492000 +2.632000 +0.094000 +1.830000 +18.870000 +9.338000 +1.989000 +0.685000 +1.678000 +7.553000 +0.678000 +0.257000 +4.475000 +5.869000 +1.950000 +0.094000 +16.134000 +0.464000 +0.164000 +0.020000 +0.000000 +5.255000 +0.399000 +0.008000 +0.000000 +0.000000 +0.000000 +2.283000 +0.919000 +0.055000 +0.142000 +0.111000 +0.085000 +1.869000 +0.475000 +0.557000 +0.005000 +0.383000 +0.052000 +0.000000 +4.830000 +5.681000 +0.838000 +0.188000 +1.788000 +0.553000 +6.021000 +7.306000 +1.538000 +0.382000 +0.884000 +1.648000 +7.992000 +10.442000 +0.124000 +36.411000 +0.307000 +1.633000 +11.423000 +5.521000 +1.795000 +3.428000 +0.638000 +3.281000 +4.432000 +8.681000 +10.625000 +1.211000 +0.574000 +0.245000 +0.068000 +0.070000 +0.869000 +6.045000 +0.155000 +0.340000 +9.725000 +2.832000 +5.955000 +18.377000 +2.381000 +12.900000 +1.596000 +1.064000 +3.263000 +0.503000 +0.096000 +0.132000 +1.126000 +0.685000 +0.000000 +0.008000 +0.103000 +0.115000 +0.923000 +0.087000 +7.657000 +9.521000 +1.984000 +0.021000 +0.059000 +5.114000 +0.434000 +0.021000 +0.003000 +0.017000 +0.000000 +0.055000 +1.355000 +0.704000 +6.972000 +0.001000 +0.184000 +0.183000 +1.355000 +0.217000 +8.348000 +1.728000 +1.761000 +2.193000 +0.778000 +0.090000 +6.992000 +3.901000 +13.795000 +0.481000 +1.187000 +0.333000 +0.043000 +0.022000 +0.022000 +0.010000 +0.038000 +0.034000 +0.331000 +1.942000 +1.788000 +1.456000 +0.459000 +0.518000 +5.738000 +2.159000 +1.190000 +0.497000 +1.126000 +0.146000 +5.147000 +1.509000 +0.000000 +2.105000 +0.148000 +0.091000 +0.009000 +0.072000 +0.041000 +0.629000 +0.153000 +0.039000 +0.018000 +0.000000 +0.115000 +4.891000 +0.030000 +0.312000 +1.468000 +0.207000 +0.891000 +3.072000 +3.796000 +1.955000 +5.525000 +2.753000 +0.830000 +10.485000 +0.777000 +9.854000 +6.849000 +2.438000 +5.532000 +2.292000 +4.934000 +10.453000 +14.733000 +6.484000 +9.053000 +10.571000 +5.756000 +1.343000 +3.498000 +5.718000 +10.311000 +4.098000 +11.574000 +2.374000 +9.254000 +0.026000 +0.009000 +0.000000 +0.350000 +1.688000 +6.327000 +4.837000 +2.285000 +8.291000 +4.290000 +0.575000 +12.236000 +17.602000 +4.050000 +3.254000 +1.124000 +0.140000 +0.086000 +0.205000 +0.238000 +2.536000 +0.318000 +1.005000 +7.601000 +9.807000 +0.134000 +0.000000 +0.000000 +0.666000 +8.695000 +2.364000 +0.984000 +0.669000 +1.075000 +7.018000 +0.042000 +0.000000 +0.000000 +0.099000 +1.519000 +0.001000 +0.011000 +0.086000 +0.027000 +0.020000 +0.054000 +1.007000 +0.577000 +0.370000 +0.007000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.010000 +0.383000 +0.148000 +1.257000 +0.013000 +0.019000 +0.081000 +0.200000 +0.003000 +0.019000 +0.744000 +0.515000 +0.000000 +0.011000 +0.038000 +3.307000 +3.319000 +7.574000 +4.889000 +7.421000 +1.449000 +0.196000 +0.812000 +0.173000 +0.024000 +0.047000 +0.855000 +0.044000 +0.007000 +0.002000 +0.000000 +0.068000 +8.344000 +1.375000 +1.418000 +0.000000 +0.000000 +4.449000 +0.205000 +3.476000 +10.728000 +5.172000 +0.160000 +13.776000 +2.905000 +8.904000 +0.430000 +2.814000 +3.428000 +4.421000 +1.640000 +0.009000 +6.830000 +0.950000 +0.228000 +1.089000 +0.610000 +0.123000 +0.707000 +5.753000 +3.486000 +0.209000 +1.978000 +2.928000 +26.197000 +1.771000 +1.055000 +0.021000 +0.144000 +0.053000 +0.019000 +0.297000 +1.223000 +0.079000 +0.010000 +0.000000 +0.935000 +1.623000 +0.000000 +0.073000 +3.046000 +5.276000 +1.406000 +5.883000 +4.710000 +14.677000 +0.188000 +0.002000 +1.222000 +1.299000 +0.093000 +0.989000 +0.650000 +0.000000 +0.000000 +0.018000 +0.001000 +0.178000 +0.108000 +12.003000 +12.703000 +1.281000 +0.798000 +4.932000 +0.033000 +0.394000 +0.000000 +0.000000 +0.000000 +0.045000 +32.749000 +1.964000 +23.550000 +42.992000 +0.366000 +1.935000 +0.050000 +1.043000 +1.918000 +0.149000 +4.795000 +12.209000 +0.949000 +0.095000 +0.207000 +0.266000 +0.036000 +0.000000 +0.000000 +3.096000 +0.746000 +0.323000 +0.124000 +2.366000 +4.403000 +4.603000 +0.277000 +0.005000 +0.012000 +0.001000 +0.686000 +1.580000 +0.000000 +0.009000 +0.000000 +0.000000 +0.000000 +2.883000 +7.762000 +3.029000 +0.130000 +19.777000 +0.554000 +0.005000 +0.000000 +0.000000 +0.000000 +0.002000 +0.001000 +0.000000 +0.000000 +0.004000 +0.000000 +0.041000 +0.322000 +0.061000 +0.004000 +0.085000 +0.330000 +0.009000 +0.000000 +0.000000 +0.000000 +0.045000 +0.866000 +0.214000 +0.451000 +0.231000 +0.064000 +0.059000 +0.101000 +0.000000 +0.003000 +1.972000 +14.225000 +5.408000 +4.328000 +1.265000 +3.587000 +0.499000 +0.525000 +0.028000 +12.450000 +31.953000 +4.105000 +0.901000 +0.552000 +16.021000 +5.329000 +13.421000 +0.369000 +5.248000 +0.012000 +0.168000 +16.580000 +10.692000 +1.780000 +0.103000 +0.319000 +4.695000 +0.146000 +11.695000 +0.004000 +4.065000 +3.839000 +4.690000 +1.944000 +17.980000 +0.290000 +3.744000 +1.904000 +0.000000 +0.137000 +5.967000 +7.412000 +1.319000 +2.427000 +0.012000 +0.078000 +0.009000 +3.485000 +1.352000 +0.229000 +4.040000 +6.498000 +5.156000 +0.285000 +2.743000 +0.078000 +1.220000 +1.872000 +0.397000 +0.000000 +0.000000 +0.000000 +0.011000 +2.644000 +4.207000 +8.063000 +5.287000 +0.463000 +0.015000 +0.012000 +0.000000 +4.063000 +11.898000 +12.979000 +1.823000 +0.631000 +6.682000 +7.845000 +0.055000 +23.780000 +10.944000 +0.963000 +9.645000 +10.226000 +2.975000 +1.287000 +0.757000 +0.107000 +0.558000 +1.182000 +3.285000 +1.967000 +0.065000 +0.513000 +0.389000 +2.816000 +3.452000 +0.160000 +3.118000 +2.651000 +4.881000 +7.888000 +3.857000 +2.438000 +0.095000 +0.256000 +2.113000 +2.602000 +2.330000 +2.774000 +0.776000 +0.706000 +0.174000 +1.510000 +6.523000 +5.167000 +0.093000 +0.002000 +0.141000 +0.089000 +1.506000 +6.427000 +2.062000 +1.363000 +0.176000 +1.475000 +0.018000 +0.036000 +0.000000 +0.000000 +0.005000 +0.000000 +0.022000 +0.039000 +0.031000 +0.842000 +0.231000 +0.034000 +0.012000 +0.014000 +9.512000 +4.811000 +1.334000 +0.109000 +1.995000 +0.271000 +0.000000 +5.164000 +3.133000 +1.370000 +12.671000 +3.883000 +1.510000 +0.045000 +0.001000 +0.018000 +0.015000 +0.000000 +0.042000 +0.029000 +0.003000 +0.011000 +0.058000 +0.159000 +0.575000 +0.011000 +0.000000 +0.010000 +0.000000 +0.001000 +0.011000 +0.076000 +4.309000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.098000 +0.000000 +0.000000 +0.044000 +0.037000 +0.000000 +0.000000 +0.000000 +0.000000 +0.011000 +0.024000 +2.049000 +0.000000 +0.000000 +0.861000 +6.724000 +4.935000 +3.824000 +11.015000 +0.704000 +6.160000 +3.864000 +11.378000 +4.917000 +0.695000 +0.782000 +0.037000 +0.412000 +0.147000 +0.778000 +0.198000 +2.983000 +1.399000 +2.014000 +2.399000 +0.162000 +8.194000 +7.004000 +5.756000 +7.042000 +1.477000 +2.551000 +1.779000 +2.004000 +1.327000 +2.926000 +1.272000 +0.290000 +0.007000 +0.045000 +0.189000 +0.005000 +0.614000 +0.090000 +0.024000 +0.773000 +0.255000 +0.639000 +0.000000 +8.123000 +0.011000 +1.404000 +0.493000 +0.324000 +0.000000 +0.000000 +0.000000 +0.852000 +3.823000 +1.647000 +3.428000 +0.003000 +0.159000 +1.305000 +0.000000 +0.000000 +0.000000 +0.000000 +12.377000 +0.120000 +0.027000 +29.338000 +10.888000 +2.299000 +4.389000 +0.014000 +0.115000 +0.030000 +0.158000 +0.420000 +0.143000 +0.446000 +0.038000 +0.000000 +0.000000 +0.000000 +0.000000 +0.010000 +13.002000 +3.666000 +0.286000 +0.302000 +2.983000 +0.142000 +1.834000 +0.342000 +13.778000 +0.334000 +0.220000 +1.173000 +6.393000 +5.709000 +0.400000 +0.968000 +0.004000 +0.000000 +0.000000 +0.027000 +0.103000 +0.001000 +0.008000 +0.002000 +14.342000 +7.298000 +0.011000 +0.000000 +0.000000 +0.000000 +0.000000 +0.258000 +0.950000 +0.000000 +0.000000 +2.212000 +0.091000 +0.051000 +0.113000 +0.286000 +0.059000 +0.002000 +0.902000 +2.451000 +0.000000 +0.033000 +0.006000 +0.045000 +0.000000 +0.000000 +0.476000 +5.824000 +0.065000 +3.262000 +0.496000 +3.184000 +0.582000 +0.006000 +0.000000 +0.000000 +0.056000 +0.000000 +0.001000 +1.156000 +21.349000 +17.186000 +0.122000 +9.970000 +0.010000 +0.000000 +0.000000 +0.405000 +0.090000 +0.067000 +2.655000 +0.338000 +0.024000 +0.056000 +0.030000 +0.847000 +0.591000 +2.591000 +0.626000 +0.451000 +0.938000 +0.449000 +0.047000 +0.133000 +0.000000 +0.000000 +0.001000 +0.011000 +0.000000 +0.000000 +0.783000 +3.137000 +0.076000 +3.794000 +3.137000 +0.009000 +1.878000 +0.455000 +0.008000 +1.965000 +5.980000 +0.001000 +5.818000 +0.762000 +8.460000 +3.178000 +0.000000 +0.000000 +0.001000 +0.026000 +0.448000 +0.273000 +0.001000 +0.344000 +4.457000 +1.950000 +4.776000 +0.267000 +0.010000 +1.826000 +0.885000 +2.816000 +7.803000 +0.125000 +0.025000 +0.091000 +0.191000 +2.459000 +10.491000 +0.196000 +0.170000 +10.083000 +1.830000 +19.092000 +5.340000 +2.697000 +0.000000 +0.066000 +0.203000 +0.000000 +0.040000 +0.031000 +0.024000 +6.200000 +0.613000 +5.579000 +1.451000 +0.047000 +0.382000 +0.009000 +0.064000 +0.119000 +6.605000 +4.363000 +0.335000 +3.572000 +0.133000 +1.337000 +6.843000 +0.817000 +0.050000 +0.001000 +0.031000 +2.487000 +15.862000 +0.648000 +0.745000 +0.210000 +2.312000 +3.457000 +1.343000 +11.469000 +3.680000 +0.032000 +10.970000 +1.701000 +10.801000 +0.220000 +12.324000 +5.050000 +1.785000 +2.431000 +0.690000 +3.558000 +0.041000 +0.190000 +2.456000 +0.198000 +0.081000 +1.476000 +2.832000 +1.301000 +0.506000 +5.908000 +26.058000 +6.798000 +0.988000 +11.980000 +3.999000 +0.694000 +0.111000 +4.403000 +1.975000 +0.008000 +0.374000 +0.000000 +0.000000 +1.341000 +1.729000 +0.042000 +2.034000 +2.418000 +0.020000 +0.571000 +0.031000 +0.001000 +0.400000 +0.571000 +2.492000 +0.514000 +1.836000 +5.361000 +1.414000 +0.219000 +0.053000 +0.059000 +1.077000 +0.503000 +0.660000 +0.372000 +2.409000 +0.072000 +0.007000 +0.704000 +0.271000 +0.153000 +2.197000 +3.840000 +0.910000 +0.486000 +0.112000 +2.149000 +10.370000 +10.822000 +4.144000 +1.097000 +0.256000 +2.540000 +1.653000 +0.517000 +0.007000 +0.050000 +0.000000 +0.000000 +0.014000 +2.650000 +6.091000 +8.529000 +3.908000 +2.322000 +1.953000 +0.793000 +0.005000 +0.299000 +0.951000 +0.028000 +0.003000 +0.312000 +0.580000 +1.158000 +10.694000 +1.065000 +16.703000 +2.714000 +0.493000 +4.001000 +0.535000 +0.000000 +0.000000 +1.331000 +4.400000 +6.470000 +2.044000 +0.683000 +0.058000 +0.000000 +0.028000 +2.340000 +5.841000 +3.196000 +0.500000 +2.142000 +3.290000 +0.466000 +1.222000 +0.042000 +0.000000 +0.001000 +0.299000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.236000 +2.166000 +0.000000 +0.000000 +0.000000 +0.031000 +0.000000 +0.000000 +0.338000 +1.617000 +3.078000 +0.189000 +2.750000 +0.528000 +5.190000 +0.046000 +0.011000 +0.000000 +0.104000 +0.044000 +0.093000 +0.246000 +0.793000 +0.126000 +0.000000 +0.000000 +0.000000 +0.178000 +1.528000 +11.659000 +3.761000 +3.077000 +3.121000 +0.799000 +19.143000 +7.512000 +0.006000 +2.759000 +0.575000 +1.281000 +0.442000 +5.953000 +0.884000 +4.064000 +5.433000 +8.663000 +0.978000 +2.160000 +0.324000 +6.717000 +1.960000 +1.286000 +1.175000 +0.635000 +0.469000 +1.186000 +1.124000 +0.738000 +10.118000 +0.061000 +1.330000 +5.385000 +0.352000 +0.905000 +0.023000 +0.450000 +3.390000 +0.040000 +0.000000 +0.000000 +0.894000 +0.744000 +0.064000 +0.098000 +0.566000 +9.546000 +14.459000 +0.843000 +0.565000 +0.001000 +0.221000 +32.151000 +43.276000 +3.361000 +15.524000 +2.508000 +0.193000 +0.050000 +1.052000 +6.941000 +12.456000 +5.437000 +14.642000 +0.815000 +0.000000 +12.170000 +5.222000 +0.818000 +2.076000 +0.889000 +0.332000 +3.099000 +0.447000 +0.005000 +0.000000 +0.000000 +0.006000 +0.199000 +0.006000 +0.389000 +0.082000 +0.030000 +0.000000 +1.902000 +3.782000 +4.005000 +4.921000 +4.038000 +0.046000 +0.428000 +0.645000 +1.941000 +1.124000 +7.130000 +2.796000 +1.556000 +1.621000 +0.001000 +0.924000 +0.261000 +0.061000 +0.711000 +0.301000 +2.557000 +2.898000 +3.748000 +4.893000 +8.326000 +3.835000 +3.845000 +0.427000 +0.542000 +0.232000 +0.112000 +0.022000 +1.884000 +12.418000 +1.837000 +3.327000 +7.366000 +4.780000 +0.365000 +0.725000 +14.490000 +20.580000 +17.168000 +9.341000 +10.941000 +2.114000 +0.071000 +0.396000 +1.669000 +7.330000 +0.171000 +0.026000 +0.004000 +0.975000 +0.640000 +1.481000 +0.065000 +2.721000 +0.308000 +0.747000 +1.293000 +0.464000 +0.074000 +0.898000 +0.003000 +0.051000 +0.301000 +1.296000 +0.244000 +4.550000 +0.029000 +0.048000 +1.193000 +1.186000 +0.450000 +0.160000 +0.245000 +0.657000 +0.712000 +2.747000 +0.074000 +0.080000 +0.029000 +0.090000 +0.890000 +0.035000 +0.082000 +0.379000 +0.016000 +0.072000 +0.022000 +0.067000 +0.229000 +0.007000 +0.002000 +1.810000 +3.077000 +3.672000 +2.022000 +2.227000 +0.117000 +1.760000 +0.708000 +2.457000 +5.259000 +8.133000 +0.341000 +0.181000 +5.915000 +1.989000 +0.205000 +3.968000 +6.826000 +5.214000 +1.085000 +0.307000 +2.254000 +4.729000 +0.561000 +25.316000 +12.081000 +4.036000 +2.524000 +3.831000 +4.910000 +0.964000 +0.138000 +0.800000 +0.754000 +5.226000 +4.233000 +1.567000 +1.697000 +0.000000 +0.298000 +0.635000 +1.317000 +5.598000 +1.411000 +2.171000 +1.430000 +0.505000 +0.066000 +0.045000 +1.077000 +0.308000 +0.049000 +0.157000 +0.400000 +2.420000 +0.034000 +0.541000 +2.542000 +0.831000 +4.887000 +3.930000 +2.139000 +0.169000 +2.410000 +0.211000 +1.369000 +0.482000 +0.124000 +5.077000 +4.898000 +4.469000 +7.210000 +11.728000 +3.911000 +2.007000 +1.233000 +0.498000 +3.041000 +3.939000 +1.850000 +1.549000 +2.433000 +0.060000 +0.111000 +0.069000 +0.254000 +0.041000 +0.594000 +0.018000 +0.017000 +4.490000 +3.348000 +1.023000 +0.442000 +0.161000 +0.026000 +0.024000 +0.332000 +4.536000 +0.115000 +0.720000 +0.302000 +0.577000 +15.130000 +3.683000 +0.035000 +0.779000 +0.007000 +0.019000 +0.004000 +0.623000 +0.907000 +2.008000 +11.382000 +2.486000 +0.188000 +0.625000 +0.016000 +0.002000 +0.345000 +2.715000 +12.305000 +15.207000 +8.887000 +2.552000 +9.323000 +2.778000 +3.618000 +0.019000 +0.027000 +0.000000 +0.001000 +0.012000 +10.682000 +1.308000 +2.280000 +0.002000 +3.703000 +1.790000 +3.891000 +8.245000 +1.207000 +0.395000 +0.410000 +1.425000 +3.716000 +1.200000 +0.211000 +0.016000 +0.000000 +0.000000 +0.000000 +0.000000 +0.793000 +0.611000 +0.133000 +3.696000 +2.516000 +2.967000 +6.341000 +3.072000 +5.287000 +0.325000 +0.055000 +0.193000 +0.010000 +0.000000 +0.000000 +0.000000 +5.436000 +0.703000 +1.407000 +1.263000 +4.940000 +0.021000 +0.031000 +0.000000 +0.000000 +0.020000 +0.102000 +5.420000 +2.266000 +0.917000 +0.866000 +0.700000 +0.062000 +0.015000 +13.246000 +0.060000 +0.038000 +0.009000 +0.000000 +1.276000 +0.102000 +0.010000 +0.000000 +0.015000 +2.220000 +8.433000 +0.073000 +1.172000 +0.162000 +6.017000 +5.728000 +7.878000 +2.943000 +0.000000 +0.000000 +0.002000 +0.000000 +0.233000 +0.069000 +0.097000 +0.228000 +0.000000 +0.039000 +0.267000 +0.255000 +0.117000 +0.000000 +0.095000 +0.000000 +0.011000 +0.051000 +0.000000 +0.000000 +36.215000 +3.295000 +5.996000 +0.201000 +0.011000 +1.061000 +0.197000 +0.998000 +1.860000 +0.802000 +0.061000 +0.000000 +0.806000 +0.393000 +2.826000 +7.778000 +3.877000 +0.670000 +0.025000 +0.067000 +0.000000 +0.042000 +0.782000 +0.000000 +0.038000 +2.718000 +1.492000 +3.694000 +3.774000 +0.331000 +0.033000 +0.083000 +0.538000 +0.003000 +11.228000 +0.183000 +0.000000 +0.002000 +0.001000 +0.004000 +0.013000 +0.294000 +4.247000 +22.299000 +1.261000 +0.019000 +0.000000 +0.170000 +1.089000 +18.008000 +0.296000 +0.761000 +0.052000 +0.083000 +0.034000 +0.002000 +0.076000 +4.177000 +0.112000 +0.786000 +1.537000 +0.799000 +5.725000 +3.320000 +4.207000 +1.225000 +0.005000 +0.000000 +0.018000 +0.000000 +0.034000 +0.023000 +2.633000 +0.036000 +0.274000 +5.013000 +7.429000 +1.238000 +0.034000 +0.757000 +0.011000 +0.003000 +0.001000 +4.820000 +0.581000 +9.218000 +5.275000 +2.507000 +28.558000 +12.099000 +6.503000 +0.037000 +1.901000 +0.129000 +3.281000 +0.714000 +2.320000 +12.530000 +9.641000 +7.584000 +1.038000 +4.845000 +2.501000 +18.445000 +0.173000 +1.286000 +5.317000 +2.573000 +0.107000 +0.087000 +0.071000 +0.081000 +0.006000 +0.001000 +0.082000 +0.041000 +0.057000 +0.017000 +0.177000 +0.536000 +2.503000 +7.460000 +6.254000 +2.899000 +0.252000 +1.016000 +2.186000 +9.428000 +7.673000 +1.664000 +0.357000 +5.744000 +0.139000 +0.507000 +0.065000 +0.870000 +0.067000 +0.721000 +0.076000 +0.007000 +0.084000 +0.105000 +0.000000 +0.408000 +0.021000 +0.091000 +0.269000 +2.114000 +0.108000 +0.012000 +0.420000 +2.945000 +3.816000 +0.956000 +0.931000 +2.831000 +6.152000 +0.424000 +0.008000 +0.126000 +0.056000 +0.128000 +0.275000 +0.301000 +0.408000 +0.164000 +5.881000 +5.119000 +0.000000 +0.171000 +1.429000 +0.393000 +2.374000 +0.585000 +3.722000 +0.998000 +2.264000 +0.022000 +0.116000 +0.001000 +0.039000 +0.590000 +0.022000 +3.489000 +1.819000 +0.063000 +0.046000 +0.017000 +0.000000 +0.026000 +0.000000 +0.001000 +0.012000 +0.000000 +3.669000 +0.126000 +0.012000 +0.000000 +0.840000 +5.675000 +0.112000 +4.597000 +9.233000 +3.076000 +0.468000 +0.011000 +0.123000 +4.804000 +7.507000 +0.955000 +7.731000 +5.795000 +1.080000 +1.401000 +4.681000 +0.094000 +0.079000 +0.014000 +0.174000 +0.094000 +0.004000 +0.031000 +2.953000 +7.304000 +2.890000 +3.373000 +0.378000 +4.232000 +6.967000 +10.124000 +3.068000 +1.481000 +0.571000 +0.018000 +0.409000 +1.368000 +0.460000 +0.011000 +0.024000 +8.358000 +9.042000 +6.805000 +8.056000 +4.870000 +0.000000 +12.511000 +11.996000 +5.787000 +12.488000 +1.437000 +0.330000 +0.046000 +1.060000 +5.530000 +1.306000 +0.599000 +0.271000 +1.646000 +0.735000 +0.808000 +0.004000 +0.091000 +0.122000 +0.814000 +1.480000 +5.990000 +0.030000 +0.000000 +0.028000 +0.494000 +0.016000 +0.628000 +0.000000 +0.000000 +0.000000 +0.001000 +1.053000 +3.342000 +0.119000 +0.103000 +0.022000 +0.029000 +3.755000 +15.089000 +0.034000 +0.000000 +0.002000 +0.011000 +1.493000 +8.053000 +4.766000 +7.540000 +0.161000 +10.402000 +0.931000 +3.025000 +7.977000 +17.114000 +14.807000 +3.149000 +6.312000 +0.159000 +1.511000 +0.750000 +0.005000 +2.189000 +0.154000 +0.210000 +2.320000 +0.000000 +0.000000 +0.008000 +0.000000 +0.005000 +0.007000 +0.000000 +0.000000 +0.000000 +0.038000 +2.883000 +1.304000 +0.129000 +0.000000 +0.000000 +0.000000 +2.976000 +0.993000 +3.529000 +1.881000 +0.884000 +0.006000 +0.421000 +4.446000 +0.035000 +0.012000 +0.403000 +0.000000 +0.000000 +0.002000 +1.577000 +0.103000 +0.003000 +0.298000 +0.669000 +0.095000 +1.164000 +4.101000 +0.042000 +0.084000 +0.016000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.092000 +0.326000 +0.122000 +4.756000 +0.031000 +0.000000 +0.025000 +0.121000 +0.000000 +0.000000 +0.982000 +0.756000 +7.058000 +13.020000 +16.997000 +0.212000 +0.023000 +0.166000 +7.285000 +0.000000 +0.722000 +0.040000 +2.071000 +0.684000 +2.769000 +6.387000 +1.126000 +0.044000 +0.498000 +7.044000 +21.608000 +6.055000 +3.113000 +7.647000 +0.029000 +3.997000 +0.460000 +0.302000 +1.961000 +5.372000 +4.934000 +0.858000 +0.664000 +2.766000 +5.424000 +20.185000 +2.555000 +0.003000 +4.471000 +1.417000 +0.011000 +0.001000 +0.015000 +0.013000 +3.041000 +0.146000 +0.030000 +17.337000 +0.017000 +0.010000 +0.018000 +1.383000 +0.651000 +0.025000 +0.003000 +9.241000 +0.133000 +5.680000 +2.247000 +0.021000 +2.024000 +1.422000 +1.130000 +0.390000 +5.684000 +2.077000 +4.742000 +2.659000 +6.247000 +3.509000 +0.078000 +1.257000 +0.351000 +1.997000 +5.839000 +0.120000 +0.055000 +0.000000 +0.000000 +0.031000 +2.938000 +0.105000 +5.821000 +6.687000 +2.827000 +3.397000 +1.400000 +0.105000 +24.195000 +0.760000 +2.460000 +0.694000 +0.104000 +0.992000 +0.861000 +0.000000 +0.000000 +0.019000 +0.027000 +0.000000 +0.006000 +0.449000 +2.429000 +0.017000 +3.216000 +5.792000 +0.260000 +0.739000 +0.676000 +5.276000 +1.113000 +1.548000 +5.329000 +5.543000 +5.330000 +1.234000 +1.729000 +11.922000 +6.901000 +13.340000 +0.556000 +2.166000 +5.507000 +0.860000 +0.457000 +2.927000 +1.226000 +20.325000 +6.387000 +19.549000 +1.253000 +16.266000 +3.286000 +0.038000 +5.391000 +8.222000 +3.556000 +5.101000 +5.393000 +8.465000 +0.244000 +0.596000 +0.023000 +0.134000 +0.082000 +0.110000 +0.189000 +0.093000 +0.107000 +0.027000 +0.204000 +4.160000 +0.111000 +10.894000 +13.317000 +3.509000 +2.426000 +2.336000 +3.791000 +0.540000 +0.710000 +2.112000 +8.979000 +9.985000 +16.621000 +4.798000 +22.610000 +3.081000 +4.445000 +0.136000 +1.251000 +1.558000 +7.013000 +18.930000 +4.584000 +10.546000 +2.745000 +1.489000 +0.694000 +4.383000 +0.512000 +0.336000 +0.019000 +0.020000 +0.003000 +0.033000 +0.100000 +0.014000 +0.000000 +0.024000 +0.027000 +0.027000 +0.050000 +0.004000 +0.771000 +3.356000 +9.455000 +10.090000 +5.324000 +1.527000 +1.164000 +0.109000 +8.855000 +0.676000 +0.006000 +1.999000 +1.177000 +2.648000 +7.489000 +2.147000 +1.293000 +1.709000 +0.209000 +9.013000 +4.655000 +3.144000 +0.054000 +0.780000 +13.747000 +3.633000 +2.289000 +0.620000 +0.263000 +0.332000 +0.087000 +0.008000 +0.005000 +0.037000 +0.024000 +0.236000 +0.952000 +1.408000 +4.687000 +1.889000 +1.334000 +0.149000 +4.149000 +0.557000 +0.243000 +0.012000 +0.013000 +0.003000 +0.250000 +3.633000 +0.106000 +0.000000 +0.009000 +0.070000 +0.560000 +0.004000 +0.000000 +0.000000 +0.000000 +0.000000 +0.020000 +0.004000 +0.000000 +0.002000 +0.014000 +0.007000 +0.063000 +0.041000 +0.000000 +0.000000 +0.797000 +1.460000 +0.018000 +1.212000 +2.321000 +1.786000 +5.932000 +0.001000 +0.038000 +0.011000 +0.012000 +0.013000 +0.000000 +0.000000 +0.000000 +0.000000 +0.021000 +0.666000 +0.534000 +1.129000 +2.978000 +3.948000 +6.386000 +5.374000 +15.351000 +6.450000 +0.725000 +3.641000 +1.561000 +2.701000 +0.805000 +0.000000 +0.002000 +0.003000 +0.013000 +0.150000 +0.124000 +0.018000 +2.387000 +1.289000 +3.846000 +0.785000 +1.053000 +0.010000 +0.000000 +3.994000 +0.023000 +0.000000 +0.040000 +0.059000 +0.039000 +0.020000 +0.011000 +0.637000 +1.651000 +10.803000 +23.133000 +51.014000 +6.016000 +3.482000 +0.269000 +4.264000 +15.008000 +2.028000 +9.192000 +3.227000 +5.702000 +21.877000 +0.242000 +1.505000 +3.692000 +0.713000 +9.788000 +12.331000 +2.532000 +15.464000 +1.674000 +6.475000 +4.143000 +0.303000 +0.269000 +0.428000 +0.000000 +0.000000 +1.715000 +11.733000 +0.791000 +9.512000 +3.885000 +1.407000 +2.894000 +3.602000 +1.997000 +7.772000 +0.889000 +4.195000 +0.098000 +1.633000 +8.224000 +1.671000 +0.199000 +0.047000 +0.000000 +0.000000 +0.054000 +0.016000 +0.053000 +2.438000 +0.056000 +0.109000 +0.000000 +0.000000 +0.000000 +0.000000 +0.043000 +6.127000 +0.255000 +16.765000 +8.461000 +0.531000 +0.075000 +4.467000 +6.011000 +0.025000 +0.061000 +0.011000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.018000 +0.027000 +0.010000 +0.020000 +0.901000 +0.000000 +0.010000 +0.007000 +0.000000 +0.001000 +0.000000 +0.099000 +0.076000 +0.002000 +0.003000 +0.053000 +0.500000 +0.006000 +1.042000 +0.410000 +0.353000 +4.042000 +3.861000 +6.819000 +0.024000 +0.746000 +9.937000 +1.189000 +0.947000 +0.738000 +1.967000 +1.128000 +0.026000 +0.000000 +0.000000 +3.323000 +0.084000 +0.008000 +0.001000 +1.044000 +0.016000 +12.757000 +0.055000 +0.250000 +0.053000 +0.214000 +0.195000 +1.683000 +0.449000 +0.003000 +0.032000 +0.015000 +0.016000 +0.027000 +0.025000 +0.048000 +0.032000 +0.000000 +0.049000 +0.978000 +5.971000 +0.405000 +0.015000 +0.036000 +2.529000 +0.144000 +0.019000 +0.005000 +0.141000 +0.008000 +0.009000 +2.067000 +0.198000 +1.511000 +0.396000 +0.562000 +1.043000 +0.530000 +0.027000 +0.013000 +0.412000 +15.377000 +8.735000 +11.976000 +2.959000 +2.026000 +0.077000 +1.576000 +0.021000 +0.125000 +0.095000 +2.637000 +1.165000 +9.338000 +9.050000 +8.927000 +0.600000 +0.933000 +6.978000 +4.306000 +4.059000 +12.508000 +5.297000 +6.020000 +0.109000 +0.093000 +0.100000 +0.055000 +0.045000 +0.039000 +0.028000 +0.002000 +0.000000 +0.007000 +0.000000 +0.570000 +0.159000 +1.198000 +2.362000 +0.191000 +8.415000 +14.581000 +12.294000 +0.472000 +0.372000 +17.666000 +3.118000 +2.995000 +9.973000 +2.610000 +2.990000 +3.682000 +7.216000 +5.981000 +15.907000 +0.093000 +0.876000 +4.014000 +7.855000 +4.906000 +4.924000 +8.734000 +4.941000 +3.735000 +3.983000 +34.786000 +0.326000 +2.195000 +0.606000 +0.982000 +0.423000 +0.005000 +0.045000 +1.872000 +1.968000 +14.164000 +4.925000 +1.054000 +2.961000 +0.830000 +11.030000 +0.926000 +0.691000 +0.016000 +0.023000 +0.041000 +0.080000 +0.070000 +0.032000 +0.003000 +0.000000 +0.017000 +0.039000 +0.022000 +0.002000 +0.138000 +0.927000 +5.002000 +0.491000 +0.467000 +2.664000 +4.697000 +0.013000 +0.004000 +11.295000 +1.013000 +1.818000 +0.940000 +0.079000 +0.142000 +0.136000 +1.681000 +6.685000 +0.729000 +7.410000 +3.844000 +7.748000 +3.866000 +0.079000 +0.158000 +0.601000 +0.130000 +0.008000 +0.014000 +2.488000 +3.514000 +6.418000 +3.009000 +0.175000 +0.102000 +1.412000 +0.297000 +9.436000 +21.291000 +1.347000 +0.012000 +6.376000 +0.004000 +0.006000 +0.145000 +5.093000 +3.781000 +4.686000 +0.175000 +1.393000 +2.785000 +4.251000 +3.795000 +0.093000 +0.593000 +3.674000 +0.151000 +3.758000 +0.644000 +0.000000 +0.015000 +0.004000 +0.043000 +0.867000 +1.585000 +0.887000 +0.063000 +6.046000 +2.760000 +0.880000 +22.262000 +1.430000 +0.095000 +0.007000 +2.970000 +0.055000 +0.000000 +0.002000 +0.011000 +0.043000 +0.008000 +0.028000 +0.000000 +0.000000 +0.000000 +0.007000 +0.179000 +1.166000 +0.004000 +0.026000 +0.000000 +0.000000 +0.000000 +0.000000 +0.013000 +0.000000 +0.017000 +1.516000 +11.136000 +5.590000 +2.631000 +0.068000 +10.042000 +0.192000 +12.844000 +0.002000 +1.698000 +3.367000 +1.901000 +0.011000 +0.000000 +0.000000 +0.229000 +1.200000 +1.017000 +1.636000 +0.781000 +0.000000 +0.275000 +13.026000 +6.668000 +0.270000 +12.748000 +5.769000 +1.118000 +1.663000 +1.006000 +6.627000 +1.426000 +0.414000 +0.662000 +0.000000 +3.938000 +3.252000 +2.680000 +0.060000 +8.967000 +11.556000 +9.024000 +0.293000 +13.628000 +5.504000 +17.607000 +0.304000 +0.029000 +0.006000 +0.127000 +0.120000 +3.315000 +1.853000 +6.078000 +0.908000 +0.013000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.001000 +1.305000 +0.093000 +15.895000 +13.195000 +1.665000 +1.723000 +5.750000 +3.543000 +1.675000 +3.112000 +1.898000 +9.974000 +6.397000 +0.462000 +12.347000 +2.345000 +1.331000 +0.259000 +2.790000 +31.572000 +3.905000 +12.798000 +0.070000 +0.862000 +1.385000 +0.054000 +2.009000 +1.693000 +1.467000 +0.657000 +0.015000 +0.008000 +0.002000 +5.073000 +1.208000 +6.707000 +8.510000 +1.959000 +29.353000 +34.623000 +7.251000 +0.368000 +5.724000 +0.632000 +1.230000 +5.539000 +1.806000 +0.030000 +0.351000 +3.040000 +0.081000 +0.003000 +0.005000 +0.016000 +0.080000 +0.214000 +0.179000 +0.228000 +0.006000 +0.009000 +0.065000 +0.044000 +1.250000 +4.257000 +3.174000 +1.498000 +1.903000 +16.520000 +0.772000 +0.033000 +7.393000 +0.210000 +1.077000 +4.224000 +1.402000 +0.003000 +0.328000 +9.908000 +0.297000 +0.162000 +0.289000 +1.430000 +1.283000 +10.007000 +2.852000 +1.025000 +3.589000 +0.144000 +4.380000 +5.866000 +0.446000 +0.008000 +0.028000 +1.978000 +10.809000 +1.674000 +4.672000 +0.182000 +1.698000 +0.270000 +1.710000 +3.274000 +9.320000 +13.336000 +4.128000 +3.901000 +0.245000 +2.245000 +0.187000 +0.665000 +0.021000 +2.371000 +0.440000 +0.051000 +0.003000 +0.713000 +0.613000 +3.678000 +3.644000 +1.426000 +0.274000 +1.167000 +0.685000 +0.178000 +0.092000 +1.475000 +1.462000 +6.019000 +8.027000 +5.048000 +1.071000 +0.313000 +1.482000 +0.046000 +0.172000 +0.732000 +3.350000 +25.222000 +0.463000 +0.502000 +1.102000 +0.593000 +0.737000 +7.607000 +0.549000 +1.089000 +0.017000 +0.017000 +0.001000 +0.000000 +0.000000 +0.067000 +0.182000 +0.000000 +0.000000 +0.000000 +0.073000 +0.265000 +0.000000 +1.679000 +1.021000 +0.970000 +1.124000 +0.079000 +0.000000 +0.090000 +4.888000 +8.278000 +1.588000 +0.752000 +2.523000 +1.204000 +7.442000 +6.199000 +8.148000 +2.827000 +1.496000 +7.643000 +2.857000 +0.052000 +7.797000 +0.029000 +0.122000 +8.520000 +0.259000 +0.886000 +0.003000 +2.364000 +10.912000 +5.840000 +0.002000 +0.503000 +0.162000 +0.056000 +0.299000 +0.334000 +1.298000 +1.103000 +4.821000 +1.701000 +0.153000 +0.386000 +0.022000 +0.374000 +0.621000 +0.112000 +1.607000 +0.001000 +0.039000 +1.134000 +0.014000 +0.020000 +0.124000 +0.272000 +0.089000 +0.063000 +0.773000 +6.326000 +0.523000 +0.262000 +0.040000 +4.053000 +2.913000 +1.314000 +1.582000 +0.015000 +0.691000 +0.011000 +0.157000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.002000 +0.001000 +0.022000 +0.943000 +2.131000 +1.159000 +3.263000 +1.064000 +5.892000 +0.042000 +0.140000 +0.017000 +0.005000 +0.002000 +0.075000 +0.050000 +0.008000 +1.978000 +0.643000 +4.873000 +1.470000 +3.370000 +0.018000 +0.000000 +0.015000 +0.171000 +0.002000 +0.023000 +0.001000 +0.000000 +0.000000 +0.000000 +0.006000 +0.013000 +0.000000 +0.000000 +0.431000 +0.000000 +6.148000 +20.116000 +1.542000 +0.949000 +0.720000 +0.133000 +2.914000 +2.045000 +1.150000 +2.597000 +1.405000 +3.556000 +1.596000 +1.180000 +0.021000 +0.012000 +0.283000 +1.565000 +11.822000 +2.777000 +4.874000 +2.697000 +2.238000 +4.135000 +6.783000 +0.357000 +0.004000 +0.000000 +1.866000 +0.945000 +0.827000 +0.036000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.026000 +12.685000 +16.028000 +0.112000 +0.035000 +0.480000 +7.861000 +3.114000 +0.151000 +0.174000 +0.302000 +3.976000 +0.055000 +5.745000 +1.146000 +0.244000 +1.091000 +0.025000 +0.233000 +1.292000 +0.000000 +0.004000 +0.542000 +2.307000 +2.602000 +0.015000 +0.754000 +1.593000 +0.000000 +12.077000 +0.825000 +3.081000 +7.609000 +1.400000 +0.368000 +0.977000 +0.000000 +2.408000 +11.150000 +4.654000 +3.704000 +3.872000 +8.035000 +56.409000 +1.818000 +0.063000 +0.047000 +6.523000 +2.521000 +2.732000 +2.337000 +0.010000 +2.429000 +1.094000 +3.425000 +10.050000 +0.910000 +0.447000 +5.787000 +0.077000 +0.055000 +2.556000 +0.025000 +0.005000 +3.249000 +0.000000 +0.000000 +1.986000 +0.070000 +0.000000 +0.000000 +0.624000 +2.608000 +0.360000 +0.856000 +0.580000 +0.001000 +2.786000 +6.073000 +0.051000 +3.509000 +6.359000 +0.881000 +7.040000 +1.053000 +2.310000 +0.720000 +1.910000 +12.551000 +3.515000 +9.482000 +4.297000 +3.352000 +0.154000 +1.845000 +0.348000 +0.806000 +0.002000 +0.001000 +0.000000 +0.000000 +0.059000 +0.152000 +0.141000 +0.606000 +0.000000 +0.000000 +0.042000 +0.012000 +1.731000 +0.568000 +0.232000 +0.073000 +0.012000 +0.002000 +0.000000 +0.060000 +0.094000 +0.068000 +0.000000 +1.584000 +2.037000 +0.169000 +0.012000 +7.933000 +0.021000 +0.012000 +2.783000 +1.028000 +0.164000 +0.000000 +0.056000 +0.790000 +2.283000 +0.156000 +0.063000 +0.158000 +1.467000 +3.662000 +3.266000 +1.698000 +0.418000 +6.874000 +4.538000 +0.135000 +0.227000 +2.300000 +0.022000 +0.511000 +1.912000 +27.232000 +1.773000 +4.420000 +5.983000 +0.273000 +1.670000 +9.848000 +5.029000 +0.133000 +0.788000 +0.062000 +8.084000 +15.123000 +2.330000 +0.428000 +12.331000 +6.686000 +20.410000 +2.420000 +3.350000 +7.286000 +5.112000 +3.071000 +8.272000 +6.283000 +12.565000 +0.856000 +0.158000 +51.477000 +3.169000 +1.842000 +3.490000 +4.665000 +0.275000 +7.518000 +11.784000 +4.107000 +3.184000 +0.600000 +0.574000 +0.173000 +0.060000 +0.070000 +6.555000 +2.565000 +5.611000 +9.982000 +1.269000 +2.872000 +0.999000 +1.492000 +1.005000 +5.076000 +0.844000 +1.966000 +2.671000 +3.143000 +0.133000 +1.312000 +2.315000 +1.796000 +2.048000 +3.872000 +0.337000 +2.713000 +6.443000 +1.775000 +1.153000 +1.856000 +0.611000 +3.192000 +3.182000 +2.599000 +1.975000 +1.027000 +5.971000 +10.058000 +0.233000 +0.217000 +0.196000 +0.619000 +0.030000 +12.828000 +0.166000 +0.182000 +0.312000 +0.011000 +0.258000 +0.848000 +0.598000 +0.007000 +0.011000 +0.157000 +3.330000 +0.407000 +1.070000 +3.487000 +0.095000 +0.471000 +1.712000 +3.251000 +2.519000 +0.520000 +2.683000 +0.601000 +0.039000 +3.629000 +0.858000 +0.122000 +1.823000 +0.294000 +0.043000 +3.137000 +1.221000 +3.235000 +3.171000 +0.582000 +19.776000 +0.829000 +1.364000 +0.156000 +0.318000 +0.019000 +0.019000 +0.102000 +0.341000 +0.051000 +0.013000 +0.067000 +0.008000 +0.032000 +2.754000 +0.004000 +0.239000 +0.054000 +0.014000 +0.115000 +0.274000 +0.503000 +8.550000 +0.268000 +1.820000 +4.156000 +2.086000 +14.911000 +6.233000 +0.221000 +0.030000 +11.507000 +10.232000 +2.608000 +0.115000 +3.818000 +4.239000 +0.392000 +2.398000 +0.578000 +0.844000 +0.000000 +0.000000 +0.000000 +0.000000 +0.012000 +0.124000 +0.000000 +0.000000 +0.000000 +0.000000 +0.057000 +0.725000 +0.005000 +0.000000 +0.000000 +0.000000 +0.023000 +0.675000 +0.004000 +0.005000 +0.027000 +2.597000 +0.224000 +0.440000 +0.270000 +0.985000 +0.017000 +0.014000 +3.051000 +1.271000 +0.025000 +0.121000 +1.502000 +0.498000 +0.150000 +0.017000 +0.020000 +0.025000 +0.129000 +0.097000 +0.004000 +0.021000 +0.003000 +1.829000 +0.004000 +0.023000 +0.092000 +0.459000 +3.298000 +0.404000 +0.706000 +4.617000 +0.514000 +0.022000 +6.156000 +0.114000 +0.000000 +0.430000 +0.016000 +4.079000 +5.745000 +8.518000 +4.875000 +2.406000 +0.015000 +0.000000 +6.139000 +0.625000 +0.000000 +0.000000 +0.000000 +0.001000 +0.015000 +0.000000 +0.000000 +0.000000 +0.010000 +0.000000 +0.000000 +4.142000 +0.012000 +1.242000 +6.154000 +0.000000 +1.517000 +3.189000 +0.028000 +0.973000 +0.003000 +0.093000 +1.278000 +0.315000 +0.412000 +0.638000 +0.596000 +0.725000 +7.410000 +13.032000 +4.151000 +2.894000 +1.045000 +1.223000 +5.504000 +25.341000 +4.986000 +0.220000 +0.000000 +1.455000 +0.213000 +0.168000 +0.178000 +0.250000 +0.006000 +1.098000 +0.228000 +0.407000 +1.465000 +0.103000 +0.717000 +0.227000 +1.315000 +3.736000 +0.001000 +0.727000 +0.809000 +0.423000 +3.514000 +10.503000 +3.964000 +0.105000 +0.003000 +2.501000 +0.162000 +1.836000 +8.510000 +0.049000 +0.750000 +4.206000 +1.293000 +0.004000 +0.015000 +0.662000 +0.584000 +0.759000 +0.012000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.002000 +0.749000 +22.581000 +0.408000 +0.422000 +6.610000 +4.386000 +0.667000 +3.683000 +3.043000 +0.203000 +0.321000 +0.032000 +0.223000 +7.919000 +0.794000 +0.000000 +1.749000 +8.954000 +8.960000 +0.057000 +0.355000 +1.307000 +0.427000 +7.938000 +0.128000 +15.401000 +0.231000 +22.704000 +0.136000 +0.388000 +4.722000 +0.062000 +0.122000 +0.079000 +0.004000 +0.000000 +0.000000 +0.044000 +0.518000 +0.191000 +0.799000 +0.090000 +1.904000 +0.718000 +0.100000 +0.515000 +4.372000 +3.967000 +0.019000 +0.024000 +5.918000 +2.071000 +0.256000 +1.544000 +1.020000 +1.369000 +0.779000 +12.882000 +1.076000 +18.928000 +0.527000 +0.144000 +0.800000 +9.702000 +8.065000 +0.004000 +18.388000 +3.673000 +1.505000 +2.235000 +0.543000 +1.105000 +0.330000 +1.924000 +0.459000 +2.233000 +6.546000 +5.225000 +0.324000 +0.868000 +1.882000 +2.368000 +0.719000 +4.128000 +4.293000 +5.150000 +6.861000 +2.022000 +1.095000 +0.362000 +0.176000 +0.406000 +0.120000 +0.000000 +0.260000 +0.509000 +0.120000 +0.712000 +0.589000 +1.996000 +1.150000 +3.930000 +0.258000 +0.045000 +0.040000 +0.000000 +0.018000 +1.451000 +0.725000 +0.102000 +0.254000 +0.310000 +1.021000 +9.300000 +0.664000 +0.184000 +0.117000 +0.591000 +0.001000 +0.039000 +0.511000 +6.322000 +0.321000 +0.920000 +7.819000 +2.497000 +13.978000 +1.441000 +1.963000 +1.993000 +2.169000 +13.760000 +4.085000 +0.013000 +0.040000 +0.011000 +0.023000 +0.030000 +0.071000 +0.137000 +0.209000 +1.311000 +4.682000 +0.131000 +0.256000 +0.055000 +0.135000 +0.046000 +0.463000 +1.796000 +10.965000 +12.682000 +8.432000 +12.888000 +4.371000 +0.062000 +3.658000 +0.204000 +2.591000 +6.865000 +8.926000 +1.925000 +1.549000 +5.390000 +0.033000 +0.871000 +5.813000 +0.579000 +2.135000 +0.317000 +2.885000 +0.373000 +0.626000 +8.134000 +0.755000 +0.601000 +0.000000 +0.007000 +0.018000 +0.068000 +0.372000 +0.033000 +0.040000 +1.100000 +4.647000 +6.038000 +5.582000 +1.713000 +1.699000 +0.037000 +0.176000 +0.158000 +0.200000 +0.003000 +0.003000 +0.013000 +0.002000 +0.001000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.815000 +0.840000 +3.954000 +3.072000 +2.140000 +0.826000 +1.810000 +3.811000 +0.191000 +0.008000 +0.000000 +0.000000 +0.006000 +0.591000 +0.012000 +0.123000 +0.000000 +0.010000 +0.001000 +0.002000 +0.000000 +0.000000 +0.000000 +0.000000 +0.032000 +0.859000 +0.179000 +0.000000 +0.000000 +0.000000 +0.000000 +0.058000 +0.001000 +0.002000 +0.000000 +0.000000 +0.002000 +1.062000 +0.306000 +3.468000 +17.083000 +1.501000 +1.176000 +1.145000 +0.959000 +1.437000 +0.614000 +0.627000 +0.637000 +0.493000 +1.100000 +0.030000 +0.399000 +0.696000 +5.597000 +3.785000 +1.799000 +0.097000 +9.024000 +0.824000 +1.054000 +1.111000 +1.728000 +0.001000 +0.000000 +0.000000 +0.000000 +0.148000 +1.007000 +0.003000 +1.714000 +1.480000 +0.064000 +1.005000 +3.795000 +9.401000 +0.953000 +0.003000 +3.615000 +0.612000 +0.150000 +7.707000 +2.707000 +0.369000 +5.581000 +9.660000 +10.882000 +0.273000 +1.702000 +1.052000 +0.090000 +0.016000 +0.078000 +0.562000 +0.000000 +0.005000 +0.006000 +0.000000 +0.012000 +6.699000 +8.052000 +8.221000 +2.759000 +0.788000 +0.498000 +0.045000 +0.000000 +0.000000 +1.878000 +8.629000 +9.428000 +7.030000 +6.421000 +8.765000 +0.097000 +0.354000 +0.000000 +0.000000 +0.196000 +0.568000 +0.045000 +0.664000 +0.000000 +0.000000 +0.005000 +1.102000 +0.752000 +0.498000 +6.775000 +0.073000 +20.789000 +0.391000 +2.646000 +0.055000 +6.976000 +17.546000 +2.183000 +1.169000 +0.093000 +0.643000 +5.547000 +0.003000 +4.063000 +0.436000 +3.223000 +0.586000 +0.001000 +0.208000 +0.749000 +9.181000 +9.045000 +5.350000 +0.110000 +0.041000 +1.331000 +0.023000 +0.000000 +0.018000 +1.755000 +0.490000 +2.216000 +10.519000 +1.318000 +0.914000 +0.154000 +1.151000 +0.763000 +2.892000 +0.882000 +0.119000 +0.016000 +11.004000 +5.916000 +2.096000 +0.821000 +0.668000 +5.945000 +0.056000 +0.111000 +0.177000 +1.369000 +1.550000 +0.000000 +0.000000 +0.000000 +0.000000 +0.028000 +1.248000 +0.059000 +0.039000 +4.014000 +4.865000 +0.028000 +3.328000 +6.894000 +3.895000 +9.901000 +19.863000 +0.696000 +0.007000 +0.019000 +0.101000 +4.550000 +2.136000 +0.006000 +1.031000 +4.068000 +0.027000 +0.473000 +0.000000 +5.207000 +0.294000 +2.155000 +0.048000 +3.163000 +0.790000 +0.678000 +3.565000 +1.431000 +7.781000 +5.893000 +1.817000 +0.014000 +0.147000 +1.199000 +0.910000 +0.444000 +3.454000 +2.289000 +0.687000 +0.110000 +0.071000 +0.009000 +0.067000 +0.056000 +0.020000 +0.254000 +0.298000 +0.488000 +1.143000 +1.933000 +5.473000 +2.922000 +3.386000 +0.350000 +3.333000 +0.676000 +2.410000 +1.947000 +4.057000 +4.901000 +2.746000 +4.873000 +8.002000 +16.142000 +2.463000 +1.054000 +3.117000 +6.902000 +9.950000 +3.191000 +0.295000 +1.150000 +0.400000 +0.060000 +2.926000 +0.835000 +6.053000 +0.247000 +5.001000 +1.146000 +2.349000 +0.380000 +2.220000 +3.314000 +3.488000 +6.048000 +1.265000 +4.287000 +3.812000 +15.820000 +5.463000 +4.662000 +0.319000 +0.198000 +0.148000 +0.151000 +0.195000 +0.308000 +0.893000 +0.016000 +0.068000 +0.081000 +0.111000 +0.032000 +0.764000 +2.571000 +4.689000 +1.060000 +0.939000 +0.026000 +8.234000 +0.222000 +6.424000 +2.078000 +0.121000 +0.868000 +0.300000 +0.120000 +0.038000 +0.004000 +0.000000 +4.423000 +1.047000 +0.276000 +0.077000 +0.138000 +5.625000 +0.185000 +0.126000 +0.189000 +0.186000 +0.009000 +0.003000 +0.079000 +0.771000 +2.767000 +0.036000 +1.150000 +0.763000 +6.931000 +0.398000 +0.399000 +0.045000 +0.184000 +3.067000 +0.036000 +0.000000 +0.020000 +0.088000 +1.962000 +7.402000 +0.010000 +1.609000 +2.116000 +0.064000 +0.313000 +0.094000 +0.008000 +0.023000 +0.000000 +0.000000 +0.001000 +0.252000 +1.295000 +0.017000 +0.020000 +0.039000 +0.017000 +0.011000 +0.013000 +0.013000 +0.024000 +0.000000 +0.000000 +0.000000 +0.000000 +0.001000 +0.025000 +0.008000 +2.118000 +17.368000 +7.311000 +0.002000 +0.515000 +1.506000 +0.669000 +2.573000 +3.520000 +4.815000 +3.675000 +0.294000 +1.860000 +0.155000 +0.000000 +8.165000 +16.944000 +6.755000 +1.528000 +5.190000 +2.888000 +0.208000 +0.592000 +14.033000 +19.191000 +2.424000 +0.778000 +15.918000 +0.273000 +0.098000 +0.003000 +0.004000 +0.516000 +0.123000 +0.024000 +5.766000 +3.780000 +4.911000 +25.168000 +11.531000 +0.039000 +0.780000 +1.271000 +1.101000 +0.093000 +0.787000 +0.859000 +7.215000 +0.000000 +0.009000 +0.000000 +0.000000 +0.004000 +0.001000 +0.000000 +0.000000 +0.000000 +0.000000 +0.042000 +7.640000 +0.696000 +0.531000 +3.574000 +0.427000 +0.824000 +3.150000 +13.830000 +12.173000 +17.515000 +1.742000 +1.547000 +0.092000 +0.352000 +0.041000 +20.908000 +8.484000 +0.255000 +0.575000 +0.658000 +0.000000 +15.366000 +15.182000 +3.452000 +3.320000 +0.019000 +0.267000 +1.744000 +11.088000 +2.679000 +4.316000 +0.345000 +2.445000 +1.998000 +5.816000 +8.665000 +24.084000 +0.305000 +2.277000 +0.205000 +9.136000 +8.759000 +0.016000 +0.013000 +1.084000 +0.392000 +1.571000 +4.012000 +4.988000 +4.872000 +0.238000 +0.042000 +0.033000 +0.087000 +0.127000 +0.370000 +1.819000 +0.514000 +1.068000 +1.580000 +1.475000 +1.205000 +2.476000 +0.814000 +0.404000 +9.129000 +7.544000 +3.214000 +6.754000 +0.014000 +0.000000 +0.000000 +0.000000 +1.566000 +0.959000 +0.062000 +18.534000 +0.551000 +7.260000 +1.694000 +5.540000 +1.721000 +5.067000 +0.858000 +0.481000 +3.608000 +6.804000 +1.751000 +5.559000 +0.258000 +3.735000 +9.676000 +0.440000 +0.076000 +0.186000 +0.014000 +0.067000 +0.000000 +0.252000 +0.254000 +0.004000 +0.356000 +7.687000 +1.755000 +4.785000 +0.574000 +1.567000 +0.010000 +2.772000 +2.982000 +0.645000 +0.066000 +4.112000 +5.707000 +0.074000 +1.264000 +47.214000 +57.988000 +2.721000 +0.150000 +1.260000 +0.111000 +3.450000 +2.901000 +6.481000 +8.561000 +0.521000 +2.167000 +0.011000 +0.004000 +0.000000 +0.034000 +0.005000 +6.834000 +18.154000 +0.089000 +0.884000 +2.885000 +11.357000 +6.754000 +8.270000 +0.123000 +0.075000 +0.100000 +1.530000 +0.283000 +1.502000 +0.464000 +0.682000 +1.615000 +2.737000 +1.212000 +0.993000 +4.285000 +1.208000 +4.562000 +0.708000 +0.175000 +0.167000 +1.887000 +1.054000 +0.133000 +1.942000 +0.733000 +0.062000 +1.686000 +0.592000 +0.001000 +0.000000 +1.280000 +5.406000 +0.159000 +6.402000 +2.069000 +12.456000 +7.010000 +1.580000 +5.107000 +20.423000 +36.835000 +12.282000 +0.903000 +0.018000 +0.477000 +1.006000 +1.371000 +3.580000 +0.784000 +0.238000 +7.130000 +5.206000 +0.401000 +0.092000 +2.054000 +0.515000 +0.059000 +0.115000 +14.969000 +2.579000 +0.749000 +3.528000 +0.470000 +4.189000 +23.416000 +5.317000 +12.251000 +2.091000 +3.053000 +2.153000 +7.126000 +7.022000 +4.787000 +9.459000 +12.441000 +8.566000 +0.335000 +1.992000 +0.517000 +0.058000 +0.139000 +0.035000 +0.244000 +1.453000 +0.061000 +0.657000 +0.764000 +0.026000 +0.691000 +3.027000 +1.223000 +0.077000 +0.050000 +2.908000 +1.117000 +4.056000 +3.977000 +1.358000 +0.296000 +0.205000 +6.145000 +7.536000 +4.114000 +10.108000 +9.351000 +4.343000 +2.379000 +0.889000 +0.440000 +0.234000 +6.011000 +1.899000 +1.487000 +0.060000 +0.147000 +0.422000 +5.312000 +0.665000 +0.012000 +5.205000 +5.936000 +0.000000 +0.000000 +0.018000 +0.004000 +0.102000 +0.336000 +0.000000 +0.977000 +2.253000 +0.473000 +0.575000 +0.002000 +0.005000 +0.046000 +0.026000 +0.024000 +0.001000 +0.015000 +0.003000 +0.199000 +1.083000 +3.353000 +11.843000 +0.765000 +1.785000 +0.882000 +0.447000 +1.016000 +1.434000 +6.800000 +7.186000 +13.014000 +1.224000 +2.056000 +0.891000 +5.407000 +1.197000 +0.082000 +0.344000 +0.605000 +0.676000 +0.202000 +0.092000 +0.305000 +0.015000 +0.049000 +0.114000 +0.012000 +0.203000 +0.540000 +0.000000 +0.007000 +0.132000 +0.015000 +0.000000 +0.242000 +2.895000 +1.155000 +2.115000 +0.851000 +0.498000 +1.970000 +4.435000 +3.209000 +0.000000 +0.247000 +0.200000 +0.029000 +0.478000 +4.059000 +1.799000 +2.431000 +1.369000 +0.133000 +0.000000 +0.003000 +0.000000 +0.114000 +0.722000 +0.105000 +0.000000 +0.017000 +1.277000 +8.120000 +2.309000 +1.322000 +1.595000 +1.207000 +0.937000 +18.855000 +2.259000 +5.272000 +17.884000 +0.095000 +0.612000 +3.624000 +0.631000 +1.228000 +5.294000 +0.021000 +0.000000 +0.801000 +1.840000 +3.337000 +5.506000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.017000 +0.061000 +0.000000 +0.026000 +1.867000 +2.426000 +1.831000 +4.171000 +0.347000 +0.000000 +0.000000 +0.000000 +0.524000 +1.269000 +5.737000 +8.203000 +0.007000 +0.000000 +0.000000 +1.199000 +5.152000 +0.000000 +0.347000 +0.022000 +1.766000 +0.484000 +0.358000 +0.015000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +1.092000 +0.018000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.012000 +0.113000 +5.618000 +0.051000 +3.941000 +0.000000 +0.641000 +39.008000 +4.995000 +1.430000 +8.934000 +0.321000 +0.596000 +2.651000 +3.742000 +15.549000 +0.003000 +0.000000 +0.074000 +1.138000 +0.066000 +2.265000 +1.880000 +0.023000 +0.170000 +8.811000 +2.808000 +7.506000 +0.628000 +0.000000 +0.000000 +0.079000 +0.644000 +10.433000 +13.351000 +0.189000 +0.025000 +0.000000 +0.003000 +0.012000 +0.128000 +0.003000 +0.001000 +0.011000 +0.000000 +0.000000 +0.116000 +30.904000 +0.461000 +0.076000 +3.082000 +0.092000 +1.784000 +2.987000 +1.593000 +0.102000 +4.065000 +3.288000 +1.104000 +0.085000 +2.795000 +0.044000 +0.007000 +0.008000 +0.044000 +0.099000 +0.352000 +0.005000 +0.083000 +0.005000 +0.018000 +0.000000 +0.031000 +7.815000 +10.017000 +6.012000 +0.107000 +0.096000 +0.428000 +0.342000 +1.391000 +2.192000 +0.567000 +1.285000 +3.799000 +12.165000 +3.452000 +8.624000 +0.018000 +1.006000 +8.676000 +3.332000 +4.848000 +7.474000 +9.354000 +0.000000 +13.646000 +1.590000 +7.478000 +8.331000 +0.386000 +0.878000 +3.185000 +0.719000 +9.979000 +6.028000 +0.124000 +4.402000 +1.144000 +0.864000 +1.878000 +2.179000 +0.147000 +2.058000 +0.030000 +1.114000 +0.618000 +0.003000 +0.000000 +0.356000 +3.454000 +0.007000 +20.109000 +7.835000 +0.677000 +0.126000 +0.272000 +0.018000 +0.043000 +0.015000 +0.066000 +0.493000 +0.003000 +0.031000 +0.000000 +0.015000 +0.235000 +7.403000 +0.052000 +0.904000 +1.873000 +0.135000 +0.001000 +0.030000 +0.205000 +5.417000 +2.722000 +1.815000 +6.899000 +0.030000 +11.231000 +3.166000 +7.728000 +6.378000 +5.847000 +13.651000 +10.878000 +1.531000 +0.583000 +13.014000 +1.068000 +0.595000 +10.514000 +1.998000 +9.359000 +2.490000 +5.444000 +2.766000 +11.989000 +5.449000 +3.149000 +10.362000 +8.461000 +0.762000 +0.088000 +4.143000 +1.208000 +1.441000 +4.006000 +1.998000 +2.058000 +3.152000 +6.700000 +0.136000 +6.188000 +4.202000 +2.936000 +5.614000 +2.889000 +12.136000 +2.094000 +7.235000 +4.058000 +0.050000 +10.511000 +5.594000 +1.738000 +0.000000 +3.373000 +11.713000 +4.676000 +1.581000 +11.460000 +9.829000 +0.487000 +4.706000 +18.262000 +4.735000 +10.813000 +4.403000 +0.191000 +2.485000 +0.733000 +0.475000 +3.223000 +4.660000 +2.283000 +4.414000 +0.974000 +2.416000 +1.507000 +8.062000 +0.118000 +0.323000 +7.603000 +0.725000 +0.123000 +0.038000 +0.561000 +2.976000 +0.000000 +0.008000 +0.197000 +0.011000 +0.052000 +0.059000 +0.014000 +0.001000 +0.015000 +0.020000 +2.782000 +0.003000 +4.397000 +0.470000 +2.583000 +1.238000 +0.114000 +2.615000 +5.119000 +5.170000 +8.102000 +0.479000 +0.025000 +0.128000 +6.109000 +0.261000 +1.453000 +0.842000 +0.450000 +3.557000 +6.605000 +0.480000 +0.033000 +0.076000 +0.024000 +0.283000 +0.219000 +0.004000 +0.005000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +6.455000 +1.693000 +3.842000 +6.771000 +1.632000 +1.043000 +0.229000 +0.027000 +4.554000 +4.521000 +0.006000 +0.062000 +0.684000 +1.089000 +3.197000 +2.609000 +3.162000 +4.281000 +12.438000 +4.887000 +11.996000 +1.132000 +0.023000 +0.069000 +0.000000 +0.000000 +0.181000 +0.010000 +0.547000 +0.003000 +14.437000 +11.266000 +5.120000 +5.594000 +0.188000 +2.118000 +16.119000 +1.121000 +0.003000 +0.004000 +0.024000 +1.882000 +1.042000 +13.874000 +0.218000 +0.011000 +8.604000 +0.998000 +3.630000 +2.617000 +0.049000 +0.000000 +0.742000 +0.492000 +1.590000 +0.000000 +0.003000 +0.006000 +0.014000 +0.006000 +0.000000 +0.001000 +0.000000 +0.041000 +0.000000 +0.000000 +0.503000 +0.171000 +2.451000 +0.000000 +0.000000 +0.074000 +0.320000 +3.604000 +13.284000 +0.730000 +0.684000 +3.141000 +0.012000 +0.003000 +0.006000 +0.589000 +4.312000 +1.291000 +0.069000 +2.250000 +0.061000 +0.055000 +8.492000 +1.148000 +0.006000 +0.003000 +0.000000 +0.000000 +0.000000 +2.318000 +2.531000 +0.025000 +0.006000 +0.071000 +0.677000 +8.256000 +14.700000 +1.051000 +0.025000 +0.000000 +8.422000 +0.008000 +13.400000 +0.013000 +13.918000 +1.304000 +1.372000 +0.738000 +3.478000 +1.795000 +0.201000 +2.255000 +0.800000 +1.610000 +0.036000 +1.410000 +0.477000 +3.635000 +0.094000 +0.770000 +0.046000 +0.000000 +2.657000 +2.571000 +0.199000 +0.182000 +1.916000 +0.001000 +0.000000 +0.000000 +0.000000 +8.797000 +0.318000 +0.000000 +0.001000 +0.008000 +0.001000 +0.001000 +0.012000 +0.078000 +1.948000 +0.102000 +0.102000 +0.201000 +0.399000 +0.529000 +0.039000 +0.016000 +1.571000 +0.810000 +0.241000 +0.057000 +0.015000 +0.000000 +0.067000 +0.249000 +0.177000 +0.008000 +0.000000 +2.290000 +0.022000 +18.502000 +0.317000 +2.797000 +3.864000 +1.055000 +0.994000 +0.190000 +1.642000 +3.916000 +4.328000 +10.155000 +4.206000 +3.246000 +2.480000 +0.800000 +4.113000 +1.695000 +0.620000 +0.407000 +0.583000 +0.962000 +1.126000 +5.115000 +0.035000 +3.603000 +0.025000 +1.218000 +2.064000 +1.805000 +0.051000 +1.678000 +1.551000 +8.495000 +3.676000 +0.126000 +0.213000 +5.766000 +4.943000 +0.430000 +16.031000 +0.266000 +3.784000 +6.700000 +0.169000 +2.150000 +0.055000 +5.483000 +5.229000 +0.607000 +0.042000 +0.222000 +3.735000 +3.023000 +0.826000 +1.511000 +0.090000 +0.143000 +0.918000 +0.075000 +0.519000 +0.019000 +0.690000 +2.907000 +0.887000 +4.025000 +7.291000 +2.833000 +2.765000 +0.533000 +2.625000 +0.619000 +4.224000 +1.210000 +2.956000 +2.128000 +0.804000 +0.978000 +5.989000 +4.413000 +0.881000 +0.507000 +3.135000 +2.478000 +0.154000 +0.106000 +0.081000 +1.224000 \ No newline at end of file diff --git a/hydromodel/utils/dmca_esr.py b/hydromodel/utils/dmca_esr.py new file mode 100644 index 0000000..397fd77 --- /dev/null +++ b/hydromodel/utils/dmca_esr.py @@ -0,0 +1,223 @@ +import numpy as np + + +def movmean(X, n): + ones = np.ones(X.shape) + kernel = np.ones(n) + return np.convolve(X, kernel, mode='same') / np.convolve(ones, kernel, mode='same') + + +def step1_step2_tr_and_fluctuations_timeseries(rain, flow, rain_min, max_window): + """ + :param rain: 降雨量向量,单位mm/h,需注意与mm/day之间的单位转化 + :param flow: 径流量向量,单位m³/h,需注意与m³/day之间的单位转化 + :param rain_min: 最小降雨量阈值 + :param max_window: 场次划分最大窗口,决定场次长度 + """ + rain = rain.T + flow = flow.T + rain_int = np.nancumsum(rain) + flow_int = np.nancumsum(flow) + T = rain.size + rain_mean = np.empty(((max_window - 1) // 2, T)) + flow_mean = np.empty(((max_window - 1) // 2, T)) + fluct_rain = np.empty(((max_window - 1) // 2, T)) + fluct_flow = np.empty(((max_window - 1) // 2, T)) + F_rain = np.empty((max_window - 1) // 2) + F_flow = np.empty((max_window - 1) // 2) + F_rain_flow = np.empty((max_window - 1) // 2) + rho = np.empty((max_window - 1) // 2) + for window in np.arange(3, max_window + 1, 2): + int_index = int((window - 1) / 2 - 1) + start_slice = int(window - 0.5 * (window - 1)) + dst_slice = int(T - 0.5 * (window - 1)) + # 新建一个循环体长度*数据长度的大数组 + rain_mean[int_index] = movmean(rain_int, window) + flow_mean[int_index] = movmean(flow_int, window) + fluct_rain[int_index] = rain_int - rain_mean[int_index, :] + F_rain[int_index] = (1 / (T - window + 1)) * np.nansum( + (fluct_rain[int_index, start_slice:dst_slice]) ** 2) + fluct_flow[int_index, np.newaxis] = flow_int - flow_mean[int_index, :] + F_flow[int_index] = (1 / (T - window + 1)) * np.nansum( + (fluct_flow[int_index, start_slice:dst_slice]) ** 2) + F_rain_flow[int_index] = (1 / (T - window + 1)) * np.nansum( + (fluct_rain[int_index, start_slice:dst_slice]) * ( + fluct_flow[int_index, start_slice:dst_slice])) + rho[int_index] = F_rain_flow[int_index] / ( + np.sqrt(F_rain[int_index]) * np.sqrt(F_flow[int_index])) + pos_min = np.argmin(rho) + Tr = pos_min + 1 + tol_fluct_rain = (rain_min / (2 * Tr + 1)) * Tr + tol_fluct_flow = flow_int[-1] / 1e15 + fluct_rain[pos_min, np.fabs(fluct_rain[pos_min, :]) < tol_fluct_rain] = 0 + fluct_flow[pos_min, np.fabs(fluct_flow[pos_min, :]) < tol_fluct_flow] = 0 + fluct_rain_Tr = fluct_rain[pos_min, :] + fluct_flow_Tr = fluct_flow[pos_min, :] + fluct_bivariate_Tr = fluct_rain_Tr * fluct_flow_Tr + fluct_bivariate_Tr[np.fabs(fluct_bivariate_Tr) < np.finfo(np.float64).eps] = 0 # 便于比较 + return Tr, fluct_rain_Tr, fluct_flow_Tr, fluct_bivariate_Tr + + +def step3_core_identification(fluct_bivariate_Tr): + d = np.diff(fluct_bivariate_Tr, prepend=[0], append=[0]) # 计算相邻数值差分,为0代表两端点处于0区间 + d[np.fabs(d) < np.finfo(np.float64).eps] = 0 # 确保计算正确 + d = np.logical_not(d) # 求0-1数组,为真代表为0区间 + d0 = np.logical_not(np.convolve(d, [1, 1], 'valid')) # 对相邻元素做OR,代表原数组数值是否处于某一0区间,再取反表示取有效值 + valid = np.logical_or(fluct_bivariate_Tr, d0) # 有效core + d_ = np.diff(valid, prepend=[0], append=[0]) # 求差分方便取上下边沿 + beginning_core = np.argwhere(d_ == 1) # 上边沿为begin + end_core = np.argwhere(d_ == -1) - 1 # 下边沿为end + return beginning_core, end_core + + +def step4_end_rain_events(beginning_core, end_core, rain, fluct_rain_Tr, rain_min): + end_rain = end_core.copy() + rain = rain.T + for g in range(end_core.size): + if end_core[g] + 2 < fluct_rain_Tr.size and \ + (np.fabs(fluct_rain_Tr[end_core[g] + 1]) < np.finfo(np.float64).eps and np.fabs(fluct_rain_Tr[end_core[g] + 2]) < np.finfo(np.float64).eps): + # case 1&2 + if np.fabs(rain[end_core[g]]) < np.finfo(np.float64).eps: + # case 1 + while end_rain[g] > beginning_core[g] and np.fabs(rain[end_rain[g]]) < np.finfo(np.float64).eps: + end_rain[g] = end_rain[g] - 1 + else: + # case 2 + bound = beginning_core[g + 1] if g + 1 < beginning_core.size else rain.size + while end_rain[g] < bound and rain[end_rain[g]] > rain_min: + end_rain[g] = end_rain[g] + 1 + end_rain[g] = end_rain[g] - 1 # 回到最后一个 + else: + # case 3 + # 若在降水,先跳过 + while end_rain[g] >= beginning_core[g] and rain[end_rain[g]] > rain_min: + end_rain[g] = end_rain[g] - 1 + while end_rain[g] >= beginning_core[g] and rain[end_rain[g]] < rain_min: + end_rain[g] = end_rain[g] - 1 + return end_rain + + +def step5_beginning_rain_events(beginning_core, end_rain, rain, fluct_rain_Tr, rain_min): + beginning_rain = beginning_core.copy() + rain = rain.T + for g in range(beginning_core.size): + if beginning_core[g] - 2 >= 0 \ + and (np.fabs(fluct_rain_Tr[beginning_core[g] - 1]) < np.finfo(np.float64).eps and np.fabs(fluct_rain_Tr[beginning_core[g] - 2]) < np.finfo( + np.float64).eps) \ + and np.fabs(rain[beginning_core[g]]) < np.finfo(np.float64).eps: + # case 1 + while beginning_rain[g] < end_rain[g] and np.fabs(rain[beginning_rain[g]]) < np.finfo(np.float64).eps: + beginning_rain[g] = beginning_rain[g] + 1 + else: + # case 2&3 + bound = end_rain[g - 1] if g - 1 >= 0 else -1 + while beginning_rain[g] > bound and rain[beginning_rain[g]] > rain_min: + beginning_rain[g] = beginning_rain[g] - 1 + beginning_rain[g] = beginning_rain[g] + 1 # 回到第一个 + return beginning_rain + + +def step6_checks_on_rain_events(beginning_rain, end_rain, rain, rain_min, beginning_core, end_core): + rain = rain.T + beginning_rain = beginning_rain.copy() + end_rain = end_rain.copy() + if beginning_rain[0] == 0: # 掐头 + beginning_rain = beginning_rain[1:] + end_rain = end_rain[1:] + beginning_core = beginning_core[1:] + end_core = end_core[1:] + if end_rain[-1] == rain.size - 1: # 去尾 + beginning_rain = beginning_rain[:-2] + end_rain = end_rain[:-2] + beginning_core = beginning_core[:-2] + end_core = end_core[:-2] + error_time_reversed = beginning_rain > end_rain + error_wrong_delimiter = np.logical_or(rain[beginning_rain - 1] > rain_min, rain[end_rain + 1] > rain_min) + beginning_rain[error_time_reversed] = -2 + beginning_rain[error_wrong_delimiter] = -2 + end_rain[error_time_reversed] = -2 + end_rain[error_wrong_delimiter] = -2 + beginning_core[error_time_reversed] = -2 + beginning_core[error_wrong_delimiter] = -2 + end_core[error_time_reversed] = -2 + end_core[error_wrong_delimiter] = -2 + beginning_rain = beginning_rain[beginning_rain != -2] + end_rain = end_rain[end_rain != -2] + beginning_core = beginning_core[beginning_core != -2] + end_core = end_core[end_core != -2] + return beginning_rain, end_rain, beginning_core, end_core + + +def step7_end_flow_events(end_rain_checked, beginning_core, end_core, rain, fluct_rain_Tr, fluct_flow_Tr, Tr): + end_flow = np.empty(end_core.size, dtype=int) + for g in range(end_rain_checked.size): + if end_core[g] + 2 < fluct_rain_Tr.size and \ + (np.fabs(fluct_rain_Tr[end_core[g] + 1]) < np.finfo(np.float64).eps and np.fabs(fluct_rain_Tr[end_core[g] + 2]) < np.finfo(np.float64).eps): + # case 1 + end_flow[g] = end_rain_checked[g] + bound = beginning_core[g + 1] + Tr if g + 1 < beginning_core.size else rain.size + bound = min(bound, rain.size) # 防溢出 + # 若flow为负,先跳过 + while end_flow[g] < bound and fluct_flow_Tr[end_flow[g]] <= 0: + end_flow[g] = end_flow[g] + 1 + while end_flow[g] < bound and fluct_flow_Tr[end_flow[g]] > 0: + end_flow[g] = end_flow[g] + 1 + end_flow[g] = end_flow[g] - 1 # 回到最后一个 + else: + # case 2 + end_flow[g] = end_core[g] + while end_flow[g] >= beginning_core[g] and fluct_flow_Tr[end_flow[g]] <= 0: + end_flow[g] = end_flow[g] - 1 + return end_flow + + +def step8_beginning_flow_events(beginning_rain_checked, end_rain_checked, rain, beginning_core, fluct_rain_Tr, fluct_flow_Tr): + beginning_flow = np.empty(beginning_rain_checked.size, dtype=int) + for g in range(beginning_rain_checked.size): + if beginning_core[g] - 2 >= 0 \ + and (np.fabs(fluct_rain_Tr[beginning_core[g] - 1]) < np.finfo(np.float64).eps and np.fabs(fluct_rain_Tr[beginning_core[g] - 2]) < np.finfo( + np.float64).eps): + beginning_flow[g] = beginning_rain_checked[g] # case 1 + else: + beginning_flow[g] = beginning_core[g] # case 2 + while beginning_flow[g] < end_rain_checked[g] and fluct_flow_Tr[beginning_flow[g]] >= 0: + beginning_flow[g] = beginning_flow[g] + 1 + return beginning_flow + + +def step9_checks_on_flow_events(beginning_rain_checked, end_rain_checked, beginning_flow, end_flow, fluct_flow_Tr): + error_time_reversed = beginning_flow > end_flow + error_wrong_fluct = np.logical_or(np.logical_or(fluct_flow_Tr[beginning_flow] > 0, fluct_flow_Tr[end_flow] < 0), np.logical_or(beginning_flow < + beginning_rain_checked, end_flow < end_rain_checked)) + beginning_flow[error_time_reversed] = -3 + beginning_flow[error_wrong_fluct] = -3 + end_flow[error_time_reversed] = -3 + end_flow[error_wrong_fluct] = -3 + beginning_flow = beginning_flow[beginning_flow != -3] + end_flow = end_flow[end_flow != -3] + return beginning_flow, end_flow + + +def step10_checks_on_overlapping_events(beginning_rain_ungrouped, end_rain_ungrouped, beginning_flow_ungrouped, end_flow_ungrouped, time): + # rain + order1 = np.reshape(np.hstack((np.reshape(beginning_rain_ungrouped, (-1, 1)), + np.reshape(end_rain_ungrouped, (-1, 1)))), (1, -1)) + reversed1 = np.diff(order1) <= 0 + order1[np.hstack((reversed1, [[False]]))] = -2 + order1[np.hstack(([[False]], reversed1))] = -2 + order1 = order1[order1 != -2] + # flow + order2 = np.reshape(np.hstack((np.reshape(beginning_flow_ungrouped, (-1, 1)), + np.reshape(end_flow_ungrouped, (-1, 1)))), (1, -1)) + reversed2 = np.diff(order2) <= 0 + order2[np.hstack((reversed2, [[False]]))] = -3 + order2[np.hstack(([[False]], reversed2))] = -3 + order2 = order2[order2 != -3] + # group + rain_grouped = np.reshape(order1, (-1, 2)).T + beginning_rain_grouped = rain_grouped[0] + end_rain_grouped = rain_grouped[1] + flow_grouped = np.reshape(order2, (-1, 2)).T + beginning_flow_grouped = flow_grouped[0] + end_flow_grouped = flow_grouped[1] + return time[beginning_rain_grouped], time[end_rain_grouped], time[beginning_flow_grouped], time[end_flow_grouped] \ No newline at end of file diff --git a/setup.py b/setup.py index 29b5c04..e91a5b7 100644 --- a/setup.py +++ b/setup.py @@ -4,20 +4,20 @@ from setuptools import setup, find_packages setup( - name="", # 输入项目名称 - version="", # 输入版本号 + name="hydromodel_calibrate_base", # 输入项目名称 + version="0.0.1", # 输入版本号 keywords=[""], # 输入关键词 description="", # 输入概述 long_description="", # 输入描述 - url="", # 输入项目Github仓库的链接 - author="", # 输入作者名字 + url="https://github.com/iHeadWater/hydro-model-xaj", # 输入项目Github仓库的链接 + author="iHeadWater", # 输入作者名字 author_email="", # 输入作者邮箱 - license="", # 此为声明文件,一般填写 MIT_license + license="MIT_license", # 此为声明文件,一般填写 MIT_license packages=find_packages(), include_package_data=True, platforms="any", install_requires=[""], # 输入项目所用的包 - python_requires='>= ', # Python版本要求 + python_requires='>= 3.6 ', # Python版本要求 ) diff --git a/test/test_session_division.py b/test/test_session_division.py new file mode 100644 index 0000000..882e366 --- /dev/null +++ b/test/test_session_division.py @@ -0,0 +1,35 @@ +import os + +import pandas as pd + +import definitions +from hydromodel.utils.dmca_esr import step1_step2_tr_and_fluctuations_timeseries, step3_core_identification, step4_end_rain_events, \ + step5_beginning_rain_events, step6_checks_on_rain_events, step7_end_flow_events, step8_beginning_flow_events, \ + step9_checks_on_flow_events, step10_checks_on_overlapping_events + + +def test_session_division_new(): + rain = pd.read_csv(os.path.join(definitions.ROOT_DIR, 'hydromodel/example/division_rain.csv'))['rain'] + flow = pd.read_csv(os.path.join(definitions.ROOT_DIR, 'hydromodel/example/division_flow.csv'))['flow'] + time = rain.index.to_numpy() + rain = rain.to_numpy()/24 + flow = flow.to_numpy()/24 + rain_min = 0.02 + max_window = 100 + Tr, fluct_rain_Tr, fluct_flow_Tr, fluct_bivariate_Tr = step1_step2_tr_and_fluctuations_timeseries(rain, flow, rain_min, max_window) + beginning_core, end_core = step3_core_identification(fluct_bivariate_Tr) + end_rain = step4_end_rain_events(beginning_core, end_core, rain, fluct_rain_Tr, rain_min) + beginning_rain = step5_beginning_rain_events(beginning_core, end_rain, rain, fluct_rain_Tr, rain_min) + beginning_rain_checked, end_rain_checked, beginning_core, end_core = step6_checks_on_rain_events(beginning_rain, end_rain, rain, + rain_min, beginning_core, + end_core) + end_flow = step7_end_flow_events(end_rain_checked, beginning_core, end_core, rain, fluct_rain_Tr, fluct_flow_Tr, Tr) + beginning_flow = step8_beginning_flow_events(beginning_rain_checked, end_rain_checked, rain, beginning_core, fluct_rain_Tr, + fluct_flow_Tr) + beginning_flow_checked, end_flow_checked = step9_checks_on_flow_events(beginning_rain_checked, end_rain_checked, beginning_flow, + end_flow, fluct_flow_Tr) + BEGINNING_RAIN, BEGINNING_FLOW, END_RAIN, END_FLOW = step10_checks_on_overlapping_events(beginning_flow_checked, end_flow_checked, + beginning_flow_checked, + end_flow_checked, time) + print(BEGINNING_RAIN, BEGINNING_FLOW, END_RAIN, END_FLOW) + print(len(BEGINNING_RAIN), len(BEGINNING_FLOW), len(END_RAIN), len(END_FLOW)) \ No newline at end of file From f592bd64bc31f4fb83c0c1f556c0821df4caaeff Mon Sep 17 00:00:00 2001 From: forestbat Date: Mon, 9 Oct 2023 17:51:12 +0800 Subject: [PATCH 05/19] fix mistake in test_session_division.py --- test/test_session_division.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_session_division.py b/test/test_session_division.py index 882e366..23c3f6a 100644 --- a/test/test_session_division.py +++ b/test/test_session_division.py @@ -28,8 +28,8 @@ def test_session_division_new(): fluct_flow_Tr) beginning_flow_checked, end_flow_checked = step9_checks_on_flow_events(beginning_rain_checked, end_rain_checked, beginning_flow, end_flow, fluct_flow_Tr) - BEGINNING_RAIN, BEGINNING_FLOW, END_RAIN, END_FLOW = step10_checks_on_overlapping_events(beginning_flow_checked, end_flow_checked, + BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW = step10_checks_on_overlapping_events(beginning_flow_checked, end_flow_checked, beginning_flow_checked, end_flow_checked, time) - print(BEGINNING_RAIN, BEGINNING_FLOW, END_RAIN, END_FLOW) - print(len(BEGINNING_RAIN), len(BEGINNING_FLOW), len(END_RAIN), len(END_FLOW)) \ No newline at end of file + print(BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW) + print(len(BEGINNING_RAIN), len(END_RAIN), len(BEGINNING_FLOW), len(END_FLOW)) \ No newline at end of file From 4c9b6791d357a4cf42cc244565ddec785214eb02 Mon Sep 17 00:00:00 2001 From: forestbat Date: Mon, 9 Oct 2023 18:46:00 +0800 Subject: [PATCH 06/19] fix mistake in test_session_division.py --- test/test_session_division.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/test/test_session_division.py b/test/test_session_division.py index 23c3f6a..cc00831 100644 --- a/test/test_session_division.py +++ b/test/test_session_division.py @@ -3,7 +3,8 @@ import pandas as pd import definitions -from hydromodel.utils.dmca_esr import step1_step2_tr_and_fluctuations_timeseries, step3_core_identification, step4_end_rain_events, \ +from hydromodel.utils.dmca_esr import step1_step2_tr_and_fluctuations_timeseries, step3_core_identification, \ + step4_end_rain_events, \ step5_beginning_rain_events, step6_checks_on_rain_events, step7_end_flow_events, step8_beginning_flow_events, \ step9_checks_on_flow_events, step10_checks_on_overlapping_events @@ -12,24 +13,32 @@ def test_session_division_new(): rain = pd.read_csv(os.path.join(definitions.ROOT_DIR, 'hydromodel/example/division_rain.csv'))['rain'] flow = pd.read_csv(os.path.join(definitions.ROOT_DIR, 'hydromodel/example/division_flow.csv'))['flow'] time = rain.index.to_numpy() - rain = rain.to_numpy()/24 - flow = flow.to_numpy()/24 + rain = rain.to_numpy() / 24 + flow = flow.to_numpy() / 24 rain_min = 0.02 max_window = 100 - Tr, fluct_rain_Tr, fluct_flow_Tr, fluct_bivariate_Tr = step1_step2_tr_and_fluctuations_timeseries(rain, flow, rain_min, max_window) + Tr, fluct_rain_Tr, fluct_flow_Tr, fluct_bivariate_Tr = step1_step2_tr_and_fluctuations_timeseries(rain, flow, + rain_min, + max_window) beginning_core, end_core = step3_core_identification(fluct_bivariate_Tr) end_rain = step4_end_rain_events(beginning_core, end_core, rain, fluct_rain_Tr, rain_min) beginning_rain = step5_beginning_rain_events(beginning_core, end_rain, rain, fluct_rain_Tr, rain_min) - beginning_rain_checked, end_rain_checked, beginning_core, end_core = step6_checks_on_rain_events(beginning_rain, end_rain, rain, - rain_min, beginning_core, + beginning_rain_checked, end_rain_checked, beginning_core, end_core = step6_checks_on_rain_events(beginning_rain, + end_rain, rain, + rain_min, + beginning_core, end_core) end_flow = step7_end_flow_events(end_rain_checked, beginning_core, end_core, rain, fluct_rain_Tr, fluct_flow_Tr, Tr) - beginning_flow = step8_beginning_flow_events(beginning_rain_checked, end_rain_checked, rain, beginning_core, fluct_rain_Tr, - fluct_flow_Tr) - beginning_flow_checked, end_flow_checked = step9_checks_on_flow_events(beginning_rain_checked, end_rain_checked, beginning_flow, + beginning_flow = step8_beginning_flow_events(beginning_rain_checked, end_rain_checked, rain, beginning_core, + fluct_rain_Tr, + fluct_flow_Tr) + beginning_flow_checked, end_flow_checked = step9_checks_on_flow_events(beginning_rain_checked, end_rain_checked, + beginning_flow, end_flow, fluct_flow_Tr) - BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW = step10_checks_on_overlapping_events(beginning_flow_checked, end_flow_checked, - beginning_flow_checked, - end_flow_checked, time) + BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW = step10_checks_on_overlapping_events(beginning_rain_checked, + end_rain_checked, + beginning_flow_checked, + end_flow_checked, + time) print(BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW) - print(len(BEGINNING_RAIN), len(END_RAIN), len(BEGINNING_FLOW), len(END_FLOW)) \ No newline at end of file + print(len(BEGINNING_RAIN), len(END_RAIN), len(BEGINNING_FLOW), len(END_FLOW)) From 235592ab507a4123d664cf26e5971944b14ac668 Mon Sep 17 00:00:00 2001 From: forestbat Date: Tue, 10 Oct 2023 15:03:20 +0800 Subject: [PATCH 07/19] change pypi distribute workflow --- .github/workflows/publish-to-pypi.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index 11a4285..daeafc1 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -1,6 +1,8 @@ name: Publish Python distributions to PyPI -on: push +on: + push: + workflow_dispatch: jobs: build-n-publish: @@ -33,4 +35,4 @@ jobs: if: startsWith(github.ref, 'refs/tags') uses: pypa/gh-action-pypi-publish@master with: - password: ${{ secrets.PYPI_API_TOKEN }} + password: ${{ secrets.HYDRO_XAJ_TOKEN }} From 18071f5429ace069046eb79f738c6495279f41c8 Mon Sep 17 00:00:00 2001 From: forestbat Date: Tue, 10 Oct 2023 15:17:40 +0800 Subject: [PATCH 08/19] update workflow and add user --- .github/workflows/publish-to-pypi.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index daeafc1..f300259 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -35,4 +35,5 @@ jobs: if: startsWith(github.ref, 'refs/tags') uses: pypa/gh-action-pypi-publish@master with: + user: __token__ password: ${{ secrets.HYDRO_XAJ_TOKEN }} From 74c2c3b95fc8ccd7979be1971222342e1bb3831a Mon Sep 17 00:00:00 2001 From: forestbat Date: Tue, 10 Oct 2023 15:57:38 +0800 Subject: [PATCH 09/19] update workflow --- .github/workflows/publish-to-pypi.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index f300259..2bc7304 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -32,8 +32,7 @@ jobs: . - name: Publish distribution to PyPI - if: startsWith(github.ref, 'refs/tags') - uses: pypa/gh-action-pypi-publish@master + uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ password: ${{ secrets.HYDRO_XAJ_TOKEN }} From 6ceb8945ce47deb2893861b84cb951584476a7e7 Mon Sep 17 00:00:00 2001 From: forestbat Date: Tue, 10 Oct 2023 16:15:37 +0800 Subject: [PATCH 10/19] update setup.py to add long_description --- setup.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e91a5b7..1a34d50 100644 --- a/setup.py +++ b/setup.py @@ -3,12 +3,16 @@ from setuptools import setup, find_packages +with open("README.md") as readme_file: + readme = readme_file.read() + setup( name="hydromodel_calibrate_base", # 输入项目名称 version="0.0.1", # 输入版本号 keywords=[""], # 输入关键词 description="", # 输入概述 - long_description="", # 输入描述 + long_description=readme, + long_description_content_type="text/markdown", url="https://github.com/iHeadWater/hydro-model-xaj", # 输入项目Github仓库的链接 author="iHeadWater", # 输入作者名字 From c12830c6b56fd2bc1484eb07665d55dffcd7480b Mon Sep 17 00:00:00 2001 From: forestbat Date: Tue, 10 Oct 2023 16:17:22 +0800 Subject: [PATCH 11/19] update setup.py to add long_description --- setup.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/setup.py b/setup.py index 1a34d50..af6d280 100644 --- a/setup.py +++ b/setup.py @@ -13,12 +13,10 @@ description="", # 输入概述 long_description=readme, long_description_content_type="text/markdown", - url="https://github.com/iHeadWater/hydro-model-xaj", # 输入项目Github仓库的链接 author="iHeadWater", # 输入作者名字 author_email="", # 输入作者邮箱 license="MIT_license", # 此为声明文件,一般填写 MIT_license - packages=find_packages(), include_package_data=True, platforms="any", From 514dbdab1228844d479ea734f0eb4de674943bb4 Mon Sep 17 00:00:00 2001 From: forestbat Date: Thu, 12 Oct 2023 16:33:53 +0800 Subject: [PATCH 12/19] Update setup.py change pypi project name --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index af6d280..d019c08 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ readme = readme_file.read() setup( - name="hydromodel_calibrate_base", # 输入项目名称 + name="hydromodel", # 输入项目名称 version="0.0.1", # 输入版本号 keywords=[""], # 输入关键词 description="", # 输入概述 From 9865afe3167d1c539a26f881e36f1d168fd17e36 Mon Sep 17 00:00:00 2001 From: ouyangwenyu Date: Sat, 28 Oct 2023 09:49:14 +0800 Subject: [PATCH 13/19] add bim package for env --- environment-dev.yml | 5 +++++ environment.yml | 3 ++- setup.py | 19 ++++++++++++------- test/test_data.py | 2 +- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/environment-dev.yml b/environment-dev.yml index 81764f5..288a934 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -13,9 +13,14 @@ dependencies: - spotpy=1.5.14 - seaborn - tqdm + - yaml + - bmipy + # for dev - sphinx - pytest - black + - flake8 + # pip - pip - pip: - hydrodataset diff --git a/environment.yml b/environment.yml index 02544ac..da831b9 100644 --- a/environment.yml +++ b/environment.yml @@ -13,7 +13,8 @@ dependencies: - spotpy=1.5.14 - seaborn - tqdm - - pytest + - yaml + - bmipy - pip - pip: - hydrodataset diff --git a/setup.py b/setup.py index d019c08..e143dd7 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,16 @@ -#!/usr/bin/env python -# -*- coding:utf-8 -*- - +""" +Author: Wenyu Ouyang +Date: 2023-10-28 09:16:46 +LastEditTime: 2023-10-28 09:27:22 +LastEditors: Wenyu Ouyang +Description: setup.py for hydromodel package +FilePath: \hydro-model-xaj\setup.py +Copyright (c) 2023-2024 Wenyu Ouyang. All rights reserved. +""" +import pathlib from setuptools import setup, find_packages -with open("README.md") as readme_file: - readme = readme_file.read() - +readme = pathlib.Path("README.md").read_text() setup( name="hydromodel", # 输入项目名称 version="0.0.1", # 输入版本号 @@ -21,5 +26,5 @@ include_package_data=True, platforms="any", install_requires=[""], # 输入项目所用的包 - python_requires='>= 3.6 ', # Python版本要求 + python_requires=">= 3.7 ", # Python版本要求 ) diff --git a/test/test_data.py b/test/test_data.py index 6844fc7..1bbcb2a 100644 --- a/test/test_data.py +++ b/test/test_data.py @@ -1,7 +1,7 @@ """ Author: Wenyu Ouyang Date: 2022-10-25 21:16:22 -LastEditTime: 2022-11-28 14:50:30 +LastEditTime: 2023-10-28 09:18:48 LastEditors: Wenyu Ouyang Description: Test for data preprocess FilePath: \hydro-model-xaj\test\test_data.py From 7a7ad304778dae3472655170eafdd89690c89548 Mon Sep 17 00:00:00 2001 From: ouyangwenyu Date: Sat, 28 Oct 2023 15:56:11 +0800 Subject: [PATCH 14/19] delete xaj dir --- {xaj => hydromodel/app}/dockerfile | 0 .../calibrate}/calibrate_ga_xaj_bmi.py | 2 +- .../calibrate}/calibrate_sceua_xaj_bmi.py | 2 +- {xaj => hydromodel/models}/configuration.py | 2 +- hydromodel/models/xaj.py | 173 +++ {xaj => hydromodel/models}/xaj_bmi.py | 154 ++- {xaj => hydromodel/utils}/constant_unit.py | 0 test/test_xaj_bmi.py | 4 +- xaj/__init__.py | 0 xaj/params.py | 122 -- xaj/xajmodel.py | 1060 ----------------- 11 files changed, 268 insertions(+), 1251 deletions(-) rename {xaj => hydromodel/app}/dockerfile (100%) rename {xaj => hydromodel/calibrate}/calibrate_ga_xaj_bmi.py (99%) rename {xaj => hydromodel/calibrate}/calibrate_sceua_xaj_bmi.py (99%) rename {xaj => hydromodel/models}/configuration.py (92%) rename {xaj => hydromodel/models}/xaj_bmi.py (67%) rename {xaj => hydromodel/utils}/constant_unit.py (100%) delete mode 100644 xaj/__init__.py delete mode 100644 xaj/params.py delete mode 100644 xaj/xajmodel.py diff --git a/xaj/dockerfile b/hydromodel/app/dockerfile similarity index 100% rename from xaj/dockerfile rename to hydromodel/app/dockerfile diff --git a/xaj/calibrate_ga_xaj_bmi.py b/hydromodel/calibrate/calibrate_ga_xaj_bmi.py similarity index 99% rename from xaj/calibrate_ga_xaj_bmi.py rename to hydromodel/calibrate/calibrate_ga_xaj_bmi.py index 555b671..71dd54a 100644 --- a/xaj/calibrate_ga_xaj_bmi.py +++ b/hydromodel/calibrate/calibrate_ga_xaj_bmi.py @@ -18,7 +18,7 @@ from hydromodel.utils import stat from hydromodel.utils.stat import statRmse from hydromodel.visual.hydro_plot import plot_sim_and_obs, plot_train_iteration -from xaj.xaj_bmi import xajBmi +from hydromodel.models.xaj_bmi import xajBmi def evaluate(individual, x_input, y_true, warmup_length, model): diff --git a/xaj/calibrate_sceua_xaj_bmi.py b/hydromodel/calibrate/calibrate_sceua_xaj_bmi.py similarity index 99% rename from xaj/calibrate_sceua_xaj_bmi.py rename to hydromodel/calibrate/calibrate_sceua_xaj_bmi.py index ac7cf9b..404cd4b 100644 --- a/xaj/calibrate_sceua_xaj_bmi.py +++ b/hydromodel/calibrate/calibrate_sceua_xaj_bmi.py @@ -4,7 +4,7 @@ from spotpy.parameter import Uniform, ParameterSet from spotpy.objectivefunctions import rmse from hydromodel.models.model_config import MODEL_PARAM_DICT -from xaj.xaj_bmi import xajBmi +from hydromodel.models.xaj_bmi import xajBmi class SpotSetup(object): diff --git a/xaj/configuration.py b/hydromodel/models/configuration.py similarity index 92% rename from xaj/configuration.py rename to hydromodel/models/configuration.py index 708f736..219abd8 100644 --- a/xaj/configuration.py +++ b/hydromodel/models/configuration.py @@ -1,6 +1,6 @@ import yaml import numpy as np -from xaj.xajmodel import xaj_state as xaj_state +from hydromodel.models.xaj import xaj_state as xaj_state def read_config(config_file): diff --git a/hydromodel/models/xaj.py b/hydromodel/models/xaj.py index 614d3c0..8aaf9ba 100644 --- a/hydromodel/models/xaj.py +++ b/hydromodel/models/xaj.py @@ -8,6 +8,7 @@ from scipy.special import gamma from hydromodel.models.model_config import MODEL_PARAM_DICT +from xaj.params import MODEL_PARAM_DICT PRECISION = 1e-5 @@ -885,3 +886,175 @@ def xaj( if return_state: return q_sim, es, *w, s, fr, qi, qg return q_sim, es + + +def xaj_state( + p_and_e, + params: Union[np.array, list], + return_state=True, + warmup_length=365, + **kwargs, +) -> Union[tuple, np.array]: + # default values for some function parameters + model_name = kwargs["name"] if "name" in kwargs else "xaj" + source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" + source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" + # params + param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] + if model_name == "xaj": + route_method = "CSL" + elif model_name == "xaj_mz": + route_method = "MZ" + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + xaj_params = [ + (value[1] - value[0]) * params[:, i] + value[0] + for i, (key, value) in enumerate(param_ranges.items()) + ] + k = xaj_params[0] + b = xaj_params[1] + im = xaj_params[2] + um = xaj_params[3] + lm = xaj_params[4] + dm = xaj_params[5] + c = xaj_params[6] + sm = xaj_params[7] + ex = xaj_params[8] + ki_ = xaj_params[9] + kg_ = xaj_params[10] + # ki+kg should be smaller than 1; if not, we scale them + ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) + kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) + if route_method == "CSL": + cs = xaj_params[11] + l = xaj_params[12] + + elif route_method == "MZ": + # we will use routing method from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ + a = xaj_params[11] + theta = xaj_params[12] + # make it as a parameter + kernel_size = int(xaj_params[15]) + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + ci = xaj_params[13] + cg = xaj_params[14] + + + # initialize state values + # if warmup_length > 0: + # p_and_e_warmup = p_and_e[0:warmup_length, :, :] + # _q, _e, *w0, s0, fr0, qi0, qg0 = xaj_state( + # p_and_e_warmup, + # params, + # return_state=True, + # warmup_length=0, + # **kwargs, + # ) + # else: + w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) + s0 = 0.5 * sm + fr0 = np.full(ex.shape, 0.1) + qi0 = np.full(ci.shape, 0.1) + qg0 = np.full(cg.shape, 0.1) + + #state_variables + # inputs = p_and_e[warmup_length:, :, :] + inputs = p_and_e[:, :, :] + runoff_ims_ = np.full(inputs.shape[:2], 0.0) + rss_ = np.full(inputs.shape[:2], 0.0) + ris_ = np.full(inputs.shape[:2], 0.0) + rgs_ = np.full(inputs.shape[:2], 0.0) + es_ = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w0 + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + else: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + # impevious part is pe * im + runoff_ims_[i, :] = rim + # so for non-imprvious part, the result should be corrected + rss_[i, :] = rs * (1 - im) + ris_[i, :] = ri * (1 - im) + rgs_[i, :] = rg * (1 - im) + es_[i, :] = e + # seq, batch, feature + runoff_im = np.expand_dims(runoff_ims_, axis=2) + rss = np.expand_dims(rss_, axis=2) + es = np.expand_dims(es_, axis=2) + + qs = np.full(inputs.shape[:2], 0.0) + + if route_method == "CSL": + qt = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs_ = rss_[i] + qt[i, :] = qs_ + qi + qg + + for j in range(len(l)): + # print(range(len(l))) + lag = int(l[j]) + for i in range(0,lag): + qs[i, j] = qt[i, j] + if i == lag: + break + for i in range(lag, inputs.shape[0]): + # print(inputs.shape[0]) + qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j] + + elif route_method == "MZ": + rout_a = a.repeat(rss.shape[0]).reshape(rss.shape) + rout_b = theta.repeat(rss.shape[0]).reshape(rss.shape) + conv_uh = uh_gamma(rout_a, rout_b, kernel_size) + qs_ = uh_conv(runoff_im + rss, conv_uh) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs[i, :] = qs_[i, :, 0] + qi + qg + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CSL' or 'MZ'!" + ) + + # seq, batch, feature + q_sim = np.expand_dims(qs, axis=2) + if return_state: + return q_sim, es, *w, s, fr, qi, qg diff --git a/xaj/xaj_bmi.py b/hydromodel/models/xaj_bmi.py similarity index 67% rename from xaj/xaj_bmi.py rename to hydromodel/models/xaj_bmi.py index f8fc628..94f1d02 100644 --- a/xaj/xaj_bmi.py +++ b/hydromodel/models/xaj_bmi.py @@ -2,8 +2,8 @@ from bmipy import Bmi import numpy as np -from xaj import configuration -from xaj.xajmodel import xaj_route, xaj_runoff +from hydromodel.models import configuration +from hydromodel.models.xajmodel import xaj_route, xaj_runoff import datetime import logging @@ -14,46 +14,62 @@ class xajBmi(Bmi): """Empty model wrapped in a BMI interface.""" + name = "hydro-model-xaj" input_var_names = ("precipitation", "ETp") output_var_names = ("ET", "discharge") - var_units = {"precipitation": "mm/day", "ETp": "mm/day", "discharge": "mm/day", "ET": "mm/day"} + var_units = { + "precipitation": "mm/day", + "ETp": "mm/day", + "discharge": "mm/day", + "ET": "mm/day", + } def __init__(self): - """Create a BmiHeat model that is ready for initialization.""" + """Create a Bmi model that is ready for initialization.""" self.time_step = 0 def initialize(self, config_file, params, p_and_e): try: logger.info("xaj: initialize_model") config = configuration.read_config(config_file) - model_name = config['model_name'] - source_type = config['source_type'] - source_book = config['source_book'] + model_name = config["model_name"] + source_type = config["source_type"] + source_book = config["source_book"] # forcing_data = pd.read_csv(config['forcing_data']) model_info = { - 'model_name': model_name, - 'source_type': source_type, - 'source_book': source_book, - + "model_name": model_name, + "source_type": source_type, + "source_book": source_book, } # p_and_e_df, p_and_e = configuration.extract_forcing(forcing_data) - p_and_e_warmup = p_and_e[0:config['warmup_length'], :, :] - self.q_sim_state, self.es_state, self.w0, self.w1, self.w2, self.s0, self.fr0, self.qi0, self.qg0 = configuration.warmup( - p_and_e_warmup, params, config['warmup_length'], model_info) + p_and_e_warmup = p_and_e[0 : config["warmup_length"], :, :] + ( + self.q_sim_state, + self.es_state, + self.w0, + self.w1, + self.w2, + self.s0, + self.fr0, + self.qi0, + self.qg0, + ) = configuration.warmup( + p_and_e_warmup, params, config["warmup_length"], model_info + ) self.params = params - self.warmup_length = config['warmup_length'] - self._start_time_str = config['start_time_str'] - self._end_time_str = config['end_time_str'] - self._time_units = config['time_units'] + self.warmup_length = config["warmup_length"] + self._start_time_str = config["start_time_str"] + self._end_time_str = config["end_time_str"] + self._time_units = config["time_units"] # self.p_and_e_df = p_and_e_df self.p_and_e = p_and_e self.config = config self.model_info = model_info - train_period = config['train_period'] - test_period = config['test_period'] + train_period = config["train_period"] + test_period = config["test_period"] self.train_start_time_str = train_period[0] self.train_end_time_str = train_period[1] self.test_start_time_str = test_period[0] @@ -61,6 +77,7 @@ def initialize(self, config_file, params, p_and_e): except: import traceback + traceback.print_exc() raise @@ -68,28 +85,40 @@ def update(self): """Update model for a single time step.""" self.time_step += 1 - p_and_e_sim = self.p_and_e[self.warmup_length:self.time_step + self.warmup_length] + p_and_e_sim = self.p_and_e[ + self.warmup_length : self.time_step + self.warmup_length + ] # p_and_e_sim = self.p_and_e[0:self.time_step] - self.runoff_im, self.rss_, self.ris_, self.rgs_, self.es_runoff, self.rss = xaj_runoff(p_and_e_sim, - w0=self.w0, s0=self.s0, - fr0=self.fr0, - params_runoff=self.params, - return_state=False, - model_info=self.model_info, - ) + ( + self.runoff_im, + self.rss_, + self.ris_, + self.rgs_, + self.es_runoff, + self.rss, + ) = xaj_runoff( + p_and_e_sim, + w0=self.w0, + s0=self.s0, + fr0=self.fr0, + params_runoff=self.params, + return_state=False, + model_info=self.model_info, + ) if self.time_step + self.warmup_length >= self.p_and_e.shape[0]: - q_sim, es = xaj_route(p_and_e_sim, - params_route=self.params, - model_info=self.model_info, - runoff_im=self.runoff_im, - rss_=self.rss_, - ris_=self.ris_, - rgs_=self.rgs_, - rss=self.rss, - qi0=self.qi0, - qg0=self.qg0, - es=self.es_runoff, - ) + q_sim, es = xaj_route( + p_and_e_sim, + params_route=self.params, + model_info=self.model_info, + runoff_im=self.runoff_im, + rss_=self.rss_, + ris_=self.ris_, + rgs_=self.rgs_, + rss=self.rss, + qi0=self.qi0, + qg0=self.qg0, + es=self.es_runoff, + ) self.p_sim = p_and_e_sim[:, :, 0] self.e_sim = p_and_e_sim[:, :, 1] # q_sim = convert_unit( @@ -128,7 +157,7 @@ def get_var_grid(self, name: str) -> int: raise NotImplementedError() def get_var_type(self, name: str) -> str: - return 'float64' + return "float64" def get_var_units(self, name: str) -> str: return self.var_units[name] @@ -143,26 +172,26 @@ def get_var_location(self, name: str) -> str: raise NotImplementedError() def get_start_time(self, period): - if period == 'train': + if period == "train": return self.start_Time(self.train_start_time_str) - if period == 'test': + if period == "test": return self.start_Time(self.test_start_time_str) # return self.start_Time(self._start_time_str) def get_current_time(self): # return self.start_Time(self._start_time_str) + datetime.timedelta(self.time_step+self.warmup_length) - if self._time_units == 'hours': + if self._time_units == "hours": time_step = datetime.timedelta(hours=self.time_step) - elif self._time_units == 'days': + elif self._time_units == "days": time_step = datetime.timedelta(days=self.time_step) return self.start_Time(self._start_time_str) + time_step def get_end_time(self, period): - if period == 'train': + if period == "train": return self.end_Time(self.train_end_time_str) - if period == 'test': + if period == "test": return self.end_Time(self.test_end_time_str) - # return self.end_Time(self._end_time_str) + # return self.end_Time(self._end_time_str) def get_time_units(self) -> str: return self._time_units @@ -175,24 +204,20 @@ def get_value(self, name: str) -> None: return self.get_value_ptr(name).flatten() def get_value_ptr(self, name: str) -> np.ndarray: - if name == 'discharge': + if name == "discharge": return self.q_sim - elif name == 'ET': + elif name == "ET": return self.es - def get_value_at_indices( - self, name: str, inds: np.ndarray - ) -> np.ndarray: - + def get_value_at_indices(self, name: str, inds: np.ndarray) -> np.ndarray: return self.get_value_ptr(name).take(inds) def set_value(self, name: str, src: np.ndarray): - val = self.get_value_ptr(name) val[:] = src.reshape(val.shape) def set_value_at_indices( - self, name: str, inds: np.ndarray, src: np.ndarray + self, name: str, inds: np.ndarray, src: np.ndarray ) -> None: val = self.get_value_ptr(name) val.flat[inds] = src @@ -246,12 +271,11 @@ def get_grid_face_nodes(self, grid: int, face_nodes: np.ndarray) -> np.ndarray: raise NotImplementedError() def get_grid_nodes_per_face( - self, grid: int, nodes_per_face: np.ndarray + self, grid: int, nodes_per_face: np.ndarray ) -> np.ndarray: raise NotImplementedError() def start_Time(self, _start_time_str): - try: if " " in _start_time_str: date, time = _start_time_str.split(" ") @@ -263,18 +287,18 @@ def start_Time(self, _start_time_str): if time: hour, minute, second = time.split(":") - # self._startTime = self._startTime.replace(hour=int(hour), - # minute=int(minute), + # self._startTime = self._startTime.replace(hour=int(hour), + # minute=int(minute), # second=int(second)) - self._startTime = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), - int(second)) + self._startTime = datetime.datetime( + int(year), int(month), int(day), int(hour), int(minute), int(second) + ) except ValueError: raise ValueError("Invalid start date format!") return self._startTime def end_Time(self, _end_time_str): - try: if " " in _end_time_str: date, time = _end_time_str.split(" ") @@ -286,7 +310,9 @@ def end_Time(self, _end_time_str): if time: hour, minute, second = time.split(":") - self._endTime = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), int(second)) + self._endTime = datetime.datetime( + int(year), int(month), int(day), int(hour), int(minute), int(second) + ) except ValueError: raise ValueError("Invalid start date format!") return self._endTime diff --git a/xaj/constant_unit.py b/hydromodel/utils/constant_unit.py similarity index 100% rename from xaj/constant_unit.py rename to hydromodel/utils/constant_unit.py diff --git a/test/test_xaj_bmi.py b/test/test_xaj_bmi.py index 0ee679b..c61808c 100644 --- a/test/test_xaj_bmi.py +++ b/test/test_xaj_bmi.py @@ -1,8 +1,8 @@ import logging import definitions -from xaj.configuration import read_config -from xaj.xaj_bmi import xajBmi +from hydromodel.models.configuration import read_config +from hydromodel.models.xaj_bmi import xajBmi logging.basicConfig(level=logging.INFO) diff --git a/xaj/__init__.py b/xaj/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/xaj/params.py b/xaj/params.py deleted file mode 100644 index 49f3393..0000000 --- a/xaj/params.py +++ /dev/null @@ -1,122 +0,0 @@ -""" -Author: Wenyu Ouyang -Date: 2022-10-25 21:16:22 -LastEditTime: 2022-12-25 16:06:05 -LastEditors: Wenyu Ouyang -Description: some basic config for hydro-model-xaj models -FilePath: \hydro-model-xaj\hydromodel\models\model_config.py -Copyright (c) 2021-2022 Wenyu Ouyang. All rights reserved. -""" -from collections import OrderedDict - -# NOTE: Don't change the parameter settings - -MODEL_PARAM_DICT = { - "xaj": { - "param_name": [ - # Allen, R.G., L. Pereira, D. Raes, and M. Smith, 1998. - # Crop Evapotranspiration, Food and Agriculture Organization of the United Nations, - # Rome, Italy. FAO publication 56. ISBN 92-5-104219-5. 290p. - "K", # ratio of potential evapotranspiration to reference crop evaporation generally from Allen, 1998 - "B", # The exponent of the tension water capacity curve - "IM", # The ratio of the impervious to the total area of the basin - "UM", # Tension water capacity in the upper layer - "LM", # Tension water capacity in the lower layer - "DM", # Tension water capacity in the deepest layer - "C", # The coefficient of deep evapotranspiration - "SM", # The areal mean of the free water capacity of surface soil layer - "EX", # The exponent of the free water capacity curve - "KI", # Outflow coefficients of interflow - "KG", # Outflow coefficients of groundwater - "CS", # The recession constant of channel system - "L", # Lag time - "CI", # The recession constant of the lower interflow - "CG", # The recession constant of groundwater storage - ], - "param_range": OrderedDict( - { - "K": [0.1, 0.1], - "B": [0.1, 0.1], - "IM": [0.1, 0.1], - "UM": [10, 10.0], - "LM": [70.0, 70.0], - "DM": [80.0, 80.0], - "C": [0.1, 0.1], - "SM": [50, 50], - "EX": [1.2, 1.2], - "KI": [0.3, 0.3], - "KG": [0.3, 0.3], - "CS": [0.5, 0.5], - "L": [5.0, 5.0], # unit is day - "CI": [0.5, 0.5], - "CG": [0.98, 0.98], - } - ), - }, - "xaj_mz": { - "param_name": [ - # Allen, R.G., L. Pereira, D. Raes, and M. Smith, 1998. - # Crop Evapotranspiration, Food and Agriculture Organization of the United Nations, - # Rome, Italy. FAO publication 56. ISBN 92-5-104219-5. 290p. - "K", # ratio of potential evapotranspiration to reference crop evaporation generally from Allen, 1998 - "B", # The exponent of the tension water capacity curve - "IM", # The ratio of the impervious to the total area of the basin - "UM", # Tension water capacity in the upper layer - "LM", # Tension water capacity in the lower layer - "DM", # Tension water capacity in the deepest layer - "C", # The coefficient of deep evapotranspiration - "SM", # The areal mean of the free water capacity of surface soil layer - "EX", # The exponent of the free water capacity curve - "KI", # Outflow coefficients of interflow - "KG", # Outflow coefficients of groundwater - "A", # parameter of mizuRoute - "THETA", # parameter of mizuRoute - "CI", # The recession constant of the lower interflow - "CG", # The recession constant of groundwater storage - "KERNEL", # kernel size of mizuRoute unit hydrograph when using convolution method - ], - "param_range": OrderedDict( - { - "K": [0.1, 1.0], - "B": [0.1, 0.4], - "IM": [0.01, 0.1], - "UM": [0.0, 20.0], - "LM": [60.0, 90.0], - "DM": [60.0, 120.0], - "C": [0.0, 0.2], - "SM": [1.0, 100.0], - "EX": [1.0, 1.5], - "KI": [0.0, 0.7], - "KG": [0.0, 0.7], - "A": [0.0, 2.9], - "THETA": [0.0, 6.5], - "CI": [0.0, 0.9], - "CG": [0.98, 0.998], - "KERNEL": [1, 15], - } - ), - }, - "gr4j": { - "param_name": ["x1", "x2", "x3", "x4"], - "param_range": OrderedDict( - { - "x1": [100.0, 1200.0], - "x2": [-5.0, 3.0], - "x3": [20.0, 300.0], - "x4": [1.1, 2.9], - } - ), - }, - "hymod": { - "param_name": ["cmax", "bexp", "alpha", "ks", "kq"], - "param_range": OrderedDict( - { - "cmax": [1.0, 500.0], - "bexp": [0.1, 2.0], - "alpha": [0.1, 0.99], - "ks": [0.001, 0.10], - "kq": [0.1, 0.99], - } - ), - }, -} diff --git a/xaj/xajmodel.py b/xaj/xajmodel.py deleted file mode 100644 index 2027955..0000000 --- a/xaj/xajmodel.py +++ /dev/null @@ -1,1060 +0,0 @@ -""" -Core code for XinAnJiang model -""" -import logging -from typing import Union -import numpy as np -from numba import jit -from scipy.special import gamma - -from xaj.params import MODEL_PARAM_DICT - -PRECISION = 1e-5 - - -@jit -def calculate_evap(lm, c, wu0, wl0, prcp, pet) -> tuple[np.array, np.array, np.array]: - """ - Three-layers evaporation model from "Watershed Hydrologic Simulation" written by Prof. RenJun Zhao. - The book is Chinese, and its name is 《流域水文模拟》; - The three-layers evaporation model is described in Page 76; - The method is same with that in Page 22-23 in "Hydrologic Forecasting (5-th version)" written by Prof. Weimin Bao. - This book's Chinese name is 《水文预报》 - - Parameters - ---------- - lm - average soil moisture storage capacity of lower layer - c - coefficient of deep layer - wu0 - initial soil moisture of upper layer; update in each time step - wl0 - initial soil moisture of lower layer; update in each time step - prcp - basin mean precipitation - pet - potential evapotranspiration - - Returns - ------- - tuple[np.array,np.array,np.array] - eu/el/ed are evaporation from upper/lower/deeper layer, respectively - """ - eu = np.where(wu0 + prcp >= pet, pet, wu0 + prcp) - ed = np.where((wl0 < c * lm) & (wl0 < c * (pet - eu)), c * (pet - eu) - wl0, 0.0) - el = np.where( - wu0 + prcp >= pet, - 0.0, - np.where( - wl0 >= c * lm, - (pet - eu) * wl0 / lm, - np.where(wl0 >= c * (pet - eu), c * (pet - eu), wl0), - ), - ) - return eu, el, ed - - -@jit -def calculate_prcp_runoff(b, im, wm, w0, pe) -> tuple[np.array, np.array]: - """ - Calculates the amount of runoff generated from rainfall after entering the underlying surface. - - Same in "Watershed Hydrologic Simulation" and "Hydrologic Forecasting (5-th version)" - - Parameters - ---------- - b - B; exponent coefficient - im - IMP; imperiousness coefficient - wm - average soil moisture storage capacity - w0 - initial soil moisture - pe - net precipitation - - Returns - ------- - tuple[np.array,np.array] - r -- runoff; r_im -- runoff of impervious part - """ - wmm = wm * (1.0 + b) - a = wmm * (1.0 - (1.0 - w0 / wm) ** (1.0 / (1.0 + b))) - if np.isnan(a).any(): - raise ArithmeticError("Please check if w0>wm or b is a negative value!") - r_cal = np.where( - pe > 0.0, - np.where( - pe + a < wmm, - # 1e-5 is a precision which we set to guarantee float's calculation is correct - pe - (wm - w0) + wm * (1.0 - np.minimum(a + pe, wmm) / wmm) ** (1.0 + b), - pe - (wm - w0), - ), - np.full(pe.shape, 0.0), - ) - r = np.maximum(r_cal, 0.0) - # separate impervious part with the other - r_im_cal = pe * im - r_im = np.maximum(r_im_cal, 0.0) - return r, r_im - - -def calculate_w_storage( - um, lm, dm, wu0, wl0, wd0, eu, el, ed, pe, r -) -> tuple[np.array, np.array, np.array]: - """ - Update the soil moisture values of the three layers. - - According to the equation 2.60 in the book《水文预报》 - - Parameters - ---------- - um - average soil moisture storage capacity of the upper layer - lm - average soil moisture storage capacity of the lower layer - dm - average soil moisture storage capacity of the deep layer - wu0 - initial values of soil moisture in upper layer - wl0 - initial values of soil moisture in lower layer - wd0 - initial values of soil moisture in deep layer - eu - evaporation of the upper layer; it isn't used in this function - el - evaporation of the lower layer - ed - evaporation of the deep layer - pe - net precipitation; it is able to be negative value in this function - r - runoff - - Returns - ------- - tuple[np.array,np.array,np.array] - wu,wl,wd -- soil moisture in upper, lower and deep layer - """ - # pe>0: the upper soil moisture was added firstly, then lower layer, and the final is deep layer - # pe<=0: no additional water, just remove evapotranspiration, - # but note the case: e >= p > 0 - # (1) if wu0 + p > e, then e = eu (2) else, wu must be zero - wu = np.where( - pe > 0.0, - np.where(wu0 + pe - r < um, wu0 + pe - r, um), - np.where(wu0 + pe > 0.0, wu0 + pe, 0.0), - ) - # calculate wd before wl because it is easier to cal using where statement - wd = np.where( - pe > 0.0, - np.where(wu0 + wl0 + pe - r > um + lm, wu0 + wl0 + wd0 + pe - r - um - lm, wd0), - wd0 - ed, - ) - # water balance (equation 2.2 in Page 13, also shown in Page 23) - # if wu0 + p > e, then e = eu; else p must be used in upper layer, - # so no matter what the case is, el didn't include p, neither ed - wl = np.where(pe > 0.0, wu0 + wl0 + wd0 + pe - r - wu - wd, wl0 - el) - # the water storage should be in reasonable range - wu_ = np.clip(wu, a_min=0.0, a_max=um) - wl_ = np.clip(wl, a_min=0.0, a_max=lm) - wd_ = np.clip(wd, a_min=0.0, a_max=dm) - return wu_, wl_, wd_ - - -def generation(p_and_e, k, b, im, um, lm, dm, c, wu0=None, wl0=None, wd0=None) -> tuple: - """ - Single-step runoff generation in XAJ. - - Parameters - ---------- - p_and_e - precipitation and potential evapotranspiration - k - ratio of potential evapotranspiration to reference crop evaporation - b - exponent parameter - um - average soil moisture storage capacity of the upper layer - lm - average soil moisture storage capacity of the lower layer - dm - average soil moisture storage capacity of the deep layer - im - impermeability coefficient - c - coefficient of deep layer - wu0 - initial values of soil moisture in upper layer - wl0 - initial values of soil moisture in lower layer - wd0 - initial values of soil moisture in deep layer - - Returns - ------- - tuple[tuple, tuple] - (r, rim, e, pe), (wu, wl, wd); all variables are np.array - """ - # make sure physical variables' value ranges are correct - prcp = np.maximum(p_and_e[:, 0], 0.0) - # get potential evapotranspiration - pet = np.maximum(p_and_e[:, 1] * k, 0.0) - # wm - wm = um + lm + dm - if wu0 is None: - # just an initial value - wu0 = 0.6 * um - if wl0 is None: - wl0 = 0.6 * lm - if wd0 is None: - wd0 = 0.6 * dm - w0_ = wu0 + wl0 + wd0 - - # w0 need locate in correct range so that following calculation could be right - # To make sure float data's calculation is correct, we'd better minus a precision (1e-5) - w0 = np.minimum(w0_, wm - 1e-5) - - # Calculate the amount of evaporation from storage - eu, el, ed = calculate_evap(lm, c, wu0, wl0, prcp, pet) - e = eu + el + ed - - # Calculate the runoff generated by net precipitation - prcp_difference = prcp - e - pe = np.maximum(prcp_difference, 0.0) - r, rim = calculate_prcp_runoff(b, im, wm, w0, pe) - # Update wu, wl, wd - wu, wl, wd = calculate_w_storage( - um, lm, dm, wu0, wl0, wd0, eu, el, ed, prcp_difference, r - ) - - return (r, rim, e, pe), (wu, wl, wd) - - -def sources(pe, r, sm, ex, ki, kg, s0=None, fr0=None, book="HF") -> tuple: - """ - Divide the runoff to different sources - - We use the initial version from the paper of the inventor of the XAJ model -- Prof. Renjun Zhao: - "Analysis of parameters of the XinAnJiang model". Its Chinese name is <<新安江模型参数的分析>>, - which could be found by searching in "Baidu Xueshu". - The module's code can also be found in "Watershed Hydrologic Simulation" (WHS) Page 174. - It is nearly same with that in "Hydrologic Forecasting" (HF) Page 148-149 - We use the period average runoff as input and the unit period is day so we don't need to difference it as books show - - We also provide code for formula from《水文预报》"Hydrologic Forecasting" (HF) the fifth version. Page 40-41 and 150-151; - the procedures in 《工程水文学》"Engineering Hydrology" (EH) the third version are different we also provide. - they are in the "sources5mm" function. - - Parameters - ------------ - pe - net precipitation - r - runoff from xaj_generation - sm - areal mean free water capacity of the surface layer - ex - exponent of the free water capacity curve - ki - outflow coefficients of the free water storage to interflow relationships - kg - outflow coefficients of the free water storage to groundwater relationships - s0 - free water capacity of last period - fr0 - runoff area of last period - - Return - ------------ - tuple[tuple, tuple] - rs -- surface runoff; ri-- interflow runoff; rg -- groundwater runoff; - s1 -- final free water capacity; - all variables are numpy array - - """ - # maximum free water storage capacity in a basin - ms = sm * (1.0 + ex) - if fr0 is None: - fr0 = 0.1 - if s0 is None: - s0 = 0.5 * sm - # For free water storage, because s is related to fr and s0 and fr0 are both values of last period, - # we have to trans the initial value of s from last period to this one. - # both WHS(流域水文模拟)'s sample code and HF(水文预报) use s = fr0 * s0 / fr. - # I think they both think free water reservoir as a cubic tank. Its height is s and area of bottom rectangle is fr - # we will have a cubic tank with varying bottom and height, - # and fixed boundary (in HF sm is fixed) or none-fixed boundary (in EH smmf is not fixed) - # but notice r's list like" [1,0] which 1 is the 1st period's runoff and 0 is the 2nd period's runoff - # after 1st period, the s1 could not be zero, but in the 2nd period, fr=0, then we cannot set s=0, because some water still in the tank - # fr's formula could be found in Eq. 9 in "Analysis of parameters of the XinAnJiang model", - # Here our r doesn't include rim, so there is no need to remove rim from r; this is also the method in 《水文预报》(HF) - - # NOTE: when r is 0, fr should be 0, however, s1 may not be zero and it still hold some water, - # then fr can not be 0, otherwise when fr is used as denominator it lead to error, - # so we have to deal with this case later, for example, when r=0, we cannot use pe * fr to replace r - # because fr get the value of last period, and it is not 0 - fr = np.copy(fr0) - if any(fr == 0.0): - raise ArithmeticError( - "Please check fr's value, fr==0.0 will cause error in the next step!" - ) - # r=0, then r/pe must be 0 - fr_mask = r > 0.0 - fr[fr_mask] = r[fr_mask] / pe[fr_mask] - if np.isnan(fr).any(): - raise ArithmeticError("Please check pe's data! there may be 0.0") - - # if fr=0, then we cannot get ss, but ss should not be 0, because s1 of last period may not be 0 and it still hold some water - ss = np.copy(s0) - # same initialization for s - s = np.copy(s0) - - ss[fr_mask] = fr0[fr_mask] * s0[fr_mask] / fr[fr_mask] - - if book == "HF": - ss = np.minimum(ss, sm) - au = ms * (1.0 - (1.0 - ss / sm) ** (1.0 / (1.0 + ex))) - if np.isnan(au).any(): - raise ValueError( - "Error: NaN values detected. Try set clip function or check your data!!!" - ) - # the first condition should be r > 0.0, when r=0, rs must be 0, fig 6-12 in EH or fig 5-4 in HF - # so we have to use "pe" carefully!!! when r>0.0, we use pe, otherwise we don't use it!!! - rs = np.full(r.shape, 0.0) - rs[fr_mask] = np.where( - pe[fr_mask] + au[fr_mask] < ms[fr_mask], - # equation 2-85 in HF - fr[fr_mask] - * ( - pe[fr_mask] - - sm[fr_mask] - + ss[fr_mask] - + sm[fr_mask] - * ( - ( - 1 - - np.minimum(pe[fr_mask] + au[fr_mask], ms[fr_mask]) - / ms[fr_mask] - ) - ** (1 + ex[fr_mask]) - ) - ), - # equation 2-86 in HF - fr[fr_mask] * (pe[fr_mask] + ss[fr_mask] - sm[fr_mask]), - ) - rs = np.minimum(rs, r) - - # ri's mask is not same as rs's, because last period's s may not be 0 - # and in this time, ri and rg could be larger than 0 - # we need firstly calculate the updated s, s's mask is same as fr_mask, - # when r==0, then s will be equal to last period's - # equation 2-87 in HF, some free water leave or save, so we update free water storage - s[fr_mask] = ss[fr_mask] + (r[fr_mask] - rs[fr_mask]) / fr[fr_mask] - s = np.minimum(s, sm) - if np.isnan(s).any(): - raise ArithmeticError("Please check fr's data! there may be 0.0") - - elif book == "EH": - # smmf should be with correpond with s - smmf = ms * (1 - (1 - fr) ** (1 / ex)) - smf = smmf / (1 + ex) - ss = np.minimum(ss, smf) - au = smmf * (1 - (1 - ss / smf) ** (1 / (1 + ex))) - if np.isnan(au).any(): - raise ValueError( - "Error: NaN values detected. Try set clip function or check your data!!!" - ) - - # rs's mask is keep with fr_mask - rs = np.full(r.shape, 0.0) - rs[fr_mask] = np.where( - pe[fr_mask] + au[fr_mask] < smmf[fr_mask], - ( - pe[fr_mask] - - smf[fr_mask] - + ss[fr_mask] - + smf[fr_mask] - * ( - 1 - - np.minimum(pe[fr_mask] + au[fr_mask], smmf[fr_mask]) - / smmf[fr_mask] - ) - ** (ex[fr_mask] + 1) - ) - * fr[fr_mask], - (pe[fr_mask] + ss[fr_mask] - smf[fr_mask]) * fr[fr_mask], - ) - rs = np.minimum(rs, r) - s[fr_mask] = ss[fr_mask] + (r[fr_mask] - rs[fr_mask]) / fr[fr_mask] - s = np.minimum(s, smf) - else: - raise ValueError("Please set book as 'HF' or 'EH'!") - # the following part is same for both HF and EH. Even the formula is different, but their meaning is same - # equation 2-88 in HF, next interflow and ground water will be released from the updated free water storage - # We use the period average runoff as input and the general unit period is day. - # Hence, we directly use ki and kg rather than ki_{Δt} in books. - ri = ki * s * fr - rg = kg * s * fr - # ri = np.where(s < PRECISION, np.full(r.shape, 0.0), ki * s * fr) - # rg = np.where(s < PRECISION, np.full(r.shape, 0.0), kg * s * fr) - # equation 2-89 in HF; although it looks different with that in WHS, they are actually same - # Finally, calculate the final free water storage - s1 = s * (1 - ki - kg) - # s1 = np.where(s1 < PRECISION, np.full(s1.shape, 0.0), s1) - return (rs, ri, rg), (s1, fr) - - -def sources5mm( - pe, - runoff, - sm, - ex, - ki, - kg, - s0=None, - fr0=None, - time_interval_hours=24, - book="HF", -): - """ - Divide the runoff to different sources according to books -- 《水文预报》HF 5th edition and 《工程水文学》EH 3rd edition - - Parameters - ---------- - pe - net precipitation - runoff - runoff from xaj_generation - sm - areal mean free water capacity of the surface layer - ex - exponent of the free water capacity curve - ki - outflow coefficients of the free water storage to interflow relationships - kg - outflow coefficients of the free water storage to groundwater relationships - s0 - initial free water capacity - fr0 - initial area of generation - time_interval_hours - 由于Ki、Kg、Ci、Cg都是以24小时为时段长定义的,需根据时段长转换 - book - the methods in 《水文预报》HF 5th edition and 《工程水文学》EH 3rd edition are different, - hence, both are provided, and the default is the former -- "ShuiWenYuBao"; - the other one is "GongChengShuiWenXue" - - Returns - ------- - tuple[tuple, tuple] - rs_s -- surface runoff; rss_s-- interflow runoff; rg_s -- groundwater runoff; - (fr_ds[-1], s_ds[-1]): state variables' final value; - all variables are numpy array - """ - # 由于Ki、Kg都是以24小时为时段长定义的,需根据时段长转换 - hours_per_day = 24 - # 非整除情况,时段+1 - residue_temp = hours_per_day % time_interval_hours - if residue_temp != 0: - residue_temp = 1 - period_num_1d = int(hours_per_day / time_interval_hours) + residue_temp - # 当kss+kg>1时,根式为偶数运算时,kss_period会成为复数,这里会报错;另外注意分母可能为0,kss不可取0 - # 对kss+kg的取值进行限制 - kss_period = (1 - (1 - (ki + kg)) ** (1 / period_num_1d)) / (1 + kg / ki) - kg_period = kss_period * kg / ki - - # 流域最大点自由水蓄水容量深 - smm = sm * (1 + ex) - if s0 is None: - s0 = 0.50 * sm - if fr0 is None: - fr0 = 0.1 - # don't use np.where here, because it will cause some warning - fr = np.copy(fr0) - fr_mask = runoff > 0.0 - fr[fr_mask] = runoff[fr_mask] / pe[fr_mask] - if np.all(runoff < 5): - n = 1 - else: - # when modeling multiple basins, the number of divides is not the same, so we use the maximum number - r_max = np.max(runoff) - residue_temp = r_max % 5 - if residue_temp != 0: - residue_temp = 1 - n = int(r_max / 5) + residue_temp - rn = runoff / n - pen = pe / n - kss_d = (1 - (1 - (kss_period + kg_period)) ** (1 / n)) / ( - 1 + kg_period / kss_period - ) - kg_d = kss_d * kg_period / kss_period - # kss_d = kss_period - # kg_d = kg_period - rs = np.full(runoff.shape, 0.0) - rss = np.full(runoff.shape, 0.0) - rg = np.full(runoff.shape, 0.0) - - s_ds = [] - fr_ds = [] - s_ds.append(s0) - fr_ds.append(fr0) - - for j in range(n): - fr0_d = fr_ds[j] - s0_d = s_ds[j] - # equation 5-32 in HF, but strange, cause each period, rn/pen is same, fr_d should be same - # fr_d = 1 - (1 - fr) ** (1 / n) - fr_d = fr - - ss_d = np.copy(s0_d) - s_d = np.copy(s0_d) - s1_d = np.copy(s0_d) - - ss_d[fr_mask] = fr0_d[fr_mask] * s0_d[fr_mask] / fr_d[fr_mask] - - if book == "HF": - ss_d = np.minimum(ss_d, sm) - # ms = smm - au = smm * (1.0 - (1.0 - ss_d / sm) ** (1.0 / (1.0 + ex))) - if np.isnan(au).any(): - raise ValueError( - "Error: NaN values detected. Try set clip function or check your data!!!" - ) - rs_j = np.full(rn.shape, 0.0) - rs_j[fr_mask] = np.where( - pen[fr_mask] + au[fr_mask] < smm[fr_mask], - # equation 5-26 in HF - fr_d[fr_mask] - * ( - pen[fr_mask] - - sm[fr_mask] - + ss_d[fr_mask] - + sm[fr_mask] - * ( - ( - 1 - - np.minimum(pen[fr_mask] + au[fr_mask], smm[fr_mask]) - / smm[fr_mask] - ) - ** (1 + ex[fr_mask]) - ) - ), - # equation 5-27 in HF - fr_d[fr_mask] * (pen[fr_mask] + ss_d[fr_mask] - sm[fr_mask]), - ) - rs_j = np.minimum(rs_j, rn) - s_d[fr_mask] = ss_d[fr_mask] + (rn[fr_mask] - rs_j[fr_mask]) / fr_d[fr_mask] - s_d = np.minimum(s_d, sm) - - elif book == "EH": - smmf = smm * (1 - (1 - fr_d) ** (1 / ex)) - smf = smmf / (1 + ex) - ss_d = np.minimum(ss_d, smf) - au = smmf * (1 - (1 - ss_d / smf) ** (1 / (1 + ex))) - if np.isnan(au).any(): - raise ValueError( - "Error: NaN values detected. Try set clip function or check your data!!!" - ) - rs_j = np.full(rn.shape, 0.0) - rs_j[fr_mask] = np.where( - pen[fr_mask] + au[fr_mask] < smmf[fr_mask], - ( - pen[fr_mask] - - smf[fr_mask] - + ss_d[fr_mask] - + smf[fr_mask] - * ( - 1 - - np.minimum(pen[fr_mask] + au[fr_mask], smmf[fr_mask]) - / smmf[fr_mask] - ) - ** (ex[fr_mask] + 1) - ) - * fr_d[fr_mask], - (pen[fr_mask] + ss_d[fr_mask] - smf[fr_mask]) * fr_d[fr_mask], - ) - rs_j = np.minimum(rs_j, rn) - s_d[fr_mask] = ss_d[fr_mask] + (rn[fr_mask] - rs_j[fr_mask]) / fr_d[fr_mask] - s_d = np.minimum(s_d, smf) - - else: - raise NotImplementedError( - "We don't have this implementation! Please chose 'HF' or 'EH'!!" - ) - rss_j = s_d * kss_d * fr_d - rg_j = s_d * kg_d * fr_d - s1_d = s_d * (1 - kss_d - kg_d) - - rs = rs + rs_j - rss = rss + rss_j - rg = rg + rg_j - # 赋值s_d和fr_d到数组中,以给下一段做初值 - s_ds.append(s1_d) - fr_ds.append(fr_d) - - return (rs, rss, rg), (s_ds[-1], fr_ds[-1]) - - -@jit -def linear_reservoir(x, weight, last_y=None) -> np.array: - """ - Linear reservoir's release function - - Parameters - ---------- - x - the input to the linear reservoir - weight - the coefficient of linear reservoir - last_y - the output of last period - - Returns - ------- - np.array - one-step forward result - """ - weight1 = 1 - weight - if last_y is None: - last_y = np.full(weight.shape, 0.001) - y = weight * last_y + weight1 * x - return y - - -def uh_conv(x, uh_from_gamma): - """ - Function for 1d-convolution calculation - - Parameters - ---------- - x - x is a sequence-first variable; the dim of x is [seq, batch, feature=1]; - feature must be 1 - uh_from_gamma - unit hydrograph from uh_gamma; the dim: [len_uh, batch, feature=1]; - feature must be 1 - - Returns - ------- - np.array - convolution - """ - outputs = np.full(x.shape, 0.0) - time_length, batch_size, feature_size = x.shape - if feature_size > 1: - logging.error("We only support one-dim convolution now!!!") - for i in range(batch_size): - uh = uh_from_gamma[:, i, 0] - inputs = x[:, i, 0] - outputs[:, i, 0] = np.convolve(inputs, uh)[:time_length] - return outputs - - -def uh_gamma(a, theta, len_uh=15): - """ - A simple two-parameter Gamma distribution as a unit-hydrograph to route instantaneous runoff from a hydrologic model - The method comes from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ - - Parameters - ---------- - a - shape parameter - theta - timescale parameter - len_uh - the time length of the unit hydrograph - Returns - ------- - torch.Tensor - the unit hydrograph, dim: [seq, batch, feature] - """ - # dims of a: time_seq (same all time steps), batch, feature=1 - m = a.shape - if len_uh > m[0]: - raise RuntimeError( - "length of unit hydrograph should be smaller than the whole length of input" - ) - # aa > 0, here we set minimum 0.1 (min of a is 0, set when calling this func); First dimension of a is repeat - aa = np.maximum(0.0, a[0:len_uh, :, :]) + 0.1 - # theta > 0, here set minimum 0.5 - theta = np.maximum(0.0, theta[0:len_uh, :, :]) + 0.5 - # len_f, batch, feature - t = np.expand_dims( - np.swapaxes(np.tile(np.arange(0.5, len_uh * 1.0), (m[1], 1)), 0, 1), axis=-1 - ) - denominator = gamma(aa) * (theta**aa) - # [len_f, m[1], m[2]] - w = 1 / denominator * (t ** (aa - 1)) * (np.exp(-t / theta)) - w = w / w.sum(0) # scale to 1 for each UH - return w - - -def xaj_runoff( - p_and_e, - params_runoff: Union[np.array, list], - *w0, s0, fr0, - **kwargs, -) -> Union[tuple, np.array]: - model_name = kwargs["name"] if "name" in kwargs else "xaj" - source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" - source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" - # params - param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] - if model_name == "xaj": - route_method = "CSL" - elif model_name == "xaj_mz": - route_method = "MZ" - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CS' or 'MZ'!" - ) - xaj_params = [ - (value[1] - value[0]) * params_runoff[:, i] + value[0] - for i, (key, value) in enumerate(param_ranges.items()) - ] - k = xaj_params[0] - b = xaj_params[1] - im = xaj_params[2] - um = xaj_params[3] - lm = xaj_params[4] - dm = xaj_params[5] - c = xaj_params[6] - sm = xaj_params[7] - ex = xaj_params[8] - ki_ = xaj_params[9] - kg_ = xaj_params[10] - # ki+kg should be smaller than 1; if not, we scale them - ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) - kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) - - - # w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) - inputs = p_and_e[:, :, :] - runoff_ims_ = np.full(inputs.shape[:2], 0.0) - rss_ = np.full(inputs.shape[:2], 0.0) - ris_ = np.full(inputs.shape[:2], 0.0) - rgs_ = np.full(inputs.shape[:2], 0.0) - es_ = np.full(inputs.shape[:2], 0.0) - for i in range(inputs.shape[0]): - if i == 0: - (r, rim, e, pe), w = generation( - inputs[i, :, :], k, b, im, um, lm, dm, c, *w0 - ) - if source_type == "sources": - (rs, ri, rg), (s, fr) = sources( - pe, r, sm, ex, ki, kg, s0, fr0, book=source_book - ) - elif source_type == "sources5mm": - (rs, ri, rg), (s, fr) = sources5mm( - pe, r, sm, ex, ki, kg, s0, fr0, book=source_book - ) - else: - raise NotImplementedError("No such divide-sources method") - else: - (r, rim, e, pe), w = generation( - inputs[i, :, :], k, b, im, um, lm, dm, c, *w - ) - if source_type == "sources": - (rs, ri, rg), (s, fr) = sources( - pe, r, sm, ex, ki, kg, s, fr, book=source_book - ) - elif source_type == "sources5mm": - (rs, ri, rg), (s, fr) = sources5mm( - pe, r, sm, ex, ki, kg, s, fr, book=source_book - ) - else: - raise NotImplementedError("No such divide-sources method") - # impevious part is pe * im - runoff_ims_[i, :] = rim - # so for non-imprvious part, the result should be corrected - rss_[i, :] = rs * (1 - im) - ris_[i, :] = ri * (1 - im) - rgs_[i, :] = rg * (1 - im) - es_[i, :] = e - # seq, batch, feature - runoff_im = np.expand_dims(runoff_ims_, axis=2) - rss = np.expand_dims(rss_, axis=2) - es = np.expand_dims(es_, axis=2) - return runoff_im, rss_,ris_, rgs_, es,rss - -def xaj_route( - p_and_e, - params_route: Union[np.array, list], - ris_, - rgs_, - rss_, - rss, - runoff_im, - qi0, - qg0, - es, - **kwargs, -)-> Union[tuple, np.array]: - - model_name = kwargs["name"] if "name" in kwargs else "xaj" - source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" - source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" - # params - param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] - if model_name == "xaj": - route_method = "CSL" - elif model_name == "xaj_mz": - route_method = "MZ" - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CS' or 'MZ'!" - ) - xaj_params = [ - (value[1] - value[0]) * params_route[:, i] + value[0] - for i, (key, value) in enumerate(param_ranges.items()) - ] - k = xaj_params[0] - b = xaj_params[1] - im = xaj_params[2] - um = xaj_params[3] - lm = xaj_params[4] - dm = xaj_params[5] - c = xaj_params[6] - sm = xaj_params[7] - ex = xaj_params[8] - ki_ = xaj_params[9] - kg_ = xaj_params[10] - # ki+kg should be smaller than 1; if not, we scale them - ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) - kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) - if route_method == "CSL": - cs = xaj_params[11] - l = xaj_params[12] - - elif route_method == "MZ": - # we will use routing method from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ - a = xaj_params[11] - theta = xaj_params[12] - # make it as a parameter - kernel_size = int(xaj_params[15]) - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CS' or 'MZ'!" - ) - ci = xaj_params[13] - cg = xaj_params[14] - - inputs = p_and_e[:, :, :] - qs = np.full(inputs.shape[:2], 0.0) - if route_method == "CSL": - qt = np.full(inputs.shape[:2], 0.0) - for i in range(inputs.shape[0]): - if i == 0: - qi = linear_reservoir(ris_[i], ci, qi0) - qg = linear_reservoir(rgs_[i], cg, qg0) - else: - qi = linear_reservoir(ris_[i], ci, qi) - qg = linear_reservoir(rgs_[i], cg, qg) - qs_ = rss_[i] - qt[i, :] = qs_ + qi + qg - - for j in range(len(l)): - lag = int(l[j]) - for i in range(0,lag): - qs[i, j] = qt[i, j] - if i == lag: - break - for i in range(lag, inputs.shape[0]): - qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j] - - elif route_method == "MZ": - rout_a = a.repeat(rss.shape[0]).reshape(rss.shape) - rout_b = theta.repeat(rss.shape[0]).reshape(rss.shape) - conv_uh = uh_gamma(rout_a, rout_b, kernel_size) - qs_ = uh_conv(runoff_im + rss, conv_uh) - for i in range(inputs.shape[0]): - if i == 0: - qi = linear_reservoir(ris_[i], ci, qi0) - qg = linear_reservoir(rgs_[i], cg, qg0) - else: - qi = linear_reservoir(ris_[i], ci, qi) - qg = linear_reservoir(rgs_[i], cg, qg) - qs[i, :] = qs_[i, :, 0] + qi + qg - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CSL' or 'MZ'!" - ) - - # seq, batch, feature - q_sim = np.expand_dims(qs, axis=2) - return q_sim, es - -def xaj_state( - p_and_e, - params: Union[np.array, list], - return_state=True, - warmup_length=365, - **kwargs, -) -> Union[tuple, np.array]: - # default values for some function parameters - model_name = kwargs["name"] if "name" in kwargs else "xaj" - source_type = kwargs["source_type"] if "source_type" in kwargs else "sources" - source_book = kwargs["source_book"] if "source_book" in kwargs else "HF" - # params - param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] - if model_name == "xaj": - route_method = "CSL" - elif model_name == "xaj_mz": - route_method = "MZ" - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CS' or 'MZ'!" - ) - xaj_params = [ - (value[1] - value[0]) * params[:, i] + value[0] - for i, (key, value) in enumerate(param_ranges.items()) - ] - k = xaj_params[0] - b = xaj_params[1] - im = xaj_params[2] - um = xaj_params[3] - lm = xaj_params[4] - dm = xaj_params[5] - c = xaj_params[6] - sm = xaj_params[7] - ex = xaj_params[8] - ki_ = xaj_params[9] - kg_ = xaj_params[10] - # ki+kg should be smaller than 1; if not, we scale them - ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) - kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) - if route_method == "CSL": - cs = xaj_params[11] - l = xaj_params[12] - - elif route_method == "MZ": - # we will use routing method from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ - a = xaj_params[11] - theta = xaj_params[12] - # make it as a parameter - kernel_size = int(xaj_params[15]) - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CS' or 'MZ'!" - ) - ci = xaj_params[13] - cg = xaj_params[14] - - - # initialize state values - # if warmup_length > 0: - # p_and_e_warmup = p_and_e[0:warmup_length, :, :] - # _q, _e, *w0, s0, fr0, qi0, qg0 = xaj_state( - # p_and_e_warmup, - # params, - # return_state=True, - # warmup_length=0, - # **kwargs, - # ) - # else: - w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) - s0 = 0.5 * sm - fr0 = np.full(ex.shape, 0.1) - qi0 = np.full(ci.shape, 0.1) - qg0 = np.full(cg.shape, 0.1) - - #state_variables - # inputs = p_and_e[warmup_length:, :, :] - inputs = p_and_e[:, :, :] - runoff_ims_ = np.full(inputs.shape[:2], 0.0) - rss_ = np.full(inputs.shape[:2], 0.0) - ris_ = np.full(inputs.shape[:2], 0.0) - rgs_ = np.full(inputs.shape[:2], 0.0) - es_ = np.full(inputs.shape[:2], 0.0) - for i in range(inputs.shape[0]): - if i == 0: - (r, rim, e, pe), w = generation( - inputs[i, :, :], k, b, im, um, lm, dm, c, *w0 - ) - if source_type == "sources": - (rs, ri, rg), (s, fr) = sources( - pe, r, sm, ex, ki, kg, s0, fr0, book=source_book - ) - elif source_type == "sources5mm": - (rs, ri, rg), (s, fr) = sources5mm( - pe, r, sm, ex, ki, kg, s0, fr0, book=source_book - ) - else: - raise NotImplementedError("No such divide-sources method") - else: - (r, rim, e, pe), w = generation( - inputs[i, :, :], k, b, im, um, lm, dm, c, *w - ) - if source_type == "sources": - (rs, ri, rg), (s, fr) = sources( - pe, r, sm, ex, ki, kg, s, fr, book=source_book - ) - elif source_type == "sources5mm": - (rs, ri, rg), (s, fr) = sources5mm( - pe, r, sm, ex, ki, kg, s, fr, book=source_book - ) - else: - raise NotImplementedError("No such divide-sources method") - # impevious part is pe * im - runoff_ims_[i, :] = rim - # so for non-imprvious part, the result should be corrected - rss_[i, :] = rs * (1 - im) - ris_[i, :] = ri * (1 - im) - rgs_[i, :] = rg * (1 - im) - es_[i, :] = e - # seq, batch, feature - runoff_im = np.expand_dims(runoff_ims_, axis=2) - rss = np.expand_dims(rss_, axis=2) - es = np.expand_dims(es_, axis=2) - - qs = np.full(inputs.shape[:2], 0.0) - - if route_method == "CSL": - qt = np.full(inputs.shape[:2], 0.0) - for i in range(inputs.shape[0]): - if i == 0: - qi = linear_reservoir(ris_[i], ci, qi0) - qg = linear_reservoir(rgs_[i], cg, qg0) - else: - qi = linear_reservoir(ris_[i], ci, qi) - qg = linear_reservoir(rgs_[i], cg, qg) - qs_ = rss_[i] - qt[i, :] = qs_ + qi + qg - - for j in range(len(l)): - # print(range(len(l))) - lag = int(l[j]) - for i in range(0,lag): - qs[i, j] = qt[i, j] - if i == lag: - break - for i in range(lag, inputs.shape[0]): - # print(inputs.shape[0]) - qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j] - - elif route_method == "MZ": - rout_a = a.repeat(rss.shape[0]).reshape(rss.shape) - rout_b = theta.repeat(rss.shape[0]).reshape(rss.shape) - conv_uh = uh_gamma(rout_a, rout_b, kernel_size) - qs_ = uh_conv(runoff_im + rss, conv_uh) - for i in range(inputs.shape[0]): - if i == 0: - qi = linear_reservoir(ris_[i], ci, qi0) - qg = linear_reservoir(rgs_[i], cg, qg0) - else: - qi = linear_reservoir(ris_[i], ci, qi) - qg = linear_reservoir(rgs_[i], cg, qg) - qs[i, :] = qs_[i, :, 0] + qi + qg - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CSL' or 'MZ'!" - ) - - # seq, batch, feature - q_sim = np.expand_dims(qs, axis=2) - if return_state: - return q_sim, es, *w, s, fr, qi, qg From c222649b076e92dcde2492bf9a0b15aaf1620f49 Mon Sep 17 00:00:00 2001 From: ouyangwenyu Date: Sat, 28 Oct 2023 16:21:53 +0800 Subject: [PATCH 15/19] refactor xajbim-related funcs, but not fully tested yet --- hydromodel/models/xaj.py | 213 ++++++++++++++++++++++++++++++++-- hydromodel/models/xaj_bmi.py | 3 +- test/test_rr_event_iden.py | 96 +++++++++++++++ test/test_session_division.py | 44 ------- test/test_xaj_bmi.py | 203 +++++++++++++++++--------------- 5 files changed, 413 insertions(+), 146 deletions(-) create mode 100644 test/test_rr_event_iden.py delete mode 100644 test/test_session_division.py diff --git a/hydromodel/models/xaj.py b/hydromodel/models/xaj.py index 8aaf9ba..b780d9b 100644 --- a/hydromodel/models/xaj.py +++ b/hydromodel/models/xaj.py @@ -8,7 +8,6 @@ from scipy.special import gamma from hydromodel.models.model_config import MODEL_PARAM_DICT -from xaj.params import MODEL_PARAM_DICT PRECISION = 1e-5 @@ -888,6 +887,203 @@ def xaj( return q_sim, es +def xaj_runoff( + p_and_e, + params_runoff: Union[np.array, list], + *w0, + s0, + fr0, + **kwargs, +) -> Union[tuple, np.array]: + model_name = kwargs.get("name", "xaj") + source_type = kwargs.get("source_type", "sources") + source_book = kwargs.get("source_book", "HF") + # params + param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] + if model_name == "xaj": + route_method = "CSL" + elif model_name == "xaj_mz": + route_method = "MZ" + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + xaj_params = [ + (value[1] - value[0]) * params_runoff[:, i] + value[0] + for i, (key, value) in enumerate(param_ranges.items()) + ] + k = xaj_params[0] + b = xaj_params[1] + im = xaj_params[2] + um = xaj_params[3] + lm = xaj_params[4] + dm = xaj_params[5] + c = xaj_params[6] + sm = xaj_params[7] + ex = xaj_params[8] + ki_ = xaj_params[9] + kg_ = xaj_params[10] + # ki+kg should be smaller than 1; if not, we scale them + ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) + kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) + + # w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) + inputs = p_and_e[:, :, :] + runoff_ims_ = np.full(inputs.shape[:2], 0.0) + rss_ = np.full(inputs.shape[:2], 0.0) + ris_ = np.full(inputs.shape[:2], 0.0) + rgs_ = np.full(inputs.shape[:2], 0.0) + es_ = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w0 + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s0, fr0, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + else: + (r, rim, e, pe), w = generation( + inputs[i, :, :], k, b, im, um, lm, dm, c, *w + ) + if source_type == "sources": + (rs, ri, rg), (s, fr) = sources( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + elif source_type == "sources5mm": + (rs, ri, rg), (s, fr) = sources5mm( + pe, r, sm, ex, ki, kg, s, fr, book=source_book + ) + else: + raise NotImplementedError("No such divide-sources method") + # impevious part is pe * im + runoff_ims_[i, :] = rim + # so for non-imprvious part, the result should be corrected + rss_[i, :] = rs * (1 - im) + ris_[i, :] = ri * (1 - im) + rgs_[i, :] = rg * (1 - im) + es_[i, :] = e + # seq, batch, feature + runoff_im = np.expand_dims(runoff_ims_, axis=2) + rss = np.expand_dims(rss_, axis=2) + es = np.expand_dims(es_, axis=2) + return runoff_im, rss_, ris_, rgs_, es, rss + + +def xaj_route( + p_and_e, + params_route: Union[np.array, list], + ris_, + rgs_, + rss_, + rss, + runoff_im, + qi0, + qg0, + es, + **kwargs, +) -> Union[tuple, np.array]: + model_name = kwargs.get("name", "xaj") + source_type = kwargs.get("source_type", "sources") + source_book = kwargs.get("source_book", "HF") + # params + param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] + if model_name == "xaj": + route_method = "CSL" + elif model_name == "xaj_mz": + route_method = "MZ" + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + xaj_params = [ + (value[1] - value[0]) * params_route[:, i] + value[0] + for i, (key, value) in enumerate(param_ranges.items()) + ] + k = xaj_params[0] + b = xaj_params[1] + im = xaj_params[2] + um = xaj_params[3] + lm = xaj_params[4] + dm = xaj_params[5] + c = xaj_params[6] + sm = xaj_params[7] + ex = xaj_params[8] + ki_ = xaj_params[9] + kg_ = xaj_params[10] + # ki+kg should be smaller than 1; if not, we scale them + ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) + kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) + if route_method == "CSL": + cs = xaj_params[11] + l = xaj_params[12] + + elif route_method == "MZ": + # we will use routing method from mizuRoute -- http://www.geosci-model-dev.net/9/2223/2016/ + a = xaj_params[11] + theta = xaj_params[12] + # make it as a parameter + kernel_size = int(xaj_params[15]) + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CS' or 'MZ'!" + ) + ci = xaj_params[13] + cg = xaj_params[14] + + inputs = p_and_e[:, :, :] + qs = np.full(inputs.shape[:2], 0.0) + if route_method == "CSL": + qt = np.full(inputs.shape[:2], 0.0) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs_ = rss_[i] + qt[i, :] = qs_ + qi + qg + + for j in range(len(l)): + lag = int(l[j]) + for i in range(lag): + qs[i, j] = qt[i, j] + if i == lag: + break + for i in range(lag, inputs.shape[0]): + qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j] + + elif route_method == "MZ": + rout_a = a.repeat(rss.shape[0]).reshape(rss.shape) + rout_b = theta.repeat(rss.shape[0]).reshape(rss.shape) + conv_uh = uh_gamma(rout_a, rout_b, kernel_size) + qs_ = uh_conv(runoff_im + rss, conv_uh) + for i in range(inputs.shape[0]): + if i == 0: + qi = linear_reservoir(ris_[i], ci, qi0) + qg = linear_reservoir(rgs_[i], cg, qg0) + else: + qi = linear_reservoir(ris_[i], ci, qi) + qg = linear_reservoir(rgs_[i], cg, qg) + qs[i, :] = qs_[i, :, 0] + qi + qg + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CSL' or 'MZ'!" + ) + + # seq, batch, feature + q_sim = np.expand_dims(qs, axis=2) + return q_sim, es + + def xaj_state( p_and_e, params: Union[np.array, list], @@ -944,7 +1140,6 @@ def xaj_state( ci = xaj_params[13] cg = xaj_params[14] - # initialize state values # if warmup_length > 0: # p_and_e_warmup = p_and_e[0:warmup_length, :, :] @@ -962,8 +1157,8 @@ def xaj_state( qi0 = np.full(ci.shape, 0.1) qg0 = np.full(cg.shape, 0.1) - #state_variables - # inputs = p_and_e[warmup_length:, :, :] + # state_variables + # inputs = p_and_e[warmup_length:, :, :] inputs = p_and_e[:, :, :] runoff_ims_ = np.full(inputs.shape[:2], 0.0) rss_ = np.full(inputs.shape[:2], 0.0) @@ -1028,7 +1223,7 @@ def xaj_state( for j in range(len(l)): # print(range(len(l))) lag = int(l[j]) - for i in range(0,lag): + for i in range(lag): qs[i, j] = qt[i, j] if i == lag: break @@ -1049,10 +1244,10 @@ def xaj_state( qi = linear_reservoir(ris_[i], ci, qi) qg = linear_reservoir(rgs_[i], cg, qg) qs[i, :] = qs_[i, :, 0] + qi + qg - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CSL' or 'MZ'!" - ) + else: + raise NotImplementedError( + "We don't provide this route method now! Please use 'CSL' or 'MZ'!" + ) # seq, batch, feature q_sim = np.expand_dims(qs, axis=2) diff --git a/hydromodel/models/xaj_bmi.py b/hydromodel/models/xaj_bmi.py index 94f1d02..435ab67 100644 --- a/hydromodel/models/xaj_bmi.py +++ b/hydromodel/models/xaj_bmi.py @@ -3,10 +3,11 @@ import numpy as np from hydromodel.models import configuration -from hydromodel.models.xajmodel import xaj_route, xaj_runoff import datetime import logging +from hydromodel.models.xaj import xaj_route, xaj_runoff + logger = logging.getLogger(__name__) PRECISION = 1e-5 diff --git a/test/test_rr_event_iden.py b/test/test_rr_event_iden.py new file mode 100644 index 0000000..0034e38 --- /dev/null +++ b/test/test_rr_event_iden.py @@ -0,0 +1,96 @@ +""" +Author: Wenyu Ouyang +Date: 2023-10-28 09:23:22 +LastEditTime: 2023-10-28 16:19:22 +LastEditors: Wenyu Ouyang +Description: Test for rainfall-runoff event identification +FilePath: \hydro-model-xaj\test\test_rr_event_iden.py +Copyright (c) 2023-2024 Wenyu Ouyang. All rights reserved. +""" +import os +import pandas as pd +import definitions +from hydromodel.utils.dmca_esr import ( + step1_step2_tr_and_fluctuations_timeseries, + step3_core_identification, + step4_end_rain_events, + step5_beginning_rain_events, + step6_checks_on_rain_events, + step7_end_flow_events, + step8_beginning_flow_events, + step9_checks_on_flow_events, + step10_checks_on_overlapping_events, +) + + +def test_rainfall_runoff_event_identify(): + rain = pd.read_csv( + os.path.join(definitions.ROOT_DIR, "hydromodel/example/division_rain.csv") + )["rain"] + flow = pd.read_csv( + os.path.join(definitions.ROOT_DIR, "hydromodel/example/division_flow.csv") + )["flow"] + time = rain.index.to_numpy() + rain = rain.to_numpy() / 24 + flow = flow.to_numpy() / 24 + rain_min = 0.02 + max_window = 100 + ( + Tr, + fluct_rain_Tr, + fluct_flow_Tr, + fluct_bivariate_Tr, + ) = step1_step2_tr_and_fluctuations_timeseries(rain, flow, rain_min, max_window) + beginning_core, end_core = step3_core_identification(fluct_bivariate_Tr) + end_rain = step4_end_rain_events( + beginning_core, end_core, rain, fluct_rain_Tr, rain_min + ) + beginning_rain = step5_beginning_rain_events( + beginning_core, end_rain, rain, fluct_rain_Tr, rain_min + ) + ( + beginning_rain_checked, + end_rain_checked, + beginning_core, + end_core, + ) = step6_checks_on_rain_events( + beginning_rain, end_rain, rain, rain_min, beginning_core, end_core + ) + end_flow = step7_end_flow_events( + end_rain_checked, + beginning_core, + end_core, + rain, + fluct_rain_Tr, + fluct_flow_Tr, + Tr, + ) + beginning_flow = step8_beginning_flow_events( + beginning_rain_checked, + end_rain_checked, + rain, + beginning_core, + fluct_rain_Tr, + fluct_flow_Tr, + ) + beginning_flow_checked, end_flow_checked = step9_checks_on_flow_events( + beginning_rain_checked, + end_rain_checked, + beginning_flow, + end_flow, + fluct_flow_Tr, + ) + ( + BEGINNING_RAIN, + END_RAIN, + BEGINNING_FLOW, + END_FLOW, + ) = step10_checks_on_overlapping_events( + beginning_rain_checked, + end_rain_checked, + beginning_flow_checked, + end_flow_checked, + time, + ) + print(BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW) + print(len(BEGINNING_RAIN), len(END_RAIN), len(BEGINNING_FLOW), len(END_FLOW)) diff --git a/test/test_session_division.py b/test/test_session_division.py deleted file mode 100644 index cc00831..0000000 --- a/test/test_session_division.py +++ /dev/null @@ -1,44 +0,0 @@ -import os - -import pandas as pd - -import definitions -from hydromodel.utils.dmca_esr import step1_step2_tr_and_fluctuations_timeseries, step3_core_identification, \ - step4_end_rain_events, \ - step5_beginning_rain_events, step6_checks_on_rain_events, step7_end_flow_events, step8_beginning_flow_events, \ - step9_checks_on_flow_events, step10_checks_on_overlapping_events - - -def test_session_division_new(): - rain = pd.read_csv(os.path.join(definitions.ROOT_DIR, 'hydromodel/example/division_rain.csv'))['rain'] - flow = pd.read_csv(os.path.join(definitions.ROOT_DIR, 'hydromodel/example/division_flow.csv'))['flow'] - time = rain.index.to_numpy() - rain = rain.to_numpy() / 24 - flow = flow.to_numpy() / 24 - rain_min = 0.02 - max_window = 100 - Tr, fluct_rain_Tr, fluct_flow_Tr, fluct_bivariate_Tr = step1_step2_tr_and_fluctuations_timeseries(rain, flow, - rain_min, - max_window) - beginning_core, end_core = step3_core_identification(fluct_bivariate_Tr) - end_rain = step4_end_rain_events(beginning_core, end_core, rain, fluct_rain_Tr, rain_min) - beginning_rain = step5_beginning_rain_events(beginning_core, end_rain, rain, fluct_rain_Tr, rain_min) - beginning_rain_checked, end_rain_checked, beginning_core, end_core = step6_checks_on_rain_events(beginning_rain, - end_rain, rain, - rain_min, - beginning_core, - end_core) - end_flow = step7_end_flow_events(end_rain_checked, beginning_core, end_core, rain, fluct_rain_Tr, fluct_flow_Tr, Tr) - beginning_flow = step8_beginning_flow_events(beginning_rain_checked, end_rain_checked, rain, beginning_core, - fluct_rain_Tr, - fluct_flow_Tr) - beginning_flow_checked, end_flow_checked = step9_checks_on_flow_events(beginning_rain_checked, end_rain_checked, - beginning_flow, - end_flow, fluct_flow_Tr) - BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW = step10_checks_on_overlapping_events(beginning_rain_checked, - end_rain_checked, - beginning_flow_checked, - end_flow_checked, - time) - print(BEGINNING_RAIN, END_RAIN, BEGINNING_FLOW, END_FLOW) - print(len(BEGINNING_RAIN), len(END_RAIN), len(BEGINNING_FLOW), len(END_FLOW)) diff --git a/test/test_xaj_bmi.py b/test/test_xaj_bmi.py index c61808c..0b65331 100644 --- a/test/test_xaj_bmi.py +++ b/test/test_xaj_bmi.py @@ -3,9 +3,6 @@ import definitions from hydromodel.models.configuration import read_config from hydromodel.models.xaj_bmi import xajBmi - -logging.basicConfig(level=logging.INFO) - import pandas as pd import os from pathlib import Path @@ -19,8 +16,8 @@ cross_valid_data, split_train_test, ) -from xaj.calibrate_sceua_xaj_bmi import calibrate_by_sceua -from xaj.calibrate_ga_xaj_bmi import ( +from hydromodel.calibrate.calibrate_sceua_xaj_bmi import calibrate_by_sceua +from hydromodel.calibrate.calibrate_ga_xaj_bmi import ( calibrate_by_ga, show_ga_result, ) @@ -34,9 +31,11 @@ ) from hydromodel.utils import hydro_constant +logging.basicConfig(level=logging.INFO) + def test_bmi(): - ''' + """ model = xajBmi() print(model.get_component_name()) model.initialize("runxaj.yaml") @@ -64,23 +63,23 @@ def test_bmi(): }) results.to_csv('/home/wangjingyi/code/hydro-model-xaj/scripts/xaj.csv') model.finalize() - ''' + """ # 模型率定 config = read_config(os.path.relpath("runxaj.yaml")) - forcing_data = Path(str(definitions.ROOT_DIR) + str(config['forcing_data'])) - train_period = config['train_period'] - test_period = config['test_period'] + forcing_data = Path(str(definitions.ROOT_DIR) + str(config["forcing_data"])) + train_period = config["train_period"] + test_period = config["test_period"] # period = config['period'] - json_file = Path(str(definitions.ROOT_DIR) + str(config['json_file'])) - npy_file = Path(str(definitions.ROOT_DIR) + str(config['npy_file'])) - cv_fold = config['cv_fold'] - warmup_length = config['warmup_length'] + json_file = Path(str(definitions.ROOT_DIR) + str(config["json_file"])) + npy_file = Path(str(definitions.ROOT_DIR) + str(config["npy_file"])) + cv_fold = config["cv_fold"] + warmup_length = config["warmup_length"] # model_info - model_name = config['model_name'] - source_type = config['source_type'] - source_book = config['source_book'] + model_name = config["model_name"] + source_type = config["source_type"] + source_book = config["source_book"] # algorithm - algorithm_name = config['algorithm_name'] + algorithm_name = config["algorithm_name"] if not (cv_fold > 1): # no cross validation @@ -93,7 +92,7 @@ def test_bmi(): split_train_test(json_file, npy_file, train_period, test_period) kfold = [ - int(f_name[len("data_info_fold"): -len("_test.json")]) + int(f_name[len("data_info_fold") : -len("_test.json")]) for f_name in os.listdir(os.path.dirname(forcing_data)) if fnmatch.fnmatch(f_name, "*_fold*_test.json") ] @@ -104,19 +103,21 @@ def test_bmi(): os.path.dirname(forcing_data), f"data_info_fold{str(fold)}_train.json" ) train_data_file = os.path.join( - os.path.dirname(forcing_data), f"basins_lump_p_pe_q_fold{str(fold)}_train.npy" + os.path.dirname(forcing_data), + f"basins_lump_p_pe_q_fold{str(fold)}_train.npy", ) test_data_info_file = os.path.join( os.path.dirname(forcing_data), f"data_info_fold{str(fold)}_test.json" ) test_data_file = os.path.join( - os.path.dirname(forcing_data), f"basins_lump_p_pe_q_fold{str(fold)}_test.npy" + os.path.dirname(forcing_data), + f"basins_lump_p_pe_q_fold{str(fold)}_test.npy", ) if ( - os.path.exists(train_data_info_file) is False - or os.path.exists(train_data_file) is False - or os.path.exists(test_data_info_file) is False - or os.path.exists(test_data_file) is False + os.path.exists(train_data_info_file) is False + or os.path.exists(train_data_file) is False + or os.path.exists(test_data_info_file) is False + or os.path.exists(test_data_file) is False ): raise FileNotFoundError( "The data files are not found, please run datapreprocess4calibrate.py first." @@ -127,14 +128,17 @@ def test_bmi(): data_info_test = hydro_utils.unserialize_json_ordered(test_data_info_file) current_time = datetime.now().strftime("%b%d_%H-%M-%S") # one directory for one model + one hyperparam setting and one basin - save_dir = os.path.join(os.path.dirname(forcing_data), current_time + "_" + socket.gethostname() + "_fold" + str(fold)) + save_dir = os.path.join( + os.path.dirname(forcing_data), + current_time + "_" + socket.gethostname() + "_fold" + str(fold), + ) if algorithm_name == "SCE_UA": - random_seed = config['random_seed'] - rep = config['rep'] - ngs = config['ngs'] - kstop = config['kstop'] - peps = config['peps'] - pcento = config['pcento'] + random_seed = config["random_seed"] + rep = config["rep"] + ngs = config["ngs"] + kstop = config["kstop"] + peps = config["peps"] + pcento = config["pcento"] for i in range(len(data_info_train["basin"])): basin_id = data_info_train["basin"][i] basin_area = data_info_train["area"][i] @@ -148,23 +152,23 @@ def test_bmi(): os.makedirs(spotpy_db_dir) db_name = os.path.join(spotpy_db_dir, "SCEUA_" + model_name) sampler = calibrate_by_sceua( - data_train[:, i: i + 1, 0:2], - data_train[:, i: i + 1, -1:], + data_train[:, i : i + 1, 0:2], + data_train[:, i : i + 1, -1:], db_name, warmup_length=warmup_length, model={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book + "name": model_name, + "source_type": source_type, + "source_book": source_book, }, algorithm={ - 'name': algorithm_name, - 'random_seed': random_seed, - 'rep': rep, - 'ngs': ngs, - 'kstop': kstop, - 'peps': peps, - 'pcento': pcento + "name": algorithm_name, + "random_seed": random_seed, + "rep": rep, + "ngs": ngs, + "kstop": kstop, + "peps": peps, + "pcento": pcento, }, ) @@ -182,7 +186,9 @@ def test_bmi(): ) model = xajBmi() - model.initialize(os.path.relpath("runxaj.yaml"), params, data_test[:, i: i + 1, 0:2]) + model.initialize( + os.path.relpath("runxaj.yaml"), params, data_test[:, i : i + 1, 0:2] + ) j = 0 while j <= len(data_info_test["time"]): model.update() @@ -197,7 +203,7 @@ def test_bmi(): ) qobs = hydro_constant.convert_unit( - data_test[warmup_length:, i: i + 1, -1:], + data_test[warmup_length:, i : i + 1, -1:], unit_now="mm/day", unit_final=hydro_constant.unit["streamflow"], basin_area=basin_area, @@ -219,12 +225,12 @@ def test_bmi(): basin_id, test_date, qsim, qobs, save_dir=spotpy_db_dir ) elif algorithm_name == "GA": - random_seed = config['random_seed'] - run_counts = config['run_counts'] - pop_num = config['pop_num'] - cross_prob = config['cross_prob'] - mut_prob = config['mut_prob'] - save_freq = config['save_freq'] + random_seed = config["random_seed"] + run_counts = config["run_counts"] + pop_num = config["pop_num"] + cross_prob = config["cross_prob"] + mut_prob = config["mut_prob"] + save_freq = config["save_freq"] for i in range(len(data_info_train["basin"])): basin_id = data_info_train["basin"][i] basin_area = data_info_train["area"][i] @@ -234,36 +240,36 @@ def test_bmi(): if not os.path.exists(deap_db_dir): os.makedirs(deap_db_dir) calibrate_by_ga( - data_train[:, i: i + 1, 0:2], - data_train[:, i: i + 1, -1:], + data_train[:, i : i + 1, 0:2], + data_train[:, i : i + 1, -1:], deap_db_dir, warmup_length=warmup_length, model={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book + "name": model_name, + "source_type": source_type, + "source_book": source_book, }, ga_param={ - 'name': algorithm_name, - 'random_seed': random_seed, - 'run_counts': run_counts, - 'pop_num': pop_num, - 'cross_prob': cross_prob, - 'mut_prob': mut_prob, - 'save_freq': save_freq + "name": algorithm_name, + "random_seed": random_seed, + "run_counts": run_counts, + "pop_num": pop_num, + "cross_prob": cross_prob, + "mut_prob": mut_prob, + "save_freq": save_freq, }, ) show_ga_result( deap_db_dir, warmup_length=warmup_length, basin_id=basin_id, - the_data=data_train[:, i: i + 1, :], + the_data=data_train[:, i : i + 1, :], the_period=data_info_train["time"], basin_area=basin_area, model_info={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book + "name": model_name, + "source_type": source_type, + "source_book": source_book, }, train_mode=True, ) @@ -271,13 +277,13 @@ def test_bmi(): deap_db_dir, warmup_length=warmup_length, basin_id=basin_id, - the_data=data_test[:, i: i + 1, :], + the_data=data_test[:, i : i + 1, :], the_period=data_info_test["time"], basin_area=basin_area, model_info={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book + "name": model_name, + "source_type": source_type, + "source_book": source_book, }, train_mode=False, ) @@ -285,24 +291,37 @@ def test_bmi(): raise NotImplementedError( "We don't provide this calibrate method! Choose from 'SCE_UA' or 'GA'!" ) - summarize_parameters(save_dir, model_info={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book - }) - renormalize_params(save_dir, model_info={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book - }) - summarize_metrics(save_dir, model_info={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book - }) - save_streamflow(save_dir, model_info={ - 'name': model_name, - 'source_type': source_type, - 'source_book': source_book, - }, fold=fold) + summarize_parameters( + save_dir, + model_info={ + "name": model_name, + "source_type": source_type, + "source_book": source_book, + }, + ) + renormalize_params( + save_dir, + model_info={ + "name": model_name, + "source_type": source_type, + "source_book": source_book, + }, + ) + summarize_metrics( + save_dir, + model_info={ + "name": model_name, + "source_type": source_type, + "source_book": source_book, + }, + ) + save_streamflow( + save_dir, + model_info={ + "name": model_name, + "source_type": source_type, + "source_book": source_book, + }, + fold=fold, + ) print(f"Finish calibrating the {fold}-th fold") From 51f650d6f703a1c6ae8e2ff95e5882162e3caf91 Mon Sep 17 00:00:00 2001 From: ouyangwenyu Date: Sat, 28 Oct 2023 16:43:03 +0800 Subject: [PATCH 16/19] delete some unused lines in xaj --- hydromodel/models/xaj.py | 35 ----------------------------------- hydromodel/models/xaj_bmi.py | 10 +++++----- test/test_xaj_bmi.py | 5 ++--- 3 files changed, 7 insertions(+), 43 deletions(-) diff --git a/hydromodel/models/xaj.py b/hydromodel/models/xaj.py index b780d9b..665fb4b 100644 --- a/hydromodel/models/xaj.py +++ b/hydromodel/models/xaj.py @@ -900,14 +900,6 @@ def xaj_runoff( source_book = kwargs.get("source_book", "HF") # params param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] - if model_name == "xaj": - route_method = "CSL" - elif model_name == "xaj_mz": - route_method = "MZ" - else: - raise NotImplementedError( - "We don't provide this route method now! Please use 'CS' or 'MZ'!" - ) xaj_params = [ (value[1] - value[0]) * params_runoff[:, i] + value[0] for i, (key, value) in enumerate(param_ranges.items()) @@ -991,8 +983,6 @@ def xaj_route( **kwargs, ) -> Union[tuple, np.array]: model_name = kwargs.get("name", "xaj") - source_type = kwargs.get("source_type", "sources") - source_book = kwargs.get("source_book", "HF") # params param_ranges = MODEL_PARAM_DICT[model_name]["param_range"] if model_name == "xaj": @@ -1007,20 +997,6 @@ def xaj_route( (value[1] - value[0]) * params_route[:, i] + value[0] for i, (key, value) in enumerate(param_ranges.items()) ] - k = xaj_params[0] - b = xaj_params[1] - im = xaj_params[2] - um = xaj_params[3] - lm = xaj_params[4] - dm = xaj_params[5] - c = xaj_params[6] - sm = xaj_params[7] - ex = xaj_params[8] - ki_ = xaj_params[9] - kg_ = xaj_params[10] - # ki+kg should be smaller than 1; if not, we scale them - ki = np.where(ki_ + kg_ < 1.0, ki_, (1.0 - PRECISION) / (ki_ + kg_) * ki_) - kg = np.where(ki_ + kg_ < 1.0, kg_, (1.0 - PRECISION) / (ki_ + kg_) * kg_) if route_method == "CSL": cs = xaj_params[11] l = xaj_params[12] @@ -1140,17 +1116,6 @@ def xaj_state( ci = xaj_params[13] cg = xaj_params[14] - # initialize state values - # if warmup_length > 0: - # p_and_e_warmup = p_and_e[0:warmup_length, :, :] - # _q, _e, *w0, s0, fr0, qi0, qg0 = xaj_state( - # p_and_e_warmup, - # params, - # return_state=True, - # warmup_length=0, - # **kwargs, - # ) - # else: w0 = (0.5 * um, 0.5 * lm, 0.5 * dm) s0 = 0.5 * sm fr0 = np.full(ex.shape, 0.1) diff --git a/hydromodel/models/xaj_bmi.py b/hydromodel/models/xaj_bmi.py index 435ab67..e94f620 100644 --- a/hydromodel/models/xaj_bmi.py +++ b/hydromodel/models/xaj_bmi.py @@ -76,7 +76,7 @@ def initialize(self, config_file, params, p_and_e): self.test_start_time_str = test_period[0] self.test_end_time_str = test_period[1] - except: + except Exception: import traceback traceback.print_exc() @@ -294,8 +294,8 @@ def start_Time(self, _start_time_str): self._startTime = datetime.datetime( int(year), int(month), int(day), int(hour), int(minute), int(second) ) - except ValueError: - raise ValueError("Invalid start date format!") + except ValueError as e: + raise ValueError("Invalid start date format!") from e return self._startTime @@ -314,6 +314,6 @@ def end_Time(self, _end_time_str): self._endTime = datetime.datetime( int(year), int(month), int(day), int(hour), int(minute), int(second) ) - except ValueError: - raise ValueError("Invalid start date format!") + except ValueError as e: + raise ValueError("Invalid start date format!") from e return self._endTime diff --git a/test/test_xaj_bmi.py b/test/test_xaj_bmi.py index 0b65331..875a9d7 100644 --- a/test/test_xaj_bmi.py +++ b/test/test_xaj_bmi.py @@ -81,14 +81,13 @@ def test_bmi(): # algorithm algorithm_name = config["algorithm_name"] - if not (cv_fold > 1): + if cv_fold <= 1: # no cross validation periods = np.sort( [train_period[0], train_period[1], test_period[0], test_period[1]] ) - if cv_fold > 1: - cross_valid_data(json_file, npy_file, periods, warmup_length, cv_fold) else: + cross_valid_data(json_file, npy_file, periods, warmup_length, cv_fold) split_train_test(json_file, npy_file, train_period, test_period) kfold = [ From 3caac4a9e2aa14f3db20c9c24264ebd84fcf59e0 Mon Sep 17 00:00:00 2001 From: ouyangwenyu Date: Sat, 28 Oct 2023 17:41:05 +0800 Subject: [PATCH 17/19] add files from cookiecutter template --- .editorconfig | 21 +++++++ .github/ISSUE_TEMPLATE/bug_report.md | 25 ++++++++ .github/ISSUE_TEMPLATE/config.yml | 10 ++++ .github/ISSUE_TEMPLATE/feature_request.md | 18 ++++++ .github/workflows/docs-build.yml | 51 ++++++++++++++++ .github/workflows/docs.yml | 28 +++++++++ .github/workflows/macos.yml | 38 ++++++++++++ .github/workflows/publish-to-pypi.yml | 38 ------------ .github/workflows/pypi.yml | 30 ++++++++++ .github/workflows/ubuntu.yml | 48 +++++++++++++++ .github/workflows/windows.yml | 33 +++++++++++ AUTHORS.rst | 13 +++++ MANIFEST.in | 8 ++- environment-dev.yml | 4 ++ requirements.txt | 6 +- requirements_dev.txt | 14 +++++ setup.cfg | 26 +++++++++ setup.py | 71 ++++++++++++++++++----- 18 files changed, 424 insertions(+), 58 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/docs-build.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/macos.yml delete mode 100644 .github/workflows/publish-to-pypi.yml create mode 100644 .github/workflows/pypi.yml create mode 100644 .github/workflows/ubuntu.yml create mode 100644 .github/workflows/windows.yml create mode 100644 AUTHORS.rst create mode 100644 requirements_dev.txt create mode 100644 setup.cfg diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d4a2c44 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +end_of_line = lf + +[*.bat] +indent_style = tab +end_of_line = crlf + +[LICENSE] +insert_final_newline = false + +[Makefile] +indent_style = tab diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..c89fc62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,25 @@ +--- +name: Bug Report +about: Create a bug report to help us improve +labels: bug +--- + + + +### Environment Information + +- hydromodel version: +- Python version: +- Operating System: + +### Description + +Describe what you were trying to get done. +Tell us what happened, what went wrong, and what you expected to happen. + +### What I Did + +``` +Paste the command(s) you ran and the output. +If there was a crash, please include the traceback here. +``` diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..de46af5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,10 @@ +contact_links: + - name: Ask questions + url: https://github.com/OuyangWenyu/hydro-model-xaj/discussions/categories/q-a + about: Please ask and answer questions here. + - name: Ideas + url: https://github.com/OuyangWenyu/hydro-model-xaj/discussions/categories/ideas + about: Please share your ideas here. + - name: Ask questions from the GIS community + url: https://gis.stackexchange.com + about: To get answers from questions in the GIS community, please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..cf7acb9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Submit a feature request to help us improve +labels: Feature Request +--- + + + +### Description + +Describe the feature (e.g., new functions/tutorials) you would like to propose. +Tell us what can be achieved with this new feature and what's the expected outcome. + +### Source code + +``` +Paste your source code here if have sample code to share. +``` diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml new file mode 100644 index 0000000..876561c --- /dev/null +++ b/.github/workflows/docs-build.yml @@ -0,0 +1,51 @@ +name: docs-build +on: + pull_request: + branches: + - master + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + - name: Install GDAL + run: | + python -m pip install --upgrade pip + pip install --find-links=https://girder.github.io/large_image_wheels --no-cache GDAL pyproj + - name: Test GDAL installation + run: | + python -c "from osgeo import gdal" + gdalinfo --version + - name: Install dependencies + run: | + pip install --no-cache-dir Cython + pip install -r requirements.txt -r requirements_dev.txt -r requirements_docs.txt + pip install . + - name: Discover typos with codespell + run: codespell --skip="*.csv,*.geojson,*.json,*.js,*.html,*cff,*.pdf,./.git" --ignore-words-list="aci,acount,acounts,fallow,hart,hist,nd,ned,ois,wqs" + - name: PKG-TEST + run: | + python -m unittest discover tests/ + - name: Build docs + run: | + mkdocs build + # - name: Deploy to Netlify + # uses: nwtgck/actions-netlify@v2.0 + # with: + # publish-dir: "./site" + # production-branch: master + # github-token: ${{ secrets.GITHUB_TOKEN }} + # deploy-message: "Deploy from GitHub Actions" + # enable-pull-request-comment: true + # enable-commit-comment: false + # overwrites-pull-request-comment: true + # env: + # NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + # NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + # timeout-minutes: 10 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..6ea88e5 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,28 @@ +name: docs +on: + push: + branches: + - master +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.9 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --user --no-cache-dir Cython + pip install --user -r requirements.txt + pip install . + - name: Discover typos with codespell + run: | + pip install codespell + codespell --skip="*.csv,*.geojson,*.json,*.js,*.html,*cff,./.git" --ignore-words-list="aci,acount,acounts,fallow,hart,hist,nd,ned,ois,wqs,watermask" + - name: PKG-TEST + run: | + python -m unittest discover tests/ + - run: pip install -r requirements_docs.txt + - run: mkdocs gh-deploy --force diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 0000000..4b3ed55 --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,38 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: macOS build +jobs: + test-macOS: + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }} (${{ matrix.python-version}}) + strategy: + fail-fast: false + matrix: + os: ["macOS-latest"] + python-version: ["3.10"] + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version}} + - name: Install GDAL + run: | + brew install gdal + - name: Test GDAL installation + run: | + gdalinfo --version + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install -r requirements.txt + pip install . diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml deleted file mode 100644 index 2bc7304..0000000 --- a/.github/workflows/publish-to-pypi.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Publish Python distributions to PyPI - -on: - push: - workflow_dispatch: - -jobs: - build-n-publish: - name: Build and publish Python distributions to PyPI - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@master - - name: Set up Python 3.9 - uses: actions/setup-python@v1 - with: - python-version: 3.9 - - - name: Install pypa/build - run: >- - python -m - pip install - build - --user - - name: Build a binary wheel and a source tarball - run: >- - python -m - build - --sdist - --wheel - --outdir dist/ - . - - - name: Publish distribution to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.HYDRO_XAJ_TOKEN }} diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..2bbb0c0 --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,30 @@ +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: pypi + +on: + release: + types: [created] + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERS }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml new file mode 100644 index 0000000..6cb7c0c --- /dev/null +++ b/.github/workflows/ubuntu.yml @@ -0,0 +1,48 @@ +on: + push: + branches: + - master + - dev + pull_request: + branches: + - master + - dev + +name: Linux build +jobs: + py-check: + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.os }} (${{ matrix.config.py }}) + strategy: + fail-fast: false + matrix: + config: + - { os: ubuntu-latest, py: "3.8" } + - { os: ubuntu-latest, py: "3.9" } + - { os: ubuntu-latest, py: "3.10" } + - { os: ubuntu-latest, py: "3.11" } + steps: + - name: Checkout Code + uses: actions/checkout@v3 + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.config.py }} + - name: Install GDAL + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install --find-links=https://girder.github.io/large_image_wheels --no-cache GDAL + - name: Test GDAL installation + run: | + python -c "from osgeo import gdal" + gdalinfo --version + - name: Install dependencies + run: | + pip install --user -r requirements.txt + pip install --user -r requirements_dev.txt + pip install . + - name: PKG-TEST + run: | + python -m unittest discover tests/ + diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000..9e9deaa --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,33 @@ +on: + push: + branches: + - master + - dev + pull_request: + branches: + - master + - dev + +name: Windows build +jobs: + test-windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + - name: Install miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + auto-activate-base: true + python-version: "3.10" + - name: Install GDAL + run: conda install -c conda-forge gdal --yes + - name: Test GDAL installation + run: | + python -c "from osgeo import gdal" + gdalinfo --version + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install -r requirements.txt + pip install . diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..a199192 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,13 @@ +======= +Credits +======= + +Development Lead +---------------- + +* Wenyu Ouyang + +Contributors +------------ + +None yet. Why not be the first? diff --git a/MANIFEST.in b/MANIFEST.in index 57fdc18..89411aa 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,7 @@ -recursive-include XXX *.csv *.txt # 打包需包含csv、txt为后缀的文件;XXX为包名 \ No newline at end of file +include LICENSE +include README.md +include requirements.txt + +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + diff --git a/environment-dev.yml b/environment-dev.yml index 288a934..d6be0cb 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -23,4 +23,8 @@ dependencies: # pip - pip - pip: + - setuptools + - wheel + - twine + - bump2version - hydrodataset diff --git a/requirements.txt b/requirements.txt index 74513e9..245c186 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,14 @@ -python=3.10 ipykernel numpy numba pandas scikit-learn deap -spotpy=1.5.14 +spotpy==1.5.14 seaborn tqdm pytest hydrodataset bmipy pyyaml -requests -spotpy \ No newline at end of file +requests \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..c4e98f7 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,14 @@ +black +black[jupyter] +pip +bump2version +wheel +watchdog +flake8 +tox +coverage +Sphinx +twine + +pytest +pytest-runner \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..2e09fd3 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,26 @@ +[bumpversion] +current_version = 0.0.1 +commit = True +tag = True + +[bumpversion:file:setup.py] +search = version='{current_version}' +replace = version='{new_version}' + +[bumpversion:file:hydromodel/__init__.py] +search = __version__ = '{current_version}' +replace = __version__ = '{new_version}' + +[bdist_wheel] +universal = 1 + +[flake8] +exclude = docs + +[aliases] +# Define setup.py command aliases here +test = pytest + +[tool:pytest] +collect_ignore = ['setup.py'] + diff --git a/setup.py b/setup.py index e143dd7..bf0dedf 100644 --- a/setup.py +++ b/setup.py @@ -1,30 +1,71 @@ +#!/usr/bin/env python """ Author: Wenyu Ouyang Date: 2023-10-28 09:16:46 -LastEditTime: 2023-10-28 09:27:22 +LastEditTime: 2023-10-28 17:36:12 LastEditors: Wenyu Ouyang -Description: setup.py for hydromodel package +Description: The setup script FilePath: \hydro-model-xaj\setup.py Copyright (c) 2023-2024 Wenyu Ouyang. All rights reserved. """ +import io import pathlib +from os import path as op from setuptools import setup, find_packages -readme = pathlib.Path("README.md").read_text() +readme = pathlib.Path("README.md").read_text(encoding='utf-8') +here = op.abspath(op.dirname(__file__)) + +# get the dependencies and installs +with io.open(op.join(here, "requirements.txt"), encoding="utf-8") as f: + all_reqs = f.read().split("\n") + +install_requires = [x.strip() for x in all_reqs if "git+" not in x] +dependency_links = [x.strip().replace("git+", "") for x in all_reqs if "git+" not in x] + +requirements = [] + +setup_requirements = [ + "pytest-runner", +] + +test_requirements = [ + "pytest>=3", +] + setup( - name="hydromodel", # 输入项目名称 - version="0.0.1", # 输入版本号 - keywords=[""], # 输入关键词 - description="", # 输入概述 + author="Wenyu Ouyang", + author_email="wenyuouyang@outlook.com", + python_requires=">=3.9", + classifiers=[ + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + ], + description="hydrological models starting from XinAnJiang", + entry_points={ + "console_scripts": [ + "hydromodel=hydromodel.cli:main", + ], + }, + install_requires=install_requires, + dependency_links=dependency_links, + license="GNU General Public License v3", long_description=readme, long_description_content_type="text/markdown", - url="https://github.com/iHeadWater/hydro-model-xaj", # 输入项目Github仓库的链接 - author="iHeadWater", # 输入作者名字 - author_email="", # 输入作者邮箱 - license="MIT_license", # 此为声明文件,一般填写 MIT_license - packages=find_packages(), include_package_data=True, - platforms="any", - install_requires=[""], # 输入项目所用的包 - python_requires=">= 3.7 ", # Python版本要求 + keywords="hydromodel", + name="hydromodel", + packages=find_packages(include=["hydromodel", "hydromodel.*"]), + setup_requires=setup_requirements, + test_suite="tests", + tests_require=test_requirements, + url="https://github.com/iHeadWater/hydro-model-xaj", + version="0.0.1", + zip_safe=False, ) From 4f33f707d5619f975e50f57aeafe8f060d9c09ef Mon Sep 17 00:00:00 2001 From: forestbat Date: Wed, 8 Nov 2023 15:19:07 +0800 Subject: [PATCH 18/19] Create publish-to-pypi-token.yml --- .github/workflows/publish-to-pypi-token.yml | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/publish-to-pypi-token.yml diff --git a/.github/workflows/publish-to-pypi-token.yml b/.github/workflows/publish-to-pypi-token.yml new file mode 100644 index 0000000..ef3c9e2 --- /dev/null +++ b/.github/workflows/publish-to-pypi-token.yml @@ -0,0 +1,37 @@ +name: Publish Python distributions to PyPI + +on: + push: + workflow_dispatch: + +jobs: + build-n-publish: + name: Build and publish Python distributions to PyPI + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - name: Set up Python 3.9 + uses: actions/setup-python@v1 + with: + python-version: 3.9 + + - name: Install pypa/build + run: >- + python -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: >- + python -m + build + --sdist + --wheel + --outdir dist/ + . + - name: Publish distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.HYDRO_XAJ_TOKEN }} From 655628b44fd9eae67597f8ef7f2413dac1fadd69 Mon Sep 17 00:00:00 2001 From: forestbat Date: Wed, 8 Nov 2023 15:20:53 +0800 Subject: [PATCH 19/19] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index bf0dedf..96730f7 100644 --- a/setup.py +++ b/setup.py @@ -66,6 +66,6 @@ test_suite="tests", tests_require=test_requirements, url="https://github.com/iHeadWater/hydro-model-xaj", - version="0.0.1", + version="0.0.2", zip_safe=False, )