import GPy import GPyOpt import pickle import tensorflow as tf import numpy as np import pandas as pd from preprocessing_utils import encode_categorical, scale_numerical, fill_nans import os import gradio as gr # Load access tokens WRITE_TOKEN = os.environ.get("WRITE_PER") # write # Logs repo path dataset_url = "https://huggingface.co/datasets/sandl/upload_alloy_hardness" dataset_path = "logs_alloy_hardness.csv" # Input parameters model_path = "model_coatings.h5" model = tf.keras.models.load_model(model_path) df_columns = ['Binder', 'NMs_Type', 'Primary_Size (nm)', 'NM-Shape', 'Substrate', 'Microorganism ', 'Duration (h)', 'Washing_cycles', 'Reduction_%', 'Concetration (µg/mL)', 'NPs_Synthesis_method', 'Application method\n', 'Evalutation_Standard', 'Evalutation_Method', 'Durability test', 'Washing_Detergent', 'Washing_Temp'] targets = ["Reduction_%"] numerical_columns = [#'Fabric diameter for antibacterial evaluation\n(cm)', 'Primary_Size (nm)', 'Duration (h)', 'Washing_cycles', 'Reduction_%', 'Concetration (µg/mL)'] categorical_columns = [column for column in df_columns if column not in numerical_columns] numerical_columns.remove(targets[0]) for column in targets: df_columns.remove(column) # Unpickle files with open("one_hot_scaler.pickle", "rb") as file: unpickler = pickle.Unpickler(file) one_hot_scaler = unpickler.load() with open("minmax_scaler_targets.pickle", "rb") as file: unpickler = pickle.Unpickler(file) minmax_scaler_targets = unpickler.load() with open("minmax_scaler_inputs.pickle", "rb") as file: unpickler = pickle.Unpickler(file) minmax_scaler_inputs = unpickler.load() with open("one_hot_scaler.pickle", "rb") as file: unpickler = pickle.Unpickler(file) one_hot_scaler = unpickler.load() test_data_columns = ['Binder_ADA', 'Binder_Alginates', 'Binder_Anatase', 'Binder_Butane tetracarboxylic', 'Binder_CDA', 'Binder_CF4 plasma', 'Binder_CTAB', 'Binder_Carboxylic acid ', 'Binder_Carboxymethyl chitosan (CMCTS)', 'Binder_Cellulase', 'Binder_Chitosan', 'Binder_Citric acid ', 'Binder_Copper phosphide', 'Binder_Date seed extract', 'Binder_Dendrimer', 'Binder_HSDA', 'Binder_HY', 'Binder_Mesosilver', 'Binder_Multi-amino compound (RSD-NH2)', 'Binder_NIDA', 'Binder_Nano-clay', 'Binder_Organosilicon', 'Binder_PEG', 'Binder_PS-b-PAA', 'Binder_PUBK (hydrophilic aliphatic polyester-urethanes)', 'Binder_Poly(quaternary ammonium salt-epoxy)', 'Binder_Printofix® Binder MTB EG liquid', 'Binder_Rutile', 'Binder_SDS', 'Binder_Seaweed', 'Binder_Silane ', 'Binder_Silica', 'Binder_Silpure', 'Binder_Sodium citrate', 'Binder_Starch', 'Binder_TX-100', 'Binder_Thioglycolic acid (TGA)', 'Binder_hexadecyltrimethoxysilane(HDTMS)', 'Binder_hexamethyltriethylenetetramine', 'Binder_poly-hydroxy-amino methyl silicone', 'Binder_polyamide network polymer (PNP)', 'NMs_Type_Ag', 'NMs_Type_Au', 'NMs_Type_CS', 'NMs_Type_Ce', 'NMs_Type_Ce_ZnO', 'NMs_Type_Co', 'NMs_Type_CuO', 'NMs_Type_CuO_TiO2', 'NMs_Type_Fe3O4', 'NMs_Type_Fe3O4_ZnO', 'NMs_Type_Mn', 'NMs_Type_SA_TSA', 'NMs_Type_SiO2_Ag_Cu', 'NMs_Type_TiO2', 'NMs_Type_ZnO', 'NMs_Type_ZnO_Cs', 'NMs_Type_ZrO2', 'NM-Shape_Crystalline', 'NM-Shape_Disc', 'NM-Shape_Ellipsoidal', 'NM-Shape_Hexagonal', 'NM-Shape_Hierarchical', 'NM-Shape_Irregular', 'NM-Shape_Nanotube', 'NM-Shape_Nanowire', 'NM-Shape_Polygonal', 'NM-Shape_Prism', 'NM-Shape_Rod ', 'NM-Shape_Spherical', 'NM-Shape_rectangle', 'Substrate_Bamboo', 'Substrate_Cotton', 'Substrate_Cotton_Polyester', 'Substrate_Denim', 'Substrate_PET', 'Substrate_Polyamide', 'Substrate_Polyester', 'Substrate_Silk', 'Substrate_Viscose', 'Substrate_Wool', 'Substrate_Wool_Polyester', 'Substrate_cotton', 'Microorganism _Aci_baumannii', 'Microorganism _Alt_brassicicola', 'Microorganism _Asp_niger', 'Microorganism _Bac_subtilis', 'Microorganism _C_albicans', 'Microorganism _E_coli', 'Microorganism _Enter_faecalis', 'Microorganism _Fus_oxysporum', 'Microorganism _K_aerogens', 'Microorganism _Kle_pneumoniae', 'Microorganism _MRSA', 'Microorganism _Mi_canis', 'Microorganism _Pse_aeruginosa', 'Microorganism _S_aureus', 'Microorganism _S_epidermis', 'Microorganism _S_pyogenes', 'Microorganism _Sal_typhimurium', 'Microorganism _Tric_mentagraphytes', 'NPs_Synthesis_method_Bio synthesis', 'NPs_Synthesis_method_Biosythesis ', 'NPs_Synthesis_method_Degradation', 'NPs_Synthesis_method_Dip_coated_Temp curated_Ultrasound', 'NPs_Synthesis_method_Not_applicable', 'NPs_Synthesis_method_Photochemical Reduction', 'NPs_Synthesis_method_Supplied', 'NPs_Synthesis_method_Wet chemical reduced', 'NPs_Synthesis_method_Wet chemistry', 'NPs_Synthesis_method_biosynthesis-green', 'NPs_Synthesis_method_ex situ synthesis', 'NPs_Synthesis_method_fungal process (biosynthesis)_green synthesis', 'NPs_Synthesis_method_green synthesis', 'NPs_Synthesis_method_in situ', 'NPs_Synthesis_method_in situ synthesis', 'NPs_Synthesis_method_in situ biosythesis', 'NPs_Synthesis_method_in situ desposition (alkalization and deposition)', 'NPs_Synthesis_method_in situ microwave irradiation', 'NPs_Synthesis_method_in situ reduction', 'NPs_Synthesis_method_in situ sol gel immersion', 'NPs_Synthesis_method_in situ sol–gel method', 'NPs_Synthesis_method_in situ synthesis', 'NPs_Synthesis_method_in situ synthesized', 'NPs_Synthesis_method_in situ ultrasound irradiation', 'NPs_Synthesis_method_ionic gelation', 'NPs_Synthesis_method_nebulize', 'NPs_Synthesis_method_reducing', 'NPs_Synthesis_method_reduction in situ', 'NPs_Synthesis_method_reduction of celluloce in viscose', 'NPs_Synthesis_method_reverse micellar cores', 'NPs_Synthesis_method_sol gel', 'NPs_Synthesis_method_sol-gel', 'NPs_Synthesis_method_sonication', 'NPs_Synthesis_method_sonochemical', 'NPs_Synthesis_method_ultrasound irradiation', 'NPs_Synthesis_method_wet chemical method', 'NPs_Synthesis_method_wet chemistry', 'Application method\n_ exhaustion and Pad_squeeze_dry', 'Application method\n_Dip coating', 'Application method\n_Dip coating and shaking', 'Application method\n_Dip padding and microwave irradiation', 'Application method\n_Dip-coating and Ultrasound irradiation', 'Application method\n_Dip_coating', 'Application method\n_Exhaust dyeing', 'Application method\n_Grafting Wet chemical ', 'Application method\n_Immersion', 'Application method\n_In situ Immersion', 'Application method\n_In situ dip-coating', 'Application method\n_Mist', 'Application method\n_Pad-Dry-Cure ', 'Application method\n_Pad-Dry-Cure and Dip coating', 'Application method\n_Pad-dry-cure', 'Application method\n_Padding', 'Application method\n_Pre-alkalization/sorption', 'Application method\n_Sonochemical', 'Application method\n_Sonochemical throwingstones', 'Application method\n_Sonochemical/Roll to roll ', 'Application method\n_Sonochemical/Ultrasonic irradiation', 'Application method\n_Sonochemical/ultrasonic transducer', 'Application method\n_Sorption', 'Application method\n_Top-coating with Pericoat', 'Application method\n_Ultrasonic irradiation', 'Application method\n_Ultrasonic-mediated dip coating', 'Application method\n_Ultrasound irradiation', 'Application method\n_Wet-on-wet padding', 'Application method\n_Wetting-Immersion', 'Application method\n_Wetting-Immersion or spraying', 'Application method\n_Wetting-Spraying', 'Application method\n_direct multi-layer coating with a socalled\nair blade', 'Application method\n_pad-dry-cure', 'Application method\n_plasma jet', 'Application method\n_ultrasonic ', 'Evalutation_Standard_AATCC_100', 'Evalutation_Standard_AATCC_147', 'Evalutation_Standard_AATCC_147_ISO_20645', 'Evalutation_Standard_AATCC_30', 'Evalutation_Standard_ASTME_2149', 'Evalutation_Standard_ASTM_2180', 'Evalutation_Standard_GB_T_20944_AATCC_61', 'Evalutation_Standard_ISO_20645', 'Evalutation_Standard_ISO_20743', 'Evalutation_Method_Agar_diffusion', 'Evalutation_Method_Dyn_shake', 'Durability test_ Memeret shaker', 'Durability test_AATCC 124', 'Durability test_AATCC 61', 'Durability test_AATCC standard wash machine', 'Durability test_Boiled', 'Durability test_GB/T 20944.3-2008(China)', 'Durability test_Hand washes', 'Durability test_Home laundering machine', 'Durability test_Home laundry washing', 'Durability test_Home/commercial laundering', 'Durability test_IS 687:1979', 'Durability test_ISO 105 CO3-1982', 'Durability test_ISO 105-C014:1989', 'Durability test_ISO 105-C06: 2010', 'Durability test_ISO 105-C06:1994', 'Durability test_ISO 105-C10:2006', 'Durability test_ISO 105-CO6-1M', 'Durability test_ISO 105-CO6-1M ', 'Durability test_ISO 6330 : 2000', 'Durability test_Industrial washing machine ISO standards', 'Durability test_Not_applicable', 'Durability test_Ordinary washing machine', 'Durability test_PNEN ISO 6330:2002/A1:2011', 'Durability test_Repeated washing', 'Durability test_UV transmission', 'Durability test_Ultrasonic cleaner', 'Durability test_Ultrasound bath', 'Durability test_Washed in a bath', 'Durability test_Washed in bath', 'Durability test_laundering cycles', 'Durability test_laundry cycle', 'Durability test_laundry regimes used in hospitals', 'Durability test_vigorous magnetic stirring', 'Washing_Detergent_AATCC Standard Detergent WOB', 'Washing_Detergent_AATCC WOB standard detergent', 'Washing_Detergent_AATCC standard detergent WOB', 'Washing_Detergent_AATCC standards specified detergent WOB', 'Washing_Detergent_Anionic detergent', 'Washing_Detergent_Commercial detergent', 'Washing_Detergent_Deionized water', 'Washing_Detergent_Distilled water', 'Washing_Detergent_IS-I neutral soap', 'Washing_Detergent_Na2CO3/commercial detergent', 'Washing_Detergent_Neutral soap solution', 'Washing_Detergent_Non-ionic detergent, Triton X-100', 'Washing_Detergent_Nonionic detergent', 'Washing_Detergent_Nonionic washing agent Felosan RG-N', 'Washing_Detergent_Not_applicable', 'Washing_Detergent_Ordinary detergent', 'Washing_Detergent_SDC standard detergent-Sodium carbonate', 'Washing_Detergent_Soap', 'Washing_Detergent_Soap detergent', 'Washing_Detergent_Sodium carbonate', 'Washing_Detergent_Sodium carbonate and soap', 'Washing_Detergent_Standard detergent', 'Washing_Detergent_Tap and deionized water', 'Washing_Detergent_Tap water', 'Washing_Detergent_Triton-X, non-ionic detergent', 'Washing_Detergent_nonionic detergent', 'Washing_Detergent_sodium dodecanesulphonate', 'Washing_Detergent_“Li Bai” washing powder', 'Washing_Temp_25', 'Washing_Temp_40', 'Washing_Temp_49', 'Washing_Temp_50', 'Washing_Temp_60', 'Washing_Temp_75', 'Washing_Temp_83', 'Washing_Temp_92', 'Washing_Temp_95', 'Washing_Temp_Not_applicable', 'Washing_Temp_Room_Temp', 'Washing_Temp_Warm water', 'Washing_Temp_machine set with warm\nwater', 'Washing_Temp_warm water', 'Primary_Size (nm)', 'Duration (h)', 'Washing_cycles', 'Concetration (µg/mL)'] def write_logs(message, message_type="Prediction"): """ Write logs """ #with Repository(local_dir="data", clone_from=dataset_url, use_auth_token=WRITE_TOKEN).commit(commit_message="from private", blocking=False): # with open(dataset_path, "a") as csvfile: # writer = csv.DictWriter(csvfile, fieldnames=["name", "message", "time"]) # writer.writerow( # {"name": message_type, "message": message, "time": str(datetime.now())} # ) return def fit_outputs_constraints(X, antimicrobial_activity_target, request: gr.Request): reduction_target = 100 - int(antimicrobial_activity_target) reduction_target_df = pd.DataFrame({'Reduction_%':[reduction_target]}) reduction_target_df = scale_numerical(reduction_target_df, ['Reduction_%'], scaler=minmax_scaler_targets, fit=False) predictions = model.predict(X)[0] error = np.sqrt(np.square(predictions[0]-reduction_target_df)) return error def predict_inverse(antimicrobial_activity_target, substrate, microorganism, num_washing_cycles, request: gr.Request): ### Define space and constrains dimensionality_dict = {} one_hot_mapping = {} for c in categorical_columns: dimensionality_dict[c] = 0 one_hot_mapping[c] = [] for c in categorical_columns: for t in test_data_columns: if c in t: dimensionality_dict[c]+=1 one_hot_mapping[c].append(t) domain = [] constrained_columns = ['Substrate', 'Washing_cycles', 'Microorganism '] ### Add input domain for df_column in df_columns: if df_column == "Substrate": for one_hot_column in one_hot_mapping[df_column]: if one_hot_column == substrate: domain.append({'name': str(one_hot_column), 'type': 'categorical', 'domain': (1.0, 1.0)}) else: domain.append({'name': str(one_hot_column), 'type': 'categorical', 'domain': (0.0, 0.0)}) elif df_column == 'Microorganism ': for one_hot_column in one_hot_mapping[df_column]: if one_hot_column == microorganism: domain.append({'name': str(one_hot_column), 'type': 'categorical', 'domain': (1.0, 1.0)}) else: domain.append({'name': str(one_hot_column), 'type': 'categorical', 'domain': (0.0, 0.0)}) elif df_column == 'Washing_cycles': washing_cycles_target_df = pd.DataFrame([[0]*len(numerical_columns)], columns=numerical_columns) washing_cycles_target_df['Washing_cycles'].iloc[0] = int(num_washing_cycles) washing_cycles_target_df = scale_numerical(washing_cycles_target_df, numerical_columns, scaler=minmax_scaler_inputs, fit=False) domain.append({'name': str(df_column), 'type': 'continuous', 'domain': (washing_cycles_target_df["Washing_cycles"].iloc[0], washing_cycles_target_df["Washing_cycles"].iloc[0])}) elif df_column in numerical_columns: domain.append({'name': str(df_column), 'type': 'continuous', 'domain': (0.0,1.)}) else: domain.append({'name': str(df_column), 'type': 'categorical', 'domain': (0,1), 'dimensionality': dimensionality_dict[df_column]}) print("Domain is ", domain) print(len(domain)) # Constraints constraints = [] def fit_outputs(x): return fit_outputs_constraints(x, antimicrobial_activity_target, request) opt = GPyOpt.methods.BayesianOptimization(f = fit_outputs, # function to optimize domain = domain, # box-constraints of the problem constraints = constraints, acquisition_type ='LCB', # LCB acquisition acquisition_weight = 0.1) # Exploration exploitation # it may take a few seconds opt.run_optimization(max_iter=10) opt.plot_convergence() opt = GPyOpt.methods.BayesianOptimization(f = fit_outputs, # function to optimize domain = domain, # box-constraints of the problem constraints = constraints, acquisition_type ='LCB', # LCB acquisition acquisition_weight = 0.1) # Exploration exploitation x_best = opt.X[np.argmin(opt.Y)] best_params = dict(zip( [el['name'] for el in domain], [[x] for x in x_best])) optimized_x = pd.DataFrame.from_dict(best_params) optimized_x[numerical_columns] = minmax_scaler_inputs.inverse_transform(optimized_x[numerical_columns]) for column in optimized_x.columns: if column in one_hot_mapping: optimized_x.loc[0, column] = one_hot_mapping[column][int(optimized_x.loc[0, column])] optimal_concentration = optimized_x['Concetration (µg/mL)'].iloc[0] if optimized_x['Concetration (µg/mL)'].iloc[0] > 0 else 11.2 return (optimized_x['Binder'].iloc[0], optimized_x['NMs_Type'].iloc[0], np.round(optimized_x['Primary_Size (nm)'].iloc[0], 1), optimized_x['NM-Shape'].iloc[0], np.round(optimized_x['Concetration (µg/mL)'].iloc[0], 1) if optimized_x['Concetration (µg/mL)'].iloc[0] else 0.1, optimized_x['NPs_Synthesis_method'].iloc[0], optimized_x['Application method\n'].iloc[0], optimized_x['Washing_Detergent'].iloc[0], optimized_x['Washing_Temp'].iloc[0]) example_inputs = [80, "Substrate_Bamboo", "Microorganism _Alt_brassicicola", 50] css_styling = """#submit {background: #1eccd8} #submit:hover {background: #a2f1f6} .output-image, .input-image, .image-preview {height: 250px !important} .output-plot {height: 250px !important}""" light_theme_colors = gr.themes.Color(c50="#e4f3fa", # Dataframe background cell content - light mode only c100="#e4f3fa", # Top corner of clear button in light mode + markdown text in dark mode c200="#a1c6db", # Component borders c300="#FFFFFF", # c400="#e4f3fa", # Footer text c500="#0c1538", # Text of component headers in light mode only c600="#a1c6db", # Top corner of button in dark mode c700="#475383", # Button text in light mode + component borders in dark mode c800="#0c1538", # Markdown text in light mode c900="#a1c6db", # Background of dataframe - dark mode c950="#0c1538") # Background in dark mode only # secondary color used for highlight box content when typing in light mode, and download option in dark mode # primary color used for login button in dark mode osium_theme = gr.themes.Default(primary_hue="cyan", secondary_hue="cyan", neutral_hue=light_theme_colors) page_title = "Recommendation of optimal parameters to fulfill coating antimicrobial activity requirement and constraints" favicon_path = "osiumai_favicon.ico" logo_path = "osiumai_logo.jpg" html = f""" Osium AI logo """ with gr.Blocks(css=css_styling, title=page_title, theme=osium_theme) as demo: #gr.HTML(html) gr.Markdown("#

