File size: 5,863 Bytes
ad04193 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
import numpy as np
import pandas as pd
np.random.seed(42)
epsilon = 1e-8
class Dataset:
"""
Base dataset class.
Subclasses must implement:
- _load_dataframe()
- _get_columns()
"""
def __init__(self, inverse=False):
self.inverse = inverse
self.df = self._load_dataframe()
self.input_columns, self.output_columns = self._get_columns()
self._compute_stats()
def _load_dataframe(self):
raise NotImplementedError
def _get_columns(self):
raise NotImplementedError
def _compute_stats(self):
self.input_mean = self.df[self.input_columns].mean().to_numpy(dtype=np.float32)
self.input_std = self.df[self.input_columns].std().to_numpy(dtype=np.float32) + epsilon
self.output_mean = self.df[self.output_columns].mean().to_numpy(dtype=np.float32)
self.output_std = self.df[self.output_columns].std().to_numpy(dtype=np.float32) + epsilon
def get_input(self, normalize=False):
data = self.df[self.input_columns].to_numpy(dtype=np.float32)
if normalize:
data = self.normalize_input(data)
return data
def get_output(self, normalize=False):
data = self.df[self.output_columns].to_numpy(dtype=np.float32)
if normalize:
data = self.normalize_output(data)
return data
def __str__(self):
return str(self.df.head())
def normalize_input(self, input_data):
return (input_data - self.input_mean) / self.input_std
def normalize_output(self, output_data):
return (output_data - self.output_mean) / self.output_std
def denormalize_input(self, normalized_input):
return normalized_input * self.input_std + self.input_mean
def denormalize_output(self, normalized_output):
return normalized_output * self.output_std + self.output_mean
class DataThermoforming(Dataset):
"""
Dataset for thermoforming process.
Materials: "CFPEEK", "CFPA6", or "CFRP" which includes both materials.
"""
def __init__(self, material="CFRP", inverse=False, filename="./Data/DataForThermoforming.xlsx"):
self.material = material
self.filename = filename
self.materials_map = {"CF/PEEK": 0.0, "CF/PA6": 1.0}
super().__init__(inverse=inverse)
def _load_dataframe(self):
df = pd.read_excel(self.filename, sheet_name=self.material)
df["Materials"] = df["Materials"].map(self.materials_map).astype(np.float32)
if self.material == "CFPEEK" or self.material == "CFRP":
df = df.drop([7, 78, 101, 129], axis=0)
return df
def _get_columns(self):
if self.inverse:
input_columns = [
"Materials",
"Ply_Number",
"Fiber_Volume_Fractions",
"A1(abs)",
"B1(abs)",
"C1(abs)",
"Stress(Max) MPa",
]
output_columns = [
"Initial_Temp (degree celsius)",
"Punch_Velocity (mm/s)",
"Cooling_Time (s)",
]
else:
input_columns = [
"Ply_Number",
"Fiber_Volume_Fractions",
"Initial_Temp (degree celsius)",
"Punch_Velocity (mm/s)",
"Cooling_Time (s)",
]
output_columns = ["A1(abs)",
"B1(abs)",
"C1(abs)",
"Stress(Max) MPa"]
return input_columns, output_columns
class DataAdditiveManufacturing(Dataset):
def __init__(self, inverse=False, filename="./Data/FDM_192_Simulation_Matrix_Shared.xlsx"):
self.filename = filename
self.material_base_map = {"HDPE": 0.0, "PP": 1.0}
self.fiber_type_map = {"CF": 0.0, "GF": 1.0}
self.build_direction_map = {"Vertical": 1.0, "Horizontal": 0.0}
super().__init__(inverse=inverse)
def _load_dataframe(self):
df = pd.read_excel(self.filename, sheet_name="Batch_1")
df["Material_Base"] = df["Material_Base"].map(self.material_base_map).astype(np.float32)
df["Fiber_Type"] = df["Fiber_Type"].map(self.fiber_type_map).astype(np.float32)
df["Build_Direction"] = df["Build_Direction"].map(self.build_direction_map).astype(np.float32)
return df
def _get_columns(self):
if self.inverse:
input_columns = [
"Phi1_Change",
"Phi2_Change",
"Phi3_Change",
"Phi7_Change",
"Phi8_Change",
"Phi9_Change",
"Global_Max_Stress"
]
output_columns = [
"Material_Base",
"Fiber_Type",
"Vol_Fraction",
# "Build_Direction",
"Extruder_Temp",
"Velocity",
"Bed_Temp"
]
else:
input_columns = [
"Material_Base",
"Fiber_Type",
"Vol_Fraction",
"Build_Direction",
"Extruder_Temp",
"Velocity",
"Bed_Temp"
]
output_columns = [
# "Phi1_Change",
# "Phi2_Change",
# "Phi3_Change",
"Phi7_Change",
"Phi8_Change",
"Phi9_Change",
"Global_Max_Stress"
]
return input_columns, output_columns
if __name__ == "__main__":
dataset = DataAdditiveManufacturing()
input_data = dataset.get_input(normalize=False)
output_data = dataset.get_output(normalize=False)
print("Input shape:", input_data.shape)
print("Output shape:", output_data.shape)
|