Source code for flusstools.bedanalyst.degree_clogging

""" This module calls the necessary functions to perform the computation
of degree of clogging.
"""

from .config import *
from .utils import *


[docs]def degree_clogging(df_samples, output_csv_path, plot=[False, False]): """ Function for computing degree of clogging using the input riverbed parameter along the riverbed depth: + Fine Sediment Saare/Fraction (fsf/fss): [%] + Hydraulic Conductivity (kf): [m/s] + Porosity (n): [-] + Interstitial Dissolved Oxygen Content (IDOC): [mg/L] + Bridging criterion according to Huston & Fox (2015; referred as 'ratio' here): [-] Args: df_samples (pandas.DataFrame): df containing the columns 'id' (sample id), 'fss', 'kf', 'n', 'idoc' and 'ratio' output_csv_path (str): path to output csv containing the results of the fuzzy inference and final computed degree of clogging plot (list): List of two boolean objects indicating if the plots for the aggregation function and the fuzzy membership functions of the above mentione dparameters is required. Should be True if required, respectively. Returns: None """ # Take list of probes as tuples df_par = df_samples.drop(["id"], axis=1) probes = df_par.to_records(index=False) # Add columns for membership values and dregree of cloggging df_samples = add_columns(df_samples) # Compute b and c constants to define membership functions dc_b, dc_c = compute_bcs(dc_limits=dc_limits) # Generate universe variables dc_param_range = generate_ranges() # Generate fuzzy membership functions dc_fuzzy_funs = compute_fuzzy_functions(dc_param_range, dc_b, dc_c) # Generate low and high defuzzification functions dc_desfuzzy_funs = compute_desfuzzy_funs(dc_param_range, dc_b, dc_c) for step, probe in enumerate(probes): # Activate fuzzy functions dc_af = activate_fuzzy_funs(probe, dc_param_range, dc_fuzzy_funs) # Create fuzzy rules dc_mu_desfuzzy, dc_mu_desfuzzy_values = apply_fuzzy_rules(dc_af, dc_desfuzzy_funs) # Defuzzification aggregated = np.fmax(dc_mu_desfuzzy["mu_sc"], np.fmax(dc_mu_desfuzzy["mu_mc"], dc_mu_desfuzzy["mu_nc"])) # Calculate defuzzified result degree_of_clogging = fuzz.defuzz(dc_param_range["doc"], aggregated, 'centroid') activation = fuzz.interp_membership(dc_param_range["doc"], aggregated, degree_of_clogging) # for plot # Compute sigmoid centroids to new scale of desfuzzy functions dic_desfuzzy_centroids = find_centroids(dc_desfuzzy_funs, dc_param_range) # Correct degree of clogging into new scale degree_of_clogging_corrected = correct_degree_of_clogging(dic_desfuzzy_centroids, degree_of_clogging) # save computed values into a dataframe df_samples = add_results(df_samples, step, degree_of_clogging_corrected, degree_of_clogging, dc_mu_desfuzzy_values, dc_af ) # Plot aggregation of areas and crisp values (degree of clogging) plot_aggregation(dc_param_range, dc_mu_desfuzzy, dc_desfuzzy_funs, activation, degree_of_clogging, aggregated, step) if plot[0] else None # Plot membership functions plot_funs(dc_param_range, dc_fuzzy_funs, dc_desfuzzy_funs) if plot[1] else None # save the computed values into a csv df_samples.to_csv(output_csv_path)