Source code for utils.Metadata
import csv
import os
[docs]
class Metadata:
def __init__(self):
self.data = {}
[docs]
def add_nested_field(self, parent_key, key, value):
if parent_key not in self.data:
self.data[parent_key] = {}
self.data[parent_key][key] = value
[docs]
def add_repeating_block(self, block_name, block_data):
if block_name not in self.data:
self.data[block_name] = []
self.data[block_name].append(block_data)
[docs]
def generate_next_model_name(self, base_name, csv_filename="metadata.csv"):
if not os.path.isfile(csv_filename):
return f"{base_name}_1"
with open(csv_filename, mode='r') as file:
reader = csv.reader(file)
rows = list(reader)
if len(rows) <= 1:
return f"{base_name}_1"
last_model_name = rows[-1][0]
last_model_number = int(last_model_name.split('_')[-1])
next_model_number = last_model_number + 1
return f"{base_name}_{next_model_number}"
[docs]
def save_to_csv(self, filename="metadata.csv"):
file_exists = os.path.isfile(filename)
with open(filename, mode='a', newline='') as file: # Open the file in append mode
writer = csv.writer(file)
if not file_exists:
# Write headers if the file does not already exist
headers = []
for key in self.data:
if isinstance(self.data[key], dict):
for subkey in self.data[key]:
headers.append(f"{key} ({subkey})")
elif isinstance(self.data[key], list):
for i, item in enumerate(self.data[key]):
for subkey in item:
headers.append(f"{key} {i+1} ({subkey})")
else:
headers.append(key)
writer.writerow(headers)
# Prepare row data
row = []
for key in self.data:
if isinstance(self.data[key], dict):
for subkey in self.data[key]:
row.append(self.data[key][subkey])
elif isinstance(self.data[key], list):
for item in self.data[key]:
for subkey in item:
row.append(item[subkey])
else:
row.append(self.data[key])
writer.writerow(row)
'''
# Usage example:
metadata = DynamicMetadata()
metadata.set_field("Model Name", "PINN_Model")
metadata.set_field("Inlet Points File", "inlet_points.csv")
metadata.set_field("Airfoil Points File", "airfoil_points.csv")
metadata.set_field("Fluid Field Points File", "fluid_field_points.csv")
metadata.add_nested_field("Inlet Boundary Conditions", "u", 1.0)
metadata.add_nested_field("Inlet Boundary Conditions", "v", 0.0)
metadata.add_nested_field("Inlet Boundary Conditions", "p", 101325)
metadata.add_nested_field("Airfoil Boundary Conditions", "u", 0.0)
metadata.add_nested_field("Airfoil Boundary Conditions", "v", 0.0)
metadata.add_nested_field("Airfoil Boundary Conditions", "p", 101325)
metadata.set_field("Execution Device", "cuda:0")
metadata.set_field("Model Structure", "2 hidden layers, 20 neurons each")
metadata.add_repeating_block("Training Parameters", {"optimizer": "Adam", "iterations": 1000, "batch_size": 32, "epochs": 10})
metadata.add_repeating_block("Training Parameters", {"optimizer": "SGD", "iterations": 2000, "batch_size": 64, "epochs": 20})
metadata.save_to_csv("metadata.csv")
'''