Get optimal textile coating recommendation to fufill your target antimicrobial activity requirement

") gr.Markdown("Recommendation of optimal parameters to fulfill textile coating antimicrobial activity requirement") with gr.Row(): clear_button = gr.Button("Clear") prediction_button = gr.Button("Predict", elem_id="submit") with gr.Row(): with gr.Column(): gr.Markdown("### The target antimicrobial activity of your textile coating") antimicrobial_activity_target = gr.Number(label="Enter the minimum acceptable antimicrobial activity for your textile coating") gr.Markdown("### Your constraints") substrate = gr.Dropdown(label="Your substrate", choices=[c for c in test_data_columns if c.startswith("Substrate")]) microorganism = gr.Dropdown(label="Microorganism", choices=[c for c in test_data_columns if c.startswith("Microorganism")]) num_washing_cycles = gr.Number(label="Your number of washing cycles") with gr.Column(): with gr.Row(): with gr.Column(): # gr.Markdown("### Optimal conditions") gr.Markdown("### Optimal nanomaterial characteristics") optimal_binder = gr.Textbox(label="Optimal binder") optimal_nms_type = gr.Textbox(label="Optimal nanomaterial type") optimal_primary_size = gr.Textbox(label="Optimal primary size (nm)") optimal_nm_shape = gr.Textbox(label="Optimal nanomaterial shape") gr.Markdown("### Optimal nanomaterial application") optimal_concentration = gr.Textbox(label="Optimal concentration (µg/mL)") optimal_nps_synthesis = gr.Textbox(label="Optimal nanomaterial synthesis method") optimal_application_method = gr.Textbox(label="Optimal application method") gr.Markdown("### Optimal washing conditions") optimal_washing_detergent = gr.Textbox(label="Optimal washing detergent") optimal_washing_temperature = gr.Textbox(label="Optimal washing temperature") with gr.Row(): gr.Examples([example_inputs], [antimicrobial_activity_target, substrate, microorganism, num_washing_cycles]) prediction_button.click( fn=predict_inverse, inputs=[antimicrobial_activity_target, substrate, microorganism, num_washing_cycles], outputs=[optimal_binder, optimal_nms_type, optimal_primary_size, optimal_nm_shape, optimal_concentration, optimal_nps_synthesis, optimal_application_method, optimal_washing_detergent, optimal_washing_temperature], show_progress=True, ) clear_button.click( lambda x: [gr.update(value=None)] * 14, [], [ antimicrobial_activity_target, substrate, microorganism, num_washing_cycles, optimal_binder, optimal_nms_type, optimal_primary_size, optimal_nm_shape, optimal_concentration, optimal_nps_synthesis, optimal_application_method, optimal_washing_detergent, optimal_washing_temperature, ], ) if __name__ == "__main__": demo.queue(concurrency_count=2) demo.launch()