|
import os |
|
import gradio as gr |
|
from pandas import Series, DataFrame |
|
import pandas as pd |
|
import sys |
|
import numpy as np |
|
from Interface.empirical_parameter_calculator import EmpiricalParams |
|
from pymatgen.core.periodic_table import Element |
|
from pip._internal import main |
|
|
|
main(['install', 'joblib']) |
|
main(['install', 'matminer']) |
|
|
|
import joblib |
|
|
|
''' |
|
Get the path of all of the saved models. |
|
''' |
|
|
|
gmm_ssl_compressive_strength = "./Model/saved_model/gmm_ssl/compressive_strength.pkl" |
|
gmm_ssl_elongation = "./Model/saved_model/gmm_ssl/elongation.pkl" |
|
gmm_ssl_hardness ="./Model/saved_model/gmm_ssl/hardness.pkl" |
|
gmm_ssl_plasticity = "./Model/saved_model/gmm_ssl/plasticity.pkl" |
|
gmm_ssl_tensile_strength = "./Model/saved_model/gmm_ssl/tensile_strength.pkl" |
|
gmm_ssl_yield_strength = "./Model/saved_model/gmm_ssl/yield_strength.pkl" |
|
|
|
|
|
''' |
|
Get the composition of input alloy. |
|
''' |
|
|
|
def normalize_molar_ratios(ratios): |
|
normalized_ratios = list() |
|
ele_sum = sum(ratios) |
|
for ele in ratios: |
|
ele = float(ele / ele_sum) |
|
normalized_ratios.append(ele) |
|
return normalized_ratios |
|
|
|
|
|
''' |
|
Load the saved ML models. |
|
''' |
|
|
|
def predict_input(path): |
|
with open(path, 'rb') as p: |
|
loaded_model = joblib.load(p) |
|
return loaded_model |
|
|
|
|
|
''' |
|
Predict the six properties of the input alloy, |
|
with Linear Regression Models, K-Means Semi-supervised Model and GMM Semi-supervised Model. |
|
''' |
|
|
|
def pred(Al, B, C, Co, Cr, Cu, Fe, Ga, Ge, Hf, Li, Mg, Mn, Mo, N, Nb, Ni, Sc, Si, Sn, Ta, Ti, V, W, Y, Zn, Zr, operation): |
|
|
|
|
|
comp = {"Al": Al, "B": B, "C": C, "Co": Co, "Cr": Cr, "Cu": Cu, "Fe": Fe, "Ga": Ga, "Ge": Ge, "Hf": Hf, "Li": Li, |
|
"Mg": Mg, "Mn": Mn, |
|
"Mo": Mo, "N": N, "Nb": Nb, "Ni": Ni, "Sc": Sc, "Si": Si, "Sn": Sn, "Ta": Ta, "Ti": Ti, "V": V, "W": W, |
|
"Y": Y, "Zn": Zn, "Zr": Zr} |
|
|
|
df_values = normalize_molar_ratios(comp.values()) |
|
df = pd.DataFrame(data=[df_values], |
|
columns=["Al", "B", "C", "Co", "Cr", "Cu", "Fe", "Ga", "Ge", "Hf", "Li", "Mg", "Mn", "Mo", "N", |
|
"Nb", "Ni", |
|
"Sc", "Si", "Sn", "Ta", "Ti", "V", "W", "Y", "Zn", "Zr"]) |
|
|
|
|
|
Composition = "" |
|
index = 0 |
|
for k, v in comp.items(): |
|
if v != 0: |
|
Composition = Composition + k + str(round(df_values[index], 2)) |
|
index += 1 |
|
|
|
|
|
|
|
Hardness = predict_input(gmm_ssl_hardness).predict(df) |
|
YieldStrength = predict_input(gmm_ssl_yield_strength).predict(df) |
|
TensileStrength = predict_input(gmm_ssl_tensile_strength).predict(df) |
|
Elongation = predict_input(gmm_ssl_elongation).predict(df) |
|
CompressiveStrength = predict_input(gmm_ssl_compressive_strength).predict(df) |
|
Plasticity = predict_input(gmm_ssl_plasticity).predict(df) |
|
|
|
Hardness = round(float(Hardness),2) |
|
YieldStrength = round(float(YieldStrength),2) |
|
TensileStrength = round(float(TensileStrength),2) |
|
Elongation = round(float(Elongation),2) |
|
CompressiveStrength = round(float(CompressiveStrength),2) |
|
Plasticity = round(float(Plasticity),2) |
|
|
|
return Composition, Hardness, YieldStrength, TensileStrength, Elongation, CompressiveStrength, Plasticity |
|
|
|
|
|
''' |
|
Import the function to Calculate the empirical parameters. |
|
''' |
|
|
|
def empirical_parameter(Al, B, C, Co, Cr, Cu, Fe, Ga, Ge, Hf, Li, Mg, Mn, Mo, N, Nb, Ni, Sc, Si, Sn, Ta, Ti, V, W, Y, Zn, Zr): |
|
|
|
|
|
comp = {"Al": Al, "B": B, "C": C, "Co": Co, "Cr": Cr, "Cu": Cu, "Fe": Fe, "Ga": Ga, "Ge": Ge, "Hf": Hf, "Li": Li, |
|
"Mg": Mg, "Mn": Mn, |
|
"Mo": Mo, "N": N, "Nb": Nb, "Ni": Ni, "Sc": Sc, "Si": Si, "Sn": Sn, "Ta": Ta, "Ti": Ti, "V": V, "W": W, |
|
"Y": Y, "Zn": Zn, "Zr": Zr} |
|
|
|
df_values = normalize_molar_ratios(comp.values()) |
|
print(df_values) |
|
|
|
df_element=[] |
|
df_ratio=[] |
|
index = 0 |
|
for key, value in comp.items(): |
|
if int(value) != 0: |
|
df_element.append(key) |
|
df_ratio.append(df_values[index]) |
|
index += 1 |
|
print(df_element) |
|
print(df_ratio) |
|
|
|
df_elements = [] |
|
for i in df_element: |
|
df_elements.append(Element[i]) |
|
print(df_elements) |
|
|
|
input_ele = EmpiricalParams(element_list=df_elements,mol_ratio=df_ratio) |
|
|
|
|
|
para1 = round(float(input_ele.entropy_mixing()),2) |
|
|
|
|
|
para2 = round(float(input_ele.mean_atomic_radius()),2) |
|
|
|
|
|
para3 = round(float(input_ele.atomic_size_difference()),2) |
|
|
|
|
|
para4= round(float(input_ele.enthalpy_mixing()),2) |
|
|
|
|
|
para5= round(float(input_ele.std_enthalpy_mixing()),2) |
|
|
|
|
|
para6= round(float(input_ele.average_melting_point()),2) |
|
|
|
|
|
para7= round(float(input_ele.std_melting_point()),2) |
|
|
|
|
|
para8= round(float(input_ele.mean_electronegativity()),2) |
|
|
|
|
|
para9= round(float(input_ele.std_electronegativity()),2) |
|
|
|
|
|
para10= round(float(input_ele.average_vec()),2) |
|
|
|
|
|
para11= round(float(input_ele.std_vec()),2) |
|
|
|
|
|
para12= round(float(input_ele.calc_omega()),2) |
|
|
|
|
|
para13= round(float(input_ele.calc_density()),2) |
|
|
|
|
|
para14= round(float(input_ele.calc_price()),2) |
|
|
|
return para1, para2, para3, para4,para5, para6, para7, para8, para9, para10, para11, para12, para13, para14 |
|
|
|
|
|
''' |
|
The function of Clear button. |
|
''' |
|
|
|
def clear_input(): |
|
return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
|
|
|
|
|
''' |
|
Interface Details |
|
''' |
|
|
|
with gr.Blocks() as demo: |
|
|
|
gr.Markdown("# Multi Principal Element Alloy Property Predictor") |
|
gr.Markdown("Input alloy composition to obtain output of alloy properties (sum of composition should be equal to 100)") |
|
|
|
|
|
with gr.Row(): |
|
Al = gr.Number(label="Al") |
|
B = gr.Number(label="B") |
|
C = gr.Number(label="C") |
|
Co = gr.Number(label="Co") |
|
Cr = gr.Number(label="Cr") |
|
Cu = gr.Number(label="Cu") |
|
Fe = gr.Number(label="Fe") |
|
Ga = gr.Number(label="Ga") |
|
Ge = gr.Number(label="Ge") |
|
Hf = gr.Number(label="Hf") |
|
Li = gr.Number(label="Li") |
|
Mg = gr.Number(label="Mg") |
|
Mn = gr.Number(label="Mn") |
|
Mo = gr.Number(label="Mo") |
|
N = gr.Number(label="N") |
|
Nb = gr.Number(label="Nb") |
|
Ni = gr.Number(label="Ni") |
|
Sc = gr.Number(label="Sc") |
|
Si = gr.Number(label="Si") |
|
Sn = gr.Number(label="Sn") |
|
Ta = gr.Number(label="Ta") |
|
Ti = gr.Number(label="Ti") |
|
V = gr.Number(label="V") |
|
W = gr.Number(label="W") |
|
Y = gr.Number(label="Y") |
|
Zn = gr.Number(label="Zn") |
|
Zr = gr.Number(label="Zr") |
|
Composition = gr.Text(label="Alloy Composition") |
|
|
|
|
|
with gr.Row(): |
|
clear = gr.Button("Clear") |
|
submit = gr.Button("Predict") |
|
|
|
with gr.Row(): |
|
Hardness = gr.Number(label="Hardness (VHN)") |
|
YieldStrength = gr.Number(label="Yield Strength (MPa)") |
|
TensileStrength = gr.Number(label="Tensile Strength (MPa)") |
|
Elongation = gr.Number(label="Elongation (%)") |
|
CompressiveStrength = gr.Number(label="Compressive Strength (MPa)") |
|
Plasticity = gr.Number(label="Plasticity (from compression)") |
|
|
|
|
|
with gr.Row(): |
|
entropy_mixing = gr.Number(label="Entropy of Mixing (J/K*mol)") |
|
average_atomic_radius = gr.Number(label="Average Atomic Radius (Angstroms)") |
|
atomic_size_dif = gr.Number(label="Atomic Size Difference") |
|
enthalpy_mixing = gr.Number(label="Enthalpy of Mixing (kJ/mol)") |
|
std_deviation_enthalpy = gr.Number(label="Standard Deviation of Enthalpy") |
|
average_melting_point = gr.Number(label="Average Melting Point (Tm, in Celcius)") |
|
std_deviation_melting_point = gr.Number(label="Standard Deviation of Melting Point") |
|
average_electronegativity = gr.Number(label="Average Electronegativity (X)") |
|
std_deviation_electronegativity= gr.Number(label="Standard Deviation of Electronegativity") |
|
valence_electron_concentration = gr.Number(label="Valence Electron Concentration (VEC)") |
|
std_deviation_valence_electron_concentration = gr.Number(label="Standard Deviation of Valence Electron Concentration (VEC)") |
|
omega = gr.Number(label="The Unitless Parameter Omega") |
|
density = gr.Number(label="Density (g/cm^3)") |
|
price = gr.Number(label="Price (USD/kg)") |
|
|
|
|
|
clear.click(fn=clear_input, inputs=[], |
|
outputs=[Al, B, C, Co, Cr, Cu, Fe, Ga, Ge, Hf, Li, Mg, Mn, Mo, N, Nb, Ni, Sc, Si, Sn, Ta, Ti, V, W, Y, |
|
Zn, Zr, Composition, |
|
Hardness, YieldStrength, TensileStrength, Elongation, CompressiveStrength, Plasticity, entropy_mixing, average_atomic_radius, atomic_size_dif, enthalpy_mixing, |
|
std_deviation_enthalpy, average_melting_point, std_deviation_melting_point, |
|
average_electronegativity, std_deviation_electronegativity, valence_electron_concentration, |
|
std_deviation_valence_electron_concentration, omega, density, price]) |
|
|
|
|
|
|
|
submit.click(fn=pred, |
|
inputs=[Al, B, C, Co, Cr, Cu, Fe, Ga, Ge, Hf, Li, Mg, Mn, Mo, N, Nb, Ni, Sc, Si, Sn, Ta, Ti, V, W, Y, |
|
Zn, Zr], |
|
outputs=[Composition, Hardness, YieldStrength, TensileStrength, Elongation, CompressiveStrength, |
|
Plasticity]) |
|
|
|
|
|
submit.click(fn=empirical_parameter, |
|
inputs=[Al, B, C, Co, Cr, Cu, Fe, Ga, Ge, Hf, Li, Mg, Mn, Mo, N, Nb, Ni, Sc, Si, Sn, Ta, Ti, V, W, Y, |
|
Zn, Zr], |
|
outputs=[entropy_mixing, average_atomic_radius, atomic_size_dif, enthalpy_mixing, |
|
std_deviation_enthalpy, average_melting_point, std_deviation_melting_point, |
|
average_electronegativity, std_deviation_electronegativity, valence_electron_concentration, |
|
std_deviation_valence_electron_concentration, omega, density, price]) |
|
|
|
|
|
''' |
|
Launch the interface. |
|
''' |
|
if __name__ == "__main__": |
|
|
|
|
|
|
|
|
|
demo.launch(share="True") |
|
|