diff --git a/.gitattributes b/.gitattributes
index 520a1fc54a7d7b0c8be40e84dbdd78a1bc056e73..280e186cd066c9b99ecb7df9c1a60f8e2827842a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -36,6 +36,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
material_res3.png filter=lfs diff=lfs merge=lfs -text
figures/material_res3.png filter=lfs diff=lfs merge=lfs -text
figures/forming_angle.png filter=lfs diff=lfs merge=lfs -text
+metadata.json filter=lfs diff=lfs merge=lfs -text
data_generation/processed_dataset/config_1/metadata.json filter=lfs diff=lfs merge=lfs -text
hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/best_model.pt filter=lfs diff=lfs merge=lfs -text
inverse_design_demo/model_checkpoint.pth filter=lfs diff=lfs merge=lfs -text
diff --git a/README.md b/README.md
index b78fc00faae40bc47b7822a7b28e4d1f14d6ccbb..80b6e1203f4dd949a7f077ebfe230d1b56f6e579 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,12 @@
---
-title: Thermoforming inverse design
+title: Inverse Design Demo
+emoji: 📚
+colorFrom: green
+colorTo: blue
sdk: streamlit
-emoji: 🚀
-colorFrom: red
-colorTo: red
-short_description: Thermoforming inverse design
+app_file: app.py
+python_version: "3.10"
+pinned: false
---
-# 🏂 US Population Dashboard
-A dashboard web app template built in Python using Streamlit.
-
-## Demo App
-
-[](https://population-dashboard.streamlit.app/)
-
-## Colab notebook
-[](https://github.com/dataprofessor/population-dashboard/blob/master/US_Population.ipynb)
-
-## Prerequisite libraries
-Here are the Python libraries used in the creation of this dashboard app
-
-## Data source
-US Population data spanning the duration of 2010-2019 was obtained from the [U.S. Census Bureau](https://www.census.gov/data/datasets/time-series/demo/popest/2010s-state-total.html).
-
-## Reference
-A talk entitled [_Crafting a Dashboard App in Python using Streamlit_](https://budapestbi.hu/2023/hu/program/speakers/chanin-nantasenamat/) showing how to build this app is given at the [Budapest BI Forum (Data Visualization track)](https://budapestbi.hu/2023/hu/en/program-data-visualization-track/) on November 22, 2023.
\ No newline at end of file
+Thermoplastic composite inverse design demo.
\ No newline at end of file
diff --git a/app.py b/app.py
index e08cf5513204e26585c5bf3691581025e9658890..dac182bc7fbef42692719cbd2957c3b18d9bce90 100644
--- a/app.py
+++ b/app.py
@@ -1,450 +1,14 @@
-#######################
-# Import libraries
-import streamlit as st
-import pandas as pd
-import altair as alt
-# import plotly.express as px
-from PIL import Image # Used to open and handle image files
-import matplotlib
-import matplotlib.pyplot as plt
-import numpy as np
-
-from model_inverse import inverse_design
-
-#######################
-# Page configuration
-st.set_page_config(
- page_title="Inverse Design of Thermoplastic Composites for Thermoforming",
-# page_icon="🏂",
- layout="wide",
- initial_sidebar_state="collapsed")
-
-alt.themes.enable('default')
-
-#######################
-# CSS styling
-
-st.markdown("""
-
-""", unsafe_allow_html=True)
-
-st.markdown("""
-
-""", unsafe_allow_html=True)
-
-st.markdown("""
-
-""", unsafe_allow_html=True)
-
-st.markdown("""
-
-""", unsafe_allow_html=True)
-
-
-st.set_page_config(initial_sidebar_state="collapsed")
-
-st.markdown(
- """
-
-""",
- unsafe_allow_html=True,
-)
-
-#######################
-font = {'size' : 18}
-
-matplotlib.rc('font', **font)
-
-#######################
-if 'input_changed' not in st.session_state:
- st.session_state.input_changed= False
-def input_typed_in():
- st.session_state.input_changed= True
-
-if 'forming_input_changed' not in st.session_state:
- st.session_state.forming_input_changed= False
-def forming_typed_in():
- st.session_state.forming_input_changed= True
-
-
-
-if 'input_curve_button_clicked' not in st.session_state:
- st.session_state.input_curve_button_clicked= False
-def input_curve_click():
- st.session_state.input_curve_button_clicked = True
-
-if 'material_design_button_clicked' not in st.session_state:
- st.session_state.material_design_button_clicked= False
-def material_design_click():
- st.session_state.material_design_button_clicked = True
-
-if 'forming_input_button_clicked' not in st.session_state:
- st.session_state.forming_input_button_clicked= False
-def forming_input_click():
- st.session_state.forming_input_button_clicked = True
-
-if 'forming_design_button_clicked' not in st.session_state:
- st.session_state.forming_design_button_clicked= False
-def forming_design_click():
- st.session_state.forming_design_button_clicked = True
-
-
-
-#######################
-# Load data
-#df_reshaped = pd.read_csv('data/us-population-2010-2019-reshaped.csv')
-
-######## Initialize data #############
-E1aV=0 # initial longitudinal stiffness
-E1bV=0 # 10% strain longitudinal stiffness
-G12aV=0 # initial longitudinal stiffness
-G12bV=0 # 10% strain longitudinal stiffness
-nlayers=4
-vf=0.6
-angle=30
-
-#######################
-# Main Panel
-
-data_materials={
- 'Matrix':['ABS','Polyurethane','Nylon 6','Nylon 6','Nylon 66','PE','PP'],
- 'Filler':['Carbon Black','Glass Fiber','Glass Fiber','Carbon Fiber','Glass Fiber','Carbon Fiber','Glass Fiber'],
- 'VF':['15%','20%','20%','40%','30%','20%','30%'],
- 'Feature':['Blend','Extruded','Molded','Molded','Molded','Molded','Molded']
- }
-
-data_physical = {
- 'Forming T (C)': ['180', '185', '190'],
- 'Punch V (m/s)': ['1.05', '1.8','1.67'],
- 'Cooling time (s)': ['45','80','120'],
- 'Holding force (kN)': ['23','24','25']
- }
-
-st.title("Inverse Design of Thermoplastic Composites for Thermoforming")
-st.write("")
-st.write("")
-st.write("")
-st.write(r"$\textsf{\textbf{\Large Material Design Requirements}}$")
-#st.text_input(r"$\textsf{\textbf{\Large Material Design Requirements}}$")
-
-# First row with 5 columns
-col1_row1, col2_row1, col3_row1, col4_row1, col5_row1= st.columns([0.25,0.25,0.25,0.25,0.25])
-with col1_row1:
- with st.container(border=False): # Container with a border
- E1aV= st.number_input("Initial x-stiffness (MPa):", value=2000.00, format="%.2f", width=250, key="E1a", on_change=input_typed_in)
- E1bV= st.number_input("10% strain x-stiffness (MPa):", value=1000.00, format="%.2f", width=250, key="E1b", on_change=input_typed_in)
- S1bV= st.number_input("10% strain x-stress (MPa):", value=1000.00, format="%.2f", width=250, key="S1b", on_change=input_typed_in)
-
-with col2_row1:
- with st.container(border=False): # Container with a border
- E2aV= st.number_input("Initial y-stiffness (MPa):", value=2000.00, format="%.2f", width=250, key="E2a", on_change=input_typed_in)
- E2bV= st.number_input("10% strain y-stiffness (MPa):", value=1000.00, format="%.2f", width=250, key="E2b", on_change=input_typed_in)
- S2bV= st.number_input("10% strain y-stress (MPa):", value=1000.00, format="%.2f", width=250, key="S2b", on_change=input_typed_in)
-
-
-with col3_row1:
- with st.container(border=False): # Container with a border
- G12aV= st.number_input("Initial shear stiffness (MPa):", value=1800.00, format="%.2f", width=250, key="G12a", on_change=input_typed_in)
- G12bV= st.number_input("0.1 shear strain stiffness (MPa):", value=1000.00, format="%.2f", width=250, key="G12b", on_change=input_typed_in)
- S12bV= st.number_input("10% strain shear stress (MPa):", value=1000.00, format="%.2f", width=250, key="S12b", on_change=input_typed_in)
-
-with col4_row1:
- with st.container(border=False): # Container with a border
- v12aV= st.number_input("Initial Poisson's ratio (vxy):", value=0.3, format="%.2f", width=250, key="v12a", on_change=input_typed_in)
- v12bV= st.number_input("0.1 strain Poisson's ratio (vxy):", value=0.4, format="%.2f", width=250, key="v12b", on_change=input_typed_in)
-
-
-with col5_row1:
- with st.container(border=False): # Container with a border
- v21aV= st.number_input("Initial Poisson's ratio (vyx):", value=0.3, format="%.2f", width=250, key="v21a", on_change=input_typed_in)
- v21bV= st.number_input("0.1 strain Poisson's ratio (vyx):", value=0.4, format="%.2f", width=250, key="v21b", on_change=input_typed_in)
-
-
-
-st.write("")
-if st.session_state.input_changed == True:
- st.session_state.input_curve_button_clicked = False
- st.session_state.material_design_button_clicked = False
- st.session_state.forming_input_button_clicked = False
- st.session_state.forming_design_button_clicked = False
- st.session_state.input_changed = False
-
-st.button("Generate required stress-strain curves", use_container_width=True, on_click=input_curve_click)
-
-if st.session_state.input_curve_button_clicked == True:
- #st.write(E1aV)
- #st.write(E1bV)
- x = np.linspace(0, 0.1, 20)
- A = np.array([[0.2, 0.03], [0.01, 0.001]])
- b = np.array([E1bV-E1aV, S1bV-E1aV*0.1])
- a = np.linalg.solve(A, b)
- y1= E1aV*x + a[0]*x**2 + a[1]*x**3
- b = np.array([E2bV-E2aV, S2bV-E2aV*0.1])
- a = np.linalg.solve(A, b)
- y2= E2aV*x + a[0]*x**2 + a[1]*x**3
- b = np.array([G12bV-G12aV, S12bV-G12aV*0.1])
- a = np.linalg.solve(A, b)
- y3= G12aV*x + a[0]*x**2 + a[1]*x**3
-
- y4 = v12aV*x + (v12bV - v12aV)/0.2*x*x
- y5 = v21aV*x + (v21bV - v21aV)/0.2*x*x
-
-
- #ylimit=np.max([np.max(y1),np.max(y2), np.max(y3)])
- # 2nd row with 3 columns
- col1_row2, col2_row2, col3_row2, col4_row2, col5_row2= st.columns([0.2,0.2,0.2,0.2,0.2])
- with col1_row2:
- with st.container(border=False): # Container with a border
- fig, ax = plt.subplots()
- ax.plot(x, y1)
- #ax.set_ylim([0, ylimit])
- ax.set_ylabel('Stress (MPa)')
- ax.set_xlabel('Strain')
- ax.set_title('Longitudinal stress-strain (xx)')
- st.pyplot(fig)
- with col2_row2:
- with st.container(border=False): # Container with a border
- fig, ax = plt.subplots()
- ax.plot(x, y2)
- #ax.set_ylim([0, ylimit])
- ax.set_ylabel('Stress (MPa)')
- ax.set_xlabel('Strain')
- ax.set_title('Transverse stress-strain (yy)')
- st.pyplot(fig)
- with col3_row2:
- with st.container(border=False): # Container with a border
- fig, ax = plt.subplots()
- ax.plot(x, y3)
- #ax.set_ylim([0, ylimit])
- ax.set_ylabel('Stress (MPa)')
- ax.set_xlabel('Strain')
- ax.set_title('Shear stress-strain (xy')
- st.pyplot(fig)
- with col4_row2:
- with st.container(border=False): # Container with a border
- fig, ax = plt.subplots()
- ax.plot(x, -y4)
- #ax.set_ylim([-0.05, 0])
- ax.set_xlabel('Strain xx')
- ax.set_ylabel('Strain yy')
- ax.set_title('Strain ratio with stress xx')
- st.pyplot(fig)
- with col5_row2:
- with st.container(border=False): # Container with a border
- fig, ax = plt.subplots()
- ax.plot(x, -y5)
- #ax.set_ylim([-0.05, 0])
- ax.set_xlabel('Strain yy')
- ax.set_ylabel('Strain xx')
- ax.set_title('Strain ratio with stress yy')
- st.pyplot(fig)
-
- st.write("")
- st.button("Material Inverse Design", use_container_width=True, on_click=material_design_click)
- if st.session_state.material_design_button_clicked == True:
- #st.write("")
-
- # 3rd row with 3 columns
- col1_row3, col2_row3, col3_row3, col4_row3, col5_row3= st.columns([0.15,0.15,0.23,0.23,0.23])
- with col1_row3:
- with st.container(border=False): # Container with a border
- st.write("Matrix material = ", "PEEK")
- st.write("Fiber material = ", "Carbon")
-
- with col2_row3:
- with st.container(border=False): # Container with a border
- st.write("Number of layers =", nlayers)
- st.write("Volume fraction =", vf)
-
- with col3_row3:
- with st.container(border=False): # Container with a border
- df = pd.DataFrame({'Ply': [], 'Orientation': []})
- plies = np.array([[1,90], [2,45], [3,-45], [4,-90]])
- plies_df=pd.DataFrame(plies, columns=df.columns)
- df = pd.concat([df, plies_df], ignore_index=True)
- st.dataframe(df, hide_index=True)
-
-
- # 3.5rd row with 3 columns
- col1_row35, col2_row35, col3_row35, col4_row35, col5_row35= st.columns([0.2,0.2,0.2,0.2,0.2])
- with col1_row35:
- with st.container(border=False): # Container with a border
- image = Image.open('figures/material_res3.png')
- new_image = image.resize((250, 200))
- st.image(new_image, caption='')
-
- with col2_row35:
- with st.container(border=False): # Container with a border
- image = Image.open('figures/material_res3.png')
- new_image = image.resize((250, 200))
- st.image(new_image, caption='')
-
- with col3_row35:
- with st.container(border=False): # Container with a border
- image = Image.open('figures/material_res3.png')
- new_image = image.resize((250, 200))
- st.image(new_image, caption='')
-
- with col4_row35:
- with st.container(border=False): # Container with a border
- image = Image.open('figures/material_res3.png')
- new_image = image.resize((250, 200))
- st.image(new_image, caption='')
-
-
- with col5_row35:
- with st.container(border=False): # Container with a border
- image = Image.open('figures/material_res3.png')
- new_image = image.resize((250, 200))
- st.image(new_image, caption='')
-
-
- st.write("")
- st.button("Thermoforming Requirements", use_container_width=True, on_click=forming_input_click)
- if st.session_state.forming_input_button_clicked == True:
- #st.write("")
- # 4th row with 3 columns
- col1_row4, col2_row4, col3_row4, col4_row4, col5_row4 = st.columns([0.16,0.16,0.2,0.24,0.24])
- with col1_row4:
- with st.container(border=False): # Container with a border
- st.write("Matrix material", "PEEK")
- st.write("Fiber material=", "Carbon")
- st.write("Number of layers=", nlayers)
- st.write("Volume fraction=", vf)
- with col2_row4:
- with st.container(border=False): # Container with a border
- df = pd.DataFrame({'Ply': [], 'Orientation': []})
- plies = np.array([[1,90], [2,45], [3,-45], [4,-90]])
- plies_df=pd.DataFrame(plies, columns=df.columns)
- df = pd.concat([df, plies_df], ignore_index=True)
- st.dataframe(df, hide_index=True)
-
- with col3_row4:
- with st.container(border=False): # Container with a border
- image = Image.open('figures/forming_angle.png')
- new_image = image.resize((250, 200))
- st.image(new_image, caption='')
-
- with col4_row4:
- with st.container(border=False): # Container with a border
- angleA= st.number_input("Maximum warpage angle A (degree):", format="%.2f", width=300, key="A", on_change=forming_typed_in)
- angleB= st.number_input("Maximum warpage angle B (degree):", format="%.2f", width=300, key="B", on_change=forming_typed_in)
-
-
- with col5_row4:
- with st.container(border=False): # Container with a border
- angleC= st.number_input("Maximum warpage angle C (degree):", format="%.2f", width=300, key="C", on_change=forming_typed_in)
- max_stress= st.number_input("Maximum residual stress (MPa):", format="%.2f", width=300, key="max_stress", on_change=forming_typed_in)
-
-
- st.write("")
- if st.session_state.forming_input_changed == True:
- st.session_state.forming_design_button_clicked = False
- st.session_state.forming_input_changed = False
- st.button("Thermoforming process design", use_container_width=True, on_click=forming_design_click)
- if st.session_state.forming_design_button_clicked == True:
- best = inverse_design(ply_number=nlayers,
- fiber_vf=vf,
- y_target=[angleA, angleB, angleC, max_stress],
- n_restarts=5,
- epochs=100)
- # 5th row with 3 columns
- col1_row5, col2_row5,col3_row5 = st.columns([0.25,0.25,0.25])
- with col1_row5:
- with st.container(border=False): # Container with a border
- st.write("Forming temperature (C)=", best["input"][0])
- with col2_row5:
- with st.container(border=False): # Container with a border
- st.write("Punching velocity (mm/s)=", best["input"][1])
- with col3_row5:
- with st.container(border=False): # Container with a border
- st.write("Cooling time (s)=", best["input"][2])
-
-
-
-
+import os
+import runpy
+import sys
+APP_DIR = os.path.dirname(os.path.abspath(__file__))
+DEMO_DIR = os.path.join(APP_DIR, "inverse_design_demo")
+DEMO_APP = os.path.join(DEMO_DIR, "app.py")
+# Execute the original Streamlit script in this process.
+if DEMO_DIR not in sys.path:
+ sys.path.insert(0, DEMO_DIR)
+os.chdir(DEMO_DIR)
+runpy.run_path(DEMO_APP, run_name="__main__")
diff --git a/data_generation/hf_space_generation_ro/README.md b/data_generation/hf_space_generation_ro/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..00ea133f3b7b3eaec28eaed25467e68862978ba2
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/README.md
@@ -0,0 +1,23 @@
+# Hybrid Diffusion Material Generation (RO) — Hugging Face Space
+
+This folder is intended to be uploaded as a standalone Hugging Face Space.
+
+## What it does
+- Provides **5 groups of coefficient sliders** (RO params, 5×3) with min/max ranges loaded from `metadata_ro.json`.
+- Shows **real-time curve previews** derived from the current coefficients.
+- On **Generate**, runs diffusion sampling from a trained checkpoint and then runs **N simulations (1–5)** (instances `1..N`) and overlays the curves.
+
+## Expected inputs (paths)
+By default the app reads paths from environment variables (recommended for Spaces):
+- `MG_CHECKPOINT_DIR`: directory containing `training_config.json` and a model checkpoint (`best_model.pt`).
+- `MG_DATA_DIR`: processed data directory containing `metadata_ro.json` (for coefficient ranges and normalization stats).
+- `MG_CURVE_DIR`: directory containing curve files like `CPP_0.0924_1_11.txt`, etc.
+
+You can also edit these paths directly in the UI.
+
+## Run locally
+```bash
+pip install -r requirements.txt
+python app.py
+```
+
diff --git a/data_generation/hf_space_generation_ro/app.py b/data_generation/hf_space_generation_ro/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f0114a3ae52f13b51269bf9d0ed55faaef9e953
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/app.py
@@ -0,0 +1,474 @@
+from __future__ import annotations
+
+import os
+from functools import lru_cache
+from typing import List
+
+import gradio as gr
+import numpy as np
+import torch
+
+from space_lib.infer import (
+ load_model_bundle,
+ postprocess_sample,
+ sample,
+)
+from space_lib.metadata import (
+ load_metadata_ro,
+ normalize_ro13,
+ ro13_from_ro15,
+ ro15_from_groups,
+ ro_groups_from_ro15,
+)
+from space_lib.plots import plot_condition_and_simulations
+from space_lib.ro_curves import plot_ro_lateral_relation, plot_ro_stress_relation
+from space_lib.simulate import default_lam_dir, simulate_instances
+
+
+DEFAULT_CHECKPOINT_DIR = os.environ.get(
+ "MG_CHECKPOINT_DIR",
+ "/project/luofeng/feiyang/MaterialGeneration/hybrid_diffusion_material_generation_ro_fitting/checkpoints/config_1_continuous_100_epoch/exp_20260108_180412",
+)
+DEFAULT_DATA_DIR = os.environ.get(
+ "MG_DATA_DIR",
+ "/project/luofeng/feiyang/MaterialGeneration/data_generation/processed_dataset_ro",
+)
+DEFAULT_CURVE_DIR = os.environ.get(
+ "MG_CURVE_DIR",
+ "/project/luofeng/feiyang/MaterialGeneration/data_generation/shahriar_modified_2025_12/RVE_Datasets",
+)
+
+# UI simplification: hard-code these for the Space (no controls exposed)
+CHECKPOINT_DIR = DEFAULT_CHECKPOINT_DIR
+DATA_DIR = DEFAULT_DATA_DIR
+CURVE_DIR = DEFAULT_CURVE_DIR
+LAM_DIR = default_lam_dir()
+
+NORMALIZATION_METHOD = "zscore"
+DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
+REMASK_PROB = 0.1
+ANGLE_RESOLUTION = 1.0
+X_MAX = 0.1 # fixed
+PLOT_HEIGHT = 260 # px: match ~3 stacked sliders visually
+
+
+@lru_cache(maxsize=4)
+def _get_meta(data_dir: str):
+ return load_metadata_ro(data_dir)
+
+
+_MODEL_CACHE = {}
+
+
+def _get_model(checkpoint_dir: str, device: str, angle_resolution: float):
+ key = (checkpoint_dir, device, float(angle_resolution))
+ if key not in _MODEL_CACHE:
+ _MODEL_CACHE[key] = load_model_bundle(checkpoint_dir, device=device, angle_resolution=angle_resolution)
+ return _MODEL_CACHE[key]
+
+
+def _angle_categories_from_meta(meta, angle_resolution: float) -> np.ndarray:
+ angle_min_raw = float(meta.raw.get("angle_min", 0.0))
+ angle_max_raw = float(meta.raw.get("angle_max", 90.0))
+ res = float(angle_resolution)
+ ang_min = np.floor(angle_min_raw / res) * res
+ ang_max = np.ceil(angle_max_raw / res) * res
+ num = int((ang_max - ang_min) / res) + 1
+ return np.linspace(ang_min, ang_max, num, dtype=np.float32)
+
+
+def _default_ro15_values(data_dir: str) -> np.ndarray:
+ meta = _get_meta(data_dir)
+ if meta.ro_mean_full is not None and meta.ro_mean_full.size == 15:
+ return meta.ro_mean_full.astype(np.float32)
+ return ((meta.ro_min_full + meta.ro_max_full) * 0.5).astype(np.float32)
+
+
+_RO_FLAT_IDXS_SHOWN = (0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14) # hide c for groups 2 & 4
+
+
+def _load_test_ro15(data_dir: str, idx: int) -> np.ndarray:
+ """
+ Load RO coefficients from held-out test set (processed_dataset_ro/test_data_ro.npz).
+ Returns flattened (15,) corresponding to [5,3] row-major.
+ """
+ npz_path = os.path.join(data_dir, "test_data_ro.npz")
+ if not os.path.exists(npz_path):
+ raise FileNotFoundError(f"Missing test file: {npz_path}")
+ data = np.load(npz_path)
+ if "ramberg_osgood_params" not in data:
+ raise KeyError(f"'ramberg_osgood_params' not found in {npz_path}. Keys: {list(data.keys())}")
+ arr = data["ramberg_osgood_params"] # (N,5,3)
+ n = int(arr.shape[0])
+ if n <= 0:
+ raise ValueError(f"No samples in {npz_path}")
+ idx = int(idx) % n
+ ro_5x3 = np.asarray(arr[idx], dtype=np.float32)
+ if ro_5x3.shape != (5, 3):
+ raise ValueError(f"Unexpected shape for ramberg_osgood_params[{idx}]: {ro_5x3.shape}")
+ return ro_5x3.reshape(-1) # (15,)
+
+
+def _ro15_to_ui13(ro15: np.ndarray) -> list[float]:
+ ro15 = np.asarray(ro15, dtype=np.float32).reshape(-1)
+ if ro15.size != 15:
+ raise ValueError(f"Expected 15 values, got {ro15.size}")
+ return [round(float(ro15[i]), 3) for i in _RO_FLAT_IDXS_SHOWN]
+
+
+def _build_groups_from_slider_values(vals: List[float]) -> np.ndarray:
+ """
+ UI exposes only 13 coeffs:
+ - Group 1: a,b,c
+ - Group 2: a,b (c hidden/unused)
+ - Group 3: a,b,c
+ - Group 4: a,b (c hidden/unused)
+ - Group 5: a,b,c
+
+ Internally: return (5,3) with c for groups 2&4 forced to 0.
+ """
+ if len(vals) != 13:
+ raise ValueError(f"Expected 13 slider values, got {len(vals)}")
+ ro15 = np.zeros(15, dtype=np.float32)
+ for i, flat_idx in enumerate(_RO_FLAT_IDXS_SHOWN):
+ ro15[int(flat_idx)] = float(vals[i])
+ ro15[5] = 0.0
+ ro15[11] = 0.0
+ return ro15.reshape(5, 3)
+
+
+def ui_preview_11_stress(a: float, b: float, c: float):
+ meta = _get_meta(DATA_DIR)
+ fig = plot_ro_stress_relation(
+ a=a, b=b, c=c, x_scale=meta.eps_11_scale, x_max=X_MAX, title="Mode 11: σ11(ε11)"
+ )
+ return fig
+
+
+def ui_preview_11_lat(a: float, b: float):
+ meta = _get_meta(DATA_DIR)
+ fig = plot_ro_lateral_relation(
+ a=a, b=b, x_scale=meta.eps_11_scale, y_scale=meta.eps_22_scale, x_max=X_MAX, title="Mode 11: ε22(ε11)"
+ )
+ return fig
+
+
+def ui_preview_22_stress(a: float, b: float, c: float):
+ meta = _get_meta(DATA_DIR)
+ fig = plot_ro_stress_relation(
+ a=a, b=b, c=c, x_scale=meta.eps_22_scale, x_max=X_MAX, title="Mode 22: σ22(ε22)"
+ )
+ return fig
+
+
+def ui_preview_22_lat(a: float, b: float):
+ meta = _get_meta(DATA_DIR)
+ fig = plot_ro_lateral_relation(
+ a=a, b=b, x_scale=meta.eps_22_scale, y_scale=meta.eps_11_scale, x_max=X_MAX, title="Mode 22: ε11(ε22)"
+ )
+ return fig
+
+
+def ui_preview_12_stress(a: float, b: float, c: float):
+ meta = _get_meta(DATA_DIR)
+ fig = plot_ro_stress_relation(
+ a=a, b=b, c=c, x_scale=meta.eps_12_scale, x_max=X_MAX, title="Mode 12: σ12(ε12)"
+ )
+ return fig
+
+
+def ui_generate(
+ n_simulations: int,
+ *slider_vals: float,
+):
+ # Streaming generator: yields (plot, info, status_log) updates
+ meta = _get_meta(DATA_DIR)
+ log_lines: list[str] = []
+ def _push(msg: str):
+ log_lines.append(str(msg))
+ # keep log reasonably bounded
+ if len(log_lines) > 200:
+ log_lines[:] = log_lines[-200:]
+ return "\n".join(log_lines)
+
+ yield gr.update(), gr.update(), _push("Generating (diffusion sampling)...")
+ groups = _build_groups_from_slider_values(list(slider_vals))
+ ro15 = ro15_from_groups(groups)
+ ro13_raw = ro13_from_ro15(ro15)
+ cond_norm = normalize_ro13(ro13_raw, meta, NORMALIZATION_METHOD)
+
+ bundle = _get_model(CHECKPOINT_DIR, device=DEVICE, angle_resolution=ANGLE_RESOLUTION)
+ use_discrete_angles = bundle.use_discrete_angles
+ angle_categories = _angle_categories_from_meta(meta, ANGLE_RESOLUTION) if use_discrete_angles else None
+
+ cond_t = torch.tensor(cond_norm, dtype=torch.float32, device=DEVICE).view(1, -1)
+ out = sample(
+ model=bundle.model,
+ disc_diff_mat=bundle.disc_diff_mat,
+ disc_diff_vf_category=bundle.disc_diff_vf_category,
+ disc_diff_layer=bundle.disc_diff_layer,
+ disc_diff_angle=bundle.disc_diff_angle,
+ cont_diff=bundle.cont_diff,
+ cond=cond_t,
+ mask_ids=bundle.mask_ids,
+ device=DEVICE,
+ remask_prob=float(REMASK_PROB),
+ use_discrete_angles=use_discrete_angles,
+ )
+
+ mat_type, vf, upper_angles = postprocess_sample(out, use_discrete_angles=use_discrete_angles, angle_categories_deg=angle_categories)
+ # Continuous-angle model is constrained to (0, pi/2) in-model, but keep a defensive clip to metadata range.
+ ang_min = float(meta.raw.get("angle_min", 0.0))
+ ang_max = float(meta.raw.get("angle_max", 90.0))
+ upper_angles = [min(max(float(a), ang_min), ang_max) for a in upper_angles]
+ _push(f"Generation done.")
+ _push(f"Generated material: {mat_type}")
+ _push(f"Generated vf: {vf:.4f}")
+ _push(f"Generated upper angles (deg): {upper_angles}")
+ _push(f"Simulating {int(n_simulations)} instance(s)...")
+
+ # Show condition-only plot immediately
+ fig0 = plot_condition_and_simulations(
+ groups,
+ (meta.eps_11_scale, meta.eps_22_scale, meta.eps_12_scale),
+ {},
+ )
+ info0 = (
+ f"Generated material: {mat_type}\n"
+ f"Generated vf: {vf:.4f}\n"
+ f"Generated upper angles (deg): {upper_angles}\n"
+ f"Simulated instances: []"
+ )
+ yield fig0, info0, "\n".join(log_lines)
+
+ # Simulate sequentially so we can update status per instance.
+ sim_by_instance = {}
+ instances = list(range(1, int(n_simulations) + 1))
+ for inst in instances:
+ _push(f"Simulating instance {inst}/{len(instances)}...")
+ try:
+ sim_part = simulate_instances(
+ curve_dir=CURVE_DIR,
+ lam_dir=LAM_DIR,
+ mat_type=mat_type,
+ vf=vf,
+ upper_angles=upper_angles,
+ instances=[inst],
+ num_output_points=10,
+ )
+ sim_by_instance.update(sim_part)
+ _push(f"Instance {inst} done.")
+ except Exception as e:
+ _push(f"Instance {inst} failed: {type(e).__name__}: {e}")
+
+ # Update plot incrementally after each instance attempt
+ fig_i = plot_condition_and_simulations(
+ groups,
+ (meta.eps_11_scale, meta.eps_22_scale, meta.eps_12_scale),
+ sim_by_instance,
+ )
+ info_i = (
+ f"Generated material: {mat_type}\n"
+ f"Generated vf: {vf:.4f}\n"
+ f"Generated upper angles (deg): {upper_angles}\n"
+ f"Simulated instances: {sorted(sim_by_instance.keys())}"
+ )
+ yield fig_i, info_i, "\n".join(log_lines)
+
+ _push("Done.")
+ yield fig_i, info_i, "\n".join(log_lines)
+
+
+def build_app():
+ meta = _get_meta(DATA_DIR)
+ # Default initialization uses dataset-wide mean (or min/max midpoint).
+ # You can optionally load a held-out test condition via the UI accordion.
+ ro15_init = _default_ro15_values(DATA_DIR)
+ ro_min = meta.ro_min_full
+ ro_max = meta.ro_max_full
+
+ with gr.Blocks(
+ css="""
+ /* Make slider numeric input boxes consistent width */
+ .gradio-container .gr-slider input[type="number"],
+ .gradio-container .gr-number input[type="number"],
+ .gradio-container input[type="number"] {
+ width: 78px !important;
+ min-width: 78px !important;
+ }
+
+ /* --- Layout: make plot columns match the 3-slider column height; keep 2-slider column top-aligned --- */
+ #mode11_row, #mode22_row, #mode12_row {
+ align-items: stretch !important; /* row height = tallest column (3 sliders) */
+ }
+ #mode11_col3, #mode22_col3, #mode12_col3 {
+ align-self: flex-start !important; /* 2-slider column should NOT stretch */
+ }
+ #mode11_col2, #mode11_col4, #mode22_col2, #mode22_col4, #mode12_col2, #mode12_col4 {
+ display: flex !important;
+ flex-direction: column !important;
+ }
+ #mode11_stress_plot, #mode11_lat_plot, #mode22_stress_plot, #mode22_lat_plot, #mode12_stress_plot {
+ flex: 1 1 auto !important;
+ height: 100% !important;
+ min-height: 0 !important;
+ }
+ #mode11_stress_plot img, #mode11_lat_plot img, #mode22_stress_plot img, #mode22_lat_plot img, #mode12_stress_plot img {
+ height: 100% !important;
+ width: 100% !important;
+ object-fit: contain;
+ }
+ """
+ ) as demo:
+ gr.Markdown("## Hybrid Diffusion Material Generation (RO)")
+ n_simulations = gr.Slider(1, 5, value=3, step=1, label="Number of simulations (instances 1..N)")
+
+ with gr.Accordion("Init from test set (optional)", open=False):
+ gr.Markdown(
+ "Loads coefficients from `processed_dataset_ro/test_data_ro.npz` → `ramberg_osgood_params[idx]`.\n"
+ "This is useful to sanity-check performance on held-out conditions."
+ )
+ test_idx = gr.Number(value=0, precision=0, label="test_data_ro.npz index (int)")
+ load_test_btn = gr.Button("Load this test index into sliders")
+ rand_test_btn = gr.Button("Load a random test index into sliders")
+ test_status = gr.Markdown("")
+
+ # --- Mode 11 ---
+ gr.Markdown(
+ "### Mode 11\n"
+ "**Stress relationship:**\n"
+ "$$\\sigma_{11} = a\\,(\\varepsilon_{11}/s_{11}) + b\\,(\\varepsilon_{11}/s_{11})^{c}$$\n"
+ "**Lateral relationship:**\n"
+ "$$\\varepsilon_{22} = a\\,|\\varepsilon_{11}/s_{11}|^{b}\\,s_{22}$$\n"
+ )
+ with gr.Row(elem_id="mode11_row"):
+ # Column 1: three sliders (subrows)
+ with gr.Column(scale=1, elem_id="mode11_col1"):
+ g11_a = gr.Slider(float(ro_min[0]), float(ro_max[0]), value=round(float(ro15_init[0]), 3), step=0.001, label="ε11→σ11:\u00A0a")
+ g11_b = gr.Slider(float(ro_min[1]), float(ro_max[1]), value=round(float(ro15_init[1]), 3), step=0.001, label="ε11→σ11:\u00A0b")
+ g11_c = gr.Slider(float(ro_min[2]), float(ro_max[2]), value=round(float(ro15_init[2]), 3), step=0.001, label="ε11→σ11:\u00A0c")
+ # Column 2: plot
+ with gr.Column(scale=1, elem_id="mode11_col2"):
+ _fig = ui_preview_11_stress(float(ro15_init[0]), float(ro15_init[1]), float(ro15_init[2]))
+ mode11_stress_plot = gr.Plot(value=_fig, elem_id="mode11_stress_plot")
+ # Column 3: two sliders (subrows)
+ with gr.Column(scale=1, elem_id="mode11_col3"):
+ g11_lat_a = gr.Slider(float(ro_min[3]), float(ro_max[3]), value=round(float(ro15_init[3]), 3), step=0.001, label="ε11→ε22:\u00A0a")
+ g11_lat_b = gr.Slider(float(ro_min[4]), float(ro_max[4]), value=round(float(ro15_init[4]), 3), step=0.001, label="ε11→ε22:\u00A0b")
+ # Column 4: plot
+ with gr.Column(scale=1, elem_id="mode11_col4"):
+ _fig = ui_preview_11_lat(float(ro15_init[3]), float(ro15_init[4]))
+ mode11_lat_plot = gr.Plot(value=_fig, elem_id="mode11_lat_plot")
+
+ # --- Mode 22 ---
+ gr.Markdown(
+ "### Mode 22\n"
+ "**Stress relationship:**\n"
+ "$$\\sigma_{22} = a\\,(\\varepsilon_{22}/s_{22}) + b\\,(\\varepsilon_{22}/s_{22})^{c}$$\n"
+ "**Lateral relationship:**\n"
+ "$$\\varepsilon_{11} = a\\,|\\varepsilon_{22}/s_{22}|^{b}\\,s_{11}$$\n"
+ )
+ with gr.Row(elem_id="mode22_row"):
+ # Column 1: three sliders (subrows)
+ with gr.Column(scale=1, elem_id="mode22_col1"):
+ g22_a = gr.Slider(float(ro_min[6]), float(ro_max[6]), value=round(float(ro15_init[6]), 3), step=0.001, label="ε22→σ22:\u00A0a")
+ g22_b = gr.Slider(float(ro_min[7]), float(ro_max[7]), value=round(float(ro15_init[7]), 3), step=0.001, label="ε22→σ22:\u00A0b")
+ g22_c = gr.Slider(float(ro_min[8]), float(ro_max[8]), value=round(float(ro15_init[8]), 3), step=0.001, label="ε22→σ22:\u00A0c")
+ # Column 2: plot
+ with gr.Column(scale=1, elem_id="mode22_col2"):
+ _fig = ui_preview_22_stress(float(ro15_init[6]), float(ro15_init[7]), float(ro15_init[8]))
+ mode22_stress_plot = gr.Plot(value=_fig, elem_id="mode22_stress_plot")
+ # Column 3: two sliders (subrows)
+ with gr.Column(scale=1, elem_id="mode22_col3"):
+ g22_lat_a = gr.Slider(float(ro_min[9]), float(ro_max[9]), value=round(float(ro15_init[9]), 3), step=0.001, label="ε22→ε11:\u00A0a")
+ g22_lat_b = gr.Slider(float(ro_min[10]), float(ro_max[10]), value=round(float(ro15_init[10]), 3), step=0.001, label="ε22→ε11:\u00A0b")
+ # Column 4: plot
+ with gr.Column(scale=1, elem_id="mode22_col4"):
+ _fig = ui_preview_22_lat(float(ro15_init[9]), float(ro15_init[10]))
+ mode22_lat_plot = gr.Plot(value=_fig, elem_id="mode22_lat_plot")
+
+ # --- Mode 12 ---
+ gr.Markdown(
+ "### Mode 12\n"
+ "**Stress relationship:**\n"
+ "$$\\sigma_{12} = a\\,(\\varepsilon_{12}/s_{12}) + b\\,(\\varepsilon_{12}/s_{12})^{c}$$\n"
+ )
+ with gr.Row(elem_id="mode12_row"):
+ # Column 1: three sliders (subrows)
+ with gr.Column(scale=1, elem_id="mode12_col1"):
+ g12_a = gr.Slider(float(ro_min[12]), float(ro_max[12]), value=round(float(ro15_init[12]), 3), step=0.001, label="ε12→σ12:\u00A0a")
+ g12_b = gr.Slider(float(ro_min[13]), float(ro_max[13]), value=round(float(ro15_init[13]), 3), step=0.001, label="ε12→σ12:\u00A0b")
+ g12_c = gr.Slider(float(ro_min[14]), float(ro_max[14]), value=round(float(ro15_init[14]), 3), step=0.001, label="ε12→σ12:\u00A0c")
+ # Column 2: plot
+ with gr.Column(scale=1, elem_id="mode12_col2"):
+ _fig = ui_preview_12_stress(float(ro15_init[12]), float(ro15_init[13]), float(ro15_init[14]))
+ mode12_stress_plot = gr.Plot(value=_fig, elem_id="mode12_stress_plot")
+ # Column 3+4: placeholders (keeps layout consistent)
+ with gr.Column(scale=1, elem_id="mode12_col3"):
+ gr.Markdown("")
+ with gr.Column(scale=1, elem_id="mode12_col4"):
+ gr.Markdown("")
+
+ # For generation we still need a flat list of the 13 UI coefficients, in this order:
+ sliders = [g11_a, g11_b, g11_c, g11_lat_a, g11_lat_b, g22_a, g22_b, g22_c, g22_lat_a, g22_lat_b, g12_a, g12_b, g12_c]
+
+ def _load_idx_into_sliders(idx: int):
+ ro15 = _load_test_ro15(DATA_DIR, int(idx))
+ return _ro15_to_ui13(ro15), f"Loaded test index **{int(idx)}** into sliders."
+
+ def _load_random_into_sliders():
+ # pick a random valid index (deterministic enough for interactive usage)
+ npz_path = os.path.join(DATA_DIR, "test_data_ro.npz")
+ data = np.load(npz_path)
+ n = int(data["ramberg_osgood_params"].shape[0])
+ idx = int(np.random.randint(0, max(n, 1)))
+ ro15 = np.asarray(data["ramberg_osgood_params"][idx], dtype=np.float32).reshape(-1)
+ return _ro15_to_ui13(ro15), f"Loaded random test index **{idx}** into sliders."
+
+ # Wire test-set loaders
+ load_test_btn.click(
+ fn=lambda idx: (*_load_idx_into_sliders(idx)[0], _load_idx_into_sliders(idx)[1]),
+ inputs=[test_idx],
+ outputs=sliders + [test_status],
+ show_progress=False,
+ )
+ rand_test_btn.click(
+ fn=lambda: (*_load_random_into_sliders()[0], _load_random_into_sliders()[1]),
+ inputs=[],
+ outputs=sliders + [test_status],
+ show_progress=False,
+ )
+
+ gr.Markdown("### Generate + simulate")
+ gen_btn = gr.Button("Generate")
+ gen_plot = gr.Plot(label="Condition + simulated curves (overlaid)")
+ gen_info = gr.Textbox(label="Generated parameters", lines=6)
+ gen_status = gr.Textbox(label="Run log", lines=8, value="Idle.", interactive=False)
+
+ # Wire live updates
+ for s in (g11_a, g11_b, g11_c):
+ s.change(ui_preview_11_stress, inputs=[g11_a, g11_b, g11_c], outputs=[mode11_stress_plot], show_progress=False)
+ for s in (g11_lat_a, g11_lat_b):
+ s.change(ui_preview_11_lat, inputs=[g11_lat_a, g11_lat_b], outputs=[mode11_lat_plot], show_progress=False)
+
+ for s in (g22_a, g22_b, g22_c):
+ s.change(ui_preview_22_stress, inputs=[g22_a, g22_b, g22_c], outputs=[mode22_stress_plot], show_progress=False)
+ for s in (g22_lat_a, g22_lat_b):
+ s.change(ui_preview_22_lat, inputs=[g22_lat_a, g22_lat_b], outputs=[mode22_lat_plot], show_progress=False)
+
+ for s in (g12_a, g12_b, g12_c):
+ s.change(ui_preview_12_stress, inputs=[g12_a, g12_b, g12_c], outputs=[mode12_stress_plot], show_progress=False)
+
+ # Generate
+ gen_btn.click(
+ ui_generate,
+ inputs=[n_simulations] + sliders,
+ outputs=[gen_plot, gen_info, gen_status],
+ )
+
+ return demo
+
+
+if __name__ == "__main__":
+ build_app().launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", "7860")))
+
diff --git a/data_generation/hf_space_generation_ro/lam.py b/data_generation/hf_space_generation_ro/lam.py
new file mode 100644
index 0000000000000000000000000000000000000000..99e76d4adf906d40f856b4f03e6ebc456b4f45c1
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/lam.py
@@ -0,0 +1,707 @@
+
+
+
+
+# --------------------- python packages ---------------------
+
+# all these packages should be present in the system
+import numpy as np
+import matplotlib.pyplot as plt
+from dataclasses import dataclass
+from pathlib import Path
+import warnings
+from numpy.lib._iotools import ConversionWarning
+from itertools import combinations_with_replacement
+from math import comb
+
+# --------------------- dataset parameter grids ---------------------
+
+#MATERIAL_TYPES = ["CPP", "GPP", "CHDPE", "GHDPE"] # e.g. ["CPP", "GFPP", ...]
+MATERIAL_TYPES = ["GHDPE", ]
+VOL_FRACTIONS = ["0.0924", "0.2155", "0.3079", "0.4002", "0.4926"] # e.g. ["0.0924", "0.1500", ...]
+INSTANCES = [1] # e.g. [1, 2, 3, 4]
+
+
+# Number of plies in the *upper* half of the symmetric laminate
+UPPER_LAYER_COUNTS = [5,6,7] # example: [1, 2, 3]
+
+# Candidate angles (in degrees) each upper-half ply can take
+CANDIDATE_ANGLES = [10,20,35,40,65,82]
+
+# --------------------- input directory ---------------------
+
+# Folder that contains RVE input files(3*100)(!!!update the path accordingly)
+CURVE_DIR = Path(r"RVE_Datasets")
+
+
+
+# --------------------- output directory ---------------------
+
+# Folder that contains the laminate output files(!!!update the path accordingly)
+OUT_DIR_ALL = Path(r"Output_directory")
+
+
+# --------------------- user-set Poisson ratios ---------------------
+NU12 = 0.36
+NU13 = 0.36
+NU23 = 0.86
+
+COND_MAX = 1e12 #maximum allowable condition number of the stiffness matrix
+
+# ===============================================================
+@dataclass
+class Curve1D:
+ eps: np.ndarray
+ sig: np.ndarray # Pa
+
+ def __post_init__(self):
+ idx = np.argsort(self.eps)
+ self.eps = np.asarray(self.eps, float)[idx]
+ self.sig = np.asarray(self.sig, float)[idx]
+
+ def stress(self, e):
+ ea = np.clip(abs(e), self.eps[0], self.eps[-1])
+ sa = np.interp(ea, self.eps, self.sig)
+ return np.sign(e) * sa
+
+ def tangent(self, e):
+ ea = np.clip(abs(e), self.eps[0], self.eps[-1])
+ i = np.searchsorted(self.eps, ea) - 1
+ i = np.clip(i, 0, len(self.eps)-2)
+ de = self.eps[i+1] - self.eps[i]
+ ds = self.sig[i+1] - self.sig[i]
+ return (ds/de)
+
+def read_instance_metadata(prefix: str):
+ """
+ Read volume fraction and fiber centers from the 11-file for this instance.
+ Example prefix: 'CHDPE_0.0924_1' -> CHDPE_0.0924_1_11.txt
+ """
+ meta_file = CURVE_DIR / f"{prefix}_11.txt"
+ vol_frac = None
+ centers_str = None
+
+ with open(meta_file, "r") as f:
+ for line in f:
+ line = line.strip()
+ if line.startswith("volume fraction="):
+ # split at '=', take right-hand side, convert to float
+ vol_frac = float(line.split("=", 1)[1])
+ elif line.startswith("fiber_centers_YZ="):
+ # take everything after '=' as a raw string
+ centers_str = line.split("=", 1)[1].strip()
+
+ if vol_frac is None:
+ raise ValueError(f"volume fraction not found in {meta_file}")
+ if centers_str is None:
+ raise ValueError(f"fiber_centers_YZ not found in {meta_file}")
+
+
+ n_fibers = centers_str.count("(")
+
+ return vol_frac, centers_str, n_fibers
+
+
+
+
+
+def load_curve_from_file(filename, strain_col=1, stress_col=2, skiprows=1, is_shear=False):
+ """
+ Load a 2-col curve file.
+ If is_shear=True, strain column is assumed 'tensorial' and converted to engineering γ by *2.0*.
+
+ """
+ p = Path(filename)
+ if not p.exists():
+ raise FileNotFoundError(f"Missing curve file: {p.resolve()}")
+
+
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", ConversionWarning)
+ arr = np.genfromtxt(
+ p,
+ dtype=float,
+ delimiter=None,
+ skip_header=skiprows,
+ invalid_raise=False # bad lines (like "volume fraction= ...") are skipped
+ )
+
+
+ eps = arr[:, strain_col]
+ if is_shear:
+ eps = 2.0 * eps # tensorial -> engineering γ
+ sig = 1e6 * arr[:, stress_col] # MPa -> Pa
+ return Curve1D(eps, sig)
+
+
+def load_ud_material_from_files(prefix: str) -> "PlyMaterial":
+ """
+ Build a PlyMaterial from three curve files with a common prefix, e.g.
+ prefix='CPP_0.0924_1' → CPP_0.0924_1_11.txt, CPP_0.0924_1_22.txt, CPP_0.0924_1_12.txt
+ """
+ # 11 curve: Strain_11, Stress_11, Strain_22, Strain_33
+ c11 = load_curve_from_file(
+ CURVE_DIR / f"{prefix}_11.txt",
+ strain_col=0, # Strain_11
+ stress_col=1, # Stress_11
+ skiprows=1
+ )
+
+ # 22 curve: Strain_22, Stress_22, Strain_11, Strain_33
+ c22 = load_curve_from_file(
+ CURVE_DIR / f"{prefix}_22.txt",
+ strain_col=0, # Strain_22
+ stress_col=1, # Stress_22
+ skiprows=1
+ )
+
+ # Reuse 22 curve for 33
+ c33 = c22
+
+ # 12 shear curve: Strain_12, Stress_12
+ c12 = load_curve_from_file(
+ CURVE_DIR / f"{prefix}_12.txt",
+ strain_col=0, # Strain_12
+ stress_col=1, # Stress_12
+ skiprows=1,
+ is_shear=True
+ )
+
+ # Reuse 12 curve for 13 and 23
+ c13 = c12
+ c23 = c12
+
+ return PlyMaterial(
+ E1_curve=c11, E2_curve=c22, E3_curve=c33,
+ G12_curve=c12, G13_curve=c13, G23_curve=c23,
+ nu12=NU12, nu13=NU13, nu23=NU23
+ )
+
+
+# ===============================================================
+# 3D orthotropic C' (Voigt 11,22,33,23,13,12)
+# (engineering shear convention: C66=G12, etc.)
+# ===============================================================
+def orthotropic_C_prime(E1,E2,E3,G12,G13,G23, nu12,nu13,nu23):
+ V = (1.0
+ - (E3/E2)*(nu23**2)
+ - (E3/E1)*(nu13**2)
+ - (E2/E1)*(nu12**2)
+ - 2*(E3/E1)*(nu12*nu13*nu23))
+
+ C11 = ((1.0 - (E3/E2)*nu23**2) * E1) / V
+ C22 = ((1.0 - (E3/E1)*nu13**2) * E2) / V
+ C33 = ((1.0 - (E2/E1)*nu12**2) * E3) / V
+ C12 = ((nu12 + (E3/E2)*nu13*nu23) * E2) / V
+ C13 = ((nu13 + nu12*nu23) * E3) / V
+ C23 = ((nu23 + (E2/E1)*nu12*nu13) * E3) / V
+
+ C = np.zeros((6,6))
+ C[0,0] = C11; C[1,1] = C22; C[2,2] = C33
+ C[0,1] = C12; C[1,0] = C12
+ C[0,2] = C13; C[2,0] = C13
+ C[1,2] = C23; C[2,1] = C23
+ C[3,3] = G23; C[4,4] = G13; C[5,5] = G12
+ return C
+
+# ===============================================================
+# Transformations (engineering shear)
+# ===============================================================
+def T_sigma(theta_deg):
+ th = np.radians(theta_deg); m, n = np.cos(th), np.sin(th)
+ return np.array([
+ [ m*m, n*n, 0, 0, 0, 2*m*n],
+ [ n*n, m*m, 0, 0, 0, -2*m*n],
+ [ 0, 0, 1, 0, 0, 0],
+ [ 0, 0, 0, m,-n, 0],
+ [ 0, 0, 0, n, m, 0],
+ [-m*n, m*n, 0, 0, 0, m*m-n*n]
+ ], float)
+
+def T_eps(theta_deg):
+ th = np.radians(theta_deg); m, n = np.cos(th), np.sin(th)
+ return np.array([
+ [ m*m, n*n, 0, 0, 0, m*n],
+ [ n*n, m*m, 0, 0, 0, -m*n],
+ [ 0, 0, 1, 0, 0, 0],
+ [ 0, 0, 0, m,-n, 0],
+ [ 0, 0, 0, n, m, 0],
+ [-2*m*n,2*m*n,0, 0, 0, m*m-n*n]
+ ], float)
+
+
+def T(theta_deg):
+ th = np.radians(theta_deg); m, n = np.cos(th), np.sin(th)
+ return np.array([
+ [ m*m, n*n, 0, 0, 0, 2*m*n],
+ [ n*n, m*m, 0, 0, 0, -2*m*n],
+ [ 0, 0, 1, 0, 0, 0],
+ [ 0, 0, 0, m,-n, 0],
+ [ 0, 0, 0, n, m, 0],
+ [-1*m*n,1*m*n,0, 0, 0, m*m-n*n]
+ ], float)
+
+
+# ===============================================================
+# Ply material & ply
+# ===============================================================
+@dataclass
+class PlyMaterial:
+ E1_curve: Curve1D
+ E2_curve: Curve1D
+ E3_curve: Curve1D
+ G12_curve: Curve1D
+ G13_curve: Curve1D
+ G23_curve: Curve1D
+ nu12: float
+ nu13: float
+ nu23: float
+
+ def tangents_from_local_strain(self, e_local):
+ e11,e22,e33,g23,g13,g12 = e_local
+ floor = -1e12
+ E1 = max(self.E1_curve.tangent(e11), floor)
+ E2 = max(self.E2_curve.tangent(e22), floor)
+ E3 = max(self.E3_curve.tangent(e33), floor)
+ G12 = max(self.G12_curve.tangent(g12), floor)
+ G13 = max(self.G13_curve.tangent(g13), floor)
+ G23 = max(self.G23_curve.tangent(g23), floor)
+ return E1,E2,E3,G12,G13,G23
+
+
+@dataclass
+class Ply:
+ theta_deg: float # initial/reference fibre angle
+ thickness: float
+ mat: PlyMaterial
+ e_prev: np.ndarray = None
+ s_prev: np.ndarray = None
+ theta_curr_deg: float = None # running (current) fibre angle
+
+ def init_state(self):
+ self.e_prev = np.zeros(6)
+ self.s_prev = np.zeros(6)
+ self.theta_curr_deg = float(self.theta_deg)
+
+
+class Laminate:
+ def __init__(self, plies, tol=1e-12):
+ self.plies = plies
+ for p in self.plies:
+ p.init_state()
+ t0 = self.plies[0].thickness
+ for i,p in enumerate(self.plies, 1):
+ if abs(p.thickness - t0) > tol:
+ raise ValueError(f"Equal-thickness assumption violated at ply {i}: {p.thickness} vs {t0}")
+ self.N = len(self.plies)
+ self.t = t0
+ self.total_t = self.N * self.t
+
+ # ---------- Incremental affine update using strain increments (engineering shear) ----------
+ def update_fiber_angles_incremental(self, d_ex, d_ey, d_gxy):
+ """
+ a_{n+1} = ΔF a_n / ||ΔF a_n|| with ΔF = [[1+Δex, Δgxy/2],[Δgxy/2, 1+Δey]]
+ Updates each ply's theta_curr_deg in-place.
+ """
+ Fd = np.array([[1.0 + d_ex, 0.5*d_gxy],
+ [0.5*d_gxy, 1.0 + d_ey]], dtype=float) #valid for small strain increments
+
+ for p in self.plies:
+ th = np.radians(p.theta_curr_deg)
+ a = np.array([np.cos(th), np.sin(th)])
+ a_new = Fd @ a
+ nrm = np.linalg.norm(a_new)
+ if nrm > 1e-14:
+ a_new /= nrm
+ p.theta_curr_deg = np.degrees(np.arctan2(a_new[1], a_new[0]))
+
+ # ---------- Build effective laminate C from PREVIOUS global strains ----------
+ def effective_C_from_previous_strains(self, ex_prev, ey_prev, ezz_prev, g23_prev, g13_prev, gxy_prev):
+ """
+ Thickness-average of per-ply global tangential stiffness matrices,
+ each built from tangents evaluated at the previous-step local strains.
+ """
+ e_prev_global = np.array([ex_prev, ey_prev, ezz_prev, g23_prev, g13_prev, gxy_prev], float)
+ Csum = np.zeros((6,6), float)
+ for p in self.plies:
+ theta = p.theta_curr_deg
+ T_e = T_eps(theta)
+ T_e_inv = np.linalg.inv(T_e)
+ T_s = T_sigma(theta)
+
+ e_local_prev = T_e @ e_prev_global
+
+
+ #print(f"theta={theta}")
+
+ E1,E2,E3,G12,G13,G23 = p.mat.tangents_from_local_strain(e_local_prev)
+ Cprime = orthotropic_C_prime(E1,E2,E3,G12,G13,G23, p.mat.nu12, p.mat.nu13, p.mat.nu23)
+
+
+
+ Tt=T(theta)
+ Cglob = np.linalg.inv(Tt) @ Cprime @ np.linalg.inv(Tt).T
+
+ Csum += Cglob
+ return Csum / self.N
+
+
+# ===============================================================
+# Helpers for symmetric stacking from upper-half definition
+# ===============================================================
+
+def build_full_symmetric_stack(upper_angles):
+ """
+ Given a list of angles for the *upper* half of the laminate,
+ build the full symmetric stack with opposite angles in the lower half.
+ Example: [0, 45, -45] -> [0, 45, -45, +45, -45, 0]
+ """
+ upper = list(upper_angles)
+ lower = [-a for a in reversed(upper)]
+ return upper + lower
+
+def _format_angle_for_label(a):
+ """
+ Format a ply angle for use in filenames:
+ - integer degrees
+ - explicit sign (+ or -)
+ Examples:
+ 45.0 -> '+45'
+ -30.0 -> '-30'
+ 0.0 -> '+0'
+ """
+ a_int = int(round(float(a)))
+ sign = "+" if a_int >= 0 else "-"
+ return f"{sign}{abs(a_int)}"
+
+
+
+
+
+def stack_label_from_upper(upper_angles):
+ """
+ Return a human-readable description of the *upper-half* stacking sequence,
+ with comma separation, e.g. [0, 45, -45] -> '0, 45, -45'.
+ """
+ parts = []
+ for a in upper_angles:
+ # show integer degrees without .0
+ if float(a).is_integer():
+ parts.append(f"{int(a)}")
+ else:
+ parts.append(f"{a}")
+ return ", ".join(parts)
+
+# ===============================================================
+# 5D uniaxial test driver (σy=τxy=σz=τyz=τxz=0), incremental: ds = Ceff_prev @ de
+# ===============================================================
+
+
+
+def run_uniaxial_test_from_files_5d(prefix: str, stack_angles, mode="11"):
+
+ # ---- Material from files ----
+
+ tply = 0.05 #dummy value, doesn't effect the result
+
+
+
+
+ # ---- Layup from full stacking sequence ----
+ plies = [Ply(angle_deg, tply, mat) for angle_deg in stack_angles]
+ lam = Laminate(plies)
+
+
+
+
+ # ---- Choose loading mode and strain path ----
+ if mode == "11":
+ main_index = 0 # ε11
+ eps_max = 0.10
+ elif mode == "22":
+ main_index = 1 # ε22
+ eps_max = 0.10
+ elif mode == "12":
+ main_index = 5 # γ12 (engineering shear internally)
+ eps_max = 0.20 # ⇒ tensorial E12 = γ12/2 goes to 0.10
+ else:
+ raise ValueError("mode must be '11', '22' or '12'")
+
+ main_steps = np.linspace(0.0, eps_max, 1500) #1500 strain increments are chosen for a converged result
+
+
+
+
+ # ---- Histories (totals) ----
+ ex_hist, sx_hist = [], [] # main component strain & stress
+ ey_hist, gxy_hist = [], []
+ ezz_hist, g23_hist, g13_hist = [], [], []
+ e11_hist = [] # always store total ε11
+
+
+
+ # ---- Previous-step totals ----
+ ex_prev = 0.0
+ ey_prev = 0.0
+ gxy_prev = 0.0
+ ezz_prev = 0.0
+ g23_prev = 0.0
+ g13_prev = 0.0
+ s1_prev = 0.0
+
+ for i in range(1, len(main_steps)):
+ main_target = main_steps[i]
+
+ # Previous value of the driven strain component
+ if main_index == 0:
+ main_prev = ex_prev
+ elif main_index == 1:
+ main_prev = ey_prev
+ else: # main_index == 5 (γ12)
+ main_prev = gxy_prev
+
+ # Increment in prescribed "main" strain (ε11 / ε22 / γ12)
+ dmain = main_target - main_prev
+
+ # Tangent Ceff at previous state from laminate
+ Ceff_prev = lam.effective_C_from_previous_strains(
+ ex_prev, ey_prev, ezz_prev, g23_prev, g13_prev, gxy_prev
+ )
+
+ # ---- Safeguard: check conditioning of Ceff_prev ----
+ cond = np.linalg.cond(Ceff_prev)
+ if not np.isfinite(cond) or cond > COND_MAX:
+ raise np.linalg.LinAlgError(
+ f"Effective C is ill-conditioned (cond={cond:.3e}) at step {i}"
+ )
+
+ # Compute ONLY the column of the compliance needed via solve,
+ # instead of inverting the full 6x6 matrix.
+ e_j = np.zeros(6)
+ e_j[main_index] = 1.0
+
+ try:
+ # S_col satisfies: Ceff_prev @ S_col = e_j
+ S_col = np.linalg.solve(Ceff_prev, e_j)
+ except np.linalg.LinAlgError as err:
+ raise np.linalg.LinAlgError(
+ f"Failed to solve for compliance column at step {i}: {err}"
+ )
+
+ Sjj = S_col[main_index]
+ if abs(Sjj) < 1e-20:
+ raise ZeroDivisionError(
+ f"Sjj is zero or too small at step {i} (Sjj={Sjj:.3e})."
+ )
+
+
+ ds1 = dmain / Sjj
+ de_vec = S_col * ds1
+ # enforce exactly the prescribed main increment
+ de_vec[main_index] = dmain
+
+
+
+
+
+
+ de1, de2, de3, de4, de5, de6 = de_vec
+ de4 = 0.0
+ de5 = 0.0
+
+ # (4) Update totals
+ s1 = s1_prev + ds1
+ ex = ex_prev + de1
+ ey = ey_prev + de2
+ ezz = ezz_prev + de3
+ g23 = g23_prev + de4
+ g13 = g13_prev + de5
+ gxy = gxy_prev + de6
+
+ # (5) Update fibre angles from INCREMENTS (Δex, Δey, Δγxy)
+ lam.update_fiber_angles_incremental(de1, de2, de6)
+
+ # (6) Commit for next step
+ ex_prev, ey_prev, ezz_prev = ex, ey, ezz
+ g23_prev, g13_prev, gxy_prev = g23, g13, gxy
+ s1_prev = s1
+
+
+
+ # (7) Save totals for output
+ # ex_hist stores the *driven* component: ε11, ε22, or *tensorial* E12 = γ12/2
+ if main_index == 0:
+ main_strain = ex
+ elif main_index == 1:
+ main_strain = ey
+ else: # shear
+ main_strain = 0.5 * gxy # convert engineering γ12 -> tensorial E12
+
+
+ ex_hist.append(main_strain)
+ sx_hist.append(s1)
+ ey_hist.append(ey); gxy_hist.append(gxy)
+ ezz_hist.append(ezz); g23_hist.append(g23); g13_hist.append(g13)
+ e11_hist.append(ex) # store true ε11 regardless of mode
+
+
+
+
+ angles_str = ", ".join(f"{p.theta_curr_deg:.2f}°" for p in lam.plies)
+
+
+
+ return (np.array(ex_hist), np.array(sx_hist),
+ np.array(ey_hist), np.array(gxy_hist),
+ np.array(ezz_hist), np.array(g23_hist), np.array(g13_hist),
+ np.array(e11_hist))
+
+
+
+
+if __name__ == "__main__":
+
+ # ---- estimate total number of laminate output files ----
+ n_mat = len(MATERIAL_TYPES)
+ n_vf = len(VOL_FRACTIONS)
+ n_inst = len(INSTANCES)
+ n_ang = len(CANDIDATE_ANGLES)
+
+ # combinations-with-replacement count for each upper-half ply count
+ n_stacks_per_instance = sum(
+ comb(n_ang + n_layers - 1, n_layers) for n_layers in UPPER_LAYER_COUNTS
+ )
+
+ expected_files = n_mat * n_vf * n_inst * n_stacks_per_instance
+ print(f"Expected number of laminate output files: {expected_files}")
+
+ file_count = 0
+ for mat_type in MATERIAL_TYPES:
+ for vf in VOL_FRACTIONS:
+ vf_str = vf
+
+ for inst in INSTANCES:
+ prefix = f"{mat_type}_{vf_str}_{inst}"
+ vf_meta, centers_meta, n_fibers = read_instance_metadata(prefix)
+ mat = load_ud_material_from_files(prefix)
+
+ # ---- loop over upper-half stacking sequences ----
+ for n_layers in UPPER_LAYER_COUNTS:
+ for upper_angles in combinations_with_replacement(CANDIDATE_ANGLES, n_layers):
+ upper_angles = list(upper_angles)
+ full_angles = build_full_symmetric_stack(upper_angles)
+
+ # human-readable label for this stacking (upper half only)
+ stack_label_human = stack_label_from_upper(upper_angles) # e.g. "0, 30, -45"
+ stack_label_file = "_".join(s.strip().replace("+", "p").replace("-", "m")
+ for s in stack_label_human.split(","))
+
+ combined_blocks = {}
+
+
+ for mode in ("11", "22", "12"):
+
+
+ try:
+ # main strain, stress, ε22, γ12, ε33, γ23, γ13, ε11
+ ex, sx, ey, gxy, ezz, g23, g13, e11 = run_uniaxial_test_from_files_5d(
+ prefix,
+ full_angles,
+ mode=mode,
+ )
+ except Exception as e:
+ print(f"Skipping {prefix}, stack={stack_label_human} due to error: {e}")
+ continue
+
+
+ # 10 equally spaced output points in the driven (main) strain
+ N = 10
+ x_out = np.linspace(ex[0], ex[-1], N)
+ sx_out_MPa = np.interp(x_out, ex, sx/1e6)
+
+ # Pick Voigt-notation headers and lateral strain based on mode
+ if mode == "11":
+ strain_label = "eps_11"
+ stress_label = "sig_11"
+ lateral_label = "eps_22"
+ lateral_series = ey # ε22 is lateral in 11-test
+ elif mode == "22":
+ strain_label = "eps_22"
+ stress_label = "sig_22"
+ lateral_label = "eps_11"
+ lateral_series = e11 # ε11 is lateral in 22-test
+ elif mode == "12":
+ strain_label = "eps_12"
+ stress_label = "sig_12"
+ lateral_label = None
+ lateral_series = None
+ else:
+ raise ValueError(f"Unknown mode {mode}")
+
+
+
+ # Build lateral output (if any) on the same main-strain grid
+ if lateral_series is not None:
+ lateral_out = np.interp(x_out, ex, lateral_series)
+ else:
+ lateral_out = None
+
+ # Build header line and numeric rows (strings) for this mode
+ if lateral_label is None:
+ # shear case (12): two columns
+ header_line = f"{strain_label:<8} {stress_label:<8}"
+ else:
+ # tensile 11 or 22: three columns
+ header_line = f"{strain_label:<8} {stress_label:<8} {lateral_label:<8}"
+
+ rows = []
+ if lateral_label is None:
+ # two columns: eps, sig
+ for eps_val, sig_val in zip(x_out, sx_out_MPa):
+ line = f"{eps_val:8.6f} {sig_val:8.3f}"
+ rows.append(line)
+ else:
+ # three columns: eps, sig, lateral_eps
+ for eps_val, sig_val, lat_val in zip(x_out, sx_out_MPa, lateral_out):
+ line = f"{eps_val:8.6f} {sig_val:8.3f} {lat_val:8.6f}"
+ rows.append(line)
+
+ # store this block for the combined file
+ combined_blocks[mode] = (header_line, rows)
+
+
+ # ---- write combined file: 11, then 22, then 12, then common metadata ----
+ OUT_DIR_ALL.mkdir(parents=True, exist_ok=True)
+ combined_file = OUT_DIR_ALL / (
+ f"{mat_type}_{vf_str}_{inst}_{stack_label_file}.txt"
+ )
+
+ with open(combined_file, "w") as fc:
+ # write 11, then 22, then 12 in order
+ for m in ("11", "22", "12"):
+ header_line, rows = combined_blocks[m]
+ fc.write(header_line + "\n")
+ for line in rows:
+ fc.write(line + "\n")
+ fc.write("\n")
+
+ # one common metadata block at the end
+ fc.write(f"volume fraction= {vf_meta:.6f}\n")
+ fc.write(f"material type= {mat_type}\n")
+ fc.write("loading modes= 11, 22, 12\n")
+ fc.write(f"stacking sequence= {stack_label_human}\n")
+ fc.write(f"instance= {inst}\n")
+ fc.write(f"number of fibers= {n_fibers}\n")
+ fc.write(f"fiber_centers_YZ={centers_meta}\n")
+
+
+ file_count += 1
+ if file_count % 500 == 0 or file_count == expected_files:
+ print(f"Generated {file_count}/{expected_files} files")
+
+
+
+
+
+
+
diff --git a/data_generation/hf_space_generation_ro/models.py b/data_generation/hf_space_generation_ro/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..71f4bb007528b5ef25a753c00ede456e9111ea46
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/models.py
@@ -0,0 +1,17 @@
+"""
+Compatibility shim for torch checkpoint loading.
+
+Some training checkpoints were saved with objects pickled from a top-level module
+named `models` (e.g. `models.ModelConfig`, `models.MaterialHybridDenoiser`).
+
+In the Hugging Face Space we keep the implementation in `space_lib/models.py`,
+but we also provide this top-level module so `torch.load()` can unpickle.
+"""
+
+from space_lib.models import ( # noqa: F401
+ ModelConfig,
+ MaterialHybridDenoiser,
+ SelfCrossAttnBlock,
+ timestep_embedding,
+)
+
diff --git a/data_generation/hf_space_generation_ro/requirements.txt b/data_generation/hf_space_generation_ro/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..13582cd659cec7c5af5d8d2ab5d6ad3e96840d5c
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/requirements.txt
@@ -0,0 +1,6 @@
+gradio==4.44.1
+numpy==1.26.4
+matplotlib==3.8.4
+torch==2.2.2
+tqdm==4.66.4
+pyyaml==6.0.2
diff --git a/data_generation/hf_space_generation_ro/space_lib/__init__.py b/data_generation/hf_space_generation_ro/space_lib/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..32d7bd8caf86aae734afa4fbe9cb50fb725a9640
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/__init__.py
@@ -0,0 +1,2 @@
+"""Space-local library for RO-conditioned hybrid diffusion material generation."""
+
diff --git a/data_generation/hf_space_generation_ro/space_lib/infer.py b/data_generation/hf_space_generation_ro/space_lib/infer.py
new file mode 100644
index 0000000000000000000000000000000000000000..e6a8d8bdb133e9fe6683d14168a8c8e207d2167c
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/infer.py
@@ -0,0 +1,262 @@
+from __future__ import annotations
+
+import json
+import os
+from dataclasses import dataclass
+from typing import Dict, Optional, Tuple
+
+import numpy as np
+import pickle
+import torch
+import torch.nn.functional as F
+
+from .models import MaterialHybridDenoiser, ModelConfig
+
+
+VF_CATEGORIES = [0.0924, 0.2155, 0.3079, 0.4002, 0.4926]
+MATERIAL_NAMES = ["CPP", "CHDPE", "GPP", "GHDPE"]
+
+
+@dataclass(frozen=True)
+class DiscreteMaskDiffusion:
+ T: int
+
+
+class GaussianDiffusion:
+ def __init__(self, T: int, beta_start: float = 1e-4, beta_end: float = 2e-2, device: str = "cpu"):
+ self.T = int(T)
+ betas = torch.linspace(beta_start, beta_end, self.T, device=device)
+ alphas = 1.0 - betas
+ alpha_bar = torch.cumprod(alphas, dim=0)
+ self.betas = betas
+ self.alphas = alphas
+ self.sqrt_alpha_bar = torch.sqrt(alpha_bar)
+ self.sqrt_one_minus_alpha_bar = torch.sqrt(1.0 - alpha_bar)
+ self.sqrt_recip_alphas = torch.sqrt(1.0 / alphas)
+
+ @torch.no_grad()
+ def p_sample_step(self, x_t: torch.Tensor, t: torch.Tensor, eps_pred: torch.Tensor) -> torch.Tensor:
+ beta_t = self.betas[t].view(-1, 1, 1)
+ sqrt_recip_alpha_t = self.sqrt_recip_alphas[t].view(-1, 1, 1)
+ sqrt_one_minus_a_bar = self.sqrt_one_minus_alpha_bar[t].view(-1, 1, 1)
+ mu = sqrt_recip_alpha_t * (x_t - (beta_t / sqrt_one_minus_a_bar.clamp_min(1e-8)) * eps_pred)
+ noise = torch.randn_like(x_t)
+ nonzero_mask = (t != 0).float().view(-1, 1, 1)
+ return mu + nonzero_mask * torch.sqrt(beta_t) * noise
+
+
+@torch.no_grad()
+def sample(
+ model: MaterialHybridDenoiser,
+ disc_diff_mat: DiscreteMaskDiffusion,
+ disc_diff_vf_category: DiscreteMaskDiffusion,
+ disc_diff_layer: DiscreteMaskDiffusion,
+ disc_diff_angle: Optional[DiscreteMaskDiffusion] = None,
+ cont_diff: Optional[GaussianDiffusion] = None,
+ cond: torch.Tensor = None,
+ mask_ids: Dict[str, int] = None,
+ device: str = "cpu",
+ remask_prob: float = 0.1,
+ use_discrete_angles: bool = True,
+) -> Dict[str, torch.Tensor]:
+ model.eval()
+ B = cond.shape[0]
+ L = model.cfg.n_max_layer
+
+ x_material_t = torch.full((B,), mask_ids["material"], dtype=torch.long, device=device)
+ x_vf_category_t = torch.full((B,), mask_ids["vf_category"], dtype=torch.long, device=device)
+ x_layer_t = torch.full((B, L), mask_ids["layer"], dtype=torch.long, device=device)
+
+ if use_discrete_angles:
+ if disc_diff_angle is None:
+ raise ValueError("disc_diff_angle is required when use_discrete_angles=True")
+ if "angle" not in mask_ids:
+ raise ValueError("mask_ids must include 'angle' when use_discrete_angles=True")
+ x_angle_t = torch.full((B, L), mask_ids["angle"], dtype=torch.long, device=device)
+ T = disc_diff_angle.T
+ else:
+ if cont_diff is None:
+ raise ValueError("cont_diff is required when use_discrete_angles=False")
+ x_angle_t = torch.randn(B, L, 1, device=device)
+ T = cont_diff.T
+
+ for t_int in reversed(range(T)):
+ t = torch.full((B,), t_int, dtype=torch.long, device=device)
+ outputs = model(x_material_t, x_vf_category_t, x_layer_t, x_angle_t, cond, t)
+
+ probs_mat = F.softmax(outputs["material_logits"], dim=-1)
+ remask_mat = (x_material_t == mask_ids["material"]) | (torch.rand(B, device=device) < remask_prob)
+ if remask_mat.any():
+ new_material = torch.multinomial(probs_mat[remask_mat], 1).squeeze(-1)
+ x_material_t = x_material_t.clone()
+ x_material_t[remask_mat] = new_material
+
+ probs_vf = F.softmax(outputs["vf_category_logits"], dim=-1)
+ remask_vf = (x_vf_category_t == mask_ids["vf_category"]) | (torch.rand(B, device=device) < remask_prob)
+ if remask_vf.any():
+ new_vf = torch.multinomial(probs_vf[remask_vf], 1).squeeze(-1)
+ x_vf_category_t = x_vf_category_t.clone()
+ x_vf_category_t[remask_vf] = new_vf
+
+ if use_discrete_angles:
+ probs_angle = F.softmax(outputs["angle_logits"], dim=-1) # (B,L,K+1)
+ remask_angle = (torch.rand(B, L, device=device) < remask_prob)
+ masked = (x_angle_t == mask_ids["angle"]) | remask_angle
+ if masked.any():
+ flat_probs = probs_angle.view(-1, probs_angle.size(-1))[masked.view(-1)]
+ new_angle = torch.multinomial(flat_probs, 1).squeeze(-1)
+ x_angle_t = x_angle_t.clone()
+ x_angle_t[masked] = new_angle
+
+ dead_category = probs_angle.size(-1) - 1
+ x_layer_t = (x_angle_t != dead_category).long()
+ else:
+ probs_layer = F.softmax(outputs["layer_logits"], dim=-1) # (B,L,2)
+ remask_layer = (torch.rand(B, L, device=device) < remask_prob)
+ masked = (x_layer_t == mask_ids["layer"]) | remask_layer
+ if masked.any():
+ flat_probs = probs_layer.view(-1, 2)[masked.view(-1)]
+ new_layer = torch.multinomial(flat_probs, 1).squeeze(-1)
+ x_layer_t = x_layer_t.clone()
+ x_layer_t[masked] = new_layer
+
+ angle_pred = outputs["angle"]
+ sqrt_alpha_bar_t = cont_diff.sqrt_alpha_bar[t].view(-1, 1, 1)
+ sqrt_one_minus_alpha_bar_t = cont_diff.sqrt_one_minus_alpha_bar[t].view(-1, 1, 1)
+ eps_pred = (x_angle_t - sqrt_alpha_bar_t * angle_pred) / sqrt_one_minus_alpha_bar_t.clamp_min(1e-8)
+ x_angle_t = cont_diff.p_sample_step(x_angle_t, t, eps_pred)
+
+ return {"material_t": x_material_t, "vf_category_t": x_vf_category_t, "layer_t": x_layer_t, "angle_t": x_angle_t}
+
+
+@dataclass
+class ModelBundle:
+ model: MaterialHybridDenoiser
+ disc_diff_mat: DiscreteMaskDiffusion
+ disc_diff_vf_category: DiscreteMaskDiffusion
+ disc_diff_layer: DiscreteMaskDiffusion
+ disc_diff_angle: Optional[DiscreteMaskDiffusion]
+ cont_diff: Optional[GaussianDiffusion]
+ mask_ids: Dict[str, int]
+ use_discrete_angles: bool
+ T: int
+ beta_start: float
+ beta_end: float
+ angle_resolution: float
+
+
+def _load_state_dict_safely(obj) -> Dict[str, torch.Tensor]:
+ if isinstance(obj, dict):
+ for k in ("model_state_dict", "state_dict", "model"):
+ if k in obj and isinstance(obj[k], dict):
+ return obj[k]
+ # If it already looks like a state_dict
+ if all(isinstance(v, torch.Tensor) for v in obj.values()):
+ return obj # type: ignore[return-value]
+ raise ValueError("Unrecognized checkpoint format (expected dict with model state_dict)")
+
+
+def load_model_bundle(checkpoint_dir: str, device: Optional[str] = None, angle_resolution: float = 1.0) -> ModelBundle:
+ cfg_path = os.path.join(checkpoint_dir, "training_config.json")
+ with open(cfg_path, "r") as f:
+ train_cfg = json.load(f)
+
+ use_discrete_angles = bool(train_cfg.get("use_discrete_angles", True))
+ model_cfg = ModelConfig(**train_cfg["model_config"])
+
+ if device is None:
+ device = "cuda" if torch.cuda.is_available() else "cpu"
+
+ mask_ids = dict(train_cfg.get("mask_ids", {}))
+ # Angle category count only matters for discrete mode. We default to 7 if not present.
+ n_angle_categories = int(train_cfg.get("n_angle_categories", 7))
+ # IMPORTANT: match training model signature exactly (cfg, mask_ids, use_discrete_angles, n_angle_categories)
+ model = MaterialHybridDenoiser(
+ model_cfg,
+ mask_ids=mask_ids,
+ use_discrete_angles=use_discrete_angles,
+ n_angle_categories=n_angle_categories,
+ ).to(device)
+
+ # Load checkpoint (prefer best_model.pt)
+ ckpt_path = os.path.join(checkpoint_dir, "best_model.pt")
+ if not os.path.exists(ckpt_path):
+ ckpt_path = os.path.join(checkpoint_dir, "checkpoint_epoch_1.pt")
+ # Some checkpoints may contain pickled objects referencing the original training module
+ # layout (e.g. top-level `models`). We ship a compatibility `models.py` in the Space.
+ # Also prefer weights-only loading when supported to avoid unpickling non-tensor objects.
+ try:
+ ckpt = torch.load(ckpt_path, map_location=device, weights_only=True) # type: ignore[call-arg]
+ except TypeError:
+ ckpt = torch.load(ckpt_path, map_location=device)
+ except pickle.UnpicklingError:
+ # PyTorch raised because weights-only loader encountered non-tensor objects
+ # (e.g. models.ModelConfig). We trust this checkpoint (bundled by us), so fall back.
+ ckpt = torch.load(ckpt_path, map_location=device, weights_only=False) # type: ignore[call-arg]
+ state_dict = _load_state_dict_safely(ckpt)
+ # Enforce exact match with checkpoint; otherwise generation can look arbitrarily bad.
+ model.load_state_dict(state_dict, strict=True)
+
+ T = int(train_cfg.get("T", 100))
+ beta_start = float(train_cfg.get("beta_start", 1e-4))
+ beta_end = float(train_cfg.get("beta_end", 2e-2))
+
+ disc = DiscreteMaskDiffusion(T=T)
+ disc_angle = DiscreteMaskDiffusion(T=T) if use_discrete_angles else None
+ cont = GaussianDiffusion(T=T, beta_start=beta_start, beta_end=beta_end, device=device) if not use_discrete_angles else None
+
+ # Some training configs omit angle mask when continuous; for discrete, define a reasonable default if missing.
+ if use_discrete_angles and "angle" not in mask_ids:
+ # categories: n_angle_categories + dead (1) -> +1 ; then mask id is last index
+ mask_ids["angle"] = n_angle_categories + 1
+
+ return ModelBundle(
+ model=model,
+ disc_diff_mat=disc,
+ disc_diff_vf_category=disc,
+ disc_diff_layer=disc,
+ disc_diff_angle=disc_angle,
+ cont_diff=cont,
+ mask_ids=mask_ids,
+ use_discrete_angles=use_discrete_angles,
+ T=T,
+ beta_start=beta_start,
+ beta_end=beta_end,
+ angle_resolution=float(angle_resolution),
+ )
+
+
+def vf_category_to_volume_fraction(vf_category: int) -> float:
+ vf_category = int(vf_category)
+ if 0 <= vf_category < len(VF_CATEGORIES):
+ return float(VF_CATEGORIES[vf_category])
+ return float(VF_CATEGORIES[0])
+
+
+def postprocess_sample(
+ out: Dict[str, torch.Tensor],
+ use_discrete_angles: bool,
+ angle_categories_deg: Optional[np.ndarray],
+) -> Tuple[str, float, list[float]]:
+ mat_idx = int(out["material_t"].item())
+ vf_idx = int(out["vf_category_t"].item())
+ mat = MATERIAL_NAMES[mat_idx] if 0 <= mat_idx < len(MATERIAL_NAMES) else f"MAT{mat_idx}"
+ vf = vf_category_to_volume_fraction(vf_idx)
+
+ layer = out["layer_t"].detach().cpu().numpy()[0]
+ angle = out["angle_t"].detach().cpu().numpy()[0]
+
+ if use_discrete_angles:
+ if angle_categories_deg is None:
+ raise ValueError("angle_categories_deg is required for discrete angles")
+ dead_category = int(len(angle_categories_deg))
+ alive_mask = angle != dead_category
+ angle_cats = angle[alive_mask].astype(int)
+ angles_deg = [float(angle_categories_deg[c]) for c in angle_cats]
+ else:
+ alive_mask = layer == 1
+ vals = angle[alive_mask, 0] if angle.ndim > 1 else angle[alive_mask]
+ angles_deg = np.rad2deg(vals).astype(np.float32).tolist()
+
+ return mat, vf, sorted([float(a) for a in angles_deg])
+
diff --git a/data_generation/hf_space_generation_ro/space_lib/metadata.py b/data_generation/hf_space_generation_ro/space_lib/metadata.py
new file mode 100644
index 0000000000000000000000000000000000000000..7daf910fc43fee1aac63e1f23b61aba46ec3c226
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/metadata.py
@@ -0,0 +1,127 @@
+from __future__ import annotations
+
+import json
+import os
+from dataclasses import dataclass
+from typing import Any, Dict, Tuple
+
+import numpy as np
+
+
+RO_DROP_FLAT_IDXS = (5, 11) # padded zeros in flattened [5,3]
+
+
+@dataclass(frozen=True)
+class ROMetadata:
+ raw: Dict[str, Any]
+ ro_min_full: np.ndarray # (15,)
+ ro_max_full: np.ndarray # (15,)
+ ro_mean_full: np.ndarray | None # (15,) or None
+ ro_std_full: np.ndarray | None # (15,) or None
+ eps_11_scale: float
+ eps_22_scale: float
+ eps_12_scale: float
+
+ @property
+ def ro_min_13(self) -> np.ndarray:
+ keep = _keep_mask_15()
+ return self.ro_min_full[keep]
+
+ @property
+ def ro_max_13(self) -> np.ndarray:
+ keep = _keep_mask_15()
+ return self.ro_max_full[keep]
+
+ @property
+ def ro_mean_13(self) -> np.ndarray | None:
+ if self.ro_mean_full is None:
+ return None
+ keep = _keep_mask_15()
+ return self.ro_mean_full[keep]
+
+ @property
+ def ro_std_13(self) -> np.ndarray | None:
+ if self.ro_std_full is None:
+ return None
+ keep = _keep_mask_15()
+ return self.ro_std_full[keep]
+
+
+def _keep_mask_15() -> np.ndarray:
+ keep = np.ones(15, dtype=bool)
+ keep[list(RO_DROP_FLAT_IDXS)] = False
+ return keep
+
+
+def load_metadata_ro(data_dir: str) -> ROMetadata:
+ path = os.path.join(data_dir, "metadata_ro.json")
+ with open(path, "r") as f:
+ raw = json.load(f)
+
+ ro_min_full = np.asarray(raw["ramberg_osgood_param_min"], dtype=np.float32)
+ ro_max_full = np.asarray(raw["ramberg_osgood_param_max"], dtype=np.float32)
+ ro_mean_full = raw.get("ramberg_osgood_param_mean", None)
+ ro_std_full = raw.get("ramberg_osgood_param_std", None)
+
+ ro_mean_arr = np.asarray(ro_mean_full, dtype=np.float32) if ro_mean_full is not None else None
+ ro_std_arr = np.asarray(ro_std_full, dtype=np.float32) if ro_std_full is not None else None
+
+ return ROMetadata(
+ raw=raw,
+ ro_min_full=ro_min_full,
+ ro_max_full=ro_max_full,
+ ro_mean_full=ro_mean_arr,
+ ro_std_full=ro_std_arr,
+ eps_11_scale=float(raw.get("eps_11_scale", 0.1)),
+ eps_22_scale=float(raw.get("eps_22_scale", 0.1)),
+ eps_12_scale=float(raw.get("eps_12_scale", 0.1)),
+ )
+
+
+def ro15_from_groups(groups_5x3: np.ndarray) -> np.ndarray:
+ arr = np.asarray(groups_5x3, dtype=np.float32)
+ if arr.shape != (5, 3):
+ raise ValueError(f"Expected shape (5,3), got {arr.shape}")
+ return arr.flatten() # (15,)
+
+
+def ro13_from_ro15(ro15: np.ndarray) -> np.ndarray:
+ ro15 = np.asarray(ro15, dtype=np.float32).flatten()
+ if ro15.size != 15:
+ raise ValueError(f"Expected 15 values, got {ro15.size}")
+ keep = _keep_mask_15()
+ return ro15[keep] # (13,)
+
+
+def normalize_ro13(ro13_raw: np.ndarray, meta: ROMetadata, method: str) -> np.ndarray:
+ x = np.asarray(ro13_raw, dtype=np.float32).flatten()
+ if x.size != 13:
+ raise ValueError(f"Expected 13 values, got {x.size}")
+
+ method = (method or "minmax").lower()
+ if method == "minmax":
+ mn = meta.ro_min_13
+ mx = meta.ro_max_13
+ rng = mx - mn
+ rng = np.where(rng == 0, 1.0, rng)
+ return ((x - mn) / rng).astype(np.float32)
+ if method == "zscore":
+ if meta.ro_mean_13 is None or meta.ro_std_13 is None:
+ raise ValueError("metadata_ro.json missing ramberg_osgood_param_mean/std for zscore")
+ mu = meta.ro_mean_13
+ sd = np.where(meta.ro_std_13 == 0, 1.0, meta.ro_std_13)
+ return ((x - mu) / sd).astype(np.float32)
+
+ raise ValueError(f"Unknown normalization method: {method}")
+
+
+def ro_groups_from_ro15(ro15: np.ndarray) -> np.ndarray:
+ ro15 = np.asarray(ro15, dtype=np.float32).flatten()
+ if ro15.size != 15:
+ raise ValueError(f"Expected 15 values, got {ro15.size}")
+ return ro15.reshape(5, 3)
+
+
+def ro15_minmax(meta: ROMetadata) -> Tuple[np.ndarray, np.ndarray]:
+ return meta.ro_min_full.copy(), meta.ro_max_full.copy()
+
diff --git a/data_generation/hf_space_generation_ro/space_lib/models.py b/data_generation/hf_space_generation_ro/space_lib/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f86a9958c059953be84f7a64b6eedf8db18bca9
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/models.py
@@ -0,0 +1,238 @@
+import torch
+import torch.nn as nn
+from typing import Dict, Tuple
+from dataclasses import dataclass
+import math
+
+
+# =========================
+# Config
+# =========================
+
+@dataclass
+class ModelConfig:
+ # problem sizes
+ n_conditions: int = 8
+ n_materials: int = 10
+ n_vf_categories: int = 5 # Volume fraction categories: 0.0924, 0.2155, 0.3079, 0.4002, 0.4926
+ n_max_layer: int = 24
+
+ # model architecture
+ d_model: int = 256
+ n_heads: int = 4
+ n_layers: int = 6
+ dropout: float = 0.0
+
+ # angle is in radians, limited to (-pi/2, pi/2)
+
+
+# =========================
+# Model
+# =========================
+
+def timestep_embedding(t: torch.Tensor, dim: int) -> torch.Tensor:
+ """
+ Sinusoidal timestep embedding. t: (B,)
+ """
+ half = dim // 2
+ freqs = torch.exp(-math.log(10000) * torch.arange(0, half, device=t.device) / half)
+ args = t.float().unsqueeze(1) * freqs.unsqueeze(0)
+ emb = torch.cat([torch.cos(args), torch.sin(args)], dim=1)
+ if dim % 2 == 1:
+ emb = torch.cat([emb, torch.zeros_like(emb[:, :1])], dim=1)
+ return emb # (B, dim)
+
+
+class SelfCrossAttnBlock(nn.Module):
+ def __init__(self, d_model, n_heads, dropout=0.0):
+ super().__init__()
+ self.self_attn = nn.MultiheadAttention(
+ d_model, n_heads, dropout=dropout, batch_first=True
+ )
+ self.cross_attn = nn.MultiheadAttention(
+ d_model, n_heads, dropout=dropout, batch_first=True
+ )
+ self.ff = nn.Sequential(
+ nn.Linear(d_model, 4 * d_model),
+ nn.SiLU(),
+ nn.Linear(4 * d_model, d_model),
+ )
+
+ self.ln1 = nn.LayerNorm(d_model)
+ self.ln2 = nn.LayerNorm(d_model)
+ self.ln3 = nn.LayerNorm(d_model)
+
+ def forward(self, x, cond_tokens, key_padding_mask=None):
+ """
+ x: (B, N, d) ← material + nfiber + angle tokens
+ cond_tokens:(B, M, d) ← condition tokens
+ key_padding_mask: (B, N) optional padding mask (True = mask out, False = keep)
+ """
+ # self-attention (within tokens)
+ x = self.ln1(x + self.self_attn(x, x, x, key_padding_mask=key_padding_mask)[0])
+
+ # cross-attention (tokens attend to conditions)
+ x = self.ln2(x + self.cross_attn(x, cond_tokens, cond_tokens)[0])
+
+ # feed-forward
+ x = self.ln3(x + self.ff(x))
+ return x
+
+
+class MaterialHybridDenoiser(nn.Module):
+ """
+ Inputs:
+ material_t: (B,) in [0..n_materials-1] or MASK
+ vf_category_t: (B,) in [0..4] volume fraction category or MASK
+ layer_t: (B,L) in {0,1} or MASK
+ Note: When use_discrete_angles=True, layer_t is redundant (derived from angle_t,
+ where angle_t==n_angle_categories means dead layer). The model ignores layer_emb
+ in this case and only uses angle_emb.
+ angle_t: (B,L) discrete category indices [0..n_angle_categories-1] or MASK (if use_discrete_angles)
+ OR (B,L,1) continuous (if not use_discrete_angles)
+ When discrete: category n_angle_categories = dead layer, n_angle_categories+1 = MASK
+ cond: (B,C) continuous
+ t: (B,) timestep
+
+ Outputs:
+ material logits: (B, n_materials)
+ vf_category_logits: (B, 5) # 5 volume fraction categories
+ layer logits: (B,L,2) # alive/dead (only if not use_discrete_angles)
+ angle_logits: (B,L,n_angle_categories+1) # discrete angle categories + dead (if use_discrete_angles)
+ OR angle: (B,L,1) # angle in radians, range (0, pi/2) (if not use_discrete_angles)
+ """
+ def __init__(self, cfg: ModelConfig, mask_ids: Dict[str, int], use_discrete_angles: bool = True, n_angle_categories: int = 7):
+ super().__init__()
+ self.cfg = cfg
+ self.L = cfg.n_max_layer
+ d = cfg.d_model
+ self.mask_ids = mask_ids
+ self.use_discrete_angles = use_discrete_angles
+ self.n_angle_categories = n_angle_categories # 7 categories: 0, 15, 30, 45, 60, 75, 90 degrees
+
+ # +1 to include mask token for material
+ self.material_emb = nn.Embedding(cfg.n_materials + 1, d)
+ # vf_category: 5 categories (0-4) plus mask; we allocate 6
+ self.vf_category_emb = nn.Embedding(cfg.n_vf_categories + 1, d)
+
+ if use_discrete_angles:
+ # Angle categories: 0..n_angle_categories-1
+ # Category n_angle_categories: dead layer
+ # Category n_angle_categories+1: mask token
+ self.angle_emb = nn.Embedding(n_angle_categories + 2, d)
+ self.layer_emb = None # Not needed when using discrete angles
+ else:
+ # layer token: {MASK, 0, 1} => 3 (only needed for continuous angles)
+ self.layer_emb = nn.Embedding(3, d)
+ self.angle_in = nn.Linear(1, d)
+
+ # Condition projection (TRAINED).
+ # Input cond can be either:
+ # - (B, C): raw condition vector (preferred; gets projected here)
+ # - (B, C, d): already-projected condition tokens (backward-compatible)
+ self.cond_proj = nn.ModuleList([
+ nn.Linear(1, d) for _ in range(cfg.n_conditions)
+ ])
+
+ self.blocks = nn.ModuleList([
+ SelfCrossAttnBlock(d, cfg.n_heads, cfg.dropout)
+ for _ in range(cfg.n_layers)
+ ])
+
+ # Positional embeddings for entire sequence: material (pos 0) + vf_category (pos 1) + layers (pos 2..)
+ self.pos_emb = nn.Embedding(2 + cfg.n_max_layer, d)
+
+ self.t_proj = nn.Linear(d, d)
+
+ enc_layer = nn.TransformerEncoderLayer(
+ d_model=d,
+ nhead=cfg.n_heads,
+ dropout=cfg.dropout,
+ batch_first=True,
+ )
+ self.encoder = nn.TransformerEncoder(enc_layer, num_layers=cfg.n_layers)
+ self.ln = nn.LayerNorm(d)
+
+ self.material_head = nn.Linear(d, cfg.n_materials)
+ self.vf_category_head = nn.Linear(d, cfg.n_vf_categories) # 5 volume fraction categories
+ if use_discrete_angles:
+ self.angle_head = nn.Linear(d, n_angle_categories + 1) # angles + dead
+ self.layer_head = None
+ else:
+ self.layer_head = nn.Linear(d, 2) # alive/dead for continuous mode
+ self.angle_head = nn.Linear(d, 1)
+
+ def forward(self, material_t, vf_category_t, layer_t, angle_t, cond, t):
+ B, L = layer_t.shape
+ assert L == self.L
+
+ # Project conditions if provided as raw scalars (B, C)
+ if cond.dim() == 2:
+ cond_list = []
+ for i in range(cond.shape[1]):
+ cond_list.append(self.cond_proj[i](cond[:, i:i+1].unsqueeze(-1))) # (B, 1, d)
+ cond = torch.cat(cond_list, dim=1) # (B, C, d)
+
+ # global tokens
+ g_mat = self.material_emb(material_t).unsqueeze(1) # (B,1,d)
+ g_vf = self.vf_category_emb(vf_category_t).unsqueeze(1) # (B,1,d)
+
+ # per-layer tokens
+ if self.use_discrete_angles:
+ layer_h = self.angle_emb(angle_t) # (B, L, d)
+ else:
+ layer_h = self.layer_emb(layer_t) + self.angle_in(angle_t) # (B,L,d)
+
+ h = torch.cat([g_mat, g_vf, layer_h], dim=1) # (B, 2+L, d)
+
+ # positional embeddings
+ pos_indices = torch.arange(2 + self.L, device=h.device) # (2+L,)
+ h = h + self.pos_emb(pos_indices).unsqueeze(0) # (B, 2+L, d)
+
+ # timestep
+ t_emb = timestep_embedding(t, h.size(-1)) # (B,d)
+ h = h + self.t_proj(t_emb).unsqueeze(1)
+
+ # key padding mask for discrete angle dead tokens
+ key_padding_mask = None
+ if self.use_discrete_angles:
+ dead_category = self.n_angle_categories
+ is_dead = (angle_t == dead_category) # (B, L)
+ first_dead_pos = torch.zeros(B, dtype=torch.long, device=angle_t.device)
+ for b in range(B):
+ dead_positions = torch.where(is_dead[b])[0]
+ if len(dead_positions) > 0:
+ first_dead_pos[b] = dead_positions[0].item() + 2
+ else:
+ first_dead_pos[b] = 2 + L
+ N = 2 + L
+ key_padding_mask = torch.zeros(B, N, dtype=torch.bool, device=h.device)
+ for b in range(B):
+ first_invalid = first_dead_pos[b].item()
+ if first_invalid < 2 + L:
+ key_padding_mask[b, first_invalid:] = True
+ key_padding_mask[b, :2] = False
+
+ for block in self.blocks:
+ h = block(h, cond, key_padding_mask=key_padding_mask)
+
+ h = self.ln(h)
+
+ if self.use_discrete_angles:
+ angle_logits = self.angle_head(h[:, 2:]) # (B, L, n_angle_categories + 1)
+ out = {
+ "material_logits": self.material_head(h[:, 0]),
+ "vf_category_logits": self.vf_category_head(h[:, 1]),
+ "angle_logits": angle_logits,
+ }
+ else:
+ angle_raw = self.angle_head(h[:, 2:]) # (B,L,1)
+ angle = torch.sigmoid(angle_raw) * (math.pi / 2) # (B,L,1)
+ out = {
+ "material_logits": self.material_head(h[:, 0]),
+ "vf_category_logits": self.vf_category_head(h[:, 1]),
+ "layer_logits": self.layer_head(h[:, 2:]),
+ "angle": angle,
+ }
+ return out
+
diff --git a/data_generation/hf_space_generation_ro/space_lib/plots.py b/data_generation/hf_space_generation_ro/space_lib/plots.py
new file mode 100644
index 0000000000000000000000000000000000000000..f19f23b49ebe52a6dcaa1ea695d79894ac221c05
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/plots.py
@@ -0,0 +1,205 @@
+from __future__ import annotations
+
+from typing import Dict, Tuple
+
+import matplotlib
+
+matplotlib.use("Agg")
+import matplotlib.pyplot as plt
+import numpy as np
+
+from .ro_curves import ro_stress, ro_strain_strain
+
+
+def _fit_ro_stress_curve(strain: np.ndarray, stress: np.ndarray, x_scale: float) -> tuple[float, float, float] | None:
+ """
+ Fit y = a*xn + b*xn^c where xn = strain/x_scale.
+ Lightweight grid-search over c; solve a,b by least squares.
+ Returns (a,b,c) for ro_stress().
+ """
+ x = np.asarray(strain, dtype=np.float32).reshape(-1)
+ y = np.asarray(stress, dtype=np.float32).reshape(-1)
+ if x.size < 4 or y.size != x.size:
+ return None
+ x_scale = float(x_scale) if x_scale and x_scale > 0 else 1.0
+ xn = np.clip(x / x_scale, 1e-6, None)
+
+ c_grid = np.concatenate(
+ [
+ np.linspace(0.5, 6.0, 56, dtype=np.float32),
+ np.linspace(6.5, 20.0, 28, dtype=np.float32),
+ ]
+ )
+ best: tuple[float, float, float] | None = None
+ best_mse = float("inf")
+ for c in c_grid:
+ phi1 = xn
+ phi2 = np.power(xn, float(c))
+ A = np.stack([phi1, phi2], axis=1)
+ try:
+ coef, *_ = np.linalg.lstsq(A, y, rcond=None)
+ except Exception:
+ continue
+ a, b = float(coef[0]), float(coef[1])
+ yhat = a * phi1 + b * phi2
+ mse = float(np.mean((yhat - y) ** 2))
+ if np.isfinite(mse) and mse < best_mse:
+ best_mse = mse
+ best = (a, b, float(c))
+ return best
+
+
+def _fit_ro_lateral_curve(strain: np.ndarray, lateral: np.ndarray, x_scale: float, y_scale: float) -> tuple[float, float] | None:
+ """
+ Fit y_norm = a*|xn|^b where xn=strain/x_scale and y_norm=lateral/y_scale.
+ Grid-search over b; solve a by least squares (allows negative a).
+ Returns (a,b) for ro_strain_strain().
+ """
+ x = np.asarray(strain, dtype=np.float32).reshape(-1)
+ y = np.asarray(lateral, dtype=np.float32).reshape(-1)
+ if x.size < 4 or y.size != x.size:
+ return None
+ x_scale = float(x_scale) if x_scale and x_scale > 0 else 1.0
+ y_scale = float(y_scale) if y_scale and y_scale > 0 else 1.0
+ xn = np.clip(np.abs(x / x_scale), 1e-6, None)
+ yn = y / y_scale
+
+ b_grid = np.concatenate(
+ [
+ np.linspace(0.2, 6.0, 60, dtype=np.float32),
+ np.linspace(6.5, 20.0, 28, dtype=np.float32),
+ ]
+ )
+ best: tuple[float, float] | None = None
+ best_mse = float("inf")
+ for b in b_grid:
+ phi = np.power(xn, float(b))
+ denom = float(phi @ phi)
+ if denom <= 1e-12:
+ continue
+ a = float((phi @ yn) / denom)
+ yhat = a * phi
+ mse = float(np.mean((yhat - yn) ** 2))
+ if np.isfinite(mse) and mse < best_mse:
+ best_mse = mse
+ best = (a, float(b))
+ return best
+
+
+def plot_condition_and_simulations(
+ ro_groups_5x3: np.ndarray,
+ eps_scales: Tuple[float, float, float],
+ simulations_by_instance: Dict[int, Dict[str, Dict[str, np.ndarray]]],
+) -> plt.Figure:
+ ro = np.asarray(ro_groups_5x3, dtype=np.float32).reshape(5, 3)
+ eps_11_scale, eps_22_scale, eps_12_scale = map(float, eps_scales)
+
+ fig, axes = plt.subplots(2, 3, figsize=(12, 7))
+ modes = ["11", "22", "12"]
+ colors = ["b", "c", "m", "g", "r"]
+
+ for col, mode in enumerate(modes):
+ # Determine x-range from simulation if possible
+ x_min, x_max = None, None
+ for inst, sim in simulations_by_instance.items():
+ if mode in sim:
+ x = sim[mode]["strain"]
+ x_min = float(np.min(x))
+ x_max = float(np.max(x))
+ break
+
+ if x_min is None or x_max is None or x_max <= x_min:
+ # fallback stable range
+ if mode == "11":
+ x_min, x_max = 0.0, eps_11_scale
+ elif mode == "22":
+ x_min, x_max = 0.0, eps_22_scale
+ else:
+ x_min, x_max = 0.0, eps_12_scale
+
+ x_fit = np.linspace(float(x_min), float(x_max), 250, dtype=np.float32)
+
+ # Condition curve (black)
+ if mode == "11":
+ a0, b0, c0 = ro[0]
+ y = ro_stress(x_fit, float(a0), float(b0), float(c0), eps_11_scale)
+ axes[0, col].plot(x_fit, y, color="k", linewidth=2, label="Cond input")
+
+ a1, b1, _ = ro[1]
+ y_lat = ro_strain_strain(x_fit, float(a1), float(b1), eps_11_scale, eps_22_scale)
+ axes[1, col].plot(x_fit, y_lat, color="k", linewidth=2, label="Cond input")
+ axes[0, col].set_title("Mode 11")
+ axes[1, col].set_title("Mode 11 lateral")
+
+ elif mode == "22":
+ a0, b0, c0 = ro[2]
+ y = ro_stress(x_fit, float(a0), float(b0), float(c0), eps_22_scale)
+ axes[0, col].plot(x_fit, y, color="k", linewidth=2, label="Cond input")
+
+ a1, b1, _ = ro[3]
+ y_lat = ro_strain_strain(x_fit, float(a1), float(b1), eps_22_scale, eps_11_scale)
+ axes[1, col].plot(x_fit, y_lat, color="k", linewidth=2, label="Cond input")
+ axes[0, col].set_title("Mode 22")
+ axes[1, col].set_title("Mode 22 lateral")
+
+ else:
+ a0, b0, c0 = ro[4]
+ y = ro_stress(x_fit, float(a0), float(b0), float(c0), eps_12_scale)
+ axes[0, col].plot(x_fit, y, color="k", linewidth=2, label="Cond input")
+ axes[0, col].set_title("Mode 12")
+ axes[1, col].axis("off")
+
+ # Simulations overlay: dots + fitted RO curves (like train.py on_the_fly_validation)
+ for idx, (inst, sim) in enumerate(sorted(simulations_by_instance.items(), key=lambda kv: kv[0])):
+ if mode not in sim:
+ continue
+ d = sim[mode]
+ c = colors[idx % len(colors)]
+ axes[0, col].plot([], [], color=c, linewidth=2, label=f"Sim inst{inst}")
+ axes[0, col].scatter(d["strain"], d["stress"], color=c, s=22, alpha=0.85, label="_nolegend_")
+
+ if mode == "11":
+ x_scale = eps_11_scale
+ elif mode == "22":
+ x_scale = eps_22_scale
+ else:
+ x_scale = eps_12_scale
+
+ fit = _fit_ro_stress_curve(d["strain"], d["stress"], x_scale=x_scale)
+ if fit is not None and len(d["strain"]) >= 2:
+ fa, fb, fc = fit
+ x_line = np.linspace(float(np.min(d["strain"])), float(np.max(d["strain"])), 200, dtype=np.float32)
+ y_line = ro_stress(x_line, fa, fb, fc, x_scale)
+ axes[0, col].plot(x_line, y_line, color=c, linewidth=2, alpha=0.9, label="_nolegend_")
+
+ if mode in ("11", "22") and d.get("lateral") is not None:
+ axes[1, col].plot([], [], color=c, linewidth=2, label=f"Sim inst{inst}")
+ axes[1, col].scatter(d["strain"], d["lateral"], color=c, s=22, alpha=0.85, label="_nolegend_")
+
+ if mode == "11":
+ x_scale_lat, y_scale_lat = eps_11_scale, eps_22_scale
+ else:
+ x_scale_lat, y_scale_lat = eps_22_scale, eps_11_scale
+ fit_lat = _fit_ro_lateral_curve(d["strain"], d["lateral"], x_scale=x_scale_lat, y_scale=y_scale_lat)
+ if fit_lat is not None and len(d["strain"]) >= 2:
+ fa, fb = fit_lat
+ x_line = np.linspace(float(np.min(d["strain"])), float(np.max(d["strain"])), 200, dtype=np.float32)
+ y_line = ro_strain_strain(x_line, fa, fb, x_scale_lat, y_scale_lat)
+ axes[1, col].plot(x_line, y_line, color=c, linewidth=2, alpha=0.9, label="_nolegend_")
+
+ axes[0, col].set_xlabel("strain")
+ axes[0, col].set_ylabel("stress (MPa)")
+ axes[0, col].grid(True, alpha=0.25)
+ if mode in ("11", "22"):
+ axes[1, col].set_xlabel("strain")
+ axes[1, col].set_ylabel("lateral strain")
+ axes[1, col].grid(True, alpha=0.25)
+
+ # Legends
+ axes[0, col].legend(fontsize=8)
+ if mode in ("11", "22"):
+ axes[1, col].legend(fontsize=8)
+
+ fig.tight_layout()
+ return fig
+
diff --git a/data_generation/hf_space_generation_ro/space_lib/ro_curves.py b/data_generation/hf_space_generation_ro/space_lib/ro_curves.py
new file mode 100644
index 0000000000000000000000000000000000000000..b16da335d65c4684746d077673676e660ba8b76b
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/ro_curves.py
@@ -0,0 +1,135 @@
+from __future__ import annotations
+
+from typing import Tuple
+
+import matplotlib
+
+matplotlib.use("Agg")
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+def ro_stress(x: np.ndarray, a: float, b: float, c: float, x_scale: float) -> np.ndarray:
+ x = np.asarray(x, dtype=np.float32)
+ x_norm = x / x_scale if x_scale and x_scale > 0 else x
+ return a * x_norm + b * np.power(x_norm, c)
+
+
+def ro_strain_strain(x: np.ndarray, a: float, b: float, x_scale: float, y_scale: float) -> np.ndarray:
+ x = np.asarray(x, dtype=np.float32)
+ x_norm = x / x_scale if x_scale and x_scale > 0 else x
+ y_norm = a * np.power(np.abs(x_norm), b)
+ return y_norm * y_scale if y_scale and y_scale > 0 else y_norm
+
+
+def plot_ro_stress_relation(
+ *,
+ a: float,
+ b: float,
+ c: float,
+ x_scale: float,
+ x_max: float,
+ title: str,
+) -> plt.Figure:
+ x = np.linspace(0.0, float(x_max), 250, dtype=np.float32)
+ y = ro_stress(x, float(a), float(b), float(c), float(x_scale))
+ fig, ax = plt.subplots(1, 1, figsize=(6, 3.5))
+ ax.plot(x, y, color="k", linewidth=2)
+ ax.set_title(title)
+ ax.set_xlabel("strain")
+ ax.set_ylabel("stress (MPa)")
+ ax.grid(True, alpha=0.25)
+ fig.tight_layout()
+ return fig
+
+
+def plot_ro_lateral_relation(
+ *,
+ a: float,
+ b: float,
+ x_scale: float,
+ y_scale: float,
+ x_max: float,
+ title: str,
+) -> plt.Figure:
+ x = np.linspace(0.0, float(x_max), 250, dtype=np.float32)
+ y = ro_strain_strain(x, float(a), float(b), float(x_scale), float(y_scale))
+ fig, ax = plt.subplots(1, 1, figsize=(6, 3.5))
+ ax.plot(x, y, color="k", linewidth=2)
+ ax.set_title(title)
+ ax.set_xlabel("strain")
+ ax.set_ylabel("lateral strain")
+ ax.grid(True, alpha=0.25)
+ fig.tight_layout()
+ return fig
+
+
+def plot_condition_preview(
+ ro_groups_5x3: np.ndarray,
+ eps_scales: Tuple[float, float, float],
+ x_max: float | None = None,
+) -> plt.Figure:
+ """
+ Preview only the conditioned RO curves implied by the sliders.
+ Layout matches validation plots: 2 rows (stress, lateral) x 3 cols (11,22,12).
+ """
+ ro = np.asarray(ro_groups_5x3, dtype=np.float32).reshape(5, 3)
+ eps_11_scale, eps_22_scale, eps_12_scale = (float(eps_scales[0]), float(eps_scales[1]), float(eps_scales[2]))
+
+ # Use a strain range that is stable for UI preview.
+ # Default to 0..scale for each mode unless user overrides x_max.
+ def _x_grid(scale: float) -> np.ndarray:
+ xm = float(x_max) if x_max is not None else float(scale)
+ xm = max(xm, 1e-6)
+ return np.linspace(0.0, xm, 250, dtype=np.float32)
+
+ fig, axes = plt.subplots(2, 3, figsize=(12, 7))
+ modes = ["11", "22", "12"]
+ for col, mode in enumerate(modes):
+ if mode == "11":
+ x = _x_grid(eps_11_scale)
+ a0, b0, c0 = ro[0]
+ y_stress = ro_stress(x, float(a0), float(b0), float(c0), eps_11_scale)
+ axes[0, col].plot(x, y_stress, color="k", linewidth=2)
+
+ a1, b1, _ = ro[1]
+ y_lat = ro_strain_strain(x, float(a1), float(b1), eps_11_scale, eps_22_scale)
+ axes[1, col].plot(x, y_lat, color="k", linewidth=2)
+
+ axes[0, col].set_title("Mode 11: σ11(ε11)")
+ axes[1, col].set_title("Mode 11: ε22(ε11)")
+
+ elif mode == "22":
+ x = _x_grid(eps_22_scale)
+ a0, b0, c0 = ro[2]
+ y_stress = ro_stress(x, float(a0), float(b0), float(c0), eps_22_scale)
+ axes[0, col].plot(x, y_stress, color="k", linewidth=2)
+
+ a1, b1, _ = ro[3]
+ y_lat = ro_strain_strain(x, float(a1), float(b1), eps_22_scale, eps_11_scale)
+ axes[1, col].plot(x, y_lat, color="k", linewidth=2)
+
+ axes[0, col].set_title("Mode 22: σ22(ε22)")
+ axes[1, col].set_title("Mode 22: ε11(ε22)")
+
+ else: # 12
+ x = _x_grid(eps_12_scale)
+ a0, b0, c0 = ro[4]
+ y_stress = ro_stress(x, float(a0), float(b0), float(c0), eps_12_scale)
+ axes[0, col].plot(x, y_stress, color="k", linewidth=2)
+ axes[0, col].set_title("Mode 12: σ12(ε12)")
+ axes[1, col].axis("off")
+
+ axes[0, col].set_xlabel("strain")
+ axes[0, col].set_ylabel("stress (MPa)")
+ if mode in ("11", "22"):
+ axes[1, col].set_xlabel("strain")
+ axes[1, col].set_ylabel("lateral strain")
+
+ axes[0, col].grid(True, alpha=0.25)
+ if mode in ("11", "22"):
+ axes[1, col].grid(True, alpha=0.25)
+
+ fig.tight_layout()
+ return fig
+
diff --git a/data_generation/hf_space_generation_ro/space_lib/simulate.py b/data_generation/hf_space_generation_ro/space_lib/simulate.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9a7cd8481b50570be6c9cbdbcf1ddb2653b8392
--- /dev/null
+++ b/data_generation/hf_space_generation_ro/space_lib/simulate.py
@@ -0,0 +1,242 @@
+from __future__ import annotations
+
+import importlib.util
+import os
+from pathlib import Path
+from typing import Dict, List, Tuple
+
+import numpy as np
+
+
+def format_vol_fraction(vf: float) -> str:
+ return f"{float(vf):.4f}"
+
+
+def _import_lam(lam_dir: str):
+ lam_dir_p = Path(lam_dir).resolve()
+ lam_py = lam_dir_p / "lam.py"
+ if not lam_py.exists():
+ raise FileNotFoundError(f"lam.py not found in {lam_dir_p}")
+ spec = importlib.util.spec_from_file_location("lam", lam_py)
+ lam = importlib.util.module_from_spec(spec)
+ assert spec and spec.loader
+ spec.loader.exec_module(lam)
+ return lam
+
+
+def run_simulation_with_mat(lam, prefix: str, full_angles: List[float], mode: str, mat):
+ """
+ Copy of data_generation/generate_data_mp.py::run_simulation_with_mat.
+ Returns: ex, sx, ey, gxy, ezz, g23, g13, e11
+ """
+ tply = 0.05
+ plies = [lam.Ply(float(angle_deg), tply, mat) for angle_deg in full_angles]
+ laminate = lam.Laminate(plies)
+
+ if mode == "11":
+ main_index = 0
+ eps_max = 0.10
+ elif mode == "22":
+ main_index = 1
+ eps_max = 0.10
+ elif mode == "12":
+ main_index = 5
+ eps_max = 0.20
+ else:
+ raise ValueError("mode must be '11', '22' or '12'")
+
+ main_steps = np.linspace(0.0, eps_max, 1500)
+
+ ex_hist, sx_hist = [], []
+ ey_hist, gxy_hist = [], []
+ ezz_hist, g23_hist, g13_hist = [], [], []
+ e11_hist = []
+
+ ex_prev = 0.0
+ ey_prev = 0.0
+ gxy_prev = 0.0
+ ezz_prev = 0.0
+ g23_prev = 0.0
+ g13_prev = 0.0
+ s1_prev = 0.0
+
+ for i in range(1, len(main_steps)):
+ main_target = main_steps[i]
+
+ if main_index == 0:
+ main_prev = ex_prev
+ elif main_index == 1:
+ main_prev = ey_prev
+ else:
+ main_prev = gxy_prev
+
+ dmain = main_target - main_prev
+
+ Ceff_prev = laminate.effective_C_from_previous_strains(
+ ex_prev, ey_prev, ezz_prev, g23_prev, g13_prev, gxy_prev
+ )
+
+ cond = np.linalg.cond(Ceff_prev)
+ if not np.isfinite(cond) or cond > lam.COND_MAX:
+ raise np.linalg.LinAlgError(
+ f"Effective C is ill-conditioned (cond={cond:.3e}) at step {i}"
+ )
+
+ e_j = np.zeros(6)
+ e_j[main_index] = 1.0
+
+ try:
+ S_col = np.linalg.solve(Ceff_prev, e_j)
+ except np.linalg.LinAlgError as err:
+ raise np.linalg.LinAlgError(
+ f"Failed to solve for compliance column at step {i}: {err}"
+ )
+
+ Sjj = S_col[main_index]
+ if abs(Sjj) < 1e-20:
+ raise ZeroDivisionError(
+ f"Sjj is zero or too small at step {i} (Sjj={Sjj:.3e})."
+ )
+
+ ds1 = dmain / Sjj
+ de_vec = S_col * ds1
+ de_vec[main_index] = dmain
+
+ de1, de2, de3, de4, de5, de6 = de_vec
+ de4 = 0.0
+ de5 = 0.0
+
+ s1 = s1_prev + ds1
+ ex = ex_prev + de1
+ ey = ey_prev + de2
+ ezz = ezz_prev + de3
+ g23 = g23_prev + de4
+ g13 = g13_prev + de5
+ gxy = gxy_prev + de6
+
+ laminate.update_fiber_angles_incremental(de1, de2, de6)
+
+ ex_prev, ey_prev, ezz_prev = ex, ey, ezz
+ g23_prev, g13_prev, gxy_prev = g23, g13, gxy
+ s1_prev = s1
+
+ if main_index == 0:
+ main_strain = ex
+ elif main_index == 1:
+ main_strain = ey
+ else:
+ main_strain = 0.5 * gxy
+
+ ex_hist.append(main_strain)
+ sx_hist.append(s1)
+ ey_hist.append(ey)
+ gxy_hist.append(gxy)
+ ezz_hist.append(ezz)
+ g23_hist.append(g23)
+ g13_hist.append(g13)
+ e11_hist.append(ex)
+
+ result = (
+ np.array(ex_hist),
+ np.array(sx_hist),
+ np.array(ey_hist),
+ np.array(gxy_hist),
+ np.array(ezz_hist),
+ np.array(g23_hist),
+ np.array(g13_hist),
+ np.array(e11_hist),
+ )
+ if len(result) != 8:
+ raise ValueError(f"Internal error: expected 8 return values, got {len(result)}")
+ return result
+
+
+def simulate_instances(
+ *,
+ curve_dir: str,
+ lam_dir: str,
+ mat_type: str,
+ vf: float,
+ upper_angles: List[float],
+ instances: List[int],
+ num_output_points: int = 10,
+) -> Dict[int, Dict[str, Dict[str, np.ndarray]]]:
+ """
+ Returns:
+ {instance: {"11": {"strain","stress","lateral"}, "22": {...}, "12": {...}}}
+ """
+ lam = _import_lam(lam_dir)
+
+ curve_dir_path = Path(curve_dir).resolve()
+ if not curve_dir_path.exists():
+ raise FileNotFoundError(f"curve_dir does not exist: {curve_dir_path}")
+
+ original_curve_dir = lam.CURVE_DIR
+ lam.CURVE_DIR = curve_dir_path
+ try:
+ vf_str = format_vol_fraction(vf)
+ out: Dict[int, Dict[str, Dict[str, np.ndarray]]] = {}
+ errors: Dict[int, List[str]] = {}
+
+ for inst in instances:
+ prefix = f"{mat_type}_{vf_str}_{int(inst)}"
+ # Fail fast if required curve files are missing.
+ for mode in ("11", "22", "12"):
+ p = curve_dir_path / f"{prefix}_{mode}.txt"
+ if not p.exists():
+ raise FileNotFoundError(f"Missing curve file: {p} (needed for simulation)")
+ vf_meta, centers_meta, n_fibers = lam.read_instance_metadata(prefix)
+ mat = lam.load_ud_material_from_files(prefix)
+ full_angles = lam.build_full_symmetric_stack(sorted([float(a) for a in upper_angles]))
+
+ sim_modes: Dict[str, Dict[str, np.ndarray]] = {}
+ for mode in ("11", "22", "12"):
+ try:
+ ex, sx, ey, gxy, ezz, g23, g13, e11 = run_simulation_with_mat(lam, prefix, full_angles, mode, mat)
+ if len(ex) < 2:
+ continue
+ x_out = np.linspace(float(ex[0]), float(ex[-1]), int(num_output_points))
+ sx_out_mpa = np.interp(x_out, ex, sx / 1e6)
+ if mode == "11":
+ lat_out = np.interp(x_out, ex, ey)
+ elif mode == "22":
+ lat_out = np.interp(x_out, ex, e11)
+ else:
+ lat_out = None
+ sim_modes[mode] = {
+ "strain": x_out.astype(np.float32),
+ "stress": sx_out_mpa.astype(np.float32),
+ "lateral": None if lat_out is None else lat_out.astype(np.float32),
+ }
+ except Exception as e:
+ errors.setdefault(int(inst), []).append(f"{mode} failed: {type(e).__name__}: {e}")
+ continue
+
+ if sim_modes:
+ out[int(inst)] = sim_modes
+ else:
+ errors.setdefault(int(inst), []).append("all modes failed")
+
+ if not out:
+ msg = f"No simulations succeeded for {mat_type} vf={vf_str} angles={upper_angles}."
+ if errors:
+ msg += " Errors: " + "; ".join(f"inst{inst}: {errs}" for inst, errs in errors.items())
+ raise RuntimeError(msg)
+
+ return out
+ finally:
+ lam.CURVE_DIR = original_curve_dir
+
+
+def default_lam_dir() -> str:
+ """
+ Default to the Space directory that contains a vendored `lam.py`.
+ Can be overridden via env MG_LAM_DIR.
+ """
+ env = os.environ.get("MG_LAM_DIR")
+ if env:
+ return env
+ # Space layout: data_generation/hf_space_generation_ro/lam.py
+ here = Path(__file__).resolve()
+ return str(here.parent.parent)
+
diff --git a/data_generation/processed_dataset/config_1/metadata.json b/data_generation/processed_dataset/config_1/metadata.json
new file mode 100644
index 0000000000000000000000000000000000000000..7e15284317c5a7423a6236e00d024add9dcd5e6b
--- /dev/null
+++ b/data_generation/processed_dataset/config_1/metadata.json
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1445e1ac3bf051c811c1c55520b1551d6298c467c276e2d65546d9bdb989d3d4
+size 237926037
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e5b5861640a8c878a02e9f89394cc5d94605bc69
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.534925e+01 -2.310667e-03 -2.307645e-03
+1.000000e-02 1.905271e+02 -4.604358e-03 -4.598334e-03
+1.500000e-02 2.853640e+02 -6.886136e-03 -6.877142e-03
+2.000000e-02 3.792480e+02 -9.173770e-03 -9.161830e-03
+2.500000e-02 4.720984e+02 -1.146994e-02 -1.145497e-02
+3.000000e-02 5.644633e+02 -1.375957e-02 -1.374152e-02
+3.500000e-02 6.565959e+02 -1.603539e-02 -1.601427e-02
+4.000000e-02 7.485469e+02 -1.829625e-02 -1.827210e-02
+4.500000e-02 8.403284e+02 -2.054202e-02 -2.051485e-02
+5.000000e-02 9.319449e+02 -2.277277e-02 -2.274262e-02
+5.500000e-02 1.023402e+03 -2.498851e-02 -2.495542e-02
+6.000000e-02 1.114698e+03 -2.718959e-02 -2.715359e-02
+6.500000e-02 1.205837e+03 -2.937602e-02 -2.933714e-02
+7.000000e-02 1.296823e+03 -3.154793e-02 -3.150620e-02
+7.500000e-02 1.387657e+03 -3.370544e-02 -3.366089e-02
+8.000000e-02 1.478341e+03 -3.584868e-02 -3.580135e-02
+8.500000e-02 1.568879e+03 -3.797777e-02 -3.792769e-02
+9.000000e-02 1.659271e+03 -4.009285e-02 -4.004004e-02
+9.500000e-02 1.749521e+03 -4.219405e-02 -4.213854e-02
+1.000000e-01 1.839629e+03 -4.428148e-02 -4.422331e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017275,0.022793) (0.002167,0.005617) (0.009285,0.034121) (0.042275,0.022793) (0.027167,0.005617) (0.034285,0.034121) (0.052167,0.005617)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b76847754e3770e2694af3a0fabeabfedd14cc59
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.839216e+00
+1.000000e-02 5.588398e+00
+1.500000e-02 7.680908e+00
+2.000000e-02 8.895033e+00
+2.500000e-02 9.728212e+00
+3.000000e-02 1.044392e+01
+3.500000e-02 1.109897e+01
+4.000000e-02 1.170674e+01
+4.500000e-02 1.227277e+01
+5.000000e-02 1.280090e+01
+5.500000e-02 1.329438e+01
+6.000000e-02 1.375612e+01
+6.500000e-02 1.418882e+01
+7.000000e-02 1.459495e+01
+7.500000e-02 1.497678e+01
+8.000000e-02 1.533224e+01
+8.500000e-02 1.567142e+01
+9.000000e-02 1.599245e+01
+9.500000e-02 1.629687e+01
+1.000000e-01 1.658625e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017275,0.022793) (0.002167,0.005617) (0.009285,0.034121) (0.042275,0.022793) (0.027167,0.005617) (0.034285,0.034121) (0.052167,0.005617)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..504f8dd1f0141429fcd13d56b5c26b47493687ed
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.396585e+00 -1.306340e-04 -4.456201e-03
+1.000000e-02 1.065990e+01 -2.572005e-04 -8.881963e-03
+1.500000e-02 1.482475e+01 -3.587396e-04 -1.336267e-02
+2.000000e-02 1.732569e+01 -4.229332e-04 -1.795116e-02
+2.500000e-02 1.903323e+01 -4.683321e-04 -2.257021e-02
+3.000000e-02 2.046323e+01 -5.063235e-04 -2.717229e-02
+3.500000e-02 2.175922e+01 -5.402466e-04 -3.174410e-02
+4.000000e-02 2.295725e+01 -5.710798e-04 -3.628243e-02
+4.500000e-02 2.407041e+01 -5.992676e-04 -4.078629e-02
+5.000000e-02 2.510145e+01 -6.248446e-04 -4.525610e-02
+5.500000e-02 2.606607e+01 -6.485539e-04 -4.968996e-02
+6.000000e-02 2.696554e+01 -6.703592e-04 -5.408849e-02
+6.500000e-02 2.780489e+01 -6.904354e-04 -5.845164e-02
+7.000000e-02 2.858871e+01 -7.089376e-04 -6.277939e-02
+7.500000e-02 2.932103e+01 -7.259987e-04 -6.707179e-02
+8.000000e-02 3.000571e+01 -7.417412e-04 -7.132894e-02
+8.500000e-02 3.064632e+01 -7.562750e-04 -7.555094e-02
+9.000000e-02 3.124631e+01 -7.697046e-04 -7.973792e-02
+9.500000e-02 3.180916e+01 -7.821311e-04 -8.389001e-02
+1.000000e-01 3.233775e+01 -7.936391e-04 -8.800741e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017275,0.022793) (0.002167,0.005617) (0.009285,0.034121) (0.042275,0.022793) (0.027167,0.005617) (0.034285,0.034121) (0.052167,0.005617)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cd1a2527eca7b220d74028e913ef093f3e18af3e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.536606e+01 -2.301440e-03 -2.316797e-03
+1.000000e-02 1.905607e+02 -4.585958e-03 -4.616585e-03
+1.500000e-02 2.854143e+02 -6.858610e-03 -6.904451e-03
+2.000000e-02 3.793148e+02 -9.136979e-03 -9.198358e-03
+2.500000e-02 4.721818e+02 -1.142342e-02 -1.150120e-02
+3.000000e-02 5.645633e+02 -1.370305e-02 -1.379772e-02
+3.500000e-02 6.567123e+02 -1.596880e-02 -1.608052e-02
+4.000000e-02 7.486799e+02 -1.821957e-02 -1.834841e-02
+4.500000e-02 8.404779e+02 -2.045524e-02 -2.060124e-02
+5.000000e-02 9.321136e+02 -2.267578e-02 -2.283897e-02
+5.500000e-02 1.023585e+03 -2.488153e-02 -2.506197e-02
+6.000000e-02 1.114897e+03 -2.707250e-02 -2.727023e-02
+6.500000e-02 1.206052e+03 -2.924882e-02 -2.946387e-02
+7.000000e-02 1.297054e+03 -3.141061e-02 -3.164303e-02
+7.500000e-02 1.387905e+03 -3.355801e-02 -3.380782e-02
+8.000000e-02 1.478606e+03 -3.569113e-02 -3.595838e-02
+8.500000e-02 1.569159e+03 -3.781010e-02 -3.809483e-02
+9.000000e-02 1.659568e+03 -3.991505e-02 -4.021730e-02
+9.500000e-02 1.749834e+03 -4.200612e-02 -4.232591e-02
+1.000000e-01 1.839958e+03 -4.408342e-02 -4.442080e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020136,0.014168) (0.010174,0.043883) (0.008863,0.020511) (0.045136,0.014168) (0.035174,0.043883) (0.033863,0.020511)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..756d81f38b946e23f58755e141905589b1008591
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.874010e+00
+1.000000e-02 5.624720e+00
+1.500000e-02 7.697166e+00
+2.000000e-02 8.929249e+00
+2.500000e-02 9.775334e+00
+3.000000e-02 1.049814e+01
+3.500000e-02 1.115800e+01
+4.000000e-02 1.176904e+01
+4.500000e-02 1.233750e+01
+5.000000e-02 1.286757e+01
+5.500000e-02 1.336269e+01
+6.000000e-02 1.382596e+01
+6.500000e-02 1.426022e+01
+7.000000e-02 1.466802e+01
+7.500000e-02 1.505176e+01
+8.000000e-02 1.541368e+01
+8.500000e-02 1.575582e+01
+9.000000e-02 1.608007e+01
+9.500000e-02 1.638818e+01
+1.000000e-01 1.668206e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020136,0.014168) (0.010174,0.043883) (0.008863,0.020511) (0.045136,0.014168) (0.035174,0.043883) (0.033863,0.020511)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..47fe90d309a26778d773d7c4a421d57d20a5c1d3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.497978e+00 -1.325568e-04 -4.451303e-03
+1.000000e-02 1.083645e+01 -2.604151e-04 -8.874794e-03
+1.500000e-02 1.501241e+01 -3.616524e-04 -1.335973e-02
+2.000000e-02 1.757879e+01 -4.268926e-04 -1.794592e-02
+2.500000e-02 1.936750e+01 -4.739540e-04 -2.256001e-02
+3.000000e-02 2.087646e+01 -5.136756e-04 -2.715689e-02
+3.500000e-02 2.224978e+01 -5.493598e-04 -3.172348e-02
+4.000000e-02 2.352560e+01 -5.820102e-04 -3.625651e-02
+4.500000e-02 2.471768e+01 -6.120789e-04 -4.075495e-02
+5.000000e-02 2.583394e+01 -6.398600e-04 -4.521839e-02
+5.500000e-02 2.688066e+01 -6.655902e-04 -4.964660e-02
+6.000000e-02 2.786314e+01 -6.894631e-04 -5.403946e-02
+6.500000e-02 2.878641e+01 -7.116537e-04 -5.839692e-02
+7.000000e-02 2.965554e+01 -7.323258e-04 -6.271895e-02
+7.500000e-02 3.047483e+01 -7.516175e-04 -6.700561e-02
+8.000000e-02 3.124830e+01 -7.696568e-04 -7.125695e-02
+8.500000e-02 3.197968e+01 -7.865551e-04 -7.547311e-02
+9.000000e-02 3.267243e+01 -8.024180e-04 -7.965421e-02
+9.500000e-02 3.333025e+01 -8.173495e-04 -8.380040e-02
+1.000000e-01 3.395578e+01 -8.314306e-04 -8.791188e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020136,0.014168) (0.010174,0.043883) (0.008863,0.020511) (0.045136,0.014168) (0.035174,0.043883) (0.033863,0.020511)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bb2bc9b99f29fe09fe6abf194b587a454c9a954e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.537730e+01 -2.300143e-03 -2.318003e-03
+1.000000e-02 1.905831e+02 -4.583358e-03 -4.619005e-03
+1.500000e-02 2.854478e+02 -6.854696e-03 -6.908107e-03
+2.000000e-02 3.793593e+02 -9.131643e-03 -9.203398e-03
+2.500000e-02 4.722372e+02 -1.141638e-02 -1.150793e-02
+3.000000e-02 5.646297e+02 -1.369411e-02 -1.380634e-02
+3.500000e-02 6.567897e+02 -1.595786e-02 -1.609114e-02
+4.000000e-02 7.487682e+02 -1.820654e-02 -1.836111e-02
+4.500000e-02 8.405800e+02 -2.043993e-02 -2.061598e-02
+5.000000e-02 9.322239e+02 -2.265835e-02 -2.285606e-02
+5.500000e-02 1.023706e+03 -2.486181e-02 -2.508135e-02
+6.000000e-02 1.115029e+03 -2.705043e-02 -2.729196e-02
+6.500000e-02 1.206195e+03 -2.922434e-02 -2.948801e-02
+7.000000e-02 1.297208e+03 -3.138366e-02 -3.166964e-02
+7.500000e-02 1.388069e+03 -3.352854e-02 -3.383696e-02
+8.000000e-02 1.478781e+03 -3.565909e-02 -3.599009e-02
+8.500000e-02 1.569345e+03 -3.777544e-02 -3.812917e-02
+9.000000e-02 1.659765e+03 -3.987773e-02 -4.025431e-02
+9.500000e-02 1.750041e+03 -4.196608e-02 -4.236565e-02
+1.000000e-01 1.840176e+03 -4.404062e-02 -4.446332e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020112,0.032604) (0.013130,0.026381) (0.012601,0.040099) (0.045112,0.032604) (0.038130,0.026381) (0.037601,0.040099)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..710b76a5efd7a84d55a4d4b6c3bcd9b56a03ac24
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.876095e+00
+1.000000e-02 5.624020e+00
+1.500000e-02 7.681499e+00
+2.000000e-02 8.904930e+00
+2.500000e-02 9.741776e+00
+3.000000e-02 1.045608e+01
+3.500000e-02 1.110762e+01
+4.000000e-02 1.171044e+01
+4.500000e-02 1.227050e+01
+5.000000e-02 1.279198e+01
+5.500000e-02 1.327837e+01
+6.000000e-02 1.373279e+01
+6.500000e-02 1.415809e+01
+7.000000e-02 1.455685e+01
+7.500000e-02 1.493145e+01
+8.000000e-02 1.528410e+01
+8.500000e-02 1.561683e+01
+9.000000e-02 1.593158e+01
+9.500000e-02 1.623006e+01
+1.000000e-01 1.651393e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020112,0.032604) (0.013130,0.026381) (0.012601,0.040099) (0.045112,0.032604) (0.038130,0.026381) (0.037601,0.040099)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..da25a26ebd60e0655709f550a07e63b4403c623e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.470032e+00 -1.317899e-04 -4.454659e-03
+1.000000e-02 1.075278e+01 -2.582043e-04 -8.884161e-03
+1.500000e-02 1.490073e+01 -3.586903e-04 -1.337226e-02
+2.000000e-02 1.748149e+01 -4.241835e-04 -1.795741e-02
+2.500000e-02 1.923287e+01 -4.703627e-04 -2.257517e-02
+3.000000e-02 2.069705e+01 -5.089641e-04 -2.717656e-02
+3.500000e-02 2.202985e+01 -5.435675e-04 -3.174740e-02
+4.000000e-02 2.326804e+01 -5.751737e-04 -3.628442e-02
+4.500000e-02 2.442412e+01 -6.042203e-04 -4.078670e-02
+5.000000e-02 2.550540e+01 -6.309950e-04 -4.525384e-02
+5.500000e-02 2.651788e+01 -6.557309e-04 -4.968563e-02
+6.000000e-02 2.746760e+01 -6.786415e-04 -5.408188e-02
+6.500000e-02 2.835985e+01 -6.999099e-04 -5.844253e-02
+7.000000e-02 2.919923e+01 -7.196903e-04 -6.276758e-02
+7.500000e-02 2.998999e+01 -7.381215e-04 -6.705708e-02
+8.000000e-02 3.073611e+01 -7.553293e-04 -7.131112e-02
+8.500000e-02 3.143291e+01 -7.711048e-04 -7.553089e-02
+9.000000e-02 3.210048e+01 -7.861920e-04 -7.971438e-02
+9.500000e-02 3.273372e+01 -8.003683e-04 -8.386284e-02
+1.000000e-01 3.333545e+01 -8.137147e-04 -8.797646e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020112,0.032604) (0.013130,0.026381) (0.012601,0.040099) (0.045112,0.032604) (0.038130,0.026381) (0.037601,0.040099)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d837193e64dbc840b12d5450cce924c11d4a22be
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.537443e+01 -2.284613e-03 -2.333356e-03
+1.000000e-02 1.905773e+02 -4.552362e-03 -4.649648e-03
+1.500000e-02 2.854390e+02 -6.808272e-03 -6.954022e-03
+2.000000e-02 3.793473e+02 -9.069328e-03 -9.265099e-03
+2.500000e-02 4.722219e+02 -1.133697e-02 -1.158666e-02
+3.000000e-02 5.646111e+02 -1.359688e-02 -1.390283e-02
+3.500000e-02 6.567679e+02 -1.584254e-02 -1.620566e-02
+4.000000e-02 7.487461e+02 -1.807287e-02 -1.849369e-02
+4.500000e-02 8.405518e+02 -2.028802e-02 -2.076699e-02
+5.000000e-02 9.321925e+02 -2.248798e-02 -2.302549e-02
+5.500000e-02 1.023671e+03 -2.467286e-02 -2.526929e-02
+6.000000e-02 1.114991e+03 -2.684282e-02 -2.749852e-02
+6.500000e-02 1.206155e+03 -2.899797e-02 -2.971329e-02
+7.000000e-02 1.297164e+03 -3.113846e-02 -3.191370e-02
+7.500000e-02 1.388022e+03 -3.326440e-02 -3.409990e-02
+8.000000e-02 1.478731e+03 -3.537595e-02 -3.627199e-02
+8.500000e-02 1.569292e+03 -3.747322e-02 -3.843010e-02
+9.000000e-02 1.659708e+03 -3.955635e-02 -4.057435e-02
+9.500000e-02 1.749981e+03 -4.162548e-02 -4.270487e-02
+1.000000e-01 1.840113e+03 -4.368073e-02 -4.482177e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.016667,0.031031) (0.013718,0.020586) (0.007343,0.032616) (0.041667,0.031031) (0.038718,0.020586) (0.032343,0.032616)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..58c36e17492182d3e95e49b81699bd396991b579
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.908917e+00
+1.000000e-02 5.631345e+00
+1.500000e-02 7.682056e+00
+2.000000e-02 8.920737e+00
+2.500000e-02 9.763417e+00
+3.000000e-02 1.047962e+01
+3.500000e-02 1.113198e+01
+4.000000e-02 1.173521e+01
+4.500000e-02 1.229560e+01
+5.000000e-02 1.281753e+01
+5.500000e-02 1.330257e+01
+6.000000e-02 1.375779e+01
+6.500000e-02 1.418445e+01
+7.000000e-02 1.458511e+01
+7.500000e-02 1.496218e+01
+8.000000e-02 1.531793e+01
+8.500000e-02 1.565763e+01
+9.000000e-02 1.597712e+01
+9.500000e-02 1.628089e+01
+1.000000e-01 1.657066e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.016667,0.031031) (0.013718,0.020586) (0.007343,0.032616) (0.041667,0.031031) (0.038718,0.020586) (0.032343,0.032616)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7286334396372b869cedb73d350b5f3976078c6c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.941760e+00 -1.422726e-04 -4.418295e-03
+1.000000e-02 1.152891e+01 -2.760146e-04 -8.820926e-03
+1.500000e-02 1.581615e+01 -3.808509e-04 -1.329015e-02
+2.000000e-02 1.859339e+01 -4.515324e-04 -1.785470e-02
+2.500000e-02 2.054824e+01 -5.029107e-04 -2.245288e-02
+3.000000e-02 2.218745e+01 -5.461238e-04 -2.703742e-02
+3.500000e-02 2.367245e+01 -5.848588e-04 -3.159342e-02
+4.000000e-02 2.504666e+01 -6.202492e-04 -3.611702e-02
+4.500000e-02 2.632632e+01 -6.528080e-04 -4.060698e-02
+5.000000e-02 2.752136e+01 -6.828773e-04 -4.506270e-02
+5.500000e-02 2.863977e+01 -7.107327e-04 -4.948383e-02
+6.000000e-02 2.968823e+01 -7.365987e-04 -5.387016e-02
+6.500000e-02 3.067287e+01 -7.606744e-04 -5.822154e-02
+7.000000e-02 3.159907e+01 -7.831302e-04 -6.253794e-02
+7.500000e-02 3.247185e+01 -8.041205e-04 -6.681935e-02
+8.000000e-02 3.329694e+01 -8.237328e-04 -7.106570e-02
+8.500000e-02 3.407648e+01 -8.421972e-04 -7.527727e-02
+9.000000e-02 3.481556e+01 -8.595775e-04 -7.945407e-02
+9.500000e-02 3.551664e+01 -8.760271e-04 -8.359635e-02
+1.000000e-01 3.618487e+01 -8.915277e-04 -8.770408e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.016667,0.031031) (0.013718,0.020586) (0.007343,0.032616) (0.041667,0.031031) (0.038718,0.020586) (0.032343,0.032616)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8313b365c8a8d6ec3e9c1fa083b2e7f0057ec525
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.536402e+01 -2.301388e-03 -2.316881e-03
+1.000000e-02 1.905566e+02 -4.585857e-03 -4.616750e-03
+1.500000e-02 2.854082e+02 -6.858477e-03 -6.904677e-03
+2.000000e-02 3.793068e+02 -9.136887e-03 -9.198566e-03
+2.500000e-02 4.721717e+02 -1.142345e-02 -1.150130e-02
+3.000000e-02 5.645513e+02 -1.370325e-02 -1.379767e-02
+3.500000e-02 6.566984e+02 -1.596922e-02 -1.608028e-02
+4.000000e-02 7.486640e+02 -1.822025e-02 -1.834792e-02
+4.500000e-02 8.404628e+02 -2.045609e-02 -2.060036e-02
+5.000000e-02 9.320938e+02 -2.267707e-02 -2.283791e-02
+5.500000e-02 1.023563e+03 -2.488318e-02 -2.506055e-02
+6.000000e-02 1.114873e+03 -2.707455e-02 -2.726843e-02
+6.500000e-02 1.206027e+03 -2.925130e-02 -2.946165e-02
+7.000000e-02 1.297027e+03 -3.141356e-02 -3.164035e-02
+7.500000e-02 1.387875e+03 -3.356145e-02 -3.380466e-02
+8.000000e-02 1.478574e+03 -3.569511e-02 -3.595469e-02
+8.500000e-02 1.569126e+03 -3.781465e-02 -3.809058e-02
+9.000000e-02 1.659533e+03 -3.992021e-02 -4.021245e-02
+9.500000e-02 1.749797e+03 -4.201192e-02 -4.232044e-02
+1.000000e-01 1.839920e+03 -4.408989e-02 -4.441466e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.013619,0.034901) (0.001279,0.028660) (0.011215,0.007685) (0.038619,0.034901) (0.026279,0.028660) (0.036215,0.007685) (0.051279,0.028660)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..22893f61b33506d8a89eafde5cdc7c90ebc0e445
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.873774e+00
+1.000000e-02 5.624181e+00
+1.500000e-02 7.695935e+00
+2.000000e-02 8.927402e+00
+2.500000e-02 9.772809e+00
+3.000000e-02 1.049518e+01
+3.500000e-02 1.115444e+01
+4.000000e-02 1.176514e+01
+4.500000e-02 1.233333e+01
+5.000000e-02 1.286316e+01
+5.500000e-02 1.335806e+01
+6.000000e-02 1.382114e+01
+6.500000e-02 1.425521e+01
+7.000000e-02 1.466284e+01
+7.500000e-02 1.504641e+01
+8.000000e-02 1.540812e+01
+8.500000e-02 1.574998e+01
+9.000000e-02 1.607389e+01
+9.500000e-02 1.638157e+01
+1.000000e-01 1.667466e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.013619,0.034901) (0.001279,0.028660) (0.011215,0.007685) (0.038619,0.034901) (0.026279,0.028660) (0.036215,0.007685) (0.051279,0.028660)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5f22310a0e4058b1cb121b590efd780a9ddbe071
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.0924_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.502413e+00 -1.326491e-04 -4.450958e-03
+1.000000e-02 1.084439e+01 -2.605947e-04 -8.874108e-03
+1.500000e-02 1.502659e+01 -3.620199e-04 -1.335822e-02
+2.000000e-02 1.760078e+01 -4.275539e-04 -1.794353e-02
+2.500000e-02 1.938857e+01 -4.746586e-04 -2.255734e-02
+3.000000e-02 2.089472e+01 -5.143568e-04 -2.715419e-02
+3.500000e-02 2.226572e+01 -5.500112e-04 -3.172079e-02
+4.000000e-02 2.353948e+01 -5.826307e-04 -3.625383e-02
+4.500000e-02 2.472947e+01 -6.126641e-04 -4.075229e-02
+5.000000e-02 2.584342e+01 -6.404036e-04 -4.521577e-02
+5.500000e-02 2.688228e+01 -6.658380e-04 -4.964480e-02
+6.000000e-02 2.786243e+01 -6.896614e-04 -5.403772e-02
+6.500000e-02 2.878376e+01 -7.118114e-04 -5.839521e-02
+7.000000e-02 2.965093e+01 -7.324434e-04 -6.271727e-02
+7.500000e-02 3.046857e+01 -7.517040e-04 -6.700391e-02
+8.000000e-02 3.124070e+01 -7.697190e-04 -7.125523e-02
+8.500000e-02 3.197087e+01 -7.865988e-04 -7.547134e-02
+9.000000e-02 3.266268e+01 -8.024503e-04 -7.965238e-02
+9.500000e-02 3.331943e+01 -8.173695e-04 -8.379852e-02
+1.000000e-01 3.394390e+01 -8.314383e-04 -8.790995e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.013619,0.034901) (0.001279,0.028660) (0.011215,0.007685) (0.038619,0.034901) (0.026279,0.028660) (0.036215,0.007685) (0.051279,0.028660)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6f76ea72f66864070eed86ffaaab9a790f6f655c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.178527e+02 -2.171294e-03 -2.218585e-03
+1.000000e-02 4.352236e+02 -4.326776e-03 -4.421057e-03
+1.500000e-02 6.519695e+02 -6.470945e-03 -6.612148e-03
+2.000000e-02 8.675785e+02 -8.619132e-03 -8.808584e-03
+2.500000e-02 1.082008e+03 -1.077291e-02 -1.101302e-02
+3.000000e-02 1.295730e+03 -1.291951e-02 -1.321143e-02
+3.500000e-02 1.508962e+03 -1.505283e-02 -1.539679e-02
+4.000000e-02 1.721747e+03 -1.717201e-02 -1.756803e-02
+4.500000e-02 1.934103e+03 -1.927675e-02 -1.972478e-02
+5.000000e-02 2.146026e+03 -2.136756e-02 -2.186757e-02
+5.500000e-02 2.357519e+03 -2.344468e-02 -2.399664e-02
+6.000000e-02 2.568599e+03 -2.550738e-02 -2.611116e-02
+6.500000e-02 2.779269e+03 -2.755631e-02 -2.821185e-02
+7.000000e-02 2.989517e+03 -2.959185e-02 -3.029907e-02
+7.500000e-02 3.199368e+03 -3.161360e-02 -3.237241e-02
+8.000000e-02 3.408806e+03 -3.362235e-02 -3.443268e-02
+8.500000e-02 3.617847e+03 -3.561735e-02 -3.647902e-02
+9.000000e-02 3.826497e+03 -3.759920e-02 -3.851214e-02
+9.500000e-02 4.034746e+03 -3.956821e-02 -4.053231e-02
+1.000000e-01 4.242610e+03 -4.152411e-02 -4.253925e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.017036,0.027518) (0.002511,0.037127) (0.013575,0.039619) (0.008139,0.010335) (0.018269,0.004963) (0.000336,0.014094) (0.009131,0.023287) (0.042036,0.027518) (0.027511,0.037127) (0.038575,0.039619) (0.033139,0.010335) (0.043269,0.004963) (0.025336,0.014094) (0.034131,0.023287) (0.052511,0.037127) (0.050336,0.014094)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f9cf709270801a4742f55b261ffa02990b441497
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.826899e+00
+1.000000e-02 7.119306e+00
+1.500000e-02 9.188011e+00
+2.000000e-02 1.049468e+01
+2.500000e-02 1.150529e+01
+3.000000e-02 1.238523e+01
+3.500000e-02 1.317819e+01
+4.000000e-02 1.390072e+01
+4.500000e-02 1.456282e+01
+5.000000e-02 1.517212e+01
+5.500000e-02 1.573515e+01
+6.000000e-02 1.625752e+01
+6.500000e-02 1.674424e+01
+7.000000e-02 1.719973e+01
+7.500000e-02 1.762794e+01
+8.000000e-02 1.803238e+01
+8.500000e-02 1.841621e+01
+9.000000e-02 1.878223e+01
+9.500000e-02 1.913296e+01
+1.000000e-01 1.947063e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.017036,0.027518) (0.002511,0.037127) (0.013575,0.039619) (0.008139,0.010335) (0.018269,0.004963) (0.000336,0.014094) (0.009131,0.023287) (0.042036,0.027518) (0.027511,0.037127) (0.038575,0.039619) (0.033139,0.010335) (0.043269,0.004963) (0.025336,0.014094) (0.034131,0.023287) (0.052511,0.037127) (0.050336,0.014094)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..525fafc62ff218f3d60ef985c2d90c771626a2b8
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.286320e+00 -7.257001e-05 -4.461557e-03
+1.000000e-02 1.394007e+01 -1.387668e-04 -8.919231e-03
+1.500000e-02 1.825638e+01 -1.829116e-04 -1.348743e-02
+2.000000e-02 2.099228e+01 -2.116775e-04 -1.812176e-02
+2.500000e-02 2.315578e+01 -2.345141e-04 -2.275336e-02
+3.000000e-02 2.506238e+01 -2.544827e-04 -2.735927e-02
+3.500000e-02 2.679631e+01 -2.724671e-04 -3.193352e-02
+4.000000e-02 2.838915e+01 -2.888338e-04 -3.647414e-02
+4.500000e-02 2.985959e+01 -3.038114e-04 -4.098022e-02
+5.000000e-02 3.122135e+01 -3.175695e-04 -4.545123e-02
+5.500000e-02 3.248601e+01 -3.302501e-04 -4.988685e-02
+6.000000e-02 3.366358e+01 -3.419738e-04 -5.428686e-02
+6.500000e-02 3.476325e+01 -3.528489e-04 -5.865110e-02
+7.000000e-02 3.579333e+01 -3.629719e-04 -6.297950e-02
+7.500000e-02 3.676124e+01 -3.724283e-04 -6.727204e-02
+8.000000e-02 3.767394e+01 -3.812971e-04 -7.152873e-02
+8.500000e-02 3.853763e+01 -3.896479e-04 -7.574963e-02
+9.000000e-02 3.935765e+01 -3.975406e-04 -7.993487e-02
+9.500000e-02 4.013906e+01 -4.050531e-04 -8.408472e-02
+1.000000e-01 4.088604e+01 -4.121880e-04 -8.819911e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.017036,0.027518) (0.002511,0.037127) (0.013575,0.039619) (0.008139,0.010335) (0.018269,0.004963) (0.000336,0.014094) (0.009131,0.023287) (0.042036,0.027518) (0.027511,0.037127) (0.038575,0.039619) (0.033139,0.010335) (0.043269,0.004963) (0.025336,0.014094) (0.034131,0.023287) (0.052511,0.037127) (0.050336,0.014094)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7570642f6224516fcb0c017139acfdb5934f48f0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.178441e+02 -2.183689e-03 -2.206434e-03
+1.000000e-02 4.352065e+02 -4.351463e-03 -4.396852e-03
+1.500000e-02 6.519441e+02 -6.507875e-03 -6.575920e-03
+2.000000e-02 8.675451e+02 -8.668506e-03 -8.760072e-03
+2.500000e-02 1.081967e+03 -1.083503e-02 -1.095188e-02
+3.000000e-02 1.295681e+03 -1.299444e-02 -1.313758e-02
+3.500000e-02 1.508905e+03 -1.514050e-02 -1.531030e-02
+4.000000e-02 1.721682e+03 -1.727232e-02 -1.746900e-02
+4.500000e-02 1.934030e+03 -1.938957e-02 -1.961332e-02
+5.000000e-02 2.145945e+03 -2.149280e-02 -2.174379e-02
+5.500000e-02 2.357431e+03 -2.358209e-02 -2.386048e-02
+6.000000e-02 2.568508e+03 -2.565694e-02 -2.596287e-02
+6.500000e-02 2.779165e+03 -2.771810e-02 -2.805172e-02
+7.000000e-02 2.989406e+03 -2.976565e-02 -3.012708e-02
+7.500000e-02 3.199250e+03 -3.179922e-02 -3.218858e-02
+8.000000e-02 3.408680e+03 -3.381952e-02 -3.423693e-02
+8.500000e-02 3.617719e+03 -3.582620e-02 -3.627180e-02
+9.000000e-02 3.826353e+03 -3.782012e-02 -3.829405e-02
+9.500000e-02 4.034597e+03 -3.980007e-02 -4.030232e-02
+1.000000e-01 4.242451e+03 -4.176743e-02 -4.229819e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.013685,0.005883) (0.009428,0.029367) (0.017368,0.039730) (0.010789,0.016267) (0.002145,0.039296) (0.018889,0.022585) (0.001301,0.005213) (0.038685,0.005883) (0.034428,0.029367) (0.042368,0.039730) (0.035789,0.016267) (0.027145,0.039296) (0.043889,0.022585) (0.026301,0.005213) (0.052145,0.039296) (0.051301,0.005213)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..49a1a7d0764c51dc509d2af1cddae212f7d11f2d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.749678e+00
+1.000000e-02 7.035726e+00
+1.500000e-02 9.090922e+00
+2.000000e-02 1.037589e+01
+2.500000e-02 1.137705e+01
+3.000000e-02 1.225230e+01
+3.500000e-02 1.304246e+01
+4.000000e-02 1.376319e+01
+4.500000e-02 1.442403e+01
+5.000000e-02 1.503232e+01
+5.500000e-02 1.559423e+01
+6.000000e-02 1.611518e+01
+6.500000e-02 1.660000e+01
+7.000000e-02 1.705299e+01
+7.500000e-02 1.747803e+01
+8.000000e-02 1.787861e+01
+8.500000e-02 1.825788e+01
+9.000000e-02 1.861869e+01
+9.500000e-02 1.896359e+01
+1.000000e-01 1.929490e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.013685,0.005883) (0.009428,0.029367) (0.017368,0.039730) (0.010789,0.016267) (0.002145,0.039296) (0.018889,0.022585) (0.001301,0.005213) (0.038685,0.005883) (0.034428,0.029367) (0.042368,0.039730) (0.035789,0.016267) (0.027145,0.039296) (0.043889,0.022585) (0.026301,0.005213) (0.052145,0.039296) (0.051301,0.005213)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..32c7115ebd3206355f4ea9bb4d046383193970c8
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.557735e+00 -7.573147e-05 -4.433629e-03
+1.000000e-02 1.433275e+01 -1.437334e-04 -8.872497e-03
+1.500000e-02 1.872942e+01 -1.890971e-04 -1.342871e-02
+2.000000e-02 2.156185e+01 -2.191675e-04 -1.805170e-02
+2.500000e-02 2.381467e+01 -2.432295e-04 -2.267246e-02
+3.000000e-02 2.579465e+01 -2.642562e-04 -2.726905e-02
+3.500000e-02 2.758764e+01 -2.831407e-04 -3.183544e-02
+4.000000e-02 2.922823e+01 -3.002775e-04 -3.636941e-02
+4.500000e-02 3.073676e+01 -3.159128e-04 -4.086986e-02
+5.000000e-02 3.212860e+01 -3.302343e-04 -4.533611e-02
+5.500000e-02 3.341684e+01 -3.434004e-04 -4.976765e-02
+6.000000e-02 3.461252e+01 -3.555426e-04 -5.416419e-02
+6.500000e-02 3.572509e+01 -3.667735e-04 -5.852551e-02
+7.000000e-02 3.676336e+01 -3.771946e-04 -6.285150e-02
+7.500000e-02 3.773499e+01 -3.868946e-04 -6.714210e-02
+8.000000e-02 3.864689e+01 -3.959521e-04 -7.139730e-02
+8.500000e-02 3.950539e+01 -4.044380e-04 -7.561716e-02
+9.000000e-02 4.031629e+01 -4.124167e-04 -7.980176e-02
+9.500000e-02 4.108455e+01 -4.199436e-04 -8.395123e-02
+1.000000e-01 4.181481e+01 -4.270691e-04 -8.806575e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.013685,0.005883) (0.009428,0.029367) (0.017368,0.039730) (0.010789,0.016267) (0.002145,0.039296) (0.018889,0.022585) (0.001301,0.005213) (0.038685,0.005883) (0.034428,0.029367) (0.042368,0.039730) (0.035789,0.016267) (0.027145,0.039296) (0.043889,0.022585) (0.026301,0.005213) (0.052145,0.039296) (0.051301,0.005213)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6e5f39f5a4d517f51ea6b2e86907ee4f46c0cffa
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.178475e+02 -2.186513e-03 -2.203805e-03
+1.000000e-02 4.352135e+02 -4.357112e-03 -4.391589e-03
+1.500000e-02 6.519549e+02 -6.516370e-03 -6.567986e-03
+2.000000e-02 8.675598e+02 -8.680058e-03 -8.749209e-03
+2.500000e-02 1.081985e+03 -1.085007e-02 -1.093762e-02
+3.000000e-02 1.295703e+03 -1.301326e-02 -1.311964e-02
+3.500000e-02 1.508931e+03 -1.516323e-02 -1.528853e-02
+4.000000e-02 1.721712e+03 -1.729907e-02 -1.744330e-02
+4.500000e-02 1.934065e+03 -1.942044e-02 -1.958358e-02
+5.000000e-02 2.145983e+03 -2.152787e-02 -2.170992e-02
+5.500000e-02 2.357473e+03 -2.362165e-02 -2.382261e-02
+6.000000e-02 2.568550e+03 -2.570085e-02 -2.592066e-02
+6.500000e-02 2.779216e+03 -2.776630e-02 -2.800495e-02
+7.000000e-02 2.989461e+03 -2.981838e-02 -3.007584e-02
+7.500000e-02 3.199308e+03 -3.185657e-02 -3.213280e-02
+8.000000e-02 3.408742e+03 -3.388163e-02 -3.417662e-02
+8.500000e-02 3.617785e+03 -3.589301e-02 -3.620670e-02
+9.000000e-02 3.826423e+03 -3.789195e-02 -3.822435e-02
+9.500000e-02 4.034672e+03 -3.987700e-02 -4.022803e-02
+1.000000e-01 4.242529e+03 -4.184972e-02 -4.221937e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.011831,0.005758) (0.007619,0.028165) (0.004083,0.039896) (0.000104,0.015820) (0.010460,0.017838) (0.020118,0.024590) (0.015527,0.040871) (0.036831,0.005758) (0.032619,0.028165) (0.029083,0.039896) (0.025104,0.015820) (0.035460,0.017838) (0.045118,0.024590) (0.040527,0.040871) (0.050104,0.015820)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c22c7cf4f55054ab3ac607b80970beda8289e4af
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.745580e+00
+1.000000e-02 7.015756e+00
+1.500000e-02 9.054713e+00
+2.000000e-02 1.033547e+01
+2.500000e-02 1.133145e+01
+3.000000e-02 1.220107e+01
+3.500000e-02 1.298556e+01
+4.000000e-02 1.370066e+01
+4.500000e-02 1.435586e+01
+5.000000e-02 1.495846e+01
+5.500000e-02 1.551460e+01
+6.000000e-02 1.602968e+01
+6.500000e-02 1.650846e+01
+7.000000e-02 1.695524e+01
+7.500000e-02 1.737388e+01
+8.000000e-02 1.776786e+01
+8.500000e-02 1.814030e+01
+9.000000e-02 1.849403e+01
+9.500000e-02 1.883164e+01
+1.000000e-01 1.915547e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.011831,0.005758) (0.007619,0.028165) (0.004083,0.039896) (0.000104,0.015820) (0.010460,0.017838) (0.020118,0.024590) (0.015527,0.040871) (0.036831,0.005758) (0.032619,0.028165) (0.029083,0.039896) (0.025104,0.015820) (0.035460,0.017838) (0.045118,0.024590) (0.040527,0.040871) (0.050104,0.015820)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c42754d7526fbce540e484113f49c47521803f48
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.822113e+00 -7.849323e-05 -4.412473e-03
+1.000000e-02 1.474260e+01 -1.481190e-04 -8.838691e-03
+1.500000e-02 1.923159e+01 -1.945933e-04 -1.338459e-02
+2.000000e-02 2.218162e+01 -2.259374e-04 -1.799746e-02
+2.500000e-02 2.452489e+01 -2.510093e-04 -2.261038e-02
+3.000000e-02 2.657515e+01 -2.728653e-04 -2.720020e-02
+3.500000e-02 2.842807e+01 -2.925177e-04 -3.176025e-02
+4.000000e-02 3.012327e+01 -3.103345e-04 -3.628789e-02
+4.500000e-02 3.168256e+01 -3.266087e-04 -4.078202e-02
+5.000000e-02 3.312247e+01 -3.415402e-04 -4.524191e-02
+5.500000e-02 3.445698e+01 -3.552968e-04 -4.966698e-02
+6.000000e-02 3.569803e+01 -3.680199e-04 -5.405685e-02
+6.500000e-02 3.685622e+01 -3.798336e-04 -5.841122e-02
+7.000000e-02 3.794041e+01 -3.908418e-04 -6.272993e-02
+7.500000e-02 3.895857e+01 -4.011358e-04 -6.701286e-02
+8.000000e-02 3.991805e+01 -4.107987e-04 -7.125998e-02
+8.500000e-02 4.082557e+01 -4.199055e-04 -7.547126e-02
+9.000000e-02 4.168715e+01 -4.285231e-04 -7.964675e-02
+9.500000e-02 4.250801e+01 -4.367092e-04 -8.378652e-02
+1.000000e-01 4.329286e+01 -4.445155e-04 -8.789071e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.011831,0.005758) (0.007619,0.028165) (0.004083,0.039896) (0.000104,0.015820) (0.010460,0.017838) (0.020118,0.024590) (0.015527,0.040871) (0.036831,0.005758) (0.032619,0.028165) (0.029083,0.039896) (0.025104,0.015820) (0.035460,0.017838) (0.045118,0.024590) (0.040527,0.040871) (0.050104,0.015820)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5d89b421c307c21fb76c21885cbe621b788d02f5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.178472e+02 -2.199787e-03 -2.190225e-03
+1.000000e-02 4.352127e+02 -4.383578e-03 -4.364516e-03
+1.500000e-02 6.519534e+02 -6.555993e-03 -6.527475e-03
+2.000000e-02 8.675573e+02 -8.733155e-03 -8.695005e-03
+2.500000e-02 1.081982e+03 -1.091732e-02 -1.086909e-02
+3.000000e-02 1.295699e+03 -1.309500e-02 -1.303645e-02
+3.500000e-02 1.508925e+03 -1.525954e-02 -1.519063e-02
+4.000000e-02 1.721706e+03 -1.740995e-02 -1.733067e-02
+4.500000e-02 1.934056e+03 -1.954589e-02 -1.945625e-02
+5.000000e-02 2.145974e+03 -2.166788e-02 -2.156788e-02
+5.500000e-02 2.357468e+03 -2.377581e-02 -2.366546e-02
+6.000000e-02 2.568538e+03 -2.586999e-02 -2.574930e-02
+6.500000e-02 2.779202e+03 -2.794992e-02 -2.781891e-02
+7.000000e-02 2.989450e+03 -3.001634e-02 -2.987501e-02
+7.500000e-02 3.199292e+03 -3.206918e-02 -3.191754e-02
+8.000000e-02 3.408725e+03 -3.410877e-02 -3.394682e-02
+8.500000e-02 3.617766e+03 -3.613453e-02 -3.596230e-02
+9.000000e-02 3.826404e+03 -3.814741e-02 -3.796489e-02
+9.500000e-02 4.034654e+03 -4.014693e-02 -3.995414e-02
+1.000000e-01 4.242508e+03 -4.213368e-02 -4.193063e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.015753,0.009729) (0.007691,0.016919) (0.007308,0.006878) (0.010610,0.037217) (0.012315,0.026873) (0.000615,0.030461) (0.020472,0.045532) (0.040753,0.009729) (0.032691,0.016919) (0.032308,0.006878) (0.035610,0.037217) (0.037315,0.026873) (0.025615,0.030461) (0.045472,0.045532) (0.050615,0.030461)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1a1d747b160cdb6b966a1e608006a6342abafe56
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.687761e+00
+1.000000e-02 6.972763e+00
+1.500000e-02 9.018226e+00
+2.000000e-02 1.027248e+01
+2.500000e-02 1.125342e+01
+3.000000e-02 1.211403e+01
+3.500000e-02 1.289229e+01
+4.000000e-02 1.360263e+01
+4.500000e-02 1.425393e+01
+5.000000e-02 1.485306e+01
+5.500000e-02 1.540594e+01
+6.000000e-02 1.591778e+01
+6.500000e-02 1.639328e+01
+7.000000e-02 1.683663e+01
+7.500000e-02 1.725164e+01
+8.000000e-02 1.764175e+01
+8.500000e-02 1.801003e+01
+9.000000e-02 1.835932e+01
+9.500000e-02 1.869217e+01
+1.000000e-01 1.901090e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.015753,0.009729) (0.007691,0.016919) (0.007308,0.006878) (0.010610,0.037217) (0.012315,0.026873) (0.000615,0.030461) (0.020472,0.045532) (0.040753,0.009729) (0.032691,0.016919) (0.032308,0.006878) (0.035610,0.037217) (0.037315,0.026873) (0.025615,0.030461) (0.045472,0.045532) (0.050615,0.030461)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..042bfc63593de9141435589cd39affd53d1d0eeb
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.619207e+00 -7.690803e-05 -4.418106e-03
+1.000000e-02 1.448578e+01 -1.460216e-04 -8.846401e-03
+1.500000e-02 1.899922e+01 -1.923186e-04 -1.339731e-02
+2.000000e-02 2.191834e+01 -2.231789e-04 -1.801569e-02
+2.500000e-02 2.423135e+01 -2.479159e-04 -2.263157e-02
+3.000000e-02 2.627091e+01 -2.696455e-04 -2.722245e-02
+3.500000e-02 2.812746e+01 -2.892669e-04 -3.178260e-02
+4.000000e-02 2.983443e+01 -3.071560e-04 -3.631005e-02
+4.500000e-02 3.141160e+01 -3.235546e-04 -4.080374e-02
+5.000000e-02 3.287449e+01 -3.386553e-04 -4.526294e-02
+5.500000e-02 3.423590e+01 -3.526168e-04 -4.968711e-02
+6.000000e-02 3.550632e+01 -3.655684e-04 -5.407593e-02
+6.500000e-02 3.669574e+01 -3.776293e-04 -5.842909e-02
+7.000000e-02 3.781239e+01 -3.889346e-04 -6.274661e-02
+7.500000e-02 3.886612e+01 -3.995207e-04 -6.702794e-02
+8.000000e-02 3.986303e+01 -4.094985e-04 -7.127324e-02
+8.500000e-02 4.080926e+01 -4.189385e-04 -7.548253e-02
+9.000000e-02 4.171038e+01 -4.279038e-04 -7.965585e-02
+9.500000e-02 4.257171e+01 -4.364540e-04 -8.379331e-02
+1.000000e-01 4.339807e+01 -4.446428e-04 -8.789499e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.015753,0.009729) (0.007691,0.016919) (0.007308,0.006878) (0.010610,0.037217) (0.012315,0.026873) (0.000615,0.030461) (0.020472,0.045532) (0.040753,0.009729) (0.032691,0.016919) (0.032308,0.006878) (0.035610,0.037217) (0.037315,0.026873) (0.025615,0.030461) (0.045472,0.045532) (0.050615,0.030461)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d1dcd009dd435034c7c98f4ea3ee401b21ca3aee
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.178574e+02 -2.211241e-03 -2.178585e-03
+1.000000e-02 4.352330e+02 -4.406443e-03 -4.341282e-03
+1.500000e-02 6.519835e+02 -6.590354e-03 -6.492585e-03
+2.000000e-02 8.675970e+02 -8.779785e-03 -8.647751e-03
+2.500000e-02 1.082031e+03 -1.097743e-02 -1.080830e-02
+3.000000e-02 1.295758e+03 -1.316922e-02 -1.296149e-02
+3.500000e-02 1.508994e+03 -1.534816e-02 -1.510122e-02
+4.000000e-02 1.721784e+03 -1.751314e-02 -1.722665e-02
+4.500000e-02 1.934144e+03 -1.966381e-02 -1.933746e-02
+5.000000e-02 2.146071e+03 -2.180066e-02 -2.143419e-02
+5.500000e-02 2.357574e+03 -2.392358e-02 -2.351675e-02
+6.000000e-02 2.568658e+03 -2.603266e-02 -2.558526e-02
+6.500000e-02 2.779322e+03 -2.812816e-02 -2.764000e-02
+7.000000e-02 2.989585e+03 -3.020973e-02 -2.968062e-02
+7.500000e-02 3.199436e+03 -3.227798e-02 -3.170775e-02
+8.000000e-02 3.408879e+03 -3.433290e-02 -3.372140e-02
+8.500000e-02 3.617928e+03 -3.637435e-02 -3.572143e-02
+9.000000e-02 3.826575e+03 -3.840281e-02 -3.770835e-02
+9.500000e-02 4.034834e+03 -4.041810e-02 -3.968195e-02
+1.000000e-01 4.242692e+03 -4.242045e-02 -4.164258e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.018802,0.037413) (0.006169,0.028326) (0.015373,0.007545) (0.017987,0.026778) (0.002253,0.006858) (0.008082,0.042031) (0.016899,0.017719) (0.043802,0.037413) (0.031169,0.028326) (0.040373,0.007545) (0.042987,0.026778) (0.027253,0.006858) (0.033082,0.042031) (0.041899,0.017719) (0.052253,0.006858)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..62fde4f7a53cb8a2bccdd4bb2c9584718e9bd3c1
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.672059e+00
+1.000000e-02 6.918214e+00
+1.500000e-02 8.933409e+00
+2.000000e-02 1.018200e+01
+2.500000e-02 1.115501e+01
+3.000000e-02 1.200765e+01
+3.500000e-02 1.277828e+01
+4.000000e-02 1.348117e+01
+4.500000e-02 1.412511e+01
+5.000000e-02 1.471699e+01
+5.500000e-02 1.526271e+01
+6.000000e-02 1.576748e+01
+6.500000e-02 1.623595e+01
+7.000000e-02 1.667231e+01
+7.500000e-02 1.708032e+01
+8.000000e-02 1.746339e+01
+8.500000e-02 1.782464e+01
+9.000000e-02 1.816686e+01
+9.500000e-02 1.849263e+01
+1.000000e-01 1.880430e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.018802,0.037413) (0.006169,0.028326) (0.015373,0.007545) (0.017987,0.026778) (0.002253,0.006858) (0.008082,0.042031) (0.016899,0.017719) (0.043802,0.037413) (0.031169,0.028326) (0.040373,0.007545) (0.042987,0.026778) (0.027253,0.006858) (0.033082,0.042031) (0.041899,0.017719) (0.052253,0.006858)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fa76e4f95c91d72ebbe897ee67faeb4a1aacc2ff
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.2155_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.201448e+00 -8.324874e-05 -4.366647e-03
+1.000000e-02 1.544217e+01 -1.567699e-04 -8.757356e-03
+1.500000e-02 2.015233e+01 -2.058516e-04 -1.328206e-02
+2.000000e-02 2.333676e+01 -2.400654e-04 -1.787153e-02
+2.500000e-02 2.592434e+01 -2.681086e-04 -2.246025e-02
+3.000000e-02 2.821232e+01 -2.928608e-04 -2.702702e-02
+3.500000e-02 3.029487e+01 -3.152837e-04 -3.156517e-02
+4.000000e-02 3.221307e+01 -3.358311e-04 -3.607197e-02
+4.500000e-02 3.399103e+01 -3.547867e-04 -4.054596e-02
+5.000000e-02 3.564650e+01 -3.723642e-04 -4.498619e-02
+5.500000e-02 3.719428e+01 -3.887418e-04 -4.939196e-02
+6.000000e-02 3.864661e+01 -4.040669e-04 -5.376274e-02
+6.500000e-02 4.001442e+01 -4.184684e-04 -5.809813e-02
+7.000000e-02 4.130806e+01 -4.320308e-04 -6.239769e-02
+7.500000e-02 4.253527e+01 -4.449171e-04 -6.666138e-02
+8.000000e-02 4.370432e+01 -4.571853e-04 -7.088894e-02
+8.500000e-02 4.482198e+01 -4.689122e-04 -7.508025e-02
+9.000000e-02 4.589408e+01 -4.801639e-04 -7.923526e-02
+9.500000e-02 4.692590e+01 -4.909996e-04 -8.335396e-02
+1.000000e-01 4.792247e+01 -5.014752e-04 -8.743633e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.018802,0.037413) (0.006169,0.028326) (0.015373,0.007545) (0.017987,0.026778) (0.002253,0.006858) (0.008082,0.042031) (0.016899,0.017719) (0.043802,0.037413) (0.031169,0.028326) (0.040373,0.007545) (0.042987,0.026778) (0.027253,0.006858) (0.033082,0.042031) (0.041899,0.017719) (0.052253,0.006858)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..782689daa1a5a2545bb8a66da377d4b434a076c9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.096895e+02 -2.111192e-03 -2.102994e-03
+1.000000e-02 6.185883e+02 -4.207203e-03 -4.190828e-03
+1.500000e-02 9.265735e+02 -6.292739e-03 -6.267513e-03
+2.000000e-02 1.233208e+03 -8.383067e-03 -8.347447e-03
+2.500000e-02 1.538476e+03 -1.047935e-02 -1.043282e-02
+3.000000e-02 1.842791e+03 -1.256924e-02 -1.251152e-02
+3.500000e-02 2.146346e+03 -1.464669e-02 -1.457757e-02
+4.000000e-02 2.449180e+03 -1.671080e-02 -1.663009e-02
+4.500000e-02 2.751306e+03 -1.876149e-02 -1.866904e-02
+5.000000e-02 3.052733e+03 -2.079867e-02 -2.069437e-02
+5.500000e-02 3.353467e+03 -2.282260e-02 -2.270632e-02
+6.000000e-02 3.653514e+03 -2.483330e-02 -2.470492e-02
+6.500000e-02 3.952885e+03 -2.683064e-02 -2.669010e-02
+7.000000e-02 4.251571e+03 -2.881547e-02 -2.866259e-02
+7.500000e-02 4.549597e+03 -3.078691e-02 -3.062169e-02
+8.000000e-02 4.846948e+03 -3.274599e-02 -3.256826e-02
+8.500000e-02 5.143651e+03 -3.469202e-02 -3.450179e-02
+9.000000e-02 5.439692e+03 -3.662596e-02 -3.642305e-02
+9.500000e-02 5.735084e+03 -3.854707e-02 -3.833146e-02
+1.000000e-01 6.029839e+03 -4.045569e-02 -4.022736e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016091,0.007156) (0.007983,0.030747) (0.015540,0.032727) (0.005918,0.043270) (0.004559,0.015036) (0.016730,0.015471) (0.019107,0.043869) (0.002578,0.007493) (0.012864,0.022411) (0.000522,0.034035) (0.041091,0.007156) (0.032983,0.030747) (0.040540,0.032727) (0.030918,0.043270) (0.029559,0.015036) (0.041730,0.015471) (0.044107,0.043869) (0.027578,0.007493) (0.037864,0.022411) (0.025522,0.034035) (0.052578,0.007493) (0.050522,0.034035)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..497f2cc06b156d7544838ea044d04bf55164144a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.684055e+00
+1.000000e-02 8.181754e+00
+1.500000e-02 1.024328e+01
+2.000000e-02 1.160673e+01
+2.500000e-02 1.270877e+01
+3.000000e-02 1.366986e+01
+3.500000e-02 1.452786e+01
+4.000000e-02 1.530195e+01
+4.500000e-02 1.600544e+01
+5.000000e-02 1.664882e+01
+5.500000e-02 1.724077e+01
+6.000000e-02 1.778676e+01
+6.500000e-02 1.829660e+01
+7.000000e-02 1.877417e+01
+7.500000e-02 1.922438e+01
+8.000000e-02 1.965152e+01
+8.500000e-02 2.005949e+01
+9.000000e-02 2.045176e+01
+9.500000e-02 2.083150e+01
+1.000000e-01 2.120154e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016091,0.007156) (0.007983,0.030747) (0.015540,0.032727) (0.005918,0.043270) (0.004559,0.015036) (0.016730,0.015471) (0.019107,0.043869) (0.002578,0.007493) (0.012864,0.022411) (0.000522,0.034035) (0.041091,0.007156) (0.032983,0.030747) (0.040540,0.032727) (0.030918,0.043270) (0.029559,0.015036) (0.041730,0.015471) (0.044107,0.043869) (0.027578,0.007493) (0.037864,0.022411) (0.025522,0.034035) (0.052578,0.007493) (0.050522,0.034035)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..56b4acfcfac6667d9057a3c1ace1d1bdf19c75ee
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.155199e+01 -7.889273e-05 -4.253139e-03
+1.000000e-02 2.035728e+01 -1.401625e-04 -8.609537e-03
+1.500000e-02 2.598578e+01 -1.805075e-04 -1.311493e-02
+2.000000e-02 3.020892e+01 -2.112602e-04 -1.766669e-02
+2.500000e-02 3.377746e+01 -2.373696e-04 -2.221715e-02
+3.000000e-02 3.692992e+01 -2.604455e-04 -2.675096e-02
+3.500000e-02 3.976773e+01 -2.812005e-04 -3.126182e-02
+4.000000e-02 4.234890e+01 -3.000576e-04 -3.574635e-02
+4.500000e-02 4.471428e+01 -3.173206e-04 -4.020234e-02
+5.000000e-02 4.689505e+01 -3.332223e-04 -4.462822e-02
+5.500000e-02 4.891731e+01 -3.479565e-04 -4.902278e-02
+6.000000e-02 5.080212e+01 -3.616799e-04 -5.338515e-02
+6.500000e-02 5.256817e+01 -3.745301e-04 -5.771461e-02
+7.000000e-02 5.423133e+01 -3.866242e-04 -6.201059e-02
+7.500000e-02 5.580521e+01 -3.980618e-04 -6.627272e-02
+8.000000e-02 5.730090e+01 -4.089247e-04 -7.050072e-02
+8.500000e-02 5.872809e+01 -4.192840e-04 -7.469444e-02
+9.000000e-02 6.009515e+01 -4.292008e-04 -7.885379e-02
+9.500000e-02 6.140867e+01 -4.387449e-04 -8.297920e-02
+1.000000e-01 6.267566e+01 -4.479225e-04 -8.706988e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016091,0.007156) (0.007983,0.030747) (0.015540,0.032727) (0.005918,0.043270) (0.004559,0.015036) (0.016730,0.015471) (0.019107,0.043869) (0.002578,0.007493) (0.012864,0.022411) (0.000522,0.034035) (0.041091,0.007156) (0.032983,0.030747) (0.040540,0.032727) (0.030918,0.043270) (0.029559,0.015036) (0.041730,0.015471) (0.044107,0.043869) (0.027578,0.007493) (0.037864,0.022411) (0.025522,0.034035) (0.052578,0.007493) (0.050522,0.034035)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..10a2d995130a25b460c9a51f28c2fc42374b7725
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.096753e+02 -2.107945e-03 -2.110143e-03
+1.000000e-02 6.185627e+02 -4.200729e-03 -4.205056e-03
+1.500000e-02 9.265392e+02 -6.282791e-03 -6.288871e-03
+2.000000e-02 1.233167e+03 -8.369273e-03 -8.375856e-03
+2.500000e-02 1.538428e+03 -1.046183e-02 -1.046781e-02
+3.000000e-02 1.842740e+03 -1.254801e-02 -1.255285e-02
+3.500000e-02 2.146292e+03 -1.462174e-02 -1.462507e-02
+4.000000e-02 2.449127e+03 -1.668215e-02 -1.668364e-02
+4.500000e-02 2.751255e+03 -1.872916e-02 -1.872850e-02
+5.000000e-02 3.052684e+03 -2.076269e-02 -2.075960e-02
+5.500000e-02 3.353429e+03 -2.278276e-02 -2.277696e-02
+6.000000e-02 3.653474e+03 -2.479063e-02 -2.478178e-02
+6.500000e-02 3.952851e+03 -2.678415e-02 -2.677212e-02
+7.000000e-02 4.251547e+03 -2.876523e-02 -2.874975e-02
+7.500000e-02 4.549584e+03 -3.073328e-02 -3.071409e-02
+8.000000e-02 4.846948e+03 -3.268883e-02 -3.266574e-02
+8.500000e-02 5.143656e+03 -3.463208e-02 -3.460481e-02
+9.000000e-02 5.439713e+03 -3.656241e-02 -3.653079e-02
+9.500000e-02 5.735121e+03 -3.848027e-02 -3.844412e-02
+1.000000e-01 6.029886e+03 -4.038580e-02 -4.034495e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.011407,0.012536) (0.012042,0.025734) (0.001826,0.010511) (0.000075,0.030859) (0.000460,0.020979) (0.014482,0.041024) (0.003143,0.039885) (0.019847,0.005768) (0.016297,0.018670) (0.011150,0.004606) (0.036407,0.012536) (0.037042,0.025734) (0.026826,0.010511) (0.025075,0.030859) (0.025460,0.020979) (0.039482,0.041024) (0.028143,0.039885) (0.044847,0.005768) (0.041297,0.018670) (0.036150,0.004606) (0.051826,0.010511) (0.050075,0.030859) (0.050460,0.020979) (0.053143,0.039885)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8d4349c7a7274dc6fd763556643a6b8c0f2753c0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.647151e+00
+1.000000e-02 8.168199e+00
+1.500000e-02 1.020947e+01
+2.000000e-02 1.157616e+01
+2.500000e-02 1.268012e+01
+3.000000e-02 1.363981e+01
+3.500000e-02 1.449349e+01
+4.000000e-02 1.526068e+01
+4.500000e-02 1.595513e+01
+5.000000e-02 1.658786e+01
+5.500000e-02 1.716811e+01
+6.000000e-02 1.770381e+01
+6.500000e-02 1.820179e+01
+7.000000e-02 1.866800e+01
+7.500000e-02 1.910759e+01
+8.000000e-02 1.952506e+01
+8.500000e-02 1.992436e+01
+9.000000e-02 2.030894e+01
+9.500000e-02 2.068179e+01
+1.000000e-01 2.104558e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.011407,0.012536) (0.012042,0.025734) (0.001826,0.010511) (0.000075,0.030859) (0.000460,0.020979) (0.014482,0.041024) (0.003143,0.039885) (0.019847,0.005768) (0.016297,0.018670) (0.011150,0.004606) (0.036407,0.012536) (0.037042,0.025734) (0.026826,0.010511) (0.025075,0.030859) (0.025460,0.020979) (0.039482,0.041024) (0.028143,0.039885) (0.044847,0.005768) (0.041297,0.018670) (0.036150,0.004606) (0.051826,0.010511) (0.050075,0.030859) (0.050460,0.020979) (0.053143,0.039885)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..70eea158d423ea5bde86ca3dc93a9a7eab5cb11f
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.054234e+01 -7.179058e-05 -4.320913e-03
+1.000000e-02 1.888352e+01 -1.290003e-04 -8.725702e-03
+1.500000e-02 2.401826e+01 -1.652916e-04 -1.327523e-02
+2.000000e-02 2.775612e+01 -1.921586e-04 -1.786727e-02
+2.500000e-02 3.090881e+01 -2.148542e-04 -2.245256e-02
+3.000000e-02 3.371865e+01 -2.350149e-04 -2.701581e-02
+3.500000e-02 3.627601e+01 -2.532890e-04 -3.155152e-02
+4.000000e-02 3.863064e+01 -2.700499e-04 -3.605691e-02
+4.500000e-02 4.081832e+01 -2.855708e-04 -4.053010e-02
+5.000000e-02 4.286707e+01 -3.000673e-04 -4.496979e-02
+5.500000e-02 4.480038e+01 -3.137187e-04 -4.937496e-02
+6.000000e-02 4.663769e+01 -3.266736e-04 -5.374486e-02
+6.500000e-02 4.839608e+01 -3.390614e-04 -5.807890e-02
+7.000000e-02 5.009023e+01 -3.509930e-04 -6.237662e-02
+7.500000e-02 5.173227e+01 -3.625603e-04 -6.663776e-02
+8.000000e-02 5.333272e+01 -3.738426e-04 -7.086213e-02
+8.500000e-02 5.490495e+01 -3.849333e-04 -7.505007e-02
+9.000000e-02 5.644689e+01 -3.958324e-04 -7.920079e-02
+9.500000e-02 5.797001e+01 -4.066182e-04 -8.331474e-02
+1.000000e-01 5.947959e+01 -4.173310e-04 -8.739207e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.011407,0.012536) (0.012042,0.025734) (0.001826,0.010511) (0.000075,0.030859) (0.000460,0.020979) (0.014482,0.041024) (0.003143,0.039885) (0.019847,0.005768) (0.016297,0.018670) (0.011150,0.004606) (0.036407,0.012536) (0.037042,0.025734) (0.026826,0.010511) (0.025075,0.030859) (0.025460,0.020979) (0.039482,0.041024) (0.028143,0.039885) (0.044847,0.005768) (0.041297,0.018670) (0.036150,0.004606) (0.051826,0.010511) (0.050075,0.030859) (0.050460,0.020979) (0.053143,0.039885)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3512f9df3f93690322235df18495f549bfcc503f
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.096680e+02 -2.066361e-03 -2.152694e-03
+1.000000e-02 6.185487e+02 -4.117782e-03 -4.289921e-03
+1.500000e-02 9.265193e+02 -6.158117e-03 -6.416350e-03
+2.000000e-02 1.233141e+03 -8.200113e-03 -8.548549e-03
+2.500000e-02 1.538398e+03 -1.024456e-02 -1.068920e-02
+3.000000e-02 1.842705e+03 -1.228091e-02 -1.282460e-02
+3.500000e-02 2.146259e+03 -1.430391e-02 -1.494750e-02
+4.000000e-02 2.449090e+03 -1.631342e-02 -1.705740e-02
+4.500000e-02 2.751214e+03 -1.830917e-02 -1.915386e-02
+5.000000e-02 3.052641e+03 -2.029126e-02 -2.123691e-02
+5.500000e-02 3.353369e+03 -2.226041e-02 -2.330745e-02
+6.000000e-02 3.653422e+03 -2.421514e-02 -2.536334e-02
+6.500000e-02 3.952796e+03 -2.615685e-02 -2.740644e-02
+7.000000e-02 4.251489e+03 -2.808593e-02 -2.943718e-02
+7.500000e-02 4.549515e+03 -3.000146e-02 -3.145412e-02
+8.000000e-02 4.846881e+03 -3.190436e-02 -3.345868e-02
+8.500000e-02 5.143595e+03 -3.379423e-02 -3.545019e-02
+9.000000e-02 5.439642e+03 -3.567174e-02 -3.742926e-02
+9.500000e-02 5.735053e+03 -3.753669e-02 -3.939586e-02
+1.000000e-01 6.029817e+03 -3.938984e-02 -4.135095e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.009303,0.031797) (0.002340,0.018244) (0.009978,0.021209) (0.001414,0.006223) (0.014464,0.043299) (0.001444,0.041361) (0.018962,0.008201) (0.017154,0.027003) (0.001204,0.027387) (0.019672,0.035347) (0.034303,0.031797) (0.027340,0.018244) (0.034978,0.021209) (0.026414,0.006223) (0.039464,0.043299) (0.026444,0.041361) (0.043962,0.008201) (0.042154,0.027003) (0.026204,0.027387) (0.044672,0.035347) (0.052340,0.018244) (0.051414,0.006223) (0.051444,0.041361) (0.051204,0.027387)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..90e8c1e026a55879901a67b75e1a60a77ab6b9c5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.815523e+00
+1.000000e-02 8.403716e+00
+1.500000e-02 1.049348e+01
+2.000000e-02 1.190100e+01
+2.500000e-02 1.304073e+01
+3.000000e-02 1.403044e+01
+3.500000e-02 1.491066e+01
+4.000000e-02 1.570260e+01
+4.500000e-02 1.642107e+01
+5.000000e-02 1.707775e+01
+5.500000e-02 1.768229e+01
+6.000000e-02 1.824639e+01
+6.500000e-02 1.876975e+01
+7.000000e-02 1.926183e+01
+7.500000e-02 1.972768e+01
+8.000000e-02 2.017166e+01
+8.500000e-02 2.059754e+01
+9.000000e-02 2.100863e+01
+9.500000e-02 2.140778e+01
+1.000000e-01 2.179754e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.009303,0.031797) (0.002340,0.018244) (0.009978,0.021209) (0.001414,0.006223) (0.014464,0.043299) (0.001444,0.041361) (0.018962,0.008201) (0.017154,0.027003) (0.001204,0.027387) (0.019672,0.035347) (0.034303,0.031797) (0.027340,0.018244) (0.034978,0.021209) (0.026414,0.006223) (0.039464,0.043299) (0.026444,0.041361) (0.043962,0.008201) (0.042154,0.027003) (0.026204,0.027387) (0.044672,0.035347) (0.052340,0.018244) (0.051414,0.006223) (0.051444,0.041361) (0.051204,0.027387)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..352afb216cc454f921939d46484be65109663256
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.865074e+00 -6.585399e-05 -4.399348e-03
+1.000000e-02 1.765818e+01 -1.184264e-04 -8.861030e-03
+1.500000e-02 2.233242e+01 -1.509181e-04 -1.345295e-02
+2.000000e-02 2.567504e+01 -1.744198e-04 -1.808205e-02
+2.500000e-02 2.846489e+01 -1.939873e-04 -2.270132e-02
+3.000000e-02 3.093220e+01 -2.111907e-04 -2.729600e-02
+3.500000e-02 3.316007e+01 -2.266313e-04 -3.186108e-02
+4.000000e-02 3.519286e+01 -2.406444e-04 -3.639423e-02
+4.500000e-02 3.706266e+01 -2.534743e-04 -4.089395e-02
+5.000000e-02 3.879475e+01 -2.653122e-04 -4.535922e-02
+5.500000e-02 4.041057e+01 -2.763186e-04 -4.978928e-02
+6.000000e-02 4.192885e+01 -2.866317e-04 -5.418355e-02
+6.500000e-02 4.336544e+01 -2.963676e-04 -5.854160e-02
+7.000000e-02 4.473406e+01 -3.056268e-04 -6.286315e-02
+7.500000e-02 4.604639e+01 -3.144945e-04 -6.714802e-02
+8.000000e-02 4.731287e+01 -3.230462e-04 -7.139612e-02
+8.500000e-02 4.854233e+01 -3.313462e-04 -7.560742e-02
+9.000000e-02 4.974242e+01 -3.394498e-04 -7.978199e-02
+9.500000e-02 5.091922e+01 -3.474015e-04 -8.391994e-02
+1.000000e-01 5.207813e+01 -3.552405e-04 -8.802146e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.009303,0.031797) (0.002340,0.018244) (0.009978,0.021209) (0.001414,0.006223) (0.014464,0.043299) (0.001444,0.041361) (0.018962,0.008201) (0.017154,0.027003) (0.001204,0.027387) (0.019672,0.035347) (0.034303,0.031797) (0.027340,0.018244) (0.034978,0.021209) (0.026414,0.006223) (0.039464,0.043299) (0.026444,0.041361) (0.043962,0.008201) (0.042154,0.027003) (0.026204,0.027387) (0.044672,0.035347) (0.052340,0.018244) (0.051414,0.006223) (0.051444,0.041361) (0.051204,0.027387)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e454043330c78c0be0dbc0d2c04a1ec307606bc0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.096662e+02 -2.045958e-03 -2.170816e-03
+1.000000e-02 6.185436e+02 -4.077011e-03 -4.326165e-03
+1.500000e-02 9.265091e+02 -6.096957e-03 -6.470883e-03
+2.000000e-02 1.233125e+03 -8.117181e-03 -8.623146e-03
+2.500000e-02 1.538374e+03 -1.013705e-02 -1.078699e-02
+3.000000e-02 1.842673e+03 -1.214725e-02 -1.294729e-02
+3.500000e-02 2.146213e+03 -1.414371e-02 -1.509609e-02
+4.000000e-02 2.449039e+03 -1.612580e-02 -1.723182e-02
+4.500000e-02 2.751153e+03 -1.809399e-02 -1.935480e-02
+5.000000e-02 3.052569e+03 -2.004821e-02 -2.146474e-02
+5.500000e-02 3.353287e+03 -2.198882e-02 -2.356185e-02
+6.000000e-02 3.653331e+03 -2.391537e-02 -2.564564e-02
+6.500000e-02 3.952689e+03 -2.582860e-02 -2.771676e-02
+7.000000e-02 4.251369e+03 -2.772862e-02 -2.977529e-02
+7.500000e-02 4.549388e+03 -2.961513e-02 -3.182064e-02
+8.000000e-02 4.846736e+03 -3.148884e-02 -3.385375e-02
+8.500000e-02 5.143429e+03 -3.334968e-02 -3.587466e-02
+9.000000e-02 5.439470e+03 -3.519751e-02 -3.788255e-02
+9.500000e-02 5.734862e+03 -3.703266e-02 -3.987794e-02
+1.000000e-01 6.029611e+03 -3.885530e-02 -4.186108e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.019640,0.031838) (0.010410,0.016955) (0.002652,0.031031) (0.003302,0.007075) (0.019212,0.004519) (0.006630,0.043598) (0.000251,0.023510) (0.008241,0.025147) (0.019650,0.044012) (0.016606,0.021672) (0.044640,0.031838) (0.035410,0.016955) (0.027652,0.031031) (0.028302,0.007075) (0.044212,0.004519) (0.031630,0.043598) (0.025251,0.023510) (0.033241,0.025147) (0.044650,0.044012) (0.041606,0.021672) (0.052652,0.031031) (0.053302,0.007075) (0.050251,0.023510)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2b9fb063e6dab130098da969d22c10c0457466b1
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.922679e+00
+1.000000e-02 8.421733e+00
+1.500000e-02 1.053596e+01
+2.000000e-02 1.194322e+01
+2.500000e-02 1.307247e+01
+3.000000e-02 1.405167e+01
+3.500000e-02 1.492288e+01
+4.000000e-02 1.570807e+01
+4.500000e-02 1.642256e+01
+5.000000e-02 1.707828e+01
+5.500000e-02 1.768492e+01
+6.000000e-02 1.825047e+01
+6.500000e-02 1.878158e+01
+7.000000e-02 1.928382e+01
+7.500000e-02 1.976192e+01
+8.000000e-02 2.021990e+01
+8.500000e-02 2.066124e+01
+9.000000e-02 2.108891e+01
+9.500000e-02 2.150556e+01
+1.000000e-01 2.191353e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.019640,0.031838) (0.010410,0.016955) (0.002652,0.031031) (0.003302,0.007075) (0.019212,0.004519) (0.006630,0.043598) (0.000251,0.023510) (0.008241,0.025147) (0.019650,0.044012) (0.016606,0.021672) (0.044640,0.031838) (0.035410,0.016955) (0.027652,0.031031) (0.028302,0.007075) (0.044212,0.004519) (0.031630,0.043598) (0.025251,0.023510) (0.033241,0.025147) (0.044650,0.044012) (0.041606,0.021672) (0.052652,0.031031) (0.053302,0.007075) (0.050251,0.023510)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f4abaddf2429cb8c067de62a7bf255f48b78258d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.114386e+01 -7.374959e-05 -4.343558e-03
+1.000000e-02 1.936839e+01 -1.294063e-04 -8.779080e-03
+1.500000e-02 2.458763e+01 -1.654799e-04 -1.334398e-02
+2.000000e-02 2.842169e+01 -1.922179e-04 -1.794910e-02
+2.500000e-02 3.164739e+01 -2.147160e-04 -2.254659e-02
+3.000000e-02 3.450510e+01 -2.346019e-04 -2.712151e-02
+3.500000e-02 3.709212e+01 -2.525546e-04 -3.166834e-02
+4.000000e-02 3.946365e+01 -2.689680e-04 -3.618431e-02
+4.500000e-02 4.165703e+01 -2.841121e-04 -4.066776e-02
+5.000000e-02 4.370113e+01 -2.981965e-04 -4.511754e-02
+5.500000e-02 4.561914e+01 -3.113900e-04 -4.953281e-02
+6.000000e-02 4.743078e+01 -3.238352e-04 -5.391294e-02
+6.500000e-02 4.915206e+01 -3.356483e-04 -5.825753e-02
+7.000000e-02 5.079641e+01 -3.469264e-04 -6.256630e-02
+7.500000e-02 5.237496e+01 -3.577497e-04 -6.683912e-02
+8.000000e-02 5.389722e+01 -3.681870e-04 -7.107593e-02
+8.500000e-02 5.537130e+01 -3.782962e-04 -7.527675e-02
+9.000000e-02 5.680443e+01 -3.881291e-04 -7.944168e-02
+9.500000e-02 5.820246e+01 -3.977268e-04 -8.357085e-02
+1.000000e-01 5.957050e+01 -4.071256e-04 -8.766447e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.019640,0.031838) (0.010410,0.016955) (0.002652,0.031031) (0.003302,0.007075) (0.019212,0.004519) (0.006630,0.043598) (0.000251,0.023510) (0.008241,0.025147) (0.019650,0.044012) (0.016606,0.021672) (0.044640,0.031838) (0.035410,0.016955) (0.027652,0.031031) (0.028302,0.007075) (0.044212,0.004519) (0.031630,0.043598) (0.025251,0.023510) (0.033241,0.025147) (0.044650,0.044012) (0.041606,0.021672) (0.052652,0.031031) (0.053302,0.007075) (0.050251,0.023510)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5d1918154a312fc7b296f004027016c54cdfca57
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.096618e+02 -2.105464e-03 -2.114105e-03
+1.000000e-02 6.185368e+02 -4.195754e-03 -4.212972e-03
+1.500000e-02 9.265020e+02 -6.275064e-03 -6.300916e-03
+2.000000e-02 1.233119e+03 -8.357783e-03 -8.392814e-03
+2.500000e-02 1.538371e+03 -1.044561e-02 -1.049044e-02
+3.000000e-02 1.842673e+03 -1.252662e-02 -1.258148e-02
+3.500000e-02 2.146218e+03 -1.459492e-02 -1.465990e-02
+4.000000e-02 2.449044e+03 -1.664969e-02 -1.672483e-02
+4.500000e-02 2.751164e+03 -1.869085e-02 -1.877619e-02
+5.000000e-02 3.052587e+03 -2.071842e-02 -2.081397e-02
+5.500000e-02 3.353325e+03 -2.273232e-02 -2.283810e-02
+6.000000e-02 3.653371e+03 -2.473314e-02 -2.484917e-02
+6.500000e-02 3.952732e+03 -2.672094e-02 -2.684721e-02
+7.000000e-02 4.251432e+03 -2.869525e-02 -2.883177e-02
+7.500000e-02 4.549453e+03 -3.065741e-02 -3.080421e-02
+8.000000e-02 4.846816e+03 -3.260587e-02 -3.276290e-02
+8.500000e-02 5.143518e+03 -3.454143e-02 -3.470866e-02
+9.000000e-02 5.439577e+03 -3.646459e-02 -3.664206e-02
+9.500000e-02 5.734971e+03 -3.837536e-02 -3.856301e-02
+1.000000e-01 6.029739e+03 -4.027436e-02 -4.047222e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016148,0.017223) (0.008708,0.036706) (0.002994,0.004326) (0.010387,0.026288) (0.019316,0.031487) (0.017297,0.043821) (0.016710,0.008426) (0.002904,0.044264) (0.009465,0.012131) (0.000049,0.019343) (0.041148,0.017223) (0.033708,0.036706) (0.027994,0.004326) (0.035387,0.026288) (0.044316,0.031487) (0.042297,0.043821) (0.041710,0.008426) (0.027904,0.044264) (0.034465,0.012131) (0.025049,0.019343) (0.052994,0.004326) (0.052904,0.044264) (0.050049,0.019343)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..04c78ff8f78eac1c833c13847d35308f72f8554b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.598269e+00
+1.000000e-02 8.223685e+00
+1.500000e-02 1.025996e+01
+2.000000e-02 1.162026e+01
+2.500000e-02 1.273601e+01
+3.000000e-02 1.371304e+01
+3.500000e-02 1.458512e+01
+4.000000e-02 1.537024e+01
+4.500000e-02 1.608137e+01
+5.000000e-02 1.672904e+01
+5.500000e-02 1.732219e+01
+6.000000e-02 1.786854e+01
+6.500000e-02 1.837479e+01
+7.000000e-02 1.884680e+01
+7.500000e-02 1.928973e+01
+8.000000e-02 1.970812e+01
+8.500000e-02 2.010598e+01
+9.000000e-02 2.048685e+01
+9.500000e-02 2.085390e+01
+1.000000e-01 2.120987e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016148,0.017223) (0.008708,0.036706) (0.002994,0.004326) (0.010387,0.026288) (0.019316,0.031487) (0.017297,0.043821) (0.016710,0.008426) (0.002904,0.044264) (0.009465,0.012131) (0.000049,0.019343) (0.041148,0.017223) (0.033708,0.036706) (0.027994,0.004326) (0.035387,0.026288) (0.044316,0.031487) (0.042297,0.043821) (0.041710,0.008426) (0.027904,0.044264) (0.034465,0.012131) (0.025049,0.019343) (0.052994,0.004326) (0.052904,0.044264) (0.050049,0.019343)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cf367f0113fac8de9472f89719d8509293274fe3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.3079_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.216426e+00 -6.264589e-05 -4.405524e-03
+1.000000e-02 1.698415e+01 -1.154670e-04 -8.852311e-03
+1.500000e-02 2.149648e+01 -1.470753e-04 -1.344956e-02
+2.000000e-02 2.461374e+01 -1.692732e-04 -1.808538e-02
+2.500000e-02 2.722858e+01 -1.879005e-04 -2.270706e-02
+3.000000e-02 2.955312e+01 -2.043625e-04 -2.730186e-02
+3.500000e-02 3.165698e+01 -2.191586e-04 -3.186592e-02
+4.000000e-02 3.357692e+01 -2.325715e-04 -3.639736e-02
+4.500000e-02 3.533881e+01 -2.448062e-04 -4.089498e-02
+5.000000e-02 3.696398e+01 -2.560314e-04 -4.535787e-02
+5.500000e-02 3.847111e+01 -2.663932e-04 -4.978527e-02
+6.000000e-02 3.987647e+01 -2.760169e-04 -5.417664e-02
+6.500000e-02 4.119572e+01 -2.850389e-04 -5.853176e-02
+7.000000e-02 4.243930e+01 -2.935041e-04 -6.284980e-02
+7.500000e-02 4.362028e+01 -3.015281e-04 -6.713072e-02
+8.000000e-02 4.474840e+01 -3.091837e-04 -7.137437e-02
+8.500000e-02 4.583271e+01 -3.165382e-04 -7.558066e-02
+9.000000e-02 4.688098e+01 -3.236489e-04 -7.974954e-02
+9.500000e-02 4.789990e+01 -3.305648e-04 -8.388107e-02
+1.000000e-01 4.889548e+01 -3.373296e-04 -8.797532e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016148,0.017223) (0.008708,0.036706) (0.002994,0.004326) (0.010387,0.026288) (0.019316,0.031487) (0.017297,0.043821) (0.016710,0.008426) (0.002904,0.044264) (0.009465,0.012131) (0.000049,0.019343) (0.041148,0.017223) (0.033708,0.036706) (0.027994,0.004326) (0.035387,0.026288) (0.044316,0.031487) (0.042297,0.043821) (0.041710,0.008426) (0.027904,0.044264) (0.034465,0.012131) (0.025049,0.019343) (0.052994,0.004326) (0.052904,0.044264) (0.050049,0.019343)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f32d8c0997c62ab26a846fa38352414a8fee17d4
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.015024e+02 -2.067924e-03 -1.976391e-03
+1.000000e-02 8.018462e+02 -4.121241e-03 -3.938573e-03
+1.500000e-02 1.200930e+03 -6.164779e-03 -5.889599e-03
+2.000000e-02 1.598389e+03 -8.215362e-03 -7.839258e-03
+2.500000e-02 1.994228e+03 -1.027527e-02 -9.788031e-03
+3.000000e-02 2.388807e+03 -1.233086e-02 -1.172778e-02
+3.500000e-02 2.782294e+03 -1.437527e-02 -1.365464e-02
+4.000000e-02 3.174726e+03 -1.640744e-02 -1.556815e-02
+4.500000e-02 3.566117e+03 -1.842720e-02 -1.746836e-02
+5.000000e-02 3.956478e+03 -2.043435e-02 -1.935533e-02
+5.500000e-02 4.345817e+03 -2.242924e-02 -2.122932e-02
+6.000000e-02 4.734142e+03 -2.441147e-02 -2.309035e-02
+6.500000e-02 5.121463e+03 -2.638153e-02 -2.493869e-02
+7.000000e-02 5.507787e+03 -2.833932e-02 -2.677446e-02
+7.500000e-02 5.893123e+03 -3.028486e-02 -2.859777e-02
+8.000000e-02 6.277483e+03 -3.221801e-02 -3.040857e-02
+8.500000e-02 6.660860e+03 -3.413942e-02 -3.220751e-02
+9.000000e-02 7.043274e+03 -3.604880e-02 -3.399437e-02
+9.500000e-02 7.424729e+03 -3.794635e-02 -3.576938e-02
+1.000000e-01 7.805231e+03 -3.983186e-02 -3.753258e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.017963,0.030134) (0.001181,0.042157) (0.016764,0.016199) (0.004833,0.029201) (0.016816,0.007559) (0.002384,0.004240) (0.010240,0.043538) (0.001673,0.021311) (0.019291,0.038071) (0.007771,0.010213) (0.013321,0.023177) (0.000150,0.012274) (0.006694,0.036685) (0.042963,0.030134) (0.026181,0.042157) (0.041764,0.016199) (0.029833,0.029201) (0.041816,0.007559) (0.027384,0.004240) (0.035240,0.043538) (0.026673,0.021311) (0.044291,0.038071) (0.032771,0.010213) (0.038321,0.023177) (0.025150,0.012274) (0.031694,0.036685) (0.051181,0.042157) (0.052384,0.004240) (0.051673,0.021311) (0.050150,0.012274)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..675d7d7f64d5235d62f6a6a1367ff4cd6a60ee3b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.667029e+00
+1.000000e-02 9.404575e+00
+1.500000e-02 1.146824e+01
+2.000000e-02 1.293432e+01
+2.500000e-02 1.414616e+01
+3.000000e-02 1.519465e+01
+3.500000e-02 1.611662e+01
+4.000000e-02 1.693545e+01
+4.500000e-02 1.766907e+01
+5.000000e-02 1.833214e+01
+5.500000e-02 1.893685e+01
+6.000000e-02 1.949350e+01
+6.500000e-02 2.001082e+01
+7.000000e-02 2.049627e+01
+7.500000e-02 2.095624e+01
+8.000000e-02 2.139622e+01
+8.500000e-02 2.182093e+01
+9.000000e-02 2.223445e+01
+9.500000e-02 2.264036e+01
+1.000000e-01 2.304172e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.017963,0.030134) (0.001181,0.042157) (0.016764,0.016199) (0.004833,0.029201) (0.016816,0.007559) (0.002384,0.004240) (0.010240,0.043538) (0.001673,0.021311) (0.019291,0.038071) (0.007771,0.010213) (0.013321,0.023177) (0.000150,0.012274) (0.006694,0.036685) (0.042963,0.030134) (0.026181,0.042157) (0.041764,0.016199) (0.029833,0.029201) (0.041816,0.007559) (0.027384,0.004240) (0.035240,0.043538) (0.026673,0.021311) (0.044291,0.038071) (0.032771,0.010213) (0.038321,0.023177) (0.025150,0.012274) (0.031694,0.036685) (0.051181,0.042157) (0.052384,0.004240) (0.051673,0.021311) (0.050150,0.012274)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..face52c04d5df73ee9081bb9c0a253f989a4a3bb
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.474785e+01 -7.609944e-05 -4.133017e-03
+1.000000e-02 2.521895e+01 -1.311485e-04 -8.443937e-03
+1.500000e-02 3.209312e+01 -1.685005e-04 -1.290366e-02
+2.000000e-02 3.745038e+01 -1.980635e-04 -1.740572e-02
+2.500000e-02 4.205142e+01 -2.235414e-04 -2.190807e-02
+3.000000e-02 4.614070e+01 -2.461885e-04 -2.639668e-02
+3.500000e-02 4.983054e+01 -2.666152e-04 -3.086508e-02
+4.000000e-02 5.319353e+01 -2.852270e-04 -3.530928e-02
+4.500000e-02 5.628499e+01 -3.023353e-04 -3.972638e-02
+5.000000e-02 5.915016e+01 -3.181953e-04 -4.411413e-02
+5.500000e-02 6.182541e+01 -3.330126e-04 -4.847084e-02
+6.000000e-02 6.434129e+01 -3.469590e-04 -5.279522e-02
+6.500000e-02 6.672406e+01 -3.601822e-04 -5.708626e-02
+7.000000e-02 6.899467e+01 -3.728001e-04 -6.134328e-02
+7.500000e-02 7.117129e+01 -3.849151e-04 -6.556577e-02
+8.000000e-02 7.326899e+01 -3.966115e-04 -6.975346e-02
+8.500000e-02 7.530108e+01 -4.079634e-04 -7.390615e-02
+9.000000e-02 7.727797e+01 -4.190294e-04 -7.802381e-02
+9.500000e-02 7.920891e+01 -4.298601e-04 -8.210648e-02
+1.000000e-01 8.110148e+01 -4.404968e-04 -8.615434e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.017963,0.030134) (0.001181,0.042157) (0.016764,0.016199) (0.004833,0.029201) (0.016816,0.007559) (0.002384,0.004240) (0.010240,0.043538) (0.001673,0.021311) (0.019291,0.038071) (0.007771,0.010213) (0.013321,0.023177) (0.000150,0.012274) (0.006694,0.036685) (0.042963,0.030134) (0.026181,0.042157) (0.041764,0.016199) (0.029833,0.029201) (0.041816,0.007559) (0.027384,0.004240) (0.035240,0.043538) (0.026673,0.021311) (0.044291,0.038071) (0.032771,0.010213) (0.038321,0.023177) (0.025150,0.012274) (0.031694,0.036685) (0.051181,0.042157) (0.052384,0.004240) (0.051673,0.021311) (0.050150,0.012274)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5a7562ff265d11b31988fe3a190bd98c371d88e8
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.014758e+02 -1.960006e-03 -2.085361e-03
+1.000000e-02 8.017941e+02 -3.905904e-03 -4.155992e-03
+1.500000e-02 1.200853e+03 -5.840894e-03 -6.216559e-03
+2.000000e-02 1.598288e+03 -7.774728e-03 -8.283888e-03
+2.500000e-02 1.994103e+03 -9.707258e-03 -1.036088e-02
+3.000000e-02 2.388660e+03 -1.163051e-02 -1.243376e-02
+3.500000e-02 2.782125e+03 -1.354081e-02 -1.449547e-02
+4.000000e-02 3.174536e+03 -1.543774e-02 -1.654493e-02
+4.500000e-02 3.565907e+03 -1.732132e-02 -1.858186e-02
+5.000000e-02 3.956248e+03 -1.919168e-02 -2.060636e-02
+5.500000e-02 4.345567e+03 -2.104896e-02 -2.261841e-02
+6.000000e-02 4.733880e+03 -2.289307e-02 -2.461781e-02
+6.500000e-02 5.121177e+03 -2.472482e-02 -2.660547e-02
+7.000000e-02 5.507490e+03 -2.654348e-02 -2.858036e-02
+7.500000e-02 5.892805e+03 -2.834994e-02 -3.054356e-02
+8.000000e-02 6.277142e+03 -3.014396e-02 -3.249469e-02
+8.500000e-02 6.660506e+03 -3.192559e-02 -3.443345e-02
+9.000000e-02 7.042905e+03 -3.369520e-02 -3.636062e-02
+9.500000e-02 7.424343e+03 -3.545267e-02 -3.827550e-02
+1.000000e-01 7.804830e+03 -3.719839e-02 -4.017900e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.008478,0.023820) (0.016874,0.007748) (0.009620,0.042338) (0.000056,0.014979) (0.001746,0.032476) (0.018616,0.031744) (0.000408,0.005926) (0.016524,0.016083) (0.000059,0.043023) (0.007126,0.011272) (0.016291,0.023974) (0.000387,0.024490) (0.016693,0.045650) (0.033478,0.023820) (0.041874,0.007748) (0.034620,0.042338) (0.025056,0.014979) (0.026746,0.032476) (0.043616,0.031744) (0.025408,0.005926) (0.041524,0.016083) (0.025059,0.043023) (0.032126,0.011272) (0.041291,0.023974) (0.025387,0.024490) (0.041693,0.045650) (0.050056,0.014979) (0.051746,0.032476) (0.050408,0.005926) (0.050059,0.043023) (0.050387,0.024490)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..98c6380720fc9f65c7a040155cd7c6d5a562280c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.226026e+00
+1.000000e-02 9.717520e+00
+1.500000e-02 1.188744e+01
+2.000000e-02 1.342420e+01
+2.500000e-02 1.467594e+01
+3.000000e-02 1.575343e+01
+3.500000e-02 1.670334e+01
+4.000000e-02 1.755430e+01
+4.500000e-02 1.833513e+01
+5.000000e-02 1.904513e+01
+5.500000e-02 1.970605e+01
+6.000000e-02 2.032807e+01
+6.500000e-02 2.091930e+01
+7.000000e-02 2.148646e+01
+7.500000e-02 2.203521e+01
+8.000000e-02 2.257037e+01
+8.500000e-02 2.309603e+01
+9.000000e-02 2.361561e+01
+9.500000e-02 2.413202e+01
+1.000000e-01 2.464773e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.008478,0.023820) (0.016874,0.007748) (0.009620,0.042338) (0.000056,0.014979) (0.001746,0.032476) (0.018616,0.031744) (0.000408,0.005926) (0.016524,0.016083) (0.000059,0.043023) (0.007126,0.011272) (0.016291,0.023974) (0.000387,0.024490) (0.016693,0.045650) (0.033478,0.023820) (0.041874,0.007748) (0.034620,0.042338) (0.025056,0.014979) (0.026746,0.032476) (0.043616,0.031744) (0.025408,0.005926) (0.041524,0.016083) (0.025059,0.043023) (0.032126,0.011272) (0.041291,0.023974) (0.025387,0.024490) (0.041693,0.045650) (0.050056,0.014979) (0.051746,0.032476) (0.050408,0.005926) (0.050059,0.043023) (0.050387,0.024490)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7fdc05145d6f053053992633a343565a28738b88
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.802481e+01 -8.830241e-05 -4.116010e-03
+1.000000e-02 2.939204e+01 -1.457737e-04 -8.463597e-03
+1.500000e-02 3.750465e+01 -1.873793e-04 -1.293103e-02
+2.000000e-02 4.410740e+01 -2.215421e-04 -1.742950e-02
+2.500000e-02 4.989514e+01 -2.516445e-04 -2.192334e-02
+3.000000e-02 5.513535e+01 -2.790110e-04 -2.639930e-02
+3.500000e-02 5.997179e+01 -3.043675e-04 -3.085057e-02
+4.000000e-02 6.449702e+01 -3.281887e-04 -3.527298e-02
+4.500000e-02 6.877727e+01 -3.508171e-04 -3.966366e-02
+5.000000e-02 7.286150e+01 -3.725069e-04 -4.402059e-02
+5.500000e-02 7.678695e+01 -3.934521e-04 -4.834232e-02
+6.000000e-02 8.058339e+01 -4.138070e-04 -5.262780e-02
+6.500000e-02 8.427358e+01 -4.336900e-04 -5.687630e-02
+7.000000e-02 8.787685e+01 -4.532004e-04 -6.108729e-02
+7.500000e-02 9.140752e+01 -4.724122e-04 -6.526047e-02
+8.000000e-02 9.487734e+01 -4.913851e-04 -6.939566e-02
+8.500000e-02 9.829648e+01 -5.101713e-04 -7.349280e-02
+9.000000e-02 1.016727e+02 -5.288100e-04 -7.755190e-02
+9.500000e-02 1.050111e+02 -5.473279e-04 -8.157310e-02
+1.000000e-01 1.083156e+02 -5.657431e-04 -8.555661e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.008478,0.023820) (0.016874,0.007748) (0.009620,0.042338) (0.000056,0.014979) (0.001746,0.032476) (0.018616,0.031744) (0.000408,0.005926) (0.016524,0.016083) (0.000059,0.043023) (0.007126,0.011272) (0.016291,0.023974) (0.000387,0.024490) (0.016693,0.045650) (0.033478,0.023820) (0.041874,0.007748) (0.034620,0.042338) (0.025056,0.014979) (0.026746,0.032476) (0.043616,0.031744) (0.025408,0.005926) (0.041524,0.016083) (0.025059,0.043023) (0.032126,0.011272) (0.041291,0.023974) (0.025387,0.024490) (0.041693,0.045650) (0.050056,0.014979) (0.051746,0.032476) (0.050408,0.005926) (0.050059,0.043023) (0.050387,0.024490)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bc26e5235d8ead8ba81e640e33597fcaacae7e3a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.014710e+02 -2.014812e-03 -2.030175e-03
+1.000000e-02 8.017841e+02 -4.015118e-03 -4.046035e-03
+1.500000e-02 1.200837e+03 -6.004687e-03 -6.051756e-03
+2.000000e-02 1.598267e+03 -7.995589e-03 -8.061912e-03
+2.500000e-02 1.994077e+03 -9.988245e-03 -1.007867e-02
+3.000000e-02 2.388629e+03 -1.197278e-02 -1.209016e-02
+3.500000e-02 2.782089e+03 -1.394454e-02 -1.409032e-02
+4.000000e-02 3.174494e+03 -1.590293e-02 -1.607823e-02
+4.500000e-02 3.565859e+03 -1.784797e-02 -1.805377e-02
+5.000000e-02 3.956193e+03 -1.977964e-02 -2.001680e-02
+5.500000e-02 4.345507e+03 -2.169820e-02 -2.196760e-02
+6.000000e-02 4.733807e+03 -2.360369e-02 -2.390611e-02
+6.500000e-02 5.121110e+03 -2.549604e-02 -2.583223e-02
+7.000000e-02 5.507404e+03 -2.737605e-02 -2.774675e-02
+7.500000e-02 5.892721e+03 -2.924293e-02 -2.964881e-02
+8.000000e-02 6.277046e+03 -3.109771e-02 -3.153944e-02
+8.500000e-02 6.660409e+03 -3.293960e-02 -3.341779e-02
+9.000000e-02 7.042799e+03 -3.476980e-02 -3.528526e-02
+9.500000e-02 7.424231e+03 -3.658746e-02 -3.714063e-02
+1.000000e-01 7.804710e+03 -3.839282e-02 -3.898405e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.005745,0.039775) (0.016633,0.015779) (0.000900,0.025547) (0.001000,0.012333) (0.013448,0.006665) (0.016007,0.032909) (0.015121,0.024893) (0.018007,0.042587) (0.000087,0.033996) (0.008007,0.032209) (0.002535,0.004317) (0.009104,0.019353) (0.000327,0.045668) (0.030745,0.039775) (0.041633,0.015779) (0.025900,0.025547) (0.026000,0.012333) (0.038448,0.006665) (0.041007,0.032909) (0.040121,0.024893) (0.043007,0.042587) (0.025087,0.033996) (0.033007,0.032209) (0.027535,0.004317) (0.034104,0.019353) (0.025327,0.045668) (0.050900,0.025547) (0.051000,0.012333) (0.050087,0.033996) (0.052535,0.004317) (0.050327,0.045668)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0ec72a60783e9404d9f5249ddcc078702065b470
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.774314e+00
+1.000000e-02 9.471589e+00
+1.500000e-02 1.156264e+01
+2.000000e-02 1.303978e+01
+2.500000e-02 1.425961e+01
+3.000000e-02 1.531552e+01
+3.500000e-02 1.624612e+01
+4.000000e-02 1.707608e+01
+4.500000e-02 1.782394e+01
+5.000000e-02 1.850449e+01
+5.500000e-02 1.912981e+01
+6.000000e-02 1.970987e+01
+6.500000e-02 2.025304e+01
+7.000000e-02 2.076639e+01
+7.500000e-02 2.125588e+01
+8.000000e-02 2.172661e+01
+8.500000e-02 2.218296e+01
+9.000000e-02 2.262863e+01
+9.500000e-02 2.306687e+01
+1.000000e-01 2.350774e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.005745,0.039775) (0.016633,0.015779) (0.000900,0.025547) (0.001000,0.012333) (0.013448,0.006665) (0.016007,0.032909) (0.015121,0.024893) (0.018007,0.042587) (0.000087,0.033996) (0.008007,0.032209) (0.002535,0.004317) (0.009104,0.019353) (0.000327,0.045668) (0.030745,0.039775) (0.041633,0.015779) (0.025900,0.025547) (0.026000,0.012333) (0.038448,0.006665) (0.041007,0.032909) (0.040121,0.024893) (0.043007,0.042587) (0.025087,0.033996) (0.033007,0.032209) (0.027535,0.004317) (0.034104,0.019353) (0.025327,0.045668) (0.050900,0.025547) (0.051000,0.012333) (0.050087,0.033996) (0.052535,0.004317) (0.050327,0.045668)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..dea69828dd08bf5f1c36bbf7994465838beb69aa
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.511654e+01 -7.605294e-05 -4.182083e-03
+1.000000e-02 2.552349e+01 -1.296119e-04 -8.539015e-03
+1.500000e-02 3.239216e+01 -1.657415e-04 -1.304062e-02
+2.000000e-02 3.782893e+01 -1.947084e-04 -1.757340e-02
+2.500000e-02 4.259503e+01 -2.202005e-04 -2.209762e-02
+3.000000e-02 4.691320e+01 -2.433406e-04 -2.660205e-02
+3.500000e-02 5.089018e+01 -2.646920e-04 -3.108151e-02
+4.000000e-02 5.459643e+01 -2.846341e-04 -3.553266e-02
+4.500000e-02 5.808396e+01 -3.034481e-04 -3.995314e-02
+5.000000e-02 6.139404e+01 -3.213577e-04 -4.434117e-02
+5.500000e-02 6.455965e+01 -3.385415e-04 -4.869541e-02
+6.000000e-02 6.760722e+01 -3.551430e-04 -5.301488e-02
+6.500000e-02 7.055932e+01 -3.712844e-04 -5.729883e-02
+7.000000e-02 7.343382e+01 -3.870615e-04 -6.154677e-02
+7.500000e-02 7.624609e+01 -4.025568e-04 -6.575834e-02
+8.000000e-02 7.900881e+01 -4.178380e-04 -6.993334e-02
+8.500000e-02 8.173129e+01 -4.329553e-04 -7.407174e-02
+9.000000e-02 8.442188e+01 -4.479528e-04 -7.817359e-02
+9.500000e-02 8.708783e+01 -4.628692e-04 -8.223897e-02
+1.000000e-01 8.973501e+01 -4.777355e-04 -8.626808e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.005745,0.039775) (0.016633,0.015779) (0.000900,0.025547) (0.001000,0.012333) (0.013448,0.006665) (0.016007,0.032909) (0.015121,0.024893) (0.018007,0.042587) (0.000087,0.033996) (0.008007,0.032209) (0.002535,0.004317) (0.009104,0.019353) (0.000327,0.045668) (0.030745,0.039775) (0.041633,0.015779) (0.025900,0.025547) (0.026000,0.012333) (0.038448,0.006665) (0.041007,0.032909) (0.040121,0.024893) (0.043007,0.042587) (0.025087,0.033996) (0.033007,0.032209) (0.027535,0.004317) (0.034104,0.019353) (0.025327,0.045668) (0.050900,0.025547) (0.051000,0.012333) (0.050087,0.033996) (0.052535,0.004317) (0.050327,0.045668)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..26a1aa55cf1fc5ecb364364406d8c25768e53cf3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.014730e+02 -2.015118e-03 -2.033741e-03
+1.000000e-02 8.017915e+02 -4.015771e-03 -4.053068e-03
+1.500000e-02 1.200854e+03 -6.005607e-03 -6.062065e-03
+2.000000e-02 1.598295e+03 -7.996676e-03 -8.074976e-03
+2.500000e-02 1.994118e+03 -9.989836e-03 -1.009377e-02
+3.000000e-02 2.388684e+03 -1.197513e-02 -1.210682e-02
+3.500000e-02 2.782161e+03 -1.394773e-02 -1.410831e-02
+4.000000e-02 3.174591e+03 -1.590675e-02 -1.609711e-02
+4.500000e-02 3.565976e+03 -1.785265e-02 -1.807366e-02
+5.000000e-02 3.956333e+03 -1.978527e-02 -2.003771e-02
+5.500000e-02 4.345663e+03 -2.170496e-02 -2.198960e-02
+6.000000e-02 4.733995e+03 -2.361113e-02 -2.392867e-02
+6.500000e-02 5.121311e+03 -2.550481e-02 -2.585594e-02
+7.000000e-02 5.507639e+03 -2.738550e-02 -2.777093e-02
+7.500000e-02 5.892980e+03 -2.925349e-02 -2.967385e-02
+8.000000e-02 6.277346e+03 -3.110866e-02 -3.156459e-02
+8.500000e-02 6.660731e+03 -3.295170e-02 -3.344379e-02
+9.000000e-02 7.043155e+03 -3.478246e-02 -3.531138e-02
+9.500000e-02 7.424620e+03 -3.660109e-02 -3.716747e-02
+1.000000e-01 7.805133e+03 -3.840717e-02 -3.901132e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.010428,0.037025) (0.009042,0.026075) (0.014896,0.011958) (0.008232,0.044902) (0.000362,0.009336) (0.001069,0.037638) (0.000838,0.026316) (0.006932,0.016352) (0.006944,0.004986) (0.019538,0.044166) (0.019948,0.031309) (0.019358,0.021340) (0.016707,0.004397) (0.035428,0.037025) (0.034042,0.026075) (0.039896,0.011958) (0.033232,0.044902) (0.025362,0.009336) (0.026069,0.037638) (0.025838,0.026316) (0.031932,0.016352) (0.031944,0.004986) (0.044538,0.044166) (0.044948,0.031309) (0.044358,0.021340) (0.041707,0.004397) (0.050362,0.009336) (0.051069,0.037638) (0.050838,0.026316)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..813fbf04dacc11259f3b1443d5c86c3543d88c2f
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.726391e+00
+1.000000e-02 9.522774e+00
+1.500000e-02 1.160016e+01
+2.000000e-02 1.309507e+01
+2.500000e-02 1.433941e+01
+3.000000e-02 1.541745e+01
+3.500000e-02 1.636578e+01
+4.000000e-02 1.720844e+01
+4.500000e-02 1.796387e+01
+5.000000e-02 1.864704e+01
+5.500000e-02 1.927039e+01
+6.000000e-02 1.984438e+01
+6.500000e-02 2.037790e+01
+7.000000e-02 2.087855e+01
+7.500000e-02 2.135292e+01
+8.000000e-02 2.180671e+01
+8.500000e-02 2.224485e+01
+9.000000e-02 2.267157e+01
+9.500000e-02 2.309060e+01
+1.000000e-01 2.350509e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.010428,0.037025) (0.009042,0.026075) (0.014896,0.011958) (0.008232,0.044902) (0.000362,0.009336) (0.001069,0.037638) (0.000838,0.026316) (0.006932,0.016352) (0.006944,0.004986) (0.019538,0.044166) (0.019948,0.031309) (0.019358,0.021340) (0.016707,0.004397) (0.035428,0.037025) (0.034042,0.026075) (0.039896,0.011958) (0.033232,0.044902) (0.025362,0.009336) (0.026069,0.037638) (0.025838,0.026316) (0.031932,0.016352) (0.031944,0.004986) (0.044538,0.044166) (0.044948,0.031309) (0.044358,0.021340) (0.041707,0.004397) (0.050362,0.009336) (0.051069,0.037638) (0.050838,0.026316)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fd7d1fe115d0f96f147cd52f36b068f81743f499
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.291373e+01 -6.489622e-05 -4.298485e-03
+1.000000e-02 2.228940e+01 -1.126876e-04 -8.722620e-03
+1.500000e-02 2.796170e+01 -1.424078e-04 -1.329242e-02
+2.000000e-02 3.235227e+01 -1.656179e-04 -1.788633e-02
+2.500000e-02 3.616505e+01 -1.857557e-04 -2.246728e-02
+3.000000e-02 3.958829e+01 -2.037965e-04 -2.702513e-02
+3.500000e-02 4.270959e+01 -2.202176e-04 -3.155543e-02
+4.000000e-02 4.558624e+01 -2.353376e-04 -3.605546e-02
+4.500000e-02 4.826177e+01 -2.493988e-04 -4.052334e-02
+5.000000e-02 5.077137e+01 -2.625964e-04 -4.495765e-02
+5.500000e-02 5.314460e+01 -2.750933e-04 -4.935729e-02
+6.000000e-02 5.540600e+01 -2.870239e-04 -5.372144e-02
+6.500000e-02 5.757593e+01 -2.984995e-04 -5.804951e-02
+7.000000e-02 5.967132e+01 -3.096119e-04 -6.234112e-02
+7.500000e-02 6.170691e+01 -3.204405e-04 -6.659598e-02
+8.000000e-02 6.369464e+01 -3.310496e-04 -7.081397e-02
+8.500000e-02 6.564426e+01 -3.414915e-04 -7.499507e-02
+9.000000e-02 6.756450e+01 -3.518124e-04 -7.913933e-02
+9.500000e-02 6.946260e+01 -3.620506e-04 -8.324685e-02
+1.000000e-01 7.134464e+01 -3.722375e-04 -8.731783e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.010428,0.037025) (0.009042,0.026075) (0.014896,0.011958) (0.008232,0.044902) (0.000362,0.009336) (0.001069,0.037638) (0.000838,0.026316) (0.006932,0.016352) (0.006944,0.004986) (0.019538,0.044166) (0.019948,0.031309) (0.019358,0.021340) (0.016707,0.004397) (0.035428,0.037025) (0.034042,0.026075) (0.039896,0.011958) (0.033232,0.044902) (0.025362,0.009336) (0.026069,0.037638) (0.025838,0.026316) (0.031932,0.016352) (0.031944,0.004986) (0.044538,0.044166) (0.044948,0.031309) (0.044358,0.021340) (0.041707,0.004397) (0.050362,0.009336) (0.051069,0.037638) (0.050838,0.026316)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c1acec8419f49ad2f31f5077f1edbe7b04e804ba
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.014774e+02 -1.953163e-03 -2.094348e-03
+1.000000e-02 8.017991e+02 -3.892178e-03 -4.173975e-03
+1.500000e-02 1.200863e+03 -5.820383e-03 -6.243336e-03
+2.000000e-02 1.598305e+03 -7.747297e-03 -8.319303e-03
+2.500000e-02 1.994129e+03 -9.671595e-03 -1.040598e-02
+3.000000e-02 2.388696e+03 -1.158558e-02 -1.248942e-02
+3.500000e-02 2.782171e+03 -1.348609e-02 -1.456214e-02
+4.000000e-02 3.174594e+03 -1.537286e-02 -1.662289e-02
+4.500000e-02 3.565977e+03 -1.724598e-02 -1.867147e-02
+5.000000e-02 3.956330e+03 -1.910555e-02 -2.070768e-02
+5.500000e-02 4.345669e+03 -2.095157e-02 -2.273151e-02
+6.000000e-02 4.733985e+03 -2.278480e-02 -2.474377e-02
+6.500000e-02 5.121303e+03 -2.460474e-02 -2.674365e-02
+7.000000e-02 5.507631e+03 -2.641155e-02 -2.873124e-02
+7.500000e-02 5.892959e+03 -2.820601e-02 -3.070731e-02
+8.000000e-02 6.277318e+03 -2.998754e-02 -3.267149e-02
+8.500000e-02 6.660700e+03 -3.175669e-02 -3.462397e-02
+9.000000e-02 7.043116e+03 -3.351338e-02 -3.656433e-02
+9.500000e-02 7.424574e+03 -3.525792e-02 -3.849336e-02
+1.000000e-01 7.805079e+03 -3.699029e-02 -4.041051e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.000139,0.022764) (0.001708,0.011180) (0.008003,0.041964) (0.013614,0.015203) (0.016474,0.023518) (0.009707,0.031415) (0.001980,0.035197) (0.018088,0.004922) (0.016419,0.041070) (0.000132,0.045229) (0.008279,0.023789) (0.009709,0.004380) (0.017187,0.033369) (0.025139,0.022764) (0.026708,0.011180) (0.033003,0.041964) (0.038614,0.015203) (0.041474,0.023518) (0.034707,0.031415) (0.026980,0.035197) (0.043088,0.004922) (0.041419,0.041070) (0.025132,0.045229) (0.033279,0.023789) (0.034709,0.004380) (0.042187,0.033369) (0.050139,0.022764) (0.051708,0.011180) (0.051980,0.035197) (0.050132,0.045229)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b35cdf8520c27f67ae7e65147c1717c29bf0899b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.079851e+00
+1.000000e-02 9.665195e+00
+1.500000e-02 1.182190e+01
+2.000000e-02 1.336133e+01
+2.500000e-02 1.461795e+01
+3.000000e-02 1.569631e+01
+3.500000e-02 1.664304e+01
+4.000000e-02 1.748697e+01
+4.500000e-02 1.824910e+01
+5.000000e-02 1.894572e+01
+5.500000e-02 1.958992e+01
+6.000000e-02 2.019240e+01
+6.500000e-02 2.076200e+01
+7.000000e-02 2.130608e+01
+7.500000e-02 2.183078e+01
+8.000000e-02 2.234120e+01
+8.500000e-02 2.284163e+01
+9.000000e-02 2.333576e+01
+9.500000e-02 2.382662e+01
+1.000000e-01 2.431676e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.000139,0.022764) (0.001708,0.011180) (0.008003,0.041964) (0.013614,0.015203) (0.016474,0.023518) (0.009707,0.031415) (0.001980,0.035197) (0.018088,0.004922) (0.016419,0.041070) (0.000132,0.045229) (0.008279,0.023789) (0.009709,0.004380) (0.017187,0.033369) (0.025139,0.022764) (0.026708,0.011180) (0.033003,0.041964) (0.038614,0.015203) (0.041474,0.023518) (0.034707,0.031415) (0.026980,0.035197) (0.043088,0.004922) (0.041419,0.041070) (0.025132,0.045229) (0.033279,0.023789) (0.034709,0.004380) (0.042187,0.033369) (0.050139,0.022764) (0.051708,0.011180) (0.051980,0.035197) (0.050132,0.045229)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..da03b276582d9ee089544b08d78b81bbb6ad181c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4002_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.644425e+01 -8.028314e-05 -4.200771e-03
+1.000000e-02 2.710325e+01 -1.340848e-04 -8.585274e-03
+1.500000e-02 3.447870e+01 -1.717695e-04 -1.309551e-02
+2.000000e-02 4.040869e+01 -2.023119e-04 -1.763457e-02
+2.500000e-02 4.561924e+01 -2.292553e-04 -2.216469e-02
+3.000000e-02 5.035186e+01 -2.537986e-04 -2.667410e-02
+3.500000e-02 5.472925e+01 -2.765620e-04 -3.115735e-02
+4.000000e-02 5.883120e+01 -2.979546e-04 -3.561115e-02
+4.500000e-02 6.271620e+01 -3.182780e-04 -4.003321e-02
+5.000000e-02 6.642907e+01 -3.377647e-04 -4.442187e-02
+5.500000e-02 7.000446e+01 -3.565951e-04 -4.877593e-02
+6.000000e-02 7.346948e+01 -3.749115e-04 -5.309454e-02
+6.500000e-02 7.684592e+01 -3.928282e-04 -5.737710e-02
+7.000000e-02 8.015069e+01 -4.104342e-04 -6.162324e-02
+7.500000e-02 8.339608e+01 -4.277939e-04 -6.583283e-02
+8.000000e-02 8.659168e+01 -4.449575e-04 -7.000586e-02
+8.500000e-02 8.974472e+01 -4.619625e-04 -7.414243e-02
+9.000000e-02 9.286062e+01 -4.788366e-04 -7.824275e-02
+9.500000e-02 9.594267e+01 -4.955958e-04 -8.230713e-02
+1.000000e-01 9.899275e+01 -5.122487e-04 -8.633593e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.000139,0.022764) (0.001708,0.011180) (0.008003,0.041964) (0.013614,0.015203) (0.016474,0.023518) (0.009707,0.031415) (0.001980,0.035197) (0.018088,0.004922) (0.016419,0.041070) (0.000132,0.045229) (0.008279,0.023789) (0.009709,0.004380) (0.017187,0.033369) (0.025139,0.022764) (0.026708,0.011180) (0.033003,0.041964) (0.038614,0.015203) (0.041474,0.023518) (0.034707,0.031415) (0.026980,0.035197) (0.043088,0.004922) (0.041419,0.041070) (0.025132,0.045229) (0.033279,0.023789) (0.034709,0.004380) (0.042187,0.033369) (0.050139,0.022764) (0.051708,0.011180) (0.051980,0.035197) (0.050132,0.045229)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c5181c2bc16170b82bc31d97f787b612a9db2f41
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.932563e+02 -1.950923e-03 -1.926856e-03
+1.000000e-02 9.849280e+02 -3.888126e-03 -3.840107e-03
+1.500000e-02 1.474935e+03 -5.815414e-03 -5.742930e-03
+2.000000e-02 1.962984e+03 -7.745688e-03 -7.645966e-03
+2.500000e-02 2.449097e+03 -9.679496e-03 -9.549734e-03
+3.000000e-02 2.933587e+03 -1.160686e-02 -1.144589e-02
+3.500000e-02 3.416587e+03 -1.352314e-02 -1.333043e-02
+4.000000e-02 3.898136e+03 -1.542742e-02 -1.520256e-02
+4.500000e-02 4.378252e+03 -1.731961e-02 -1.706224e-02
+5.000000e-02 4.856947e+03 -1.919976e-02 -1.890953e-02
+5.500000e-02 5.334234e+03 -2.106793e-02 -2.074454e-02
+6.000000e-02 5.810124e+03 -2.292421e-02 -2.256740e-02
+6.500000e-02 6.284628e+03 -2.476869e-02 -2.437819e-02
+7.000000e-02 6.757758e+03 -2.660146e-02 -2.617705e-02
+7.500000e-02 7.229520e+03 -2.842272e-02 -2.796417e-02
+8.000000e-02 7.699936e+03 -3.023223e-02 -2.973936e-02
+8.500000e-02 8.169002e+03 -3.203051e-02 -3.150314e-02
+9.000000e-02 8.636741e+03 -3.381726e-02 -3.325525e-02
+9.500000e-02 9.103148e+03 -3.559293e-02 -3.499613e-02
+1.000000e-01 9.568251e+03 -3.735757e-02 -3.672577e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.005277,0.042606) (0.001256,0.020887) (0.017159,0.004325) (0.002651,0.028513) (0.000811,0.036305) (0.015835,0.045770) (0.017190,0.037836) (0.019240,0.029396) (0.008243,0.014860) (0.016994,0.020503) (0.015860,0.012544) (0.009198,0.022729) (0.009017,0.033623) (0.000560,0.012693) (0.000260,0.004443) (0.008587,0.007096) (0.030277,0.042606) (0.026256,0.020887) (0.042159,0.004325) (0.027651,0.028513) (0.025811,0.036305) (0.040835,0.045770) (0.042190,0.037836) (0.044240,0.029396) (0.033243,0.014860) (0.041994,0.020503) (0.040860,0.012544) (0.034198,0.022729) (0.034017,0.033623) (0.025560,0.012693) (0.025260,0.004443) (0.033587,0.007096) (0.051256,0.020887) (0.052651,0.028513) (0.050811,0.036305) (0.050560,0.012693) (0.050260,0.004443)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e4373dfc0e1dabf8cdd2030b0dcb1d9e8bbcdca2
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.153989e+00
+1.000000e-02 1.079898e+01
+1.500000e-02 1.297697e+01
+2.000000e-02 1.459664e+01
+2.500000e-02 1.592530e+01
+3.000000e-02 1.705328e+01
+3.500000e-02 1.802953e+01
+4.000000e-02 1.889075e+01
+4.500000e-02 1.966421e+01
+5.000000e-02 2.036834e+01
+5.500000e-02 2.102060e+01
+6.000000e-02 2.163409e+01
+6.500000e-02 2.221920e+01
+7.000000e-02 2.278427e+01
+7.500000e-02 2.333601e+01
+8.000000e-02 2.387981e+01
+8.500000e-02 2.442004e+01
+9.000000e-02 2.496026e+01
+9.500000e-02 2.550340e+01
+1.000000e-01 2.605684e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.005277,0.042606) (0.001256,0.020887) (0.017159,0.004325) (0.002651,0.028513) (0.000811,0.036305) (0.015835,0.045770) (0.017190,0.037836) (0.019240,0.029396) (0.008243,0.014860) (0.016994,0.020503) (0.015860,0.012544) (0.009198,0.022729) (0.009017,0.033623) (0.000560,0.012693) (0.000260,0.004443) (0.008587,0.007096) (0.030277,0.042606) (0.026256,0.020887) (0.042159,0.004325) (0.027651,0.028513) (0.025811,0.036305) (0.040835,0.045770) (0.042190,0.037836) (0.044240,0.029396) (0.033243,0.014860) (0.041994,0.020503) (0.040860,0.012544) (0.034198,0.022729) (0.034017,0.033623) (0.025560,0.012693) (0.025260,0.004443) (0.033587,0.007096) (0.051256,0.020887) (0.052651,0.028513) (0.050811,0.036305) (0.050560,0.012693) (0.050260,0.004443)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f48f644d1105eb23d80b03b193215863c10c8fb3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.394799e+01 -9.513810e-05 -3.874140e-03
+1.000000e-02 3.847192e+01 -1.548803e-04 -8.087976e-03
+1.500000e-02 4.960229e+01 -2.015763e-04 -1.241402e-02
+2.000000e-02 5.904485e+01 -2.416953e-04 -1.677420e-02
+2.500000e-02 6.750549e+01 -2.779564e-04 -2.113653e-02
+3.000000e-02 7.527448e+01 -3.115113e-04 -2.548809e-02
+3.500000e-02 8.254083e+01 -3.431105e-04 -2.982164e-02
+4.000000e-02 8.938068e+01 -3.730871e-04 -3.413206e-02
+4.500000e-02 9.588924e+01 -4.018142e-04 -3.841638e-02
+5.000000e-02 1.021183e+02 -4.294983e-04 -4.267266e-02
+5.500000e-02 1.081017e+02 -4.562708e-04 -4.689983e-02
+6.000000e-02 1.138616e+02 -4.822128e-04 -5.109740e-02
+6.500000e-02 1.193924e+02 -5.072994e-04 -5.526493e-02
+7.000000e-02 1.247453e+02 -5.317096e-04 -5.940304e-02
+7.500000e-02 1.299088e+02 -5.553942e-04 -6.351166e-02
+8.000000e-02 1.348908e+02 -5.783742e-04 -6.759106e-02
+8.500000e-02 1.396998e+02 -6.006734e-04 -7.164151e-02
+9.000000e-02 1.443455e+02 -6.223214e-04 -7.566324e-02
+9.500000e-02 1.488384e+02 -6.433537e-04 -7.965648e-02
+1.000000e-01 1.531899e+02 -6.638087e-04 -8.362137e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.005277,0.042606) (0.001256,0.020887) (0.017159,0.004325) (0.002651,0.028513) (0.000811,0.036305) (0.015835,0.045770) (0.017190,0.037836) (0.019240,0.029396) (0.008243,0.014860) (0.016994,0.020503) (0.015860,0.012544) (0.009198,0.022729) (0.009017,0.033623) (0.000560,0.012693) (0.000260,0.004443) (0.008587,0.007096) (0.030277,0.042606) (0.026256,0.020887) (0.042159,0.004325) (0.027651,0.028513) (0.025811,0.036305) (0.040835,0.045770) (0.042190,0.037836) (0.044240,0.029396) (0.033243,0.014860) (0.041994,0.020503) (0.040860,0.012544) (0.034198,0.022729) (0.034017,0.033623) (0.025560,0.012693) (0.025260,0.004443) (0.033587,0.007096) (0.051256,0.020887) (0.052651,0.028513) (0.050811,0.036305) (0.050560,0.012693) (0.050260,0.004443)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f6aa63ca141bede10b5b46a686450bd6baa8636c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.931915e+02 -1.936150e-03 -1.942767e-03
+1.000000e-02 9.847998e+02 -3.858713e-03 -3.871773e-03
+1.500000e-02 1.474745e+03 -5.771096e-03 -5.790449e-03
+2.000000e-02 1.962735e+03 -7.685219e-03 -7.710143e-03
+2.500000e-02 2.448788e+03 -9.602137e-03 -9.631065e-03
+3.000000e-02 2.933218e+03 -1.151257e-02 -1.154436e-02
+3.500000e-02 3.416159e+03 -1.341204e-02 -1.344588e-02
+4.000000e-02 3.897649e+03 -1.529964e-02 -1.533485e-02
+4.500000e-02 4.377706e+03 -1.717527e-02 -1.721121e-02
+5.000000e-02 4.856343e+03 -1.903900e-02 -1.907503e-02
+5.500000e-02 5.333572e+03 -2.089089e-02 -2.092641e-02
+6.000000e-02 5.809403e+03 -2.273104e-02 -2.276546e-02
+6.500000e-02 6.283850e+03 -2.455953e-02 -2.459228e-02
+7.000000e-02 6.756915e+03 -2.637664e-02 -2.640719e-02
+7.500000e-02 7.228629e+03 -2.818194e-02 -2.820970e-02
+8.000000e-02 7.698982e+03 -2.997644e-02 -3.000084e-02
+8.500000e-02 8.167990e+03 -3.175908e-02 -3.177975e-02
+9.000000e-02 8.635674e+03 -3.353055e-02 -3.354691e-02
+9.500000e-02 9.102027e+03 -3.529125e-02 -3.530281e-02
+1.000000e-01 9.567064e+03 -3.704081e-02 -3.704719e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008825,0.040249) (0.000073,0.037920) (0.009689,0.012389) (0.008355,0.004393) (0.009133,0.031769) (0.002058,0.013430) (0.015490,0.007310) (0.002715,0.045457) (0.000405,0.005800) (0.001544,0.030016) (0.019925,0.045771) (0.009193,0.021329) (0.017159,0.025651) (0.000723,0.021149) (0.016596,0.034398) (0.016515,0.017520) (0.033825,0.040249) (0.025073,0.037920) (0.034689,0.012389) (0.033355,0.004393) (0.034133,0.031769) (0.027058,0.013430) (0.040490,0.007310) (0.027715,0.045457) (0.025405,0.005800) (0.026544,0.030016) (0.044925,0.045771) (0.034193,0.021329) (0.042159,0.025651) (0.025723,0.021149) (0.041596,0.034398) (0.041515,0.017520) (0.050073,0.037920) (0.052058,0.013430) (0.052715,0.045457) (0.050405,0.005800) (0.051544,0.030016) (0.050723,0.021149)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ac6e2c2cbcffddc76492b547b40e9cf6994348c0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.305787e+00
+1.000000e-02 1.101705e+01
+1.500000e-02 1.323322e+01
+2.000000e-02 1.489636e+01
+2.500000e-02 1.626730e+01
+3.000000e-02 1.743437e+01
+3.500000e-02 1.844716e+01
+4.000000e-02 1.934052e+01
+4.500000e-02 2.013447e+01
+5.000000e-02 2.086114e+01
+5.500000e-02 2.154009e+01
+6.000000e-02 2.216987e+01
+6.500000e-02 2.276848e+01
+7.000000e-02 2.334527e+01
+7.500000e-02 2.390787e+01
+8.000000e-02 2.446245e+01
+8.500000e-02 2.501405e+01
+9.000000e-02 2.556665e+01
+9.500000e-02 2.612346e+01
+1.000000e-01 2.668698e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008825,0.040249) (0.000073,0.037920) (0.009689,0.012389) (0.008355,0.004393) (0.009133,0.031769) (0.002058,0.013430) (0.015490,0.007310) (0.002715,0.045457) (0.000405,0.005800) (0.001544,0.030016) (0.019925,0.045771) (0.009193,0.021329) (0.017159,0.025651) (0.000723,0.021149) (0.016596,0.034398) (0.016515,0.017520) (0.033825,0.040249) (0.025073,0.037920) (0.034689,0.012389) (0.033355,0.004393) (0.034133,0.031769) (0.027058,0.013430) (0.040490,0.007310) (0.027715,0.045457) (0.025405,0.005800) (0.026544,0.030016) (0.044925,0.045771) (0.034193,0.021329) (0.042159,0.025651) (0.025723,0.021149) (0.041596,0.034398) (0.041515,0.017520) (0.050073,0.037920) (0.052058,0.013430) (0.052715,0.045457) (0.050405,0.005800) (0.051544,0.030016) (0.050723,0.021149)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..263f5a39783a6d958843d2da9704fc791ecda3ee
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.331101e+01 -9.186792e-05 -3.935303e-03
+1.000000e-02 3.753651e+01 -1.496208e-04 -8.193560e-03
+1.500000e-02 4.817148e+01 -1.937928e-04 -1.256238e-02
+2.000000e-02 5.710636e+01 -2.313884e-04 -1.696164e-02
+2.500000e-02 6.503211e+01 -2.650263e-04 -2.136202e-02
+3.000000e-02 7.223999e+01 -2.958521e-04 -2.575095e-02
+3.500000e-02 7.890693e+01 -3.245760e-04 -3.012087e-02
+4.000000e-02 8.516225e+01 -3.517242e-04 -3.446712e-02
+4.500000e-02 9.106168e+01 -3.775227e-04 -3.878603e-02
+5.000000e-02 9.667383e+01 -4.022488e-04 -4.307579e-02
+5.500000e-02 1.020361e+02 -4.260521e-04 -4.733520e-02
+6.000000e-02 1.071722e+02 -4.490232e-04 -5.156373e-02
+6.500000e-02 1.120949e+02 -4.712074e-04 -5.576134e-02
+7.000000e-02 1.168107e+02 -4.926195e-04 -5.992835e-02
+7.500000e-02 1.213206e+02 -5.132518e-04 -6.406533e-02
+8.000000e-02 1.256013e+02 -5.328932e-04 -6.817257e-02
+8.500000e-02 1.296796e+02 -5.518144e-04 -7.225212e-02
+9.000000e-02 1.335536e+02 -5.699261e-04 -7.630338e-02
+9.500000e-02 1.372339e+02 -5.872200e-04 -8.032609e-02
+1.000000e-01 1.407177e+02 -6.036995e-04 -8.432104e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008825,0.040249) (0.000073,0.037920) (0.009689,0.012389) (0.008355,0.004393) (0.009133,0.031769) (0.002058,0.013430) (0.015490,0.007310) (0.002715,0.045457) (0.000405,0.005800) (0.001544,0.030016) (0.019925,0.045771) (0.009193,0.021329) (0.017159,0.025651) (0.000723,0.021149) (0.016596,0.034398) (0.016515,0.017520) (0.033825,0.040249) (0.025073,0.037920) (0.034689,0.012389) (0.033355,0.004393) (0.034133,0.031769) (0.027058,0.013430) (0.040490,0.007310) (0.027715,0.045457) (0.025405,0.005800) (0.026544,0.030016) (0.044925,0.045771) (0.034193,0.021329) (0.042159,0.025651) (0.025723,0.021149) (0.041596,0.034398) (0.041515,0.017520) (0.050073,0.037920) (0.052058,0.013430) (0.052715,0.045457) (0.050405,0.005800) (0.051544,0.030016) (0.050723,0.021149)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bdd0482d6abbfe1c99fbda571fc212add8065421
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.932157e+02 -1.943250e-03 -1.937145e-03
+1.000000e-02 9.848498e+02 -3.872848e-03 -3.860576e-03
+1.500000e-02 1.474822e+03 -5.792353e-03 -5.773575e-03
+2.000000e-02 1.962840e+03 -7.714132e-03 -7.687042e-03
+2.500000e-02 2.448922e+03 -9.639078e-03 -9.601287e-03
+3.000000e-02 2.933382e+03 -1.155755e-02 -1.150781e-02
+3.500000e-02 3.416354e+03 -1.346495e-02 -1.340259e-02
+4.000000e-02 3.897878e+03 -1.536038e-02 -1.528487e-02
+4.500000e-02 4.377968e+03 -1.724374e-02 -1.715460e-02
+5.000000e-02 4.856640e+03 -1.911509e-02 -1.901186e-02
+5.500000e-02 5.333904e+03 -2.097449e-02 -2.085676e-02
+6.000000e-02 5.809773e+03 -2.282203e-02 -2.268942e-02
+6.500000e-02 6.284257e+03 -2.465780e-02 -2.450994e-02
+7.000000e-02 6.757361e+03 -2.648210e-02 -2.631865e-02
+7.500000e-02 7.229114e+03 -2.829440e-02 -2.811503e-02
+8.000000e-02 7.699506e+03 -3.009555e-02 -2.989996e-02
+8.500000e-02 8.168562e+03 -3.188503e-02 -3.167295e-02
+9.000000e-02 8.636279e+03 -3.366343e-02 -3.343459e-02
+9.500000e-02 9.102679e+03 -3.543083e-02 -3.518490e-02
+1.000000e-01 9.567757e+03 -3.718655e-02 -3.692350e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016147,0.023992) (0.009057,0.045210) (0.002333,0.012636) (0.018838,0.013611) (0.009418,0.018847) (0.000045,0.020257) (0.015495,0.040800) (0.008997,0.036256) (0.000181,0.004873) (0.017247,0.005758) (0.000058,0.028641) (0.017065,0.032726) (0.000399,0.037607) (0.008562,0.008083) (0.008521,0.027937) (0.000999,0.045356) (0.041147,0.023992) (0.034057,0.045210) (0.027333,0.012636) (0.043838,0.013611) (0.034418,0.018847) (0.025045,0.020257) (0.040495,0.040800) (0.033997,0.036256) (0.025181,0.004873) (0.042247,0.005758) (0.025058,0.028641) (0.042065,0.032726) (0.025399,0.037607) (0.033562,0.008083) (0.033521,0.027937) (0.025999,0.045356) (0.052333,0.012636) (0.050045,0.020257) (0.050181,0.004873) (0.050058,0.028641) (0.050399,0.037607) (0.050999,0.045356)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..19738c8a047fb33974e2951f2f7bd9ad68f6b87b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.206567e+00
+1.000000e-02 1.092154e+01
+1.500000e-02 1.311727e+01
+2.000000e-02 1.476879e+01
+2.500000e-02 1.612692e+01
+3.000000e-02 1.728073e+01
+3.500000e-02 1.827976e+01
+4.000000e-02 1.915918e+01
+4.500000e-02 1.994610e+01
+5.000000e-02 2.066186e+01
+5.500000e-02 2.132348e+01
+6.000000e-02 2.194455e+01
+6.500000e-02 2.253596e+01
+7.000000e-02 2.310646e+01
+7.500000e-02 2.366306e+01
+8.000000e-02 2.421145e+01
+8.500000e-02 2.475620e+01
+9.000000e-02 2.530100e+01
+9.500000e-02 2.584883e+01
+1.000000e-01 2.640214e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016147,0.023992) (0.009057,0.045210) (0.002333,0.012636) (0.018838,0.013611) (0.009418,0.018847) (0.000045,0.020257) (0.015495,0.040800) (0.008997,0.036256) (0.000181,0.004873) (0.017247,0.005758) (0.000058,0.028641) (0.017065,0.032726) (0.000399,0.037607) (0.008562,0.008083) (0.008521,0.027937) (0.000999,0.045356) (0.041147,0.023992) (0.034057,0.045210) (0.027333,0.012636) (0.043838,0.013611) (0.034418,0.018847) (0.025045,0.020257) (0.040495,0.040800) (0.033997,0.036256) (0.025181,0.004873) (0.042247,0.005758) (0.025058,0.028641) (0.042065,0.032726) (0.025399,0.037607) (0.033562,0.008083) (0.033521,0.027937) (0.025999,0.045356) (0.052333,0.012636) (0.050045,0.020257) (0.050181,0.004873) (0.050058,0.028641) (0.050399,0.037607) (0.050999,0.045356)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..020a9ae1f4222f643de4d4cfde0648c5d5e80628
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.195257e+01 -8.681223e-05 -3.981159e-03
+1.000000e-02 3.540662e+01 -1.414975e-04 -8.270221e-03
+1.500000e-02 4.531273e+01 -1.827267e-04 -1.266674e-02
+2.000000e-02 5.369272e+01 -2.180101e-04 -1.708647e-02
+2.500000e-02 6.119983e+01 -2.498499e-04 -2.150161e-02
+3.000000e-02 6.810688e+01 -2.793459e-04 -2.589986e-02
+3.500000e-02 7.458139e+01 -3.071860e-04 -3.027378e-02
+4.000000e-02 8.074072e+01 -3.338557e-04 -3.461829e-02
+4.500000e-02 8.667011e+01 -3.597092e-04 -3.892980e-02
+5.000000e-02 9.243368e+01 -3.850137e-04 -4.320568e-02
+5.500000e-02 9.807881e+01 -4.099666e-04 -4.744411e-02
+6.000000e-02 1.036407e+02 -4.347139e-04 -5.164379e-02
+6.500000e-02 1.091195e+02 -4.593038e-04 -5.580360e-02
+7.000000e-02 1.145800e+02 -4.839116e-04 -5.992352e-02
+7.500000e-02 1.200076e+02 -5.085205e-04 -6.400309e-02
+8.000000e-02 1.254045e+02 -5.331366e-04 -6.804228e-02
+8.500000e-02 1.307655e+02 -5.577342e-04 -7.204128e-02
+9.000000e-02 1.360747e+02 -5.822432e-04 -7.600057e-02
+9.500000e-02 1.413204e+02 -6.066039e-04 -7.992014e-02
+1.000000e-01 1.464700e+02 -6.306684e-04 -8.380065e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016147,0.023992) (0.009057,0.045210) (0.002333,0.012636) (0.018838,0.013611) (0.009418,0.018847) (0.000045,0.020257) (0.015495,0.040800) (0.008997,0.036256) (0.000181,0.004873) (0.017247,0.005758) (0.000058,0.028641) (0.017065,0.032726) (0.000399,0.037607) (0.008562,0.008083) (0.008521,0.027937) (0.000999,0.045356) (0.041147,0.023992) (0.034057,0.045210) (0.027333,0.012636) (0.043838,0.013611) (0.034418,0.018847) (0.025045,0.020257) (0.040495,0.040800) (0.033997,0.036256) (0.025181,0.004873) (0.042247,0.005758) (0.025058,0.028641) (0.042065,0.032726) (0.025399,0.037607) (0.033562,0.008083) (0.033521,0.027937) (0.025999,0.045356) (0.052333,0.012636) (0.050045,0.020257) (0.050181,0.004873) (0.050058,0.028641) (0.050399,0.037607) (0.050999,0.045356)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..40fe0f736f859dcb6da85b792f734141061f1be7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.932380e+02 -1.915528e-03 -1.962663e-03
+1.000000e-02 9.848919e+02 -3.817528e-03 -3.911518e-03
+1.500000e-02 1.474882e+03 -5.709236e-03 -5.850281e-03
+2.000000e-02 1.962914e+03 -7.601287e-03 -7.791793e-03
+2.500000e-02 2.449011e+03 -9.493717e-03 -9.737101e-03
+3.000000e-02 2.933479e+03 -1.137847e-02 -1.167645e-02
+3.500000e-02 3.416463e+03 -1.325136e-02 -1.360447e-02
+4.000000e-02 3.897997e+03 -1.511191e-02 -1.552041e-02
+4.500000e-02 4.378097e+03 -1.696008e-02 -1.742414e-02
+5.000000e-02 4.856777e+03 -1.879600e-02 -1.931576e-02
+5.500000e-02 5.334048e+03 -2.061967e-02 -2.119520e-02
+6.000000e-02 5.809929e+03 -2.243111e-02 -2.306243e-02
+6.500000e-02 6.284412e+03 -2.423101e-02 -2.491826e-02
+7.000000e-02 6.757532e+03 -2.601866e-02 -2.676177e-02
+7.500000e-02 7.229281e+03 -2.779513e-02 -2.859426e-02
+8.000000e-02 7.699673e+03 -2.955947e-02 -3.041438e-02
+8.500000e-02 8.168727e+03 -3.131245e-02 -3.222320e-02
+9.000000e-02 8.636448e+03 -3.305406e-02 -3.402061e-02
+9.500000e-02 9.102851e+03 -3.478444e-02 -3.580680e-02
+1.000000e-01 9.567936e+03 -3.650371e-02 -3.758182e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.017220,0.004626) (0.007246,0.027188) (0.000273,0.030596) (0.016595,0.013249) (0.008903,0.014557) (0.019425,0.037079) (0.000728,0.012955) (0.000704,0.042996) (0.008602,0.045631) (0.017021,0.045727) (0.015638,0.029013) (0.001031,0.021652) (0.000243,0.004592) (0.011334,0.036334) (0.017008,0.021185) (0.008903,0.004252) (0.042220,0.004626) (0.032246,0.027188) (0.025273,0.030596) (0.041595,0.013249) (0.033903,0.014557) (0.044425,0.037079) (0.025728,0.012955) (0.025704,0.042996) (0.033602,0.045631) (0.042021,0.045727) (0.040638,0.029013) (0.026031,0.021652) (0.025243,0.004592) (0.036334,0.036334) (0.042008,0.021185) (0.033903,0.004252) (0.050273,0.030596) (0.050728,0.012955) (0.050704,0.042996) (0.051031,0.021652) (0.050243,0.004592)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b85b06f9b99b26073f7bb33629932b1066703e97
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.484650e+00
+1.000000e-02 1.103983e+01
+1.500000e-02 1.326035e+01
+2.000000e-02 1.491356e+01
+2.500000e-02 1.627338e+01
+3.000000e-02 1.743041e+01
+3.500000e-02 1.843603e+01
+4.000000e-02 1.933311e+01
+4.500000e-02 2.012881e+01
+5.000000e-02 2.086414e+01
+5.500000e-02 2.154876e+01
+6.000000e-02 2.219555e+01
+6.500000e-02 2.281484e+01
+7.000000e-02 2.341502e+01
+7.500000e-02 2.400295e+01
+8.000000e-02 2.458422e+01
+8.500000e-02 2.516341e+01
+9.000000e-02 2.574424e+01
+9.500000e-02 2.632973e+01
+1.000000e-01 2.692236e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.017220,0.004626) (0.007246,0.027188) (0.000273,0.030596) (0.016595,0.013249) (0.008903,0.014557) (0.019425,0.037079) (0.000728,0.012955) (0.000704,0.042996) (0.008602,0.045631) (0.017021,0.045727) (0.015638,0.029013) (0.001031,0.021652) (0.000243,0.004592) (0.011334,0.036334) (0.017008,0.021185) (0.008903,0.004252) (0.042220,0.004626) (0.032246,0.027188) (0.025273,0.030596) (0.041595,0.013249) (0.033903,0.014557) (0.044425,0.037079) (0.025728,0.012955) (0.025704,0.042996) (0.033602,0.045631) (0.042021,0.045727) (0.040638,0.029013) (0.026031,0.021652) (0.025243,0.004592) (0.036334,0.036334) (0.042008,0.021185) (0.033903,0.004252) (0.050273,0.030596) (0.050728,0.012955) (0.050704,0.042996) (0.051031,0.021652) (0.050243,0.004592)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..124a14aca944d33666d10ecb73f5f20bf01f8fb3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.487607e+01 -9.706117e-05 -3.908402e-03
+1.000000e-02 3.951477e+01 -1.563359e-04 -8.158611e-03
+1.500000e-02 5.081009e+01 -2.026641e-04 -1.251860e-02
+2.000000e-02 6.032731e+01 -2.421627e-04 -1.691207e-02
+2.500000e-02 6.879934e+01 -2.776052e-04 -2.130787e-02
+3.000000e-02 7.654895e+01 -3.102429e-04 -2.569259e-02
+3.500000e-02 8.376879e+01 -3.408392e-04 -3.005837e-02
+4.000000e-02 9.058859e+01 -3.699154e-04 -3.440005e-02
+4.500000e-02 9.709869e+01 -3.978373e-04 -3.871414e-02
+5.000000e-02 1.033610e+02 -4.248570e-04 -4.299836e-02
+5.500000e-02 1.094192e+02 -4.511519e-04 -4.725126e-02
+6.000000e-02 1.153014e+02 -4.768347e-04 -5.147207e-02
+6.500000e-02 1.210246e+02 -5.019714e-04 -5.566050e-02
+7.000000e-02 1.265958e+02 -5.265846e-04 -5.981674e-02
+7.500000e-02 1.320151e+02 -5.506639e-04 -6.394126e-02
+8.000000e-02 1.372539e+02 -5.741059e-04 -6.803421e-02
+8.500000e-02 1.423470e+02 -5.969898e-04 -7.209727e-02
+9.000000e-02 1.472571e+02 -6.191685e-04 -7.613099e-02
+9.500000e-02 1.519663e+02 -6.405458e-04 -8.013631e-02
+1.000000e-01 1.564551e+02 -6.610192e-04 -8.411386e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.017220,0.004626) (0.007246,0.027188) (0.000273,0.030596) (0.016595,0.013249) (0.008903,0.014557) (0.019425,0.037079) (0.000728,0.012955) (0.000704,0.042996) (0.008602,0.045631) (0.017021,0.045727) (0.015638,0.029013) (0.001031,0.021652) (0.000243,0.004592) (0.011334,0.036334) (0.017008,0.021185) (0.008903,0.004252) (0.042220,0.004626) (0.032246,0.027188) (0.025273,0.030596) (0.041595,0.013249) (0.033903,0.014557) (0.044425,0.037079) (0.025728,0.012955) (0.025704,0.042996) (0.033602,0.045631) (0.042021,0.045727) (0.040638,0.029013) (0.026031,0.021652) (0.025243,0.004592) (0.036334,0.036334) (0.042008,0.021185) (0.033903,0.004252) (0.050273,0.030596) (0.050728,0.012955) (0.050704,0.042996) (0.051031,0.021652) (0.050243,0.004592)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..86b97e11681d861a6c5c02f6926470344afd0f3a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.932385e+02 -1.891056e-03 -1.985722e-03
+1.000000e-02 9.848915e+02 -3.768607e-03 -3.957629e-03
+1.500000e-02 1.474879e+03 -5.635384e-03 -5.919996e-03
+2.000000e-02 1.962908e+03 -7.499687e-03 -7.888112e-03
+2.500000e-02 2.449000e+03 -9.360618e-03 -9.863910e-03
+3.000000e-02 2.933463e+03 -1.121186e-02 -1.183582e-02
+3.500000e-02 3.416440e+03 -1.305030e-02 -1.379738e-02
+4.000000e-02 3.897967e+03 -1.487570e-02 -1.574757e-02
+4.500000e-02 4.378060e+03 -1.668812e-02 -1.768621e-02
+5.000000e-02 4.856731e+03 -1.848772e-02 -1.961331e-02
+5.500000e-02 5.333993e+03 -2.027459e-02 -2.152870e-02
+6.000000e-02 5.809864e+03 -2.204877e-02 -2.343242e-02
+6.500000e-02 6.284336e+03 -2.381092e-02 -2.532516e-02
+7.000000e-02 6.757440e+03 -2.556065e-02 -2.720635e-02
+7.500000e-02 7.229184e+03 -2.729807e-02 -2.907585e-02
+8.000000e-02 7.699567e+03 -2.902390e-02 -3.093503e-02
+8.500000e-02 8.168609e+03 -3.073766e-02 -3.278237e-02
+9.000000e-02 8.636310e+03 -3.243972e-02 -3.461798e-02
+9.500000e-02 9.102702e+03 -3.413007e-02 -3.644305e-02
+1.000000e-01 9.567764e+03 -3.580922e-02 -3.825727e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016949,0.030328) (0.019796,0.012774) (0.017152,0.045492) (0.005359,0.037973) (0.009009,0.045541) (0.000077,0.005216) (0.008728,0.007789) (0.013336,0.037998) (0.016511,0.022270) (0.000302,0.029795) (0.016301,0.004405) (0.000753,0.020597) (0.002511,0.012817) (0.000635,0.045342) (0.008757,0.019887) (0.009225,0.031090) (0.041949,0.030328) (0.044796,0.012774) (0.042152,0.045492) (0.030359,0.037973) (0.034009,0.045541) (0.025077,0.005216) (0.033728,0.007789) (0.038336,0.037998) (0.041511,0.022270) (0.025302,0.029795) (0.041301,0.004405) (0.025753,0.020597) (0.027511,0.012817) (0.025635,0.045342) (0.033757,0.019887) (0.034225,0.031090) (0.050077,0.005216) (0.050302,0.029795) (0.050753,0.020597) (0.052511,0.012817) (0.050635,0.045342)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..64a2c7f618c63a3f3f261abab56dfda97b76714a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.648585e+00
+1.000000e-02 1.123835e+01
+1.500000e-02 1.351487e+01
+2.000000e-02 1.519694e+01
+2.500000e-02 1.658046e+01
+3.000000e-02 1.776015e+01
+3.500000e-02 1.878875e+01
+4.000000e-02 1.970314e+01
+4.500000e-02 2.053094e+01
+5.000000e-02 2.129321e+01
+5.500000e-02 2.200627e+01
+6.000000e-02 2.268277e+01
+6.500000e-02 2.333272e+01
+7.000000e-02 2.396397e+01
+7.500000e-02 2.458283e+01
+8.000000e-02 2.519435e+01
+8.500000e-02 2.580799e+01
+9.000000e-02 2.641613e+01
+9.500000e-02 2.702702e+01
+1.000000e-01 2.764296e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016949,0.030328) (0.019796,0.012774) (0.017152,0.045492) (0.005359,0.037973) (0.009009,0.045541) (0.000077,0.005216) (0.008728,0.007789) (0.013336,0.037998) (0.016511,0.022270) (0.000302,0.029795) (0.016301,0.004405) (0.000753,0.020597) (0.002511,0.012817) (0.000635,0.045342) (0.008757,0.019887) (0.009225,0.031090) (0.041949,0.030328) (0.044796,0.012774) (0.042152,0.045492) (0.030359,0.037973) (0.034009,0.045541) (0.025077,0.005216) (0.033728,0.007789) (0.038336,0.037998) (0.041511,0.022270) (0.025302,0.029795) (0.041301,0.004405) (0.025753,0.020597) (0.027511,0.012817) (0.025635,0.045342) (0.033757,0.019887) (0.034225,0.031090) (0.050077,0.005216) (0.050302,0.029795) (0.050753,0.020597) (0.052511,0.012817) (0.050635,0.045342)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b1be183064a6d657143c45cb44202c386e560345
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CHDPE_0.4926_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.262459e+01 -8.708249e-05 -4.055197e-03
+1.000000e-02 3.513101e+01 -1.370715e-04 -8.431649e-03
+1.500000e-02 4.451443e+01 -1.748166e-04 -1.290880e-02
+2.000000e-02 5.233805e+01 -2.064736e-04 -1.740937e-02
+2.500000e-02 5.924783e+01 -2.345492e-04 -2.190510e-02
+3.000000e-02 6.552362e+01 -2.601516e-04 -2.638434e-02
+3.500000e-02 7.135686e+01 -2.840137e-04 -3.084052e-02
+4.000000e-02 7.681862e+01 -3.064795e-04 -3.526886e-02
+4.500000e-02 8.201493e+01 -3.279464e-04 -3.966637e-02
+5.000000e-02 8.700690e+01 -3.486613e-04 -4.403083e-02
+5.500000e-02 9.183892e+01 -3.688038e-04 -4.836074e-02
+6.000000e-02 9.654247e+01 -3.885020e-04 -5.265510e-02
+6.500000e-02 1.011410e+02 -4.078508e-04 -5.691327e-02
+7.000000e-02 1.056512e+02 -4.269170e-04 -6.113490e-02
+7.500000e-02 1.100838e+02 -4.457438e-04 -6.531990e-02
+8.000000e-02 1.144468e+02 -4.643613e-04 -6.946831e-02
+8.500000e-02 1.187446e+02 -4.827853e-04 -7.358030e-02
+9.000000e-02 1.229796e+02 -5.010230e-04 -7.765613e-02
+9.500000e-02 1.271521e+02 -5.190722e-04 -8.169616e-02
+1.000000e-01 1.312605e+02 -5.369232e-04 -8.570077e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016949,0.030328) (0.019796,0.012774) (0.017152,0.045492) (0.005359,0.037973) (0.009009,0.045541) (0.000077,0.005216) (0.008728,0.007789) (0.013336,0.037998) (0.016511,0.022270) (0.000302,0.029795) (0.016301,0.004405) (0.000753,0.020597) (0.002511,0.012817) (0.000635,0.045342) (0.008757,0.019887) (0.009225,0.031090) (0.041949,0.030328) (0.044796,0.012774) (0.042152,0.045492) (0.030359,0.037973) (0.034009,0.045541) (0.025077,0.005216) (0.033728,0.007789) (0.038336,0.037998) (0.041511,0.022270) (0.025302,0.029795) (0.041301,0.004405) (0.025753,0.020597) (0.027511,0.012817) (0.025635,0.045342) (0.033757,0.019887) (0.034225,0.031090) (0.050077,0.005216) (0.050302,0.029795) (0.050753,0.020597) (0.052511,0.012817) (0.050635,0.045342)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..597bf8057655a19804faffb801672230f5c12847
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.634925e+01 -2.145485e-03 -2.180181e-03
+1.000000e-02 1.924786e+02 -4.274927e-03 -4.344158e-03
+1.500000e-02 2.883893e+02 -6.388515e-03 -6.492118e-03
+2.000000e-02 3.840824e+02 -8.486438e-03 -8.624251e-03
+2.500000e-02 4.795558e+02 -1.056907e-02 -1.074093e-02
+3.000000e-02 5.747402e+02 -1.264085e-02 -1.284643e-02
+3.500000e-02 6.690453e+02 -1.473708e-02 -1.497645e-02
+4.000000e-02 7.618213e+02 -1.689491e-02 -1.717399e-02
+4.500000e-02 8.538461e+02 -1.907047e-02 -1.939360e-02
+5.000000e-02 9.455362e+02 -2.124119e-02 -2.160952e-02
+5.500000e-02 1.036962e+03 -2.340354e-02 -2.381766e-02
+6.000000e-02 1.128144e+03 -2.555673e-02 -2.601712e-02
+6.500000e-02 1.219096e+03 -2.770031e-02 -2.820738e-02
+7.000000e-02 1.309831e+03 -2.983388e-02 -3.038801e-02
+7.500000e-02 1.400358e+03 -3.195708e-02 -3.255862e-02
+8.000000e-02 1.490690e+03 -3.406962e-02 -3.471888e-02
+8.500000e-02 1.580835e+03 -3.617120e-02 -3.686847e-02
+9.000000e-02 1.670801e+03 -3.826159e-02 -3.900712e-02
+9.500000e-02 1.760598e+03 -4.034056e-02 -4.113457e-02
+1.000000e-01 1.850231e+03 -4.240793e-02 -4.325063e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.012642,0.026697) (0.000292,0.012098) (0.012669,0.012006) (0.037642,0.026697) (0.025292,0.012098) (0.037669,0.012006) (0.050292,0.012098)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e18b850c7169bf003bafdf201cfa00b77a837b24
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.912438e+00
+1.000000e-02 7.825513e+00
+1.500000e-02 1.159946e+01
+2.000000e-02 1.491310e+01
+2.500000e-02 1.770289e+01
+3.000000e-02 1.964117e+01
+3.500000e-02 2.071094e+01
+4.000000e-02 2.144256e+01
+4.500000e-02 2.201151e+01
+5.000000e-02 2.246220e+01
+5.500000e-02 2.281794e+01
+6.000000e-02 2.309469e+01
+6.500000e-02 2.330431e+01
+7.000000e-02 2.345815e+01
+7.500000e-02 2.355966e+01
+8.000000e-02 2.361777e+01
+8.500000e-02 2.363654e+01
+9.000000e-02 2.362500e+01
+9.500000e-02 2.358431e+01
+1.000000e-01 2.352091e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.012642,0.026697) (0.000292,0.012098) (0.012669,0.012006) (0.037642,0.026697) (0.025292,0.012098) (0.037669,0.012006) (0.050292,0.012098)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ea1cbc83b9223312b71699337f6f5376e34c1974
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.126832e+00 -1.586438e-04 -3.840261e-03
+1.000000e-02 1.420675e+01 -3.152653e-04 -7.651637e-03
+1.500000e-02 2.116959e+01 -4.686277e-04 -1.144152e-02
+2.000000e-02 2.756477e+01 -6.107443e-04 -1.525707e-02
+2.500000e-02 3.310972e+01 -7.354904e-04 -1.915182e-02
+3.000000e-02 3.742817e+01 -8.354733e-04 -2.319241e-02
+3.500000e-02 4.042300e+01 -9.092382e-04 -2.739902e-02
+4.000000e-02 4.239452e+01 -9.624490e-04 -3.172548e-02
+4.500000e-02 4.382027e+01 -1.003579e-03 -3.609810e-02
+5.000000e-02 4.491259e+01 -1.036532e-03 -4.048431e-02
+5.500000e-02 4.575605e+01 -1.063003e-03 -4.487124e-02
+6.000000e-02 4.639946e+01 -1.084054e-03 -4.925147e-02
+6.500000e-02 4.687838e+01 -1.100514e-03 -5.361955e-02
+7.000000e-02 4.722090e+01 -1.113074e-03 -5.797118e-02
+7.500000e-02 4.745015e+01 -1.122330e-03 -6.230278e-02
+8.000000e-02 4.758575e+01 -1.128796e-03 -6.661140e-02
+8.500000e-02 4.764442e+01 -1.132924e-03 -7.089452e-02
+9.000000e-02 4.763858e+01 -1.135003e-03 -7.515069e-02
+9.500000e-02 4.758390e+01 -1.135569e-03 -7.937698e-02
+1.000000e-01 4.748916e+01 -1.134821e-03 -8.357257e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.012642,0.026697) (0.000292,0.012098) (0.012669,0.012006) (0.037642,0.026697) (0.025292,0.012098) (0.037669,0.012006) (0.050292,0.012098)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..585867cd4767a152ff025c2e464c826103246879
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.634155e+01 -2.140903e-03 -2.184435e-03
+1.000000e-02 1.924632e+02 -4.265785e-03 -4.352648e-03
+1.500000e-02 2.883660e+02 -6.374833e-03 -6.504828e-03
+2.000000e-02 3.840513e+02 -8.468238e-03 -8.641166e-03
+2.500000e-02 4.795168e+02 -1.054638e-02 -1.076203e-02
+3.000000e-02 5.746931e+02 -1.261371e-02 -1.287170e-02
+3.500000e-02 6.689902e+02 -1.470539e-02 -1.500604e-02
+4.000000e-02 7.617582e+02 -1.685775e-02 -1.720887e-02
+4.500000e-02 8.537748e+02 -1.902727e-02 -1.943433e-02
+5.000000e-02 9.454567e+02 -2.119178e-02 -2.165631e-02
+5.500000e-02 1.036874e+03 -2.334782e-02 -2.387062e-02
+6.000000e-02 1.128048e+03 -2.549461e-02 -2.607636e-02
+6.500000e-02 1.218992e+03 -2.763169e-02 -2.827300e-02
+7.000000e-02 1.309718e+03 -2.975867e-02 -3.046011e-02
+7.500000e-02 1.400238e+03 -3.187522e-02 -3.263730e-02
+8.000000e-02 1.490561e+03 -3.398102e-02 -3.480422e-02
+8.500000e-02 1.580698e+03 -3.607579e-02 -3.696054e-02
+9.000000e-02 1.670656e+03 -3.815931e-02 -3.910600e-02
+9.500000e-02 1.760444e+03 -4.023134e-02 -4.124033e-02
+1.000000e-01 1.850069e+03 -4.229172e-02 -4.336332e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.002068,0.033348) (0.015870,0.007678) (0.017432,0.033921) (0.027068,0.033348) (0.040870,0.007678) (0.042432,0.033921) (0.052068,0.033348)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..09170ebc34fdd270b81ba1d6129e7aade2f3905b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.933770e+00
+1.000000e-02 7.864406e+00
+1.500000e-02 1.160312e+01
+2.000000e-02 1.491663e+01
+2.500000e-02 1.770735e+01
+3.000000e-02 1.963637e+01
+3.500000e-02 2.070836e+01
+4.000000e-02 2.143589e+01
+4.500000e-02 2.199862e+01
+5.000000e-02 2.244398e+01
+5.500000e-02 2.279475e+01
+6.000000e-02 2.306679e+01
+6.500000e-02 2.327264e+01
+7.000000e-02 2.342025e+01
+7.500000e-02 2.351983e+01
+8.000000e-02 2.357815e+01
+8.500000e-02 2.360332e+01
+9.000000e-02 2.359986e+01
+9.500000e-02 2.357225e+01
+1.000000e-01 2.352237e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.002068,0.033348) (0.015870,0.007678) (0.017432,0.033921) (0.027068,0.033348) (0.040870,0.007678) (0.042432,0.033921) (0.052068,0.033348)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2c37384e30dcc5b825ad36fb2e8c7130ae31f42b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.146516e+00 -1.587544e-04 -3.844330e-03
+1.000000e-02 1.424523e+01 -3.154667e-04 -7.659832e-03
+1.500000e-02 2.123192e+01 -4.690461e-04 -1.145264e-02
+2.000000e-02 2.768913e+01 -6.123288e-04 -1.526290e-02
+2.500000e-02 3.338342e+01 -7.404530e-04 -1.913268e-02
+3.000000e-02 3.774040e+01 -8.417229e-04 -2.316633e-02
+3.500000e-02 4.072371e+01 -9.155843e-04 -2.737501e-02
+4.000000e-02 4.276117e+01 -9.702968e-04 -3.169074e-02
+4.500000e-02 4.423713e+01 -1.012734e-03 -3.605471e-02
+5.000000e-02 4.536267e+01 -1.046693e-03 -4.043502e-02
+5.500000e-02 4.623310e+01 -1.073987e-03 -4.481724e-02
+6.000000e-02 4.690113e+01 -1.095741e-03 -4.919333e-02
+6.500000e-02 4.739995e+01 -1.112741e-03 -5.355818e-02
+7.000000e-02 4.775305e+01 -1.125594e-03 -5.790811e-02
+7.500000e-02 4.798557e+01 -1.134923e-03 -6.223938e-02
+8.000000e-02 4.811431e+01 -1.141197e-03 -6.654935e-02
+8.500000e-02 4.815571e+01 -1.144864e-03 -7.083557e-02
+9.000000e-02 4.812438e+01 -1.146326e-03 -7.509590e-02
+9.500000e-02 4.803331e+01 -1.145946e-03 -7.932847e-02
+1.000000e-01 4.789414e+01 -1.144049e-03 -8.353171e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.002068,0.033348) (0.015870,0.007678) (0.017432,0.033921) (0.027068,0.033348) (0.040870,0.007678) (0.042432,0.033921) (0.052068,0.033348)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..86b09ab55c0c817f96abb44af88e372bcd8c9ab8
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.634870e+01 -2.176303e-03 -2.149507e-03
+1.000000e-02 1.924776e+02 -4.336414e-03 -4.282955e-03
+1.500000e-02 2.883878e+02 -6.480522e-03 -6.400534e-03
+2.000000e-02 3.840804e+02 -8.608816e-03 -8.502433e-03
+2.500000e-02 4.795535e+02 -1.072167e-02 -1.058903e-02
+3.000000e-02 5.747375e+02 -1.282342e-02 -1.266468e-02
+3.500000e-02 6.690423e+02 -1.494993e-02 -1.476449e-02
+4.000000e-02 7.618181e+02 -1.714340e-02 -1.692641e-02
+4.500000e-02 8.538426e+02 -1.935838e-02 -1.910660e-02
+5.000000e-02 9.455323e+02 -2.156958e-02 -2.128205e-02
+5.500000e-02 1.036958e+03 -2.377298e-02 -2.344913e-02
+6.000000e-02 1.128140e+03 -2.596769e-02 -2.560705e-02
+6.500000e-02 1.219092e+03 -2.815322e-02 -2.775533e-02
+7.000000e-02 1.309826e+03 -3.032913e-02 -2.989357e-02
+7.500000e-02 1.400353e+03 -3.249504e-02 -3.202144e-02
+8.000000e-02 1.490684e+03 -3.465063e-02 -3.413860e-02
+8.500000e-02 1.580829e+03 -3.679557e-02 -3.624477e-02
+9.000000e-02 1.670795e+03 -3.892960e-02 -3.833971e-02
+9.500000e-02 1.760591e+03 -4.105247e-02 -4.042320e-02
+1.000000e-01 1.850224e+03 -4.316398e-02 -4.249504e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.002172,0.004473) (0.001171,0.045152) (0.013330,0.024553) (0.027172,0.004473) (0.026171,0.045152) (0.038330,0.024553) (0.052172,0.004473) (0.051171,0.045152)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c83801cd4161763d08bd8964e2445710c2a54edd
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.767755e+00
+1.000000e-02 7.536866e+00
+1.500000e-02 1.130066e+01
+2.000000e-02 1.486467e+01
+2.500000e-02 1.779199e+01
+3.000000e-02 1.963693e+01
+3.500000e-02 2.069469e+01
+4.000000e-02 2.144775e+01
+4.500000e-02 2.203141e+01
+5.000000e-02 2.248707e+01
+5.500000e-02 2.284078e+01
+6.000000e-02 2.311124e+01
+6.500000e-02 2.331237e+01
+7.000000e-02 2.345511e+01
+7.500000e-02 2.354360e+01
+8.000000e-02 2.359490e+01
+8.500000e-02 2.360786e+01
+9.000000e-02 2.359108e+01
+9.500000e-02 2.354582e+01
+1.000000e-01 2.347237e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.002172,0.004473) (0.001171,0.045152) (0.013330,0.024553) (0.027172,0.004473) (0.026171,0.045152) (0.038330,0.024553) (0.052172,0.004473) (0.051171,0.045152)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b33cbb821b786883e60f7b053100e8e0a402b0f6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.867440e+00 -1.550434e-04 -3.835434e-03
+1.000000e-02 1.369251e+01 -3.081366e-04 -7.642214e-03
+1.500000e-02 2.047350e+01 -4.592459e-04 -1.142106e-02
+2.000000e-02 2.713699e+01 -6.067108e-04 -1.518657e-02
+2.500000e-02 3.321397e+01 -7.417354e-04 -1.900720e-02
+3.000000e-02 3.770723e+01 -8.465517e-04 -2.301863e-02
+3.500000e-02 4.069158e+01 -9.221094e-04 -2.721994e-02
+4.000000e-02 4.270093e+01 -9.778071e-04 -3.153513e-02
+4.500000e-02 4.418869e+01 -1.021585e-03 -3.589513e-02
+5.000000e-02 4.535278e+01 -1.057080e-03 -4.026879e-02
+5.500000e-02 4.627010e+01 -1.085886e-03 -4.464361e-02
+6.000000e-02 4.698182e+01 -1.108981e-03 -4.901272e-02
+6.500000e-02 4.751797e+01 -1.127131e-03 -5.337112e-02
+7.000000e-02 4.790332e+01 -1.140995e-03 -5.771476e-02
+7.500000e-02 4.816088e+01 -1.151098e-03 -6.204053e-02
+8.000000e-02 4.830553e+01 -1.158033e-03 -6.634506e-02
+8.500000e-02 4.835520e+01 -1.162198e-03 -7.062620e-02
+9.000000e-02 4.832382e+01 -1.163978e-03 -7.488198e-02
+9.500000e-02 4.822150e+01 -1.163739e-03 -7.911060e-02
+1.000000e-01 4.806362e+01 -1.161737e-03 -8.331088e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.002172,0.004473) (0.001171,0.045152) (0.013330,0.024553) (0.027172,0.004473) (0.026171,0.045152) (0.038330,0.024553) (0.052172,0.004473) (0.051171,0.045152)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..23aa453bbd8b4fd1e43a17dbfb6cb1e4494a9194
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.634174e+01 -2.164087e-03 -2.162073e-03
+1.000000e-02 1.924637e+02 -4.312041e-03 -4.308022e-03
+1.500000e-02 2.883672e+02 -6.444052e-03 -6.438037e-03
+2.000000e-02 3.840532e+02 -8.560311e-03 -8.552308e-03
+2.500000e-02 4.795196e+02 -1.066119e-02 -1.065121e-02
+3.000000e-02 5.746972e+02 -1.275103e-02 -1.273909e-02
+3.500000e-02 6.689957e+02 -1.486526e-02 -1.485140e-02
+4.000000e-02 7.617649e+02 -1.704418e-02 -1.702809e-02
+4.500000e-02 8.537832e+02 -1.924311e-02 -1.922452e-02
+5.000000e-02 9.454667e+02 -2.143780e-02 -2.141665e-02
+5.500000e-02 1.036886e+03 -2.362441e-02 -2.360069e-02
+6.000000e-02 1.128062e+03 -2.580209e-02 -2.577578e-02
+6.500000e-02 1.219008e+03 -2.797037e-02 -2.794145e-02
+7.000000e-02 1.309735e+03 -3.012881e-02 -3.009728e-02
+7.500000e-02 1.400257e+03 -3.227707e-02 -3.224292e-02
+8.000000e-02 1.490582e+03 -3.441480e-02 -3.437803e-02
+8.500000e-02 1.580721e+03 -3.654171e-02 -3.650233e-02
+9.000000e-02 1.670681e+03 -3.865755e-02 -3.861555e-02
+9.500000e-02 1.760471e+03 -4.076208e-02 -4.071746e-02
+1.000000e-01 1.850098e+03 -4.285510e-02 -4.280788e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017336,0.044904) (0.002734,0.033180) (0.011406,0.009184) (0.042336,0.044904) (0.027734,0.033180) (0.036406,0.009184) (0.052734,0.033180)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ad7c7466227816981623e2dd32d0dce8ff610004
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.818678e+00
+1.000000e-02 7.638682e+00
+1.500000e-02 1.144526e+01
+2.000000e-02 1.497826e+01
+2.500000e-02 1.787009e+01
+3.000000e-02 1.971169e+01
+3.500000e-02 2.076282e+01
+4.000000e-02 2.149683e+01
+4.500000e-02 2.206210e+01
+5.000000e-02 2.250774e+01
+5.500000e-02 2.285769e+01
+6.000000e-02 2.312959e+01
+6.500000e-02 2.333540e+01
+7.000000e-02 2.348453e+01
+7.500000e-02 2.358465e+01
+8.000000e-02 2.364209e+01
+8.500000e-02 2.366193e+01
+9.000000e-02 2.364647e+01
+9.500000e-02 2.359497e+01
+1.000000e-01 2.349523e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017336,0.044904) (0.002734,0.033180) (0.011406,0.009184) (0.042336,0.044904) (0.027734,0.033180) (0.036406,0.009184) (0.052734,0.033180)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bfa63d930ac644bdd0f8edd98e9f59fab95eed8c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.698706e+00 -1.503607e-04 -3.881566e-03
+1.000000e-02 1.335817e+01 -2.988072e-04 -7.733616e-03
+1.500000e-02 1.997918e+01 -4.453673e-04 -1.155644e-02
+2.000000e-02 2.653283e+01 -5.894925e-04 -1.535427e-02
+2.500000e-02 3.250204e+01 -7.217158e-04 -1.919928e-02
+3.000000e-02 3.690976e+01 -8.238615e-04 -2.323254e-02
+3.500000e-02 3.983726e+01 -8.969375e-04 -2.745371e-02
+4.000000e-02 4.183707e+01 -9.511016e-04 -3.177903e-02
+4.500000e-02 4.331578e+01 -9.936719e-04 -3.614586e-02
+5.000000e-02 4.445950e+01 -1.027965e-03 -4.052638e-02
+5.500000e-02 4.535081e+01 -1.055552e-03 -4.490830e-02
+6.000000e-02 4.603349e+01 -1.077389e-03 -4.928490e-02
+6.500000e-02 4.653806e+01 -1.094227e-03 -5.365134e-02
+7.000000e-02 4.688984e+01 -1.106720e-03 -5.800363e-02
+7.500000e-02 4.711101e+01 -1.115463e-03 -6.233827e-02
+8.000000e-02 4.722141e+01 -1.120991e-03 -6.665220e-02
+8.500000e-02 4.723791e+01 -1.123763e-03 -7.094291e-02
+9.000000e-02 4.717778e+01 -1.124260e-03 -7.520777e-02
+9.500000e-02 4.705414e+01 -1.122841e-03 -7.944497e-02
+1.000000e-01 4.687718e+01 -1.119725e-03 -8.365358e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017336,0.044904) (0.002734,0.033180) (0.011406,0.009184) (0.042336,0.044904) (0.027734,0.033180) (0.036406,0.009184) (0.052734,0.033180)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..36afcc499d26629b24ab14894d590cfe32140e87
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.634416e+01 -2.140623e-03 -2.184621e-03
+1.000000e-02 1.924684e+02 -4.265224e-03 -4.353022e-03
+1.500000e-02 2.883738e+02 -6.373993e-03 -6.505390e-03
+2.000000e-02 3.840615e+02 -8.467119e-03 -8.641916e-03
+2.500000e-02 4.795296e+02 -1.054498e-02 -1.076297e-02
+3.000000e-02 5.747084e+02 -1.261203e-02 -1.287283e-02
+3.500000e-02 6.690079e+02 -1.470339e-02 -1.500742e-02
+4.000000e-02 7.617784e+02 -1.685529e-02 -1.721063e-02
+4.500000e-02 8.537975e+02 -1.902429e-02 -1.943654e-02
+5.000000e-02 9.454818e+02 -2.118823e-02 -2.165901e-02
+5.500000e-02 1.036902e+03 -2.334367e-02 -2.387385e-02
+6.000000e-02 1.128078e+03 -2.548982e-02 -2.608016e-02
+6.500000e-02 1.219024e+03 -2.762622e-02 -2.827741e-02
+7.000000e-02 1.309753e+03 -2.975250e-02 -3.046517e-02
+7.500000e-02 1.400275e+03 -3.186829e-02 -3.264304e-02
+8.000000e-02 1.490600e+03 -3.397330e-02 -3.481069e-02
+8.500000e-02 1.580739e+03 -3.606725e-02 -3.696778e-02
+9.000000e-02 1.670700e+03 -3.814990e-02 -3.911405e-02
+9.500000e-02 1.760490e+03 -4.022103e-02 -4.124923e-02
+1.000000e-01 1.850117e+03 -4.228046e-02 -4.337312e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.015855,0.032987) (0.000178,0.031703) (0.016582,0.010803) (0.040855,0.032987) (0.025178,0.031703) (0.041582,0.010803) (0.050178,0.031703)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..771d591c6e99f5826dc9e6a92d7ff58bf4b53436
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.935177e+00
+1.000000e-02 7.866165e+00
+1.500000e-02 1.160403e+01
+2.000000e-02 1.492245e+01
+2.500000e-02 1.770980e+01
+3.000000e-02 1.962951e+01
+3.500000e-02 2.070576e+01
+4.000000e-02 2.143627e+01
+4.500000e-02 2.200002e+01
+5.000000e-02 2.244555e+01
+5.500000e-02 2.279672e+01
+6.000000e-02 2.307068e+01
+6.500000e-02 2.327735e+01
+7.000000e-02 2.342847e+01
+7.500000e-02 2.353263e+01
+8.000000e-02 2.359706e+01
+8.500000e-02 2.362781e+01
+9.000000e-02 2.362992e+01
+9.500000e-02 2.360908e+01
+1.000000e-01 2.356749e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.015855,0.032987) (0.000178,0.031703) (0.016582,0.010803) (0.040855,0.032987) (0.025178,0.031703) (0.041582,0.010803) (0.050178,0.031703)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ed779385fe85537a66e495470a0354869d60f7a0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.0924_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.143083e+00 -1.586513e-04 -3.845343e-03
+1.000000e-02 1.424042e+01 -3.153038e-04 -7.661568e-03
+1.500000e-02 2.122704e+01 -4.688389e-04 -1.145498e-02
+2.000000e-02 2.771239e+01 -6.125102e-04 -1.526407e-02
+2.500000e-02 3.337344e+01 -7.397303e-04 -1.914267e-02
+3.000000e-02 3.766507e+01 -8.395120e-04 -2.318930e-02
+3.500000e-02 4.059744e+01 -9.120907e-04 -2.740865e-02
+4.000000e-02 4.262770e+01 -9.662053e-04 -3.172857e-02
+4.500000e-02 4.410393e+01 -1.008212e-03 -3.609505e-02
+5.000000e-02 4.522269e+01 -1.041658e-03 -4.047857e-02
+5.500000e-02 4.608128e+01 -1.068397e-03 -4.486449e-02
+6.000000e-02 4.673151e+01 -1.089523e-03 -4.924488e-02
+6.500000e-02 4.721221e+01 -1.105914e-03 -5.361388e-02
+7.000000e-02 4.754855e+01 -1.118207e-03 -5.796757e-02
+7.500000e-02 4.776279e+01 -1.126972e-03 -6.230255e-02
+8.000000e-02 4.787222e+01 -1.132607e-03 -6.661661e-02
+8.500000e-02 4.789662e+01 -1.135757e-03 -7.090607e-02
+9.000000e-02 4.784944e+01 -1.136739e-03 -7.516931e-02
+9.500000e-02 4.774269e+01 -1.135825e-03 -7.940505e-02
+1.000000e-01 4.758938e+01 -1.133489e-03 -8.361079e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.015855,0.032987) (0.000178,0.031703) (0.016582,0.010803) (0.040855,0.032987) (0.025178,0.031703) (0.041582,0.010803) (0.050178,0.031703)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9f7c097fcf471ffa86105d30ec317143ad55d4d0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.186643e+02 -2.061148e-03 -2.066759e-03
+1.000000e-02 4.367392e+02 -4.107192e-03 -4.118381e-03
+1.500000e-02 6.542282e+02 -6.138309e-03 -6.155042e-03
+2.000000e-02 8.711348e+02 -8.154675e-03 -8.176919e-03
+2.500000e-02 1.087460e+03 -1.015663e-02 -1.018435e-02
+3.000000e-02 1.303151e+03 -1.214811e-02 -1.218123e-02
+3.500000e-02 1.517757e+03 -1.416067e-02 -1.419908e-02
+4.000000e-02 1.730818e+03 -1.622890e-02 -1.627342e-02
+4.500000e-02 1.942973e+03 -1.831356e-02 -1.836481e-02
+5.000000e-02 2.154553e+03 -2.039370e-02 -2.045180e-02
+5.500000e-02 2.365620e+03 -2.246600e-02 -2.253097e-02
+6.000000e-02 2.576195e+03 -2.452970e-02 -2.460155e-02
+6.500000e-02 2.786295e+03 -2.658437e-02 -2.666310e-02
+7.000000e-02 2.995935e+03 -2.862964e-02 -2.871525e-02
+7.500000e-02 3.205127e+03 -3.066518e-02 -3.075764e-02
+8.000000e-02 3.413883e+03 -3.269070e-02 -3.278999e-02
+8.500000e-02 3.622215e+03 -3.470592e-02 -3.481203e-02
+9.000000e-02 3.830132e+03 -3.671062e-02 -3.682350e-02
+9.500000e-02 4.037643e+03 -3.870460e-02 -3.882423e-02
+1.000000e-01 4.244757e+03 -4.068764e-02 -4.081398e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002000,0.004642) (0.018174,0.028044) (0.013935,0.042331) (0.018673,0.014337) (0.000417,0.020607) (0.010838,0.032072) (0.010821,0.024089) (0.027000,0.004642) (0.043174,0.028044) (0.038935,0.042331) (0.043673,0.014337) (0.025417,0.020607) (0.035838,0.032072) (0.035821,0.024089) (0.052000,0.004642) (0.050417,0.020607)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1c2a3899787909bee819451a797c01321934a541
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.030051e+00
+1.000000e-02 1.003683e+01
+1.500000e-02 1.449260e+01
+2.000000e-02 1.792775e+01
+2.500000e-02 2.020871e+01
+3.000000e-02 2.148983e+01
+3.500000e-02 2.225868e+01
+4.000000e-02 2.277209e+01
+4.500000e-02 2.313084e+01
+5.000000e-02 2.338552e+01
+5.500000e-02 2.356492e+01
+6.000000e-02 2.368698e+01
+6.500000e-02 2.376335e+01
+7.000000e-02 2.380115e+01
+7.500000e-02 2.380691e+01
+8.000000e-02 2.378253e+01
+8.500000e-02 2.373345e+01
+9.000000e-02 2.366052e+01
+9.500000e-02 2.356760e+01
+1.000000e-01 2.345636e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002000,0.004642) (0.018174,0.028044) (0.013935,0.042331) (0.018673,0.014337) (0.000417,0.020607) (0.010838,0.032072) (0.010821,0.024089) (0.027000,0.004642) (0.043174,0.028044) (0.038935,0.042331) (0.043673,0.014337) (0.025417,0.020607) (0.035838,0.032072) (0.035821,0.024089) (0.052000,0.004642) (0.050417,0.020607)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7d06014caa242aee6d442c284098997cb4cd7b38
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.917035e+00 -8.404049e-05 -3.815540e-03
+1.000000e-02 1.777967e+01 -1.671054e-04 -7.601256e-03
+1.500000e-02 2.643522e+01 -2.478919e-04 -1.137440e-02
+2.000000e-02 3.393474e+01 -3.185498e-04 -1.523687e-02
+2.500000e-02 3.944513e+01 -3.721413e-04 -1.929356e-02
+3.000000e-02 4.307065e+01 -4.093293e-04 -2.354696e-02
+3.500000e-02 4.546737e+01 -4.354651e-04 -2.791764e-02
+4.000000e-02 4.711589e+01 -4.544821e-04 -3.234485e-02
+4.500000e-02 4.825982e+01 -4.684042e-04 -3.679783e-02
+5.000000e-02 4.903372e+01 -4.783792e-04 -4.125981e-02
+5.500000e-02 4.952442e+01 -4.852178e-04 -4.571960e-02
+6.000000e-02 4.979414e+01 -4.895341e-04 -5.016924e-02
+6.500000e-02 4.989433e+01 -4.918878e-04 -5.460178e-02
+7.000000e-02 4.987024e+01 -4.927595e-04 -5.901150e-02
+7.500000e-02 4.975542e+01 -4.925047e-04 -6.339433e-02
+8.000000e-02 4.958278e+01 -4.914866e-04 -6.774620e-02
+8.500000e-02 4.937728e+01 -4.899780e-04 -7.206417e-02
+9.000000e-02 4.915762e+01 -4.881870e-04 -7.634613e-02
+9.500000e-02 4.893397e+01 -4.862306e-04 -8.059108e-02
+1.000000e-01 4.872045e+01 -4.842795e-04 -8.479740e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002000,0.004642) (0.018174,0.028044) (0.013935,0.042331) (0.018673,0.014337) (0.000417,0.020607) (0.010838,0.032072) (0.010821,0.024089) (0.027000,0.004642) (0.043174,0.028044) (0.038935,0.042331) (0.043673,0.014337) (0.025417,0.020607) (0.035838,0.032072) (0.035821,0.024089) (0.052000,0.004642) (0.050417,0.020607)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..97505e847408085b213894fd5ab41bcc3b68d43d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.186510e+02 -2.092680e-03 -2.034359e-03
+1.000000e-02 4.367122e+02 -4.170112e-03 -4.053735e-03
+1.500000e-02 6.541871e+02 -6.232471e-03 -6.058304e-03
+2.000000e-02 8.710793e+02 -8.279936e-03 -8.048242e-03
+2.500000e-02 1.087390e+03 -1.031284e-02 -1.002389e-02
+3.000000e-02 1.303066e+03 -1.233505e-02 -1.198927e-02
+3.500000e-02 1.517656e+03 -1.437924e-02 -1.397484e-02
+4.000000e-02 1.730702e+03 -1.648560e-02 -1.601042e-02
+4.500000e-02 1.942841e+03 -1.861244e-02 -1.805904e-02
+5.000000e-02 2.154405e+03 -2.073603e-02 -2.010204e-02
+5.500000e-02 2.365456e+03 -2.285253e-02 -2.213649e-02
+6.000000e-02 2.576015e+03 -2.496111e-02 -2.416172e-02
+6.500000e-02 2.786098e+03 -2.706127e-02 -2.617734e-02
+7.000000e-02 2.995721e+03 -2.915261e-02 -2.818300e-02
+7.500000e-02 3.204896e+03 -3.123475e-02 -3.017841e-02
+8.000000e-02 3.413636e+03 -3.330736e-02 -3.216331e-02
+8.500000e-02 3.621950e+03 -3.537013e-02 -3.413746e-02
+9.000000e-02 3.829851e+03 -3.742280e-02 -3.610065e-02
+9.500000e-02 4.037348e+03 -3.946528e-02 -3.805282e-02
+1.000000e-01 4.244442e+03 -4.149690e-02 -3.999349e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.000815,0.015607) (0.019568,0.034273) (0.013596,0.007657) (0.001698,0.041579) (0.017217,0.045541) (0.015078,0.015849) (0.013042,0.024103) (0.025815,0.015607) (0.044568,0.034273) (0.038596,0.007657) (0.026698,0.041579) (0.042217,0.045541) (0.040078,0.015849) (0.038042,0.024103) (0.050815,0.015607) (0.051698,0.041579)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e4cee9912ac0351afeacff49fee66b598d48a886
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.867078e+00
+1.000000e-02 9.732648e+00
+1.500000e-02 1.428089e+01
+2.000000e-02 1.779626e+01
+2.500000e-02 2.007582e+01
+3.000000e-02 2.136594e+01
+3.500000e-02 2.216978e+01
+4.000000e-02 2.272484e+01
+4.500000e-02 2.311821e+01
+5.000000e-02 2.339330e+01
+5.500000e-02 2.357935e+01
+6.000000e-02 2.369094e+01
+6.500000e-02 2.374353e+01
+7.000000e-02 2.374723e+01
+7.500000e-02 2.371172e+01
+8.000000e-02 2.364152e+01
+8.500000e-02 2.354433e+01
+9.000000e-02 2.342482e+01
+9.500000e-02 2.329006e+01
+1.000000e-01 2.313542e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.000815,0.015607) (0.019568,0.034273) (0.013596,0.007657) (0.001698,0.041579) (0.017217,0.045541) (0.015078,0.015849) (0.013042,0.024103) (0.025815,0.015607) (0.044568,0.034273) (0.038596,0.007657) (0.026698,0.041579) (0.042217,0.045541) (0.040078,0.015849) (0.038042,0.024103) (0.050815,0.015607) (0.051698,0.041579)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1301d6809011c0343b21b91c1e89a339deee7cfb
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.376406e+00 -8.977905e-05 -3.691929e-03
+1.000000e-02 1.866864e+01 -1.783505e-04 -7.359361e-03
+1.500000e-02 2.753100e+01 -2.622378e-04 -1.105943e-02
+2.000000e-02 3.497586e+01 -3.330492e-04 -1.490860e-02
+2.500000e-02 4.035923e+01 -3.856540e-04 -1.898042e-02
+3.000000e-02 4.397247e+01 -4.226698e-04 -2.324076e-02
+3.500000e-02 4.638445e+01 -4.489328e-04 -2.761527e-02
+4.000000e-02 4.806731e+01 -4.683510e-04 -3.204244e-02
+4.500000e-02 4.928941e+01 -4.831461e-04 -3.648786e-02
+5.000000e-02 5.017978e+01 -4.944505e-04 -4.093521e-02
+5.500000e-02 5.081336e+01 -5.029641e-04 -4.537519e-02
+6.000000e-02 5.123979e+01 -5.091424e-04 -4.980219e-02
+6.500000e-02 5.150359e+01 -5.134876e-04 -5.421014e-02
+7.000000e-02 5.163354e+01 -5.162711e-04 -5.859614e-02
+7.500000e-02 5.165529e+01 -5.177655e-04 -6.295726e-02
+8.000000e-02 5.159079e+01 -5.182083e-04 -6.729107e-02
+8.500000e-02 5.145913e+01 -5.178086e-04 -7.159545e-02
+9.000000e-02 5.127710e+01 -5.167521e-04 -7.586859e-02
+9.500000e-02 5.105943e+01 -5.152030e-04 -8.010892e-02
+1.000000e-01 5.081891e+01 -5.133052e-04 -8.431512e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.000815,0.015607) (0.019568,0.034273) (0.013596,0.007657) (0.001698,0.041579) (0.017217,0.045541) (0.015078,0.015849) (0.013042,0.024103) (0.025815,0.015607) (0.044568,0.034273) (0.038596,0.007657) (0.026698,0.041579) (0.042217,0.045541) (0.040078,0.015849) (0.038042,0.024103) (0.050815,0.015607) (0.051698,0.041579)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a94b6865f24175a8ffa55efec27d030fd4437555
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.186738e+02 -2.066038e-03 -2.062452e-03
+1.000000e-02 4.367585e+02 -4.116925e-03 -4.109804e-03
+1.500000e-02 6.542576e+02 -6.152837e-03 -6.142231e-03
+2.000000e-02 8.711744e+02 -8.173951e-03 -8.159909e-03
+2.500000e-02 1.087510e+03 -1.018061e-02 -1.016318e-02
+3.000000e-02 1.303212e+03 -1.217671e-02 -1.215594e-02
+3.500000e-02 1.517829e+03 -1.419381e-02 -1.416964e-02
+4.000000e-02 1.730901e+03 -1.626707e-02 -1.623928e-02
+4.500000e-02 1.943067e+03 -1.835703e-02 -1.832564e-02
+5.000000e-02 2.154658e+03 -2.044248e-02 -2.040756e-02
+5.500000e-02 2.365736e+03 -2.252005e-02 -2.248167e-02
+6.000000e-02 2.576323e+03 -2.458898e-02 -2.454721e-02
+6.500000e-02 2.786434e+03 -2.664883e-02 -2.660375e-02
+7.000000e-02 2.996085e+03 -2.869922e-02 -2.865090e-02
+7.500000e-02 3.205288e+03 -3.073983e-02 -3.068835e-02
+8.000000e-02 3.414056e+03 -3.277035e-02 -3.271579e-02
+8.500000e-02 3.622399e+03 -3.479052e-02 -3.473296e-02
+9.000000e-02 3.830327e+03 -3.680011e-02 -3.673962e-02
+9.500000e-02 4.037850e+03 -3.879889e-02 -3.873556e-02
+1.000000e-01 4.244974e+03 -4.078673e-02 -4.072060e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002089,0.026999) (0.015709,0.026555) (0.009082,0.037124) (0.013980,0.044879) (0.015552,0.012662) (0.001019,0.014405) (0.008588,0.005458) (0.027089,0.026999) (0.040709,0.026555) (0.034082,0.037124) (0.038980,0.044879) (0.040552,0.012662) (0.026019,0.014405) (0.033588,0.005458) (0.052089,0.026999) (0.051019,0.014405)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..908a38292054bcb908c1d8a053a6e461b193df20
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.963171e+00
+1.000000e-02 9.922561e+00
+1.500000e-02 1.448274e+01
+2.000000e-02 1.797669e+01
+2.500000e-02 2.026464e+01
+3.000000e-02 2.152516e+01
+3.500000e-02 2.231419e+01
+4.000000e-02 2.285618e+01
+4.500000e-02 2.323610e+01
+5.000000e-02 2.349856e+01
+5.500000e-02 2.366719e+01
+6.000000e-02 2.375570e+01
+6.500000e-02 2.376288e+01
+7.000000e-02 2.367369e+01
+7.500000e-02 2.343609e+01
+8.000000e-02 2.297400e+01
+8.500000e-02 2.241358e+01
+9.000000e-02 2.202711e+01
+9.500000e-02 2.190164e+01
+1.000000e-01 2.198694e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002089,0.026999) (0.015709,0.026555) (0.009082,0.037124) (0.013980,0.044879) (0.015552,0.012662) (0.001019,0.014405) (0.008588,0.005458) (0.027089,0.026999) (0.040709,0.026555) (0.034082,0.037124) (0.038980,0.044879) (0.040552,0.012662) (0.026019,0.014405) (0.033588,0.005458) (0.052089,0.026999) (0.051019,0.014405)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..162698655f7137fca424c5b7526b59fa1016d397
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.833252e+00 -8.344245e-05 -3.817068e-03
+1.000000e-02 1.759615e+01 -1.657555e-04 -7.606264e-03
+1.500000e-02 2.615134e+01 -2.458463e-04 -1.138097e-02
+2.000000e-02 3.341531e+01 -3.149092e-04 -1.525468e-02
+2.500000e-02 3.871025e+01 -3.667834e-04 -1.932870e-02
+3.000000e-02 4.225450e+01 -4.032649e-04 -2.358525e-02
+3.500000e-02 4.457258e+01 -4.287347e-04 -2.796022e-02
+4.000000e-02 4.615753e+01 -4.471743e-04 -3.239191e-02
+4.500000e-02 4.726992e+01 -4.607542e-04 -3.684680e-02
+5.000000e-02 4.803886e+01 -4.706282e-04 -4.130811e-02
+5.500000e-02 4.854463e+01 -4.775677e-04 -4.576537e-02
+6.000000e-02 4.884640e+01 -4.821716e-04 -5.021079e-02
+6.500000e-02 4.899081e+01 -4.849292e-04 -5.463826e-02
+7.000000e-02 4.901567e+01 -4.862478e-04 -5.904281e-02
+7.500000e-02 4.895195e+01 -4.864662e-04 -6.342044e-02
+8.000000e-02 4.882479e+01 -4.858643e-04 -6.776792e-02
+8.500000e-02 4.865441e+01 -4.846704e-04 -7.208273e-02
+9.000000e-02 4.845666e+01 -4.830673e-04 -7.636297e-02
+9.500000e-02 4.824375e+01 -4.811990e-04 -8.060725e-02
+1.000000e-01 4.802484e+01 -4.791760e-04 -8.481466e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002089,0.026999) (0.015709,0.026555) (0.009082,0.037124) (0.013980,0.044879) (0.015552,0.012662) (0.001019,0.014405) (0.008588,0.005458) (0.027089,0.026999) (0.040709,0.026555) (0.034082,0.037124) (0.038980,0.044879) (0.040552,0.012662) (0.026019,0.014405) (0.033588,0.005458) (0.052089,0.026999) (0.051019,0.014405)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8fd7b4a65c0880e7d4cb82803e5b9340fe701ec5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.186361e+02 -2.063483e-03 -2.064663e-03
+1.000000e-02 4.366830e+02 -4.111834e-03 -4.114214e-03
+1.500000e-02 6.541442e+02 -6.145230e-03 -6.148829e-03
+2.000000e-02 8.710231e+02 -8.163847e-03 -8.168684e-03
+2.500000e-02 1.087321e+03 -1.016803e-02 -1.017412e-02
+3.000000e-02 1.302985e+03 -1.216169e-02 -1.216902e-02
+3.500000e-02 1.517564e+03 -1.417644e-02 -1.418480e-02
+4.000000e-02 1.730598e+03 -1.624710e-02 -1.625682e-02
+4.500000e-02 1.942725e+03 -1.833427e-02 -1.834581e-02
+5.000000e-02 2.154278e+03 -2.041691e-02 -2.043041e-02
+5.500000e-02 2.365318e+03 -2.249165e-02 -2.250723e-02
+6.000000e-02 2.575867e+03 -2.455775e-02 -2.457550e-02
+6.500000e-02 2.785940e+03 -2.661476e-02 -2.663479e-02
+7.000000e-02 2.995553e+03 -2.866231e-02 -2.868472e-02
+7.500000e-02 3.204718e+03 -3.070006e-02 -3.072496e-02
+8.000000e-02 3.413448e+03 -3.272772e-02 -3.275521e-02
+8.500000e-02 3.621753e+03 -3.474503e-02 -3.477521e-02
+9.000000e-02 3.829644e+03 -3.675173e-02 -3.678472e-02
+9.500000e-02 4.037129e+03 -3.874764e-02 -3.878354e-02
+1.000000e-01 4.244217e+03 -4.073255e-02 -4.077147e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.001199,0.004688) (0.015655,0.016349) (0.012142,0.045054) (0.007976,0.020778) (0.018675,0.031954) (0.011233,0.009706) (0.003341,0.029173) (0.026199,0.004688) (0.040655,0.016349) (0.037142,0.045054) (0.032976,0.020778) (0.043675,0.031954) (0.036233,0.009706) (0.028341,0.029173) (0.051199,0.004688) (0.053341,0.029173)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6e176e00ed2331af097ac2c9bb7ca8290318556d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.011644e+00
+1.000000e-02 1.001863e+01
+1.500000e-02 1.461361e+01
+2.000000e-02 1.806395e+01
+2.500000e-02 2.030402e+01
+3.000000e-02 2.159421e+01
+3.500000e-02 2.237660e+01
+4.000000e-02 2.290436e+01
+4.500000e-02 2.327263e+01
+5.000000e-02 2.352851e+01
+5.500000e-02 2.369901e+01
+6.000000e-02 2.379451e+01
+6.500000e-02 2.382147e+01
+7.000000e-02 2.376790e+01
+7.500000e-02 2.357666e+01
+8.000000e-02 2.319008e+01
+8.500000e-02 2.281074e+01
+9.000000e-02 2.262249e+01
+9.500000e-02 2.260076e+01
+1.000000e-01 2.267075e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.001199,0.004688) (0.015655,0.016349) (0.012142,0.045054) (0.007976,0.020778) (0.018675,0.031954) (0.011233,0.009706) (0.003341,0.029173) (0.026199,0.004688) (0.040655,0.016349) (0.037142,0.045054) (0.032976,0.020778) (0.043675,0.031954) (0.036233,0.009706) (0.028341,0.029173) (0.051199,0.004688) (0.053341,0.029173)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0fc2160e490a1d84824c236b531ba721bc77028d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.562340e+00 -8.077917e-05 -3.857429e-03
+1.000000e-02 1.707291e+01 -1.605863e-04 -7.684359e-03
+1.500000e-02 2.545938e+01 -2.388000e-04 -1.148970e-02
+2.000000e-02 3.289028e+01 -3.083334e-04 -1.537339e-02
+2.500000e-02 3.827107e+01 -3.601847e-04 -1.946473e-02
+3.000000e-02 4.178122e+01 -3.959288e-04 -2.374481e-02
+3.500000e-02 4.411959e+01 -4.211850e-04 -2.813215e-02
+4.000000e-02 4.574732e+01 -4.396686e-04 -3.257009e-02
+4.500000e-02 4.690648e+01 -4.533771e-04 -3.702858e-02
+5.000000e-02 4.771743e+01 -4.633759e-04 -4.149225e-02
+5.500000e-02 4.825733e+01 -4.704012e-04 -4.595112e-02
+6.000000e-02 4.858224e+01 -4.750189e-04 -5.039789e-02
+6.500000e-02 4.873288e+01 -4.776350e-04 -5.482758e-02
+7.000000e-02 4.875182e+01 -4.787439e-04 -5.923429e-02
+7.500000e-02 4.866485e+01 -4.785901e-04 -6.361531e-02
+8.000000e-02 4.850034e+01 -4.775136e-04 -6.796685e-02
+8.500000e-02 4.827741e+01 -4.757217e-04 -7.228676e-02
+9.000000e-02 4.801456e+01 -4.734183e-04 -7.657300e-02
+9.500000e-02 4.772710e+01 -4.707742e-04 -8.082396e-02
+1.000000e-01 4.742842e+01 -4.679385e-04 -8.503829e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.001199,0.004688) (0.015655,0.016349) (0.012142,0.045054) (0.007976,0.020778) (0.018675,0.031954) (0.011233,0.009706) (0.003341,0.029173) (0.026199,0.004688) (0.040655,0.016349) (0.037142,0.045054) (0.032976,0.020778) (0.043675,0.031954) (0.036233,0.009706) (0.028341,0.029173) (0.051199,0.004688) (0.053341,0.029173)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..91b7acf42e2dfbac034ee3438304835fe440cae2
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.186529e+02 -2.061029e-03 -2.067506e-03
+1.000000e-02 4.367167e+02 -4.106965e-03 -4.119856e-03
+1.500000e-02 6.541950e+02 -6.137983e-03 -6.157223e-03
+2.000000e-02 8.710912e+02 -8.154260e-03 -8.179787e-03
+2.500000e-02 1.087406e+03 -1.015614e-02 -1.018788e-02
+3.000000e-02 1.303087e+03 -1.214753e-02 -1.218541e-02
+3.500000e-02 1.517684e+03 -1.415998e-02 -1.420377e-02
+4.000000e-02 1.730736e+03 -1.622827e-02 -1.627840e-02
+4.500000e-02 1.942881e+03 -1.831310e-02 -1.836993e-02
+5.000000e-02 2.154452e+03 -2.039347e-02 -2.045697e-02
+5.500000e-02 2.365509e+03 -2.246606e-02 -2.253611e-02
+6.000000e-02 2.576076e+03 -2.453010e-02 -2.460657e-02
+6.500000e-02 2.786167e+03 -2.658516e-02 -2.666793e-02
+7.000000e-02 2.995797e+03 -2.863088e-02 -2.871979e-02
+7.500000e-02 3.204980e+03 -3.066692e-02 -3.076184e-02
+8.000000e-02 3.413728e+03 -3.269298e-02 -3.279378e-02
+8.500000e-02 3.622051e+03 -3.470881e-02 -3.481532e-02
+9.000000e-02 3.829959e+03 -3.671416e-02 -3.682625e-02
+9.500000e-02 4.037462e+03 -3.870883e-02 -3.882635e-02
+1.000000e-01 4.244567e+03 -4.069263e-02 -4.081543e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.015516,0.004222) (0.007385,0.014347) (0.016845,0.020002) (0.012166,0.041409) (0.002251,0.025252) (0.016590,0.034673) (0.001464,0.037143) (0.040516,0.004222) (0.032385,0.014347) (0.041845,0.020002) (0.037166,0.041409) (0.027251,0.025252) (0.041590,0.034673) (0.026464,0.037143) (0.052251,0.025252) (0.051464,0.037143)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a3ed757ee047e4e3ca2910be8fae628ea1661a4e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.037704e+00
+1.000000e-02 1.006274e+01
+1.500000e-02 1.457124e+01
+2.000000e-02 1.795253e+01
+2.500000e-02 2.019027e+01
+3.000000e-02 2.146449e+01
+3.500000e-02 2.224834e+01
+4.000000e-02 2.278365e+01
+4.500000e-02 2.315796e+01
+5.000000e-02 2.341543e+01
+5.500000e-02 2.358241e+01
+6.000000e-02 2.366859e+01
+6.500000e-02 2.367700e+01
+7.000000e-02 2.359407e+01
+7.500000e-02 2.334582e+01
+8.000000e-02 2.278729e+01
+8.500000e-02 2.216362e+01
+9.000000e-02 2.187332e+01
+9.500000e-02 2.192226e+01
+1.000000e-01 2.218535e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.015516,0.004222) (0.007385,0.014347) (0.016845,0.020002) (0.012166,0.041409) (0.002251,0.025252) (0.016590,0.034673) (0.001464,0.037143) (0.040516,0.004222) (0.032385,0.014347) (0.041845,0.020002) (0.037166,0.041409) (0.027251,0.025252) (0.041590,0.034673) (0.026464,0.037143) (0.052251,0.025252) (0.051464,0.037143)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3c941fff2f47e91611b6bab258d4847d8833663d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.2155_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.919159e+00 -8.405677e-05 -3.815307e-03
+1.000000e-02 1.777994e+01 -1.670945e-04 -7.600955e-03
+1.500000e-02 2.640986e+01 -2.476065e-04 -1.137766e-02
+2.000000e-02 3.390039e+01 -3.179673e-04 -1.524930e-02
+2.500000e-02 3.931260e+01 -3.702055e-04 -1.933631e-02
+3.000000e-02 4.287721e+01 -4.064826e-04 -2.360989e-02
+3.500000e-02 4.524735e+01 -4.321319e-04 -2.799150e-02
+4.000000e-02 4.687800e+01 -4.507691e-04 -3.242642e-02
+4.500000e-02 4.802546e+01 -4.645422e-04 -3.688272e-02
+5.000000e-02 4.882101e+01 -4.745712e-04 -4.134449e-02
+5.500000e-02 4.934849e+01 -4.816474e-04 -4.580121e-02
+6.000000e-02 4.967061e+01 -4.863956e-04 -5.024496e-02
+6.500000e-02 4.983394e+01 -4.892469e-04 -5.467051e-02
+7.000000e-02 4.988868e+01 -4.908794e-04 -5.906958e-02
+7.500000e-02 4.985664e+01 -4.913910e-04 -6.344130e-02
+8.000000e-02 4.976484e+01 -4.911310e-04 -6.778167e-02
+8.500000e-02 4.963194e+01 -4.903157e-04 -7.208838e-02
+9.000000e-02 4.947200e+01 -4.891121e-04 -7.635979e-02
+9.500000e-02 4.929591e+01 -4.876508e-04 -8.059473e-02
+1.000000e-01 4.911026e+01 -4.859792e-04 -8.479308e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.015516,0.004222) (0.007385,0.014347) (0.016845,0.020002) (0.012166,0.041409) (0.002251,0.025252) (0.016590,0.034673) (0.001464,0.037143) (0.040516,0.004222) (0.032385,0.014347) (0.041845,0.020002) (0.037166,0.041409) (0.027251,0.025252) (0.041590,0.034673) (0.026464,0.037143) (0.052251,0.025252) (0.051464,0.037143)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d2f175c1eec5309a1a01dcd2fd88711b1cdc7402
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.103405e+02 -1.983597e-03 -1.998420e-03
+1.000000e-02 6.197532e+02 -3.952857e-03 -3.982405e-03
+1.500000e-02 9.282441e+02 -5.907945e-03 -5.952118e-03
+2.000000e-02 1.235819e+03 -7.849028e-03 -7.907730e-03
+2.500000e-02 1.542483e+03 -9.776426e-03 -9.849551e-03
+3.000000e-02 1.848195e+03 -1.169377e-02 -1.178111e-02
+3.500000e-02 2.152600e+03 -1.362902e-02 -1.373118e-02
+4.000000e-02 2.455361e+03 -1.561219e-02 -1.573195e-02
+4.500000e-02 2.757020e+03 -1.760893e-02 -1.774758e-02
+5.000000e-02 3.057852e+03 -1.960082e-02 -1.975874e-02
+5.500000e-02 3.357912e+03 -2.158490e-02 -2.176232e-02
+6.000000e-02 3.657224e+03 -2.356050e-02 -2.375763e-02
+6.500000e-02 3.955806e+03 -2.552723e-02 -2.574426e-02
+7.000000e-02 4.253675e+03 -2.748476e-02 -2.772186e-02
+7.500000e-02 4.550846e+03 -2.943279e-02 -2.969012e-02
+8.000000e-02 4.847331e+03 -3.137106e-02 -3.164876e-02
+8.500000e-02 5.143145e+03 -3.329932e-02 -3.359752e-02
+9.000000e-02 5.438297e+03 -3.521740e-02 -3.553622e-02
+9.500000e-02 5.732799e+03 -3.712508e-02 -3.746462e-02
+1.000000e-01 6.026663e+03 -3.902234e-02 -3.938270e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.019701,0.042746) (0.007984,0.018078) (0.017744,0.032469) (0.002956,0.033442) (0.007795,0.044074) (0.000659,0.009909) (0.015410,0.023308) (0.017907,0.010733) (0.009938,0.004512) (0.000663,0.025886) (0.044701,0.042746) (0.032984,0.018078) (0.042744,0.032469) (0.027956,0.033442) (0.032795,0.044074) (0.025659,0.009909) (0.040410,0.023308) (0.042907,0.010733) (0.034938,0.004512) (0.025663,0.025886) (0.052956,0.033442) (0.050659,0.009909) (0.050663,0.025886)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cd533a4adfc2e4980359827b2bbcea353d7e5bfa
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.253522e+00
+1.000000e-02 1.223874e+01
+1.500000e-02 1.700549e+01
+2.000000e-02 1.997315e+01
+2.500000e-02 2.170517e+01
+3.000000e-02 2.267044e+01
+3.500000e-02 2.324036e+01
+4.000000e-02 2.359532e+01
+4.500000e-02 2.381432e+01
+5.000000e-02 2.393781e+01
+5.500000e-02 2.398655e+01
+6.000000e-02 2.397004e+01
+6.500000e-02 2.389116e+01
+7.000000e-02 2.378297e+01
+7.500000e-02 2.371044e+01
+8.000000e-02 2.370203e+01
+8.500000e-02 2.373904e+01
+9.000000e-02 2.378273e+01
+9.500000e-02 2.381176e+01
+1.000000e-01 2.381935e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.019701,0.042746) (0.007984,0.018078) (0.017744,0.032469) (0.002956,0.033442) (0.007795,0.044074) (0.000659,0.009909) (0.015410,0.023308) (0.017907,0.010733) (0.009938,0.004512) (0.000663,0.025886) (0.044701,0.042746) (0.032984,0.018078) (0.042744,0.032469) (0.027956,0.033442) (0.032795,0.044074) (0.025659,0.009909) (0.040410,0.023308) (0.042907,0.010733) (0.034938,0.004512) (0.025663,0.025886) (0.052956,0.033442) (0.050659,0.009909) (0.050663,0.025886)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..05f5e242b4461e3642ed3c98493432b8787d3ace
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.109866e+01 -7.095280e-05 -3.742112e-03
+1.000000e-02 2.210879e+01 -1.410129e-04 -7.455884e-03
+1.500000e-02 3.235905e+01 -2.062412e-04 -1.120742e-02
+2.000000e-02 3.974062e+01 -2.545526e-04 -1.520067e-02
+2.500000e-02 4.424413e+01 -2.855720e-04 -1.945628e-02
+3.000000e-02 4.701730e+01 -3.057433e-04 -2.386370e-02
+3.500000e-02 4.875839e+01 -3.190492e-04 -2.834869e-02
+4.000000e-02 4.982342e+01 -3.276764e-04 -3.287089e-02
+4.500000e-02 5.041632e+01 -3.329583e-04 -3.740643e-02
+5.000000e-02 5.067370e+01 -3.357717e-04 -4.194008e-02
+5.500000e-02 5.070358e+01 -3.368768e-04 -4.645918e-02
+6.000000e-02 5.059100e+01 -3.368709e-04 -5.095404e-02
+6.500000e-02 5.040736e+01 -3.362580e-04 -5.541666e-02
+7.000000e-02 5.021058e+01 -3.354482e-04 -5.984073e-02
+7.500000e-02 5.003904e+01 -3.347179e-04 -6.422224e-02
+8.000000e-02 4.990898e+01 -3.341916e-04 -6.855975e-02
+8.500000e-02 4.982042e+01 -3.338804e-04 -7.285373e-02
+9.000000e-02 4.977406e+01 -3.338209e-04 -7.710416e-02
+9.500000e-02 4.975331e+01 -3.338506e-04 -8.131428e-02
+1.000000e-01 4.977371e+01 -3.341409e-04 -8.548192e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.019701,0.042746) (0.007984,0.018078) (0.017744,0.032469) (0.002956,0.033442) (0.007795,0.044074) (0.000659,0.009909) (0.015410,0.023308) (0.017907,0.010733) (0.009938,0.004512) (0.000663,0.025886) (0.044701,0.042746) (0.032984,0.018078) (0.042744,0.032469) (0.027956,0.033442) (0.032795,0.044074) (0.025659,0.009909) (0.040410,0.023308) (0.042907,0.010733) (0.034938,0.004512) (0.025663,0.025886) (0.052956,0.033442) (0.050659,0.009909) (0.050663,0.025886)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ad09b9218f92be0842b479ff86780e2ff5f70681
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.103580e+02 -2.000431e-03 -1.984946e-03
+1.000000e-02 6.197902e+02 -3.986456e-03 -3.955481e-03
+1.500000e-02 9.283028e+02 -5.958242e-03 -5.911771e-03
+2.000000e-02 1.235902e+03 -7.915955e-03 -7.853984e-03
+2.500000e-02 1.542591e+03 -9.859903e-03 -9.782437e-03
+3.000000e-02 1.848331e+03 -1.179353e-02 -1.170070e-02
+3.500000e-02 2.152764e+03 -1.374505e-02 -1.363695e-02
+4.000000e-02 2.455555e+03 -1.574776e-02 -1.562063e-02
+4.500000e-02 2.757245e+03 -1.776615e-02 -1.761695e-02
+5.000000e-02 3.058109e+03 -1.978027e-02 -1.960805e-02
+5.500000e-02 3.358203e+03 -2.178689e-02 -2.159111e-02
+6.000000e-02 3.657550e+03 -2.378529e-02 -2.356548e-02
+6.500000e-02 3.956168e+03 -2.577506e-02 -2.553079e-02
+7.000000e-02 4.254073e+03 -2.775586e-02 -2.748672e-02
+7.500000e-02 4.551280e+03 -2.972736e-02 -2.943298e-02
+8.000000e-02 4.847803e+03 -3.168930e-02 -3.136932e-02
+8.500000e-02 5.143655e+03 -3.364144e-02 -3.329554e-02
+9.000000e-02 5.438845e+03 -3.558348e-02 -3.521136e-02
+9.500000e-02 5.733386e+03 -3.751533e-02 -3.711671e-02
+1.000000e-01 6.027285e+03 -3.943674e-02 -3.901136e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.001457,0.031936) (0.013897,0.019972) (0.014197,0.043216) (0.004526,0.021493) (0.001838,0.006664) (0.015351,0.032482) (0.013795,0.005512) (0.001459,0.042850) (0.007504,0.013412) (0.020671,0.012612) (0.026457,0.031936) (0.038897,0.019972) (0.039197,0.043216) (0.029526,0.021493) (0.026838,0.006664) (0.040351,0.032482) (0.038795,0.005512) (0.026459,0.042850) (0.032504,0.013412) (0.045671,0.012612) (0.051457,0.031936) (0.051838,0.006664) (0.051459,0.042850)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..54565ad1cc9d72994b7f70b133cd527632ad1ebd
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.121002e+00
+1.000000e-02 1.220615e+01
+1.500000e-02 1.713146e+01
+2.000000e-02 2.013668e+01
+2.500000e-02 2.182119e+01
+3.000000e-02 2.274048e+01
+3.500000e-02 2.328188e+01
+4.000000e-02 2.361169e+01
+4.500000e-02 2.381259e+01
+5.000000e-02 2.392960e+01
+5.500000e-02 2.397975e+01
+6.000000e-02 2.397586e+01
+6.500000e-02 2.391930e+01
+7.000000e-02 2.379820e+01
+7.500000e-02 2.357984e+01
+8.000000e-02 2.326312e+01
+8.500000e-02 2.294725e+01
+9.000000e-02 2.277726e+01
+9.500000e-02 2.277661e+01
+1.000000e-01 2.291166e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.001457,0.031936) (0.013897,0.019972) (0.014197,0.043216) (0.004526,0.021493) (0.001838,0.006664) (0.015351,0.032482) (0.013795,0.005512) (0.001459,0.042850) (0.007504,0.013412) (0.020671,0.012612) (0.026457,0.031936) (0.038897,0.019972) (0.039197,0.043216) (0.029526,0.021493) (0.026838,0.006664) (0.040351,0.032482) (0.038795,0.005512) (0.026459,0.042850) (0.032504,0.013412) (0.045671,0.012612) (0.051457,0.031936) (0.051838,0.006664) (0.051459,0.042850)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..068d3252579edc429da48fd9cec341d7a1e62853
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.116420e+01 -7.199091e-05 -3.694288e-03
+1.000000e-02 2.223255e+01 -1.430664e-04 -7.361176e-03
+1.500000e-02 3.251817e+01 -2.091478e-04 -1.107234e-02
+2.000000e-02 3.948674e+01 -2.554141e-04 -1.508899e-02
+2.500000e-02 4.365436e+01 -2.844677e-04 -1.937654e-02
+3.000000e-02 4.629624e+01 -3.036862e-04 -2.379933e-02
+3.500000e-02 4.798773e+01 -3.164765e-04 -2.829329e-02
+4.000000e-02 4.902034e+01 -3.246562e-04 -3.282475e-02
+4.500000e-02 4.957604e+01 -3.294399e-04 -3.737173e-02
+5.000000e-02 4.977856e+01 -3.316475e-04 -4.191988e-02
+5.500000e-02 4.972966e+01 -3.319832e-04 -4.645735e-02
+6.000000e-02 4.951197e+01 -3.310483e-04 -5.097404e-02
+6.500000e-02 4.920132e+01 -3.293462e-04 -5.546180e-02
+7.000000e-02 4.886997e+01 -3.273986e-04 -5.991224e-02
+7.500000e-02 4.857087e+01 -3.255807e-04 -6.431944e-02
+8.000000e-02 4.833122e+01 -3.240829e-04 -6.868068e-02
+8.500000e-02 4.815493e+01 -3.229372e-04 -7.299596e-02
+9.000000e-02 4.805966e+01 -3.223014e-04 -7.726327e-02
+9.500000e-02 4.802834e+01 -3.220532e-04 -8.148520e-02
+1.000000e-01 4.805722e+01 -3.221755e-04 -8.566259e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.001457,0.031936) (0.013897,0.019972) (0.014197,0.043216) (0.004526,0.021493) (0.001838,0.006664) (0.015351,0.032482) (0.013795,0.005512) (0.001459,0.042850) (0.007504,0.013412) (0.020671,0.012612) (0.026457,0.031936) (0.038897,0.019972) (0.039197,0.043216) (0.029526,0.021493) (0.026838,0.006664) (0.040351,0.032482) (0.038795,0.005512) (0.026459,0.042850) (0.032504,0.013412) (0.045671,0.012612) (0.051457,0.031936) (0.051838,0.006664) (0.051459,0.042850)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..38d26318b63c9ccae7ea36b3c6eab72a7accb1d0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.103734e+02 -2.018920e-03 -1.962273e-03
+1.000000e-02 6.198182e+02 -4.023355e-03 -3.910272e-03
+1.500000e-02 9.283407e+02 -6.013468e-03 -5.844161e-03
+2.000000e-02 1.235947e+03 -7.989429e-03 -7.764107e-03
+2.500000e-02 1.542641e+03 -9.951546e-03 -9.670436e-03
+3.000000e-02 1.848382e+03 -1.190332e-02 -1.156684e-02
+3.500000e-02 2.152817e+03 -1.387476e-02 -1.348015e-02
+4.000000e-02 2.455608e+03 -1.590234e-02 -1.543595e-02
+4.500000e-02 2.757296e+03 -1.794814e-02 -1.740201e-02
+5.000000e-02 3.058156e+03 -1.999070e-02 -1.936202e-02
+5.500000e-02 3.358244e+03 -2.202653e-02 -2.131341e-02
+6.000000e-02 3.657585e+03 -2.405486e-02 -2.325557e-02
+6.500000e-02 3.956194e+03 -2.607524e-02 -2.518816e-02
+7.000000e-02 4.254091e+03 -2.808728e-02 -2.711087e-02
+7.500000e-02 4.551288e+03 -3.009064e-02 -2.902346e-02
+8.000000e-02 4.847801e+03 -3.208498e-02 -3.092570e-02
+8.500000e-02 5.143642e+03 -3.407005e-02 -3.281738e-02
+9.000000e-02 5.438821e+03 -3.604556e-02 -3.469832e-02
+9.500000e-02 5.733350e+03 -3.801134e-02 -3.656842e-02
+1.000000e-01 6.027237e+03 -3.996705e-02 -3.842745e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.004899,0.030396) (0.002636,0.043127) (0.016469,0.018543) (0.008650,0.014169) (0.009588,0.004385) (0.015648,0.034111) (0.017890,0.044037) (0.020329,0.010422) (0.000172,0.020451) (0.014979,0.026429) (0.029899,0.030396) (0.027636,0.043127) (0.041469,0.018543) (0.033650,0.014169) (0.034588,0.004385) (0.040648,0.034111) (0.042890,0.044037) (0.045329,0.010422) (0.025172,0.020451) (0.039979,0.026429) (0.052636,0.043127) (0.050172,0.020451)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b57533b525999e0ddb2eb83285a8b82c0be8dcc3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.030158e+00
+1.000000e-02 1.196007e+01
+1.500000e-02 1.677821e+01
+2.000000e-02 1.987920e+01
+2.500000e-02 2.163121e+01
+3.000000e-02 2.261580e+01
+3.500000e-02 2.320591e+01
+4.000000e-02 2.356411e+01
+4.500000e-02 2.377899e+01
+5.000000e-02 2.388022e+01
+5.500000e-02 2.389875e+01
+6.000000e-02 2.385025e+01
+6.500000e-02 2.374457e+01
+7.000000e-02 2.358812e+01
+7.500000e-02 2.338832e+01
+8.000000e-02 2.319568e+01
+8.500000e-02 2.310486e+01
+9.000000e-02 2.311594e+01
+9.500000e-02 2.315783e+01
+1.000000e-01 2.318155e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.004899,0.030396) (0.002636,0.043127) (0.016469,0.018543) (0.008650,0.014169) (0.009588,0.004385) (0.015648,0.034111) (0.017890,0.044037) (0.020329,0.010422) (0.000172,0.020451) (0.014979,0.026429) (0.029899,0.030396) (0.027636,0.043127) (0.041469,0.018543) (0.033650,0.014169) (0.034588,0.004385) (0.040648,0.034111) (0.042890,0.044037) (0.045329,0.010422) (0.025172,0.020451) (0.039979,0.026429) (0.052636,0.043127) (0.050172,0.020451)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..796d4a422718e0c2693137dc9fa1ffc93826831a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.187155e+01 -7.729820e-05 -3.566429e-03
+1.000000e-02 2.362661e+01 -1.535968e-04 -7.110031e-03
+1.500000e-02 3.440330e+01 -2.233846e-04 -1.073724e-02
+2.000000e-02 4.217809e+01 -2.748197e-04 -1.466038e-02
+2.500000e-02 4.702473e+01 -3.084505e-04 -1.886907e-02
+3.000000e-02 5.008096e+01 -3.308067e-04 -2.324054e-02
+3.500000e-02 5.201357e+01 -3.457591e-04 -2.770212e-02
+4.000000e-02 5.321223e+01 -3.556303e-04 -3.221054e-02
+4.500000e-02 5.392149e+01 -3.619614e-04 -3.673778e-02
+5.000000e-02 5.432183e+01 -3.659711e-04 -4.126223e-02
+5.500000e-02 5.454216e+01 -3.685381e-04 -4.576868e-02
+6.000000e-02 5.467485e+01 -3.703425e-04 -5.024556e-02
+6.500000e-02 5.476755e+01 -3.717253e-04 -5.468728e-02
+7.000000e-02 5.485790e+01 -3.730424e-04 -5.908812e-02
+7.500000e-02 5.493724e+01 -3.741761e-04 -6.345057e-02
+8.000000e-02 5.502105e+01 -3.752856e-04 -6.777231e-02
+8.500000e-02 5.511212e+01 -3.764048e-04 -7.205321e-02
+9.000000e-02 5.521157e+01 -3.775512e-04 -7.629346e-02
+9.500000e-02 5.532016e+01 -3.787373e-04 -8.049334e-02
+1.000000e-01 5.543851e+01 -3.799719e-04 -8.465323e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.004899,0.030396) (0.002636,0.043127) (0.016469,0.018543) (0.008650,0.014169) (0.009588,0.004385) (0.015648,0.034111) (0.017890,0.044037) (0.020329,0.010422) (0.000172,0.020451) (0.014979,0.026429) (0.029899,0.030396) (0.027636,0.043127) (0.041469,0.018543) (0.033650,0.014169) (0.034588,0.004385) (0.040648,0.034111) (0.042890,0.044037) (0.045329,0.010422) (0.025172,0.020451) (0.039979,0.026429) (0.052636,0.043127) (0.050172,0.020451)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..51f1ee9e11dba6812281398779c276a9e88b085b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.103581e+02 -2.007007e-03 -1.975754e-03
+1.000000e-02 6.197888e+02 -3.999537e-03 -3.937203e-03
+1.500000e-02 9.282981e+02 -5.977754e-03 -5.884511e-03
+2.000000e-02 1.235892e+03 -7.941829e-03 -7.817846e-03
+2.500000e-02 1.542575e+03 -9.892074e-03 -9.737524e-03
+3.000000e-02 1.848306e+03 -1.183206e-02 -1.164710e-02
+3.500000e-02 2.152731e+03 -1.379093e-02 -1.357421e-02
+4.000000e-02 2.455513e+03 -1.580227e-02 -1.554750e-02
+4.500000e-02 2.757192e+03 -1.782962e-02 -1.753316e-02
+5.000000e-02 3.058045e+03 -1.985287e-02 -1.951354e-02
+5.500000e-02 3.358127e+03 -2.186880e-02 -2.148584e-02
+6.000000e-02 3.657460e+03 -2.387666e-02 -2.344942e-02
+6.500000e-02 3.956064e+03 -2.587603e-02 -2.540390e-02
+7.000000e-02 4.253955e+03 -2.786655e-02 -2.734897e-02
+7.500000e-02 4.551148e+03 -2.984791e-02 -2.928433e-02
+8.000000e-02 4.847656e+03 -3.181981e-02 -3.120975e-02
+8.500000e-02 5.143492e+03 -3.378200e-02 -3.312501e-02
+9.000000e-02 5.438667e+03 -3.573422e-02 -3.502988e-02
+9.500000e-02 5.733191e+03 -3.767632e-02 -3.692424e-02
+1.000000e-01 6.027075e+03 -3.960804e-02 -3.880787e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.011053,0.019840) (0.019166,0.041008) (0.012895,0.005806) (0.001433,0.026533) (0.008868,0.045590) (0.015820,0.027015) (0.001486,0.013381) (0.010492,0.034266) (0.016607,0.012729) (0.002452,0.004428) (0.036053,0.019840) (0.044166,0.041008) (0.037895,0.005806) (0.026433,0.026533) (0.033868,0.045590) (0.040820,0.027015) (0.026486,0.013381) (0.035492,0.034266) (0.041607,0.012729) (0.027452,0.004428) (0.051433,0.026533) (0.051486,0.013381) (0.052452,0.004428)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71ea0958b7f7a2fd768ccc7a8936803165ae74cf
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.029630e+00
+1.000000e-02 1.199138e+01
+1.500000e-02 1.690074e+01
+2.000000e-02 2.004015e+01
+2.500000e-02 2.178549e+01
+3.000000e-02 2.275396e+01
+3.500000e-02 2.332629e+01
+4.000000e-02 2.366855e+01
+4.500000e-02 2.386170e+01
+5.000000e-02 2.393315e+01
+5.500000e-02 2.390496e+01
+6.000000e-02 2.376400e+01
+6.500000e-02 2.338714e+01
+7.000000e-02 2.285845e+01
+7.500000e-02 2.265819e+01
+8.000000e-02 2.276024e+01
+8.500000e-02 2.300672e+01
+9.000000e-02 2.329645e+01
+9.500000e-02 2.353887e+01
+1.000000e-01 2.368718e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.011053,0.019840) (0.019166,0.041008) (0.012895,0.005806) (0.001433,0.026533) (0.008868,0.045590) (0.015820,0.027015) (0.001486,0.013381) (0.010492,0.034266) (0.016607,0.012729) (0.002452,0.004428) (0.036053,0.019840) (0.044166,0.041008) (0.037895,0.005806) (0.026433,0.026533) (0.033868,0.045590) (0.040820,0.027015) (0.026486,0.013381) (0.035492,0.034266) (0.041607,0.012729) (0.027452,0.004428) (0.051433,0.026533) (0.051486,0.013381) (0.052452,0.004428)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0912d2cb152cdc5a6ccfbdf77045a3b7ab45e232
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.090044e+01 -7.051271e-05 -3.709587e-03
+1.000000e-02 2.169341e+01 -1.400080e-04 -7.394588e-03
+1.500000e-02 3.173206e+01 -2.044606e-04 -1.113136e-02
+2.000000e-02 3.924843e+01 -2.535873e-04 -1.510171e-02
+2.500000e-02 4.409086e+01 -2.866596e-04 -1.932073e-02
+3.000000e-02 4.711169e+01 -3.085425e-04 -2.370032e-02
+3.500000e-02 4.906340e+01 -3.235371e-04 -2.816029e-02
+4.000000e-02 5.034105e+01 -3.339285e-04 -3.265724e-02
+4.500000e-02 5.115259e+01 -3.409930e-04 -3.716751e-02
+5.000000e-02 5.162402e+01 -3.455522e-04 -4.167668e-02
+5.500000e-02 5.184645e+01 -3.482254e-04 -4.617437e-02
+6.000000e-02 5.189294e+01 -3.495234e-04 -5.065232e-02
+6.500000e-02 5.182414e+01 -3.498786e-04 -5.510370e-02
+7.000000e-02 5.168871e+01 -3.496429e-04 -5.952311e-02
+7.500000e-02 5.152261e+01 -3.490818e-04 -6.390665e-02
+8.000000e-02 5.135893e+01 -3.484621e-04 -6.825052e-02
+8.500000e-02 5.119355e+01 -3.477274e-04 -7.255611e-02
+9.000000e-02 5.104383e+01 -3.470320e-04 -7.682156e-02
+9.500000e-02 5.091337e+01 -3.464098e-04 -8.104689e-02
+1.000000e-01 5.080309e+01 -3.458748e-04 -8.523245e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.011053,0.019840) (0.019166,0.041008) (0.012895,0.005806) (0.001433,0.026533) (0.008868,0.045590) (0.015820,0.027015) (0.001486,0.013381) (0.010492,0.034266) (0.016607,0.012729) (0.002452,0.004428) (0.036053,0.019840) (0.044166,0.041008) (0.037895,0.005806) (0.026433,0.026533) (0.033868,0.045590) (0.040820,0.027015) (0.026486,0.013381) (0.035492,0.034266) (0.041607,0.012729) (0.027452,0.004428) (0.051433,0.026533) (0.051486,0.013381) (0.052452,0.004428)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cbec9d3695c96cd61aa16deb05a554eee8bb0981
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.103384e+02 -2.009885e-03 -1.973678e-03
+1.000000e-02 6.197499e+02 -4.005291e-03 -3.933044e-03
+1.500000e-02 9.282407e+02 -5.986384e-03 -5.878262e-03
+2.000000e-02 1.235817e+03 -7.953332e-03 -7.809500e-03
+2.500000e-02 1.542482e+03 -9.906446e-03 -9.727074e-03
+3.000000e-02 1.848197e+03 -1.184924e-02 -1.163455e-02
+3.500000e-02 2.152605e+03 -1.381074e-02 -1.355949e-02
+4.000000e-02 2.455370e+03 -1.582525e-02 -1.553003e-02
+4.500000e-02 2.757033e+03 -1.785624e-02 -1.751249e-02
+5.000000e-02 3.057870e+03 -1.988323e-02 -1.948955e-02
+5.500000e-02 3.357936e+03 -2.190290e-02 -2.145846e-02
+6.000000e-02 3.657254e+03 -2.391452e-02 -2.341860e-02
+6.500000e-02 3.955842e+03 -2.591766e-02 -2.536961e-02
+7.000000e-02 4.253718e+03 -2.791194e-02 -2.731117e-02
+7.500000e-02 4.550895e+03 -2.989705e-02 -2.924301e-02
+8.000000e-02 4.847388e+03 -3.187269e-02 -3.116489e-02
+8.500000e-02 5.143209e+03 -3.383858e-02 -3.307659e-02
+9.000000e-02 5.438369e+03 -3.579452e-02 -3.497793e-02
+9.500000e-02 5.732882e+03 -3.774037e-02 -3.686881e-02
+1.000000e-01 6.026748e+03 -3.967566e-02 -3.874885e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.004975,0.004886) (0.012758,0.031071) (0.015502,0.043503) (0.000185,0.030935) (0.009653,0.011005) (0.001014,0.044432) (0.014367,0.019764) (0.002777,0.021819) (0.020585,0.005643) (0.002194,0.013735) (0.029975,0.004886) (0.037758,0.031071) (0.040502,0.043503) (0.025185,0.030935) (0.034653,0.011005) (0.026014,0.044432) (0.039367,0.019764) (0.027777,0.021819) (0.045585,0.005643) (0.027194,0.013735) (0.050185,0.030935) (0.051014,0.044432) (0.052777,0.021819) (0.052194,0.013735)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71fa5ca70a3557116346d5f400ed4294ec4cd106
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.036773e+00
+1.000000e-02 1.200818e+01
+1.500000e-02 1.692886e+01
+2.000000e-02 2.000512e+01
+2.500000e-02 2.175528e+01
+3.000000e-02 2.275826e+01
+3.500000e-02 2.335088e+01
+4.000000e-02 2.371209e+01
+4.500000e-02 2.392907e+01
+5.000000e-02 2.404729e+01
+5.500000e-02 2.409416e+01
+6.000000e-02 2.407455e+01
+6.500000e-02 2.398950e+01
+7.000000e-02 2.382012e+01
+7.500000e-02 2.356461e+01
+8.000000e-02 2.328551e+01
+8.500000e-02 2.305887e+01
+9.000000e-02 2.295739e+01
+9.500000e-02 2.298364e+01
+1.000000e-01 2.311200e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.004975,0.004886) (0.012758,0.031071) (0.015502,0.043503) (0.000185,0.030935) (0.009653,0.011005) (0.001014,0.044432) (0.014367,0.019764) (0.002777,0.021819) (0.020585,0.005643) (0.002194,0.013735) (0.029975,0.004886) (0.037758,0.031071) (0.040502,0.043503) (0.025185,0.030935) (0.034653,0.011005) (0.026014,0.044432) (0.039367,0.019764) (0.027777,0.021819) (0.045585,0.005643) (0.027194,0.013735) (0.050185,0.030935) (0.051014,0.044432) (0.052777,0.021819) (0.052194,0.013735)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9697b9ec826d9f4f4f2cec7a36f43494dce437c2
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.3079_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.173485e+01 -7.606536e-05 -3.604905e-03
+1.000000e-02 2.332333e+01 -1.509477e-04 -7.188129e-03
+1.500000e-02 3.381074e+01 -2.188054e-04 -1.085465e-02
+2.000000e-02 4.118395e+01 -2.680018e-04 -1.480861e-02
+2.500000e-02 4.576106e+01 -3.004368e-04 -1.901906e-02
+3.000000e-02 4.868941e+01 -3.223608e-04 -2.338169e-02
+3.500000e-02 5.060480e+01 -3.374502e-04 -2.782854e-02
+4.000000e-02 5.185588e+01 -3.478422e-04 -3.231795e-02
+4.500000e-02 5.265539e+01 -3.549694e-04 -3.682249e-02
+5.000000e-02 5.313775e+01 -3.597463e-04 -4.132526e-02
+5.500000e-02 5.339290e+01 -3.627471e-04 -4.581599e-02
+6.000000e-02 5.348954e+01 -3.644947e-04 -5.028576e-02
+6.500000e-02 5.347883e+01 -3.653661e-04 -5.472833e-02
+7.000000e-02 5.339953e+01 -3.656512e-04 -5.913911e-02
+7.500000e-02 5.328115e+01 -3.655732e-04 -6.351475e-02
+8.000000e-02 5.314614e+01 -3.653022e-04 -6.785288e-02
+8.500000e-02 5.301122e+01 -3.649662e-04 -7.215187e-02
+9.000000e-02 5.288849e+01 -3.646588e-04 -7.641070e-02
+9.500000e-02 5.278629e+01 -3.644460e-04 -8.062882e-02
+1.000000e-01 5.271003e+01 -3.643718e-04 -8.480606e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.004975,0.004886) (0.012758,0.031071) (0.015502,0.043503) (0.000185,0.030935) (0.009653,0.011005) (0.001014,0.044432) (0.014367,0.019764) (0.002777,0.021819) (0.020585,0.005643) (0.002194,0.013735) (0.029975,0.004886) (0.037758,0.031071) (0.040502,0.043503) (0.025185,0.030935) (0.034653,0.011005) (0.026014,0.044432) (0.039367,0.019764) (0.027777,0.021819) (0.045585,0.005643) (0.027194,0.013735) (0.050185,0.030935) (0.051014,0.044432) (0.052777,0.021819) (0.052194,0.013735)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1f4b77ae75efd7df4e391c6f94d5c7500287e818
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.020382e+02 -1.906188e-03 -1.928834e-03
+1.000000e-02 8.027559e+02 -3.798734e-03 -3.844014e-03
+1.500000e-02 1.202163e+03 -5.677794e-03 -5.745698e-03
+2.000000e-02 1.600268e+03 -7.543527e-03 -7.634042e-03
+2.500000e-02 1.997079e+03 -9.396247e-03 -9.509326e-03
+3.000000e-02 2.392569e+03 -1.123955e-02 -1.137459e-02
+3.500000e-02 2.786473e+03 -1.309870e-02 -1.325518e-02
+4.000000e-02 3.178561e+03 -1.499694e-02 -1.518102e-02
+4.500000e-02 3.569278e+03 -1.690471e-02 -1.712060e-02
+5.000000e-02 3.958853e+03 -1.880695e-02 -1.905600e-02
+5.500000e-02 4.347337e+03 -2.070124e-02 -2.098431e-02
+6.000000e-02 4.734755e+03 -2.258702e-02 -2.290488e-02
+6.500000e-02 5.121127e+03 -2.446394e-02 -2.481733e-02
+7.000000e-02 5.506473e+03 -2.633170e-02 -2.672135e-02
+7.500000e-02 5.890810e+03 -2.819006e-02 -2.861665e-02
+8.000000e-02 6.274154e+03 -3.003878e-02 -3.050297e-02
+8.500000e-02 6.656519e+03 -3.187766e-02 -3.238005e-02
+9.000000e-02 7.037919e+03 -3.370651e-02 -3.424779e-02
+9.500000e-02 7.418366e+03 -3.552518e-02 -3.610588e-02
+1.000000e-01 7.797871e+03 -3.733355e-02 -3.795427e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.006208,0.009898) (0.010559,0.037626) (0.009958,0.017931) (0.001900,0.032000) (0.015525,0.008074) (0.014489,0.027594) (0.007187,0.044826) (0.017275,0.044136) (0.000008,0.004774) (0.000705,0.017612) (0.000615,0.039995) (0.005887,0.024722) (0.017262,0.020381) (0.031208,0.009898) (0.035559,0.037626) (0.034958,0.017931) (0.026900,0.032000) (0.040525,0.008074) (0.039489,0.027594) (0.032187,0.044826) (0.042275,0.044136) (0.025008,0.004774) (0.025705,0.017612) (0.025615,0.039995) (0.030887,0.024722) (0.042262,0.020381) (0.051900,0.032000) (0.050008,0.004774) (0.050705,0.017612) (0.050615,0.039995)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ab4181af4844984e08775b3380d0d26e2df70c9a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.933366e+00
+1.000000e-02 1.492240e+01
+1.500000e-02 1.945836e+01
+2.000000e-02 2.195662e+01
+2.500000e-02 2.321301e+01
+3.000000e-02 2.383368e+01
+3.500000e-02 2.411111e+01
+4.000000e-02 2.417650e+01
+4.500000e-02 2.410677e+01
+5.000000e-02 2.394235e+01
+5.500000e-02 2.374419e+01
+6.000000e-02 2.359025e+01
+6.500000e-02 2.354153e+01
+7.000000e-02 2.358408e+01
+7.500000e-02 2.368458e+01
+8.000000e-02 2.381820e+01
+8.500000e-02 2.397361e+01
+9.000000e-02 2.415178e+01
+9.500000e-02 2.434046e+01
+1.000000e-01 2.452872e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.006208,0.009898) (0.010559,0.037626) (0.009958,0.017931) (0.001900,0.032000) (0.015525,0.008074) (0.014489,0.027594) (0.007187,0.044826) (0.017275,0.044136) (0.000008,0.004774) (0.000705,0.017612) (0.000615,0.039995) (0.005887,0.024722) (0.017262,0.020381) (0.031208,0.009898) (0.035559,0.037626) (0.034958,0.017931) (0.026900,0.032000) (0.040525,0.008074) (0.039489,0.027594) (0.032187,0.044826) (0.042275,0.044136) (0.025008,0.004774) (0.025705,0.017612) (0.025615,0.039995) (0.030887,0.024722) (0.042262,0.020381) (0.051900,0.032000) (0.050008,0.004774) (0.050705,0.017612) (0.050615,0.039995)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..64a12861dc35e1f168f1be432930d90643199c22
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.449865e+01 -6.880558e-05 -3.620365e-03
+1.000000e-02 2.832396e+01 -1.345105e-04 -7.245779e-03
+1.500000e-02 3.908358e+01 -1.868320e-04 -1.105455e-02
+2.000000e-02 4.577502e+01 -2.207676e-04 -1.517837e-02
+2.500000e-02 4.975701e+01 -2.419339e-04 -1.952667e-02
+3.000000e-02 5.212494e+01 -2.552983e-04 -2.399601e-02
+3.500000e-02 5.352429e+01 -2.637363e-04 -2.852570e-02
+4.000000e-02 5.433380e+01 -2.690460e-04 -3.307795e-02
+4.500000e-02 5.479229e+01 -2.723843e-04 -3.762961e-02
+5.000000e-02 5.506559e+01 -2.746234e-04 -4.216348e-02
+5.500000e-02 5.526302e+01 -2.762841e-04 -4.666878e-02
+6.000000e-02 5.544683e+01 -2.777439e-04 -5.113751e-02
+6.500000e-02 5.564626e+01 -2.791840e-04 -5.556552e-02
+7.000000e-02 5.586975e+01 -2.806750e-04 -5.995102e-02
+7.500000e-02 5.611519e+01 -2.822276e-04 -6.429367e-02
+8.000000e-02 5.638012e+01 -2.838769e-04 -6.859297e-02
+8.500000e-02 5.665113e+01 -2.854893e-04 -7.285152e-02
+9.000000e-02 5.694249e+01 -2.871630e-04 -7.706803e-02
+9.500000e-02 5.721789e+01 -2.888000e-04 -8.124468e-02
+1.000000e-01 5.750073e+01 -2.904181e-04 -8.538164e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.006208,0.009898) (0.010559,0.037626) (0.009958,0.017931) (0.001900,0.032000) (0.015525,0.008074) (0.014489,0.027594) (0.007187,0.044826) (0.017275,0.044136) (0.000008,0.004774) (0.000705,0.017612) (0.000615,0.039995) (0.005887,0.024722) (0.017262,0.020381) (0.031208,0.009898) (0.035559,0.037626) (0.034958,0.017931) (0.026900,0.032000) (0.040525,0.008074) (0.039489,0.027594) (0.032187,0.044826) (0.042275,0.044136) (0.025008,0.004774) (0.025705,0.017612) (0.025615,0.039995) (0.030887,0.024722) (0.042262,0.020381) (0.051900,0.032000) (0.050008,0.004774) (0.050705,0.017612) (0.050615,0.039995)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9e6fbbba04b64d07b0447c90b88c611b2302e194
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.020162e+02 -1.923122e-03 -1.906172e-03
+1.000000e-02 8.027072e+02 -3.832586e-03 -3.798779e-03
+1.500000e-02 1.202083e+03 -5.728548e-03 -5.677979e-03
+2.000000e-02 1.600152e+03 -7.611167e-03 -7.543927e-03
+2.500000e-02 1.996923e+03 -9.480761e-03 -9.396916e-03
+3.000000e-02 2.392368e+03 -1.134103e-02 -1.124020e-02
+3.500000e-02 2.786226e+03 -1.321821e-02 -1.309853e-02
+4.000000e-02 3.178266e+03 -1.513893e-02 -1.499745e-02
+4.500000e-02 3.568931e+03 -1.707233e-02 -1.690715e-02
+5.000000e-02 3.958451e+03 -1.900142e-02 -1.881176e-02
+5.500000e-02 4.346876e+03 -2.092339e-02 -2.070869e-02
+6.000000e-02 4.734233e+03 -2.283761e-02 -2.259737e-02
+6.500000e-02 5.120542e+03 -2.474369e-02 -2.447742e-02
+7.000000e-02 5.505824e+03 -2.664131e-02 -2.634857e-02
+7.500000e-02 5.890095e+03 -2.853019e-02 -2.821053e-02
+8.000000e-02 6.273372e+03 -3.041006e-02 -3.006308e-02
+8.500000e-02 6.655669e+03 -3.228069e-02 -3.190600e-02
+9.000000e-02 7.037000e+03 -3.414187e-02 -3.373907e-02
+9.500000e-02 7.417380e+03 -3.599357e-02 -3.556231e-02
+1.000000e-01 7.796811e+03 -3.783515e-02 -3.737527e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.008001,0.011806) (0.016178,0.016453) (0.003354,0.028396) (0.008697,0.038703) (0.011320,0.023485) (0.000851,0.017942) (0.018432,0.005149) (0.005557,0.004257) (0.000218,0.036403) (0.002128,0.045598) (0.017285,0.035741) (0.018446,0.043652) (0.010903,0.031219) (0.033001,0.011806) (0.041178,0.016453) (0.028354,0.028396) (0.033697,0.038703) (0.036320,0.023485) (0.025851,0.017942) (0.043432,0.005149) (0.030557,0.004257) (0.025218,0.036403) (0.027128,0.045598) (0.042285,0.035741) (0.043446,0.043652) (0.035903,0.031219) (0.053354,0.028396) (0.050851,0.017942) (0.050218,0.036403) (0.052128,0.045598)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b3f2642571f05ce8f9415533f26cb7fb4d87dabe
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.915629e+00
+1.000000e-02 1.465198e+01
+1.500000e-02 1.919255e+01
+2.000000e-02 2.171770e+01
+2.500000e-02 2.293046e+01
+3.000000e-02 2.352835e+01
+3.500000e-02 2.382452e+01
+4.000000e-02 2.395935e+01
+4.500000e-02 2.399978e+01
+5.000000e-02 2.396549e+01
+5.500000e-02 2.384615e+01
+6.000000e-02 2.367075e+01
+6.500000e-02 2.359417e+01
+7.000000e-02 2.367480e+01
+7.500000e-02 2.383749e+01
+8.000000e-02 2.399851e+01
+8.500000e-02 2.412493e+01
+9.000000e-02 2.422524e+01
+9.500000e-02 2.430927e+01
+1.000000e-01 2.439049e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.008001,0.011806) (0.016178,0.016453) (0.003354,0.028396) (0.008697,0.038703) (0.011320,0.023485) (0.000851,0.017942) (0.018432,0.005149) (0.005557,0.004257) (0.000218,0.036403) (0.002128,0.045598) (0.017285,0.035741) (0.018446,0.043652) (0.010903,0.031219) (0.033001,0.011806) (0.041178,0.016453) (0.028354,0.028396) (0.033697,0.038703) (0.036320,0.023485) (0.025851,0.017942) (0.043432,0.005149) (0.030557,0.004257) (0.025218,0.036403) (0.027128,0.045598) (0.042285,0.035741) (0.043446,0.043652) (0.035903,0.031219) (0.053354,0.028396) (0.050851,0.017942) (0.050218,0.036403) (0.052128,0.045598)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4f1d5ac6a099adcc0b3d591fe624715c23d0a688
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.572529e+01 -7.535923e-05 -3.448395e-03
+1.000000e-02 3.053514e+01 -1.466699e-04 -6.918570e-03
+1.500000e-02 4.220170e+01 -2.038128e-04 -1.060934e-02
+2.000000e-02 4.951490e+01 -2.408475e-04 -1.468046e-02
+2.500000e-02 5.373070e+01 -2.634114e-04 -1.901780e-02
+3.000000e-02 5.632425e+01 -2.779657e-04 -2.348299e-02
+3.500000e-02 5.797944e+01 -2.877022e-04 -2.800762e-02
+4.000000e-02 5.904532e+01 -2.942944e-04 -3.255549e-02
+4.500000e-02 5.974343e+01 -2.988817e-04 -3.710201e-02
+5.000000e-02 6.022424e+01 -3.022375e-04 -4.163065e-02
+5.500000e-02 6.059731e+01 -3.049491e-04 -4.612921e-02
+6.000000e-02 6.093220e+01 -3.073893e-04 -5.059010e-02
+6.500000e-02 6.127396e+01 -3.098276e-04 -5.500829e-02
+7.000000e-02 6.164620e+01 -3.124072e-04 -5.938153e-02
+7.500000e-02 6.204799e+01 -3.150905e-04 -6.371108e-02
+8.000000e-02 6.248860e+01 -3.179580e-04 -6.799612e-02
+8.500000e-02 6.296838e+01 -3.210160e-04 -7.223724e-02
+9.000000e-02 6.349268e+01 -3.243200e-04 -7.643417e-02
+9.500000e-02 6.404573e+01 -3.277439e-04 -8.058982e-02
+1.000000e-01 6.463136e+01 -3.313346e-04 -8.470405e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.008001,0.011806) (0.016178,0.016453) (0.003354,0.028396) (0.008697,0.038703) (0.011320,0.023485) (0.000851,0.017942) (0.018432,0.005149) (0.005557,0.004257) (0.000218,0.036403) (0.002128,0.045598) (0.017285,0.035741) (0.018446,0.043652) (0.010903,0.031219) (0.033001,0.011806) (0.041178,0.016453) (0.028354,0.028396) (0.033697,0.038703) (0.036320,0.023485) (0.025851,0.017942) (0.043432,0.005149) (0.030557,0.004257) (0.025218,0.036403) (0.027128,0.045598) (0.042285,0.035741) (0.043446,0.043652) (0.035903,0.031219) (0.053354,0.028396) (0.050851,0.017942) (0.050218,0.036403) (0.052128,0.045598)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8bdd5ed6a66f6d4689e530ed775cfbcb84a273b9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.020242e+02 -1.924149e-03 -1.899958e-03
+1.000000e-02 8.027189e+02 -3.834623e-03 -3.786430e-03
+1.500000e-02 1.202094e+03 -5.731577e-03 -5.659570e-03
+2.000000e-02 1.600158e+03 -7.615170e-03 -7.519537e-03
+2.500000e-02 1.996920e+03 -9.485690e-03 -9.366683e-03
+3.000000e-02 2.392353e+03 -1.134647e-02 -1.120509e-02
+3.500000e-02 2.786198e+03 -1.322415e-02 -1.305924e-02
+4.000000e-02 3.178223e+03 -1.514640e-02 -1.495226e-02
+4.500000e-02 3.568867e+03 -1.708146e-02 -1.685609e-02
+5.000000e-02 3.958362e+03 -1.901221e-02 -1.875508e-02
+5.500000e-02 4.346760e+03 -2.093583e-02 -2.064665e-02
+6.000000e-02 4.734088e+03 -2.285166e-02 -2.253021e-02
+6.500000e-02 5.120366e+03 -2.475931e-02 -2.440540e-02
+7.000000e-02 5.505614e+03 -2.665844e-02 -2.627194e-02
+7.500000e-02 5.889850e+03 -2.854877e-02 -2.812956e-02
+8.000000e-02 6.273090e+03 -3.043001e-02 -2.997802e-02
+8.500000e-02 6.655357e+03 -3.230218e-02 -3.181755e-02
+9.000000e-02 7.036640e+03 -3.416417e-02 -3.364669e-02
+9.500000e-02 7.416977e+03 -3.601692e-02 -3.546646e-02
+1.000000e-01 7.796369e+03 -3.785955e-02 -3.727643e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.013346,0.012601) (0.016323,0.029035) (0.015811,0.043383) (0.003426,0.038091) (0.008048,0.044356) (0.002887,0.023364) (0.019672,0.020408) (0.000692,0.007280) (0.016479,0.004227) (0.001491,0.015601) (0.008457,0.004925) (0.000409,0.030925) (0.000250,0.045601) (0.038346,0.012601) (0.041323,0.029035) (0.040811,0.043383) (0.028426,0.038091) (0.033048,0.044356) (0.027887,0.023364) (0.044672,0.020408) (0.025692,0.007280) (0.041479,0.004227) (0.026491,0.015601) (0.033457,0.004925) (0.025409,0.030925) (0.025250,0.045601) (0.053426,0.038091) (0.052887,0.023364) (0.050692,0.007280) (0.051491,0.015601) (0.050409,0.030925) (0.050250,0.045601)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..efdc86e751b6528c99763387cf4027acb8993966
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.945839e+00
+1.000000e-02 1.460343e+01
+1.500000e-02 1.911051e+01
+2.000000e-02 2.165730e+01
+2.500000e-02 2.291173e+01
+3.000000e-02 2.355392e+01
+3.500000e-02 2.389532e+01
+4.000000e-02 2.407090e+01
+4.500000e-02 2.415500e+01
+5.000000e-02 2.415777e+01
+5.500000e-02 2.407755e+01
+6.000000e-02 2.389071e+01
+6.500000e-02 2.364558e+01
+7.000000e-02 2.352278e+01
+7.500000e-02 2.355179e+01
+8.000000e-02 2.362518e+01
+8.500000e-02 2.369502e+01
+9.000000e-02 2.378878e+01
+9.500000e-02 2.392684e+01
+1.000000e-01 2.408365e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.013346,0.012601) (0.016323,0.029035) (0.015811,0.043383) (0.003426,0.038091) (0.008048,0.044356) (0.002887,0.023364) (0.019672,0.020408) (0.000692,0.007280) (0.016479,0.004227) (0.001491,0.015601) (0.008457,0.004925) (0.000409,0.030925) (0.000250,0.045601) (0.038346,0.012601) (0.041323,0.029035) (0.040811,0.043383) (0.028426,0.038091) (0.033048,0.044356) (0.027887,0.023364) (0.044672,0.020408) (0.025692,0.007280) (0.041479,0.004227) (0.026491,0.015601) (0.033457,0.004925) (0.025409,0.030925) (0.025250,0.045601) (0.053426,0.038091) (0.052887,0.023364) (0.050692,0.007280) (0.051491,0.015601) (0.050409,0.030925) (0.050250,0.045601)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e0a56edd57224e8ae1b0615e480a6b307aa41fb1
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.703304e+01 -8.171064e-05 -3.317155e-03
+1.000000e-02 3.255172e+01 -1.566709e-04 -6.710911e-03
+1.500000e-02 4.407061e+01 -2.133715e-04 -1.041110e-02
+2.000000e-02 5.162502e+01 -2.517689e-04 -1.444791e-02
+2.500000e-02 5.617221e+01 -2.762741e-04 -1.873825e-02
+3.000000e-02 5.906031e+01 -2.927725e-04 -2.315668e-02
+3.500000e-02 6.102425e+01 -3.045824e-04 -2.763108e-02
+4.000000e-02 6.242602e+01 -3.134143e-04 -3.212501e-02
+4.500000e-02 6.348082e+01 -3.203154e-04 -3.661671e-02
+5.000000e-02 6.432553e+01 -3.259857e-04 -4.109188e-02
+5.500000e-02 6.505017e+01 -3.309079e-04 -4.554083e-02
+6.000000e-02 6.571340e+01 -3.354084e-04 -4.995712e-02
+6.500000e-02 6.635177e+01 -3.397059e-04 -5.433657e-02
+7.000000e-02 6.699048e+01 -3.439235e-04 -5.867720e-02
+7.500000e-02 6.764311e+01 -3.481557e-04 -6.297750e-02
+8.000000e-02 6.831908e+01 -3.524611e-04 -6.723684e-02
+8.500000e-02 6.902794e+01 -3.569148e-04 -7.145426e-02
+9.000000e-02 6.976665e+01 -3.614727e-04 -7.563124e-02
+9.500000e-02 7.054025e+01 -3.661845e-04 -7.976737e-02
+1.000000e-01 7.134899e+01 -3.710568e-04 -8.386311e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.013346,0.012601) (0.016323,0.029035) (0.015811,0.043383) (0.003426,0.038091) (0.008048,0.044356) (0.002887,0.023364) (0.019672,0.020408) (0.000692,0.007280) (0.016479,0.004227) (0.001491,0.015601) (0.008457,0.004925) (0.000409,0.030925) (0.000250,0.045601) (0.038346,0.012601) (0.041323,0.029035) (0.040811,0.043383) (0.028426,0.038091) (0.033048,0.044356) (0.027887,0.023364) (0.044672,0.020408) (0.025692,0.007280) (0.041479,0.004227) (0.026491,0.015601) (0.033457,0.004925) (0.025409,0.030925) (0.025250,0.045601) (0.053426,0.038091) (0.052887,0.023364) (0.050692,0.007280) (0.051491,0.015601) (0.050409,0.030925) (0.050250,0.045601)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..782893895378904751471ea8b054f640046ed968
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.020445e+02 -1.927473e-03 -1.898502e-03
+1.000000e-02 8.027609e+02 -3.841300e-03 -3.783479e-03
+1.500000e-02 1.202159e+03 -5.741636e-03 -5.655085e-03
+2.000000e-02 1.600248e+03 -7.628638e-03 -7.513479e-03
+2.500000e-02 1.997036e+03 -9.502600e-03 -9.358994e-03
+3.000000e-02 2.392496e+03 -1.136686e-02 -1.119552e-02
+3.500000e-02 2.786368e+03 -1.324780e-02 -1.304797e-02
+4.000000e-02 3.178422e+03 -1.517431e-02 -1.493876e-02
+4.500000e-02 3.569097e+03 -1.711432e-02 -1.683967e-02
+5.000000e-02 3.958626e+03 -1.905023e-02 -1.873547e-02
+5.500000e-02 4.347058e+03 -2.097915e-02 -2.062364e-02
+6.000000e-02 4.734422e+03 -2.290043e-02 -2.250360e-02
+6.500000e-02 5.120737e+03 -2.481367e-02 -2.437500e-02
+7.000000e-02 5.506024e+03 -2.671852e-02 -2.623754e-02
+7.500000e-02 5.890299e+03 -2.861470e-02 -2.809097e-02
+8.000000e-02 6.273580e+03 -3.050192e-02 -2.993506e-02
+8.500000e-02 6.655888e+03 -3.238025e-02 -3.176996e-02
+9.000000e-02 7.037214e+03 -3.424848e-02 -3.359438e-02
+9.500000e-02 7.417594e+03 -3.610754e-02 -3.540924e-02
+1.000000e-01 7.797031e+03 -3.795669e-02 -3.721407e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.016168,0.012562) (0.000731,0.007279) (0.017102,0.042118) (0.016608,0.028169) (0.007164,0.018537) (0.004738,0.039401) (0.001396,0.029459) (0.018032,0.020267) (0.015596,0.004765) (0.012551,0.035838) (0.009165,0.045744) (0.007855,0.004299) (0.000018,0.045689) (0.041168,0.012562) (0.025731,0.007279) (0.042102,0.042118) (0.041608,0.028169) (0.032164,0.018537) (0.029738,0.039401) (0.026396,0.029459) (0.043032,0.020267) (0.040596,0.004765) (0.037551,0.035838) (0.034165,0.045744) (0.032855,0.004299) (0.025018,0.045689) (0.050731,0.007279) (0.051396,0.029459) (0.050018,0.045689)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4cbccc071ba8668af30c02b4101b1020e7916890
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.972294e+00
+1.000000e-02 1.470402e+01
+1.500000e-02 1.921808e+01
+2.000000e-02 2.176527e+01
+2.500000e-02 2.302652e+01
+3.000000e-02 2.367210e+01
+3.500000e-02 2.400433e+01
+4.000000e-02 2.415053e+01
+4.500000e-02 2.415217e+01
+5.000000e-02 2.401810e+01
+5.500000e-02 2.370209e+01
+6.000000e-02 2.322232e+01
+6.500000e-02 2.287721e+01
+7.000000e-02 2.288147e+01
+7.500000e-02 2.313251e+01
+8.000000e-02 2.339354e+01
+8.500000e-02 2.352899e+01
+9.000000e-02 2.361351e+01
+9.500000e-02 2.375242e+01
+1.000000e-01 2.394950e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.016168,0.012562) (0.000731,0.007279) (0.017102,0.042118) (0.016608,0.028169) (0.007164,0.018537) (0.004738,0.039401) (0.001396,0.029459) (0.018032,0.020267) (0.015596,0.004765) (0.012551,0.035838) (0.009165,0.045744) (0.007855,0.004299) (0.000018,0.045689) (0.041168,0.012562) (0.025731,0.007279) (0.042102,0.042118) (0.041608,0.028169) (0.032164,0.018537) (0.029738,0.039401) (0.026396,0.029459) (0.043032,0.020267) (0.040596,0.004765) (0.037551,0.035838) (0.034165,0.045744) (0.032855,0.004299) (0.025018,0.045689) (0.050731,0.007279) (0.051396,0.029459) (0.050018,0.045689)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..38fc5958fe603dbbb5f2d11975eccaacdfa4ac72
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.574748e+01 -7.562141e-05 -3.432271e-03
+1.000000e-02 3.055266e+01 -1.470216e-04 -6.893168e-03
+1.500000e-02 4.198932e+01 -2.031812e-04 -1.059759e-02
+2.000000e-02 4.936880e+01 -2.407810e-04 -1.463957e-02
+2.500000e-02 5.381396e+01 -2.647267e-04 -1.893037e-02
+3.000000e-02 5.652807e+01 -2.802632e-04 -2.336010e-02
+3.500000e-02 5.819527e+01 -2.905227e-04 -2.785817e-02
+4.000000e-02 5.920441e+01 -2.972774e-04 -3.238574e-02
+4.500000e-02 5.981649e+01 -3.018250e-04 -3.691558e-02
+5.000000e-02 6.021573e+01 -3.051021e-04 -4.142859e-02
+5.500000e-02 6.052054e+01 -3.076874e-04 -4.591308e-02
+6.000000e-02 6.079349e+01 -3.099546e-04 -5.036140e-02
+6.500000e-02 6.106648e+01 -3.120974e-04 -5.476966e-02
+7.000000e-02 6.135353e+01 -3.142132e-04 -5.913605e-02
+7.500000e-02 6.165998e+01 -3.163494e-04 -6.345985e-02
+8.000000e-02 6.199058e+01 -3.185827e-04 -6.773984e-02
+8.500000e-02 6.233885e+01 -3.208134e-04 -7.197836e-02
+9.000000e-02 6.270766e+01 -3.231059e-04 -7.617451e-02
+9.500000e-02 6.309722e+01 -3.254694e-04 -8.032849e-02
+1.000000e-01 6.350736e+01 -3.279098e-04 -8.444056e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.016168,0.012562) (0.000731,0.007279) (0.017102,0.042118) (0.016608,0.028169) (0.007164,0.018537) (0.004738,0.039401) (0.001396,0.029459) (0.018032,0.020267) (0.015596,0.004765) (0.012551,0.035838) (0.009165,0.045744) (0.007855,0.004299) (0.000018,0.045689) (0.041168,0.012562) (0.025731,0.007279) (0.042102,0.042118) (0.041608,0.028169) (0.032164,0.018537) (0.029738,0.039401) (0.026396,0.029459) (0.043032,0.020267) (0.040596,0.004765) (0.037551,0.035838) (0.034165,0.045744) (0.032855,0.004299) (0.025018,0.045689) (0.050731,0.007279) (0.051396,0.029459) (0.050018,0.045689)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2edfcea588279fdcc5ba4f300455d7feff9965f0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.020278e+02 -1.918829e-03 -1.919159e-03
+1.000000e-02 8.027375e+02 -3.824005e-03 -3.824640e-03
+1.500000e-02 1.202139e+03 -5.715684e-03 -5.716601e-03
+2.000000e-02 1.600241e+03 -7.594023e-03 -7.595200e-03
+2.500000e-02 1.997051e+03 -9.459315e-03 -9.460730e-03
+3.000000e-02 2.392543e+03 -1.131480e-02 -1.131645e-02
+3.500000e-02 2.786449e+03 -1.318568e-02 -1.318760e-02
+4.000000e-02 3.178541e+03 -1.509898e-02 -1.510085e-02
+4.500000e-02 3.569265e+03 -1.702398e-02 -1.702557e-02
+5.000000e-02 3.958848e+03 -1.894411e-02 -1.894532e-02
+5.500000e-02 4.347342e+03 -2.085668e-02 -2.085747e-02
+6.000000e-02 4.734771e+03 -2.276108e-02 -2.276141e-02
+6.500000e-02 5.121156e+03 -2.465696e-02 -2.465678e-02
+7.000000e-02 5.506516e+03 -2.654401e-02 -2.654328e-02
+7.500000e-02 5.890867e+03 -2.842196e-02 -2.842066e-02
+8.000000e-02 6.274227e+03 -3.029056e-02 -3.028867e-02
+8.500000e-02 6.656609e+03 -3.214959e-02 -3.214709e-02
+9.000000e-02 7.038026e+03 -3.399891e-02 -3.399578e-02
+9.500000e-02 7.418490e+03 -3.583823e-02 -3.583448e-02
+1.000000e-01 7.798014e+03 -3.766752e-02 -3.766314e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.012216,0.020358) (0.002638,0.006389) (0.009346,0.044697) (0.020435,0.044685) (0.019742,0.005130) (0.000949,0.038775) (0.018926,0.012888) (0.002642,0.018601) (0.008046,0.032314) (0.018666,0.028329) (0.001884,0.026631) (0.016722,0.036290) (0.011138,0.012154) (0.037216,0.020358) (0.027638,0.006389) (0.034346,0.044697) (0.045435,0.044685) (0.044742,0.005130) (0.025949,0.038775) (0.043926,0.012888) (0.027642,0.018601) (0.033046,0.032314) (0.043666,0.028329) (0.026884,0.026631) (0.041722,0.036290) (0.036138,0.012154) (0.052638,0.006389) (0.050949,0.038775) (0.052642,0.018601) (0.051884,0.026631)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3904f89706dfa58b92a0c6056c8c677c7929ebe9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.819913e+00
+1.000000e-02 1.487649e+01
+1.500000e-02 1.940473e+01
+2.000000e-02 2.183420e+01
+2.500000e-02 2.307547e+01
+3.000000e-02 2.367701e+01
+3.500000e-02 2.395522e+01
+4.000000e-02 2.406996e+01
+4.500000e-02 2.408701e+01
+5.000000e-02 2.401553e+01
+5.500000e-02 2.382564e+01
+6.000000e-02 2.368586e+01
+6.500000e-02 2.376800e+01
+7.000000e-02 2.389358e+01
+7.500000e-02 2.395971e+01
+8.000000e-02 2.397449e+01
+8.500000e-02 2.396689e+01
+9.000000e-02 2.396544e+01
+9.500000e-02 2.397618e+01
+1.000000e-01 2.400140e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.012216,0.020358) (0.002638,0.006389) (0.009346,0.044697) (0.020435,0.044685) (0.019742,0.005130) (0.000949,0.038775) (0.018926,0.012888) (0.002642,0.018601) (0.008046,0.032314) (0.018666,0.028329) (0.001884,0.026631) (0.016722,0.036290) (0.011138,0.012154) (0.037216,0.020358) (0.027638,0.006389) (0.034346,0.044697) (0.045435,0.044685) (0.044742,0.005130) (0.025949,0.038775) (0.043926,0.012888) (0.027642,0.018601) (0.033046,0.032314) (0.043666,0.028329) (0.026884,0.026631) (0.041722,0.036290) (0.036138,0.012154) (0.052638,0.006389) (0.050949,0.038775) (0.052642,0.018601) (0.051884,0.026631)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a2ba311d0f4df2792d24e27739d89ab3ed062309
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4002_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.414913e+01 -6.758215e-05 -3.615114e-03
+1.000000e-02 2.805513e+01 -1.338008e-04 -7.212973e-03
+1.500000e-02 3.933728e+01 -1.879990e-04 -1.100390e-02
+2.000000e-02 4.590650e+01 -2.208767e-04 -1.518270e-02
+2.500000e-02 4.963447e+01 -2.405646e-04 -1.958552e-02
+3.000000e-02 5.177592e+01 -2.524624e-04 -2.410161e-02
+3.500000e-02 5.291607e+01 -2.592592e-04 -2.867659e-02
+4.000000e-02 5.340789e+01 -2.626698e-04 -3.327561e-02
+4.500000e-02 5.349894e+01 -2.638997e-04 -3.787448e-02
+5.000000e-02 5.338703e+01 -2.639787e-04 -4.245297e-02
+5.500000e-02 5.319894e+01 -2.635462e-04 -4.699871e-02
+6.000000e-02 5.301243e+01 -2.630192e-04 -5.150388e-02
+6.500000e-02 5.286820e+01 -2.626232e-04 -5.596457e-02
+7.000000e-02 5.278569e+01 -2.624618e-04 -6.037934e-02
+7.500000e-02 5.277319e+01 -2.625884e-04 -6.474773e-02
+8.000000e-02 5.283873e+01 -2.630916e-04 -6.906868e-02
+8.500000e-02 5.298187e+01 -2.639358e-04 -7.334351e-02
+9.000000e-02 5.320119e+01 -2.651305e-04 -7.757260e-02
+9.500000e-02 5.349380e+01 -2.666666e-04 -8.175669e-02
+1.000000e-01 5.385482e+01 -2.685243e-04 -8.589670e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.012216,0.020358) (0.002638,0.006389) (0.009346,0.044697) (0.020435,0.044685) (0.019742,0.005130) (0.000949,0.038775) (0.018926,0.012888) (0.002642,0.018601) (0.008046,0.032314) (0.018666,0.028329) (0.001884,0.026631) (0.016722,0.036290) (0.011138,0.012154) (0.037216,0.020358) (0.027638,0.006389) (0.034346,0.044697) (0.045435,0.044685) (0.044742,0.005130) (0.025949,0.038775) (0.043926,0.012888) (0.027642,0.018601) (0.033046,0.032314) (0.043666,0.028329) (0.026884,0.026631) (0.041722,0.036290) (0.036138,0.012154) (0.052638,0.006389) (0.050949,0.038775) (0.052642,0.018601) (0.051884,0.026631)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9f4832fc793797c7e0323c254c849215df2129a2
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.936989e+02 -1.832105e-03 -1.860677e-03
+1.000000e-02 9.856362e+02 -3.651300e-03 -3.708359e-03
+1.500000e-02 1.475826e+03 -5.457735e-03 -5.543194e-03
+2.000000e-02 1.964280e+03 -7.251557e-03 -7.365329e-03
+2.500000e-02 2.451012e+03 -9.033043e-03 -9.175035e-03
+3.000000e-02 2.936008e+03 -1.080519e-02 -1.097523e-02
+3.500000e-02 3.419080e+03 -1.258901e-02 -1.278873e-02
+4.000000e-02 3.900090e+03 -1.440370e-02 -1.464055e-02
+4.500000e-02 4.379395e+03 -1.622497e-02 -1.650330e-02
+5.000000e-02 4.857181e+03 -1.804023e-02 -1.836167e-02
+5.500000e-02 5.333496e+03 -1.984744e-02 -2.021315e-02
+6.000000e-02 5.808367e+03 -2.164612e-02 -2.205718e-02
+6.500000e-02 6.281818e+03 -2.343599e-02 -2.389341e-02
+7.000000e-02 6.753870e+03 -2.521682e-02 -2.572156e-02
+7.500000e-02 7.224544e+03 -2.698840e-02 -2.754139e-02
+8.000000e-02 7.693858e+03 -2.875054e-02 -2.935267e-02
+8.500000e-02 8.161835e+03 -3.050325e-02 -3.115546e-02
+9.000000e-02 8.628480e+03 -3.224610e-02 -3.294908e-02
+9.500000e-02 9.093803e+03 -3.397884e-02 -3.473316e-02
+1.000000e-01 9.557837e+03 -3.570190e-02 -3.650839e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.001527,0.013279) (0.012335,0.012924) (0.007803,0.004605) (0.008206,0.019814) (0.020360,0.028768) (0.008479,0.044081) (0.017173,0.019542) (0.000380,0.022011) (0.017267,0.045544) (0.000509,0.034798) (0.009117,0.036197) (0.000060,0.045364) (0.000059,0.005617) (0.017088,0.037259) (0.017056,0.004345) (0.010358,0.027917) (0.026527,0.013279) (0.037335,0.012924) (0.032803,0.004605) (0.033206,0.019814) (0.045360,0.028768) (0.033479,0.044081) (0.042173,0.019542) (0.025380,0.022011) (0.042267,0.045544) (0.025509,0.034798) (0.034117,0.036197) (0.025060,0.045364) (0.025059,0.005617) (0.042088,0.037259) (0.042056,0.004345) (0.035358,0.027917) (0.051527,0.013279) (0.050380,0.022011) (0.050509,0.034798) (0.050060,0.045364) (0.050059,0.005617)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4c875bd59ca67e300b7ee8c9282ec57975d68fe6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 1.012534e+01
+1.000000e-02 1.755059e+01
+1.500000e-02 2.153428e+01
+2.000000e-02 2.335745e+01
+2.500000e-02 2.406378e+01
+3.000000e-02 2.428049e+01
+3.500000e-02 2.425552e+01
+4.000000e-02 2.412880e+01
+4.500000e-02 2.402195e+01
+5.000000e-02 2.401614e+01
+5.500000e-02 2.408773e+01
+6.000000e-02 2.424202e+01
+6.500000e-02 2.441488e+01
+7.000000e-02 2.454089e+01
+7.500000e-02 2.459730e+01
+8.000000e-02 2.461854e+01
+8.500000e-02 2.464311e+01
+9.000000e-02 2.461414e+01
+9.500000e-02 2.451271e+01
+1.000000e-01 2.444670e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.001527,0.013279) (0.012335,0.012924) (0.007803,0.004605) (0.008206,0.019814) (0.020360,0.028768) (0.008479,0.044081) (0.017173,0.019542) (0.000380,0.022011) (0.017267,0.045544) (0.000509,0.034798) (0.009117,0.036197) (0.000060,0.045364) (0.000059,0.005617) (0.017088,0.037259) (0.017056,0.004345) (0.010358,0.027917) (0.026527,0.013279) (0.037335,0.012924) (0.032803,0.004605) (0.033206,0.019814) (0.045360,0.028768) (0.033479,0.044081) (0.042173,0.019542) (0.025380,0.022011) (0.042267,0.045544) (0.025509,0.034798) (0.034117,0.036197) (0.025060,0.045364) (0.025059,0.005617) (0.042088,0.037259) (0.042056,0.004345) (0.035358,0.027917) (0.051527,0.013279) (0.050380,0.022011) (0.050509,0.034798) (0.050060,0.045364) (0.050059,0.005617)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fc4c96c2a6943e91e4731e60deac5bfce12e64f9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.303329e+01 -8.574396e-05 -3.198721e-03
+1.000000e-02 4.263979e+01 -1.599807e-04 -6.542070e-03
+1.500000e-02 5.423743e+01 -2.057907e-04 -1.039497e-02
+2.000000e-02 6.049808e+01 -2.315970e-04 -1.465044e-02
+2.500000e-02 6.420355e+01 -2.475663e-04 -1.909258e-02
+3.000000e-02 6.680427e+01 -2.591271e-04 -2.359785e-02
+3.500000e-02 6.894002e+01 -2.687618e-04 -2.810723e-02
+4.000000e-02 7.083952e+01 -2.773996e-04 -3.259794e-02
+4.500000e-02 7.258451e+01 -2.853999e-04 -3.706139e-02
+5.000000e-02 7.422405e+01 -2.929423e-04 -4.149401e-02
+5.500000e-02 7.579691e+01 -3.002257e-04 -4.589193e-02
+6.000000e-02 7.732469e+01 -3.072860e-04 -5.025476e-02
+6.500000e-02 7.884207e+01 -3.142934e-04 -5.457927e-02
+7.000000e-02 8.037330e+01 -3.213465e-04 -5.886367e-02
+7.500000e-02 8.193478e+01 -3.285145e-04 -6.310683e-02
+8.000000e-02 8.353549e+01 -3.358380e-04 -6.730825e-02
+8.500000e-02 8.517834e+01 -3.433333e-04 -7.146793e-02
+9.000000e-02 8.686200e+01 -3.509998e-04 -7.558630e-02
+9.500000e-02 8.858249e+01 -3.588265e-04 -7.966397e-02
+1.000000e-01 9.033458e+01 -3.667972e-04 -8.370172e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.001527,0.013279) (0.012335,0.012924) (0.007803,0.004605) (0.008206,0.019814) (0.020360,0.028768) (0.008479,0.044081) (0.017173,0.019542) (0.000380,0.022011) (0.017267,0.045544) (0.000509,0.034798) (0.009117,0.036197) (0.000060,0.045364) (0.000059,0.005617) (0.017088,0.037259) (0.017056,0.004345) (0.010358,0.027917) (0.026527,0.013279) (0.037335,0.012924) (0.032803,0.004605) (0.033206,0.019814) (0.045360,0.028768) (0.033479,0.044081) (0.042173,0.019542) (0.025380,0.022011) (0.042267,0.045544) (0.025509,0.034798) (0.034117,0.036197) (0.025060,0.045364) (0.025059,0.005617) (0.042088,0.037259) (0.042056,0.004345) (0.035358,0.027917) (0.051527,0.013279) (0.050380,0.022011) (0.050509,0.034798) (0.050060,0.045364) (0.050059,0.005617)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..364e23910fb07afa448aacb31a485bd9075ca778
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.937061e+02 -1.831851e-03 -1.862324e-03
+1.000000e-02 9.856520e+02 -3.650807e-03 -3.711623e-03
+1.500000e-02 1.475851e+03 -5.457014e-03 -5.548046e-03
+2.000000e-02 1.964317e+03 -7.250622e-03 -7.371740e-03
+2.500000e-02 2.451062e+03 -9.031902e-03 -9.182974e-03
+3.000000e-02 2.936071e+03 -1.080378e-02 -1.098464e-02
+3.500000e-02 3.419158e+03 -1.258715e-02 -1.279944e-02
+4.000000e-02 3.900181e+03 -1.440149e-02 -1.465249e-02
+4.500000e-02 4.379502e+03 -1.622253e-02 -1.651630e-02
+5.000000e-02 4.857304e+03 -1.803763e-02 -1.837559e-02
+5.500000e-02 5.333636e+03 -1.984473e-02 -2.022787e-02
+6.000000e-02 5.808524e+03 -2.164335e-02 -2.207256e-02
+6.500000e-02 6.281992e+03 -2.343323e-02 -2.390933e-02
+7.000000e-02 6.754062e+03 -2.521412e-02 -2.573790e-02
+7.500000e-02 7.224753e+03 -2.698584e-02 -2.755802e-02
+8.000000e-02 7.694085e+03 -2.874819e-02 -2.936947e-02
+8.500000e-02 8.162074e+03 -3.050104e-02 -3.117204e-02
+9.000000e-02 8.628735e+03 -3.224421e-02 -3.296552e-02
+9.500000e-02 9.094085e+03 -3.397765e-02 -3.474981e-02
+1.000000e-01 9.558134e+03 -3.570116e-02 -3.652467e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008086,0.004285) (0.017019,0.028553) (0.000066,0.030433) (0.008571,0.013653) (0.013443,0.021141) (0.000213,0.004603) (0.009444,0.044909) (0.006774,0.036262) (0.001277,0.042062) (0.018824,0.037390) (0.016996,0.013333) (0.000100,0.012385) (0.007480,0.027201) (0.002148,0.021054) (0.016124,0.005681) (0.017273,0.045461) (0.033086,0.004285) (0.042019,0.028553) (0.025066,0.030433) (0.033571,0.013653) (0.038443,0.021141) (0.025213,0.004603) (0.034444,0.044909) (0.031774,0.036262) (0.026277,0.042062) (0.043824,0.037390) (0.041996,0.013333) (0.025100,0.012385) (0.032480,0.027201) (0.027148,0.021054) (0.041124,0.005681) (0.042273,0.045461) (0.050066,0.030433) (0.050213,0.004603) (0.051277,0.042062) (0.050100,0.012385) (0.052148,0.021054)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..97c6a0220b9d76fa4a3b414745fa97bf289e3a36
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 1.012021e+01
+1.000000e-02 1.762667e+01
+1.500000e-02 2.162710e+01
+2.000000e-02 2.338509e+01
+2.500000e-02 2.405668e+01
+3.000000e-02 2.423458e+01
+3.500000e-02 2.417111e+01
+4.000000e-02 2.400414e+01
+4.500000e-02 2.383946e+01
+5.000000e-02 2.377077e+01
+5.500000e-02 2.382933e+01
+6.000000e-02 2.398203e+01
+6.500000e-02 2.419498e+01
+7.000000e-02 2.440299e+01
+7.500000e-02 2.454223e+01
+8.000000e-02 2.460781e+01
+8.500000e-02 2.465730e+01
+9.000000e-02 2.473182e+01
+9.500000e-02 2.482209e+01
+1.000000e-01 2.491561e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008086,0.004285) (0.017019,0.028553) (0.000066,0.030433) (0.008571,0.013653) (0.013443,0.021141) (0.000213,0.004603) (0.009444,0.044909) (0.006774,0.036262) (0.001277,0.042062) (0.018824,0.037390) (0.016996,0.013333) (0.000100,0.012385) (0.007480,0.027201) (0.002148,0.021054) (0.016124,0.005681) (0.017273,0.045461) (0.033086,0.004285) (0.042019,0.028553) (0.025066,0.030433) (0.033571,0.013653) (0.038443,0.021141) (0.025213,0.004603) (0.034444,0.044909) (0.031774,0.036262) (0.026277,0.042062) (0.043824,0.037390) (0.041996,0.013333) (0.025100,0.012385) (0.032480,0.027201) (0.027148,0.021054) (0.041124,0.005681) (0.042273,0.045461) (0.050066,0.030433) (0.050213,0.004603) (0.051277,0.042062) (0.050100,0.012385) (0.052148,0.021054)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..28f78bd212b1764b30c5e4a8a795bce706c6c73a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.258475e+01 -8.405848e-05 -3.234895e-03
+1.000000e-02 4.198248e+01 -1.572865e-04 -6.611160e-03
+1.500000e-02 5.343033e+01 -2.020329e-04 -1.051334e-02
+2.000000e-02 5.955785e+01 -2.269740e-04 -1.480720e-02
+2.500000e-02 6.328437e+01 -2.427344e-04 -1.926589e-02
+3.000000e-02 6.586694e+01 -2.540158e-04 -2.378369e-02
+3.500000e-02 6.786585e+01 -2.629794e-04 -2.831102e-02
+4.000000e-02 6.959607e+01 -2.708631e-04 -3.282005e-02
+4.500000e-02 7.124174e+01 -2.783878e-04 -3.729487e-02
+5.000000e-02 7.289879e+01 -2.859742e-04 -4.172611e-02
+5.500000e-02 7.459850e+01 -2.937215e-04 -4.611184e-02
+6.000000e-02 7.635820e+01 -3.017322e-04 -5.045019e-02
+6.500000e-02 7.817654e+01 -3.100102e-04 -5.474159e-02
+7.000000e-02 8.004460e+01 -3.185258e-04 -5.898728e-02
+7.500000e-02 8.195058e+01 -3.272351e-04 -6.318886e-02
+8.000000e-02 8.388197e+01 -3.360880e-04 -6.734804e-02
+8.500000e-02 8.582635e+01 -3.450336e-04 -7.146655e-02
+9.000000e-02 8.777111e+01 -3.540193e-04 -7.554611e-02
+9.500000e-02 8.970384e+01 -3.629927e-04 -7.958846e-02
+1.000000e-01 9.161244e+01 -3.719025e-04 -8.359524e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008086,0.004285) (0.017019,0.028553) (0.000066,0.030433) (0.008571,0.013653) (0.013443,0.021141) (0.000213,0.004603) (0.009444,0.044909) (0.006774,0.036262) (0.001277,0.042062) (0.018824,0.037390) (0.016996,0.013333) (0.000100,0.012385) (0.007480,0.027201) (0.002148,0.021054) (0.016124,0.005681) (0.017273,0.045461) (0.033086,0.004285) (0.042019,0.028553) (0.025066,0.030433) (0.033571,0.013653) (0.038443,0.021141) (0.025213,0.004603) (0.034444,0.044909) (0.031774,0.036262) (0.026277,0.042062) (0.043824,0.037390) (0.041996,0.013333) (0.025100,0.012385) (0.032480,0.027201) (0.027148,0.021054) (0.041124,0.005681) (0.042273,0.045461) (0.050066,0.030433) (0.050213,0.004603) (0.051277,0.042062) (0.050100,0.012385) (0.052148,0.021054)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c8d8137259a0440a8cd02d2005a09cc06ab905ec
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.936879e+02 -1.844645e-03 -1.854132e-03
+1.000000e-02 9.856203e+02 -3.676366e-03 -3.695222e-03
+1.500000e-02 1.475811e+03 -5.495309e-03 -5.523420e-03
+2.000000e-02 1.964272e+03 -7.301623e-03 -7.338875e-03
+2.500000e-02 2.451017e+03 -9.095569e-03 -9.141857e-03
+3.000000e-02 2.936031e+03 -1.087989e-02 -1.093529e-02
+3.500000e-02 3.419124e+03 -1.267587e-02 -1.274125e-02
+4.000000e-02 3.900157e+03 -1.450662e-02 -1.458218e-02
+4.500000e-02 4.379494e+03 -1.634619e-02 -1.643178e-02
+5.000000e-02 4.857316e+03 -1.818056e-02 -1.827597e-02
+5.500000e-02 5.333672e+03 -2.000747e-02 -2.011245e-02
+6.000000e-02 5.808588e+03 -2.182641e-02 -2.194070e-02
+6.500000e-02 6.282087e+03 -2.363708e-02 -2.376041e-02
+7.000000e-02 6.754191e+03 -2.543925e-02 -2.557131e-02
+7.500000e-02 7.224919e+03 -2.723269e-02 -2.737317e-02
+8.000000e-02 7.694290e+03 -2.901720e-02 -2.916579e-02
+8.500000e-02 8.162324e+03 -3.079274e-02 -3.094909e-02
+9.000000e-02 8.629027e+03 -3.255876e-02 -3.272259e-02
+9.500000e-02 9.094423e+03 -3.431552e-02 -3.448646e-02
+1.000000e-01 9.558522e+03 -3.606277e-02 -3.624048e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.000239,0.009268) (0.000386,0.043904) (0.016632,0.033639) (0.007719,0.020635) (0.000294,0.035141) (0.007807,0.028684) (0.009524,0.036726) (0.016733,0.023487) (0.006604,0.004551) (0.016923,0.043932) (0.009308,0.045575) (0.000653,0.017092) (0.017151,0.006000) (0.015745,0.015027) (0.000495,0.025011) (0.007132,0.012868) (0.025239,0.009268) (0.025386,0.043904) (0.041632,0.033639) (0.032719,0.020635) (0.025294,0.035141) (0.032807,0.028684) (0.034524,0.036726) (0.041733,0.023487) (0.031604,0.004551) (0.041923,0.043932) (0.034308,0.045575) (0.025653,0.017092) (0.042151,0.006000) (0.040745,0.015027) (0.025495,0.025011) (0.032132,0.012868) (0.050239,0.009268) (0.050386,0.043904) (0.050294,0.035141) (0.050653,0.017092) (0.050495,0.025011)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b4eac8ca8f3f3de421b58c45b2763949682d740d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 9.928838e+00
+1.000000e-02 1.760814e+01
+1.500000e-02 2.131890e+01
+2.000000e-02 2.301237e+01
+2.500000e-02 2.371715e+01
+3.000000e-02 2.393779e+01
+3.500000e-02 2.389267e+01
+4.000000e-02 2.366351e+01
+4.500000e-02 2.331173e+01
+5.000000e-02 2.299292e+01
+5.500000e-02 2.285303e+01
+6.000000e-02 2.290085e+01
+6.500000e-02 2.308902e+01
+7.000000e-02 2.337412e+01
+7.500000e-02 2.368618e+01
+8.000000e-02 2.394335e+01
+8.500000e-02 2.411347e+01
+9.000000e-02 2.421628e+01
+9.500000e-02 2.431744e+01
+1.000000e-01 2.444730e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.000239,0.009268) (0.000386,0.043904) (0.016632,0.033639) (0.007719,0.020635) (0.000294,0.035141) (0.007807,0.028684) (0.009524,0.036726) (0.016733,0.023487) (0.006604,0.004551) (0.016923,0.043932) (0.009308,0.045575) (0.000653,0.017092) (0.017151,0.006000) (0.015745,0.015027) (0.000495,0.025011) (0.007132,0.012868) (0.025239,0.009268) (0.025386,0.043904) (0.041632,0.033639) (0.032719,0.020635) (0.025294,0.035141) (0.032807,0.028684) (0.034524,0.036726) (0.041733,0.023487) (0.031604,0.004551) (0.041923,0.043932) (0.034308,0.045575) (0.025653,0.017092) (0.042151,0.006000) (0.040745,0.015027) (0.025495,0.025011) (0.032132,0.012868) (0.050239,0.009268) (0.050386,0.043904) (0.050294,0.035141) (0.050653,0.017092) (0.050495,0.025011)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ac99a2569ddb1d226d09b5349b3d1ac85bc4cfd0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.361441e+01 -8.853604e-05 -3.092251e-03
+1.000000e-02 4.481078e+01 -1.686930e-04 -6.304779e-03
+1.500000e-02 5.789765e+01 -2.199527e-04 -1.006097e-02
+2.000000e-02 6.517624e+01 -2.497755e-04 -1.424100e-02
+2.500000e-02 6.957291e+01 -2.686645e-04 -1.862234e-02
+3.000000e-02 7.276520e+01 -2.828929e-04 -2.306413e-02
+3.500000e-02 7.543609e+01 -2.950935e-04 -2.750687e-02
+4.000000e-02 7.788225e+01 -3.064572e-04 -3.192413e-02
+4.500000e-02 8.025581e+01 -3.175863e-04 -3.630307e-02
+5.000000e-02 8.263949e+01 -3.288111e-04 -4.063688e-02
+5.500000e-02 8.508031e+01 -3.403195e-04 -4.492219e-02
+6.000000e-02 8.758908e+01 -3.521626e-04 -4.915811e-02
+6.500000e-02 9.017164e+01 -3.644032e-04 -5.334345e-02
+7.000000e-02 9.281915e+01 -3.769402e-04 -5.748109e-02
+7.500000e-02 9.552864e+01 -3.897972e-04 -6.157070e-02
+8.000000e-02 9.829041e+01 -4.029355e-04 -6.561337e-02
+8.500000e-02 1.010909e+02 -4.162997e-04 -6.961041e-02
+9.000000e-02 1.039146e+02 -4.298217e-04 -7.356323e-02
+9.500000e-02 1.067443e+02 -4.434255e-04 -7.747333e-02
+1.000000e-01 1.095618e+02 -4.570299e-04 -8.134221e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.000239,0.009268) (0.000386,0.043904) (0.016632,0.033639) (0.007719,0.020635) (0.000294,0.035141) (0.007807,0.028684) (0.009524,0.036726) (0.016733,0.023487) (0.006604,0.004551) (0.016923,0.043932) (0.009308,0.045575) (0.000653,0.017092) (0.017151,0.006000) (0.015745,0.015027) (0.000495,0.025011) (0.007132,0.012868) (0.025239,0.009268) (0.025386,0.043904) (0.041632,0.033639) (0.032719,0.020635) (0.025294,0.035141) (0.032807,0.028684) (0.034524,0.036726) (0.041733,0.023487) (0.031604,0.004551) (0.041923,0.043932) (0.034308,0.045575) (0.025653,0.017092) (0.042151,0.006000) (0.040745,0.015027) (0.025495,0.025011) (0.032132,0.012868) (0.050239,0.009268) (0.050386,0.043904) (0.050294,0.035141) (0.050653,0.017092) (0.050495,0.025011)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4b17b481b8b3d9b18a22e29ec945a3b45aab88dc
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.936788e+02 -1.842444e-03 -1.854972e-03
+1.000000e-02 9.856008e+02 -3.672008e-03 -3.696880e-03
+1.500000e-02 1.475779e+03 -5.488838e-03 -5.525873e-03
+2.000000e-02 1.964228e+03 -7.293082e-03 -7.342100e-03
+2.500000e-02 2.450959e+03 -9.084994e-03 -9.145840e-03
+3.000000e-02 2.935957e+03 -1.086724e-02 -1.094013e-02
+3.500000e-02 3.419034e+03 -1.266133e-02 -1.274684e-02
+4.000000e-02 3.900050e+03 -1.449085e-02 -1.458784e-02
+4.500000e-02 4.379368e+03 -1.632950e-02 -1.643729e-02
+5.000000e-02 4.857172e+03 -1.816317e-02 -1.828117e-02
+5.500000e-02 5.333508e+03 -1.998961e-02 -2.011717e-02
+6.000000e-02 5.808403e+03 -2.180831e-02 -2.194476e-02
+6.500000e-02 6.281881e+03 -2.361896e-02 -2.376364e-02
+7.000000e-02 6.753963e+03 -2.542132e-02 -2.557355e-02
+7.500000e-02 7.224669e+03 -2.721516e-02 -2.737425e-02
+8.000000e-02 7.694018e+03 -2.900029e-02 -2.916556e-02
+8.500000e-02 8.162026e+03 -3.077649e-02 -3.094726e-02
+9.000000e-02 8.628708e+03 -3.254363e-02 -3.271923e-02
+9.500000e-02 9.094082e+03 -3.430162e-02 -3.448137e-02
+1.000000e-01 9.558155e+03 -3.605015e-02 -3.623338e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.001786,0.024699) (0.016735,0.008560) (0.010624,0.013614) (0.009294,0.005873) (0.007714,0.037828) (0.000011,0.044697) (0.000222,0.033962) (0.016435,0.045191) (0.008027,0.045660) (0.009221,0.021258) (0.016404,0.035529) (0.020311,0.019364) (0.008727,0.029942) (0.002780,0.016979) (0.000281,0.005866) (0.019699,0.027767) (0.026786,0.024699) (0.041735,0.008560) (0.035624,0.013614) (0.034294,0.005873) (0.032714,0.037828) (0.025011,0.044697) (0.025222,0.033962) (0.041435,0.045191) (0.033027,0.045660) (0.034221,0.021258) (0.041404,0.035529) (0.045311,0.019364) (0.033727,0.029942) (0.027780,0.016979) (0.025281,0.005866) (0.044699,0.027767) (0.051786,0.024699) (0.050011,0.044697) (0.050222,0.033962) (0.052780,0.016979) (0.050281,0.005866)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e91357d178ac927ac11fe6e1f40391ac1e86fef
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 1.013702e+01
+1.000000e-02 1.796668e+01
+1.500000e-02 2.160999e+01
+2.000000e-02 2.327603e+01
+2.500000e-02 2.393633e+01
+3.000000e-02 2.413992e+01
+3.500000e-02 2.417065e+01
+4.000000e-02 2.412859e+01
+4.500000e-02 2.405090e+01
+5.000000e-02 2.396111e+01
+5.500000e-02 2.387828e+01
+6.000000e-02 2.381377e+01
+6.500000e-02 2.377676e+01
+7.000000e-02 2.377187e+01
+7.500000e-02 2.380462e+01
+8.000000e-02 2.385563e+01
+8.500000e-02 2.393900e+01
+9.000000e-02 2.404291e+01
+9.500000e-02 2.414741e+01
+1.000000e-01 2.425432e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.001786,0.024699) (0.016735,0.008560) (0.010624,0.013614) (0.009294,0.005873) (0.007714,0.037828) (0.000011,0.044697) (0.000222,0.033962) (0.016435,0.045191) (0.008027,0.045660) (0.009221,0.021258) (0.016404,0.035529) (0.020311,0.019364) (0.008727,0.029942) (0.002780,0.016979) (0.000281,0.005866) (0.019699,0.027767) (0.026786,0.024699) (0.041735,0.008560) (0.035624,0.013614) (0.034294,0.005873) (0.032714,0.037828) (0.025011,0.044697) (0.025222,0.033962) (0.041435,0.045191) (0.033027,0.045660) (0.034221,0.021258) (0.041404,0.035529) (0.045311,0.019364) (0.033727,0.029942) (0.027780,0.016979) (0.025281,0.005866) (0.044699,0.027767) (0.051786,0.024699) (0.050011,0.044697) (0.050222,0.033962) (0.052780,0.016979) (0.050281,0.005866)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..777e53c2c8bb810efb71c87825a88d8f6db01c08
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.325578e+01 -8.708033e-05 -3.131443e-03
+1.000000e-02 4.378982e+01 -1.647326e-04 -6.398872e-03
+1.500000e-02 5.642821e+01 -2.145287e-04 -1.017200e-02
+2.000000e-02 6.339739e+01 -2.432349e-04 -1.436555e-02
+2.500000e-02 6.760573e+01 -2.613552e-04 -1.875446e-02
+3.000000e-02 7.058490e+01 -2.746404e-04 -2.321133e-02
+3.500000e-02 7.303957e+01 -2.858420e-04 -2.767433e-02
+4.000000e-02 7.528835e+01 -2.962325e-04 -3.211434e-02
+4.500000e-02 7.749795e+01 -3.064993e-04 -3.651592e-02
+5.000000e-02 7.973981e+01 -3.169502e-04 -4.087202e-02
+5.500000e-02 8.204178e+01 -3.277258e-04 -4.517952e-02
+6.000000e-02 8.441380e+01 -3.388565e-04 -4.943821e-02
+6.500000e-02 8.685337e+01 -3.503694e-04 -5.364786e-02
+7.000000e-02 8.934011e+01 -3.621420e-04 -5.781163e-02
+7.500000e-02 9.186369e+01 -3.741534e-04 -6.193066e-02
+8.000000e-02 9.441057e+01 -3.863415e-04 -6.600686e-02
+8.500000e-02 9.695671e+01 -3.985721e-04 -7.004354e-02
+9.000000e-02 9.950473e+01 -4.108937e-04 -7.404025e-02
+9.500000e-02 1.020317e+02 -4.231810e-04 -7.799999e-02
+1.000000e-01 1.045245e+02 -4.353335e-04 -8.192541e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.001786,0.024699) (0.016735,0.008560) (0.010624,0.013614) (0.009294,0.005873) (0.007714,0.037828) (0.000011,0.044697) (0.000222,0.033962) (0.016435,0.045191) (0.008027,0.045660) (0.009221,0.021258) (0.016404,0.035529) (0.020311,0.019364) (0.008727,0.029942) (0.002780,0.016979) (0.000281,0.005866) (0.019699,0.027767) (0.026786,0.024699) (0.041735,0.008560) (0.035624,0.013614) (0.034294,0.005873) (0.032714,0.037828) (0.025011,0.044697) (0.025222,0.033962) (0.041435,0.045191) (0.033027,0.045660) (0.034221,0.021258) (0.041404,0.035529) (0.045311,0.019364) (0.033727,0.029942) (0.027780,0.016979) (0.025281,0.005866) (0.044699,0.027767) (0.051786,0.024699) (0.050011,0.044697) (0.050222,0.033962) (0.052780,0.016979) (0.050281,0.005866)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..278fa6b42f6041b446225946db90167d4aa714ac
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 4.937131e+02 -1.843363e-03 -1.853161e-03
+1.000000e-02 9.856682e+02 -3.673801e-03 -3.693305e-03
+1.500000e-02 1.475879e+03 -5.491461e-03 -5.520579e-03
+2.000000e-02 1.964359e+03 -7.296491e-03 -7.335135e-03
+2.500000e-02 2.451120e+03 -9.089156e-03 -9.137242e-03
+3.000000e-02 2.936147e+03 -1.087225e-02 -1.092986e-02
+3.500000e-02 3.419253e+03 -1.266721e-02 -1.273503e-02
+4.000000e-02 3.900298e+03 -1.449644e-02 -1.457546e-02
+4.500000e-02 4.379643e+03 -1.633421e-02 -1.642485e-02
+5.000000e-02 4.857472e+03 -1.816671e-02 -1.826898e-02
+5.500000e-02 5.333832e+03 -1.999171e-02 -2.010552e-02
+6.000000e-02 5.808751e+03 -2.180870e-02 -2.193394e-02
+6.500000e-02 6.282251e+03 -2.361739e-02 -2.375392e-02
+7.000000e-02 6.754355e+03 -2.541754e-02 -2.556519e-02
+7.500000e-02 7.225082e+03 -2.720894e-02 -2.736753e-02
+8.000000e-02 7.694451e+03 -2.899138e-02 -2.916071e-02
+8.500000e-02 8.162483e+03 -3.076489e-02 -3.094473e-02
+9.000000e-02 8.629180e+03 -3.252877e-02 -3.271890e-02
+9.500000e-02 9.094570e+03 -3.428338e-02 -3.448355e-02
+1.000000e-01 9.558669e+03 -3.602873e-02 -3.623866e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016876,0.013814) (0.009132,0.004296) (0.008548,0.027941) (0.008910,0.012333) (0.000586,0.004643) (0.008382,0.035880) (0.009393,0.043720) (0.017112,0.025572) (0.016932,0.005568) (0.001731,0.039915) (0.000609,0.013129) (0.020628,0.045721) (0.016129,0.034767) (0.011300,0.020047) (0.002026,0.021632) (0.000331,0.030353) (0.041876,0.013814) (0.034132,0.004296) (0.033548,0.027941) (0.033910,0.012333) (0.025586,0.004643) (0.033382,0.035880) (0.034393,0.043720) (0.042112,0.025572) (0.041932,0.005568) (0.026731,0.039915) (0.025609,0.013129) (0.045628,0.045721) (0.041129,0.034767) (0.036300,0.020047) (0.027026,0.021632) (0.025331,0.030353) (0.050586,0.004643) (0.051731,0.039915) (0.050609,0.013129) (0.052026,0.021632) (0.050331,0.030353)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0b03a44f10c33b69f0c2eee8ea81ad9842f21959
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 9.931031e+00
+1.000000e-02 1.763321e+01
+1.500000e-02 2.152744e+01
+2.000000e-02 2.333421e+01
+2.500000e-02 2.409006e+01
+3.000000e-02 2.430519e+01
+3.500000e-02 2.427598e+01
+4.000000e-02 2.413860e+01
+4.500000e-02 2.395927e+01
+5.000000e-02 2.379968e+01
+5.500000e-02 2.368486e+01
+6.000000e-02 2.360759e+01
+6.500000e-02 2.354499e+01
+7.000000e-02 2.354064e+01
+7.500000e-02 2.363023e+01
+8.000000e-02 2.375801e+01
+8.500000e-02 2.386563e+01
+9.000000e-02 2.392905e+01
+9.500000e-02 2.399420e+01
+1.000000e-01 2.411129e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016876,0.013814) (0.009132,0.004296) (0.008548,0.027941) (0.008910,0.012333) (0.000586,0.004643) (0.008382,0.035880) (0.009393,0.043720) (0.017112,0.025572) (0.016932,0.005568) (0.001731,0.039915) (0.000609,0.013129) (0.020628,0.045721) (0.016129,0.034767) (0.011300,0.020047) (0.002026,0.021632) (0.000331,0.030353) (0.041876,0.013814) (0.034132,0.004296) (0.033548,0.027941) (0.033910,0.012333) (0.025586,0.004643) (0.033382,0.035880) (0.034393,0.043720) (0.042112,0.025572) (0.041932,0.005568) (0.026731,0.039915) (0.025609,0.013129) (0.045628,0.045721) (0.041129,0.034767) (0.036300,0.020047) (0.027026,0.021632) (0.025331,0.030353) (0.050586,0.004643) (0.051731,0.039915) (0.050609,0.013129) (0.052026,0.021632) (0.050331,0.030353)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d77626e29c51d1507e124562bf06db7ed2cfb53d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/CPP_0.4926_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.300362e+01 -8.616979e-05 -3.146935e-03
+1.000000e-02 4.331452e+01 -1.630987e-04 -6.421383e-03
+1.500000e-02 5.608065e+01 -2.130715e-04 -1.019903e-02
+2.000000e-02 6.323730e+01 -2.423931e-04 -1.438484e-02
+2.500000e-02 6.756084e+01 -2.610247e-04 -1.876869e-02
+3.000000e-02 7.056507e+01 -2.745382e-04 -2.322656e-02
+3.500000e-02 7.294209e+01 -2.855587e-04 -2.769923e-02
+4.000000e-02 7.502932e+01 -2.954022e-04 -3.215645e-02
+4.500000e-02 7.700175e+01 -3.047681e-04 -3.658222e-02
+5.000000e-02 7.895068e+01 -3.140297e-04 -4.096846e-02
+5.500000e-02 8.092364e+01 -3.233911e-04 -4.531112e-02
+6.000000e-02 8.295129e+01 -3.330022e-04 -4.960771e-02
+6.500000e-02 8.503289e+01 -3.428231e-04 -5.385991e-02
+7.000000e-02 8.717621e+01 -3.529215e-04 -5.806692e-02
+7.500000e-02 8.938039e+01 -3.633004e-04 -6.222940e-02
+8.000000e-02 9.163990e+01 -3.739429e-04 -6.634840e-02
+8.500000e-02 9.394640e+01 -3.848199e-04 -7.042517e-02
+9.000000e-02 9.629013e+01 -3.958954e-04 -7.446110e-02
+9.500000e-02 9.864537e+01 -4.070305e-04 -7.845963e-02
+1.000000e-01 1.010221e+02 -4.182982e-04 -8.241985e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016876,0.013814) (0.009132,0.004296) (0.008548,0.027941) (0.008910,0.012333) (0.000586,0.004643) (0.008382,0.035880) (0.009393,0.043720) (0.017112,0.025572) (0.016932,0.005568) (0.001731,0.039915) (0.000609,0.013129) (0.020628,0.045721) (0.016129,0.034767) (0.011300,0.020047) (0.002026,0.021632) (0.000331,0.030353) (0.041876,0.013814) (0.034132,0.004296) (0.033548,0.027941) (0.033910,0.012333) (0.025586,0.004643) (0.033382,0.035880) (0.034393,0.043720) (0.042112,0.025572) (0.041932,0.005568) (0.026731,0.039915) (0.025609,0.013129) (0.045628,0.045721) (0.041129,0.034767) (0.036300,0.020047) (0.027026,0.021632) (0.025331,0.030353) (0.050586,0.004643) (0.051731,0.039915) (0.050609,0.013129) (0.052026,0.021632) (0.050331,0.030353)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2d957bd9aa979e0f54b346c55031050c21ecc112
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.547777e+01 -2.251171e-03 -2.272478e-03
+1.000000e-02 7.094373e+01 -4.485698e-03 -4.528220e-03
+1.500000e-02 1.062223e+02 -6.708881e-03 -6.772354e-03
+2.000000e-02 1.406844e+02 -8.938696e-03 -9.023081e-03
+2.500000e-02 1.742458e+02 -1.117693e-02 -1.128351e-02
+3.000000e-02 2.074650e+02 -1.340820e-02 -1.353787e-02
+3.500000e-02 2.405897e+02 -1.562582e-02 -1.577894e-02
+4.000000e-02 2.736719e+02 -1.782865e-02 -1.800537e-02
+4.500000e-02 3.067222e+02 -2.001657e-02 -2.021703e-02
+5.000000e-02 3.397444e+02 -2.218966e-02 -2.241398e-02
+5.500000e-02 3.727408e+02 -2.434802e-02 -2.459632e-02
+6.000000e-02 4.057127e+02 -2.649182e-02 -2.676421e-02
+6.500000e-02 4.386621e+02 -2.862115e-02 -2.891775e-02
+7.000000e-02 4.715904e+02 -3.073615e-02 -3.105707e-02
+7.500000e-02 5.044994e+02 -3.283693e-02 -3.318227e-02
+8.000000e-02 5.373902e+02 -3.492362e-02 -3.529349e-02
+8.500000e-02 5.702641e+02 -3.699636e-02 -3.739084e-02
+9.000000e-02 6.031226e+02 -3.905525e-02 -3.947446e-02
+9.500000e-02 6.359665e+02 -4.110044e-02 -4.154446e-02
+1.000000e-01 6.687970e+02 -4.313204e-02 -4.360097e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.009684,0.039422) (0.009627,0.015471) (0.018021,0.009378) (0.034684,0.039422) (0.034627,0.015471) (0.043021,0.009378)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..984a09ea30f36f84af5690da71da58b2bba50bd9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.864533e+00
+1.000000e-02 5.611667e+00
+1.500000e-02 7.685502e+00
+2.000000e-02 8.913633e+00
+2.500000e-02 9.757625e+00
+3.000000e-02 1.047969e+01
+3.500000e-02 1.113880e+01
+4.000000e-02 1.174934e+01
+4.500000e-02 1.231737e+01
+5.000000e-02 1.284703e+01
+5.500000e-02 1.334180e+01
+6.000000e-02 1.380476e+01
+6.500000e-02 1.423871e+01
+7.000000e-02 1.464620e+01
+7.500000e-02 1.502959e+01
+8.000000e-02 1.539109e+01
+8.500000e-02 1.573272e+01
+9.000000e-02 1.605638e+01
+9.500000e-02 1.636380e+01
+1.000000e-01 1.665662e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.009684,0.039422) (0.009627,0.015471) (0.018021,0.009378) (0.034684,0.039422) (0.034627,0.015471) (0.043021,0.009378)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6b3d68f71aa737b764671ec524c151840913bbb6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.353123e+00 -3.397067e-04 -4.272330e-03
+1.000000e-02 1.056904e+01 -6.689388e-04 -8.521772e-03
+1.500000e-02 1.471401e+01 -9.372446e-04 -1.285761e-02
+2.000000e-02 1.728299e+01 -1.117107e-03 -1.733986e-02
+2.500000e-02 1.906225e+01 -1.249826e-03 -2.187730e-02
+3.000000e-02 2.055171e+01 -1.362246e-03 -2.641068e-02
+3.500000e-02 2.190236e+01 -1.463047e-03 -3.092165e-02
+4.000000e-02 2.315445e+01 -1.555019e-03 -3.540507e-02
+4.500000e-02 2.432262e+01 -1.639495e-03 -3.985897e-02
+5.000000e-02 2.541035e+01 -1.716842e-03 -4.428316e-02
+5.500000e-02 2.643288e+01 -1.788769e-03 -4.867522e-02
+6.000000e-02 2.739128e+01 -1.855378e-03 -5.303543e-02
+6.500000e-02 2.829049e+01 -1.917173e-03 -5.736339e-02
+7.000000e-02 2.913507e+01 -1.974604e-03 -6.165881e-02
+7.500000e-02 2.992937e+01 -2.028075e-03 -6.592143e-02
+8.000000e-02 3.067745e+01 -2.077949e-03 -7.015109e-02
+8.500000e-02 3.138308e+01 -2.124556e-03 -7.434768e-02
+9.000000e-02 3.204978e+01 -2.168194e-03 -7.851112e-02
+9.500000e-02 3.268077e+01 -2.209135e-03 -8.264141e-02
+1.000000e-01 3.327894e+01 -2.247615e-03 -8.673858e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.009684,0.039422) (0.009627,0.015471) (0.018021,0.009378) (0.034684,0.039422) (0.034627,0.015471) (0.043021,0.009378)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2f134357718d969d0ade25ff8ea787a9e8b4f6fd
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.547930e+01 -2.233363e-03 -2.289604e-03
+1.000000e-02 7.094662e+01 -4.450153e-03 -4.562409e-03
+1.500000e-02 1.062260e+02 -6.655667e-03 -6.823601e-03
+2.000000e-02 1.406883e+02 -8.867201e-03 -9.092150e-03
+2.500000e-02 1.742499e+02 -1.108563e-02 -1.137202e-02
+3.000000e-02 2.074689e+02 -1.329621e-02 -1.364675e-02
+3.500000e-02 2.405935e+02 -1.549274e-02 -1.590860e-02
+4.000000e-02 2.736754e+02 -1.767420e-02 -1.815611e-02
+4.500000e-02 3.067255e+02 -1.984052e-02 -2.038909e-02
+5.000000e-02 3.397474e+02 -2.199178e-02 -2.260759e-02
+5.500000e-02 3.727436e+02 -2.412809e-02 -2.481170e-02
+6.000000e-02 4.057151e+02 -2.624965e-02 -2.700156e-02
+6.500000e-02 4.386639e+02 -2.835655e-02 -2.917727e-02
+7.000000e-02 4.715917e+02 -3.044894e-02 -3.133893e-02
+7.500000e-02 5.044999e+02 -3.252694e-02 -3.348667e-02
+8.000000e-02 5.373900e+02 -3.459068e-02 -3.562060e-02
+8.500000e-02 5.702632e+02 -3.664030e-02 -3.774082e-02
+9.000000e-02 6.031207e+02 -3.867592e-02 -3.984747e-02
+9.500000e-02 6.359636e+02 -4.069768e-02 -4.194066e-02
+1.000000e-01 6.687930e+02 -4.270570e-02 -4.402051e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.001883,0.015790) (0.019166,0.027494) (0.011945,0.031888) (0.026883,0.015790) (0.044166,0.027494) (0.036945,0.031888) (0.051883,0.015790)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f17d153ec1ddf4be6d6d0bb706bbb41b0a2b6bef
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.907393e+00
+1.000000e-02 5.654393e+00
+1.500000e-02 7.733031e+00
+2.000000e-02 8.973927e+00
+2.500000e-02 9.817857e+00
+3.000000e-02 1.053676e+01
+3.500000e-02 1.119250e+01
+4.000000e-02 1.179939e+01
+4.500000e-02 1.236349e+01
+5.000000e-02 1.288904e+01
+5.500000e-02 1.337965e+01
+6.000000e-02 1.383852e+01
+6.500000e-02 1.426855e+01
+7.000000e-02 1.467240e+01
+7.500000e-02 1.505247e+01
+8.000000e-02 1.541102e+01
+8.500000e-02 1.574986e+01
+9.000000e-02 1.607126e+01
+9.500000e-02 1.637684e+01
+1.000000e-01 1.666815e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.001883,0.015790) (0.019166,0.027494) (0.011945,0.031888) (0.026883,0.015790) (0.044166,0.027494) (0.036945,0.031888) (0.051883,0.015790)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..866f92b855bc85cdf160ab62f59421f43673fff0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.317741e+00 -3.347221e-04 -4.284331e-03
+1.000000e-02 1.048382e+01 -6.587368e-04 -8.545723e-03
+1.500000e-02 1.460873e+01 -9.259579e-04 -1.288283e-02
+2.000000e-02 1.718070e+01 -1.106717e-03 -1.736303e-02
+2.500000e-02 1.890266e+01 -1.235961e-03 -2.190792e-02
+3.000000e-02 2.032906e+01 -1.343956e-03 -2.645046e-02
+3.500000e-02 2.161947e+01 -1.440194e-03 -3.097053e-02
+4.000000e-02 2.281192e+01 -1.527494e-03 -3.546299e-02
+4.500000e-02 2.391928e+01 -1.607155e-03 -3.992600e-02
+5.000000e-02 2.494944e+01 -1.680072e-03 -4.435851e-02
+5.500000e-02 2.590834e+01 -1.746942e-03 -4.875980e-02
+6.000000e-02 2.680164e+01 -1.808371e-03 -5.312934e-02
+6.500000e-02 2.763430e+01 -1.864872e-03 -5.746671e-02
+7.000000e-02 2.841086e+01 -1.916893e-03 -6.177162e-02
+7.500000e-02 2.913559e+01 -1.964830e-03 -6.604385e-02
+8.000000e-02 2.981257e+01 -2.009048e-03 -7.028325e-02
+8.500000e-02 3.043948e+01 -2.049077e-03 -7.449114e-02
+9.000000e-02 3.103204e+01 -2.086785e-03 -7.866461e-02
+9.500000e-02 3.158747e+01 -2.121674e-03 -8.280507e-02
+1.000000e-01 3.210855e+01 -2.153971e-03 -8.691256e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.001883,0.015790) (0.019166,0.027494) (0.011945,0.031888) (0.026883,0.015790) (0.044166,0.027494) (0.036945,0.031888) (0.051883,0.015790)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d1f2e0eaf5e793bc2a1b7e2d23aa10af20e96066
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.547632e+01 -2.265088e-03 -2.258601e-03
+1.000000e-02 7.094084e+01 -4.513465e-03 -4.500533e-03
+1.500000e-02 1.062181e+02 -6.750256e-03 -6.731083e-03
+2.000000e-02 1.406790e+02 -8.993397e-03 -8.968461e-03
+2.500000e-02 1.742393e+02 -1.124556e-02 -1.121493e-02
+3.000000e-02 2.074573e+02 -1.349122e-02 -1.345486e-02
+3.500000e-02 2.405809e+02 -1.572337e-02 -1.568137e-02
+4.000000e-02 2.736619e+02 -1.794073e-02 -1.789323e-02
+4.500000e-02 3.067113e+02 -2.014318e-02 -2.009031e-02
+5.000000e-02 3.397325e+02 -2.233081e-02 -2.227269e-02
+5.500000e-02 3.727281e+02 -2.450368e-02 -2.444047e-02
+6.000000e-02 4.056992e+02 -2.666199e-02 -2.659380e-02
+6.500000e-02 4.386478e+02 -2.880583e-02 -2.873278e-02
+7.000000e-02 4.715756e+02 -3.093532e-02 -3.085754e-02
+7.500000e-02 5.044839e+02 -3.305059e-02 -3.296819e-02
+8.000000e-02 5.373742e+02 -3.515175e-02 -3.506488e-02
+8.500000e-02 5.702476e+02 -3.723894e-02 -3.714772e-02
+9.000000e-02 6.031055e+02 -3.931228e-02 -3.921683e-02
+9.500000e-02 6.359488e+02 -4.137191e-02 -4.127233e-02
+1.000000e-01 6.687788e+02 -4.341794e-02 -4.331436e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.012614,0.045027) (0.002013,0.006327) (0.000528,0.021144) (0.037614,0.045027) (0.027013,0.006327) (0.025528,0.021144) (0.052013,0.006327) (0.050528,0.021144)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8134d08f7ee83314ea1c71b918d0c86f91e135a7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.831131e+00
+1.000000e-02 5.573348e+00
+1.500000e-02 7.658520e+00
+2.000000e-02 8.863369e+00
+2.500000e-02 9.693018e+00
+3.000000e-02 1.040632e+01
+3.500000e-02 1.105876e+01
+4.000000e-02 1.166354e+01
+4.500000e-02 1.222633e+01
+5.000000e-02 1.275107e+01
+5.500000e-02 1.324107e+01
+6.000000e-02 1.369930e+01
+6.500000e-02 1.412844e+01
+7.000000e-02 1.453096e+01
+7.500000e-02 1.490916e+01
+8.000000e-02 1.526515e+01
+8.500000e-02 1.560092e+01
+9.000000e-02 1.591830e+01
+9.500000e-02 1.621902e+01
+1.000000e-01 1.650467e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.012614,0.045027) (0.002013,0.006327) (0.000528,0.021144) (0.037614,0.045027) (0.027013,0.006327) (0.025528,0.021144) (0.052013,0.006327) (0.050528,0.021144)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..636e27c9c7e917c9b60e929e5ca5690957d5eeba
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.357959e+00 -3.421191e-04 -4.266040e-03
+1.000000e-02 1.058926e+01 -6.742981e-04 -8.508229e-03
+1.500000e-02 1.478446e+01 -9.469062e-04 -1.283433e-02
+2.000000e-02 1.740147e+01 -1.131084e-03 -1.730803e-02
+2.500000e-02 1.919636e+01 -1.266438e-03 -2.184053e-02
+3.000000e-02 2.069320e+01 -1.380887e-03 -2.637014e-02
+3.500000e-02 2.205103e+01 -1.483467e-03 -3.087772e-02
+4.000000e-02 2.331039e+01 -1.577025e-03 -3.535808e-02
+4.500000e-02 2.448190e+01 -1.662519e-03 -3.980985e-02
+5.000000e-02 2.557976e+01 -1.741591e-03 -4.423082e-02
+5.500000e-02 2.660685e+01 -1.814593e-03 -4.862081e-02
+6.000000e-02 2.756883e+01 -1.882144e-03 -5.297921e-02
+6.500000e-02 2.847043e+01 -1.944750e-03 -5.730563e-02
+7.000000e-02 2.931633e+01 -2.002871e-03 -6.159974e-02
+7.500000e-02 3.011100e+01 -2.056930e-03 -6.586127e-02
+8.000000e-02 3.085825e+01 -2.107275e-03 -7.009006e-02
+8.500000e-02 3.156202e+01 -2.154248e-03 -7.428598e-02
+9.000000e-02 3.222581e+01 -2.198152e-03 -7.844896e-02
+9.500000e-02 3.285262e+01 -2.239247e-03 -8.257899e-02
+1.000000e-01 3.344540e+01 -2.277775e-03 -8.667610e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.012614,0.045027) (0.002013,0.006327) (0.000528,0.021144) (0.037614,0.045027) (0.027013,0.006327) (0.025528,0.021144) (0.052013,0.006327) (0.050528,0.021144)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5ed73b7fbbcefdceacfe8f4ba31b5a2daf66fe36
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.547878e+01 -2.288270e-03 -2.235327e-03
+1.000000e-02 7.094574e+01 -4.559778e-03 -4.454038e-03
+1.500000e-02 1.062252e+02 -6.819586e-03 -6.661501e-03
+2.000000e-02 1.406883e+02 -9.086417e-03 -8.875172e-03
+2.500000e-02 1.742507e+02 -1.136459e-02 -1.109563e-02
+3.000000e-02 2.074707e+02 -1.363778e-02 -1.330803e-02
+3.500000e-02 2.405964e+02 -1.589818e-02 -1.550628e-02
+4.000000e-02 2.736794e+02 -1.814431e-02 -1.768937e-02
+4.500000e-02 3.067306e+02 -2.037598e-02 -1.985725e-02
+5.000000e-02 3.397536e+02 -2.259324e-02 -2.201000e-02
+5.500000e-02 3.727510e+02 -2.479618e-02 -2.414772e-02
+6.000000e-02 4.057237e+02 -2.698494e-02 -2.627060e-02
+6.500000e-02 4.386740e+02 -2.915962e-02 -2.837875e-02
+7.000000e-02 4.716032e+02 -3.132034e-02 -3.047231e-02
+7.500000e-02 5.045131e+02 -3.346720e-02 -3.255138e-02
+8.000000e-02 5.374048e+02 -3.560034e-02 -3.461611e-02
+8.500000e-02 5.702798e+02 -3.771986e-02 -3.666662e-02
+9.000000e-02 6.031391e+02 -3.982590e-02 -3.870305e-02
+9.500000e-02 6.359840e+02 -4.191857e-02 -4.072551e-02
+1.000000e-01 6.688154e+02 -4.399800e-02 -4.273414e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.018684,0.005433) (0.010712,0.036927) (0.019714,0.015158) (0.043684,0.005433) (0.035712,0.036927) (0.044714,0.015158)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..420d5386f1433691258f17aa693007e926680341
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.797801e+00
+1.000000e-02 5.517804e+00
+1.500000e-02 7.594187e+00
+2.000000e-02 8.781263e+00
+2.500000e-02 9.594975e+00
+3.000000e-02 1.029514e+01
+3.500000e-02 1.093644e+01
+4.000000e-02 1.153137e+01
+4.500000e-02 1.208519e+01
+5.000000e-02 1.260157e+01
+5.500000e-02 1.308365e+01
+6.000000e-02 1.353425e+01
+6.500000e-02 1.395595e+01
+7.000000e-02 1.435115e+01
+7.500000e-02 1.472210e+01
+8.000000e-02 1.507087e+01
+8.500000e-02 1.539940e+01
+9.000000e-02 1.570952e+01
+9.500000e-02 1.600290e+01
+1.000000e-01 1.628111e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.018684,0.005433) (0.010712,0.036927) (0.019714,0.015158) (0.043684,0.005433) (0.035712,0.036927) (0.044714,0.015158)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f49b96a328539d2058e2e0968c6a09e29956296b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.522161e+00 -3.563108e-04 -4.234371e-03
+1.000000e-02 1.090611e+01 -7.018569e-04 -8.447002e-03
+1.500000e-02 1.522537e+01 -9.861809e-04 -1.274820e-02
+2.000000e-02 1.789395e+01 -1.177450e-03 -1.720714e-02
+2.500000e-02 1.975252e+01 -1.319914e-03 -2.172507e-02
+3.000000e-02 2.131835e+01 -1.441498e-03 -2.624020e-02
+3.500000e-02 2.273831e+01 -1.550702e-03 -3.073455e-02
+4.000000e-02 2.405004e+01 -1.649967e-03 -3.520346e-02
+4.500000e-02 2.527234e+01 -1.741395e-03 -3.964385e-02
+5.000000e-02 2.641259e+01 -1.825634e-03 -4.405490e-02
+5.500000e-02 2.747754e+01 -1.903440e-03 -4.843576e-02
+6.000000e-02 2.847298e+01 -1.975442e-03 -5.278580e-02
+6.500000e-02 2.940463e+01 -2.042206e-03 -5.710448e-02
+7.000000e-02 3.027759e+01 -2.104232e-03 -6.139138e-02
+7.500000e-02 3.109610e+01 -2.161927e-03 -6.564624e-02
+8.000000e-02 3.186472e+01 -2.215694e-03 -6.986879e-02
+8.500000e-02 3.258759e+01 -2.265893e-03 -7.405884e-02
+9.000000e-02 3.326824e+01 -2.312825e-03 -7.821631e-02
+9.500000e-02 3.390985e+01 -2.356770e-03 -8.234115e-02
+1.000000e-01 3.451592e+01 -2.398007e-03 -8.643329e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.018684,0.005433) (0.010712,0.036927) (0.019714,0.015158) (0.043684,0.005433) (0.035712,0.036927) (0.044714,0.015158)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a140801a6a968a8b44d4c24c85fdb2c4d94cf3f6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.548953e+01 -2.182140e-03 -2.339320e-03
+1.000000e-02 7.096675e+01 -4.347793e-03 -4.661766e-03
+1.500000e-02 1.062553e+02 -6.501870e-03 -6.972978e-03
+2.000000e-02 1.407255e+02 -8.658902e-03 -9.294851e-03
+2.500000e-02 1.742949e+02 -1.081742e-02 -1.163359e-02
+3.000000e-02 2.075212e+02 -1.296519e-02 -1.397025e-02
+3.500000e-02 2.406532e+02 -1.509753e-02 -1.629541e-02
+4.000000e-02 2.737423e+02 -1.721386e-02 -1.860718e-02
+4.500000e-02 3.068001e+02 -1.931411e-02 -2.090528e-02
+5.000000e-02 3.398287e+02 -2.139867e-02 -2.318966e-02
+5.500000e-02 3.728311e+02 -2.346761e-02 -2.546038e-02
+6.000000e-02 4.058089e+02 -2.552111e-02 -2.771750e-02
+6.500000e-02 4.387640e+02 -2.755934e-02 -2.996109e-02
+7.000000e-02 4.716979e+02 -2.958246e-02 -3.219123e-02
+7.500000e-02 5.046120e+02 -3.159063e-02 -3.440801e-02
+8.000000e-02 5.375078e+02 -3.358401e-02 -3.661151e-02
+8.500000e-02 5.703866e+02 -3.556275e-02 -3.880183e-02
+9.000000e-02 6.032495e+02 -3.752701e-02 -4.097906e-02
+9.500000e-02 6.360977e+02 -3.947694e-02 -4.314331e-02
+1.000000e-01 6.689322e+02 -4.141267e-02 -4.529466e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.001541,0.020578) (0.007383,0.031985) (0.018706,0.019932) (0.026541,0.020578) (0.032383,0.031985) (0.043706,0.019932) (0.051541,0.020578)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7050e2d09797a9ab1ab0948b964a2599af563593
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 2.984515e+00
+1.000000e-02 5.719465e+00
+1.500000e-02 7.795708e+00
+2.000000e-02 9.058978e+00
+2.500000e-02 9.916188e+00
+3.000000e-02 1.064193e+01
+3.500000e-02 1.130219e+01
+4.000000e-02 1.191292e+01
+4.500000e-02 1.248104e+01
+5.000000e-02 1.301128e+01
+5.500000e-02 1.350752e+01
+6.000000e-02 1.397309e+01
+6.500000e-02 1.441092e+01
+7.000000e-02 1.482362e+01
+7.500000e-02 1.521354e+01
+8.000000e-02 1.558280e+01
+8.500000e-02 1.593335e+01
+9.000000e-02 1.626698e+01
+9.500000e-02 1.658535e+01
+1.000000e-01 1.689001e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.001541,0.020578) (0.007383,0.031985) (0.018706,0.019932) (0.026541,0.020578) (0.032383,0.031985) (0.043706,0.019932) (0.051541,0.020578)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c7cf6da5694af66de56dc327b9623a3dda84c5e0
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.0924_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 5.679566e+00 -3.493806e-04 -4.259293e-03
+1.000000e-02 1.103939e+01 -6.804230e-04 -8.510257e-03
+1.500000e-02 1.518479e+01 -9.475107e-04 -1.285043e-02
+2.000000e-02 1.785526e+01 -1.131527e-03 -1.732519e-02
+2.500000e-02 1.969832e+01 -1.265588e-03 -2.186157e-02
+3.000000e-02 2.122927e+01 -1.377925e-03 -2.639677e-02
+3.500000e-02 2.260513e+01 -1.477786e-03 -3.091112e-02
+4.000000e-02 2.386812e+01 -1.568126e-03 -3.539912e-02
+4.500000e-02 2.503479e+01 -1.650380e-03 -3.985858e-02
+5.000000e-02 2.611559e+01 -1.725549e-03 -4.428821e-02
+5.500000e-02 2.711884e+01 -1.794436e-03 -4.868708e-02
+6.000000e-02 2.805147e+01 -1.857699e-03 -5.305453e-02
+6.500000e-02 2.891963e+01 -1.915901e-03 -5.739007e-02
+7.000000e-02 2.972900e+01 -1.969541e-03 -6.169328e-02
+7.500000e-02 3.048453e+01 -2.019048e-03 -6.596389e-02
+8.000000e-02 3.119060e+01 -2.064790e-03 -7.020174e-02
+8.500000e-02 3.185166e+01 -2.107124e-03 -7.440666e-02
+9.000000e-02 3.247189e+01 -2.146381e-03 -7.857852e-02
+9.500000e-02 3.305496e+01 -2.182849e-03 -8.271730e-02
+1.000000e-01 3.360407e+01 -2.216777e-03 -8.682300e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.001541,0.020578) (0.007383,0.031985) (0.018706,0.019932) (0.026541,0.020578) (0.032383,0.031985) (0.043706,0.019932) (0.051541,0.020578)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..75d1453eeced4f735365572eee346fa071ea7061
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.813412e+01 -2.056709e-03 -2.113241e-03
+1.000000e-02 1.562041e+02 -4.098185e-03 -4.211125e-03
+1.500000e-02 2.340531e+02 -6.129428e-03 -6.298495e-03
+2.000000e-02 3.111341e+02 -8.166138e-03 -8.392960e-03
+2.500000e-02 3.873979e+02 -1.020820e-02 -1.049784e-02
+3.000000e-02 4.633295e+02 -1.224256e-02 -1.259802e-02
+3.500000e-02 5.391417e+02 -1.426378e-02 -1.468633e-02
+4.000000e-02 6.148770e+02 -1.627105e-02 -1.676146e-02
+4.500000e-02 6.905445e+02 -1.826434e-02 -1.882325e-02
+5.000000e-02 7.661474e+02 -2.024375e-02 -2.087173e-02
+5.500000e-02 8.416885e+02 -2.220932e-02 -2.290695e-02
+6.000000e-02 9.171674e+02 -2.416132e-02 -2.492909e-02
+6.500000e-02 9.925866e+02 -2.609981e-02 -2.693819e-02
+7.000000e-02 1.067947e+03 -2.802490e-02 -2.893437e-02
+7.500000e-02 1.143251e+03 -2.993672e-02 -3.091772e-02
+8.000000e-02 1.218499e+03 -3.183540e-02 -3.288835e-02
+8.500000e-02 1.293692e+03 -3.372105e-02 -3.484635e-02
+9.000000e-02 1.368832e+03 -3.559379e-02 -3.679184e-02
+9.500000e-02 1.443918e+03 -3.745376e-02 -3.872493e-02
+1.000000e-01 1.518952e+03 -3.930106e-02 -4.064572e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002481,0.033386) (0.000155,0.012948) (0.018811,0.024112) (0.016276,0.012041) (0.002139,0.021832) (0.018830,0.037674) (0.009617,0.045172) (0.027481,0.033386) (0.025155,0.012948) (0.043811,0.024112) (0.041276,0.012041) (0.027139,0.021832) (0.043830,0.037674) (0.034617,0.045172) (0.052481,0.033386) (0.050155,0.012948) (0.052139,0.021832)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c3e2139e61dfe282614f57fab92989b4eb303897
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.738983e+00
+1.000000e-02 6.996406e+00
+1.500000e-02 9.020571e+00
+2.000000e-02 1.028987e+01
+2.500000e-02 1.127444e+01
+3.000000e-02 1.213243e+01
+3.500000e-02 1.290532e+01
+4.000000e-02 1.360865e+01
+4.500000e-02 1.425192e+01
+5.000000e-02 1.484242e+01
+5.500000e-02 1.538639e+01
+6.000000e-02 1.588924e+01
+6.500000e-02 1.635581e+01
+7.000000e-02 1.679036e+01
+7.500000e-02 1.719678e+01
+8.000000e-02 1.757852e+01
+8.500000e-02 1.793869e+01
+9.000000e-02 1.828007e+01
+9.500000e-02 1.860524e+01
+1.000000e-01 1.891652e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002481,0.033386) (0.000155,0.012948) (0.018811,0.024112) (0.016276,0.012041) (0.002139,0.021832) (0.018830,0.037674) (0.009617,0.045172) (0.027481,0.033386) (0.025155,0.012948) (0.043811,0.024112) (0.041276,0.012041) (0.027139,0.021832) (0.043830,0.037674) (0.034617,0.045172) (0.052481,0.033386) (0.050155,0.012948) (0.052139,0.021832)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6d70a845385d551a957fcad45c9d639e994c5055
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.907877e+00 -2.084683e-04 -4.293876e-03
+1.000000e-02 1.493778e+01 -3.950887e-04 -8.613366e-03
+1.500000e-02 1.960205e+01 -5.238873e-04 -1.308083e-02
+2.000000e-02 2.270217e+01 -6.132097e-04 -1.763560e-02
+2.500000e-02 2.518177e+01 -6.857537e-04 -2.219987e-02
+3.000000e-02 2.736111e+01 -7.494897e-04 -2.674652e-02
+3.500000e-02 2.933854e+01 -8.070382e-04 -3.126720e-02
+4.000000e-02 3.115378e+01 -8.595799e-04 -3.575864e-02
+4.500000e-02 3.282931e+01 -9.078439e-04 -4.021907e-02
+5.000000e-02 3.438154e+01 -9.523765e-04 -4.464732e-02
+5.500000e-02 3.582435e+01 -9.936334e-04 -4.904249e-02
+6.000000e-02 3.716955e+01 -1.031998e-03 -5.340388e-02
+6.500000e-02 3.842745e+01 -1.067799e-03 -5.773095e-02
+7.000000e-02 3.960699e+01 -1.101320e-03 -6.202329e-02
+7.500000e-02 4.071643e+01 -1.132815e-03 -6.628058e-02
+8.000000e-02 4.176308e+01 -1.162509e-03 -7.050255e-02
+8.500000e-02 4.275315e+01 -1.190591e-03 -7.468907e-02
+9.000000e-02 4.369507e+01 -1.217296e-03 -7.884034e-02
+9.500000e-02 4.458949e+01 -1.242675e-03 -8.295560e-02
+1.000000e-01 4.544415e+01 -1.266941e-03 -8.703511e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002481,0.033386) (0.000155,0.012948) (0.018811,0.024112) (0.016276,0.012041) (0.002139,0.021832) (0.018830,0.037674) (0.009617,0.045172) (0.027481,0.033386) (0.025155,0.012948) (0.043811,0.024112) (0.041276,0.012041) (0.027139,0.021832) (0.043830,0.037674) (0.034617,0.045172) (0.052481,0.033386) (0.050155,0.012948) (0.052139,0.021832)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a883d4c87794575684ac68e5057d8ad8dbf65b4d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.813522e+01 -2.092552e-03 -2.075905e-03
+1.000000e-02 1.562058e+02 -4.169780e-03 -4.136567e-03
+1.500000e-02 2.340544e+02 -6.236825e-03 -6.186800e-03
+2.000000e-02 3.111338e+02 -8.311142e-03 -8.242619e-03
+2.500000e-02 3.873961e+02 -1.039420e-02 -1.030560e-02
+3.000000e-02 4.633259e+02 -1.247133e-02 -1.236220e-02
+3.500000e-02 5.391360e+02 -1.453605e-02 -1.440621e-02
+4.000000e-02 6.148688e+02 -1.658731e-02 -1.643663e-02
+4.500000e-02 6.905337e+02 -1.862496e-02 -1.845334e-02
+5.000000e-02 7.661337e+02 -2.064908e-02 -2.045643e-02
+5.500000e-02 8.416718e+02 -2.265971e-02 -2.244592e-02
+6.000000e-02 9.171475e+02 -2.465705e-02 -2.442209e-02
+6.500000e-02 9.925633e+02 -2.664115e-02 -2.638497e-02
+7.000000e-02 1.067921e+03 -2.861211e-02 -2.833469e-02
+7.500000e-02 1.143221e+03 -3.057005e-02 -3.027135e-02
+8.000000e-02 1.218465e+03 -3.251507e-02 -3.219508e-02
+8.500000e-02 1.293654e+03 -3.444728e-02 -3.410600e-02
+9.000000e-02 1.368789e+03 -3.636678e-02 -3.600421e-02
+9.500000e-02 1.443871e+03 -3.827369e-02 -3.788985e-02
+1.000000e-01 1.518901e+03 -4.016811e-02 -3.976303e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002908,0.008849) (0.020494,0.036142) (0.020424,0.020543) (0.007881,0.045371) (0.009322,0.028931) (0.010999,0.037504) (0.019095,0.008162) (0.027908,0.008849) (0.045494,0.036142) (0.045424,0.020543) (0.032881,0.045371) (0.034322,0.028931) (0.035999,0.037504) (0.044095,0.008162) (0.052908,0.008849)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..11de09c7075f5a05326e6dae6b0515d0f9be2c14
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.707187e+00
+1.000000e-02 6.949341e+00
+1.500000e-02 9.010965e+00
+2.000000e-02 1.027483e+01
+2.500000e-02 1.125238e+01
+3.000000e-02 1.210655e+01
+3.500000e-02 1.287726e+01
+4.000000e-02 1.357956e+01
+4.500000e-02 1.422273e+01
+5.000000e-02 1.481401e+01
+5.500000e-02 1.535964e+01
+6.000000e-02 1.586503e+01
+6.500000e-02 1.633499e+01
+7.000000e-02 1.677377e+01
+7.500000e-02 1.718522e+01
+8.000000e-02 1.757279e+01
+8.500000e-02 1.793955e+01
+9.000000e-02 1.828824e+01
+9.500000e-02 1.862135e+01
+1.000000e-01 1.894114e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002908,0.008849) (0.020494,0.036142) (0.020424,0.020543) (0.007881,0.045371) (0.009322,0.028931) (0.010999,0.037504) (0.019095,0.008162) (0.027908,0.008849) (0.045494,0.036142) (0.045424,0.020543) (0.032881,0.045371) (0.034322,0.028931) (0.035999,0.037504) (0.044095,0.008162) (0.052908,0.008849)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a7b680df4e99a294751606c3f75ae030be1ab387
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.844271e+00 -2.103343e-04 -4.282551e-03
+1.000000e-02 1.489061e+01 -4.001445e-04 -8.587660e-03
+1.500000e-02 1.953916e+01 -5.306760e-04 -1.304754e-02
+2.000000e-02 2.259409e+01 -6.202481e-04 -1.760106e-02
+2.500000e-02 2.502005e+01 -6.925974e-04 -2.216598e-02
+3.000000e-02 2.714368e+01 -7.558867e-04 -2.671447e-02
+3.500000e-02 2.906151e+01 -8.127807e-04 -3.123852e-02
+4.000000e-02 3.081447e+01 -8.643369e-04 -3.573457e-02
+4.500000e-02 3.242355e+01 -9.113446e-04 -4.020107e-02
+5.000000e-02 3.390525e+01 -9.543663e-04 -4.463682e-02
+5.500000e-02 3.527314e+01 -9.938637e-04 -4.904093e-02
+6.000000e-02 3.653955e+01 -1.030244e-03 -5.341269e-02
+6.500000e-02 3.771516e+01 -1.063859e-03 -5.775153e-02
+7.000000e-02 3.880963e+01 -1.095017e-03 -6.205701e-02
+7.500000e-02 3.983146e+01 -1.123989e-03 -6.632879e-02
+8.000000e-02 4.078896e+01 -1.151035e-03 -7.056659e-02
+8.500000e-02 4.168905e+01 -1.176369e-03 -7.477024e-02
+9.000000e-02 4.253773e+01 -1.200179e-03 -7.893966e-02
+9.500000e-02 4.334075e+01 -1.222641e-03 -8.307479e-02
+1.000000e-01 4.410344e+01 -1.243918e-03 -8.717563e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.002908,0.008849) (0.020494,0.036142) (0.020424,0.020543) (0.007881,0.045371) (0.009322,0.028931) (0.010999,0.037504) (0.019095,0.008162) (0.027908,0.008849) (0.045494,0.036142) (0.045424,0.020543) (0.032881,0.045371) (0.034322,0.028931) (0.035999,0.037504) (0.044095,0.008162) (0.052908,0.008849)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..16eb35ce11feb225fb8fee74ace876af2fc95e16
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.812616e+01 -2.090457e-03 -2.079490e-03
+1.000000e-02 1.561882e+02 -4.165593e-03 -4.143712e-03
+1.500000e-02 2.340291e+02 -6.230330e-03 -6.197594e-03
+2.000000e-02 3.111018e+02 -8.301506e-03 -8.257634e-03
+2.500000e-02 3.873555e+02 -1.038106e-02 -1.032532e-02
+3.000000e-02 4.632803e+02 -1.245439e-02 -1.238641e-02
+3.500000e-02 5.390840e+02 -1.451537e-02 -1.443504e-02
+4.000000e-02 6.148108e+02 -1.656283e-02 -1.647009e-02
+4.500000e-02 6.904699e+02 -1.859663e-02 -1.849148e-02
+5.000000e-02 7.660643e+02 -2.061685e-02 -2.049926e-02
+5.500000e-02 8.415960e+02 -2.262359e-02 -2.249354e-02
+6.000000e-02 9.170674e+02 -2.461690e-02 -2.447438e-02
+6.500000e-02 9.924782e+02 -2.659699e-02 -2.644200e-02
+7.000000e-02 1.067831e+03 -2.856392e-02 -2.839647e-02
+7.500000e-02 1.143126e+03 -3.051779e-02 -3.033790e-02
+8.000000e-02 1.218366e+03 -3.245871e-02 -3.226641e-02
+8.500000e-02 1.293551e+03 -3.438680e-02 -3.418211e-02
+9.000000e-02 1.368682e+03 -3.630217e-02 -3.608512e-02
+9.500000e-02 1.443760e+03 -3.820493e-02 -3.797555e-02
+1.000000e-01 1.518786e+03 -4.009519e-02 -3.985352e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.019015,0.010522) (0.001653,0.044223) (0.000995,0.020529) (0.017580,0.033517) (0.017481,0.044478) (0.007744,0.006062) (0.015635,0.023970) (0.044015,0.010522) (0.026653,0.044223) (0.025995,0.020529) (0.042580,0.033517) (0.042481,0.044478) (0.032744,0.006062) (0.040635,0.023970) (0.051653,0.044223) (0.050995,0.020529)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e3e1aa44657c5fff4bb60bfebb4fc97cdaa4d87c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.684322e+00
+1.000000e-02 6.944387e+00
+1.500000e-02 8.993648e+00
+2.000000e-02 1.024971e+01
+2.500000e-02 1.122803e+01
+3.000000e-02 1.208572e+01
+3.500000e-02 1.286101e+01
+4.000000e-02 1.356836e+01
+4.500000e-02 1.421671e+01
+5.000000e-02 1.481306e+01
+5.500000e-02 1.536339e+01
+6.000000e-02 1.587297e+01
+6.500000e-02 1.634649e+01
+7.000000e-02 1.678815e+01
+7.500000e-02 1.720174e+01
+8.000000e-02 1.759067e+01
+8.500000e-02 1.795801e+01
+9.000000e-02 1.830655e+01
+9.500000e-02 1.863882e+01
+1.000000e-01 1.895709e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.019015,0.010522) (0.001653,0.044223) (0.000995,0.020529) (0.017580,0.033517) (0.017481,0.044478) (0.007744,0.006062) (0.015635,0.023970) (0.044015,0.010522) (0.026653,0.044223) (0.025995,0.020529) (0.042580,0.033517) (0.042481,0.044478) (0.032744,0.006062) (0.040635,0.023970) (0.051653,0.044223) (0.050995,0.020529)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a5cb434bc9e27688f685ea5c553a6f94a2a7b297
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.698900e+00 -2.062559e-04 -4.296208e-03
+1.000000e-02 1.463151e+01 -3.926629e-04 -8.612714e-03
+1.500000e-02 1.919292e+01 -5.202147e-04 -1.308251e-02
+2.000000e-02 2.220235e+01 -6.084207e-04 -1.763971e-02
+2.500000e-02 2.460895e+01 -6.801613e-04 -2.220606e-02
+3.000000e-02 2.672651e+01 -7.432452e-04 -2.675497e-02
+3.500000e-02 2.864760e+01 -8.001849e-04 -3.127850e-02
+4.000000e-02 3.040914e+01 -8.521124e-04 -3.577356e-02
+4.500000e-02 3.203311e+01 -8.997536e-04 -4.023843e-02
+5.000000e-02 3.353556e+01 -9.436539e-04 -4.467199e-02
+5.500000e-02 3.493010e+01 -9.842696e-04 -4.907337e-02
+6.000000e-02 3.622863e+01 -1.021991e-03 -5.344192e-02
+6.500000e-02 3.744154e+01 -1.057154e-03 -5.777712e-02
+7.000000e-02 3.857801e+01 -1.090052e-03 -6.207859e-02
+7.500000e-02 3.964635e+01 -1.120948e-03 -6.634605e-02
+8.000000e-02 4.065449e+01 -1.150084e-03 -7.057925e-02
+8.500000e-02 4.160906e+01 -1.177668e-03 -7.477806e-02
+9.000000e-02 4.251603e+01 -1.203882e-03 -7.894242e-02
+9.500000e-02 4.338083e+01 -1.228890e-03 -8.307231e-02
+1.000000e-01 4.420844e+01 -1.252842e-03 -8.716776e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.019015,0.010522) (0.001653,0.044223) (0.000995,0.020529) (0.017580,0.033517) (0.017481,0.044478) (0.007744,0.006062) (0.015635,0.023970) (0.044015,0.010522) (0.026653,0.044223) (0.025995,0.020529) (0.042580,0.033517) (0.042481,0.044478) (0.032744,0.006062) (0.040635,0.023970) (0.051653,0.044223) (0.050995,0.020529)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a3757fef5d46c135eb4a2b276f4769deccd5af43
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.812913e+01 -2.065326e-03 -2.104888e-03
+1.000000e-02 1.561942e+02 -4.115439e-03 -4.194396e-03
+1.500000e-02 2.340386e+02 -6.155465e-03 -6.273202e-03
+2.000000e-02 3.111152e+02 -8.201994e-03 -8.357987e-03
+2.500000e-02 3.873744e+02 -1.025547e-02 -1.045160e-02
+3.000000e-02 4.633016e+02 -1.230207e-02 -1.253967e-02
+3.500000e-02 5.391094e+02 -1.433602e-02 -1.461538e-02
+4.000000e-02 6.148405e+02 -1.635639e-02 -1.667753e-02
+4.500000e-02 6.905039e+02 -1.836312e-02 -1.872600e-02
+5.000000e-02 7.661027e+02 -2.035629e-02 -2.076084e-02
+5.500000e-02 8.416396e+02 -2.233594e-02 -2.278210e-02
+6.000000e-02 9.171146e+02 -2.430230e-02 -2.478999e-02
+6.500000e-02 9.925299e+02 -2.625543e-02 -2.678456e-02
+7.000000e-02 1.067887e+03 -2.819543e-02 -2.876592e-02
+7.500000e-02 1.143187e+03 -3.012242e-02 -3.073419e-02
+8.000000e-02 1.218431e+03 -3.203653e-02 -3.268948e-02
+8.500000e-02 1.293621e+03 -3.393786e-02 -3.463190e-02
+9.000000e-02 1.368757e+03 -3.582653e-02 -3.656156e-02
+9.500000e-02 1.443839e+03 -3.770265e-02 -3.847858e-02
+1.000000e-01 1.518870e+03 -3.956634e-02 -4.038307e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.007820,0.006582) (0.008526,0.032891) (0.017880,0.021391) (0.002923,0.021632) (0.001236,0.045033) (0.016564,0.042758) (0.019683,0.030348) (0.032820,0.006582) (0.033526,0.032891) (0.042880,0.021391) (0.027923,0.021632) (0.026236,0.045033) (0.041564,0.042758) (0.044683,0.030348) (0.052923,0.021632) (0.051236,0.045033)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8fa1c8751c9d1af40080a0c6e91fe33dd15ffaca
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.742611e+00
+1.000000e-02 7.010713e+00
+1.500000e-02 9.078419e+00
+2.000000e-02 1.037003e+01
+2.500000e-02 1.136460e+01
+3.000000e-02 1.223251e+01
+3.500000e-02 1.301635e+01
+4.000000e-02 1.373143e+01
+4.500000e-02 1.438694e+01
+5.000000e-02 1.499003e+01
+5.500000e-02 1.554685e+01
+6.000000e-02 1.606281e+01
+6.500000e-02 1.654272e+01
+7.000000e-02 1.699094e+01
+7.500000e-02 1.741138e+01
+8.000000e-02 1.780755e+01
+8.500000e-02 1.818265e+01
+9.000000e-02 1.853953e+01
+9.500000e-02 1.888078e+01
+1.000000e-01 1.920876e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.007820,0.006582) (0.008526,0.032891) (0.017880,0.021391) (0.002923,0.021632) (0.001236,0.045033) (0.016564,0.042758) (0.019683,0.030348) (0.032820,0.006582) (0.033526,0.032891) (0.042880,0.021391) (0.027923,0.021632) (0.026236,0.045033) (0.041564,0.042758) (0.044683,0.030348) (0.052923,0.021632) (0.051236,0.045033)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c96fdb2d2c92d9a2713e205415416fe7e7ecb5a8
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.499114e+00 -1.984375e-04 -4.325472e-03
+1.000000e-02 1.422823e+01 -3.780133e-04 -8.666124e-03
+1.500000e-02 1.863414e+01 -5.017851e-04 -1.314683e-02
+2.000000e-02 2.148055e+01 -5.853552e-04 -1.771829e-02
+2.500000e-02 2.371997e+01 -6.518025e-04 -2.230135e-02
+3.000000e-02 2.567861e+01 -7.096224e-04 -2.686675e-02
+3.500000e-02 2.744893e+01 -7.614822e-04 -3.140598e-02
+4.000000e-02 2.906659e+01 -8.085342e-04 -3.591589e-02
+4.500000e-02 3.055311e+01 -8.515045e-04 -4.039480e-02
+5.000000e-02 3.192411e+01 -8.909249e-04 -4.484166e-02
+5.500000e-02 3.319246e+01 -9.272247e-04 -4.925574e-02
+6.000000e-02 3.436986e+01 -9.607826e-04 -5.363643e-02
+6.500000e-02 3.546652e+01 -9.919251e-04 -5.798329e-02
+7.000000e-02 3.649140e+01 -1.020934e-03 -6.229600e-02
+7.500000e-02 3.745269e+01 -1.048064e-03 -6.657432e-02
+8.000000e-02 3.835777e+01 -1.073542e-03 -7.081809e-02
+8.500000e-02 3.921320e+01 -1.097567e-03 -7.502721e-02
+9.000000e-02 4.002509e+01 -1.120325e-03 -7.920165e-02
+9.500000e-02 4.079954e+01 -1.142043e-03 -8.334162e-02
+1.000000e-01 4.154009e+01 -1.162738e-03 -8.744675e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.007820,0.006582) (0.008526,0.032891) (0.017880,0.021391) (0.002923,0.021632) (0.001236,0.045033) (0.016564,0.042758) (0.019683,0.030348) (0.032820,0.006582) (0.033526,0.032891) (0.042880,0.021391) (0.027923,0.021632) (0.026236,0.045033) (0.041564,0.042758) (0.044683,0.030348) (0.052923,0.021632) (0.051236,0.045033)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f579040c82a34e07554fdb84a0474344bcc516dd
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.813093e+01 -2.081631e-03 -2.088854e-03
+1.000000e-02 1.561979e+02 -4.147969e-03 -4.162404e-03
+1.500000e-02 2.340444e+02 -6.203974e-03 -6.225465e-03
+2.000000e-02 3.111235e+02 -8.266307e-03 -8.294611e-03
+2.500000e-02 3.873850e+02 -1.033629e-02 -1.037187e-02
+3.000000e-02 4.633144e+02 -1.239985e-02 -1.244314e-02
+3.500000e-02 5.391243e+02 -1.445083e-02 -1.450198e-02
+4.000000e-02 6.148573e+02 -1.648822e-02 -1.654730e-02
+4.500000e-02 6.905227e+02 -1.851191e-02 -1.857897e-02
+5.000000e-02 7.661236e+02 -2.052198e-02 -2.059707e-02
+5.500000e-02 8.416627e+02 -2.251847e-02 -2.260165e-02
+6.000000e-02 9.171399e+02 -2.450161e-02 -2.459292e-02
+6.500000e-02 9.925574e+02 -2.647145e-02 -2.657093e-02
+7.000000e-02 1.067917e+03 -2.842810e-02 -2.853581e-02
+7.500000e-02 1.143219e+03 -3.037168e-02 -3.048765e-02
+8.000000e-02 1.218466e+03 -3.230230e-02 -3.242658e-02
+8.500000e-02 1.293657e+03 -3.422008e-02 -3.435271e-02
+9.000000e-02 1.368795e+03 -3.612511e-02 -3.626616e-02
+9.500000e-02 1.443881e+03 -3.801753e-02 -3.816703e-02
+1.000000e-01 1.518914e+03 -3.989745e-02 -4.005545e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.019799,0.018193) (0.017933,0.033940) (0.015634,0.045365) (0.007881,0.018681) (0.002307,0.007641) (0.002333,0.042966) (0.007461,0.029140) (0.044799,0.018193) (0.042933,0.033940) (0.040634,0.045365) (0.032881,0.018681) (0.027307,0.007641) (0.027333,0.042966) (0.032461,0.029140) (0.052307,0.007641) (0.052333,0.042966)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a849b47338979e3687a3065895de9d30411a6149
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.693560e+00
+1.000000e-02 6.969531e+00
+1.500000e-02 9.016917e+00
+2.000000e-02 1.028722e+01
+2.500000e-02 1.127815e+01
+3.000000e-02 1.214639e+01
+3.500000e-02 1.293109e+01
+4.000000e-02 1.364716e+01
+4.500000e-02 1.430370e+01
+5.000000e-02 1.490778e+01
+5.500000e-02 1.546541e+01
+6.000000e-02 1.598186e+01
+6.500000e-02 1.646187e+01
+7.000000e-02 1.690971e+01
+7.500000e-02 1.732920e+01
+8.000000e-02 1.772380e+01
+8.500000e-02 1.809663e+01
+9.000000e-02 1.845054e+01
+9.500000e-02 1.878810e+01
+1.000000e-01 1.911166e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.019799,0.018193) (0.017933,0.033940) (0.015634,0.045365) (0.007881,0.018681) (0.002307,0.007641) (0.002333,0.042966) (0.007461,0.029140) (0.044799,0.018193) (0.042933,0.033940) (0.040634,0.045365) (0.032881,0.018681) (0.027307,0.007641) (0.027333,0.042966) (0.032461,0.029140) (0.052307,0.007641) (0.052333,0.042966)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1c884fbb9fe19ccb236f8599530b9be20ac1b42b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.2155_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.516861e+00 -2.004717e-04 -4.316434e-03
+1.000000e-02 1.431101e+01 -3.824375e-04 -8.648177e-03
+1.500000e-02 1.873076e+01 -5.054470e-04 -1.313324e-02
+2.000000e-02 2.160110e+01 -5.887856e-04 -1.770664e-02
+2.500000e-02 2.390350e+01 -6.566090e-04 -2.228583e-02
+3.000000e-02 2.593287e+01 -7.162693e-04 -2.684550e-02
+3.500000e-02 2.777301e+01 -7.701072e-04 -3.137868e-02
+4.000000e-02 2.945982e+01 -8.192032e-04 -3.588247e-02
+4.500000e-02 3.101468e+01 -8.642391e-04 -4.035533e-02
+5.000000e-02 3.245397e+01 -9.057456e-04 -4.479617e-02
+5.500000e-02 3.379088e+01 -9.441525e-04 -4.920423e-02
+6.000000e-02 3.503688e+01 -9.798310e-04 -5.357893e-02
+6.500000e-02 3.620174e+01 -1.013095e-03 -5.791984e-02
+7.000000e-02 3.729455e+01 -1.044232e-03 -6.222662e-02
+7.500000e-02 3.831003e+01 -1.072874e-03 -6.650058e-02
+8.000000e-02 3.928101e+01 -1.100451e-03 -7.073854e-02
+8.500000e-02 4.020205e+01 -1.126592e-03 -7.494181e-02
+9.000000e-02 4.107855e+01 -1.151461e-03 -7.911040e-02
+9.500000e-02 4.191554e+01 -1.175211e-03 -8.324434e-02
+1.000000e-01 4.271719e+01 -1.197972e-03 -8.734373e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.019799,0.018193) (0.017933,0.033940) (0.015634,0.045365) (0.007881,0.018681) (0.002307,0.007641) (0.002333,0.042966) (0.007461,0.029140) (0.044799,0.018193) (0.042933,0.033940) (0.040634,0.045365) (0.032881,0.018681) (0.027307,0.007641) (0.027333,0.042966) (0.032461,0.029140) (0.052307,0.007641) (0.052333,0.042966)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2ffdd99560f803619f35679cfd8fdc125ebb1572
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.100930e+02 -1.961622e-03 -1.945227e-03
+1.000000e-02 2.200440e+02 -3.908965e-03 -3.876276e-03
+1.500000e-02 3.297118e+02 -5.846434e-03 -5.797972e-03
+2.000000e-02 4.386125e+02 -7.789214e-03 -7.725869e-03
+2.500000e-02 5.467164e+02 -9.739312e-03 -9.660396e-03
+3.000000e-02 6.544590e+02 -1.168351e-02 -1.158834e-02
+3.500000e-02 7.620213e+02 -1.361619e-02 -1.350454e-02
+4.000000e-02 8.694417e+02 -1.553625e-02 -1.540804e-02
+4.500000e-02 9.767284e+02 -1.744357e-02 -1.729876e-02
+5.000000e-02 1.083885e+03 -1.933823e-02 -1.917677e-02
+5.500000e-02 1.190912e+03 -2.122031e-02 -2.104215e-02
+6.000000e-02 1.297814e+03 -2.308984e-02 -2.289494e-02
+6.500000e-02 1.404589e+03 -2.494708e-02 -2.473538e-02
+7.000000e-02 1.511240e+03 -2.679205e-02 -2.656350e-02
+7.500000e-02 1.617768e+03 -2.862486e-02 -2.837940e-02
+8.000000e-02 1.724175e+03 -3.044561e-02 -3.018319e-02
+8.500000e-02 1.830461e+03 -3.225442e-02 -3.197497e-02
+9.000000e-02 1.936629e+03 -3.405138e-02 -3.375485e-02
+9.500000e-02 2.042678e+03 -3.583661e-02 -3.552293e-02
+1.000000e-01 2.148610e+03 -3.761021e-02 -3.727932e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.012105,0.026463) (0.010078,0.037490) (0.020172,0.004416) (0.011774,0.013812) (0.007032,0.005203) (0.000391,0.028417) (0.000251,0.018823) (0.013904,0.045525) (0.017271,0.033842) (0.000204,0.043109) (0.037105,0.026463) (0.035078,0.037490) (0.045172,0.004416) (0.036774,0.013812) (0.032032,0.005203) (0.025391,0.028417) (0.025251,0.018823) (0.038904,0.045525) (0.042271,0.033842) (0.025204,0.043109) (0.050391,0.028417) (0.050251,0.018823) (0.050204,0.043109)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aebc067034afc6fc5a0eac86df66ae63f91b1be9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.486385e+00
+1.000000e-02 8.133240e+00
+1.500000e-02 1.017833e+01
+2.000000e-02 1.153144e+01
+2.500000e-02 1.264237e+01
+3.000000e-02 1.361880e+01
+3.500000e-02 1.449320e+01
+4.000000e-02 1.528233e+01
+4.500000e-02 1.599829e+01
+5.000000e-02 1.665096e+01
+5.500000e-02 1.724882e+01
+6.000000e-02 1.779930e+01
+6.500000e-02 1.830891e+01
+7.000000e-02 1.878341e+01
+7.500000e-02 1.922788e+01
+8.000000e-02 1.964682e+01
+8.500000e-02 2.004425e+01
+9.000000e-02 2.042375e+01
+9.500000e-02 2.078850e+01
+1.000000e-01 2.114134e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.012105,0.026463) (0.010078,0.037490) (0.020172,0.004416) (0.011774,0.013812) (0.007032,0.005203) (0.000391,0.028417) (0.000251,0.018823) (0.013904,0.045525) (0.017271,0.033842) (0.000204,0.043109) (0.037105,0.026463) (0.035078,0.037490) (0.045172,0.004416) (0.036774,0.013812) (0.032032,0.005203) (0.025391,0.028417) (0.025251,0.018823) (0.038904,0.045525) (0.042271,0.033842) (0.025204,0.043109) (0.050391,0.028417) (0.050251,0.018823) (0.050204,0.043109)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..57dc603a6ca2add70817b84168b8ec8dea23a198
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.855463e+00 -1.579466e-04 -4.326147e-03
+1.000000e-02 1.637879e+01 -2.928494e-04 -8.701604e-03
+1.500000e-02 2.087551e+01 -3.769556e-04 -1.324402e-02
+2.000000e-02 2.391458e+01 -4.356611e-04 -1.784699e-02
+2.500000e-02 2.641894e+01 -4.842621e-04 -2.244461e-02
+3.000000e-02 2.863703e+01 -5.270970e-04 -2.701919e-02
+3.500000e-02 3.064452e+01 -5.656103e-04 -3.156545e-02
+4.000000e-02 3.247793e+01 -6.005678e-04 -3.608099e-02
+4.500000e-02 3.416219e+01 -6.325148e-04 -4.056429e-02
+5.000000e-02 3.571735e+01 -6.618900e-04 -4.501423e-02
+5.500000e-02 3.716057e+01 -6.890639e-04 -4.942996e-02
+6.000000e-02 3.850713e+01 -7.143591e-04 -5.381079e-02
+6.500000e-02 3.977048e+01 -7.380574e-04 -5.815618e-02
+7.000000e-02 4.096221e+01 -7.603981e-04 -6.246574e-02
+7.500000e-02 4.209274e+01 -7.815945e-04 -6.673917e-02
+8.000000e-02 4.317143e+01 -8.018363e-04 -7.097626e-02
+8.500000e-02 4.420608e+01 -8.212823e-04 -7.517691e-02
+9.000000e-02 4.520377e+01 -8.400746e-04 -7.934107e-02
+9.500000e-02 4.617097e+01 -8.583422e-04 -8.346872e-02
+1.000000e-01 4.711325e+01 -8.761964e-04 -8.755992e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.012105,0.026463) (0.010078,0.037490) (0.020172,0.004416) (0.011774,0.013812) (0.007032,0.005203) (0.000391,0.028417) (0.000251,0.018823) (0.013904,0.045525) (0.017271,0.033842) (0.000204,0.043109) (0.037105,0.026463) (0.035078,0.037490) (0.045172,0.004416) (0.036774,0.013812) (0.032032,0.005203) (0.025391,0.028417) (0.025251,0.018823) (0.038904,0.045525) (0.042271,0.033842) (0.025204,0.043109) (0.050391,0.028417) (0.050251,0.018823) (0.050204,0.043109)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..dcb2151af86e1ed47f6397ff495ebf08027e8cd5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.101055e+02 -1.923655e-03 -1.980593e-03
+1.000000e-02 2.200682e+02 -3.833205e-03 -3.946862e-03
+1.500000e-02 3.297451e+02 -5.733426e-03 -5.903553e-03
+2.000000e-02 4.386528e+02 -7.638318e-03 -7.867723e-03
+2.500000e-02 5.467642e+02 -9.547500e-03 -9.841706e-03
+3.000000e-02 6.545138e+02 -1.144917e-02 -1.181077e-02
+3.500000e-02 7.620823e+02 -1.333873e-02 -1.376874e-02
+4.000000e-02 8.695082e+02 -1.521535e-02 -1.571442e-02
+4.500000e-02 9.767998e+02 -1.707897e-02 -1.764763e-02
+5.000000e-02 1.083960e+03 -1.892969e-02 -1.956840e-02
+5.500000e-02 1.190991e+03 -2.076762e-02 -2.147682e-02
+6.000000e-02 1.297895e+03 -2.259289e-02 -2.337294e-02
+6.500000e-02 1.404674e+03 -2.440547e-02 -2.525680e-02
+7.000000e-02 1.511327e+03 -2.620576e-02 -2.712860e-02
+7.500000e-02 1.617857e+03 -2.799373e-02 -2.898837e-02
+8.000000e-02 1.724265e+03 -2.976951e-02 -3.083620e-02
+8.500000e-02 1.830553e+03 -3.153321e-02 -3.267217e-02
+9.000000e-02 1.936721e+03 -3.328495e-02 -3.449638e-02
+9.500000e-02 2.042770e+03 -3.502484e-02 -3.630893e-02
+1.000000e-01 2.148702e+03 -3.675301e-02 -3.810991e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016337,0.022780) (0.007951,0.022728) (0.002304,0.035220) (0.006616,0.011631) (0.014532,0.035992) (0.017146,0.044264) (0.000422,0.018359) (0.001949,0.045031) (0.020109,0.010016) (0.013342,0.004318) (0.041337,0.022780) (0.032951,0.022728) (0.027304,0.035220) (0.031616,0.011631) (0.039532,0.035992) (0.042146,0.044264) (0.025422,0.018359) (0.026949,0.045031) (0.045109,0.010016) (0.038342,0.004318) (0.052304,0.035220) (0.050422,0.018359) (0.051949,0.045031)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6be3b114d3c34b5adca91fe40d464058c3360f69
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.651817e+00
+1.000000e-02 8.231239e+00
+1.500000e-02 1.030605e+01
+2.000000e-02 1.169153e+01
+2.500000e-02 1.281224e+01
+3.000000e-02 1.378887e+01
+3.500000e-02 1.465945e+01
+4.000000e-02 1.544324e+01
+4.500000e-02 1.615548e+01
+5.000000e-02 1.680391e+01
+5.500000e-02 1.739925e+01
+6.000000e-02 1.794936e+01
+6.500000e-02 1.846102e+01
+7.000000e-02 1.894009e+01
+7.500000e-02 1.939164e+01
+8.000000e-02 1.982008e+01
+8.500000e-02 2.022928e+01
+9.000000e-02 2.062266e+01
+9.500000e-02 2.100319e+01
+1.000000e-01 2.137350e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016337,0.022780) (0.007951,0.022728) (0.002304,0.035220) (0.006616,0.011631) (0.014532,0.035992) (0.017146,0.044264) (0.000422,0.018359) (0.001949,0.045031) (0.020109,0.010016) (0.013342,0.004318) (0.041337,0.022780) (0.032951,0.022728) (0.027304,0.035220) (0.031616,0.011631) (0.039532,0.035992) (0.042146,0.044264) (0.025422,0.018359) (0.026949,0.045031) (0.045109,0.010016) (0.038342,0.004318) (0.052304,0.035220) (0.050422,0.018359) (0.051949,0.045031)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8e8aa1b52fbf0b8a2571c394cefa18baa2f348c5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.809370e+00 -1.717293e-04 -4.277450e-03
+1.000000e-02 1.781290e+01 -3.141382e-04 -8.627618e-03
+1.500000e-02 2.270210e+01 -4.051626e-04 -1.314535e-02
+2.000000e-02 2.622771e+01 -4.721289e-04 -1.771828e-02
+2.500000e-02 2.919077e+01 -5.286368e-04 -2.228857e-02
+3.000000e-02 3.181791e+01 -5.787266e-04 -2.683945e-02
+3.500000e-02 3.419261e+01 -6.239460e-04 -3.136509e-02
+4.000000e-02 3.636012e+01 -6.651683e-04 -3.586259e-02
+4.500000e-02 3.835174e+01 -7.030100e-04 -4.033010e-02
+5.000000e-02 4.019226e+01 -7.379608e-04 -4.476628e-02
+5.500000e-02 4.190208e+01 -7.704247e-04 -4.917011e-02
+6.000000e-02 4.349890e+01 -8.007485e-04 -5.354079e-02
+6.500000e-02 4.499776e+01 -8.292262e-04 -5.787773e-02
+7.000000e-02 4.641178e+01 -8.561116e-04 -6.218047e-02
+7.500000e-02 4.775241e+01 -8.816251e-04 -6.644870e-02
+8.000000e-02 4.902935e+01 -9.059539e-04 -7.068220e-02
+8.500000e-02 5.025105e+01 -9.292600e-04 -7.488087e-02
+9.000000e-02 5.142510e+01 -9.516884e-04 -7.904466e-02
+9.500000e-02 5.255772e+01 -9.733577e-04 -8.317360e-02
+1.000000e-01 5.365457e+01 -9.943763e-04 -8.726777e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.016337,0.022780) (0.007951,0.022728) (0.002304,0.035220) (0.006616,0.011631) (0.014532,0.035992) (0.017146,0.044264) (0.000422,0.018359) (0.001949,0.045031) (0.020109,0.010016) (0.013342,0.004318) (0.041337,0.022780) (0.032951,0.022728) (0.027304,0.035220) (0.031616,0.011631) (0.039532,0.035992) (0.042146,0.044264) (0.025422,0.018359) (0.026949,0.045031) (0.045109,0.010016) (0.038342,0.004318) (0.052304,0.035220) (0.050422,0.018359) (0.051949,0.045031)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f87d1d4b89cc084d51c229e16f80424468ec88ab
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.101029e+02 -1.951287e-03 -1.951858e-03
+1.000000e-02 2.200625e+02 -3.888495e-03 -3.889394e-03
+1.500000e-02 3.297353e+02 -5.816219e-03 -5.817614e-03
+2.000000e-02 4.386368e+02 -7.750345e-03 -7.751899e-03
+2.500000e-02 5.467435e+02 -9.692892e-03 -9.691812e-03
+3.000000e-02 6.544842e+02 -1.163053e-02 -1.162484e-02
+3.500000e-02 7.620455e+02 -1.355696e-02 -1.354566e-02
+4.000000e-02 8.694640e+02 -1.547114e-02 -1.545350e-02
+4.500000e-02 9.767481e+02 -1.737293e-02 -1.734830e-02
+5.000000e-02 1.083901e+03 -1.926238e-02 -1.923013e-02
+5.500000e-02 1.190926e+03 -2.113945e-02 -2.109900e-02
+6.000000e-02 1.297821e+03 -2.300444e-02 -2.295523e-02
+6.500000e-02 1.404591e+03 -2.485732e-02 -2.479883e-02
+7.000000e-02 1.511236e+03 -2.669820e-02 -2.662989e-02
+7.500000e-02 1.617757e+03 -2.852716e-02 -2.844854e-02
+8.000000e-02 1.724157e+03 -3.034430e-02 -3.025488e-02
+8.500000e-02 1.830436e+03 -3.214972e-02 -3.204902e-02
+9.000000e-02 1.936596e+03 -3.394351e-02 -3.383107e-02
+9.500000e-02 2.042637e+03 -3.572579e-02 -3.560114e-02
+1.000000e-01 2.148560e+03 -3.749664e-02 -3.735934e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.009984,0.039865) (0.006733,0.022544) (0.011053,0.015566) (0.017331,0.026268) (0.018492,0.008547) (0.000552,0.030735) (0.001383,0.006344) (0.020204,0.036382) (0.002124,0.044643) (0.003065,0.014171) (0.034984,0.039865) (0.031733,0.022544) (0.036053,0.015566) (0.042331,0.026268) (0.043492,0.008547) (0.025552,0.030735) (0.026383,0.006344) (0.045204,0.036382) (0.027124,0.044643) (0.028065,0.014171) (0.050552,0.030735) (0.051383,0.006344) (0.052124,0.044643) (0.053065,0.014171)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5cabea478fc31c7606b9a853016c9e6c33525b4e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.669762e+00
+1.000000e-02 8.297181e+00
+1.500000e-02 1.041623e+01
+2.000000e-02 1.180201e+01
+2.500000e-02 1.292209e+01
+3.000000e-02 1.390235e+01
+3.500000e-02 1.477878e+01
+4.000000e-02 1.556975e+01
+4.500000e-02 1.628852e+01
+5.000000e-02 1.694584e+01
+5.500000e-02 1.755078e+01
+6.000000e-02 1.811108e+01
+6.500000e-02 1.863340e+01
+7.000000e-02 1.912345e+01
+7.500000e-02 1.958614e+01
+8.000000e-02 2.002573e+01
+8.500000e-02 2.044592e+01
+9.000000e-02 2.084995e+01
+9.500000e-02 2.124065e+01
+1.000000e-01 2.162051e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.009984,0.039865) (0.006733,0.022544) (0.011053,0.015566) (0.017331,0.026268) (0.018492,0.008547) (0.000552,0.030735) (0.001383,0.006344) (0.020204,0.036382) (0.002124,0.044643) (0.003065,0.014171) (0.034984,0.039865) (0.031733,0.022544) (0.036053,0.015566) (0.042331,0.026268) (0.043492,0.008547) (0.025552,0.030735) (0.026383,0.006344) (0.045204,0.036382) (0.027124,0.044643) (0.028065,0.014171) (0.050552,0.030735) (0.051383,0.006344) (0.052124,0.044643) (0.053065,0.014171)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2582e7a66f34ce81fe361a85a0ca3d22ece659d7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.934476e+00 -1.584785e-04 -4.326183e-03
+1.000000e-02 1.647525e+01 -2.927454e-04 -8.707093e-03
+1.500000e-02 2.091681e+01 -3.752231e-04 -1.325832e-02
+2.000000e-02 2.397877e+01 -4.338537e-04 -1.786255e-02
+2.500000e-02 2.650361e+01 -4.823625e-04 -2.246216e-02
+3.000000e-02 2.872453e+01 -5.247632e-04 -2.704064e-02
+3.500000e-02 3.071919e+01 -5.625288e-04 -3.159247e-02
+4.000000e-02 3.252644e+01 -5.964690e-04 -3.611500e-02
+4.500000e-02 3.417308e+01 -6.271631e-04 -4.060654e-02
+5.000000e-02 3.568066e+01 -6.550773e-04 -4.506583e-02
+5.500000e-02 3.706788e+01 -6.806096e-04 -4.949187e-02
+6.000000e-02 3.835131e+01 -7.041071e-04 -5.388387e-02
+6.500000e-02 3.954507e+01 -7.258639e-04 -5.824123e-02
+7.000000e-02 4.066222e+01 -7.461452e-04 -6.256346e-02
+7.500000e-02 4.171401e+01 -7.651802e-04 -6.685019e-02
+8.000000e-02 4.271069e+01 -7.831738e-04 -7.110117e-02
+8.500000e-02 4.366298e+01 -8.003343e-04 -7.531666e-02
+9.000000e-02 4.457478e+01 -8.167485e-04 -7.949571e-02
+9.500000e-02 4.545518e+01 -8.325927e-04 -8.363871e-02
+1.000000e-01 4.631004e+01 -8.479825e-04 -8.774573e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.009984,0.039865) (0.006733,0.022544) (0.011053,0.015566) (0.017331,0.026268) (0.018492,0.008547) (0.000552,0.030735) (0.001383,0.006344) (0.020204,0.036382) (0.002124,0.044643) (0.003065,0.014171) (0.034984,0.039865) (0.031733,0.022544) (0.036053,0.015566) (0.042331,0.026268) (0.043492,0.008547) (0.025552,0.030735) (0.026383,0.006344) (0.045204,0.036382) (0.027124,0.044643) (0.028065,0.014171) (0.050552,0.030735) (0.051383,0.006344) (0.052124,0.044643) (0.053065,0.014171)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bb3403752a07f10157ee21362ef6a8231eb17a29
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.100874e+02 -1.948498e-03 -1.959316e-03
+1.000000e-02 2.200332e+02 -3.882812e-03 -3.904342e-03
+1.500000e-02 3.296967e+02 -5.807533e-03 -5.839634e-03
+2.000000e-02 4.385940e+02 -7.737958e-03 -7.780505e-03
+2.500000e-02 5.466944e+02 -9.675338e-03 -9.728279e-03
+3.000000e-02 6.544338e+02 -1.160653e-02 -1.166972e-02
+3.500000e-02 7.619931e+02 -1.352617e-02 -1.359943e-02
+4.000000e-02 8.694107e+02 -1.543324e-02 -1.551637e-02
+4.500000e-02 9.766950e+02 -1.732763e-02 -1.742045e-02
+5.000000e-02 1.083849e+03 -1.920940e-02 -1.931175e-02
+5.500000e-02 1.190874e+03 -2.107866e-02 -2.119035e-02
+6.000000e-02 1.297774e+03 -2.293543e-02 -2.305628e-02
+6.500000e-02 1.404547e+03 -2.477995e-02 -2.490980e-02
+7.000000e-02 1.511196e+03 -2.661226e-02 -2.675093e-02
+7.500000e-02 1.617723e+03 -2.843245e-02 -2.857978e-02
+8.000000e-02 1.724128e+03 -3.024064e-02 -3.039646e-02
+8.500000e-02 1.830413e+03 -3.203693e-02 -3.220107e-02
+9.000000e-02 1.936579e+03 -3.382143e-02 -3.399373e-02
+9.500000e-02 2.042628e+03 -3.559424e-02 -3.577452e-02
+1.000000e-01 2.148559e+03 -3.735546e-02 -3.754358e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.020041,0.036445) (0.012495,0.012588) (0.006335,0.004659) (0.010427,0.038324) (0.013469,0.024858) (0.016024,0.045798) (0.001736,0.015422) (0.002055,0.027411) (0.000586,0.043396) (0.020435,0.005766) (0.045041,0.036445) (0.037495,0.012588) (0.031335,0.004659) (0.035427,0.038324) (0.038469,0.024858) (0.041024,0.045798) (0.026736,0.015422) (0.027055,0.027411) (0.025586,0.043396) (0.045435,0.005766) (0.051736,0.015422) (0.052055,0.027411) (0.050586,0.043396)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9895f75e45299596c36e0e4fe417c8b018edb9b6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.537633e+00
+1.000000e-02 8.205787e+00
+1.500000e-02 1.026089e+01
+2.000000e-02 1.163172e+01
+2.500000e-02 1.275670e+01
+3.000000e-02 1.374471e+01
+3.500000e-02 1.462913e+01
+4.000000e-02 1.542708e+01
+4.500000e-02 1.615085e+01
+5.000000e-02 1.681047e+01
+5.500000e-02 1.741456e+01
+6.000000e-02 1.797061e+01
+6.500000e-02 1.848522e+01
+7.000000e-02 1.896176e+01
+7.500000e-02 1.941024e+01
+8.000000e-02 1.983287e+01
+8.500000e-02 2.023371e+01
+9.000000e-02 2.061631e+01
+9.500000e-02 2.098388e+01
+1.000000e-01 2.133928e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.020041,0.036445) (0.012495,0.012588) (0.006335,0.004659) (0.010427,0.038324) (0.013469,0.024858) (0.016024,0.045798) (0.001736,0.015422) (0.002055,0.027411) (0.000586,0.043396) (0.020435,0.005766) (0.045041,0.036445) (0.037495,0.012588) (0.031335,0.004659) (0.035427,0.038324) (0.038469,0.024858) (0.041024,0.045798) (0.026736,0.015422) (0.027055,0.027411) (0.025586,0.043396) (0.045435,0.005766) (0.051736,0.015422) (0.052055,0.027411) (0.050586,0.043396)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cd9b48bb08eb449b2a395a6fb61e090ae8d2b34b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.786949e+00 -1.556929e-04 -4.337689e-03
+1.000000e-02 1.622256e+01 -2.889751e-04 -8.720013e-03
+1.500000e-02 2.057634e+01 -3.713590e-04 -1.326758e-02
+2.000000e-02 2.351027e+01 -4.284995e-04 -1.787525e-02
+2.500000e-02 2.591066e+01 -4.752641e-04 -2.247904e-02
+3.000000e-02 2.801862e+01 -5.160750e-04 -2.706059e-02
+3.500000e-02 2.990893e+01 -5.524314e-04 -3.161423e-02
+4.000000e-02 3.161879e+01 -5.851251e-04 -3.613742e-02
+4.500000e-02 3.317342e+01 -6.147022e-04 -4.062862e-02
+5.000000e-02 3.459319e+01 -6.415992e-04 -4.508671e-02
+5.500000e-02 3.589435e+01 -6.661381e-04 -4.951046e-02
+6.000000e-02 3.709409e+01 -6.887197e-04 -5.390001e-02
+6.500000e-02 3.820410e+01 -7.095625e-04 -5.825454e-02
+7.000000e-02 3.923604e+01 -7.289022e-04 -6.257368e-02
+7.500000e-02 4.020021e+01 -7.469457e-04 -6.685720e-02
+8.000000e-02 4.110586e+01 -7.638760e-04 -7.110493e-02
+8.500000e-02 4.196155e+01 -7.798608e-04 -7.531676e-02
+9.000000e-02 4.277467e+01 -7.950456e-04 -7.949267e-02
+9.500000e-02 4.355171e+01 -8.095570e-04 -8.363272e-02
+1.000000e-01 4.429834e+01 -8.235051e-04 -8.773699e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.020041,0.036445) (0.012495,0.012588) (0.006335,0.004659) (0.010427,0.038324) (0.013469,0.024858) (0.016024,0.045798) (0.001736,0.015422) (0.002055,0.027411) (0.000586,0.043396) (0.020435,0.005766) (0.045041,0.036445) (0.037495,0.012588) (0.031335,0.004659) (0.035427,0.038324) (0.038469,0.024858) (0.041024,0.045798) (0.026736,0.015422) (0.027055,0.027411) (0.025586,0.043396) (0.045435,0.005766) (0.051736,0.015422) (0.052055,0.027411) (0.050586,0.043396)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6a0e49242de54c84b623cc3fee627db7afb831f5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.101110e+02 -1.870571e-03 -2.033856e-03
+1.000000e-02 2.200792e+02 -3.727251e-03 -4.053168e-03
+1.500000e-02 3.297621e+02 -5.574882e-03 -6.062527e-03
+2.000000e-02 4.386754e+02 -7.425729e-03 -8.080708e-03
+2.500000e-02 5.467936e+02 -9.276523e-03 -1.011287e-02
+3.000000e-02 6.545462e+02 -1.111773e-02 -1.214276e-02
+3.500000e-02 7.621199e+02 -1.294585e-02 -1.416227e-02
+4.000000e-02 8.695510e+02 -1.476058e-02 -1.616990e-02
+4.500000e-02 9.768480e+02 -1.656199e-02 -1.816538e-02
+5.000000e-02 1.084014e+03 -1.835022e-02 -2.014869e-02
+5.500000e-02 1.191050e+03 -2.012542e-02 -2.211987e-02
+6.000000e-02 1.297961e+03 -2.188760e-02 -2.407891e-02
+6.500000e-02 1.404744e+03 -2.363718e-02 -2.602596e-02
+7.000000e-02 1.511403e+03 -2.537418e-02 -2.796103e-02
+7.500000e-02 1.617939e+03 -2.709873e-02 -2.988419e-02
+8.000000e-02 1.724353e+03 -2.881096e-02 -3.179551e-02
+8.500000e-02 1.830646e+03 -3.051102e-02 -3.369506e-02
+9.000000e-02 1.936820e+03 -3.219902e-02 -3.558292e-02
+9.500000e-02 2.042876e+03 -3.387511e-02 -3.745917e-02
+1.000000e-01 2.148813e+03 -3.553941e-02 -3.932390e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.015650,0.027125) (0.001241,0.019207) (0.007120,0.033799) (0.017140,0.039113) (0.017126,0.014906) (0.012919,0.006653) (0.000379,0.042142) (0.009638,0.044816) (0.001717,0.005175) (0.008730,0.016140) (0.040650,0.027125) (0.026241,0.019207) (0.032120,0.033799) (0.042140,0.039113) (0.042126,0.014906) (0.037919,0.006653) (0.025379,0.042142) (0.034638,0.044816) (0.026717,0.005175) (0.033730,0.016140) (0.051241,0.019207) (0.050379,0.042142) (0.051717,0.005175)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2e08444bf7380b6af76430f565e369cf29ac5fca
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.780368e+00
+1.000000e-02 8.326302e+00
+1.500000e-02 1.042725e+01
+2.000000e-02 1.183670e+01
+2.500000e-02 1.297493e+01
+3.000000e-02 1.396316e+01
+3.500000e-02 1.484203e+01
+4.000000e-02 1.563290e+01
+4.500000e-02 1.635064e+01
+5.000000e-02 1.700694e+01
+5.500000e-02 1.761141e+01
+6.000000e-02 1.817499e+01
+6.500000e-02 1.869889e+01
+7.000000e-02 1.919170e+01
+7.500000e-02 1.965845e+01
+8.000000e-02 2.010351e+01
+8.500000e-02 2.053072e+01
+9.000000e-02 2.094344e+01
+9.500000e-02 2.134462e+01
+1.000000e-01 2.173686e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.015650,0.027125) (0.001241,0.019207) (0.007120,0.033799) (0.017140,0.039113) (0.017126,0.014906) (0.012919,0.006653) (0.000379,0.042142) (0.009638,0.044816) (0.001717,0.005175) (0.008730,0.016140) (0.040650,0.027125) (0.026241,0.019207) (0.032120,0.033799) (0.042140,0.039113) (0.042126,0.014906) (0.037919,0.006653) (0.025379,0.042142) (0.034638,0.044816) (0.026717,0.005175) (0.033730,0.016140) (0.051241,0.019207) (0.050379,0.042142) (0.051717,0.005175)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..147f29f45c71fca2e3acb8ffd10669dafba22cb4
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.3079_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.679222e+00 -1.648360e-04 -4.315769e-03
+1.000000e-02 1.745644e+01 -3.001636e-04 -8.700825e-03
+1.500000e-02 2.226780e+01 -3.868171e-04 -1.324046e-02
+2.000000e-02 2.570020e+01 -4.498000e-04 -1.783244e-02
+2.500000e-02 2.857213e+01 -5.027209e-04 -2.241913e-02
+3.000000e-02 3.112975e+01 -5.497486e-04 -2.698345e-02
+3.500000e-02 3.345867e+01 -5.924227e-04 -3.151971e-02
+4.000000e-02 3.560229e+01 -6.315780e-04 -3.602516e-02
+4.500000e-02 3.759073e+01 -6.678094e-04 -4.049808e-02
+5.000000e-02 3.944770e+01 -7.015875e-04 -4.493718e-02
+5.500000e-02 4.119298e+01 -7.333034e-04 -4.934148e-02
+6.000000e-02 4.284340e+01 -7.632875e-04 -5.371023e-02
+6.500000e-02 4.441367e+01 -7.918261e-04 -5.804282e-02
+7.000000e-02 4.591632e+01 -8.191616e-04 -6.233878e-02
+7.500000e-02 4.736552e+01 -8.455516e-04 -6.659829e-02
+8.000000e-02 4.876420e+01 -8.710835e-04 -7.082006e-02
+8.500000e-02 5.012420e+01 -8.959714e-04 -7.500442e-02
+9.000000e-02 5.145237e+01 -9.203482e-04 -7.915130e-02
+9.500000e-02 5.275471e+01 -9.443286e-04 -8.326066e-02
+1.000000e-01 5.403648e+01 -9.680146e-04 -8.733253e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.015650,0.027125) (0.001241,0.019207) (0.007120,0.033799) (0.017140,0.039113) (0.017126,0.014906) (0.012919,0.006653) (0.000379,0.042142) (0.009638,0.044816) (0.001717,0.005175) (0.008730,0.016140) (0.040650,0.027125) (0.026241,0.019207) (0.032120,0.033799) (0.042140,0.039113) (0.042126,0.014906) (0.037919,0.006653) (0.025379,0.042142) (0.034638,0.044816) (0.026717,0.005175) (0.033730,0.016140) (0.051241,0.019207) (0.050379,0.042142) (0.051717,0.005175)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eb9b9f218eb59cea8a06eecbaa1acb5e3b4de624
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.420615e+02 -1.800481e-03 -1.837363e-03
+1.000000e-02 2.838673e+02 -3.587926e-03 -3.661560e-03
+1.500000e-02 4.252912e+02 -5.366891e-03 -5.477005e-03
+2.000000e-02 5.659142e+02 -7.151929e-03 -7.297675e-03
+2.500000e-02 7.057318e+02 -8.942165e-03 -9.124491e-03
+3.000000e-02 8.451134e+02 -1.072632e-02 -1.094634e-02
+3.500000e-02 9.842215e+02 -1.249945e-02 -1.275746e-02
+4.000000e-02 1.123087e+03 -1.426091e-02 -1.455696e-02
+4.500000e-02 1.261719e+03 -1.601066e-02 -1.634470e-02
+5.000000e-02 1.400122e+03 -1.774862e-02 -1.812055e-02
+5.500000e-02 1.538294e+03 -1.947512e-02 -1.988491e-02
+6.000000e-02 1.676240e+03 -2.119013e-02 -2.163771e-02
+6.500000e-02 1.813962e+03 -2.289374e-02 -2.337904e-02
+7.000000e-02 1.951461e+03 -2.458603e-02 -2.510898e-02
+7.500000e-02 2.088739e+03 -2.626710e-02 -2.682763e-02
+8.000000e-02 2.225798e+03 -2.793704e-02 -2.853509e-02
+8.500000e-02 2.362639e+03 -2.959595e-02 -3.023145e-02
+9.000000e-02 2.499265e+03 -3.124393e-02 -3.191680e-02
+9.500000e-02 2.635675e+03 -3.288106e-02 -3.359123e-02
+1.000000e-01 2.771873e+03 -3.450745e-02 -3.525486e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.014675,0.045628) (0.007597,0.007422) (0.016170,0.021789) (0.008540,0.034435) (0.001137,0.023395) (0.001232,0.038991) (0.001269,0.014104) (0.016685,0.011453) (0.015649,0.037913) (0.008120,0.018566) (0.019946,0.029602) (0.008460,0.026394) (0.000093,0.004386) (0.039675,0.045628) (0.032597,0.007422) (0.041170,0.021789) (0.033540,0.034435) (0.026137,0.023395) (0.026232,0.038991) (0.026269,0.014104) (0.041685,0.011453) (0.040649,0.037913) (0.033120,0.018566) (0.044946,0.029602) (0.033460,0.026394) (0.025093,0.004386) (0.051137,0.023395) (0.051232,0.038991) (0.051269,0.014104) (0.050093,0.004386)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cde001206c607f0975164b16b1c6b9a02b0bfb88
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.814599e+00
+1.000000e-02 9.552256e+00
+1.500000e-02 1.168451e+01
+2.000000e-02 1.320472e+01
+2.500000e-02 1.445431e+01
+3.000000e-02 1.553100e+01
+3.500000e-02 1.647574e+01
+4.000000e-02 1.731459e+01
+4.500000e-02 1.806494e+01
+5.000000e-02 1.874707e+01
+5.500000e-02 1.937213e+01
+6.000000e-02 1.995089e+01
+6.500000e-02 2.049245e+01
+7.000000e-02 2.100449e+01
+7.500000e-02 2.149348e+01
+8.000000e-02 2.196919e+01
+8.500000e-02 2.242779e+01
+9.000000e-02 2.287724e+01
+9.500000e-02 2.332102e+01
+1.000000e-01 2.376198e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.014675,0.045628) (0.007597,0.007422) (0.016170,0.021789) (0.008540,0.034435) (0.001137,0.023395) (0.001232,0.038991) (0.001269,0.014104) (0.016685,0.011453) (0.015649,0.037913) (0.008120,0.018566) (0.019946,0.029602) (0.008460,0.026394) (0.000093,0.004386) (0.039675,0.045628) (0.032597,0.007422) (0.041170,0.021789) (0.033540,0.034435) (0.026137,0.023395) (0.026232,0.038991) (0.026269,0.014104) (0.041685,0.011453) (0.040649,0.037913) (0.033120,0.018566) (0.044946,0.029602) (0.033460,0.026394) (0.025093,0.004386) (0.051137,0.023395) (0.051232,0.038991) (0.051269,0.014104) (0.050093,0.004386)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c4c0072357552487bfb348b6c6d3ffdc97769631
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.303976e+01 -1.658868e-04 -4.185210e-03
+1.000000e-02 2.235471e+01 -2.877758e-04 -8.532718e-03
+1.500000e-02 2.816862e+01 -3.667710e-04 -1.304400e-02
+2.000000e-02 3.261543e+01 -4.281074e-04 -1.759650e-02
+2.500000e-02 3.641955e+01 -4.807853e-04 -2.214546e-02
+3.000000e-02 3.980336e+01 -5.276990e-04 -2.667714e-02
+3.500000e-02 4.286856e+01 -5.702331e-04 -3.118553e-02
+4.000000e-02 4.568184e+01 -6.093166e-04 -3.566688e-02
+4.500000e-02 4.829340e+01 -6.456525e-04 -4.011852e-02
+5.000000e-02 5.074469e+01 -6.798209e-04 -4.453834e-02
+5.500000e-02 5.306870e+01 -7.122836e-04 -4.892475e-02
+6.000000e-02 5.529291e+01 -7.434233e-04 -5.327655e-02
+6.500000e-02 5.743977e+01 -7.735536e-04 -5.759283e-02
+7.000000e-02 5.952730e+01 -8.029267e-04 -6.187297e-02
+7.500000e-02 6.157114e+01 -8.317625e-04 -6.611648e-02
+8.000000e-02 6.358393e+01 -8.602388e-04 -7.032307e-02
+8.500000e-02 6.557664e+01 -8.885104e-04 -7.449256e-02
+9.000000e-02 6.755768e+01 -9.166974e-04 -7.862491e-02
+9.500000e-02 6.953378e+01 -9.448973e-04 -8.272018e-02
+1.000000e-01 7.151090e+01 -9.731948e-04 -8.677851e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.014675,0.045628) (0.007597,0.007422) (0.016170,0.021789) (0.008540,0.034435) (0.001137,0.023395) (0.001232,0.038991) (0.001269,0.014104) (0.016685,0.011453) (0.015649,0.037913) (0.008120,0.018566) (0.019946,0.029602) (0.008460,0.026394) (0.000093,0.004386) (0.039675,0.045628) (0.032597,0.007422) (0.041170,0.021789) (0.033540,0.034435) (0.026137,0.023395) (0.026232,0.038991) (0.026269,0.014104) (0.041685,0.011453) (0.040649,0.037913) (0.033120,0.018566) (0.044946,0.029602) (0.033460,0.026394) (0.025093,0.004386) (0.051137,0.023395) (0.051232,0.038991) (0.051269,0.014104) (0.050093,0.004386)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e7199dffafeacc99f8b14aeb456b16f960cb55a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.420744e+02 -1.854691e-03 -1.777969e-03
+1.000000e-02 2.838910e+02 -3.696423e-03 -3.542764e-03
+1.500000e-02 4.253221e+02 -5.529685e-03 -5.299201e-03
+2.000000e-02 5.659504e+02 -7.373108e-03 -7.057303e-03
+2.500000e-02 7.057680e+02 -9.230483e-03 -8.813969e-03
+3.000000e-02 8.451515e+02 -1.108585e-02 -1.056111e-02
+3.500000e-02 9.842567e+02 -1.293243e-02 -1.229585e-02
+4.000000e-02 1.123118e+03 -1.476880e-02 -1.401769e-02
+4.500000e-02 1.261743e+03 -1.659471e-02 -1.572666e-02
+5.000000e-02 1.400136e+03 -1.841010e-02 -1.742289e-02
+5.500000e-02 1.538300e+03 -2.021496e-02 -1.910653e-02
+6.000000e-02 1.676235e+03 -2.200931e-02 -2.077773e-02
+6.500000e-02 1.813945e+03 -2.379316e-02 -2.243664e-02
+7.000000e-02 1.951431e+03 -2.556655e-02 -2.408340e-02
+7.500000e-02 2.088696e+03 -2.732951e-02 -2.571815e-02
+8.000000e-02 2.225741e+03 -2.908209e-02 -2.734103e-02
+8.500000e-02 2.362567e+03 -3.082433e-02 -2.895217e-02
+9.000000e-02 2.499177e+03 -3.255628e-02 -3.055171e-02
+9.500000e-02 2.635571e+03 -3.427801e-02 -3.213978e-02
+1.000000e-01 2.771751e+03 -3.598956e-02 -3.371649e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.007855,0.006380) (0.009705,0.024289) (0.008790,0.033555) (0.001512,0.016982) (0.019675,0.045562) (0.017567,0.013986) (0.001419,0.041804) (0.000634,0.027270) (0.016210,0.029708) (0.019224,0.006173) (0.016788,0.037823) (0.009123,0.042793) (0.017184,0.022054) (0.032855,0.006380) (0.034705,0.024289) (0.033790,0.033555) (0.026512,0.016982) (0.044675,0.045562) (0.042567,0.013986) (0.026419,0.041804) (0.025634,0.027270) (0.041210,0.029708) (0.044224,0.006173) (0.041788,0.037823) (0.034123,0.042793) (0.042184,0.022054) (0.051512,0.016982) (0.051419,0.041804) (0.050634,0.027270)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d47d8f39b09ab0fc336189d8bfacc8bab75ce607
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.869444e+00
+1.000000e-02 9.519414e+00
+1.500000e-02 1.163589e+01
+2.000000e-02 1.313852e+01
+2.500000e-02 1.437800e+01
+3.000000e-02 1.545220e+01
+3.500000e-02 1.640158e+01
+4.000000e-02 1.725150e+01
+4.500000e-02 1.802066e+01
+5.000000e-02 1.872370e+01
+5.500000e-02 1.937238e+01
+6.000000e-02 1.997634e+01
+6.500000e-02 2.054361e+01
+7.000000e-02 2.108096e+01
+7.500000e-02 2.159414e+01
+8.000000e-02 2.208807e+01
+8.500000e-02 2.256699e+01
+9.000000e-02 2.303462e+01
+9.500000e-02 2.349420e+01
+1.000000e-01 2.394859e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.007855,0.006380) (0.009705,0.024289) (0.008790,0.033555) (0.001512,0.016982) (0.019675,0.045562) (0.017567,0.013986) (0.001419,0.041804) (0.000634,0.027270) (0.016210,0.029708) (0.019224,0.006173) (0.016788,0.037823) (0.009123,0.042793) (0.017184,0.022054) (0.032855,0.006380) (0.034705,0.024289) (0.033790,0.033555) (0.026512,0.016982) (0.044675,0.045562) (0.042567,0.013986) (0.026419,0.041804) (0.025634,0.027270) (0.041210,0.029708) (0.044224,0.006173) (0.041788,0.037823) (0.034123,0.042793) (0.042184,0.022054) (0.051512,0.016982) (0.051419,0.041804) (0.050634,0.027270)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..65a114e2507df81b69f4a7751f18da57d434964d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.586387e+01 -2.081353e-04 -3.965890e-03
+1.000000e-02 2.720780e+01 -3.619341e-04 -8.150603e-03
+1.500000e-02 3.495017e+01 -4.722239e-04 -1.250519e-02
+2.000000e-02 4.114564e+01 -5.628869e-04 -1.691287e-02
+2.500000e-02 4.652845e+01 -6.427544e-04 -2.132935e-02
+3.000000e-02 5.134272e+01 -7.149617e-04 -2.573919e-02
+3.500000e-02 5.571180e+01 -7.811659e-04 -3.013457e-02
+4.000000e-02 5.971752e+01 -8.424921e-04 -3.451037e-02
+4.500000e-02 6.342128e+01 -8.997890e-04 -3.886282e-02
+5.000000e-02 6.687219e+01 -9.537325e-04 -4.318897e-02
+5.500000e-02 7.010825e+01 -1.004843e-03 -4.748658e-02
+6.000000e-02 7.315932e+01 -1.053522e-03 -5.175399e-02
+6.500000e-02 7.604895e+01 -1.100071e-03 -5.598995e-02
+7.000000e-02 7.879535e+01 -1.144716e-03 -6.019353e-02
+7.500000e-02 8.141169e+01 -1.187606e-03 -6.436414e-02
+8.000000e-02 8.390819e+01 -1.228846e-03 -6.850133e-02
+8.500000e-02 8.629322e+01 -1.268503e-03 -7.260478e-02
+9.000000e-02 8.857273e+01 -1.306614e-03 -7.667429e-02
+9.500000e-02 9.075131e+01 -1.343190e-03 -8.070970e-02
+1.000000e-01 9.283390e+01 -1.378249e-03 -8.471083e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.007855,0.006380) (0.009705,0.024289) (0.008790,0.033555) (0.001512,0.016982) (0.019675,0.045562) (0.017567,0.013986) (0.001419,0.041804) (0.000634,0.027270) (0.016210,0.029708) (0.019224,0.006173) (0.016788,0.037823) (0.009123,0.042793) (0.017184,0.022054) (0.032855,0.006380) (0.034705,0.024289) (0.033790,0.033555) (0.026512,0.016982) (0.044675,0.045562) (0.042567,0.013986) (0.026419,0.041804) (0.025634,0.027270) (0.041210,0.029708) (0.044224,0.006173) (0.041788,0.037823) (0.034123,0.042793) (0.042184,0.022054) (0.051512,0.016982) (0.051419,0.041804) (0.050634,0.027270)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cd655dbc05632c64da0625078b83033549f6b55d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.420619e+02 -1.757627e-03 -1.879577e-03
+1.000000e-02 2.838678e+02 -3.502464e-03 -3.745759e-03
+1.500000e-02 4.252911e+02 -5.238905e-03 -5.603143e-03
+2.000000e-02 5.659128e+02 -6.979204e-03 -7.467972e-03
+2.500000e-02 7.057268e+02 -8.721397e-03 -9.342890e-03
+3.000000e-02 8.451054e+02 -1.045598e-02 -1.121427e-02
+3.500000e-02 9.842101e+02 -1.217916e-02 -1.307535e-02
+4.000000e-02 1.123072e+03 -1.389054e-02 -1.492498e-02
+4.500000e-02 1.261700e+03 -1.559015e-02 -1.676293e-02
+5.000000e-02 1.400097e+03 -1.727806e-02 -1.858921e-02
+5.500000e-02 1.538267e+03 -1.895425e-02 -2.040371e-02
+6.000000e-02 1.676209e+03 -2.061913e-02 -2.220679e-02
+6.500000e-02 1.813926e+03 -2.227267e-02 -2.399834e-02
+7.000000e-02 1.951420e+03 -2.391497e-02 -2.577845e-02
+7.500000e-02 2.088694e+03 -2.554615e-02 -2.754719e-02
+8.000000e-02 2.225748e+03 -2.716631e-02 -2.930462e-02
+8.500000e-02 2.362585e+03 -2.877558e-02 -3.105083e-02
+9.000000e-02 2.499206e+03 -3.037404e-02 -3.278590e-02
+9.500000e-02 2.635613e+03 -3.196182e-02 -3.450991e-02
+1.000000e-01 2.771806e+03 -3.353902e-02 -3.622295e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.005148,0.010435) (0.019786,0.029604) (0.002572,0.026901) (0.002872,0.042196) (0.010873,0.016845) (0.011824,0.038617) (0.018883,0.045562) (0.020522,0.008441) (0.000671,0.017078) (0.010062,0.025100) (0.005148,0.034299) (0.013589,0.004322) (0.016993,0.021628) (0.030148,0.010435) (0.044786,0.029604) (0.027572,0.026901) (0.027872,0.042196) (0.035873,0.016845) (0.036824,0.038617) (0.043883,0.045562) (0.045522,0.008441) (0.025671,0.017078) (0.035062,0.025100) (0.030148,0.034299) (0.038589,0.004322) (0.041993,0.021628) (0.052572,0.026901) (0.052872,0.042196) (0.050671,0.017078)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..60d977decdde5dfd79c352f0ede507f93f08a67a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.064624e+00
+1.000000e-02 9.794481e+00
+1.500000e-02 1.201035e+01
+2.000000e-02 1.357096e+01
+2.500000e-02 1.484663e+01
+3.000000e-02 1.594823e+01
+3.500000e-02 1.692051e+01
+4.000000e-02 1.779098e+01
+4.500000e-02 1.857987e+01
+5.000000e-02 1.930296e+01
+5.500000e-02 1.997288e+01
+6.000000e-02 2.059985e+01
+6.500000e-02 2.119221e+01
+7.000000e-02 2.175683e+01
+7.500000e-02 2.229937e+01
+8.000000e-02 2.282456e+01
+8.500000e-02 2.333640e+01
+9.000000e-02 2.383829e+01
+9.500000e-02 2.433306e+01
+1.000000e-01 2.482319e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.005148,0.010435) (0.019786,0.029604) (0.002572,0.026901) (0.002872,0.042196) (0.010873,0.016845) (0.011824,0.038617) (0.018883,0.045562) (0.020522,0.008441) (0.000671,0.017078) (0.010062,0.025100) (0.005148,0.034299) (0.013589,0.004322) (0.016993,0.021628) (0.030148,0.010435) (0.044786,0.029604) (0.027572,0.026901) (0.027872,0.042196) (0.035873,0.016845) (0.036824,0.038617) (0.043883,0.045562) (0.045522,0.008441) (0.025671,0.017078) (0.035062,0.025100) (0.030148,0.034299) (0.038589,0.004322) (0.041993,0.021628) (0.052572,0.026901) (0.052872,0.042196) (0.050671,0.017078)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7274b8735227a1b1fd8d7bd25dbfc5ad61aff323
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.243185e+01 -1.542486e-04 -4.252553e-03
+1.000000e-02 2.157747e+01 -2.706556e-04 -8.634741e-03
+1.500000e-02 2.715253e+01 -3.445461e-04 -1.317521e-02
+2.000000e-02 3.139382e+01 -4.016313e-04 -1.775068e-02
+2.500000e-02 3.504047e+01 -4.508101e-04 -2.231787e-02
+3.000000e-02 3.829394e+01 -4.946867e-04 -2.686467e-02
+3.500000e-02 4.124364e+01 -5.344984e-04 -3.138584e-02
+4.000000e-02 4.394668e+01 -5.710540e-04 -3.587826e-02
+4.500000e-02 4.644664e+01 -6.049643e-04 -4.033977e-02
+5.000000e-02 4.877872e+01 -6.367185e-04 -4.476877e-02
+5.500000e-02 5.097183e+01 -6.667130e-04 -4.916406e-02
+6.000000e-02 5.305004e+01 -6.952755e-04 -5.352477e-02
+6.500000e-02 5.503373e+01 -7.226812e-04 -5.785021e-02
+7.000000e-02 5.693968e+01 -7.491545e-04 -6.213997e-02
+7.500000e-02 5.878208e+01 -7.748843e-04 -6.639374e-02
+8.000000e-02 6.057329e+01 -8.000337e-04 -7.061136e-02
+8.500000e-02 6.232319e+01 -8.247320e-04 -7.479277e-02
+9.000000e-02 6.403975e+01 -8.490821e-04 -7.893805e-02
+9.500000e-02 6.573004e+01 -8.731742e-04 -8.304734e-02
+1.000000e-01 6.740042e+01 -8.971077e-04 -8.712136e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.005148,0.010435) (0.019786,0.029604) (0.002572,0.026901) (0.002872,0.042196) (0.010873,0.016845) (0.011824,0.038617) (0.018883,0.045562) (0.020522,0.008441) (0.000671,0.017078) (0.010062,0.025100) (0.005148,0.034299) (0.013589,0.004322) (0.016993,0.021628) (0.030148,0.010435) (0.044786,0.029604) (0.027572,0.026901) (0.027872,0.042196) (0.035873,0.016845) (0.036824,0.038617) (0.043883,0.045562) (0.045522,0.008441) (0.025671,0.017078) (0.035062,0.025100) (0.030148,0.034299) (0.038589,0.004322) (0.041993,0.021628) (0.052572,0.026901) (0.052872,0.042196) (0.050671,0.017078)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0ab95fdb8407c15441c063ef23ca2c26cb368c27
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.420540e+02 -1.815467e-03 -1.823444e-03
+1.000000e-02 2.838528e+02 -3.617846e-03 -3.633760e-03
+1.500000e-02 4.252700e+02 -5.412258e-03 -5.434782e-03
+2.000000e-02 5.658867e+02 -7.213617e-03 -7.239941e-03
+2.500000e-02 7.056945e+02 -9.020756e-03 -9.051365e-03
+3.000000e-02 8.450718e+02 -1.082148e-02 -1.085730e-02
+3.500000e-02 9.841737e+02 -1.261130e-02 -1.265266e-02
+4.000000e-02 1.123034e+03 -1.438941e-02 -1.443644e-02
+4.500000e-02 1.261660e+03 -1.615572e-02 -1.620851e-02
+5.000000e-02 1.400056e+03 -1.791026e-02 -1.796895e-02
+5.500000e-02 1.538223e+03 -1.965313e-02 -1.971783e-02
+6.000000e-02 1.676164e+03 -2.138438e-02 -2.145526e-02
+6.500000e-02 1.813881e+03 -2.310410e-02 -2.318134e-02
+7.000000e-02 1.951376e+03 -2.481238e-02 -2.489616e-02
+7.500000e-02 2.088650e+03 -2.650928e-02 -2.659982e-02
+8.000000e-02 2.225707e+03 -2.819476e-02 -2.829233e-02
+8.500000e-02 2.362545e+03 -2.986919e-02 -2.997400e-02
+9.000000e-02 2.499167e+03 -3.153251e-02 -3.164483e-02
+9.500000e-02 2.635575e+03 -3.318481e-02 -3.330492e-02
+1.000000e-01 2.771770e+03 -3.482617e-02 -3.495437e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.017293,0.008593) (0.006420,0.032246) (0.010255,0.022098) (0.002714,0.043964) (0.004198,0.012342) (0.017604,0.029968) (0.012080,0.045485) (0.008875,0.004920) (0.017081,0.038838) (0.001381,0.020838) (0.000033,0.004238) (0.019686,0.016441) (0.000052,0.036596) (0.042293,0.008593) (0.031420,0.032246) (0.035255,0.022098) (0.027714,0.043964) (0.029198,0.012342) (0.042604,0.029968) (0.037080,0.045485) (0.033875,0.004920) (0.042081,0.038838) (0.026381,0.020838) (0.025033,0.004238) (0.044686,0.016441) (0.025052,0.036596) (0.052714,0.043964) (0.051381,0.020838) (0.050033,0.004238) (0.050052,0.036596)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aeb1ddd7de323627ddae6b45665f241ca45eb6f6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.739527e+00
+1.000000e-02 9.553136e+00
+1.500000e-02 1.169682e+01
+2.000000e-02 1.320880e+01
+2.500000e-02 1.445811e+01
+3.000000e-02 1.554035e+01
+3.500000e-02 1.649440e+01
+4.000000e-02 1.734489e+01
+4.500000e-02 1.811055e+01
+5.000000e-02 1.880650e+01
+5.500000e-02 1.944516e+01
+6.000000e-02 2.003687e+01
+6.500000e-02 2.059022e+01
+7.000000e-02 2.111573e+01
+7.500000e-02 2.161279e+01
+8.000000e-02 2.209006e+01
+8.500000e-02 2.255191e+01
+9.000000e-02 2.300214e+01
+9.500000e-02 2.344403e+01
+1.000000e-01 2.388042e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.017293,0.008593) (0.006420,0.032246) (0.010255,0.022098) (0.002714,0.043964) (0.004198,0.012342) (0.017604,0.029968) (0.012080,0.045485) (0.008875,0.004920) (0.017081,0.038838) (0.001381,0.020838) (0.000033,0.004238) (0.019686,0.016441) (0.000052,0.036596) (0.042293,0.008593) (0.031420,0.032246) (0.035255,0.022098) (0.027714,0.043964) (0.029198,0.012342) (0.042604,0.029968) (0.037080,0.045485) (0.033875,0.004920) (0.042081,0.038838) (0.026381,0.020838) (0.025033,0.004238) (0.044686,0.016441) (0.025052,0.036596) (0.052714,0.043964) (0.051381,0.020838) (0.050033,0.004238) (0.050052,0.036596)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8cf31dd482f82559a1c90bdb6ebf0d0fcda2b1fb
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.216786e+01 -1.559009e-04 -4.228794e-03
+1.000000e-02 2.127206e+01 -2.746746e-04 -8.590501e-03
+1.500000e-02 2.668107e+01 -3.483991e-04 -1.312678e-02
+2.000000e-02 3.073544e+01 -4.046097e-04 -1.770264e-02
+2.500000e-02 3.422437e+01 -4.529063e-04 -2.227084e-02
+3.000000e-02 3.733941e+01 -4.958630e-04 -2.681937e-02
+3.500000e-02 4.016071e+01 -5.346529e-04 -3.134327e-02
+4.000000e-02 4.274110e+01 -5.700648e-04 -3.583943e-02
+4.500000e-02 4.512156e+01 -6.027082e-04 -4.030560e-02
+5.000000e-02 4.733472e+01 -6.330621e-04 -4.474013e-02
+5.500000e-02 4.940835e+01 -6.615298e-04 -4.914174e-02
+6.000000e-02 5.136574e+01 -6.884478e-04 -5.350941e-02
+6.500000e-02 5.322624e+01 -7.140934e-04 -5.784243e-02
+7.000000e-02 5.500653e+01 -7.387032e-04 -6.214024e-02
+7.500000e-02 5.672044e+01 -7.624720e-04 -6.640251e-02
+8.000000e-02 5.837963e+01 -7.855650e-04 -7.062901e-02
+8.500000e-02 5.999396e+01 -8.081194e-04 -7.481963e-02
+9.000000e-02 6.157194e+01 -8.302532e-04 -7.897435e-02
+9.500000e-02 6.312082e+01 -8.520652e-04 -8.309324e-02
+1.000000e-01 6.464662e+01 -8.736372e-04 -8.717643e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.017293,0.008593) (0.006420,0.032246) (0.010255,0.022098) (0.002714,0.043964) (0.004198,0.012342) (0.017604,0.029968) (0.012080,0.045485) (0.008875,0.004920) (0.017081,0.038838) (0.001381,0.020838) (0.000033,0.004238) (0.019686,0.016441) (0.000052,0.036596) (0.042293,0.008593) (0.031420,0.032246) (0.035255,0.022098) (0.027714,0.043964) (0.029198,0.012342) (0.042604,0.029968) (0.037080,0.045485) (0.033875,0.004920) (0.042081,0.038838) (0.026381,0.020838) (0.025033,0.004238) (0.044686,0.016441) (0.025052,0.036596) (0.052714,0.043964) (0.051381,0.020838) (0.050033,0.004238) (0.050052,0.036596)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2f8ad4fd395a27cee65ff19333d68088cb7fef7a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.420580e+02 -1.827538e-03 -1.810723e-03
+1.000000e-02 2.838607e+02 -3.641987e-03 -3.608326e-03
+1.500000e-02 4.252819e+02 -5.447553e-03 -5.397496e-03
+2.000000e-02 5.659036e+02 -7.258251e-03 -7.192507e-03
+2.500000e-02 7.057161e+02 -9.076205e-03 -8.992323e-03
+3.000000e-02 8.450975e+02 -1.088947e-02 -1.078498e-02
+3.500000e-02 9.842029e+02 -1.269274e-02 -1.256621e-02
+4.000000e-02 1.123066e+03 -1.448491e-02 -1.433527e-02
+4.500000e-02 1.261695e+03 -1.626582e-02 -1.609212e-02
+5.000000e-02 1.400093e+03 -1.803552e-02 -1.783681e-02
+5.500000e-02 1.538262e+03 -1.979405e-02 -1.956944e-02
+6.000000e-02 1.676205e+03 -2.154151e-02 -2.129010e-02
+6.500000e-02 1.813924e+03 -2.327796e-02 -2.299889e-02
+7.000000e-02 1.951422e+03 -2.500334e-02 -2.469579e-02
+7.500000e-02 2.088697e+03 -2.671805e-02 -2.638113e-02
+8.000000e-02 2.225753e+03 -2.842202e-02 -2.805490e-02
+8.500000e-02 2.362591e+03 -3.011534e-02 -2.971719e-02
+9.000000e-02 2.499214e+03 -3.179810e-02 -3.136811e-02
+9.500000e-02 2.635622e+03 -3.347039e-02 -3.300775e-02
+1.000000e-01 2.771817e+03 -3.513229e-02 -3.463622e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.012768,0.013062) (0.016071,0.044975) (0.012648,0.025913) (0.000287,0.043420) (0.000028,0.013570) (0.016582,0.035385) (0.004264,0.026963) (0.000498,0.004205) (0.008484,0.036612) (0.015234,0.004683) (0.007894,0.019456) (0.007718,0.007022) (0.017059,0.019524) (0.037768,0.013062) (0.041071,0.044975) (0.037648,0.025913) (0.025287,0.043420) (0.025028,0.013570) (0.041582,0.035385) (0.029264,0.026963) (0.025498,0.004205) (0.033484,0.036612) (0.040234,0.004683) (0.032894,0.019456) (0.032718,0.007022) (0.042059,0.019524) (0.050287,0.043420) (0.050028,0.013570) (0.050498,0.004205)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f625fadd713f4e6b376420e404b937cd9093fec9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.716871e+00
+1.000000e-02 9.488222e+00
+1.500000e-02 1.157078e+01
+2.000000e-02 1.305408e+01
+2.500000e-02 1.428517e+01
+3.000000e-02 1.535031e+01
+3.500000e-02 1.628710e+01
+4.000000e-02 1.711975e+01
+4.500000e-02 1.786643e+01
+5.000000e-02 1.854181e+01
+5.500000e-02 1.915807e+01
+6.000000e-02 1.972555e+01
+6.500000e-02 2.025314e+01
+7.000000e-02 2.074854e+01
+7.500000e-02 2.121846e+01
+8.000000e-02 2.166873e+01
+8.500000e-02 2.210440e+01
+9.000000e-02 2.252982e+01
+9.500000e-02 2.294873e+01
+1.000000e-01 2.336434e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.012768,0.013062) (0.016071,0.044975) (0.012648,0.025913) (0.000287,0.043420) (0.000028,0.013570) (0.016582,0.035385) (0.004264,0.026963) (0.000498,0.004205) (0.008484,0.036612) (0.015234,0.004683) (0.007894,0.019456) (0.007718,0.007022) (0.017059,0.019524) (0.037768,0.013062) (0.041071,0.044975) (0.037648,0.025913) (0.025287,0.043420) (0.025028,0.013570) (0.041582,0.035385) (0.029264,0.026963) (0.025498,0.004205) (0.033484,0.036612) (0.040234,0.004683) (0.032894,0.019456) (0.032718,0.007022) (0.042059,0.019524) (0.050287,0.043420) (0.050028,0.013570) (0.050498,0.004205)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f8478e904b7be67ce72cd58d222bbc47fc8902d9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4002_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.338422e+01 -1.727879e-04 -4.144793e-03
+1.000000e-02 2.311338e+01 -3.013734e-04 -8.457635e-03
+1.500000e-02 2.937182e+01 -3.875135e-04 -1.293396e-02
+2.000000e-02 3.423623e+01 -4.560653e-04 -1.745106e-02
+2.500000e-02 3.844949e+01 -5.159104e-04 -2.196540e-02
+3.000000e-02 4.222442e+01 -5.697543e-04 -2.646432e-02
+3.500000e-02 4.565783e+01 -6.189241e-04 -3.094199e-02
+4.000000e-02 4.881376e+01 -6.643243e-04 -3.539466e-02
+4.500000e-02 5.174082e+01 -7.066459e-04 -3.981961e-02
+5.000000e-02 5.447691e+01 -7.464268e-04 -4.421486e-02
+5.500000e-02 5.705244e+01 -7.840944e-04 -4.857892e-02
+6.000000e-02 5.949283e+01 -8.200008e-04 -5.291067e-02
+6.500000e-02 6.181806e+01 -8.544221e-04 -5.720933e-02
+7.000000e-02 6.404451e+01 -8.875813e-04 -6.147437e-02
+7.500000e-02 6.618589e+01 -9.196624e-04 -6.570544e-02
+8.000000e-02 6.825296e+01 -9.508090e-04 -6.990236e-02
+8.500000e-02 7.025477e+01 -9.811368e-04 -7.406510e-02
+9.000000e-02 7.219825e+01 -1.010733e-03 -7.819371e-02
+9.500000e-02 7.408958e+01 -1.039672e-03 -8.228833e-02
+1.000000e-01 7.593423e+01 -1.068021e-03 -8.634911e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.012768,0.013062) (0.016071,0.044975) (0.012648,0.025913) (0.000287,0.043420) (0.000028,0.013570) (0.016582,0.035385) (0.004264,0.026963) (0.000498,0.004205) (0.008484,0.036612) (0.015234,0.004683) (0.007894,0.019456) (0.007718,0.007022) (0.017059,0.019524) (0.037768,0.013062) (0.041071,0.044975) (0.037648,0.025913) (0.025287,0.043420) (0.025028,0.013570) (0.041582,0.035385) (0.029264,0.026963) (0.025498,0.004205) (0.033484,0.036612) (0.040234,0.004683) (0.032894,0.019456) (0.032718,0.007022) (0.042059,0.019524) (0.050287,0.043420) (0.050028,0.013570) (0.050498,0.004205)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0c44dca77bc9b59d6acf5463659dfb76bcedc883
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.739839e+02 -1.684093e-03 -1.688479e-03
+1.000000e-02 3.475665e+02 -3.356197e-03 -3.364975e-03
+1.500000e-02 5.206396e+02 -5.020336e-03 -5.033804e-03
+2.000000e-02 6.928540e+02 -6.688777e-03 -6.707875e-03
+2.500000e-02 8.642177e+02 -8.361307e-03 -8.386427e-03
+3.000000e-02 1.035040e+03 -1.002854e-02 -1.005966e-02
+3.500000e-02 1.205460e+03 -1.168580e-02 -1.172288e-02
+4.000000e-02 1.375505e+03 -1.333242e-02 -1.337545e-02
+4.500000e-02 1.545182e+03 -1.496829e-02 -1.501727e-02
+5.000000e-02 1.714499e+03 -1.659331e-02 -1.664821e-02
+5.500000e-02 1.883453e+03 -1.820786e-02 -1.826866e-02
+6.000000e-02 2.052050e+03 -1.981186e-02 -1.987852e-02
+6.500000e-02 2.220293e+03 -2.140540e-02 -2.147789e-02
+7.000000e-02 2.388184e+03 -2.298855e-02 -2.306682e-02
+7.500000e-02 2.555726e+03 -2.456140e-02 -2.464542e-02
+8.000000e-02 2.722921e+03 -2.612404e-02 -2.621374e-02
+8.500000e-02 2.889771e+03 -2.767655e-02 -2.777189e-02
+9.000000e-02 3.056279e+03 -2.921902e-02 -2.931993e-02
+9.500000e-02 3.222447e+03 -3.075154e-02 -3.085797e-02
+1.000000e-01 3.388277e+03 -3.227420e-02 -3.238608e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.003117,0.037670) (0.000325,0.020796) (0.013772,0.036328) (0.009158,0.017226) (0.017006,0.012445) (0.000058,0.045167) (0.008395,0.027762) (0.007458,0.009489) (0.009653,0.042939) (0.016246,0.020843) (0.000265,0.012697) (0.017269,0.029320) (0.017199,0.045290) (0.000296,0.004507) (0.015120,0.004857) (0.000354,0.030028) (0.028117,0.037670) (0.025325,0.020796) (0.038772,0.036328) (0.034158,0.017226) (0.042006,0.012445) (0.025058,0.045167) (0.033395,0.027762) (0.032458,0.009489) (0.034653,0.042939) (0.041246,0.020843) (0.025265,0.012697) (0.042269,0.029320) (0.042199,0.045290) (0.025296,0.004507) (0.040120,0.004857) (0.025354,0.030028) (0.053117,0.037670) (0.050325,0.020796) (0.050058,0.045167) (0.050265,0.012697) (0.050296,0.004507) (0.050354,0.030028)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..47ac97932a12e72d46917a790bdbfd8651e9a4b5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.303399e+00
+1.000000e-02 1.092614e+01
+1.500000e-02 1.313984e+01
+2.000000e-02 1.477337e+01
+2.500000e-02 1.611853e+01
+3.000000e-02 1.726702e+01
+3.500000e-02 1.826915e+01
+4.000000e-02 1.916018e+01
+4.500000e-02 1.996643e+01
+5.000000e-02 2.070801e+01
+5.500000e-02 2.140828e+01
+6.000000e-02 2.206321e+01
+6.500000e-02 2.269039e+01
+7.000000e-02 2.329761e+01
+7.500000e-02 2.389097e+01
+8.000000e-02 2.447539e+01
+8.500000e-02 2.506051e+01
+9.000000e-02 2.563810e+01
+9.500000e-02 2.621686e+01
+1.000000e-01 2.679903e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.003117,0.037670) (0.000325,0.020796) (0.013772,0.036328) (0.009158,0.017226) (0.017006,0.012445) (0.000058,0.045167) (0.008395,0.027762) (0.007458,0.009489) (0.009653,0.042939) (0.016246,0.020843) (0.000265,0.012697) (0.017269,0.029320) (0.017199,0.045290) (0.000296,0.004507) (0.015120,0.004857) (0.000354,0.030028) (0.028117,0.037670) (0.025325,0.020796) (0.038772,0.036328) (0.034158,0.017226) (0.042006,0.012445) (0.025058,0.045167) (0.033395,0.027762) (0.032458,0.009489) (0.034653,0.042939) (0.041246,0.020843) (0.025265,0.012697) (0.042269,0.029320) (0.042199,0.045290) (0.025296,0.004507) (0.040120,0.004857) (0.025354,0.030028) (0.053117,0.037670) (0.050325,0.020796) (0.050058,0.045167) (0.050265,0.012697) (0.050296,0.004507) (0.050354,0.030028)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fc6220d9992be127910d5b4f08d002b588bccb53
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.172491e+01 -2.117964e-04 -3.843155e-03
+1.000000e-02 3.557080e+01 -3.527543e-04 -8.020014e-03
+1.500000e-02 4.589194e+01 -4.611959e-04 -1.233277e-02
+2.000000e-02 5.456654e+01 -5.541291e-04 -1.668780e-02
+2.500000e-02 6.226009e+01 -6.377233e-04 -2.105122e-02
+3.000000e-02 6.924996e+01 -7.146273e-04 -2.540893e-02
+3.500000e-02 7.569879e+01 -7.864345e-04 -2.975273e-02
+4.000000e-02 8.171638e+01 -8.542333e-04 -3.407710e-02
+4.500000e-02 8.738047e+01 -9.187915e-04 -3.837826e-02
+5.000000e-02 9.274815e+01 -9.806662e-04 -4.265347e-02
+5.500000e-02 9.788939e+01 -1.040375e-03 -4.690135e-02
+6.000000e-02 1.027754e+02 -1.097918e-03 -5.111976e-02
+6.500000e-02 1.074583e+02 -1.153634e-03 -5.530819e-02
+7.000000e-02 1.119536e+02 -1.207643e-03 -5.946608e-02
+7.500000e-02 1.162737e+02 -1.260034e-03 -6.359301e-02
+8.000000e-02 1.203925e+02 -1.310718e-03 -6.768805e-02
+8.500000e-02 1.243883e+02 -1.360031e-03 -7.175193e-02
+9.000000e-02 1.282318e+02 -1.407813e-03 -7.578400e-02
+9.500000e-02 1.319101e+02 -1.453908e-03 -7.978464e-02
+1.000000e-01 1.354507e+02 -1.498490e-03 -8.375271e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.003117,0.037670) (0.000325,0.020796) (0.013772,0.036328) (0.009158,0.017226) (0.017006,0.012445) (0.000058,0.045167) (0.008395,0.027762) (0.007458,0.009489) (0.009653,0.042939) (0.016246,0.020843) (0.000265,0.012697) (0.017269,0.029320) (0.017199,0.045290) (0.000296,0.004507) (0.015120,0.004857) (0.000354,0.030028) (0.028117,0.037670) (0.025325,0.020796) (0.038772,0.036328) (0.034158,0.017226) (0.042006,0.012445) (0.025058,0.045167) (0.033395,0.027762) (0.032458,0.009489) (0.034653,0.042939) (0.041246,0.020843) (0.025265,0.012697) (0.042269,0.029320) (0.042199,0.045290) (0.025296,0.004507) (0.040120,0.004857) (0.025354,0.030028) (0.053117,0.037670) (0.050325,0.020796) (0.050058,0.045167) (0.050265,0.012697) (0.050296,0.004507) (0.050354,0.030028)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d6bcaf57cf0775a0599b8af0e72a91cc983675e3
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.739736e+02 -1.679709e-03 -1.700314e-03
+1.000000e-02 3.475495e+02 -3.347534e-03 -3.388454e-03
+1.500000e-02 5.206202e+02 -5.008019e-03 -5.067893e-03
+2.000000e-02 6.928351e+02 -6.675278e-03 -6.749259e-03
+2.500000e-02 8.641972e+02 -8.348766e-03 -8.433392e-03
+3.000000e-02 1.035027e+03 -1.001703e-02 -1.011100e-02
+3.500000e-02 1.205456e+03 -1.167588e-02 -1.177808e-02
+4.000000e-02 1.375513e+03 -1.332453e-02 -1.343387e-02
+4.500000e-02 1.545205e+03 -1.496288e-02 -1.507831e-02
+5.000000e-02 1.714536e+03 -1.659095e-02 -1.671148e-02
+5.500000e-02 1.883510e+03 -1.820879e-02 -1.833346e-02
+6.000000e-02 2.052128e+03 -1.981646e-02 -1.994437e-02
+6.500000e-02 2.220395e+03 -2.141401e-02 -2.154432e-02
+7.000000e-02 2.388313e+03 -2.300142e-02 -2.313324e-02
+7.500000e-02 2.555883e+03 -2.457893e-02 -2.471157e-02
+8.000000e-02 2.723108e+03 -2.614652e-02 -2.627926e-02
+8.500000e-02 2.889990e+03 -2.770426e-02 -2.783640e-02
+9.000000e-02 3.056531e+03 -2.925222e-02 -2.938311e-02
+9.500000e-02 3.222735e+03 -3.079049e-02 -3.091948e-02
+1.000000e-01 3.388601e+03 -3.231912e-02 -3.244561e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008890,0.012349) (0.002006,0.024471) (0.016779,0.005096) (0.000662,0.044882) (0.000019,0.005946) (0.007790,0.004447) (0.017254,0.032806) (0.009620,0.037437) (0.008868,0.045566) (0.016775,0.025059) (0.000928,0.014873) (0.017253,0.012819) (0.016295,0.042809) (0.001369,0.033280) (0.009767,0.028819) (0.010116,0.020344) (0.033890,0.012349) (0.027006,0.024471) (0.041779,0.005096) (0.025662,0.044882) (0.025019,0.005946) (0.032790,0.004447) (0.042254,0.032806) (0.034620,0.037437) (0.033868,0.045566) (0.041775,0.025059) (0.025928,0.014873) (0.042253,0.012819) (0.041295,0.042809) (0.026369,0.033280) (0.034767,0.028819) (0.035116,0.020344) (0.052006,0.024471) (0.050662,0.044882) (0.050019,0.005946) (0.050928,0.014873) (0.051369,0.033280)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d2f361d2aff1e03358e52f66ca0796c63da7cbb7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.117572e+00
+1.000000e-02 1.076655e+01
+1.500000e-02 1.293781e+01
+2.000000e-02 1.456913e+01
+2.500000e-02 1.590975e+01
+3.000000e-02 1.704559e+01
+3.500000e-02 1.802640e+01
+4.000000e-02 1.888801e+01
+4.500000e-02 1.965796e+01
+5.000000e-02 2.035795e+01
+5.500000e-02 2.100516e+01
+6.000000e-02 2.162098e+01
+6.500000e-02 2.220124e+01
+7.000000e-02 2.276190e+01
+7.500000e-02 2.331011e+01
+8.000000e-02 2.385155e+01
+8.500000e-02 2.439077e+01
+9.000000e-02 2.493139e+01
+9.500000e-02 2.547641e+01
+1.000000e-01 2.602822e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008890,0.012349) (0.002006,0.024471) (0.016779,0.005096) (0.000662,0.044882) (0.000019,0.005946) (0.007790,0.004447) (0.017254,0.032806) (0.009620,0.037437) (0.008868,0.045566) (0.016775,0.025059) (0.000928,0.014873) (0.017253,0.012819) (0.016295,0.042809) (0.001369,0.033280) (0.009767,0.028819) (0.010116,0.020344) (0.033890,0.012349) (0.027006,0.024471) (0.041779,0.005096) (0.025662,0.044882) (0.025019,0.005946) (0.032790,0.004447) (0.042254,0.032806) (0.034620,0.037437) (0.033868,0.045566) (0.041775,0.025059) (0.025928,0.014873) (0.042253,0.012819) (0.041295,0.042809) (0.026369,0.033280) (0.034767,0.028819) (0.035116,0.020344) (0.052006,0.024471) (0.050662,0.044882) (0.050019,0.005946) (0.050928,0.014873) (0.051369,0.033280)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bbe3bef8355c2060171a171efbbc379e5fa3c13b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.289649e+01 -2.227537e-04 -3.786697e-03
+1.000000e-02 3.740490e+01 -3.711241e-04 -7.922521e-03
+1.500000e-02 4.840062e+01 -4.870934e-04 -1.219322e-02
+2.000000e-02 5.778803e+01 -5.880485e-04 -1.650357e-02
+2.500000e-02 6.616774e+01 -6.796202e-04 -2.082272e-02
+3.000000e-02 7.380078e+01 -7.642752e-04 -2.513742e-02
+3.500000e-02 8.084244e+01 -8.434661e-04 -2.944000e-02
+4.000000e-02 8.739424e+01 -9.181206e-04 -3.372561e-02
+4.500000e-02 9.352591e+01 -9.888599e-04 -3.799111e-02
+5.000000e-02 9.928970e+01 -1.056142e-03 -4.223431e-02
+5.500000e-02 1.047285e+02 -1.120345e-03 -4.645355e-02
+6.000000e-02 1.098834e+02 -1.181844e-03 -5.064744e-02
+6.500000e-02 1.147909e+02 -1.240982e-03 -5.481489e-02
+7.000000e-02 1.194819e+02 -1.298057e-03 -5.895523e-02
+7.500000e-02 1.239771e+02 -1.353257e-03 -6.306845e-02
+8.000000e-02 1.282897e+02 -1.406689e-03 -6.715508e-02
+8.500000e-02 1.324260e+02 -1.458379e-03 -7.121603e-02
+9.000000e-02 1.363743e+02 -1.508170e-03 -7.525306e-02
+9.500000e-02 1.401455e+02 -1.556130e-03 -7.926677e-02
+1.000000e-01 1.437195e+02 -1.602005e-03 -8.325890e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008890,0.012349) (0.002006,0.024471) (0.016779,0.005096) (0.000662,0.044882) (0.000019,0.005946) (0.007790,0.004447) (0.017254,0.032806) (0.009620,0.037437) (0.008868,0.045566) (0.016775,0.025059) (0.000928,0.014873) (0.017253,0.012819) (0.016295,0.042809) (0.001369,0.033280) (0.009767,0.028819) (0.010116,0.020344) (0.033890,0.012349) (0.027006,0.024471) (0.041779,0.005096) (0.025662,0.044882) (0.025019,0.005946) (0.032790,0.004447) (0.042254,0.032806) (0.034620,0.037437) (0.033868,0.045566) (0.041775,0.025059) (0.025928,0.014873) (0.042253,0.012819) (0.041295,0.042809) (0.026369,0.033280) (0.034767,0.028819) (0.035116,0.020344) (0.052006,0.024471) (0.050662,0.044882) (0.050019,0.005946) (0.050928,0.014873) (0.051369,0.033280)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1c27de19ea46f20f1acd4a5aa0e987678f994eb2
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.739843e+02 -1.666533e-03 -1.712369e-03
+1.000000e-02 3.475703e+02 -3.321205e-03 -3.412563e-03
+1.500000e-02 5.206501e+02 -4.968189e-03 -5.104454e-03
+2.000000e-02 6.928718e+02 -6.619792e-03 -6.800834e-03
+2.500000e-02 8.642416e+02 -8.275143e-03 -8.502224e-03
+3.000000e-02 1.035079e+03 -9.924501e-03 -1.019811e-02
+3.500000e-02 1.205514e+03 -1.156400e-02 -1.188396e-02
+4.000000e-02 1.375577e+03 -1.319293e-02 -1.355889e-02
+4.500000e-02 1.545276e+03 -1.481126e-02 -1.522282e-02
+5.000000e-02 1.714613e+03 -1.641901e-02 -1.687579e-02
+5.500000e-02 1.883592e+03 -1.801628e-02 -1.851786e-02
+6.000000e-02 2.052217e+03 -1.960313e-02 -2.014912e-02
+6.500000e-02 2.220488e+03 -2.117965e-02 -2.176964e-02
+7.000000e-02 2.388412e+03 -2.274579e-02 -2.337938e-02
+7.500000e-02 2.555987e+03 -2.430189e-02 -2.497871e-02
+8.000000e-02 2.723216e+03 -2.584791e-02 -2.656757e-02
+8.500000e-02 2.890103e+03 -2.738393e-02 -2.814605e-02
+9.000000e-02 3.056649e+03 -2.891003e-02 -2.971425e-02
+9.500000e-02 3.222856e+03 -3.042630e-02 -3.127224e-02
+1.000000e-01 3.388727e+03 -3.193284e-02 -3.282012e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016121,0.020492) (0.019058,0.029314) (0.002996,0.004951) (0.000287,0.044353) (0.000777,0.035726) (0.017272,0.036897) (0.009371,0.009425) (0.008881,0.045598) (0.011311,0.026745) (0.016706,0.012423) (0.019317,0.004231) (0.008681,0.037519) (0.001323,0.013362) (0.000842,0.021989) (0.017101,0.044611) (0.008820,0.017749) (0.041121,0.020492) (0.044058,0.029314) (0.027996,0.004951) (0.025287,0.044353) (0.025777,0.035726) (0.042272,0.036897) (0.034371,0.009425) (0.033881,0.045598) (0.036311,0.026745) (0.041706,0.012423) (0.044317,0.004231) (0.033681,0.037519) (0.026323,0.013362) (0.025842,0.021989) (0.042101,0.044611) (0.033820,0.017749) (0.052996,0.004951) (0.050287,0.044353) (0.050777,0.035726) (0.051323,0.013362) (0.050842,0.021989)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5e13983c0a6e7672f2b34efb74435252b48b2a0e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.243663e+00
+1.000000e-02 1.091527e+01
+1.500000e-02 1.314315e+01
+2.000000e-02 1.479969e+01
+2.500000e-02 1.615700e+01
+3.000000e-02 1.730909e+01
+3.500000e-02 1.830750e+01
+4.000000e-02 1.918823e+01
+4.500000e-02 1.997849e+01
+5.000000e-02 2.069935e+01
+5.500000e-02 2.136744e+01
+6.000000e-02 2.199606e+01
+6.500000e-02 2.259598e+01
+7.000000e-02 2.317592e+01
+7.500000e-02 2.374299e+01
+8.000000e-02 2.430293e+01
+8.500000e-02 2.486039e+01
+9.000000e-02 2.541908e+01
+9.500000e-02 2.598198e+01
+1.000000e-01 2.655147e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016121,0.020492) (0.019058,0.029314) (0.002996,0.004951) (0.000287,0.044353) (0.000777,0.035726) (0.017272,0.036897) (0.009371,0.009425) (0.008881,0.045598) (0.011311,0.026745) (0.016706,0.012423) (0.019317,0.004231) (0.008681,0.037519) (0.001323,0.013362) (0.000842,0.021989) (0.017101,0.044611) (0.008820,0.017749) (0.041121,0.020492) (0.044058,0.029314) (0.027996,0.004951) (0.025287,0.044353) (0.025777,0.035726) (0.042272,0.036897) (0.034371,0.009425) (0.033881,0.045598) (0.036311,0.026745) (0.041706,0.012423) (0.044317,0.004231) (0.033681,0.037519) (0.026323,0.013362) (0.025842,0.021989) (0.042101,0.044611) (0.033820,0.017749) (0.052996,0.004951) (0.050287,0.044353) (0.050777,0.035726) (0.051323,0.013362) (0.050842,0.021989)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bb018cc40fffa2b4229661f1a1c1a5ec532bb50a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.222484e+01 -2.144408e-04 -3.837666e-03
+1.000000e-02 3.643755e+01 -3.584424e-04 -7.999700e-03
+1.500000e-02 4.701928e+01 -4.688525e-04 -1.230195e-02
+2.000000e-02 5.593926e+01 -5.637421e-04 -1.664389e-02
+2.500000e-02 6.392032e+01 -6.497929e-04 -2.098872e-02
+3.000000e-02 7.126601e+01 -7.298672e-04 -2.532195e-02
+3.500000e-02 7.811149e+01 -8.053875e-04 -2.963448e-02
+4.000000e-02 8.458510e+01 -8.775850e-04 -3.392067e-02
+4.500000e-02 9.076609e+01 -9.472523e-04 -3.817641e-02
+5.000000e-02 9.671029e+01 -1.014948e-03 -4.239869e-02
+5.500000e-02 1.024562e+02 -1.081051e-03 -4.658541e-02
+6.000000e-02 1.080296e+02 -1.145805e-03 -5.073501e-02
+6.500000e-02 1.134461e+02 -1.209345e-03 -5.484642e-02
+7.000000e-02 1.187125e+02 -1.271704e-03 -5.891887e-02
+7.500000e-02 1.238268e+02 -1.332819e-03 -6.295184e-02
+8.000000e-02 1.287515e+02 -1.392383e-03 -6.694428e-02
+8.500000e-02 1.335180e+02 -1.450421e-03 -7.089659e-02
+9.000000e-02 1.380526e+02 -1.506222e-03 -7.480819e-02
+9.500000e-02 1.423356e+02 -1.559423e-03 -7.867693e-02
+1.000000e-01 1.462852e+02 -1.609024e-03 -8.250121e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016121,0.020492) (0.019058,0.029314) (0.002996,0.004951) (0.000287,0.044353) (0.000777,0.035726) (0.017272,0.036897) (0.009371,0.009425) (0.008881,0.045598) (0.011311,0.026745) (0.016706,0.012423) (0.019317,0.004231) (0.008681,0.037519) (0.001323,0.013362) (0.000842,0.021989) (0.017101,0.044611) (0.008820,0.017749) (0.041121,0.020492) (0.044058,0.029314) (0.027996,0.004951) (0.025287,0.044353) (0.025777,0.035726) (0.042272,0.036897) (0.034371,0.009425) (0.033881,0.045598) (0.036311,0.026745) (0.041706,0.012423) (0.044317,0.004231) (0.033681,0.037519) (0.026323,0.013362) (0.025842,0.021989) (0.042101,0.044611) (0.033820,0.017749) (0.052996,0.004951) (0.050287,0.044353) (0.050777,0.035726) (0.051323,0.013362) (0.050842,0.021989)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f2b123af598a4b707b0343c9c9da653de3017a1f
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.739753e+02 -1.692665e-03 -1.686356e-03
+1.000000e-02 3.475524e+02 -3.373389e-03 -3.360616e-03
+1.500000e-02 5.206231e+02 -5.046516e-03 -5.026542e-03
+2.000000e-02 6.928357e+02 -6.726153e-03 -6.695135e-03
+2.500000e-02 8.641970e+02 -8.412480e-03 -8.365730e-03
+3.000000e-02 1.035026e+03 -1.009419e-02 -1.002941e-02
+3.500000e-02 1.205453e+03 -1.176660e-02 -1.168247e-02
+4.000000e-02 1.375507e+03 -1.342880e-02 -1.332427e-02
+4.500000e-02 1.545197e+03 -1.508067e-02 -1.495478e-02
+5.000000e-02 1.714526e+03 -1.672222e-02 -1.657407e-02
+5.500000e-02 1.883497e+03 -1.835348e-02 -1.818224e-02
+6.000000e-02 2.052115e+03 -1.997442e-02 -1.977926e-02
+6.500000e-02 2.220379e+03 -2.158529e-02 -2.136554e-02
+7.000000e-02 2.388293e+03 -2.318604e-02 -2.294105e-02
+7.500000e-02 2.555859e+03 -2.477673e-02 -2.450587e-02
+8.000000e-02 2.723081e+03 -2.635744e-02 -2.606013e-02
+8.500000e-02 2.889959e+03 -2.792822e-02 -2.760394e-02
+9.000000e-02 3.056497e+03 -2.948915e-02 -2.913739e-02
+9.500000e-02 3.222697e+03 -3.104030e-02 -3.066058e-02
+1.000000e-01 3.388560e+03 -3.258174e-02 -3.217364e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008803,0.025475) (0.017039,0.013536) (0.017231,0.045526) (0.008870,0.033330) (0.008548,0.017370) (0.016098,0.029994) (0.019197,0.021829) (0.009286,0.042975) (0.000610,0.026169) (0.000116,0.004393) (0.000785,0.035561) (0.000123,0.043731) (0.008338,0.008948) (0.015408,0.005431) (0.016239,0.037783) (0.000741,0.015232) (0.033803,0.025475) (0.042039,0.013536) (0.042231,0.045526) (0.033870,0.033330) (0.033548,0.017370) (0.041098,0.029994) (0.044197,0.021829) (0.034286,0.042975) (0.025610,0.026169) (0.025116,0.004393) (0.025785,0.035561) (0.025123,0.043731) (0.033338,0.008948) (0.040408,0.005431) (0.041239,0.037783) (0.025741,0.015232) (0.050610,0.026169) (0.050116,0.004393) (0.050785,0.035561) (0.050123,0.043731) (0.050741,0.015232)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a8d4e08221fd5c3429c05fa1be2f404d30635b3b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.202046e+00
+1.000000e-02 1.089749e+01
+1.500000e-02 1.310201e+01
+2.000000e-02 1.475424e+01
+2.500000e-02 1.611431e+01
+3.000000e-02 1.727109e+01
+3.500000e-02 1.827527e+01
+4.000000e-02 1.916271e+01
+4.500000e-02 1.996069e+01
+5.000000e-02 2.069031e+01
+5.500000e-02 2.137331e+01
+6.000000e-02 2.201193e+01
+6.500000e-02 2.262153e+01
+7.000000e-02 2.321430e+01
+7.500000e-02 2.378842e+01
+8.000000e-02 2.435351e+01
+8.500000e-02 2.491381e+01
+9.000000e-02 2.547281e+01
+9.500000e-02 2.603343e+01
+1.000000e-01 2.659806e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008803,0.025475) (0.017039,0.013536) (0.017231,0.045526) (0.008870,0.033330) (0.008548,0.017370) (0.016098,0.029994) (0.019197,0.021829) (0.009286,0.042975) (0.000610,0.026169) (0.000116,0.004393) (0.000785,0.035561) (0.000123,0.043731) (0.008338,0.008948) (0.015408,0.005431) (0.016239,0.037783) (0.000741,0.015232) (0.033803,0.025475) (0.042039,0.013536) (0.042231,0.045526) (0.033870,0.033330) (0.033548,0.017370) (0.041098,0.029994) (0.044197,0.021829) (0.034286,0.042975) (0.025610,0.026169) (0.025116,0.004393) (0.025785,0.035561) (0.025123,0.043731) (0.033338,0.008948) (0.040408,0.005431) (0.041239,0.037783) (0.025741,0.015232) (0.050610,0.026169) (0.050116,0.004393) (0.050785,0.035561) (0.050123,0.043731) (0.050741,0.015232)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..94fcf4f4b0288072adfda0d05813343806c69550
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.104321e+01 -2.060457e-04 -3.869527e-03
+1.000000e-02 3.448161e+01 -3.434167e-04 -8.062374e-03
+1.500000e-02 4.423093e+01 -4.468545e-04 -1.239676e-02
+2.000000e-02 5.245215e+01 -5.356869e-04 -1.676821e-02
+2.500000e-02 5.979095e+01 -6.160168e-04 -2.114283e-02
+3.000000e-02 6.651082e+01 -6.904434e-04 -2.550694e-02
+3.500000e-02 7.277385e+01 -7.606031e-04 -2.985220e-02
+4.000000e-02 7.869359e+01 -8.276564e-04 -3.417282e-02
+4.500000e-02 8.435425e+01 -8.924661e-04 -3.846459e-02
+5.000000e-02 8.981699e+01 -9.556616e-04 -4.272452e-02
+5.500000e-02 9.512588e+01 -1.017696e-03 -4.695054e-02
+6.000000e-02 1.003129e+02 -1.078895e-03 -5.114121e-02
+6.500000e-02 1.054235e+02 -1.139618e-03 -5.529588e-02
+7.000000e-02 1.104278e+02 -1.199733e-03 -5.941349e-02
+7.500000e-02 1.153571e+02 -1.259449e-03 -6.349399e-02
+8.000000e-02 1.201854e+02 -1.318600e-03 -6.753705e-02
+8.500000e-02 1.249641e+02 -1.377434e-03 -7.154346e-02
+9.000000e-02 1.296620e+02 -1.435696e-03 -7.551312e-02
+9.500000e-02 1.342692e+02 -1.493236e-03 -7.944623e-02
+1.000000e-01 1.387715e+02 -1.549841e-03 -8.334306e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008803,0.025475) (0.017039,0.013536) (0.017231,0.045526) (0.008870,0.033330) (0.008548,0.017370) (0.016098,0.029994) (0.019197,0.021829) (0.009286,0.042975) (0.000610,0.026169) (0.000116,0.004393) (0.000785,0.035561) (0.000123,0.043731) (0.008338,0.008948) (0.015408,0.005431) (0.016239,0.037783) (0.000741,0.015232) (0.033803,0.025475) (0.042039,0.013536) (0.042231,0.045526) (0.033870,0.033330) (0.033548,0.017370) (0.041098,0.029994) (0.044197,0.021829) (0.034286,0.042975) (0.025610,0.026169) (0.025116,0.004393) (0.025785,0.035561) (0.025123,0.043731) (0.033338,0.008948) (0.040408,0.005431) (0.041239,0.037783) (0.025741,0.015232) (0.050610,0.026169) (0.050116,0.004393) (0.050785,0.035561) (0.050123,0.043731) (0.050741,0.015232)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4bf0a2d343f9088dc4853857d715f2863bff62fd
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.739695e+02 -1.650910e-03 -1.728174e-03
+1.000000e-02 3.475409e+02 -3.290009e-03 -3.444108e-03
+1.500000e-02 5.206063e+02 -4.920914e-03 -5.152232e-03
+2.000000e-02 6.928145e+02 -6.554609e-03 -6.866584e-03
+2.500000e-02 8.641734e+02 -8.190296e-03 -8.587284e-03
+3.000000e-02 1.034995e+03 -9.819559e-03 -1.030344e-02
+3.500000e-02 1.205417e+03 -1.143849e-02 -1.200972e-02
+4.000000e-02 1.375467e+03 -1.304664e-02 -1.370529e-02
+4.500000e-02 1.545152e+03 -1.464397e-02 -1.539003e-02
+5.000000e-02 1.714476e+03 -1.623058e-02 -1.706395e-02
+5.500000e-02 1.883444e+03 -1.780643e-02 -1.872694e-02
+6.000000e-02 2.052054e+03 -1.937188e-02 -2.037937e-02
+6.500000e-02 2.220313e+03 -2.092690e-02 -2.202115e-02
+7.000000e-02 2.388221e+03 -2.247159e-02 -2.365234e-02
+7.500000e-02 2.555782e+03 -2.400605e-02 -2.527301e-02
+8.000000e-02 2.722998e+03 -2.553039e-02 -2.688325e-02
+8.500000e-02 2.889871e+03 -2.704470e-02 -2.848311e-02
+9.000000e-02 3.056403e+03 -2.854909e-02 -3.007267e-02
+9.500000e-02 3.222597e+03 -3.004364e-02 -3.165202e-02
+1.000000e-01 3.388454e+03 -3.152848e-02 -3.322124e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016456,0.035733) (0.001086,0.019164) (0.017187,0.017159) (0.016822,0.007741) (0.016038,0.026185) (0.008763,0.029399) (0.008629,0.045742) (0.008920,0.037615) (0.000365,0.027520) (0.016576,0.045289) (0.000346,0.044672) (0.004214,0.004368) (0.000421,0.035386) (0.009515,0.011362) (0.000061,0.010961) (0.008936,0.019547) (0.041456,0.035733) (0.026086,0.019164) (0.042187,0.017159) (0.041822,0.007741) (0.041038,0.026185) (0.033763,0.029399) (0.033629,0.045742) (0.033920,0.037615) (0.025365,0.027520) (0.041576,0.045289) (0.025346,0.044672) (0.029214,0.004368) (0.025421,0.035386) (0.034515,0.011362) (0.025061,0.010961) (0.033936,0.019547) (0.051086,0.019164) (0.050365,0.027520) (0.050346,0.044672) (0.050421,0.035386) (0.050061,0.010961)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f1b9af0f34539d25db996b1a5f347f38c6f772fe
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.256013e+00
+1.000000e-02 1.086808e+01
+1.500000e-02 1.306942e+01
+2.000000e-02 1.470806e+01
+2.500000e-02 1.605158e+01
+3.000000e-02 1.718936e+01
+3.500000e-02 1.817263e+01
+4.000000e-02 1.903766e+01
+4.500000e-02 1.981218e+01
+5.000000e-02 2.051797e+01
+5.500000e-02 2.117240e+01
+6.000000e-02 2.178940e+01
+6.500000e-02 2.238881e+01
+7.000000e-02 2.296238e+01
+7.500000e-02 2.352560e+01
+8.000000e-02 2.408423e+01
+8.500000e-02 2.464275e+01
+9.000000e-02 2.520460e+01
+9.500000e-02 2.577248e+01
+1.000000e-01 2.634853e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016456,0.035733) (0.001086,0.019164) (0.017187,0.017159) (0.016822,0.007741) (0.016038,0.026185) (0.008763,0.029399) (0.008629,0.045742) (0.008920,0.037615) (0.000365,0.027520) (0.016576,0.045289) (0.000346,0.044672) (0.004214,0.004368) (0.000421,0.035386) (0.009515,0.011362) (0.000061,0.010961) (0.008936,0.019547) (0.041456,0.035733) (0.026086,0.019164) (0.042187,0.017159) (0.041822,0.007741) (0.041038,0.026185) (0.033763,0.029399) (0.033629,0.045742) (0.033920,0.037615) (0.025365,0.027520) (0.041576,0.045289) (0.025346,0.044672) (0.029214,0.004368) (0.025421,0.035386) (0.034515,0.011362) (0.025061,0.010961) (0.033936,0.019547) (0.051086,0.019164) (0.050365,0.027520) (0.050346,0.044672) (0.050421,0.035386) (0.050061,0.010961)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c6d6d18ce94a16b6dea325ce3ef70962306dabf2
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GHDPE_0.4926_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.327582e+01 -2.225352e-04 -3.804081e-03
+1.000000e-02 3.773692e+01 -3.675659e-04 -7.969580e-03
+1.500000e-02 4.879609e+01 -4.810854e-04 -1.226513e-02
+2.000000e-02 5.822138e+01 -5.795780e-04 -1.659998e-02
+2.500000e-02 6.670122e+01 -6.693991e-04 -2.093969e-02
+3.000000e-02 7.455082e+01 -7.535332e-04 -2.526873e-02
+3.500000e-02 8.195903e+01 -8.338213e-04 -2.957783e-02
+4.000000e-02 8.905363e+01 -9.115378e-04 -3.386074e-02
+4.500000e-02 9.592456e+01 -9.875922e-04 -3.811314e-02
+5.000000e-02 1.026347e+02 -1.062628e-03 -4.233204e-02
+5.500000e-02 1.092260e+02 -1.137075e-03 -4.651550e-02
+6.000000e-02 1.157237e+02 -1.211195e-03 -5.066241e-02
+6.500000e-02 1.221408e+02 -1.285117e-03 -5.477223e-02
+7.000000e-02 1.284772e+02 -1.358834e-03 -5.884498e-02
+7.500000e-02 1.347194e+02 -1.432192e-03 -6.288125e-02
+8.000000e-02 1.408431e+02 -1.504899e-03 -6.688198e-02
+8.500000e-02 1.468135e+02 -1.576533e-03 -7.084845e-02
+9.000000e-02 1.525894e+02 -1.646584e-03 -7.478199e-02
+9.500000e-02 1.581231e+02 -1.714459e-03 -7.868398e-02
+1.000000e-01 1.633655e+02 -1.779528e-03 -8.255558e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016456,0.035733) (0.001086,0.019164) (0.017187,0.017159) (0.016822,0.007741) (0.016038,0.026185) (0.008763,0.029399) (0.008629,0.045742) (0.008920,0.037615) (0.000365,0.027520) (0.016576,0.045289) (0.000346,0.044672) (0.004214,0.004368) (0.000421,0.035386) (0.009515,0.011362) (0.000061,0.010961) (0.008936,0.019547) (0.041456,0.035733) (0.026086,0.019164) (0.042187,0.017159) (0.041822,0.007741) (0.041038,0.026185) (0.033763,0.029399) (0.033629,0.045742) (0.033920,0.037615) (0.025365,0.027520) (0.041576,0.045289) (0.025346,0.044672) (0.029214,0.004368) (0.025421,0.035386) (0.034515,0.011362) (0.025061,0.010961) (0.033936,0.019547) (0.051086,0.019164) (0.050365,0.027520) (0.050346,0.044672) (0.050421,0.035386) (0.050061,0.010961)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5276e6ec25bc022815307e5a409342156a18dd14
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.648148e+01 -2.103989e-03 -2.122348e-03
+1.000000e-02 7.293724e+01 -4.192212e-03 -4.228866e-03
+1.500000e-02 1.093673e+02 -6.264854e-03 -6.319740e-03
+2.000000e-02 1.457716e+02 -8.322101e-03 -8.395157e-03
+2.500000e-02 1.821466e+02 -1.036434e-02 -1.045549e-02
+3.000000e-02 2.184164e+02 -1.239626e-02 -1.250518e-02
+3.500000e-02 2.539471e+02 -1.445480e-02 -1.458054e-02
+4.000000e-02 2.880486e+02 -1.657793e-02 -1.672286e-02
+4.500000e-02 3.215241e+02 -1.872010e-02 -1.888642e-02
+5.000000e-02 3.548005e+02 -2.085806e-02 -2.104634e-02
+5.500000e-02 3.879482e+02 -2.298815e-02 -2.319864e-02
+6.000000e-02 4.209853e+02 -2.510952e-02 -2.534245e-02
+6.500000e-02 4.539238e+02 -2.722169e-02 -2.747726e-02
+7.000000e-02 4.867740e+02 -2.932422e-02 -2.960264e-02
+7.500000e-02 5.195456e+02 -3.141674e-02 -3.171820e-02
+8.000000e-02 5.522474e+02 -3.349892e-02 -3.382361e-02
+8.500000e-02 5.848875e+02 -3.557046e-02 -3.591855e-02
+9.000000e-02 6.174735e+02 -3.763107e-02 -3.800275e-02
+9.500000e-02 6.500122e+02 -3.968053e-02 -4.007596e-02
+1.000000e-01 6.825098e+02 -4.171863e-02 -4.213799e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.008491,0.024206) (0.018258,0.017448) (0.019681,0.039940) (0.033491,0.024206) (0.043258,0.017448) (0.044681,0.039940)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..69c182660b6773719902687c685f3e2b155064c1
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.846385e+00
+1.000000e-02 7.693922e+00
+1.500000e-02 1.150738e+01
+2.000000e-02 1.496098e+01
+2.500000e-02 1.779356e+01
+3.000000e-02 1.967984e+01
+3.500000e-02 2.073571e+01
+4.000000e-02 2.146290e+01
+4.500000e-02 2.202391e+01
+5.000000e-02 2.246707e+01
+5.500000e-02 2.281713e+01
+6.000000e-02 2.308975e+01
+6.500000e-02 2.329615e+01
+7.000000e-02 2.344566e+01
+7.500000e-02 2.354627e+01
+8.000000e-02 2.360450e+01
+8.500000e-02 2.362666e+01
+9.000000e-02 2.361771e+01
+9.500000e-02 2.358105e+01
+1.000000e-01 2.351874e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.008491,0.024206) (0.018258,0.017448) (0.019681,0.039940) (0.033491,0.024206) (0.043258,0.017448) (0.044681,0.039940)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9bbd00e9f28cb3cc4f124ceceb047bab391549b6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.585268e+00 -3.798902e-04 -3.709943e-03
+1.000000e-02 1.313906e+01 -7.554294e-04 -7.392286e-03
+1.500000e-02 1.966158e+01 -1.126660e-03 -1.104736e-02
+2.000000e-02 2.609707e+01 -1.490917e-03 -1.468494e-02
+2.500000e-02 3.192704e+01 -1.824540e-03 -1.839046e-02
+3.000000e-02 3.633763e+01 -2.093125e-03 -2.229177e-02
+3.500000e-02 3.934751e+01 -2.296361e-03 -2.639253e-02
+4.000000e-02 4.142627e+01 -2.453721e-03 -3.061796e-02
+4.500000e-02 4.295180e+01 -2.580482e-03 -3.490577e-02
+5.000000e-02 4.413109e+01 -2.685266e-03 -3.922089e-02
+5.500000e-02 4.505393e+01 -2.771762e-03 -4.354875e-02
+6.000000e-02 4.576567e+01 -2.842479e-03 -4.788072e-02
+6.500000e-02 4.629794e+01 -2.899316e-03 -5.221084e-02
+7.000000e-02 4.667663e+01 -2.943954e-03 -5.653412e-02
+7.500000e-02 4.692435e+01 -2.977930e-03 -6.084620e-02
+8.000000e-02 4.706114e+01 -3.002655e-03 -6.514323e-02
+8.500000e-02 4.710483e+01 -3.019423e-03 -6.942177e-02
+9.000000e-02 4.707133e+01 -3.029410e-03 -7.367882e-02
+9.500000e-02 4.697473e+01 -3.033682e-03 -7.791176e-02
+1.000000e-01 4.682618e+01 -3.033100e-03 -8.211860e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.008491,0.024206) (0.018258,0.017448) (0.019681,0.039940) (0.033491,0.024206) (0.043258,0.017448) (0.044681,0.039940)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0425fe4d5645bf340ab4b84e17ac0862cda7782a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.648047e+01 -2.105191e-03 -2.120973e-03
+1.000000e-02 7.293519e+01 -4.194616e-03 -4.226118e-03
+1.500000e-02 1.093642e+02 -6.268460e-03 -6.315620e-03
+2.000000e-02 1.457674e+02 -8.326909e-03 -8.389667e-03
+2.500000e-02 1.821414e+02 -1.037035e-02 -1.044863e-02
+3.000000e-02 2.184098e+02 -1.240347e-02 -1.249699e-02
+3.500000e-02 2.539391e+02 -1.446319e-02 -1.457113e-02
+4.000000e-02 2.880394e+02 -1.658769e-02 -1.671202e-02
+4.500000e-02 3.215136e+02 -1.873146e-02 -1.887394e-02
+5.000000e-02 3.547886e+02 -2.087108e-02 -2.103216e-02
+5.500000e-02 3.879349e+02 -2.300287e-02 -2.318273e-02
+6.000000e-02 4.209707e+02 -2.512598e-02 -2.532477e-02
+6.500000e-02 4.539077e+02 -2.723992e-02 -2.745778e-02
+7.000000e-02 4.867565e+02 -2.934427e-02 -2.958134e-02
+7.500000e-02 5.195267e+02 -3.143864e-02 -3.169505e-02
+8.000000e-02 5.522270e+02 -3.352270e-02 -3.379857e-02
+8.500000e-02 5.848657e+02 -3.559615e-02 -3.589161e-02
+9.000000e-02 6.174502e+02 -3.765871e-02 -3.797387e-02
+9.500000e-02 6.499875e+02 -3.971014e-02 -4.004512e-02
+1.000000e-01 6.824836e+02 -4.175024e-02 -4.210515e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.006982,0.031023) (0.015419,0.037374) (0.000431,0.014129) (0.031982,0.031023) (0.040419,0.037374) (0.025431,0.014129) (0.050431,0.014129)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6b3293975a56651439b0d811323cc4d2de75ac0c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.845568e+00
+1.000000e-02 7.692314e+00
+1.500000e-02 1.150318e+01
+2.000000e-02 1.495878e+01
+2.500000e-02 1.780337e+01
+3.000000e-02 1.969611e+01
+3.500000e-02 2.074983e+01
+4.000000e-02 2.147157e+01
+4.500000e-02 2.202759e+01
+5.000000e-02 2.246604e+01
+5.500000e-02 2.281330e+01
+6.000000e-02 2.308092e+01
+6.500000e-02 2.328654e+01
+7.000000e-02 2.343869e+01
+7.500000e-02 2.354574e+01
+8.000000e-02 2.361459e+01
+8.500000e-02 2.365094e+01
+9.000000e-02 2.366054e+01
+9.500000e-02 2.364502e+01
+1.000000e-01 2.360875e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.006982,0.031023) (0.015419,0.037374) (0.000431,0.014129) (0.031982,0.031023) (0.040419,0.037374) (0.025431,0.014129) (0.050431,0.014129)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b773dfa2fbbd082ba8a13eefac84a9d98247290f
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.582578e+00 -3.799624e-04 -3.709336e-03
+1.000000e-02 1.313187e+01 -7.554647e-04 -7.391453e-03
+1.500000e-02 1.964816e+01 -1.126553e-03 -1.104666e-02
+2.000000e-02 2.608824e+01 -1.491296e-03 -1.468206e-02
+2.500000e-02 3.198812e+01 -1.829775e-03 -1.836891e-02
+3.000000e-02 3.657897e+01 -2.109750e-03 -2.222755e-02
+3.500000e-02 3.967942e+01 -2.320649e-03 -2.630403e-02
+4.000000e-02 4.173224e+01 -2.480172e-03 -3.052779e-02
+4.500000e-02 4.325495e+01 -2.609638e-03 -3.481069e-02
+5.000000e-02 4.445697e+01 -2.717812e-03 -3.911723e-02
+5.500000e-02 4.541194e+01 -2.808117e-03 -4.343463e-02
+6.000000e-02 4.615879e+01 -2.882688e-03 -4.775578e-02
+6.500000e-02 4.672620e+01 -2.943296e-03 -5.207524e-02
+7.000000e-02 4.713833e+01 -2.991540e-03 -5.638832e-02
+7.500000e-02 4.741532e+01 -3.028856e-03 -6.069102e-02
+8.000000e-02 4.757813e+01 -3.056647e-03 -6.497943e-02
+8.500000e-02 4.764132e+01 -3.075852e-03 -6.925118e-02
+9.000000e-02 4.762138e+01 -3.087976e-03 -7.350228e-02
+9.500000e-02 4.753078e+01 -3.093827e-03 -7.773084e-02
+1.000000e-01 4.738115e+01 -3.094298e-03 -8.193476e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.006982,0.031023) (0.015419,0.037374) (0.000431,0.014129) (0.031982,0.031023) (0.040419,0.037374) (0.025431,0.014129) (0.050431,0.014129)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f3fdf5e0c0e31117c4867e28845cd94f5ce01f12
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.647966e+01 -2.117507e-03 -2.108941e-03
+1.000000e-02 7.293360e+01 -4.219203e-03 -4.202097e-03
+1.500000e-02 1.093619e+02 -6.305272e-03 -6.279654e-03
+2.000000e-02 1.457644e+02 -8.375901e-03 -8.341798e-03
+2.500000e-02 1.821377e+02 -1.043146e-02 -1.038891e-02
+3.000000e-02 2.184057e+02 -1.247644e-02 -1.242563e-02
+3.500000e-02 2.539350e+02 -1.454715e-02 -1.448881e-02
+4.000000e-02 2.880349e+02 -1.668410e-02 -1.661730e-02
+4.500000e-02 3.215088e+02 -1.884173e-02 -1.876541e-02
+5.000000e-02 3.547837e+02 -2.099553e-02 -2.090948e-02
+5.500000e-02 3.879298e+02 -2.314161e-02 -2.304578e-02
+6.000000e-02 4.209654e+02 -2.527910e-02 -2.517345e-02
+6.500000e-02 4.539023e+02 -2.740749e-02 -2.729202e-02
+7.000000e-02 4.867509e+02 -2.952634e-02 -2.940104e-02
+7.500000e-02 5.195210e+02 -3.163529e-02 -3.150015e-02
+8.000000e-02 5.522212e+02 -3.373398e-02 -3.358901e-02
+8.500000e-02 5.848598e+02 -3.582212e-02 -3.566732e-02
+9.000000e-02 6.174442e+02 -3.789942e-02 -3.773480e-02
+9.500000e-02 6.499813e+02 -3.996564e-02 -3.979121e-02
+1.000000e-01 6.824773e+02 -4.202058e-02 -4.183636e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.015430,0.026650) (0.007692,0.038870) (0.019271,0.010073) (0.040430,0.026650) (0.032692,0.038870) (0.044271,0.010073)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ac6179e5aa3dca4f96bdd808eecd221f6b50400b
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.798436e+00
+1.000000e-02 7.598086e+00
+1.500000e-02 1.138859e+01
+2.000000e-02 1.493777e+01
+2.500000e-02 1.785145e+01
+3.000000e-02 1.968529e+01
+3.500000e-02 2.073961e+01
+4.000000e-02 2.148404e+01
+4.500000e-02 2.205451e+01
+5.000000e-02 2.250052e+01
+5.500000e-02 2.285049e+01
+6.000000e-02 2.312198e+01
+6.500000e-02 2.332708e+01
+7.000000e-02 2.347587e+01
+7.500000e-02 2.357596e+01
+8.000000e-02 2.363347e+01
+8.500000e-02 2.365342e+01
+9.000000e-02 2.364003e+01
+9.500000e-02 2.359379e+01
+1.000000e-01 2.351328e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.015430,0.026650) (0.007692,0.038870) (0.019271,0.010073) (0.040430,0.026650) (0.032692,0.038870) (0.044271,0.010073)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7baeb39d6c90999d166d723f302fdd618f529439
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.583632e+00 -3.822756e-04 -3.697460e-03
+1.000000e-02 1.313181e+01 -7.599940e-04 -7.368200e-03
+1.500000e-02 1.964520e+01 -1.133215e-03 -1.101248e-02
+2.000000e-02 2.609742e+01 -1.500730e-03 -1.463481e-02
+2.500000e-02 3.205584e+01 -1.843773e-03 -1.830434e-02
+3.000000e-02 3.657662e+01 -2.120966e-03 -2.217451e-02
+3.500000e-02 3.962953e+01 -2.329606e-03 -2.625871e-02
+4.000000e-02 4.170892e+01 -2.490201e-03 -3.047684e-02
+4.500000e-02 4.324553e+01 -2.620426e-03 -3.475616e-02
+5.000000e-02 4.444432e+01 -2.728673e-03 -3.906216e-02
+5.500000e-02 4.539003e+01 -2.819084e-03 -4.337933e-02
+6.000000e-02 4.612485e+01 -2.893173e-03 -4.770202e-02
+6.500000e-02 4.667847e+01 -2.953077e-03 -5.202368e-02
+7.000000e-02 4.707585e+01 -3.000458e-03 -5.633941e-02
+7.500000e-02 4.733889e+01 -3.036839e-03 -6.064489e-02
+8.000000e-02 4.748719e+01 -3.063622e-03 -6.493627e-02
+8.500000e-02 4.753720e+01 -3.082057e-03 -6.921025e-02
+9.000000e-02 4.750654e+01 -3.093379e-03 -7.346357e-02
+9.500000e-02 4.740807e+01 -3.098608e-03 -7.769374e-02
+1.000000e-01 4.725238e+01 -3.098400e-03 -8.189929e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.015430,0.026650) (0.007692,0.038870) (0.019271,0.010073) (0.040430,0.026650) (0.032692,0.038870) (0.044271,0.010073)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe8428a7c03fd0613de3441d7020a71ee5feac2f
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.647832e+01 -2.115769e-03 -2.110740e-03
+1.000000e-02 7.293094e+01 -4.215732e-03 -4.205689e-03
+1.500000e-02 1.093579e+02 -6.300072e-03 -6.285032e-03
+2.000000e-02 1.457591e+02 -8.368978e-03 -8.348957e-03
+2.500000e-02 1.821311e+02 -1.042283e-02 -1.039784e-02
+3.000000e-02 2.183978e+02 -1.246612e-02 -1.243631e-02
+3.500000e-02 2.539258e+02 -1.453525e-02 -1.450115e-02
+4.000000e-02 2.880243e+02 -1.667041e-02 -1.663150e-02
+4.500000e-02 3.214968e+02 -1.882602e-02 -1.878171e-02
+5.000000e-02 3.547704e+02 -2.097774e-02 -2.092794e-02
+5.500000e-02 3.879152e+02 -2.312170e-02 -2.306643e-02
+6.000000e-02 4.209494e+02 -2.525704e-02 -2.519633e-02
+6.500000e-02 4.538850e+02 -2.738326e-02 -2.731714e-02
+7.000000e-02 4.867324e+02 -2.949993e-02 -2.942843e-02
+7.500000e-02 5.195011e+02 -3.160666e-02 -3.152983e-02
+8.000000e-02 5.522001e+02 -3.370312e-02 -3.362099e-02
+8.500000e-02 5.848374e+02 -3.578900e-02 -3.570162e-02
+9.000000e-02 6.174205e+02 -3.786403e-02 -3.777145e-02
+9.500000e-02 6.499564e+02 -3.992796e-02 -3.983023e-02
+1.000000e-01 6.824512e+02 -4.198058e-02 -4.187775e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017011,0.043902) (0.008299,0.019717) (0.001609,0.009177) (0.042011,0.043902) (0.033299,0.019717) (0.026609,0.009177) (0.051609,0.009177)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..25a39ab2102cb26e14ab39098b9684da2159ec00
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.804933e+00
+1.000000e-02 7.611075e+00
+1.500000e-02 1.140667e+01
+2.000000e-02 1.495150e+01
+2.500000e-02 1.786076e+01
+3.000000e-02 1.972224e+01
+3.500000e-02 2.077224e+01
+4.000000e-02 2.150462e+01
+4.500000e-02 2.206902e+01
+5.000000e-02 2.251476e+01
+5.500000e-02 2.286421e+01
+6.000000e-02 2.313630e+01
+6.500000e-02 2.334331e+01
+7.000000e-02 2.349483e+01
+7.500000e-02 2.359864e+01
+8.000000e-02 2.366065e+01
+8.500000e-02 2.368743e+01
+9.000000e-02 2.368245e+01
+9.500000e-02 2.364788e+01
+1.000000e-01 2.358248e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017011,0.043902) (0.008299,0.019717) (0.001609,0.009177) (0.042011,0.043902) (0.033299,0.019717) (0.026609,0.009177) (0.051609,0.009177)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..af55a6f3adc8aeb19641784eb1d8d50af9d3d593
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.543912e+00 -3.796490e-04 -3.706838e-03
+1.000000e-02 1.305193e+01 -7.546876e-04 -7.387032e-03
+1.500000e-02 1.952478e+01 -1.125180e-03 -1.104082e-02
+2.000000e-02 2.594052e+01 -1.490171e-03 -1.467196e-02
+2.500000e-02 3.189185e+01 -1.832279e-03 -1.834397e-02
+3.000000e-02 3.643097e+01 -2.110876e-03 -2.220746e-02
+3.500000e-02 3.946541e+01 -2.319434e-03 -2.629071e-02
+4.000000e-02 4.152261e+01 -2.479339e-03 -3.051016e-02
+4.500000e-02 4.304265e+01 -2.608741e-03 -3.479132e-02
+5.000000e-02 4.423004e+01 -2.716523e-03 -3.909803e-02
+5.500000e-02 4.516605e+01 -2.805816e-03 -4.341772e-02
+6.000000e-02 4.589140e+01 -2.879067e-03 -4.774215e-02
+6.500000e-02 4.643532e+01 -2.938083e-03 -5.206573e-02
+7.000000e-02 4.682247e+01 -2.984503e-03 -5.638364e-02
+7.500000e-02 4.707482e+01 -3.019851e-03 -6.069158e-02
+8.000000e-02 4.721216e+01 -3.045542e-03 -6.498567e-02
+8.500000e-02 4.725228e+01 -3.062879e-03 -6.926244e-02
+9.000000e-02 4.721114e+01 -3.073054e-03 -7.351883e-02
+9.500000e-02 4.710125e+01 -3.077077e-03 -7.775236e-02
+1.000000e-01 4.693548e+01 -3.075696e-03 -8.196131e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.017011,0.043902) (0.008299,0.019717) (0.001609,0.009177) (0.042011,0.043902) (0.033299,0.019717) (0.026609,0.009177) (0.051609,0.009177)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..45860c5ffc705324631d2a8d23c47f60ac803c39
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 3.648125e+01 -2.089822e-03 -2.136040e-03
+1.000000e-02 7.293671e+01 -4.163896e-03 -4.256238e-03
+1.500000e-02 1.093664e+02 -6.222404e-03 -6.360779e-03
+2.000000e-02 1.457703e+02 -8.265536e-03 -8.449849e-03
+2.500000e-02 1.821448e+02 -1.029370e-02 -1.052380e-02
+3.000000e-02 2.184137e+02 -1.231201e-02 -1.258672e-02
+3.500000e-02 2.539430e+02 -1.435867e-02 -1.467383e-02
+4.000000e-02 2.880437e+02 -1.646771e-02 -1.683007e-02
+4.500000e-02 3.215182e+02 -1.859363e-02 -1.900974e-02
+5.000000e-02 3.547935e+02 -2.071487e-02 -2.118624e-02
+5.500000e-02 3.879400e+02 -2.282808e-02 -2.335531e-02
+6.000000e-02 4.209758e+02 -2.493246e-02 -2.551601e-02
+6.500000e-02 4.539130e+02 -2.702753e-02 -2.766784e-02
+7.000000e-02 4.867619e+02 -2.911289e-02 -2.981034e-02
+7.500000e-02 5.195322e+02 -3.118815e-02 -3.194312e-02
+8.000000e-02 5.522326e+02 -3.325300e-02 -3.406583e-02
+8.500000e-02 5.848714e+02 -3.530712e-02 -3.617815e-02
+9.000000e-02 6.174560e+02 -3.735027e-02 -3.827980e-02
+9.500000e-02 6.499932e+02 -3.938221e-02 -4.037053e-02
+1.000000e-01 6.824895e+02 -4.140275e-02 -4.245013e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020229,0.010806) (0.011700,0.041858) (0.008632,0.008158) (0.045229,0.010806) (0.036700,0.041858) (0.033632,0.008158)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aa09713926899d1b8e99f725e48a29c44a6d4183
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 3.886391e+00
+1.000000e-02 7.773637e+00
+1.500000e-02 1.155638e+01
+2.000000e-02 1.490445e+01
+2.500000e-02 1.770923e+01
+3.000000e-02 1.963635e+01
+3.500000e-02 2.070798e+01
+4.000000e-02 2.143917e+01
+4.500000e-02 2.200510e+01
+5.000000e-02 2.245386e+01
+5.500000e-02 2.280920e+01
+6.000000e-02 2.308674e+01
+6.500000e-02 2.329792e+01
+7.000000e-02 2.345153e+01
+7.500000e-02 2.355658e+01
+8.000000e-02 2.361870e+01
+8.500000e-02 2.364444e+01
+9.000000e-02 2.364181e+01
+9.500000e-02 2.361388e+01
+1.000000e-01 2.356376e+01
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020229,0.010806) (0.011700,0.041858) (0.008632,0.008158) (0.045229,0.010806) (0.036700,0.041858) (0.033632,0.008158)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7364046d045a537a050782f03b29b6c613913849
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.0924_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 6.866061e+00 -3.935731e-04 -3.669518e-03
+1.000000e-02 1.369472e+01 -7.826428e-04 -7.312261e-03
+1.500000e-02 2.046347e+01 -1.166265e-03 -1.093158e-02
+2.000000e-02 2.691164e+01 -1.534303e-03 -1.455964e-02
+2.500000e-02 3.260205e+01 -1.866922e-03 -1.826667e-02
+3.000000e-02 3.709675e+01 -2.142570e-03 -2.213848e-02
+3.500000e-02 4.024154e+01 -2.354171e-03 -2.620823e-02
+4.000000e-02 4.233999e+01 -2.514892e-03 -3.042420e-02
+4.500000e-02 4.386451e+01 -2.644097e-03 -3.470597e-02
+5.000000e-02 4.504646e+01 -2.751306e-03 -3.901475e-02
+5.500000e-02 4.597414e+01 -2.840534e-03 -4.333542e-02
+6.000000e-02 4.669253e+01 -2.914208e-03 -4.765983e-02
+6.500000e-02 4.723878e+01 -2.974408e-03 -5.198140e-02
+7.000000e-02 4.763804e+01 -3.022799e-03 -5.629525e-02
+7.500000e-02 4.791315e+01 -3.060916e-03 -6.059703e-02
+8.000000e-02 4.808239e+01 -3.089939e-03 -6.488355e-02
+8.500000e-02 4.816517e+01 -3.111462e-03 -6.915050e-02
+9.000000e-02 4.817532e+01 -3.126420e-03 -7.339557e-02
+9.500000e-02 4.812567e+01 -3.135792e-03 -7.761637e-02
+1.000000e-01 4.802743e+01 -3.140448e-03 -8.181086e-02
+volume fraction= 0.092363
+fiber_centers_YZ= (0.020229,0.010806) (0.011700,0.041858) (0.008632,0.008158) (0.045229,0.010806) (0.036700,0.041858) (0.033632,0.008158)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..dd91605cdf5d051199be10cb76166e3c92b4defc
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.897872e+01 -1.966650e-03 -1.931470e-03
+1.000000e-02 1.578568e+02 -3.918919e-03 -3.848630e-03
+1.500000e-02 2.366343e+02 -5.856972e-03 -5.751644e-03
+2.000000e-02 3.153115e+02 -7.780977e-03 -7.640683e-03
+2.500000e-02 3.938852e+02 -9.691265e-03 -9.516128e-03
+3.000000e-02 4.722881e+02 -1.159183e-02 -1.138283e-02
+3.500000e-02 5.499803e+02 -1.351635e-02 -1.327502e-02
+4.000000e-02 6.264203e+02 -1.550271e-02 -1.522236e-02
+4.500000e-02 7.022937e+02 -1.750858e-02 -1.718487e-02
+5.000000e-02 7.779542e+02 -1.951137e-02 -1.914311e-02
+5.500000e-02 8.534615e+02 -2.150742e-02 -2.109398e-02
+6.000000e-02 9.288324e+02 -2.349591e-02 -2.303675e-02
+6.500000e-02 1.004078e+03 -2.547634e-02 -2.497094e-02
+7.000000e-02 1.079209e+03 -2.744828e-02 -2.689618e-02
+7.500000e-02 1.154235e+03 -2.941136e-02 -2.881212e-02
+8.000000e-02 1.229162e+03 -3.136525e-02 -3.071845e-02
+8.500000e-02 1.304000e+03 -3.330963e-02 -3.261488e-02
+9.000000e-02 1.378755e+03 -3.524423e-02 -3.450117e-02
+9.500000e-02 1.453432e+03 -3.716882e-02 -3.637711e-02
+1.000000e-01 1.528038e+03 -3.908319e-02 -3.824251e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.003155,0.012131) (0.012682,0.005047) (0.007000,0.036384) (0.010358,0.044232) (0.005609,0.023951) (0.020294,0.037545) (0.017471,0.019122) (0.028155,0.012131) (0.037682,0.005047) (0.032000,0.036384) (0.035358,0.044232) (0.030609,0.023951) (0.045294,0.037545) (0.042471,0.019122) (0.053155,0.012131)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0446fcd2d3f95be232e684932e884ef62b120418
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 4.901538e+00
+1.000000e-02 9.802557e+00
+1.500000e-02 1.440132e+01
+2.000000e-02 1.787095e+01
+2.500000e-02 2.012793e+01
+3.000000e-02 2.142895e+01
+3.500000e-02 2.224065e+01
+4.000000e-02 2.279565e+01
+4.500000e-02 2.318661e+01
+5.000000e-02 2.345982e+01
+5.500000e-02 2.364112e+01
+6.000000e-02 2.374450e+01
+6.500000e-02 2.377691e+01
+7.000000e-02 2.373811e+01
+7.500000e-02 2.362164e+01
+8.000000e-02 2.340597e+01
+8.500000e-02 2.312991e+01
+9.000000e-02 2.290255e+01
+9.500000e-02 2.275447e+01
+1.000000e-01 2.265312e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.003155,0.012131) (0.012682,0.005047) (0.007000,0.036384) (0.010358,0.044232) (0.005609,0.023951) (0.020294,0.037545) (0.017471,0.019122) (0.028155,0.012131) (0.037682,0.005047) (0.032000,0.036384) (0.035358,0.044232) (0.030609,0.023951) (0.045294,0.037545) (0.042471,0.019122) (0.053155,0.012131)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aa24426df9e66b5bf328da886a27cbe2116eec18
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.869434e+00 -2.211230e-04 -3.676226e-03
+1.000000e-02 1.768201e+01 -4.398062e-04 -7.324926e-03
+1.500000e-02 2.630056e+01 -6.527138e-04 -1.096711e-02
+2.000000e-02 3.392127e+01 -8.420959e-04 -1.471037e-02
+2.500000e-02 3.957224e+01 -9.866889e-04 -1.869048e-02
+3.000000e-02 4.322915e+01 -1.087238e-03 -2.290313e-02
+3.500000e-02 4.561131e+01 -1.158764e-03 -2.724871e-02
+4.000000e-02 4.728790e+01 -1.212682e-03 -3.165205e-02
+4.500000e-02 4.849601e+01 -1.253848e-03 -3.608218e-02
+5.000000e-02 4.935397e+01 -1.284932e-03 -4.052307e-02
+5.500000e-02 4.993711e+01 -1.307811e-03 -4.496409e-02
+6.000000e-02 5.030199e+01 -1.323988e-03 -4.939708e-02
+6.500000e-02 5.049431e+01 -1.334733e-03 -5.381540e-02
+7.000000e-02 5.055223e+01 -1.341142e-03 -5.821356e-02
+7.500000e-02 5.050805e+01 -1.344163e-03 -6.258692e-02
+8.000000e-02 5.038910e+01 -1.344615e-03 -6.693165e-02
+8.500000e-02 5.021551e+01 -1.342994e-03 -7.124565e-02
+9.000000e-02 5.001097e+01 -1.340232e-03 -7.552459e-02
+9.500000e-02 4.978888e+01 -1.336647e-03 -7.976738e-02
+1.000000e-01 4.956066e+01 -1.332601e-03 -8.397270e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.003155,0.012131) (0.012682,0.005047) (0.007000,0.036384) (0.010358,0.044232) (0.005609,0.023951) (0.020294,0.037545) (0.017471,0.019122) (0.028155,0.012131) (0.037682,0.005047) (0.032000,0.036384) (0.035358,0.044232) (0.030609,0.023951) (0.045294,0.037545) (0.042471,0.019122) (0.053155,0.012131)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9857a031b1acc0bb24cf40f4ad66eba09a657166
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.898288e+01 -1.882757e-03 -2.011948e-03
+1.000000e-02 1.578643e+02 -3.751334e-03 -4.009419e-03
+1.500000e-02 2.366446e+02 -5.605895e-03 -5.992577e-03
+2.000000e-02 3.153237e+02 -7.446615e-03 -7.961587e-03
+2.500000e-02 3.938985e+02 -9.274043e-03 -9.916649e-03
+3.000000e-02 4.722999e+02 -1.109557e-02 -1.185978e-02
+3.500000e-02 5.499893e+02 -1.294680e-02 -1.382365e-02
+4.000000e-02 6.264289e+02 -1.484323e-02 -1.585899e-02
+4.500000e-02 7.023002e+02 -1.674921e-02 -1.791966e-02
+5.000000e-02 7.779576e+02 -1.864971e-02 -1.997863e-02
+5.500000e-02 8.534614e+02 -2.054233e-02 -2.203154e-02
+6.000000e-02 9.288283e+02 -2.242641e-02 -2.407743e-02
+6.500000e-02 1.004070e+03 -2.430154e-02 -2.611575e-02
+7.000000e-02 1.079196e+03 -2.616737e-02 -2.814604e-02
+7.500000e-02 1.154217e+03 -2.802357e-02 -3.016790e-02
+8.000000e-02 1.229139e+03 -2.986985e-02 -3.218094e-02
+8.500000e-02 1.303972e+03 -3.170594e-02 -3.418484e-02
+9.000000e-02 1.378721e+03 -3.353163e-02 -3.617930e-02
+9.500000e-02 1.453393e+03 -3.534671e-02 -3.816404e-02
+1.000000e-01 1.527994e+03 -3.715102e-02 -4.013884e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.007394,0.030534) (0.019526,0.004843) (0.015664,0.040234) (0.009445,0.017336) (0.002497,0.043647) (0.017263,0.022187) (0.000437,0.019808) (0.032394,0.030534) (0.044526,0.004843) (0.040664,0.040234) (0.034445,0.017336) (0.027497,0.043647) (0.042263,0.022187) (0.025437,0.019808) (0.052497,0.043647) (0.050437,0.019808)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..60daf81f4b45d2f9b0ee0dbf5a3f0e683573457d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.246069e+00
+1.000000e-02 1.030290e+01
+1.500000e-02 1.461085e+01
+2.000000e-02 1.791371e+01
+2.500000e-02 2.018639e+01
+3.000000e-02 2.150128e+01
+3.500000e-02 2.226530e+01
+4.000000e-02 2.276749e+01
+4.500000e-02 2.312036e+01
+5.000000e-02 2.337574e+01
+5.500000e-02 2.355905e+01
+6.000000e-02 2.368695e+01
+6.500000e-02 2.377150e+01
+7.000000e-02 2.381591e+01
+7.500000e-02 2.382517e+01
+8.000000e-02 2.380314e+01
+8.500000e-02 2.374164e+01
+9.000000e-02 2.364966e+01
+9.500000e-02 2.354768e+01
+1.000000e-01 2.347304e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.007394,0.030534) (0.019526,0.004843) (0.015664,0.040234) (0.009445,0.017336) (0.002497,0.043647) (0.017263,0.022187) (0.000437,0.019808) (0.032394,0.030534) (0.044526,0.004843) (0.040664,0.040234) (0.034445,0.017336) (0.027497,0.043647) (0.042263,0.022187) (0.025437,0.019808) (0.052497,0.043647) (0.050437,0.019808)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8c12a718fd5d012f8247ecee3802cac05251651e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.086351e+00 -2.168390e-04 -3.743549e-03
+1.000000e-02 1.808134e+01 -4.306924e-04 -7.460505e-03
+1.500000e-02 2.645583e+01 -6.326577e-04 -1.119168e-02
+2.000000e-02 3.365311e+01 -8.106446e-04 -1.500832e-02
+2.500000e-02 3.914879e+01 -9.521394e-04 -1.899881e-02
+3.000000e-02 4.275631e+01 -1.052007e-03 -2.320425e-02
+3.500000e-02 4.512564e+01 -1.123523e-03 -2.754030e-02
+4.000000e-02 4.677941e+01 -1.177218e-03 -3.193772e-02
+4.500000e-02 4.797685e+01 -1.218487e-03 -3.636195e-02
+5.000000e-02 4.884529e+01 -1.250231e-03 -4.079543e-02
+5.500000e-02 4.946332e+01 -1.274305e-03 -4.522750e-02
+6.000000e-02 4.988715e+01 -1.292192e-03 -4.965006e-02
+6.500000e-02 5.015995e+01 -1.305103e-03 -5.405676e-02
+7.000000e-02 5.031619e+01 -1.314051e-03 -5.844245e-02
+7.500000e-02 5.038396e+01 -1.319887e-03 -6.280297e-02
+8.000000e-02 5.038784e+01 -1.323434e-03 -6.713445e-02
+8.500000e-02 5.034396e+01 -1.325091e-03 -7.143521e-02
+9.000000e-02 5.026910e+01 -1.325461e-03 -7.570264e-02
+9.500000e-02 5.017602e+01 -1.324964e-03 -7.993509e-02
+1.000000e-01 5.007474e+01 -1.323938e-03 -8.413139e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.007394,0.030534) (0.019526,0.004843) (0.015664,0.040234) (0.009445,0.017336) (0.002497,0.043647) (0.017263,0.022187) (0.000437,0.019808) (0.032394,0.030534) (0.044526,0.004843) (0.040664,0.040234) (0.034445,0.017336) (0.027497,0.043647) (0.042263,0.022187) (0.025437,0.019808) (0.052497,0.043647) (0.050437,0.019808)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..be617800f39a5a29693fd318da1333a596215e4d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.898481e+01 -1.919525e-03 -1.978554e-03
+1.000000e-02 1.578689e+02 -3.824831e-03 -3.942636e-03
+1.500000e-02 2.366526e+02 -5.716083e-03 -5.892412e-03
+2.000000e-02 3.153357e+02 -7.593448e-03 -7.828050e-03
+2.500000e-02 3.939155e+02 -9.457313e-03 -9.749878e-03
+3.000000e-02 4.723245e+02 -1.131256e-02 -1.166184e-02
+3.500000e-02 5.500232e+02 -1.319327e-02 -1.359759e-02
+4.000000e-02 6.264689e+02 -1.512846e-02 -1.559594e-02
+4.500000e-02 7.023482e+02 -1.707831e-02 -1.761437e-02
+5.000000e-02 7.780147e+02 -1.902387e-02 -1.962973e-02
+5.500000e-02 8.535280e+02 -2.096212e-02 -2.163829e-02
+6.000000e-02 9.289049e+02 -2.289234e-02 -2.363920e-02
+6.500000e-02 1.004157e+03 -2.481408e-02 -2.563195e-02
+7.000000e-02 1.079294e+03 -2.672697e-02 -2.761611e-02
+7.500000e-02 1.154325e+03 -2.863066e-02 -2.959131e-02
+8.000000e-02 1.229259e+03 -3.052484e-02 -3.155719e-02
+8.500000e-02 1.304102e+03 -3.240924e-02 -3.351346e-02
+9.000000e-02 1.378863e+03 -3.428361e-02 -3.545982e-02
+9.500000e-02 1.453546e+03 -3.614776e-02 -3.739605e-02
+1.000000e-01 1.528158e+03 -3.800148e-02 -3.932192e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.009377,0.011130) (0.010258,0.027236) (0.019437,0.017031) (0.014659,0.038684) (0.002046,0.020549) (0.002484,0.036105) (0.001240,0.004784) (0.034377,0.011130) (0.035258,0.027236) (0.044437,0.017031) (0.039659,0.038684) (0.027046,0.020549) (0.027484,0.036105) (0.026240,0.004784) (0.052046,0.020549) (0.052484,0.036105) (0.051240,0.004784)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bc49ad2e077faa009e6e6ff010c2f9ec5094e909
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.092572e+00
+1.000000e-02 1.014413e+01
+1.500000e-02 1.469148e+01
+2.000000e-02 1.800770e+01
+2.500000e-02 2.022230e+01
+3.000000e-02 2.153189e+01
+3.500000e-02 2.229708e+01
+4.000000e-02 2.279926e+01
+4.500000e-02 2.315245e+01
+5.000000e-02 2.340757e+01
+5.500000e-02 2.358676e+01
+6.000000e-02 2.370668e+01
+6.500000e-02 2.377782e+01
+7.000000e-02 2.381042e+01
+7.500000e-02 2.380548e+01
+8.000000e-02 2.376205e+01
+8.500000e-02 2.367531e+01
+9.000000e-02 2.353586e+01
+9.500000e-02 2.335298e+01
+1.000000e-01 2.315621e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.009377,0.011130) (0.010258,0.027236) (0.019437,0.017031) (0.014659,0.038684) (0.002046,0.020549) (0.002484,0.036105) (0.001240,0.004784) (0.034377,0.011130) (0.035258,0.027236) (0.044437,0.017031) (0.039659,0.038684) (0.027046,0.020549) (0.027484,0.036105) (0.026240,0.004784) (0.052046,0.020549) (0.052484,0.036105) (0.051240,0.004784)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7a7584e5fb35a11f56d48e0da10878590a58cb55
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.466969e+00 -2.058866e-04 -3.787416e-03
+1.000000e-02 1.688977e+01 -4.094689e-04 -7.544900e-03
+1.500000e-02 2.520932e+01 -6.096105e-04 -1.127920e-02
+2.000000e-02 3.260094e+01 -7.897779e-04 -1.508623e-02
+2.500000e-02 3.806570e+01 -9.286656e-04 -1.909894e-02
+3.000000e-02 4.164797e+01 -1.026979e-03 -2.331766e-02
+3.500000e-02 4.403288e+01 -1.098162e-03 -2.765706e-02
+4.000000e-02 4.571643e+01 -1.151889e-03 -3.205434e-02
+4.500000e-02 4.692460e+01 -1.192807e-03 -3.647968e-02
+5.000000e-02 4.777737e+01 -1.223605e-03 -4.091656e-02
+5.500000e-02 4.835188e+01 -1.246159e-03 -4.535419e-02
+6.000000e-02 4.870578e+01 -1.261963e-03 -4.978442e-02
+6.500000e-02 4.888515e+01 -1.272259e-03 -5.420082e-02
+7.000000e-02 4.892771e+01 -1.278101e-03 -5.859813e-02
+7.500000e-02 4.886468e+01 -1.280387e-03 -6.297205e-02
+8.000000e-02 4.872213e+01 -1.279885e-03 -6.731902e-02
+8.500000e-02 4.852181e+01 -1.277250e-03 -7.163614e-02
+9.000000e-02 4.828183e+01 -1.273038e-03 -7.592104e-02
+9.500000e-02 4.801717e+01 -1.267717e-03 -8.017182e-02
+1.000000e-01 4.774012e+01 -1.261678e-03 -8.438701e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.009377,0.011130) (0.010258,0.027236) (0.019437,0.017031) (0.014659,0.038684) (0.002046,0.020549) (0.002484,0.036105) (0.001240,0.004784) (0.034377,0.011130) (0.035258,0.027236) (0.044437,0.017031) (0.039659,0.038684) (0.027046,0.020549) (0.027484,0.036105) (0.026240,0.004784) (0.052046,0.020549) (0.052484,0.036105) (0.051240,0.004784)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b8fedc9e4002ac2858c72b1b3a6cae8b8699acc9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.898847e+01 -1.946550e-03 -1.946603e-03
+1.000000e-02 1.578752e+02 -3.878768e-03 -3.878890e-03
+1.500000e-02 2.366604e+02 -5.796820e-03 -5.797024e-03
+2.000000e-02 3.153442e+02 -7.700874e-03 -7.701175e-03
+2.500000e-02 3.939233e+02 -9.591332e-03 -9.591708e-03
+3.000000e-02 4.723274e+02 -1.147321e-02 -1.147335e-02
+3.500000e-02 5.500175e+02 -1.338025e-02 -1.338139e-02
+4.000000e-02 6.264624e+02 -1.534471e-02 -1.534811e-02
+4.500000e-02 7.023370e+02 -1.732669e-02 -1.733209e-02
+5.000000e-02 7.779971e+02 -1.930506e-02 -1.931259e-02
+5.500000e-02 8.535031e+02 -2.127639e-02 -2.128626e-02
+6.000000e-02 9.288723e+02 -2.323988e-02 -2.325230e-02
+6.500000e-02 1.004116e+03 -2.519503e-02 -2.521024e-02
+7.000000e-02 1.079244e+03 -2.714144e-02 -2.715964e-02
+7.500000e-02 1.154266e+03 -2.907873e-02 -2.910014e-02
+8.000000e-02 1.229191e+03 -3.100658e-02 -3.103141e-02
+8.500000e-02 1.304025e+03 -3.292469e-02 -3.295314e-02
+9.000000e-02 1.378775e+03 -3.483280e-02 -3.486505e-02
+9.500000e-02 1.453449e+03 -3.673068e-02 -3.676693e-02
+1.000000e-01 1.528051e+03 -3.861812e-02 -3.865856e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.017582,0.029158) (0.011192,0.016262) (0.001649,0.039408) (0.010656,0.044458) (0.000765,0.025227) (0.008158,0.007406) (0.018370,0.037493) (0.042582,0.029158) (0.036192,0.016262) (0.026649,0.039408) (0.035656,0.044458) (0.025765,0.025227) (0.033158,0.007406) (0.043370,0.037493) (0.051649,0.039408) (0.050765,0.025227)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ce8bb396705764cf5c5d1cab3b9f800761a99900
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.006657e+00
+1.000000e-02 9.952647e+00
+1.500000e-02 1.434452e+01
+2.000000e-02 1.779143e+01
+2.500000e-02 2.012123e+01
+3.000000e-02 2.139116e+01
+3.500000e-02 2.215374e+01
+4.000000e-02 2.266945e+01
+4.500000e-02 2.303116e+01
+5.000000e-02 2.328150e+01
+5.500000e-02 2.345608e+01
+6.000000e-02 2.357680e+01
+6.500000e-02 2.365781e+01
+7.000000e-02 2.370792e+01
+7.500000e-02 2.373551e+01
+8.000000e-02 2.373987e+01
+8.500000e-02 2.372637e+01
+9.000000e-02 2.369836e+01
+9.500000e-02 2.365667e+01
+1.000000e-01 2.360097e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.017582,0.029158) (0.011192,0.016262) (0.001649,0.039408) (0.010656,0.044458) (0.000765,0.025227) (0.008158,0.007406) (0.018370,0.037493) (0.042582,0.029158) (0.036192,0.016262) (0.026649,0.039408) (0.035656,0.044458) (0.025765,0.025227) (0.033158,0.007406) (0.043370,0.037493) (0.051649,0.039408) (0.050765,0.025227)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c4e15f9f35688cdcdc557289aaee559c844b94c1
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 8.789074e+00 -2.167987e-04 -3.711496e-03
+1.000000e-02 1.752325e+01 -4.311132e-04 -7.395468e-03
+1.500000e-02 2.607236e+01 -6.406071e-04 -1.106411e-02
+2.000000e-02 3.372993e+01 -8.310412e-04 -1.480059e-02
+2.500000e-02 3.947528e+01 -9.801932e-04 -1.874696e-02
+3.000000e-02 4.319987e+01 -1.084812e-03 -2.293082e-02
+3.500000e-02 4.565994e+01 -1.160309e-03 -2.725088e-02
+4.000000e-02 4.741387e+01 -1.217788e-03 -3.163318e-02
+4.500000e-02 4.870508e+01 -1.262418e-03 -3.604439e-02
+5.000000e-02 4.964210e+01 -1.296610e-03 -4.046940e-02
+5.500000e-02 5.030477e+01 -1.322446e-03 -4.489617e-02
+6.000000e-02 5.074969e+01 -1.341458e-03 -4.931621e-02
+6.500000e-02 5.102064e+01 -1.354894e-03 -5.372285e-02
+7.000000e-02 5.115251e+01 -1.363793e-03 -5.811081e-02
+7.500000e-02 5.117363e+01 -1.369020e-03 -6.247584e-02
+8.000000e-02 5.110727e+01 -1.371300e-03 -6.681453e-02
+8.500000e-02 5.097267e+01 -1.371239e-03 -7.112418e-02
+9.000000e-02 5.078583e+01 -1.369344e-03 -7.540266e-02
+9.500000e-02 5.056014e+01 -1.366042e-03 -7.964829e-02
+1.000000e-01 5.030698e+01 -1.361691e-03 -8.385980e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.017582,0.029158) (0.011192,0.016262) (0.001649,0.039408) (0.010656,0.044458) (0.000765,0.025227) (0.008158,0.007406) (0.018370,0.037493) (0.042582,0.029158) (0.036192,0.016262) (0.026649,0.039408) (0.035656,0.044458) (0.025765,0.025227) (0.033158,0.007406) (0.043370,0.037493) (0.051649,0.039408) (0.050765,0.025227)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d63d3c20f116482d601a775f5e2a6e94063a7af6
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 7.898402e+01 -1.936344e-03 -1.959319e-03
+1.000000e-02 1.578668e+02 -3.858482e-03 -3.904184e-03
+1.500000e-02 2.366486e+02 -5.766579e-03 -5.834762e-03
+2.000000e-02 3.153295e+02 -7.660801e-03 -7.751221e-03
+2.500000e-02 3.939063e+02 -9.541502e-03 -9.653944e-03
+3.000000e-02 4.723108e+02 -1.141307e-02 -1.154769e-02
+3.500000e-02 5.500040e+02 -1.330981e-02 -1.346617e-02
+4.000000e-02 6.264459e+02 -1.526558e-02 -1.544257e-02
+4.500000e-02 7.023201e+02 -1.723872e-02 -1.743645e-02
+5.000000e-02 7.779808e+02 -1.920847e-02 -1.942648e-02
+5.500000e-02 8.534879e+02 -2.117153e-02 -2.140922e-02
+6.000000e-02 9.288584e+02 -2.312710e-02 -2.338384e-02
+6.500000e-02 1.004104e+03 -2.507473e-02 -2.534987e-02
+7.000000e-02 1.079234e+03 -2.701400e-02 -2.730690e-02
+7.500000e-02 1.154258e+03 -2.894455e-02 -2.925455e-02
+8.000000e-02 1.229184e+03 -3.086606e-02 -3.119250e-02
+8.500000e-02 1.304020e+03 -3.277823e-02 -3.312045e-02
+9.000000e-02 1.378773e+03 -3.468080e-02 -3.503814e-02
+9.500000e-02 1.453449e+03 -3.657353e-02 -3.694533e-02
+1.000000e-01 1.528053e+03 -3.845624e-02 -3.884184e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.018290,0.031098) (0.005564,0.037487) (0.005984,0.012899) (0.018172,0.039104) (0.017482,0.011714) (0.001027,0.005816) (0.011084,0.027930) (0.043290,0.031098) (0.030564,0.037487) (0.030984,0.012899) (0.043172,0.039104) (0.042482,0.011714) (0.026027,0.005816) (0.036084,0.027930) (0.051027,0.005816)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..655fb121859223140ce8234e2ffcba3179327575
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 5.096197e+00
+1.000000e-02 1.013949e+01
+1.500000e-02 1.458011e+01
+2.000000e-02 1.779803e+01
+2.500000e-02 2.003065e+01
+3.000000e-02 2.141139e+01
+3.500000e-02 2.221243e+01
+4.000000e-02 2.274436e+01
+4.500000e-02 2.312677e+01
+5.000000e-02 2.340922e+01
+5.500000e-02 2.361278e+01
+6.000000e-02 2.375546e+01
+6.500000e-02 2.384558e+01
+7.000000e-02 2.387909e+01
+7.500000e-02 2.383962e+01
+8.000000e-02 2.359345e+01
+8.500000e-02 2.292537e+01
+9.000000e-02 2.254324e+01
+9.500000e-02 2.260492e+01
+1.000000e-01 2.289319e+01
+volume fraction= 0.215513
+fiber_centers_YZ= (0.018290,0.031098) (0.005564,0.037487) (0.005984,0.012899) (0.018172,0.039104) (0.017482,0.011714) (0.001027,0.005816) (0.011084,0.027930) (0.043290,0.031098) (0.030564,0.037487) (0.030984,0.012899) (0.043172,0.039104) (0.042482,0.011714) (0.026027,0.005816) (0.036084,0.027930) (0.051027,0.005816)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..78270fc5a316a356591b6eeab83c7268ef7d9a6c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.2155_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 9.190039e+00 -2.256098e-04 -3.665530e-03
+1.000000e-02 1.831030e+01 -4.485282e-04 -7.305211e-03
+1.500000e-02 2.715548e+01 -6.647159e-04 -1.094174e-02
+2.000000e-02 3.454814e+01 -8.513129e-04 -1.470436e-02
+2.500000e-02 3.994205e+01 -9.952197e-04 -1.867816e-02
+3.000000e-02 4.365472e+01 -1.101013e-03 -2.284320e-02
+3.500000e-02 4.617860e+01 -1.178420e-03 -2.714056e-02
+4.000000e-02 4.790168e+01 -1.235504e-03 -3.151726e-02
+4.500000e-02 4.908052e+01 -1.277857e-03 -3.593568e-02
+5.000000e-02 4.988188e+01 -1.309468e-03 -4.037064e-02
+5.500000e-02 5.040219e+01 -1.332612e-03 -4.480849e-02
+6.000000e-02 5.071028e+01 -1.349071e-03 -4.923931e-02
+6.500000e-02 5.085944e+01 -1.360288e-03 -5.365548e-02
+7.000000e-02 5.089267e+01 -1.367479e-03 -5.805083e-02
+7.500000e-02 5.084470e+01 -1.371661e-03 -6.242040e-02
+8.000000e-02 5.074312e+01 -1.373664e-03 -6.676031e-02
+8.500000e-02 5.061367e+01 -1.374385e-03 -7.106642e-02
+9.000000e-02 5.046247e+01 -1.373845e-03 -7.533908e-02
+9.500000e-02 5.030480e+01 -1.372643e-03 -7.957578e-02
+1.000000e-01 5.014815e+01 -1.371048e-03 -8.377565e-02
+volume fraction= 0.215513
+fiber_centers_YZ= (0.018290,0.031098) (0.005564,0.037487) (0.005984,0.012899) (0.018172,0.039104) (0.017482,0.011714) (0.001027,0.005816) (0.011084,0.027930) (0.043290,0.031098) (0.030564,0.037487) (0.030984,0.012899) (0.043172,0.039104) (0.042482,0.011714) (0.026027,0.005816) (0.036084,0.027930) (0.051027,0.005816)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2f8ba443c1a1bce9ee9ced3c0ec21b2f37d4a486
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.108424e+02 -1.817917e-03 -1.836460e-03
+1.000000e-02 2.214923e+02 -3.622616e-03 -3.659609e-03
+1.500000e-02 3.319504e+02 -5.414249e-03 -5.469599e-03
+2.000000e-02 4.422171e+02 -7.192972e-03 -7.266584e-03
+2.500000e-02 5.522902e+02 -8.959206e-03 -9.050861e-03
+3.000000e-02 6.621079e+02 -1.071808e-02 -1.082637e-02
+3.500000e-02 7.712043e+02 -1.249992e-02 -1.262577e-02
+4.000000e-02 8.791414e+02 -1.433208e-02 -1.447908e-02
+4.500000e-02 9.865114e+02 -1.617898e-02 -1.634799e-02
+5.000000e-02 1.093619e+03 -1.802227e-02 -1.821353e-02
+5.500000e-02 1.200516e+03 -1.985896e-02 -2.007261e-02
+6.000000e-02 1.307219e+03 -2.168831e-02 -2.192450e-02
+6.500000e-02 1.413739e+03 -2.350989e-02 -2.376873e-02
+7.000000e-02 1.520087e+03 -2.532331e-02 -2.560492e-02
+7.500000e-02 1.626270e+03 -2.712824e-02 -2.743271e-02
+8.000000e-02 1.732297e+03 -2.892438e-02 -2.925179e-02
+8.500000e-02 1.838176e+03 -3.071145e-02 -3.106186e-02
+9.000000e-02 1.943912e+03 -3.248922e-02 -3.286269e-02
+9.500000e-02 2.049512e+03 -3.425746e-02 -3.465405e-02
+1.000000e-01 2.154980e+03 -3.601600e-02 -3.643574e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.005521,0.014793) (0.008621,0.031003) (0.017029,0.018619) (0.000382,0.004958) (0.015515,0.005576) (0.016849,0.031392) (0.015037,0.044583) (0.001487,0.025261) (0.000044,0.036409) (0.001161,0.045121) (0.030521,0.014793) (0.033621,0.031003) (0.042029,0.018619) (0.025382,0.004958) (0.040515,0.005576) (0.041849,0.031392) (0.040037,0.044583) (0.026487,0.025261) (0.025044,0.036409) (0.026161,0.045121) (0.050382,0.004958) (0.051487,0.025261) (0.050044,0.036409) (0.051161,0.045121)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c4cd60d796430c2c03c59abcacdbf7027410c5c7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.142858e+00
+1.000000e-02 1.204955e+01
+1.500000e-02 1.683762e+01
+2.000000e-02 1.987152e+01
+2.500000e-02 2.158000e+01
+3.000000e-02 2.254755e+01
+3.500000e-02 2.313654e+01
+4.000000e-02 2.349945e+01
+4.500000e-02 2.371886e+01
+5.000000e-02 2.383455e+01
+5.500000e-02 2.387739e+01
+6.000000e-02 2.385160e+01
+6.500000e-02 2.376854e+01
+7.000000e-02 2.363090e+01
+7.500000e-02 2.344168e+01
+8.000000e-02 2.322073e+01
+8.500000e-02 2.300515e+01
+9.000000e-02 2.284052e+01
+9.500000e-02 2.276130e+01
+1.000000e-01 2.278138e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.005521,0.014793) (0.008621,0.031003) (0.017029,0.018619) (0.000382,0.004958) (0.015515,0.005576) (0.016849,0.031392) (0.015037,0.044583) (0.001487,0.025261) (0.000044,0.036409) (0.001161,0.045121) (0.030521,0.014793) (0.033621,0.031003) (0.042029,0.018619) (0.025382,0.004958) (0.040515,0.005576) (0.041849,0.031392) (0.040037,0.044583) (0.026487,0.025261) (0.025044,0.036409) (0.026161,0.045121) (0.050382,0.004958) (0.051487,0.025261) (0.050044,0.036409) (0.051161,0.045121)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2be291fb2b3a33b288087f2b6b07c13f1d8c6ad5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.136582e+01 -1.867795e-04 -3.596868e-03
+1.000000e-02 2.265304e+01 -3.717506e-04 -7.165274e-03
+1.500000e-02 3.305648e+01 -5.431628e-04 -1.079135e-02
+2.000000e-02 4.073525e+01 -6.738783e-04 -1.468177e-02
+2.500000e-02 4.557738e+01 -7.615273e-04 -1.886044e-02
+3.000000e-02 4.862090e+01 -8.203080e-04 -2.321689e-02
+3.500000e-02 5.060937e+01 -8.612049e-04 -2.766187e-02
+4.000000e-02 5.191880e+01 -8.899524e-04 -3.214983e-02
+4.500000e-02 5.275999e+01 -9.099999e-04 -3.665469e-02
+5.000000e-02 5.327127e+01 -9.237308e-04 -4.115923e-02
+5.500000e-02 5.355085e+01 -9.329012e-04 -4.565126e-02
+6.000000e-02 5.367165e+01 -9.388441e-04 -5.012196e-02
+6.500000e-02 5.368928e+01 -9.425855e-04 -5.456482e-02
+7.000000e-02 5.364649e+01 -9.449192e-04 -5.897506e-02
+7.500000e-02 5.357570e+01 -9.464568e-04 -6.334919e-02
+8.000000e-02 5.350103e+01 -9.476631e-04 -6.768475e-02
+8.500000e-02 5.343988e+01 -9.488852e-04 -7.198005e-02
+9.000000e-02 5.340431e+01 -9.503758e-04 -7.623403e-02
+9.500000e-02 5.340222e+01 -9.523127e-04 -8.044608e-02
+1.000000e-01 5.343836e+01 -9.548145e-04 -8.461603e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.005521,0.014793) (0.008621,0.031003) (0.017029,0.018619) (0.000382,0.004958) (0.015515,0.005576) (0.016849,0.031392) (0.015037,0.044583) (0.001487,0.025261) (0.000044,0.036409) (0.001161,0.045121) (0.030521,0.014793) (0.033621,0.031003) (0.042029,0.018619) (0.025382,0.004958) (0.040515,0.005576) (0.041849,0.031392) (0.040037,0.044583) (0.026487,0.025261) (0.025044,0.036409) (0.026161,0.045121) (0.050382,0.004958) (0.051487,0.025261) (0.050044,0.036409) (0.051161,0.045121)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a61c494eac3d23a6eb7629110f47ced6b8ed9689
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.108561e+02 -1.821911e-03 -1.823282e-03
+1.000000e-02 2.215172e+02 -3.630476e-03 -3.633468e-03
+1.500000e-02 3.319840e+02 -5.425846e-03 -5.430707e-03
+2.000000e-02 4.422569e+02 -7.208187e-03 -7.215150e-03
+2.500000e-02 5.523331e+02 -8.978292e-03 -8.986901e-03
+3.000000e-02 6.621459e+02 -1.074511e-02 -1.074798e-02
+3.500000e-02 7.712378e+02 -1.253849e-02 -1.253125e-02
+4.000000e-02 8.791765e+02 -1.437834e-02 -1.437098e-02
+4.500000e-02 9.865417e+02 -1.623275e-02 -1.622702e-02
+5.000000e-02 1.093641e+03 -1.808391e-02 -1.807983e-02
+5.500000e-02 1.200529e+03 -1.992873e-02 -1.992633e-02
+6.000000e-02 1.307221e+03 -2.176644e-02 -2.176577e-02
+6.500000e-02 1.413729e+03 -2.359659e-02 -2.359768e-02
+7.000000e-02 1.520064e+03 -2.541875e-02 -2.542169e-02
+7.500000e-02 1.626233e+03 -2.723256e-02 -2.723743e-02
+8.000000e-02 1.732245e+03 -2.903769e-02 -2.904459e-02
+8.500000e-02 1.838108e+03 -3.083383e-02 -3.084291e-02
+9.000000e-02 1.943827e+03 -3.262071e-02 -3.263214e-02
+9.500000e-02 2.049410e+03 -3.439808e-02 -3.441206e-02
+1.000000e-01 2.154861e+03 -3.616573e-02 -3.618250e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.007089,0.026395) (0.014143,0.016671) (0.012833,0.044199) (0.014419,0.005536) (0.015913,0.035763) (0.001590,0.011733) (0.000387,0.037182) (0.019545,0.027218) (0.001920,0.019720) (0.008152,0.034118) (0.032089,0.026395) (0.039143,0.016671) (0.037833,0.044199) (0.039419,0.005536) (0.040913,0.035763) (0.026590,0.011733) (0.025387,0.037182) (0.044545,0.027218) (0.026920,0.019720) (0.033152,0.034118) (0.051590,0.011733) (0.050387,0.037182) (0.051920,0.019720)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f3d93cf518b4e536218fe99433a06e5c67af3eba
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.215971e+00
+1.000000e-02 1.198151e+01
+1.500000e-02 1.669290e+01
+2.000000e-02 1.980318e+01
+2.500000e-02 2.162303e+01
+3.000000e-02 2.262129e+01
+3.500000e-02 2.320664e+01
+4.000000e-02 2.356693e+01
+4.500000e-02 2.378932e+01
+5.000000e-02 2.392014e+01
+5.500000e-02 2.397174e+01
+6.000000e-02 2.395767e+01
+6.500000e-02 2.387964e+01
+7.000000e-02 2.373654e+01
+7.500000e-02 2.354076e+01
+8.000000e-02 2.333294e+01
+8.500000e-02 2.318851e+01
+9.000000e-02 2.314231e+01
+9.500000e-02 2.319080e+01
+1.000000e-01 2.328561e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.007089,0.026395) (0.014143,0.016671) (0.012833,0.044199) (0.014419,0.005536) (0.015913,0.035763) (0.001590,0.011733) (0.000387,0.037182) (0.019545,0.027218) (0.001920,0.019720) (0.008152,0.034118) (0.032089,0.026395) (0.039143,0.016671) (0.037833,0.044199) (0.039419,0.005536) (0.040913,0.035763) (0.026590,0.011733) (0.025387,0.037182) (0.044545,0.027218) (0.026920,0.019720) (0.033152,0.034118) (0.051590,0.011733) (0.050387,0.037182) (0.051920,0.019720)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c775d1b5026c73dee04e774838011c0b5524ef92
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.204279e+01 -1.984547e-04 -3.508314e-03
+1.000000e-02 2.369828e+01 -3.915973e-04 -7.009238e-03
+1.500000e-02 3.399914e+01 -5.666088e-04 -1.058631e-02
+2.000000e-02 4.184957e+01 -7.044486e-04 -1.440140e-02
+2.500000e-02 4.706928e+01 -8.018721e-04 -1.848870e-02
+3.000000e-02 5.035824e+01 -8.685100e-04 -2.277702e-02
+3.500000e-02 5.247432e+01 -9.151924e-04 -2.717604e-02
+4.000000e-02 5.388229e+01 -9.489201e-04 -3.162799e-02
+4.500000e-02 5.482568e+01 -9.735267e-04 -3.610262e-02
+5.000000e-02 5.545506e+01 -9.916217e-04 -4.058032e-02
+5.500000e-02 5.587231e+01 -1.005088e-03 -4.504753e-02
+6.000000e-02 5.614800e+01 -1.015288e-03 -4.949480e-02
+6.500000e-02 5.633046e+01 -1.023191e-03 -5.391572e-02
+7.000000e-02 5.645224e+01 -1.029472e-03 -5.830608e-02
+7.500000e-02 5.653812e+01 -1.034738e-03 -6.266223e-02
+8.000000e-02 5.659652e+01 -1.039036e-03 -6.698431e-02
+8.500000e-02 5.664007e+01 -1.042736e-03 -7.127032e-02
+9.000000e-02 5.667578e+01 -1.046012e-03 -7.551957e-02
+9.500000e-02 5.670851e+01 -1.048991e-03 -7.973167e-02
+1.000000e-01 5.674211e+01 -1.051773e-03 -8.390637e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.007089,0.026395) (0.014143,0.016671) (0.012833,0.044199) (0.014419,0.005536) (0.015913,0.035763) (0.001590,0.011733) (0.000387,0.037182) (0.019545,0.027218) (0.001920,0.019720) (0.008152,0.034118) (0.032089,0.026395) (0.039143,0.016671) (0.037833,0.044199) (0.039419,0.005536) (0.040913,0.035763) (0.026590,0.011733) (0.025387,0.037182) (0.044545,0.027218) (0.026920,0.019720) (0.033152,0.034118) (0.051590,0.011733) (0.050387,0.037182) (0.051920,0.019720)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ffa3b97429b41510a676b37be7304f5443f53423
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.108436e+02 -1.770448e-03 -1.881788e-03
+1.000000e-02 2.214942e+02 -3.527680e-03 -3.750282e-03
+1.500000e-02 3.319523e+02 -5.271851e-03 -5.605632e-03
+2.000000e-02 4.422185e+02 -7.003120e-03 -7.447990e-03
+2.500000e-02 5.522904e+02 -8.722072e-03 -9.277513e-03
+3.000000e-02 6.621051e+02 -1.043631e-02 -1.109602e-02
+3.500000e-02 7.711979e+02 -1.217768e-02 -1.293490e-02
+4.000000e-02 8.791330e+02 -1.395762e-02 -1.483921e-02
+4.500000e-02 9.864999e+02 -1.574519e-02 -1.676630e-02
+5.000000e-02 1.093603e+03 -1.752726e-02 -1.869200e-02
+5.500000e-02 1.200496e+03 -1.930166e-02 -2.061239e-02
+6.000000e-02 1.307195e+03 -2.106779e-02 -2.252658e-02
+6.500000e-02 1.413711e+03 -2.282526e-02 -2.443405e-02
+7.000000e-02 1.520053e+03 -2.457374e-02 -2.633438e-02
+7.500000e-02 1.626232e+03 -2.631291e-02 -2.822716e-02
+8.000000e-02 1.732254e+03 -2.804251e-02 -3.011205e-02
+8.500000e-02 1.838127e+03 -2.976229e-02 -3.198872e-02
+9.000000e-02 1.943857e+03 -3.147204e-02 -3.385688e-02
+9.500000e-02 2.049452e+03 -3.317158e-02 -3.571628e-02
+1.000000e-01 2.154915e+03 -3.486076e-02 -3.756669e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.017280,0.019825) (0.012754,0.037733) (0.013645,0.009306) (0.001186,0.020186) (0.000387,0.032134) (0.000433,0.004250) (0.003694,0.039403) (0.016663,0.030248) (0.007258,0.028537) (0.019621,0.045758) (0.042280,0.019825) (0.037754,0.037733) (0.038645,0.009306) (0.026186,0.020186) (0.025387,0.032134) (0.025433,0.004250) (0.028694,0.039403) (0.041663,0.030248) (0.032258,0.028537) (0.044621,0.045758) (0.051186,0.020186) (0.050387,0.032134) (0.050433,0.004250)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cd173e29cc748c1bf610bc43ef7a759829dbdffc
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.383076e+00
+1.000000e-02 1.233673e+01
+1.500000e-02 1.694176e+01
+2.000000e-02 2.000945e+01
+2.500000e-02 2.176887e+01
+3.000000e-02 2.272568e+01
+3.500000e-02 2.328135e+01
+4.000000e-02 2.361256e+01
+4.500000e-02 2.380197e+01
+5.000000e-02 2.390517e+01
+5.500000e-02 2.394796e+01
+6.000000e-02 2.395242e+01
+6.500000e-02 2.393075e+01
+7.000000e-02 2.389466e+01
+7.500000e-02 2.384345e+01
+8.000000e-02 2.378240e+01
+8.500000e-02 2.373028e+01
+9.000000e-02 2.371411e+01
+9.500000e-02 2.373317e+01
+1.000000e-01 2.377018e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.017280,0.019825) (0.012754,0.037733) (0.013645,0.009306) (0.001186,0.020186) (0.000387,0.032134) (0.000433,0.004250) (0.003694,0.039403) (0.016663,0.030248) (0.007258,0.028537) (0.019621,0.045758) (0.042280,0.019825) (0.037754,0.037733) (0.038645,0.009306) (0.026186,0.020186) (0.025387,0.032134) (0.025433,0.004250) (0.028694,0.039403) (0.041663,0.030248) (0.032258,0.028537) (0.044621,0.045758) (0.051186,0.020186) (0.050387,0.032134) (0.050433,0.004250)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..45d4306a0181b610256df478ff0e51f1f52024ab
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.152701e+01 -1.845187e-04 -3.646236e-03
+1.000000e-02 2.273190e+01 -3.643278e-04 -7.279829e-03
+1.500000e-02 3.257213e+01 -5.262594e-04 -1.098315e-02
+2.000000e-02 4.002095e+01 -6.539248e-04 -1.488803e-02
+2.500000e-02 4.489920e+01 -7.427053e-04 -1.904642e-02
+3.000000e-02 4.794769e+01 -8.027509e-04 -2.338385e-02
+3.500000e-02 4.994637e+01 -8.451837e-04 -2.781080e-02
+4.000000e-02 5.131016e+01 -8.760807e-04 -3.227878e-02
+4.500000e-02 5.225207e+01 -8.987884e-04 -3.676218e-02
+5.000000e-02 5.289485e+01 -9.153900e-04 -4.124582e-02
+5.500000e-02 5.332011e+01 -9.273523e-04 -4.571943e-02
+6.000000e-02 5.358967e+01 -9.359103e-04 -5.017462e-02
+6.500000e-02 5.374198e+01 -9.416807e-04 -5.460725e-02
+7.000000e-02 5.381076e+01 -9.453473e-04 -5.901294e-02
+7.500000e-02 5.382847e+01 -9.477241e-04 -6.338659e-02
+8.000000e-02 5.381386e+01 -9.491492e-04 -6.772627e-02
+8.500000e-02 5.378329e+01 -9.499837e-04 -7.202999e-02
+9.000000e-02 5.374963e+01 -9.505170e-04 -7.629625e-02
+9.500000e-02 5.372272e+01 -9.509748e-04 -8.052402e-02
+1.000000e-01 5.370983e+01 -9.515297e-04 -8.471264e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.017280,0.019825) (0.012754,0.037733) (0.013645,0.009306) (0.001186,0.020186) (0.000387,0.032134) (0.000433,0.004250) (0.003694,0.039403) (0.016663,0.030248) (0.007258,0.028537) (0.019621,0.045758) (0.042280,0.019825) (0.037754,0.037733) (0.038645,0.009306) (0.026186,0.020186) (0.025387,0.032134) (0.025433,0.004250) (0.028694,0.039403) (0.041663,0.030248) (0.032258,0.028537) (0.044621,0.045758) (0.051186,0.020186) (0.050387,0.032134) (0.050433,0.004250)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9ef65c0f050726d2656c75d1efab021c6dcd5ef9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.108336e+02 -1.833262e-03 -1.822508e-03
+1.000000e-02 2.214750e+02 -3.653282e-03 -3.631721e-03
+1.500000e-02 3.319250e+02 -5.460213e-03 -5.427792e-03
+2.000000e-02 4.421840e+02 -7.254207e-03 -7.210877e-03
+2.500000e-02 5.522498e+02 -9.035587e-03 -8.981343e-03
+3.000000e-02 6.620616e+02 -1.080839e-02 -1.074388e-02
+3.500000e-02 7.711519e+02 -1.260422e-02 -1.252989e-02
+4.000000e-02 8.790814e+02 -1.445425e-02 -1.436632e-02
+4.500000e-02 9.864453e+02 -1.632056e-02 -1.621675e-02
+5.000000e-02 1.093547e+03 -1.818373e-02 -1.806324e-02
+5.500000e-02 1.200438e+03 -2.004061e-02 -1.990291e-02
+6.000000e-02 1.307137e+03 -2.189044e-02 -2.173504e-02
+6.500000e-02 1.413652e+03 -2.373275e-02 -2.355920e-02
+7.000000e-02 1.519995e+03 -2.556716e-02 -2.537502e-02
+7.500000e-02 1.626174e+03 -2.739332e-02 -2.718215e-02
+8.000000e-02 1.732197e+03 -2.921091e-02 -2.898030e-02
+8.500000e-02 1.838071e+03 -3.101965e-02 -3.076921e-02
+9.000000e-02 1.943803e+03 -3.281927e-02 -3.254863e-02
+9.500000e-02 2.049399e+03 -3.460956e-02 -3.431836e-02
+1.000000e-01 2.154864e+03 -3.639032e-02 -3.607823e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.015401,0.045098) (0.018564,0.032604) (0.002415,0.016701) (0.012023,0.010941) (0.004346,0.028131) (0.001127,0.005490) (0.001834,0.041928) (0.018921,0.020165) (0.009895,0.035530) (0.016456,0.004341) (0.040401,0.045098) (0.043564,0.032604) (0.027415,0.016701) (0.037023,0.010941) (0.029346,0.028131) (0.026127,0.005490) (0.026834,0.041928) (0.043921,0.020165) (0.034895,0.035530) (0.041456,0.004341) (0.052415,0.016701) (0.051127,0.005490) (0.051834,0.041928)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b675876544560e3f6aea1056fa830161fb086097
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.081829e+00
+1.000000e-02 1.210085e+01
+1.500000e-02 1.696586e+01
+2.000000e-02 2.004606e+01
+2.500000e-02 2.179021e+01
+3.000000e-02 2.274581e+01
+3.500000e-02 2.330942e+01
+4.000000e-02 2.364405e+01
+4.500000e-02 2.383626e+01
+5.000000e-02 2.391306e+01
+5.500000e-02 2.389216e+01
+6.000000e-02 2.374366e+01
+6.500000e-02 2.325682e+01
+7.000000e-02 2.265864e+01
+7.500000e-02 2.251771e+01
+8.000000e-02 2.274678e+01
+8.500000e-02 2.311519e+01
+9.000000e-02 2.345417e+01
+9.500000e-02 2.364298e+01
+1.000000e-01 2.363760e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.015401,0.045098) (0.018564,0.032604) (0.002415,0.016701) (0.012023,0.010941) (0.004346,0.028131) (0.001127,0.005490) (0.001834,0.041928) (0.018921,0.020165) (0.009895,0.035530) (0.016456,0.004341) (0.040401,0.045098) (0.043564,0.032604) (0.027415,0.016701) (0.037023,0.010941) (0.029346,0.028131) (0.026127,0.005490) (0.026834,0.041928) (0.043921,0.020165) (0.034895,0.035530) (0.041456,0.004341) (0.052415,0.016701) (0.051127,0.005490) (0.051834,0.041928)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f6302bcd3872f6a04a82254df9fe25b244982076
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.070214e+01 -1.772756e-04 -3.657002e-03
+1.000000e-02 2.133651e+01 -3.527172e-04 -7.285526e-03
+1.500000e-02 3.150377e+01 -5.203719e-04 -1.093036e-02
+2.000000e-02 3.929755e+01 -6.519625e-04 -1.481003e-02
+2.500000e-02 4.414918e+01 -7.389475e-04 -1.899231e-02
+3.000000e-02 4.724640e+01 -7.983689e-04 -2.334178e-02
+3.500000e-02 4.927958e+01 -8.401509e-04 -2.777805e-02
+4.000000e-02 5.060624e+01 -8.695069e-04 -3.225970e-02
+4.500000e-02 5.143770e+01 -8.896156e-04 -3.676259e-02
+5.000000e-02 5.191645e+01 -9.028251e-04 -4.126973e-02
+5.500000e-02 5.214766e+01 -9.109290e-04 -4.576866e-02
+6.000000e-02 5.221864e+01 -9.156528e-04 -5.024772e-02
+6.500000e-02 5.218510e+01 -9.179689e-04 -5.470056e-02
+7.000000e-02 5.209642e+01 -9.188607e-04 -5.912093e-02
+7.500000e-02 5.198237e+01 -9.189107e-04 -6.350532e-02
+8.000000e-02 5.186569e+01 -9.186937e-04 -6.785036e-02
+8.500000e-02 5.176423e+01 -9.185677e-04 -7.215424e-02
+9.000000e-02 5.167093e+01 -9.182879e-04 -7.641911e-02
+9.500000e-02 5.160433e+01 -9.182775e-04 -8.064277e-02
+1.000000e-01 5.154913e+01 -9.184769e-04 -8.482603e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.015401,0.045098) (0.018564,0.032604) (0.002415,0.016701) (0.012023,0.010941) (0.004346,0.028131) (0.001127,0.005490) (0.001834,0.041928) (0.018921,0.020165) (0.009895,0.035530) (0.016456,0.004341) (0.040401,0.045098) (0.043564,0.032604) (0.027415,0.016701) (0.037023,0.010941) (0.029346,0.028131) (0.026127,0.005490) (0.026834,0.041928) (0.043921,0.020165) (0.034895,0.035530) (0.041456,0.004341) (0.052415,0.016701) (0.051127,0.005490) (0.051834,0.041928)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f5aa6804b01acea1b4b848917bddef792c2f4a44
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.108472e+02 -1.806295e-03 -1.843859e-03
+1.000000e-02 2.215006e+02 -3.599336e-03 -3.674496e-03
+1.500000e-02 3.319611e+02 -5.379274e-03 -5.492062e-03
+2.000000e-02 4.422291e+02 -7.146267e-03 -7.296710e-03
+2.500000e-02 5.523021e+02 -8.900769e-03 -9.088737e-03
+3.000000e-02 6.621172e+02 -1.064854e-02 -1.087193e-02
+3.500000e-02 7.712096e+02 -1.242128e-02 -1.267788e-02
+4.000000e-02 8.791447e+02 -1.424082e-02 -1.454107e-02
+4.500000e-02 9.865106e+02 -1.607236e-02 -1.642286e-02
+5.000000e-02 1.093612e+03 -1.789948e-02 -1.830229e-02
+5.500000e-02 1.200503e+03 -1.971951e-02 -2.017593e-02
+6.000000e-02 1.307200e+03 -2.153175e-02 -2.204299e-02
+6.500000e-02 1.413713e+03 -2.333579e-02 -2.390298e-02
+7.000000e-02 1.520052e+03 -2.513124e-02 -2.575549e-02
+7.500000e-02 1.626227e+03 -2.691778e-02 -2.760015e-02
+8.000000e-02 1.732245e+03 -2.869510e-02 -2.943663e-02
+8.500000e-02 1.838115e+03 -3.046295e-02 -3.126464e-02
+9.000000e-02 1.943841e+03 -3.222108e-02 -3.308389e-02
+9.500000e-02 2.049431e+03 -3.396929e-02 -3.489416e-02
+1.000000e-01 2.154890e+03 -3.570741e-02 -3.669523e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.014671,0.008729) (0.002283,0.031141) (0.017886,0.030781) (0.001426,0.043121) (0.019099,0.045561) (0.000573,0.018562) (0.006577,0.024322) (0.000826,0.005368) (0.013269,0.016844) (0.012167,0.040660) (0.039671,0.008729) (0.027283,0.031141) (0.042886,0.030781) (0.026426,0.043121) (0.044099,0.045561) (0.025573,0.018562) (0.031577,0.024322) (0.025826,0.005368) (0.038269,0.016844) (0.037167,0.040660) (0.052283,0.031141) (0.051426,0.043121) (0.050573,0.018562) (0.050826,0.005368)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6b5555c1ed3c94dc2590e20fbb27776a4b5f3b48
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 6.234429e+00
+1.000000e-02 1.221792e+01
+1.500000e-02 1.695452e+01
+2.000000e-02 2.000022e+01
+2.500000e-02 2.175335e+01
+3.000000e-02 2.271978e+01
+3.500000e-02 2.329098e+01
+4.000000e-02 2.364965e+01
+4.500000e-02 2.387833e+01
+5.000000e-02 2.402037e+01
+5.500000e-02 2.409866e+01
+6.000000e-02 2.413147e+01
+6.500000e-02 2.413557e+01
+7.000000e-02 2.411164e+01
+7.500000e-02 2.407217e+01
+8.000000e-02 2.402040e+01
+8.500000e-02 2.395525e+01
+9.000000e-02 2.388345e+01
+9.500000e-02 2.380899e+01
+1.000000e-01 2.372968e+01
+volume fraction= 0.307876
+fiber_centers_YZ= (0.014671,0.008729) (0.002283,0.031141) (0.017886,0.030781) (0.001426,0.043121) (0.019099,0.045561) (0.000573,0.018562) (0.006577,0.024322) (0.000826,0.005368) (0.013269,0.016844) (0.012167,0.040660) (0.039671,0.008729) (0.027283,0.031141) (0.042886,0.030781) (0.026426,0.043121) (0.044099,0.045561) (0.025573,0.018562) (0.031577,0.024322) (0.025826,0.005368) (0.038269,0.016844) (0.037167,0.040660) (0.052283,0.031141) (0.051426,0.043121) (0.050573,0.018562) (0.050826,0.005368)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2e690274cf321d50e87d69bae9ec681e919410e4
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.3079_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.108035e+01 -1.808664e-04 -3.648250e-03
+1.000000e-02 2.203652e+01 -3.593258e-04 -7.271075e-03
+1.500000e-02 3.210439e+01 -5.255188e-04 -1.093346e-02
+2.000000e-02 3.952551e+01 -6.527808e-04 -1.484203e-02
+2.500000e-02 4.419450e+01 -7.380788e-04 -1.903021e-02
+3.000000e-02 4.716728e+01 -7.962904e-04 -2.338199e-02
+3.500000e-02 4.910410e+01 -8.369105e-04 -2.782122e-02
+4.000000e-02 5.035257e+01 -8.649753e-04 -3.230767e-02
+4.500000e-02 5.112029e+01 -8.839326e-04 -3.681516e-02
+5.000000e-02 5.154370e+01 -8.960032e-04 -4.132748e-02
+5.500000e-02 5.172962e+01 -9.031866e-04 -4.583063e-02
+6.000000e-02 5.175956e+01 -9.069567e-04 -5.031449e-02
+6.500000e-02 5.170113e+01 -9.086077e-04 -5.477042e-02
+7.000000e-02 5.160264e+01 -9.091018e-04 -5.919213e-02
+7.500000e-02 5.149469e+01 -9.090849e-04 -6.357559e-02
+8.000000e-02 5.140396e+01 -9.091045e-04 -6.791756e-02
+8.500000e-02 5.133894e+01 -9.094249e-04 -7.221675e-02
+9.000000e-02 5.131106e+01 -9.102983e-04 -7.647206e-02
+9.500000e-02 5.131312e+01 -9.115084e-04 -8.068543e-02
+1.000000e-01 5.135024e+01 -9.132661e-04 -8.485608e-02
+volume fraction= 0.307876
+fiber_centers_YZ= (0.014671,0.008729) (0.002283,0.031141) (0.017886,0.030781) (0.001426,0.043121) (0.019099,0.045561) (0.000573,0.018562) (0.006577,0.024322) (0.000826,0.005368) (0.013269,0.016844) (0.012167,0.040660) (0.039671,0.008729) (0.027283,0.031141) (0.042886,0.030781) (0.026426,0.043121) (0.044099,0.045561) (0.025573,0.018562) (0.031577,0.024322) (0.025826,0.005368) (0.038269,0.016844) (0.037167,0.040660) (0.052283,0.031141) (0.051426,0.043121) (0.050573,0.018562) (0.050826,0.005368)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..762f299ca321ff71bea7b3924e832f71e7e82583
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.426959e+02 -1.760310e-03 -1.643354e-03
+1.000000e-02 2.850744e+02 -3.508521e-03 -3.274526e-03
+1.500000e-02 4.271370e+02 -5.244768e-03 -4.893657e-03
+2.000000e-02 5.688850e+02 -6.969186e-03 -6.500896e-03
+2.500000e-02 7.103168e+02 -8.681990e-03 -8.096892e-03
+3.000000e-02 8.513734e+02 -1.038651e-02 -9.689098e-03
+3.500000e-02 9.916710e+02 -1.211584e-02 -1.130142e-02
+4.000000e-02 1.130870e+03 -1.390549e-02 -1.294279e-02
+4.500000e-02 1.269458e+03 -1.571707e-02 -1.458864e-02
+5.000000e-02 1.407697e+03 -1.752896e-02 -1.622803e-02
+5.500000e-02 1.545634e+03 -1.933749e-02 -1.785912e-02
+6.000000e-02 1.683286e+03 -2.114180e-02 -1.948139e-02
+6.500000e-02 1.820664e+03 -2.294137e-02 -2.109451e-02
+7.000000e-02 1.957778e+03 -2.473574e-02 -2.269818e-02
+7.500000e-02 2.094636e+03 -2.652450e-02 -2.429214e-02
+8.000000e-02 2.231248e+03 -2.830727e-02 -2.587617e-02
+8.500000e-02 2.367620e+03 -3.008370e-02 -2.745009e-02
+9.000000e-02 2.503759e+03 -3.185346e-02 -2.901371e-02
+9.500000e-02 2.639670e+03 -3.361626e-02 -3.056692e-02
+1.000000e-01 2.775360e+03 -3.537184e-02 -3.210959e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.010892,0.018051) (0.000975,0.041662) (0.009854,0.039577) (0.013192,0.030748) (0.017159,0.043584) (0.003515,0.011639) (0.002189,0.026107) (0.017234,0.010333) (0.011821,0.004835) (0.000080,0.004444) (0.017154,0.023654) (0.003720,0.034257) (0.000200,0.018625) (0.035892,0.018051) (0.025975,0.041662) (0.034854,0.039577) (0.038192,0.030748) (0.042159,0.043584) (0.028515,0.011639) (0.027189,0.026107) (0.042234,0.010333) (0.036821,0.004835) (0.025080,0.004444) (0.042154,0.023654) (0.028720,0.034257) (0.025200,0.018625) (0.050975,0.041662) (0.052189,0.026107) (0.050080,0.004444) (0.050200,0.018625)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8fe703f7e8641bc3dcc41ff55cb065e86477dd9a
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.594326e+00
+1.000000e-02 1.468459e+01
+1.500000e-02 1.936973e+01
+2.000000e-02 2.188644e+01
+2.500000e-02 2.310958e+01
+3.000000e-02 2.368339e+01
+3.500000e-02 2.395725e+01
+4.000000e-02 2.405506e+01
+4.500000e-02 2.405257e+01
+5.000000e-02 2.398837e+01
+5.500000e-02 2.388953e+01
+6.000000e-02 2.377962e+01
+6.500000e-02 2.369143e+01
+7.000000e-02 2.364944e+01
+7.500000e-02 2.365302e+01
+8.000000e-02 2.368893e+01
+8.500000e-02 2.374986e+01
+9.000000e-02 2.383257e+01
+9.500000e-02 2.393700e+01
+1.000000e-01 2.404345e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.010892,0.018051) (0.000975,0.041662) (0.009854,0.039577) (0.013192,0.030748) (0.017159,0.043584) (0.003515,0.011639) (0.002189,0.026107) (0.017234,0.010333) (0.011821,0.004835) (0.000080,0.004444) (0.017154,0.023654) (0.003720,0.034257) (0.000200,0.018625) (0.035892,0.018051) (0.025975,0.041662) (0.034854,0.039577) (0.038192,0.030748) (0.042159,0.043584) (0.028515,0.011639) (0.027189,0.026107) (0.042234,0.010333) (0.036821,0.004835) (0.025080,0.004444) (0.042154,0.023654) (0.028720,0.034257) (0.025200,0.018625) (0.050975,0.041662) (0.052189,0.026107) (0.050080,0.004444) (0.050200,0.018625)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7bb0ad0c5e9f16c8bab4588bb559d601d7c62661
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.399447e+01 -1.730974e-04 -3.425215e-03
+1.000000e-02 2.749991e+01 -3.396921e-04 -6.872741e-03
+1.500000e-02 3.834919e+01 -4.747650e-04 -1.056521e-02
+2.000000e-02 4.525525e+01 -5.650441e-04 -1.462018e-02
+2.500000e-02 4.937878e+01 -6.235068e-04 -1.891935e-02
+3.000000e-02 5.194704e+01 -6.633195e-04 -2.334186e-02
+3.500000e-02 5.359985e+01 -6.914233e-04 -2.782379e-02
+4.000000e-02 5.467605e+01 -7.117243e-04 -3.232931e-02
+4.500000e-02 5.537401e+01 -7.266361e-04 -3.683728e-02
+5.000000e-02 5.582532e+01 -7.378251e-04 -4.133387e-02
+5.500000e-02 5.612433e+01 -7.465272e-04 -4.580920e-02
+6.000000e-02 5.633975e+01 -7.536679e-04 -5.025606e-02
+6.500000e-02 5.652062e+01 -7.599322e-04 -5.466925e-02
+7.000000e-02 5.669897e+01 -7.658430e-04 -5.904494e-02
+7.500000e-02 5.690515e+01 -7.718571e-04 -6.337992e-02
+8.000000e-02 5.713924e+01 -7.778484e-04 -6.767573e-02
+8.500000e-02 5.741331e+01 -7.841514e-04 -7.193014e-02
+9.000000e-02 5.772970e+01 -7.908453e-04 -7.614305e-02
+9.500000e-02 5.808702e+01 -7.979528e-04 -8.031478e-02
+1.000000e-01 5.848170e+01 -8.054622e-04 -8.444596e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.010892,0.018051) (0.000975,0.041662) (0.009854,0.039577) (0.013192,0.030748) (0.017159,0.043584) (0.003515,0.011639) (0.002189,0.026107) (0.017234,0.010333) (0.011821,0.004835) (0.000080,0.004444) (0.017154,0.023654) (0.003720,0.034257) (0.000200,0.018625) (0.035892,0.018051) (0.025975,0.041662) (0.034854,0.039577) (0.038192,0.030748) (0.042159,0.043584) (0.028515,0.011639) (0.027189,0.026107) (0.042234,0.010333) (0.036821,0.004835) (0.025080,0.004444) (0.042154,0.023654) (0.028720,0.034257) (0.025200,0.018625) (0.050975,0.041662) (0.052189,0.026107) (0.050080,0.004444) (0.050200,0.018625)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..87e618768119e13a211044062fa29089e96cf676
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.426807e+02 -1.632484e-03 -1.780126e-03
+1.000000e-02 2.850470e+02 -3.253023e-03 -3.547848e-03
+1.500000e-02 4.271003e+02 -4.861757e-03 -5.303303e-03
+2.000000e-02 5.688420e+02 -6.458828e-03 -7.046631e-03
+2.500000e-02 7.102708e+02 -8.044673e-03 -8.778089e-03
+3.000000e-02 8.513324e+02 -9.624927e-03 -1.050095e-02
+3.500000e-02 9.916333e+02 -1.122713e-02 -1.224525e-02
+4.000000e-02 1.130829e+03 -1.286237e-02 -1.404776e-02
+4.500000e-02 1.269422e+03 -1.450299e-02 -1.587085e-02
+5.000000e-02 1.407669e+03 -1.613811e-02 -1.769278e-02
+5.500000e-02 1.545618e+03 -1.776598e-02 -1.950989e-02
+6.000000e-02 1.683283e+03 -1.938612e-02 -2.132134e-02
+6.500000e-02 1.820675e+03 -2.099819e-02 -2.312661e-02
+7.000000e-02 1.957805e+03 -2.260192e-02 -2.492526e-02
+7.500000e-02 2.094681e+03 -2.419706e-02 -2.671689e-02
+8.000000e-02 2.231311e+03 -2.578338e-02 -2.850114e-02
+8.500000e-02 2.367703e+03 -2.736069e-02 -3.027768e-02
+9.000000e-02 2.503863e+03 -2.892883e-02 -3.204621e-02
+9.500000e-02 2.639796e+03 -3.048765e-02 -3.380646e-02
+1.000000e-01 2.775509e+03 -3.203705e-02 -3.555820e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.015762,0.043158) (0.012080,0.016817) (0.000509,0.007438) (0.013997,0.031230) (0.007272,0.037189) (0.000294,0.019624) (0.017092,0.006816) (0.007911,0.023942) (0.000116,0.041563) (0.000432,0.028384) (0.007929,0.045075) (0.007894,0.009824) (0.017234,0.023890) (0.040762,0.043158) (0.037080,0.016817) (0.025509,0.007438) (0.038997,0.031230) (0.032272,0.037189) (0.025294,0.019624) (0.042092,0.006816) (0.032911,0.023942) (0.025116,0.041563) (0.025432,0.028384) (0.032929,0.045075) (0.032894,0.009824) (0.042234,0.023890) (0.050509,0.007438) (0.050294,0.019624) (0.050116,0.041563) (0.050432,0.028384)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..55ddafce30b35a40216b856e2ea4030c3597b7c5
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 8.230419e+00
+1.000000e-02 1.524876e+01
+1.500000e-02 1.942542e+01
+2.000000e-02 2.174371e+01
+2.500000e-02 2.293230e+01
+3.000000e-02 2.350287e+01
+3.500000e-02 2.376076e+01
+4.000000e-02 2.386886e+01
+4.500000e-02 2.389454e+01
+5.000000e-02 2.388211e+01
+5.500000e-02 2.383691e+01
+6.000000e-02 2.377938e+01
+6.500000e-02 2.373449e+01
+7.000000e-02 2.372513e+01
+7.500000e-02 2.376685e+01
+8.000000e-02 2.386187e+01
+8.500000e-02 2.400393e+01
+9.000000e-02 2.418758e+01
+9.500000e-02 2.438790e+01
+1.000000e-01 2.459038e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.015762,0.043158) (0.012080,0.016817) (0.000509,0.007438) (0.013997,0.031230) (0.007272,0.037189) (0.000294,0.019624) (0.017092,0.006816) (0.007911,0.023942) (0.000116,0.041563) (0.000432,0.028384) (0.007929,0.045075) (0.007894,0.009824) (0.017234,0.023890) (0.040762,0.043158) (0.037080,0.016817) (0.025509,0.007438) (0.038997,0.031230) (0.032272,0.037189) (0.025294,0.019624) (0.042092,0.006816) (0.032911,0.023942) (0.025116,0.041563) (0.025432,0.028384) (0.032929,0.045075) (0.032894,0.009824) (0.042234,0.023890) (0.050509,0.007438) (0.050294,0.019624) (0.050116,0.041563) (0.050432,0.028384)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..faad2e7052f5cf916ca80434068e295bf90ecd0e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.546697e+01 -1.775421e-04 -3.507022e-03
+1.000000e-02 3.006987e+01 -3.463519e-04 -7.038760e-03
+1.500000e-02 4.091691e+01 -4.777268e-04 -1.081301e-02
+2.000000e-02 4.776321e+01 -5.653761e-04 -1.491129e-02
+2.500000e-02 5.181721e+01 -6.211110e-04 -1.924438e-02
+3.000000e-02 5.432648e+01 -6.581320e-04 -2.369878e-02
+3.500000e-02 5.595871e+01 -6.837824e-04 -2.820977e-02
+4.000000e-02 5.708139e+01 -7.023360e-04 -3.273959e-02
+4.500000e-02 5.790437e+01 -7.164012e-04 -3.726585e-02
+5.000000e-02 5.855731e+01 -7.277033e-04 -4.177398e-02
+5.500000e-02 5.912194e+01 -7.373971e-04 -4.625435e-02
+6.000000e-02 5.964947e+01 -7.462476e-04 -5.070069e-02
+6.500000e-02 6.017137e+01 -7.547925e-04 -5.510881e-02
+7.000000e-02 6.070872e+01 -7.632951e-04 -5.947679e-02
+7.500000e-02 6.127314e+01 -7.720149e-04 -6.380289e-02
+8.000000e-02 6.187136e+01 -7.810938e-04 -6.808638e-02
+8.500000e-02 6.251053e+01 -7.907367e-04 -7.232615e-02
+9.000000e-02 6.318173e+01 -8.007249e-04 -7.652428e-02
+9.500000e-02 6.388784e+01 -8.111963e-04 -8.068025e-02
+1.000000e-01 6.462596e+01 -8.221329e-04 -8.479471e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.015762,0.043158) (0.012080,0.016817) (0.000509,0.007438) (0.013997,0.031230) (0.007272,0.037189) (0.000294,0.019624) (0.017092,0.006816) (0.007911,0.023942) (0.000116,0.041563) (0.000432,0.028384) (0.007929,0.045075) (0.007894,0.009824) (0.017234,0.023890) (0.040762,0.043158) (0.037080,0.016817) (0.025509,0.007438) (0.038997,0.031230) (0.032272,0.037189) (0.025294,0.019624) (0.042092,0.006816) (0.032911,0.023942) (0.025116,0.041563) (0.025432,0.028384) (0.032929,0.045075) (0.032894,0.009824) (0.042234,0.023890) (0.050509,0.007438) (0.050294,0.019624) (0.050116,0.041563) (0.050432,0.028384)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0846548e7a231b161a697491e4bd0d5168a504eb
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.426876e+02 -1.712507e-03 -1.695957e-03
+1.000000e-02 2.850594e+02 -3.412779e-03 -3.379822e-03
+1.500000e-02 4.271169e+02 -5.100952e-03 -5.051734e-03
+2.000000e-02 5.688614e+02 -6.777168e-03 -6.711837e-03
+2.500000e-02 7.102915e+02 -8.441771e-03 -8.360566e-03
+3.000000e-02 8.513498e+02 -1.009953e-02 -1.000316e-02
+3.500000e-02 9.916476e+02 -1.178140e-02 -1.166646e-02
+4.000000e-02 1.130846e+03 -1.351023e-02 -1.337259e-02
+4.500000e-02 1.269438e+03 -1.525249e-02 -1.509134e-02
+5.000000e-02 1.407681e+03 -1.699183e-02 -1.680662e-02
+5.500000e-02 1.545624e+03 -1.872551e-02 -1.851569e-02
+6.000000e-02 1.683284e+03 -2.045282e-02 -2.021791e-02
+6.500000e-02 1.820670e+03 -2.217333e-02 -2.191285e-02
+7.000000e-02 1.957792e+03 -2.388666e-02 -2.360018e-02
+7.500000e-02 2.094661e+03 -2.559244e-02 -2.527957e-02
+8.000000e-02 2.231283e+03 -2.729038e-02 -2.695074e-02
+8.500000e-02 2.367666e+03 -2.898019e-02 -2.861345e-02
+9.000000e-02 2.503816e+03 -3.066160e-02 -3.026747e-02
+9.500000e-02 2.639740e+03 -3.233441e-02 -3.191261e-02
+1.000000e-01 2.775443e+03 -3.399841e-02 -3.354871e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.004600,0.039119) (0.010908,0.026130) (0.017806,0.039711) (0.009701,0.014077) (0.017103,0.031049) (0.008833,0.004517) (0.001219,0.031838) (0.002300,0.023061) (0.016322,0.019251) (0.000404,0.007256) (0.017025,0.006770) (0.000243,0.045651) (0.000118,0.015006) (0.029600,0.039119) (0.035908,0.026130) (0.042806,0.039711) (0.034701,0.014077) (0.042103,0.031049) (0.033833,0.004517) (0.026219,0.031838) (0.027300,0.023061) (0.041322,0.019251) (0.025404,0.007256) (0.042025,0.006770) (0.025243,0.045651) (0.025118,0.015006) (0.051219,0.031838) (0.052300,0.023061) (0.050404,0.007256) (0.050243,0.045651) (0.050118,0.015006)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..77cafb89ae455f54216f1cad30fc929c7d8604aa
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.668261e+00
+1.000000e-02 1.459226e+01
+1.500000e-02 1.915025e+01
+2.000000e-02 2.170207e+01
+2.500000e-02 2.301050e+01
+3.000000e-02 2.364131e+01
+3.500000e-02 2.392959e+01
+4.000000e-02 2.402606e+01
+4.500000e-02 2.399790e+01
+5.000000e-02 2.388730e+01
+5.500000e-02 2.372482e+01
+6.000000e-02 2.355578e+01
+6.500000e-02 2.342968e+01
+7.000000e-02 2.337402e+01
+7.500000e-02 2.340167e+01
+8.000000e-02 2.350060e+01
+8.500000e-02 2.364448e+01
+9.000000e-02 2.380200e+01
+9.500000e-02 2.393798e+01
+1.000000e-01 2.403145e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.004600,0.039119) (0.010908,0.026130) (0.017806,0.039711) (0.009701,0.014077) (0.017103,0.031049) (0.008833,0.004517) (0.001219,0.031838) (0.002300,0.023061) (0.016322,0.019251) (0.000404,0.007256) (0.017025,0.006770) (0.000243,0.045651) (0.000118,0.015006) (0.029600,0.039119) (0.035908,0.026130) (0.042806,0.039711) (0.034701,0.014077) (0.042103,0.031049) (0.033833,0.004517) (0.026219,0.031838) (0.027300,0.023061) (0.041322,0.019251) (0.025404,0.007256) (0.042025,0.006770) (0.025243,0.045651) (0.025118,0.015006) (0.051219,0.031838) (0.052300,0.023061) (0.050404,0.007256) (0.050243,0.045651) (0.050118,0.015006)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..10f469b3cdc17023a65d56ebc651103308708b48
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.518914e+01 -1.829222e-04 -3.381728e-03
+1.000000e-02 2.971747e+01 -3.584752e-04 -6.786362e-03
+1.500000e-02 4.102914e+01 -4.976928e-04 -1.046575e-02
+2.000000e-02 4.812292e+01 -5.892517e-04 -1.452699e-02
+2.500000e-02 5.227635e+01 -6.467686e-04 -1.885044e-02
+3.000000e-02 5.487221e+01 -6.853509e-04 -2.329748e-02
+3.500000e-02 5.660182e+01 -7.128983e-04 -2.779606e-02
+4.000000e-02 5.781614e+01 -7.335568e-04 -3.230958e-02
+4.500000e-02 5.871676e+01 -7.498455e-04 -3.681658e-02
+5.000000e-02 5.942863e+01 -7.633931e-04 -4.130360e-02
+5.500000e-02 6.003177e+01 -7.752758e-04 -4.576203e-02
+6.000000e-02 6.057797e+01 -7.862083e-04 -5.018643e-02
+6.500000e-02 6.110112e+01 -7.966722e-04 -5.457335e-02
+7.000000e-02 6.162354e+01 -8.069948e-04 -5.892066e-02
+7.500000e-02 6.216000e+01 -8.174009e-04 -6.322714e-02
+8.000000e-02 6.271881e+01 -8.280553e-04 -6.749200e-02
+8.500000e-02 6.331012e+01 -8.390490e-04 -7.171513e-02
+9.000000e-02 6.393971e+01 -8.505670e-04 -7.589559e-02
+9.500000e-02 6.460686e+01 -8.624997e-04 -8.003485e-02
+1.000000e-01 6.531722e+01 -8.749952e-04 -8.413230e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.004600,0.039119) (0.010908,0.026130) (0.017806,0.039711) (0.009701,0.014077) (0.017103,0.031049) (0.008833,0.004517) (0.001219,0.031838) (0.002300,0.023061) (0.016322,0.019251) (0.000404,0.007256) (0.017025,0.006770) (0.000243,0.045651) (0.000118,0.015006) (0.029600,0.039119) (0.035908,0.026130) (0.042806,0.039711) (0.034701,0.014077) (0.042103,0.031049) (0.033833,0.004517) (0.026219,0.031838) (0.027300,0.023061) (0.041322,0.019251) (0.025404,0.007256) (0.042025,0.006770) (0.025243,0.045651) (0.025118,0.015006) (0.051219,0.031838) (0.052300,0.023061) (0.050404,0.007256) (0.050243,0.045651) (0.050118,0.015006)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..931aa2add9a8dd2efd955dddbe3fc187fd1e87bb
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.426804e+02 -1.687010e-03 -1.723590e-03
+1.000000e-02 2.850456e+02 -3.361894e-03 -3.434980e-03
+1.500000e-02 4.270972e+02 -5.024788e-03 -5.134310e-03
+2.000000e-02 5.688366e+02 -6.675836e-03 -6.821719e-03
+2.500000e-02 7.102623e+02 -8.315488e-03 -8.497508e-03
+3.000000e-02 8.513190e+02 -9.949274e-03 -1.016552e-02
+3.500000e-02 9.916158e+02 -1.160647e-02 -1.185364e-02
+4.000000e-02 1.130809e+03 -1.330615e-02 -1.359011e-02
+4.500000e-02 1.269397e+03 -1.501682e-02 -1.534169e-02
+5.000000e-02 1.407639e+03 -1.672386e-02 -1.709035e-02
+5.500000e-02 1.545581e+03 -1.842489e-02 -1.883307e-02
+6.000000e-02 1.683239e+03 -2.011925e-02 -2.056915e-02
+6.500000e-02 1.820625e+03 -2.180654e-02 -2.229813e-02
+7.000000e-02 1.957747e+03 -2.348641e-02 -2.401966e-02
+7.500000e-02 2.094615e+03 -2.515855e-02 -2.573339e-02
+8.000000e-02 2.231237e+03 -2.682267e-02 -2.743902e-02
+8.500000e-02 2.367620e+03 -2.847850e-02 -2.913630e-02
+9.000000e-02 2.503771e+03 -3.012582e-02 -3.082498e-02
+9.500000e-02 2.639695e+03 -3.176442e-02 -3.250486e-02
+1.000000e-01 2.775398e+03 -3.339413e-02 -3.417576e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.009390,0.023462) (0.008170,0.034554) (0.014867,0.043928) (0.000418,0.030778) (0.006773,0.004573) (0.020352,0.007227) (0.012014,0.013278) (0.000788,0.044033) (0.015206,0.029094) (0.000062,0.020559) (0.004293,0.012653) (0.017052,0.020635) (0.017244,0.036530) (0.034390,0.023462) (0.033170,0.034554) (0.039867,0.043928) (0.025418,0.030778) (0.031773,0.004573) (0.045352,0.007227) (0.037014,0.013278) (0.025788,0.044033) (0.040206,0.029094) (0.025062,0.020559) (0.029293,0.012653) (0.042052,0.020635) (0.042244,0.036530) (0.050418,0.030778) (0.050788,0.044033) (0.050062,0.020559)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..02b155eadb3a3c655329118906cc2078c6525a73
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 7.861944e+00
+1.000000e-02 1.476896e+01
+1.500000e-02 1.932791e+01
+2.000000e-02 2.178864e+01
+2.500000e-02 2.307145e+01
+3.000000e-02 2.371445e+01
+3.500000e-02 2.402352e+01
+4.000000e-02 2.416052e+01
+4.500000e-02 2.419462e+01
+5.000000e-02 2.415772e+01
+5.500000e-02 2.408257e+01
+6.000000e-02 2.400776e+01
+6.500000e-02 2.397298e+01
+7.000000e-02 2.399371e+01
+7.500000e-02 2.404622e+01
+8.000000e-02 2.410496e+01
+8.500000e-02 2.416180e+01
+9.000000e-02 2.420714e+01
+9.500000e-02 2.425412e+01
+1.000000e-01 2.430800e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.009390,0.023462) (0.008170,0.034554) (0.014867,0.043928) (0.000418,0.030778) (0.006773,0.004573) (0.020352,0.007227) (0.012014,0.013278) (0.000788,0.044033) (0.015206,0.029094) (0.000062,0.020559) (0.004293,0.012653) (0.017052,0.020635) (0.017244,0.036530) (0.034390,0.023462) (0.033170,0.034554) (0.039867,0.043928) (0.025418,0.030778) (0.031773,0.004573) (0.045352,0.007227) (0.037014,0.013278) (0.025788,0.044033) (0.040206,0.029094) (0.025062,0.020559) (0.029293,0.012653) (0.042052,0.020635) (0.042244,0.036530) (0.050418,0.030778) (0.050788,0.044033) (0.050062,0.020559)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..153b2169f78fbc1701228c73e5797a3a620fa39d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.485095e+01 -1.761184e-04 -3.465077e-03
+1.000000e-02 2.910154e+01 -3.457350e-04 -6.942073e-03
+1.500000e-02 4.049997e+01 -4.855855e-04 -1.061862e-02
+2.000000e-02 4.773931e+01 -5.803760e-04 -1.464094e-02
+2.500000e-02 5.221874e+01 -6.442672e-04 -1.889139e-02
+3.000000e-02 5.507941e+01 -6.884281e-04 -2.327759e-02
+3.500000e-02 5.696637e+01 -7.198395e-04 -2.773554e-02
+4.000000e-02 5.825836e+01 -7.430272e-04 -3.222232e-02
+4.500000e-02 5.916274e+01 -7.606140e-04 -3.671438e-02
+5.000000e-02 5.981017e+01 -7.742857e-04 -4.119729e-02
+5.500000e-02 6.028935e+01 -7.852261e-04 -4.566125e-02
+6.000000e-02 6.066278e+01 -7.943112e-04 -5.009925e-02
+6.500000e-02 6.097802e+01 -8.021846e-04 -5.450628e-02
+7.000000e-02 6.126765e+01 -8.093516e-04 -5.887857e-02
+7.500000e-02 6.155870e+01 -8.162726e-04 -6.321281e-02
+8.000000e-02 6.186172e+01 -8.230443e-04 -6.750854e-02
+8.500000e-02 6.219070e+01 -8.299448e-04 -7.176406e-02
+9.000000e-02 6.255232e+01 -8.371012e-04 -7.597885e-02
+9.500000e-02 6.294944e+01 -8.445855e-04 -8.015290e-02
+1.000000e-01 6.338741e+01 -8.525216e-04 -8.428583e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.009390,0.023462) (0.008170,0.034554) (0.014867,0.043928) (0.000418,0.030778) (0.006773,0.004573) (0.020352,0.007227) (0.012014,0.013278) (0.000788,0.044033) (0.015206,0.029094) (0.000062,0.020559) (0.004293,0.012653) (0.017052,0.020635) (0.017244,0.036530) (0.034390,0.023462) (0.033170,0.034554) (0.039867,0.043928) (0.025418,0.030778) (0.031773,0.004573) (0.045352,0.007227) (0.037014,0.013278) (0.025788,0.044033) (0.040206,0.029094) (0.025062,0.020559) (0.029293,0.012653) (0.042052,0.020635) (0.042244,0.036530) (0.050418,0.030778) (0.050788,0.044033) (0.050062,0.020559)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ad680cb450757e908e844743f85084a94d11ce79
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.426764e+02 -1.672974e-03 -1.735155e-03
+1.000000e-02 2.850368e+02 -3.333893e-03 -3.458050e-03
+1.500000e-02 4.270828e+02 -4.982895e-03 -5.168823e-03
+2.000000e-02 5.688158e+02 -6.620122e-03 -6.867616e-03
+2.500000e-02 7.102343e+02 -8.245984e-03 -8.554786e-03
+3.000000e-02 8.512814e+02 -9.866052e-03 -1.023459e-02
+3.500000e-02 9.915674e+02 -1.150967e-02 -1.193557e-02
+4.000000e-02 1.130754e+03 -1.319293e-02 -1.368697e-02
+4.500000e-02 1.269333e+03 -1.488591e-02 -1.545469e-02
+5.000000e-02 1.407564e+03 -1.657483e-02 -1.722007e-02
+5.500000e-02 1.545496e+03 -1.825737e-02 -1.897996e-02
+6.000000e-02 1.683142e+03 -1.993293e-02 -2.073362e-02
+6.500000e-02 1.820516e+03 -2.160110e-02 -2.248058e-02
+7.000000e-02 1.957626e+03 -2.326154e-02 -2.422047e-02
+7.500000e-02 2.094482e+03 -2.491394e-02 -2.595294e-02
+8.000000e-02 2.231091e+03 -2.655802e-02 -2.767767e-02
+8.500000e-02 2.367461e+03 -2.819353e-02 -2.939438e-02
+9.000000e-02 2.503599e+03 -2.982024e-02 -3.110282e-02
+9.500000e-02 2.639510e+03 -3.143796e-02 -3.280277e-02
+1.000000e-01 2.775199e+03 -3.304652e-02 -3.449403e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.018524,0.044107) (0.016980,0.013210) (0.010117,0.029458) (0.002906,0.004729) (0.002886,0.019842) (0.003942,0.038510) (0.010350,0.008220) (0.011633,0.020068) (0.000047,0.028519) (0.019867,0.034350) (0.000954,0.012370) (0.017088,0.026124) (0.010818,0.045617) (0.043524,0.044107) (0.041980,0.013210) (0.035117,0.029458) (0.027906,0.004729) (0.027886,0.019842) (0.028942,0.038510) (0.035350,0.008220) (0.036633,0.020068) (0.025047,0.028519) (0.044867,0.034350) (0.025954,0.012370) (0.042088,0.026124) (0.035818,0.045617) (0.052906,0.004729) (0.052886,0.019842) (0.050047,0.028519) (0.050954,0.012370)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1264617984107b4a34cb844945753d13d802a0cf
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 8.007669e+00
+1.000000e-02 1.496429e+01
+1.500000e-02 1.941917e+01
+2.000000e-02 2.187643e+01
+2.500000e-02 2.310049e+01
+3.000000e-02 2.366851e+01
+3.500000e-02 2.394883e+01
+4.000000e-02 2.409499e+01
+4.500000e-02 2.416236e+01
+5.000000e-02 2.417253e+01
+5.500000e-02 2.414618e+01
+6.000000e-02 2.409717e+01
+6.500000e-02 2.403408e+01
+7.000000e-02 2.396866e+01
+7.500000e-02 2.392068e+01
+8.000000e-02 2.390149e+01
+8.500000e-02 2.391304e+01
+9.000000e-02 2.395125e+01
+9.500000e-02 2.401891e+01
+1.000000e-01 2.411511e+01
+volume fraction= 0.400239
+fiber_centers_YZ= (0.018524,0.044107) (0.016980,0.013210) (0.010117,0.029458) (0.002906,0.004729) (0.002886,0.019842) (0.003942,0.038510) (0.010350,0.008220) (0.011633,0.020068) (0.000047,0.028519) (0.019867,0.034350) (0.000954,0.012370) (0.017088,0.026124) (0.010818,0.045617) (0.043524,0.044107) (0.041980,0.013210) (0.035117,0.029458) (0.027906,0.004729) (0.027886,0.019842) (0.028942,0.038510) (0.035350,0.008220) (0.036633,0.020068) (0.025047,0.028519) (0.044867,0.034350) (0.025954,0.012370) (0.042088,0.026124) (0.035818,0.045617) (0.052906,0.004729) (0.052886,0.019842) (0.050047,0.028519) (0.050954,0.012370)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a843d5d4fce45ec02fd16454d450bd5c7ee67fe7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4002_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.443310e+01 -1.696949e-04 -3.532686e-03
+1.000000e-02 2.828698e+01 -3.328958e-04 -7.076550e-03
+1.500000e-02 3.937151e+01 -4.665444e-04 -1.081966e-02
+2.000000e-02 4.660708e+01 -5.580312e-04 -1.488588e-02
+2.500000e-02 5.082331e+01 -6.156917e-04 -1.920709e-02
+3.000000e-02 5.341496e+01 -6.538785e-04 -2.365565e-02
+3.500000e-02 5.508583e+01 -6.802418e-04 -2.816230e-02
+4.000000e-02 5.620034e+01 -6.991063e-04 -3.268793e-02
+4.500000e-02 5.694594e+01 -7.126444e-04 -3.721312e-02
+5.000000e-02 5.744251e+01 -7.224169e-04 -4.172453e-02
+5.500000e-02 5.777980e+01 -7.297502e-04 -4.621116e-02
+6.000000e-02 5.801293e+01 -7.353559e-04 -5.066714e-02
+6.500000e-02 5.819189e+01 -7.399938e-04 -5.508651e-02
+7.000000e-02 5.834153e+01 -7.439152e-04 -5.946746e-02
+7.500000e-02 5.849094e+01 -7.475958e-04 -6.380663e-02
+8.000000e-02 5.865815e+01 -7.513083e-04 -6.810239e-02
+8.500000e-02 5.885531e+01 -7.552462e-04 -7.235384e-02
+9.000000e-02 5.909021e+01 -7.595461e-04 -7.656064e-02
+9.500000e-02 5.936715e+01 -7.642980e-04 -8.072287e-02
+1.000000e-01 5.968758e+01 -7.695519e-04 -8.484096e-02
+volume fraction= 0.400239
+fiber_centers_YZ= (0.018524,0.044107) (0.016980,0.013210) (0.010117,0.029458) (0.002906,0.004729) (0.002886,0.019842) (0.003942,0.038510) (0.010350,0.008220) (0.011633,0.020068) (0.000047,0.028519) (0.019867,0.034350) (0.000954,0.012370) (0.017088,0.026124) (0.010818,0.045617) (0.043524,0.044107) (0.041980,0.013210) (0.035117,0.029458) (0.027906,0.004729) (0.027886,0.019842) (0.028942,0.038510) (0.035350,0.008220) (0.036633,0.020068) (0.025047,0.028519) (0.044867,0.034350) (0.025954,0.012370) (0.042088,0.026124) (0.035818,0.045617) (0.052906,0.004729) (0.052886,0.019842) (0.050047,0.028519) (0.050954,0.012370)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f93bcbc9e4a4aca4bbe584658bdf07d46b0a7d07
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.744906e+02 -1.591126e-03 -1.585365e-03
+1.000000e-02 3.485168e+02 -3.171190e-03 -3.159528e-03
+1.500000e-02 5.220811e+02 -4.740315e-03 -4.722614e-03
+2.000000e-02 6.951864e+02 -6.298628e-03 -6.274752e-03
+2.500000e-02 8.678325e+02 -7.846428e-03 -7.816355e-03
+3.000000e-02 1.039972e+03 -9.387561e-03 -9.352666e-03
+3.500000e-02 1.211288e+03 -1.094804e-02 -1.090847e-02
+4.000000e-02 1.381522e+03 -1.254936e-02 -1.249899e-02
+4.500000e-02 1.551078e+03 -1.416252e-02 -1.409870e-02
+5.000000e-02 1.720172e+03 -1.577302e-02 -1.569452e-02
+5.500000e-02 1.888848e+03 -1.737843e-02 -1.728417e-02
+6.000000e-02 2.057119e+03 -1.897814e-02 -1.886708e-02
+6.500000e-02 2.224997e+03 -2.057177e-02 -2.044285e-02
+7.000000e-02 2.392492e+03 -2.215901e-02 -2.201117e-02
+7.500000e-02 2.559612e+03 -2.373957e-02 -2.357174e-02
+8.000000e-02 2.726367e+03 -2.531317e-02 -2.512432e-02
+8.500000e-02 2.892762e+03 -2.687958e-02 -2.666866e-02
+9.000000e-02 3.058806e+03 -2.843860e-02 -2.820456e-02
+9.500000e-02 3.224504e+03 -2.999002e-02 -2.973185e-02
+1.000000e-01 3.389861e+03 -3.153370e-02 -3.125036e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.010813,0.028925) (0.009327,0.013245) (0.016611,0.023707) (0.000312,0.039188) (0.008858,0.020943) (0.016842,0.006730) (0.017200,0.033821) (0.008492,0.036878) (0.001085,0.004309) (0.009045,0.004238) (0.017266,0.015843) (0.020018,0.044782) (0.002970,0.030968) (0.010221,0.045164) (0.002035,0.015831) (0.000604,0.023496) (0.035813,0.028925) (0.034327,0.013245) (0.041611,0.023707) (0.025312,0.039188) (0.033858,0.020943) (0.041842,0.006730) (0.042200,0.033821) (0.033492,0.036878) (0.026085,0.004309) (0.034045,0.004238) (0.042266,0.015843) (0.045018,0.044782) (0.027970,0.030968) (0.035221,0.045164) (0.027035,0.015831) (0.025604,0.023496) (0.050312,0.039188) (0.051085,0.004309) (0.052970,0.030968) (0.052035,0.015831) (0.050604,0.023496)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4bf404d81535693be2da1a2eeb040e9338952625
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 9.749742e+00
+1.000000e-02 1.753676e+01
+1.500000e-02 2.145927e+01
+2.000000e-02 2.332363e+01
+2.500000e-02 2.407260e+01
+3.000000e-02 2.428756e+01
+3.500000e-02 2.429963e+01
+4.000000e-02 2.424244e+01
+4.500000e-02 2.417531e+01
+5.000000e-02 2.412044e+01
+5.500000e-02 2.406432e+01
+6.000000e-02 2.398995e+01
+6.500000e-02 2.388249e+01
+7.000000e-02 2.375713e+01
+7.500000e-02 2.368098e+01
+8.000000e-02 2.367817e+01
+8.500000e-02 2.372046e+01
+9.000000e-02 2.378603e+01
+9.500000e-02 2.387895e+01
+1.000000e-01 2.400440e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.010813,0.028925) (0.009327,0.013245) (0.016611,0.023707) (0.000312,0.039188) (0.008858,0.020943) (0.016842,0.006730) (0.017200,0.033821) (0.008492,0.036878) (0.001085,0.004309) (0.009045,0.004238) (0.017266,0.015843) (0.020018,0.044782) (0.002970,0.030968) (0.010221,0.045164) (0.002035,0.015831) (0.000604,0.023496) (0.035813,0.028925) (0.034327,0.013245) (0.041611,0.023707) (0.025312,0.039188) (0.033858,0.020943) (0.041842,0.006730) (0.042200,0.033821) (0.033492,0.036878) (0.026085,0.004309) (0.034045,0.004238) (0.042266,0.015843) (0.045018,0.044782) (0.027970,0.030968) (0.035221,0.045164) (0.027035,0.015831) (0.025604,0.023496) (0.050312,0.039188) (0.051085,0.004309) (0.052970,0.030968) (0.052035,0.015831) (0.050604,0.023496)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1f52258dcb6574e85754bcc05afcb7ee1c7684d7
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_1_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.142395e+01 -1.963727e-04 -3.090302e-03
+1.000000e-02 4.106310e+01 -3.783666e-04 -6.278582e-03
+1.500000e-02 5.437671e+01 -5.079715e-04 -9.914375e-03
+2.000000e-02 6.222049e+01 -5.896098e-04 -1.398092e-02
+2.500000e-02 6.712944e+01 -6.442895e-04 -1.827649e-02
+3.000000e-02 7.061906e+01 -6.854197e-04 -2.266592e-02
+3.500000e-02 7.336342e+01 -7.192859e-04 -2.708573e-02
+4.000000e-02 7.570974e+01 -7.492423e-04 -3.150245e-02
+4.500000e-02 7.783040e+01 -7.769373e-04 -3.590005e-02
+5.000000e-02 7.983594e+01 -8.035355e-04 -4.026767e-02
+5.500000e-02 8.178779e+01 -8.296634e-04 -4.459969e-02
+6.000000e-02 8.371933e+01 -8.556667e-04 -4.889324e-02
+6.500000e-02 8.564653e+01 -8.817164e-04 -5.314718e-02
+7.000000e-02 8.757557e+01 -9.078786e-04 -5.736138e-02
+7.500000e-02 8.950657e+01 -9.341521e-04 -6.153637e-02
+8.000000e-02 9.143591e+01 -9.604915e-04 -6.567310e-02
+8.500000e-02 9.335812e+01 -9.868259e-04 -6.977277e-02
+9.000000e-02 9.526700e+01 -1.013073e-03 -7.383665e-02
+9.500000e-02 9.715693e+01 -1.039151e-03 -7.786596e-02
+1.000000e-01 9.900931e+01 -1.064774e-03 -8.186372e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.010813,0.028925) (0.009327,0.013245) (0.016611,0.023707) (0.000312,0.039188) (0.008858,0.020943) (0.016842,0.006730) (0.017200,0.033821) (0.008492,0.036878) (0.001085,0.004309) (0.009045,0.004238) (0.017266,0.015843) (0.020018,0.044782) (0.002970,0.030968) (0.010221,0.045164) (0.002035,0.015831) (0.000604,0.023496) (0.035813,0.028925) (0.034327,0.013245) (0.041611,0.023707) (0.025312,0.039188) (0.033858,0.020943) (0.041842,0.006730) (0.042200,0.033821) (0.033492,0.036878) (0.026085,0.004309) (0.034045,0.004238) (0.042266,0.015843) (0.045018,0.044782) (0.027970,0.030968) (0.035221,0.045164) (0.027035,0.015831) (0.025604,0.023496) (0.050312,0.039188) (0.051085,0.004309) (0.052970,0.030968) (0.052035,0.015831) (0.050604,0.023496)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9b00245b275008954e66fd7fa0a8a60a9187f75e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.744918e+02 -1.588414e-03 -1.590837e-03
+1.000000e-02 3.485203e+02 -3.165748e-03 -3.170460e-03
+1.500000e-02 5.220880e+02 -4.732126e-03 -4.738995e-03
+2.000000e-02 6.951977e+02 -6.287675e-03 -6.296572e-03
+2.500000e-02 8.678494e+02 -7.832647e-03 -7.843634e-03
+3.000000e-02 1.039996e+03 -9.370334e-03 -9.385783e-03
+3.500000e-02 1.211320e+03 -1.092647e-02 -1.094780e-02
+4.000000e-02 1.381560e+03 -1.252311e-02 -1.254518e-02
+4.500000e-02 1.551124e+03 -1.413079e-02 -1.415252e-02
+5.000000e-02 1.720229e+03 -1.573533e-02 -1.575632e-02
+5.500000e-02 1.888915e+03 -1.733442e-02 -1.735421e-02
+6.000000e-02 2.057198e+03 -1.892748e-02 -1.894560e-02
+6.500000e-02 2.225088e+03 -2.051415e-02 -2.053009e-02
+7.000000e-02 2.392595e+03 -2.209409e-02 -2.210738e-02
+7.500000e-02 2.559729e+03 -2.366703e-02 -2.367717e-02
+8.000000e-02 2.726497e+03 -2.523271e-02 -2.523920e-02
+8.500000e-02 2.892906e+03 -2.679090e-02 -2.679323e-02
+9.000000e-02 3.058965e+03 -2.834140e-02 -2.833905e-02
+9.500000e-02 3.224677e+03 -2.988402e-02 -2.987648e-02
+1.000000e-01 3.390050e+03 -3.141861e-02 -3.140537e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008101,0.012457) (0.007207,0.045576) (0.000884,0.024952) (0.016977,0.016021) (0.001591,0.016711) (0.016397,0.005578) (0.007473,0.036849) (0.000259,0.004893) (0.008338,0.028846) (0.017131,0.043929) (0.000018,0.040972) (0.000021,0.032789) (0.008167,0.004201) (0.018142,0.024680) (0.016005,0.034769) (0.008302,0.020546) (0.033101,0.012457) (0.032207,0.045576) (0.025884,0.024952) (0.041977,0.016021) (0.026591,0.016711) (0.041397,0.005578) (0.032473,0.036849) (0.025259,0.004893) (0.033338,0.028846) (0.042131,0.043929) (0.025018,0.040972) (0.025021,0.032789) (0.033167,0.004201) (0.043142,0.024680) (0.041005,0.034769) (0.033302,0.020546) (0.050884,0.024952) (0.051591,0.016711) (0.050259,0.004893) (0.050018,0.040972) (0.050021,0.032789)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0ede13510f1c0e607840c5fcd530c360761b8736
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 9.704314e+00
+1.000000e-02 1.741551e+01
+1.500000e-02 2.119008e+01
+2.000000e-02 2.294864e+01
+2.500000e-02 2.371094e+01
+3.000000e-02 2.397050e+01
+3.500000e-02 2.398329e+01
+4.000000e-02 2.386412e+01
+4.500000e-02 2.366997e+01
+5.000000e-02 2.340676e+01
+5.500000e-02 2.306244e+01
+6.000000e-02 2.281155e+01
+6.500000e-02 2.277100e+01
+7.000000e-02 2.277804e+01
+7.500000e-02 2.284205e+01
+8.000000e-02 2.303260e+01
+8.500000e-02 2.329010e+01
+9.000000e-02 2.353413e+01
+9.500000e-02 2.374931e+01
+1.000000e-01 2.395557e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008101,0.012457) (0.007207,0.045576) (0.000884,0.024952) (0.016977,0.016021) (0.001591,0.016711) (0.016397,0.005578) (0.007473,0.036849) (0.000259,0.004893) (0.008338,0.028846) (0.017131,0.043929) (0.000018,0.040972) (0.000021,0.032789) (0.008167,0.004201) (0.018142,0.024680) (0.016005,0.034769) (0.008302,0.020546) (0.033101,0.012457) (0.032207,0.045576) (0.025884,0.024952) (0.041977,0.016021) (0.026591,0.016711) (0.041397,0.005578) (0.032473,0.036849) (0.025259,0.004893) (0.033338,0.028846) (0.042131,0.043929) (0.025018,0.040972) (0.025021,0.032789) (0.033167,0.004201) (0.043142,0.024680) (0.041005,0.034769) (0.033302,0.020546) (0.050884,0.024952) (0.051591,0.016711) (0.050259,0.004893) (0.050018,0.040972) (0.050021,0.032789)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b40f6fa6795f7f021014f185b56ea03959be83d9
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_2_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.221334e+01 -2.033390e-04 -3.027018e-03
+1.000000e-02 4.266800e+01 -3.929146e-04 -6.144522e-03
+1.500000e-02 5.593249e+01 -5.220530e-04 -9.791385e-03
+2.000000e-02 6.328199e+01 -5.985438e-04 -1.391180e-02
+2.500000e-02 6.770987e+01 -6.480092e-04 -1.825635e-02
+3.000000e-02 7.096195e+01 -6.864160e-04 -2.266662e-02
+3.500000e-02 7.372064e+01 -7.202575e-04 -2.707974e-02
+4.000000e-02 7.626730e+01 -7.522385e-04 -3.147048e-02
+4.500000e-02 7.873640e+01 -7.837443e-04 -3.582579e-02
+5.000000e-02 8.121943e+01 -8.156868e-04 -4.013727e-02
+5.500000e-02 8.375329e+01 -8.484382e-04 -4.440154e-02
+6.000000e-02 8.636467e+01 -8.823537e-04 -4.861571e-02
+6.500000e-02 8.906341e+01 -9.175587e-04 -5.277919e-02
+7.000000e-02 9.185060e+01 -9.540800e-04 -5.689242e-02
+7.500000e-02 9.472323e+01 -9.918908e-04 -6.095636e-02
+8.000000e-02 9.767521e+01 -1.030923e-03 -6.497235e-02
+8.500000e-02 1.006884e+02 -1.070942e-03 -6.894323e-02
+9.000000e-02 1.037626e+02 -1.112013e-03 -7.286913e-02
+9.500000e-02 1.068755e+02 -1.153805e-03 -7.675387e-02
+1.000000e-01 1.100078e+02 -1.196227e-03 -8.059870e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.008101,0.012457) (0.007207,0.045576) (0.000884,0.024952) (0.016977,0.016021) (0.001591,0.016711) (0.016397,0.005578) (0.007473,0.036849) (0.000259,0.004893) (0.008338,0.028846) (0.017131,0.043929) (0.000018,0.040972) (0.000021,0.032789) (0.008167,0.004201) (0.018142,0.024680) (0.016005,0.034769) (0.008302,0.020546) (0.033101,0.012457) (0.032207,0.045576) (0.025884,0.024952) (0.041977,0.016021) (0.026591,0.016711) (0.041397,0.005578) (0.032473,0.036849) (0.025259,0.004893) (0.033338,0.028846) (0.042131,0.043929) (0.025018,0.040972) (0.025021,0.032789) (0.033167,0.004201) (0.043142,0.024680) (0.041005,0.034769) (0.033302,0.020546) (0.050884,0.024952) (0.051591,0.016711) (0.050259,0.004893) (0.050018,0.040972) (0.050021,0.032789)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e8505cf0d0e30a4f571f907c145801b585a7975d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.744991e+02 -1.558303e-03 -1.620293e-03
+1.000000e-02 3.485347e+02 -3.105623e-03 -3.229282e-03
+1.500000e-02 5.221092e+02 -4.642085e-03 -4.827092e-03
+2.000000e-02 6.952254e+02 -6.167816e-03 -6.413852e-03
+2.500000e-02 8.678833e+02 -7.683157e-03 -7.989921e-03
+3.000000e-02 1.040036e+03 -9.192500e-03 -9.559811e-03
+3.500000e-02 1.211366e+03 -1.072023e-02 -1.114978e-02
+4.000000e-02 1.381611e+03 -1.228157e-02 -1.278197e-02
+4.500000e-02 1.551181e+03 -1.385104e-02 -1.442699e-02
+5.000000e-02 1.720291e+03 -1.541645e-02 -1.606938e-02
+5.500000e-02 1.888983e+03 -1.697576e-02 -1.770652e-02
+6.000000e-02 2.057270e+03 -1.852844e-02 -1.933776e-02
+6.500000e-02 2.225165e+03 -2.007414e-02 -2.096269e-02
+7.000000e-02 2.392677e+03 -2.161257e-02 -2.258095e-02
+7.500000e-02 2.559815e+03 -2.314348e-02 -2.419223e-02
+8.000000e-02 2.726587e+03 -2.466664e-02 -2.579624e-02
+8.500000e-02 2.893001e+03 -2.618182e-02 -2.739273e-02
+9.000000e-02 3.059063e+03 -2.768886e-02 -2.898145e-02
+9.500000e-02 3.224780e+03 -2.918760e-02 -3.056221e-02
+1.000000e-01 3.390156e+03 -3.067790e-02 -3.213482e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016330,0.028995) (0.000479,0.029560) (0.007995,0.004667) (0.000569,0.045606) (0.012430,0.020525) (0.009901,0.042321) (0.017098,0.045654) (0.000036,0.006624) (0.015780,0.005533) (0.018885,0.036876) (0.005006,0.023016) (0.008649,0.032501) (0.007419,0.013471) (0.016800,0.013952) (0.002491,0.037981) (0.000178,0.016722) (0.041330,0.028995) (0.025479,0.029560) (0.032995,0.004667) (0.025569,0.045606) (0.037430,0.020525) (0.034901,0.042321) (0.042098,0.045654) (0.025036,0.006624) (0.040780,0.005533) (0.043885,0.036876) (0.030006,0.023016) (0.033649,0.032501) (0.032419,0.013471) (0.041800,0.013952) (0.027491,0.037981) (0.025178,0.016722) (0.050479,0.029560) (0.050569,0.045606) (0.050036,0.006624) (0.052491,0.037981) (0.050178,0.016722)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..506c5a6da048c7f87694e4b7f61ec1650a9ddcd4
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 1.005078e+01
+1.000000e-02 1.775133e+01
+1.500000e-02 2.166950e+01
+2.000000e-02 2.345437e+01
+2.500000e-02 2.414542e+01
+3.000000e-02 2.433239e+01
+3.500000e-02 2.422528e+01
+4.000000e-02 2.386093e+01
+4.500000e-02 2.345054e+01
+5.000000e-02 2.338277e+01
+5.500000e-02 2.347562e+01
+6.000000e-02 2.353254e+01
+6.500000e-02 2.369480e+01
+7.000000e-02 2.400259e+01
+7.500000e-02 2.435293e+01
+8.000000e-02 2.466156e+01
+8.500000e-02 2.488781e+01
+9.000000e-02 2.504615e+01
+9.500000e-02 2.518585e+01
+1.000000e-01 2.534804e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016330,0.028995) (0.000479,0.029560) (0.007995,0.004667) (0.000569,0.045606) (0.012430,0.020525) (0.009901,0.042321) (0.017098,0.045654) (0.000036,0.006624) (0.015780,0.005533) (0.018885,0.036876) (0.005006,0.023016) (0.008649,0.032501) (0.007419,0.013471) (0.016800,0.013952) (0.002491,0.037981) (0.000178,0.016722) (0.041330,0.028995) (0.025479,0.029560) (0.032995,0.004667) (0.025569,0.045606) (0.037430,0.020525) (0.034901,0.042321) (0.042098,0.045654) (0.025036,0.006624) (0.040780,0.005533) (0.043885,0.036876) (0.030006,0.023016) (0.033649,0.032501) (0.032419,0.013471) (0.041800,0.013952) (0.027491,0.037981) (0.025178,0.016722) (0.050479,0.029560) (0.050569,0.045606) (0.050036,0.006624) (0.052491,0.037981) (0.050178,0.016722)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..65f0c6ef647db7e357b8384598cd4c24ff982772
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_3_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.033552e+01 -1.824132e-04 -3.268331e-03
+1.000000e-02 3.893633e+01 -3.514078e-04 -6.614172e-03
+1.500000e-02 5.091056e+01 -4.666555e-04 -1.040447e-02
+2.000000e-02 5.752924e+01 -5.346173e-04 -1.460905e-02
+2.500000e-02 6.131229e+01 -5.762488e-04 -1.902948e-02
+3.000000e-02 6.373999e+01 -6.047463e-04 -2.353527e-02
+3.500000e-02 6.548306e+01 -6.263608e-04 -2.806493e-02
+4.000000e-02 6.684681e+01 -6.440571e-04 -3.258950e-02
+4.500000e-02 6.799886e+01 -6.595250e-04 -3.709292e-02
+5.000000e-02 6.903841e+01 -6.737699e-04 -4.156596e-02
+5.500000e-02 7.002405e+01 -6.874188e-04 -4.600320e-02
+6.000000e-02 7.100113e+01 -7.009321e-04 -5.040102e-02
+6.500000e-02 7.198294e+01 -7.143457e-04 -5.475959e-02
+7.000000e-02 7.298698e+01 -7.279066e-04 -5.907726e-02
+7.500000e-02 7.402215e+01 -7.417083e-04 -6.335374e-02
+8.000000e-02 7.509301e+01 -7.558068e-04 -6.758908e-02
+8.500000e-02 7.620103e+01 -7.702297e-04 -7.178358e-02
+9.000000e-02 7.734572e+01 -7.849820e-04 -7.593772e-02
+9.500000e-02 7.852522e+01 -8.000537e-04 -8.005208e-02
+1.000000e-01 7.973633e+01 -8.154219e-04 -8.412740e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.016330,0.028995) (0.000479,0.029560) (0.007995,0.004667) (0.000569,0.045606) (0.012430,0.020525) (0.009901,0.042321) (0.017098,0.045654) (0.000036,0.006624) (0.015780,0.005533) (0.018885,0.036876) (0.005006,0.023016) (0.008649,0.032501) (0.007419,0.013471) (0.016800,0.013952) (0.002491,0.037981) (0.000178,0.016722) (0.041330,0.028995) (0.025479,0.029560) (0.032995,0.004667) (0.025569,0.045606) (0.037430,0.020525) (0.034901,0.042321) (0.042098,0.045654) (0.025036,0.006624) (0.040780,0.005533) (0.043885,0.036876) (0.030006,0.023016) (0.033649,0.032501) (0.032419,0.013471) (0.041800,0.013952) (0.027491,0.037981) (0.025178,0.016722) (0.050479,0.029560) (0.050569,0.045606) (0.050036,0.006624) (0.052491,0.037981) (0.050178,0.016722)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d86a6b4d53380bbaf417300b004acfbd3189878e
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.744858e+02 -1.574998e-03 -1.606112e-03
+1.000000e-02 3.485089e+02 -3.138975e-03 -3.200929e-03
+1.500000e-02 5.220722e+02 -4.692054e-03 -4.784577e-03
+2.000000e-02 6.951780e+02 -6.234362e-03 -6.357186e-03
+2.500000e-02 8.678267e+02 -7.766163e-03 -7.919163e-03
+3.000000e-02 1.039972e+03 -9.290932e-03 -9.475634e-03
+3.500000e-02 1.211294e+03 -1.083479e-02 -1.105113e-02
+4.000000e-02 1.381532e+03 -1.241701e-02 -1.266423e-02
+4.500000e-02 1.551096e+03 -1.400898e-02 -1.428842e-02
+5.000000e-02 1.720200e+03 -1.559758e-02 -1.590919e-02
+5.500000e-02 1.888887e+03 -1.718068e-02 -1.752402e-02
+6.000000e-02 2.057170e+03 -1.875773e-02 -1.913229e-02
+6.500000e-02 2.225061e+03 -2.032836e-02 -2.073360e-02
+7.000000e-02 2.392570e+03 -2.189227e-02 -2.232763e-02
+7.500000e-02 2.559705e+03 -2.344920e-02 -2.391407e-02
+8.000000e-02 2.726475e+03 -2.499890e-02 -2.549267e-02
+8.500000e-02 2.892887e+03 -2.654114e-02 -2.706317e-02
+9.000000e-02 3.058947e+03 -2.807574e-02 -2.862537e-02
+9.500000e-02 3.224662e+03 -2.960251e-02 -3.017909e-02
+1.000000e-01 3.390037e+03 -3.112131e-02 -3.172415e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.007803,0.021269) (0.017257,0.044906) (0.000124,0.017139) (0.001056,0.026811) (0.000280,0.044002) (0.008286,0.029957) (0.007152,0.013364) (0.016706,0.006605) (0.008555,0.005442) (0.015294,0.026333) (0.001284,0.035366) (0.000800,0.007541) (0.008949,0.037794) (0.008972,0.045794) (0.016513,0.035153) (0.015183,0.014637) (0.032803,0.021269) (0.042257,0.044906) (0.025124,0.017139) (0.026056,0.026811) (0.025280,0.044002) (0.033286,0.029957) (0.032152,0.013364) (0.041706,0.006605) (0.033555,0.005442) (0.040294,0.026333) (0.026284,0.035366) (0.025800,0.007541) (0.033949,0.037794) (0.033972,0.045794) (0.041513,0.035153) (0.040183,0.014637) (0.050124,0.017139) (0.051056,0.026811) (0.050280,0.044002) (0.051284,0.035366) (0.050800,0.007541)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a14aa4c2d30983e6a7240922cda124910dbeee88
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 9.813919e+00
+1.000000e-02 1.741834e+01
+1.500000e-02 2.124358e+01
+2.000000e-02 2.297972e+01
+2.500000e-02 2.373238e+01
+3.000000e-02 2.399015e+01
+3.500000e-02 2.399571e+01
+4.000000e-02 2.385457e+01
+4.500000e-02 2.361421e+01
+5.000000e-02 2.329417e+01
+5.500000e-02 2.297244e+01
+6.000000e-02 2.281907e+01
+6.500000e-02 2.278262e+01
+7.000000e-02 2.281749e+01
+7.500000e-02 2.293995e+01
+8.000000e-02 2.313776e+01
+8.500000e-02 2.336845e+01
+9.000000e-02 2.357767e+01
+9.500000e-02 2.376746e+01
+1.000000e-01 2.394892e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.007803,0.021269) (0.017257,0.044906) (0.000124,0.017139) (0.001056,0.026811) (0.000280,0.044002) (0.008286,0.029957) (0.007152,0.013364) (0.016706,0.006605) (0.008555,0.005442) (0.015294,0.026333) (0.001284,0.035366) (0.000800,0.007541) (0.008949,0.037794) (0.008972,0.045794) (0.016513,0.035153) (0.015183,0.014637) (0.032803,0.021269) (0.042257,0.044906) (0.025124,0.017139) (0.026056,0.026811) (0.025280,0.044002) (0.033286,0.029957) (0.032152,0.013364) (0.041706,0.006605) (0.033555,0.005442) (0.040294,0.026333) (0.026284,0.035366) (0.025800,0.007541) (0.033949,0.037794) (0.033972,0.045794) (0.041513,0.035153) (0.040183,0.014637) (0.050124,0.017139) (0.051056,0.026811) (0.050280,0.044002) (0.051284,0.035366) (0.050800,0.007541)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c268b26e171a629b5cd7cd1ddea44f062334001c
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_4_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.327862e+01 -2.113747e-04 -2.972096e-03
+1.000000e-02 4.442454e+01 -4.068077e-04 -6.049182e-03
+1.500000e-02 5.812831e+01 -5.408418e-04 -9.653541e-03
+2.000000e-02 6.598367e+01 -6.227667e-04 -1.372507e-02
+2.500000e-02 7.080063e+01 -6.764727e-04 -1.803443e-02
+3.000000e-02 7.426091e+01 -7.173205e-04 -2.242921e-02
+3.500000e-02 7.714546e+01 -7.526113e-04 -2.683758e-02
+4.000000e-02 7.981668e+01 -7.858529e-04 -3.122598e-02
+4.500000e-02 8.243413e+01 -8.187321e-04 -3.557844e-02
+5.000000e-02 8.507602e+01 -8.521620e-04 -3.988652e-02
+5.500000e-02 8.778696e+01 -8.865824e-04 -4.414664e-02
+6.000000e-02 9.058336e+01 -9.222295e-04 -4.835694e-02
+6.500000e-02 9.347463e+01 -9.592553e-04 -5.251659e-02
+7.000000e-02 9.643966e+01 -9.973766e-04 -5.662881e-02
+7.500000e-02 9.947252e+01 -1.036572e-03 -6.069451e-02
+8.000000e-02 1.025562e+02 -1.076662e-03 -6.471608e-02
+8.500000e-02 1.056693e+02 -1.117419e-03 -6.869636e-02
+9.000000e-02 1.087880e+02 -1.158578e-03 -7.263844e-02
+9.500000e-02 1.118878e+02 -1.199866e-03 -7.654543e-02
+1.000000e-01 1.149454e+02 -1.241012e-03 -8.042025e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.007803,0.021269) (0.017257,0.044906) (0.000124,0.017139) (0.001056,0.026811) (0.000280,0.044002) (0.008286,0.029957) (0.007152,0.013364) (0.016706,0.006605) (0.008555,0.005442) (0.015294,0.026333) (0.001284,0.035366) (0.000800,0.007541) (0.008949,0.037794) (0.008972,0.045794) (0.016513,0.035153) (0.015183,0.014637) (0.032803,0.021269) (0.042257,0.044906) (0.025124,0.017139) (0.026056,0.026811) (0.025280,0.044002) (0.033286,0.029957) (0.032152,0.013364) (0.041706,0.006605) (0.033555,0.005442) (0.040294,0.026333) (0.026284,0.035366) (0.025800,0.007541) (0.033949,0.037794) (0.033972,0.045794) (0.041513,0.035153) (0.040183,0.014637) (0.050124,0.017139) (0.051056,0.026811) (0.050280,0.044002) (0.051284,0.035366) (0.050800,0.007541)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_11.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_11.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e3770e7e184675e58d11efb51712442536b0511
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_11.txt
@@ -0,0 +1,24 @@
+Strain_11 Stress_11 Strain_22 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 1.744859e+02 -1.594479e-03 -1.587386e-03
+1.000000e-02 3.485095e+02 -3.177790e-03 -3.163632e-03
+1.500000e-02 5.220734e+02 -4.750056e-03 -4.728864e-03
+2.000000e-02 6.951803e+02 -6.311407e-03 -6.283211e-03
+2.500000e-02 8.678303e+02 -7.862194e-03 -7.826961e-03
+3.000000e-02 1.039978e+03 -9.406878e-03 -9.363856e-03
+3.500000e-02 1.211303e+03 -1.097100e-02 -1.091881e-02
+4.000000e-02 1.381541e+03 -1.257433e-02 -1.251126e-02
+4.500000e-02 1.551106e+03 -1.418868e-02 -1.411355e-02
+5.000000e-02 1.720213e+03 -1.579997e-02 -1.571208e-02
+5.500000e-02 1.888901e+03 -1.740583e-02 -1.730456e-02
+6.000000e-02 2.057187e+03 -1.900567e-02 -1.889042e-02
+6.500000e-02 2.225080e+03 -2.059911e-02 -2.046929e-02
+7.000000e-02 2.392592e+03 -2.218584e-02 -2.204087e-02
+7.500000e-02 2.559730e+03 -2.376556e-02 -2.360486e-02
+8.000000e-02 2.726503e+03 -2.533802e-02 -2.516103e-02
+8.500000e-02 2.892917e+03 -2.690298e-02 -2.670915e-02
+9.000000e-02 3.058981e+03 -2.846022e-02 -2.824903e-02
+9.500000e-02 3.224699e+03 -3.000957e-02 -2.978050e-02
+1.000000e-01 3.390077e+03 -3.155085e-02 -3.130341e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.000042,0.023899) (0.017234,0.045466) (0.016882,0.037534) (0.007944,0.018467) (0.008938,0.004706) (0.007532,0.027226) (0.000096,0.004769) (0.013553,0.013052) (0.016874,0.020416) (0.017280,0.005710) (0.000493,0.031945) (0.007502,0.044112) (0.000504,0.039756) (0.015905,0.029801) (0.007692,0.034999) (0.000025,0.013932) (0.025042,0.023899) (0.042234,0.045466) (0.041882,0.037534) (0.032944,0.018467) (0.033938,0.004706) (0.032532,0.027226) (0.025096,0.004769) (0.038553,0.013052) (0.041874,0.020416) (0.042280,0.005710) (0.025493,0.031945) (0.032502,0.044112) (0.025504,0.039756) (0.040905,0.029801) (0.032692,0.034999) (0.025025,0.013932) (0.050042,0.023899) (0.050096,0.004769) (0.050493,0.031945) (0.050504,0.039756) (0.050025,0.013932)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_12.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_12.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f9081700b0165e09cf9ec37913a58737c9356caa
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_12.txt
@@ -0,0 +1,24 @@
+Strain_12 Stress_12
+0.000000e+00 0.000000e+00
+5.000000e-03 9.593057e+00
+1.000000e-02 1.745316e+01
+1.500000e-02 2.138537e+01
+2.000000e-02 2.320460e+01
+2.500000e-02 2.395013e+01
+3.000000e-02 2.416381e+01
+3.500000e-02 2.411150e+01
+4.000000e-02 2.392011e+01
+4.500000e-02 2.365663e+01
+5.000000e-02 2.343410e+01
+5.500000e-02 2.334460e+01
+6.000000e-02 2.339781e+01
+6.500000e-02 2.354478e+01
+7.000000e-02 2.371524e+01
+7.500000e-02 2.386302e+01
+8.000000e-02 2.399114e+01
+8.500000e-02 2.411538e+01
+9.000000e-02 2.425066e+01
+9.500000e-02 2.441519e+01
+1.000000e-01 2.454863e+01
+volume fraction= 0.492602
+fiber_centers_YZ= (0.000042,0.023899) (0.017234,0.045466) (0.016882,0.037534) (0.007944,0.018467) (0.008938,0.004706) (0.007532,0.027226) (0.000096,0.004769) (0.013553,0.013052) (0.016874,0.020416) (0.017280,0.005710) (0.000493,0.031945) (0.007502,0.044112) (0.000504,0.039756) (0.015905,0.029801) (0.007692,0.034999) (0.000025,0.013932) (0.025042,0.023899) (0.042234,0.045466) (0.041882,0.037534) (0.032944,0.018467) (0.033938,0.004706) (0.032532,0.027226) (0.025096,0.004769) (0.038553,0.013052) (0.041874,0.020416) (0.042280,0.005710) (0.025493,0.031945) (0.032502,0.044112) (0.025504,0.039756) (0.040905,0.029801) (0.032692,0.034999) (0.025025,0.013932) (0.050042,0.023899) (0.050096,0.004769) (0.050493,0.031945) (0.050504,0.039756) (0.050025,0.013932)
diff --git a/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_22.txt b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6a0e17b06ad1f8a469fdfa8c49a0d14c3167111d
--- /dev/null
+++ b/data_generation/shahriar_modified_2025_12/RVE_Datasets/GPP_0.4926_5_22.txt
@@ -0,0 +1,24 @@
+Strain_22 Stress_22 Strain_11 Strain_33
+0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
+5.000000e-03 2.120928e+01 -1.948136e-04 -3.100091e-03
+1.000000e-02 4.088347e+01 -3.776289e-04 -6.273890e-03
+1.500000e-02 5.396941e+01 -5.047687e-04 -9.937176e-03
+2.000000e-02 6.131876e+01 -5.805369e-04 -1.406790e-02
+2.500000e-02 6.572654e+01 -6.290202e-04 -1.842681e-02
+3.000000e-02 6.874756e+01 -6.641990e-04 -2.287452e-02
+3.500000e-02 7.109568e+01 -6.927771e-04 -2.734481e-02
+4.000000e-02 7.311745e+01 -7.181899e-04 -3.180381e-02
+4.500000e-02 7.500288e+01 -7.423743e-04 -3.623265e-02
+5.000000e-02 7.684489e+01 -7.663128e-04 -4.062190e-02
+5.500000e-02 7.868921e+01 -7.905194e-04 -4.496704e-02
+6.000000e-02 8.056653e+01 -8.153102e-04 -4.926591e-02
+6.500000e-02 8.247350e+01 -8.405561e-04 -5.352045e-02
+7.000000e-02 8.441595e+01 -8.663646e-04 -5.773039e-02
+7.500000e-02 8.639174e+01 -8.926851e-04 -6.189677e-02
+8.000000e-02 8.839531e+01 -9.194310e-04 -6.602081e-02
+8.500000e-02 9.040801e+01 -9.463039e-04 -7.010554e-02
+9.000000e-02 9.243824e+01 -9.735273e-04 -7.414922e-02
+9.500000e-02 9.446393e+01 -1.000792e-03 -7.815483e-02
+1.000000e-01 9.646982e+01 -1.027937e-03 -8.212391e-02
+volume fraction= 0.492602
+fiber_centers_YZ= (0.000042,0.023899) (0.017234,0.045466) (0.016882,0.037534) (0.007944,0.018467) (0.008938,0.004706) (0.007532,0.027226) (0.000096,0.004769) (0.013553,0.013052) (0.016874,0.020416) (0.017280,0.005710) (0.000493,0.031945) (0.007502,0.044112) (0.000504,0.039756) (0.015905,0.029801) (0.007692,0.034999) (0.000025,0.013932) (0.025042,0.023899) (0.042234,0.045466) (0.041882,0.037534) (0.032944,0.018467) (0.033938,0.004706) (0.032532,0.027226) (0.025096,0.004769) (0.038553,0.013052) (0.041874,0.020416) (0.042280,0.005710) (0.025493,0.031945) (0.032502,0.044112) (0.025504,0.039756) (0.040905,0.029801) (0.032692,0.034999) (0.025025,0.013932) (0.050042,0.023899) (0.050096,0.004769) (0.050493,0.031945) (0.050504,0.039756) (0.050025,0.013932)
diff --git a/hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/best_model.pt b/hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/best_model.pt
new file mode 100644
index 0000000000000000000000000000000000000000..b09c5434e5f60299cbd0602daa4e3369e22ad052
--- /dev/null
+++ b/hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/best_model.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8aafe2a67097e06eea3fc09caa22e76acdef941c9aa8696e101c933e074c7c17
+size 108633654
diff --git a/hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/training_config.json b/hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/training_config.json
new file mode 100644
index 0000000000000000000000000000000000000000..fe4c633c645ea8d4834e8b211244aaa250f84c02
--- /dev/null
+++ b/hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/training_config.json
@@ -0,0 +1,44 @@
+{
+ "data_dir": "/project/luofeng/feiyang/MaterialGeneration/data_generation/processed_dataset/config_1/",
+ "output_dir": "./checkpoints/config_1_continuous_100_epoch/",
+ "experiment_dir": "./checkpoints/config_1_continuous_100_epoch/exp_20260114_164540",
+ "timestamp": "20260114_164540",
+ "batch_size": 32,
+ "num_epochs": 100,
+ "learning_rate": 0.0001,
+ "T": 100,
+ "n_max_layer": 10,
+ "beta_start": 0.0001,
+ "beta_end": 0.02,
+ "lambda_angle": 1.0,
+ "lambda_material": 1.0,
+ "lambda_vf_category": 1.0,
+ "lambda_layer": 1.0,
+ "save_every": 5,
+ "normalization_method": "zscore",
+ "random_seed": 533,
+ "device": "cuda:1",
+ "gen_eval_n_samples": 100,
+ "gen_eval_every": 5,
+ "use_discrete_angles": false,
+ "visualize_matches": true,
+ "save_visualizations": true,
+ "n_visualization_samples": 200,
+ "warmup_ratio": 0.01,
+ "log_every_n_steps": 100,
+ "model_config": {
+ "n_conditions": 15,
+ "n_materials": 4,
+ "n_vf_categories": 5,
+ "n_max_layer": 10,
+ "d_model": 256,
+ "n_heads": 4,
+ "n_layers": 6,
+ "dropout": 0.0
+ },
+ "mask_ids": {
+ "material": 4,
+ "vf_category": 5,
+ "layer": 2
+ }
+}
\ No newline at end of file
diff --git a/hybrid_diffusion_material_generation/dataset.py b/hybrid_diffusion_material_generation/dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa2e34dd406b589f8ba14b4af8fc841d77c74f21
--- /dev/null
+++ b/hybrid_diffusion_material_generation/dataset.py
@@ -0,0 +1,525 @@
+"""
+PyTorch Dataset for loading processed material design data.
+
+This module provides a Dataset class that:
+1. Loads processed data from .npz files
+2. Normalizes coefficients using min/max/std statistics
+3. Converts angles from degrees to radians
+4. Constructs inputs for MaterialHybridDenoiser model
+"""
+
+import numpy as np
+import torch
+from torch.utils.data import Dataset
+from typing import Dict, Optional, Tuple
+import math
+from load_processed_data import load_processed_data, load_metadata
+
+
+class MaterialDesignDataset(Dataset):
+ """
+ PyTorch Dataset for material design data.
+
+ Loads processed data and constructs inputs for MaterialHybridDenoiser:
+ - material_t: (B,) material type
+ - vf_category_t: (B,) volume fraction category (0-4)
+ - layer_t: (B, L) layer alive/dead mask
+ - angle_t: (B, L, 1) angles in radians
+ - cond: (B, C) normalized polynomial coefficients
+ """
+
+ def __init__(
+ self,
+ data_dir: str,
+ split: str = 'train',
+ n_max_layer: int = 10,
+ normalize_coefficients: bool = True,
+ normalize_method: str = 'minmax', # 'minmax' or 'zscore'
+ device: Optional[torch.device] = None,
+ use_discrete_angles: bool = True, # If True, use discrete angle categories
+ angle_resolution: float = 1.0 # Resolution in degrees for angle discretization
+ ):
+ """
+ Initialize dataset.
+
+ Args:
+ data_dir: Directory containing processed data
+ split: 'train' or 'test'
+ n_max_layer: Maximum number of layers (L in model). If None, will be determined from metadata.
+ normalize_coefficients: Whether to normalize coefficients
+ normalize_method: 'minmax' or 'zscore' normalization
+ device: Device to move tensors to (None = CPU)
+ use_discrete_angles: If True, use discrete angle categories
+ angle_resolution: Resolution in degrees for angle discretization (default: 1.0)
+ """
+ self.data_dir = data_dir
+ self.split = split
+ self.normalize_coefficients = normalize_coefficients
+ self.normalize_method = normalize_method
+ self.device = device or torch.device('cpu')
+ self.use_discrete_angles = use_discrete_angles
+ self.angle_resolution = angle_resolution
+
+ # Load data
+ print(f"Loading {split} data from {data_dir}...")
+ self.data = load_processed_data(data_dir, split)
+ self.metadata = load_metadata(data_dir)
+
+ # Determine n_max_layer from metadata if not provided
+ if n_max_layer is None:
+ n_max_layer = self.metadata.get('max_layers', 10)
+ print(f" Using max_layers from metadata: {n_max_layer}")
+ self.n_max_layer = n_max_layer
+
+ # Get angle range from metadata
+ angle_min_raw = float(self.metadata.get('angle_min', 0.0))
+ angle_max_raw = float(self.metadata.get('angle_max', 90.0))
+
+ # Generate angle categories based on resolution
+ if use_discrete_angles:
+ # Floor the min and ceil the max to ensure full coverage
+ self.angle_min = np.floor(angle_min_raw / angle_resolution) * angle_resolution
+ self.angle_max = np.ceil(angle_max_raw / angle_resolution) * angle_resolution
+
+ # Generate categories from floored min to ceiled max with given resolution
+ num_categories = int((self.angle_max - self.angle_min) / angle_resolution) + 1
+ self.angle_categories = np.linspace(self.angle_min, self.angle_max, num_categories, dtype=np.float32)
+ self.n_angle_categories = len(self.angle_categories)
+ print(f" Angle categories: {self.n_angle_categories} categories from {self.angle_min}° to {self.angle_max}° (resolution: {angle_resolution}°, raw range: {angle_min_raw}° to {angle_max_raw}°)")
+ else:
+ self.angle_min = angle_min_raw
+ self.angle_max = angle_max_raw
+ self.angle_categories = None
+ self.n_angle_categories = None
+
+ # Get normalization statistics from metadata (must use metadata for consistency)
+ self.coeff_min = np.array(self.metadata['coefficient_min'], dtype=np.float32)
+ self.coeff_max = np.array(self.metadata['coefficient_max'], dtype=np.float32)
+ self.coeff_mean = np.array(self.metadata['coefficient_mean'], dtype=np.float32)
+ self.coeff_std = np.array(self.metadata['coefficient_std'], dtype=np.float32)
+
+ # Verify metadata has required statistics
+ if normalize_method == 'zscore':
+ if len(self.coeff_mean) == 0 or len(self.coeff_std) == 0:
+ raise ValueError("Metadata must contain 'coefficient_mean' and 'coefficient_std' for zscore normalization")
+ elif normalize_method == 'minmax':
+ if len(self.coeff_min) == 0 or len(self.coeff_max) == 0:
+ raise ValueError("Metadata must contain 'coefficient_min' and 'coefficient_max' for minmax normalization")
+
+ # Note: Angles are converted from degrees to radians only (no normalization)
+
+ # Dataset size
+ self.n_samples = len(self.data['polynomial_coefficients'])
+
+ print(f" Loaded {self.n_samples} samples")
+ print(f" Coefficient normalization: {normalize_method if normalize_coefficients else 'none'}")
+ print(f" Max layers: {self.n_max_layer}")
+
+ def __len__(self) -> int:
+ return self.n_samples
+
+ def _normalize_coefficients(self, coeffs: np.ndarray) -> np.ndarray:
+ """
+ Normalize polynomial coefficients.
+
+ Args:
+ coeffs: Coefficients of shape [5, degree]
+
+ Returns:
+ Normalized coefficients of shape [5*degree]
+ """
+ coeffs_flat = coeffs.flatten() # [5*degree]
+
+ if not self.normalize_coefficients:
+ return coeffs_flat
+
+ if self.normalize_method == 'minmax':
+ # Min-max normalization to [0, 1]
+ range_vals = self.coeff_max - self.coeff_min
+ range_vals = np.where(range_vals == 0, 1.0, range_vals) # Avoid division by zero
+ normalized = (coeffs_flat - self.coeff_min) / range_vals
+ elif self.normalize_method == 'zscore':
+ # Z-score normalization (mean=0, std=1)
+ std_vals = np.where(self.coeff_std == 0, 1.0, self.coeff_std) # Avoid division by zero
+ normalized = (coeffs_flat - self.coeff_mean) / std_vals
+ else:
+ raise ValueError(f"Unknown normalization method: {self.normalize_method}")
+
+ return normalized.astype(np.float32)
+
+ def _degrees_to_radians(self, angles_deg: np.ndarray) -> np.ndarray:
+ """
+ Convert angles from degrees to radians (no normalization).
+
+ Args:
+ angles_deg: Angles in degrees
+
+ Returns:
+ Angles in radians (raw conversion, not normalized)
+ """
+ return np.deg2rad(angles_deg).astype(np.float32)
+
+ def _volume_fraction_to_category(self, volume_fraction: float) -> int:
+ """
+ Convert volume fraction to category index.
+
+ Categories:
+ 0: 0.0924
+ 1: 0.2155
+ 2: 0.3079
+ 3: 0.4002
+ 4: 0.4926
+
+ Args:
+ volume_fraction: Volume fraction value
+
+ Returns:
+ Category index (0-4)
+ """
+ vf_categories = np.array([0.0924, 0.2155, 0.3079, 0.4002, 0.4926], dtype=np.float32)
+ distances = np.abs(vf_categories - volume_fraction)
+ category_idx = np.argmin(distances)
+ return int(category_idx)
+
+ def _degrees_to_category(self, angles_deg: np.ndarray) -> np.ndarray:
+ """
+ Convert angles from degrees to discrete categories.
+
+ Categories are dynamically generated from angle_min to angle_max with angle_resolution.
+
+ Args:
+ angles_deg: Angles in degrees
+
+ Returns:
+ Category indices as int64
+ """
+ if self.angle_categories is None:
+ raise ValueError("Angle categories not initialized. Set use_discrete_angles=True.")
+
+ # Find closest category for each angle
+ angles_deg = np.asarray(angles_deg, dtype=np.float32)
+ # Reshape for broadcasting
+ if angles_deg.ndim == 0:
+ angles_deg = angles_deg.reshape(1)
+
+ # Compute distances to each category
+ distances = np.abs(angles_deg[:, np.newaxis] - self.angle_categories[np.newaxis, :])
+ # Find index of closest category
+ category_indices = np.argmin(distances, axis=1)
+
+ return category_indices.astype(np.int64)
+
+ def _category_to_degrees(self, category_indices: np.ndarray) -> np.ndarray:
+ """
+ Convert category indices back to degrees.
+
+ Args:
+ category_indices: Category indices (int64)
+
+ Returns:
+ Angles in degrees (float32)
+ """
+ if self.angle_categories is None:
+ raise ValueError("Angle categories not initialized. Set use_discrete_angles=True.")
+
+ category_indices = np.asarray(category_indices, dtype=np.int64)
+ # Clip to valid range
+ category_indices = np.clip(category_indices, 0, len(self.angle_categories) - 1)
+ return self.angle_categories[category_indices].astype(np.float32)
+
+ def _prepare_layers(
+ self,
+ stacking_sequence: np.ndarray,
+ n_layers: int,
+ use_discrete_angles: bool = True
+ ) -> Tuple[np.ndarray, np.ndarray]:
+ """
+ Prepare layer data: angles and alive/dead mask.
+
+ Args:
+ stacking_sequence: Array of angles in degrees [n_layers]
+ n_layers: Actual number of layers
+ use_discrete_angles: If True, convert angles to discrete categories; if False, use continuous radians
+
+ Returns:
+ Tuple of (angles, layer_mask):
+ - angles: [n_max_layer] discrete category indices (if use_discrete_angles) or [n_max_layer, 1] radians (if not)
+ - layer_mask: [n_max_layer] 1 for alive, 0 for dead
+ """
+ if use_discrete_angles:
+ # Convert to discrete categories
+ angles_cat = self._degrees_to_category(stacking_sequence[:n_layers])
+ n_angle_categories = self.n_angle_categories
+ dead_category = n_angle_categories # Category n_angle_categories = dead layer
+
+ # Pad or truncate to n_max_layer
+ if n_layers < self.n_max_layer:
+ # Pad with dead_category (category n_angle_categories = dead layer)
+ angles_padded = np.full(self.n_max_layer, dead_category, dtype=np.int64)
+ angles_padded[:n_layers] = angles_cat
+ layer_mask = np.zeros(self.n_max_layer, dtype=np.int64)
+ layer_mask[:n_layers] = 1 # 1 = alive
+ else:
+ # Truncate
+ angles_padded = angles_cat[:self.n_max_layer]
+ layer_mask = np.ones(self.n_max_layer, dtype=np.int64)
+
+ return angles_padded, layer_mask
+ else:
+ # Original continuous version (for backward compatibility)
+ # Convert to radians (no normalization)
+ angles_rad = self._degrees_to_radians(stacking_sequence[:n_layers])
+
+ # Pad or truncate to n_max_layer
+ if n_layers < self.n_max_layer:
+ # Pad with zeros
+ angles_padded = np.zeros(self.n_max_layer, dtype=np.float32)
+ angles_padded[:n_layers] = angles_rad
+ layer_mask = np.zeros(self.n_max_layer, dtype=np.int64)
+ layer_mask[:n_layers] = 1 # 1 = alive
+ else:
+ # Truncate
+ angles_padded = angles_rad[:self.n_max_layer]
+ layer_mask = np.ones(self.n_max_layer, dtype=np.int64)
+
+ # Reshape angles to [n_max_layer, 1]
+ angles_padded = angles_padded.reshape(-1, 1)
+
+ return angles_padded, layer_mask
+
+ def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]:
+ """
+ Get a single sample.
+
+ Args:
+ idx: Sample index
+
+ Returns:
+ Dictionary with model inputs:
+ - material_t: (1,) material type
+ - vf_category_t: (1,) volume fraction category (0-4)
+ - layer_t: (n_max_layer,) layer alive/dead mask
+ - angle_t: (n_max_layer, 1) angles in radians (converted from degrees, not normalized)
+ - cond: (5*degree,) normalized polynomial coefficients
+ """
+ # Extract data
+ coeffs = self.data['polynomial_coefficients'][idx] # [5, degree]
+ material_type = self.data['material_type'][idx] # scalar
+ volume_fraction = self.data['volume_fraction'][idx] # scalar
+ stacking_sequence = self.data['stacking_sequence'][idx] # [max_layers]
+ n_layers = self.data['stacking_sequence_lengths'][idx] # scalar
+
+ # Convert volume fraction to category (0-4)
+ vf_category = self._volume_fraction_to_category(volume_fraction)
+
+ # Normalize coefficients
+ cond = self._normalize_coefficients(coeffs) # [5*degree]
+
+ # Prepare layers
+ angles, layer_mask = self._prepare_layers(stacking_sequence, n_layers, use_discrete_angles=self.use_discrete_angles)
+
+ # Convert to tensors (keep on CPU, let DataLoader handle device transfer)
+ if self.use_discrete_angles:
+ angle_dtype = torch.long
+ else:
+ angle_dtype = torch.float32
+
+ sample = {
+ 'material_t': torch.tensor([material_type], dtype=torch.long),
+ 'vf_category_t': torch.tensor([vf_category], dtype=torch.long), # Changed from nfiber_t
+ 'layer_t': torch.tensor(layer_mask, dtype=torch.long),
+ 'angle_t': torch.tensor(angles, dtype=angle_dtype),
+ 'cond': torch.tensor(cond, dtype=torch.float32)
+ }
+
+ return sample
+
+ def get_batch(
+ self,
+ indices: Optional[np.ndarray] = None,
+ batch_size: Optional[int] = None
+ ) -> Dict[str, torch.Tensor]:
+ """
+ Get a batch of samples (for testing/debugging).
+
+ Args:
+ indices: Optional array of indices to sample
+ batch_size: Optional batch size (uses all if None)
+
+ Returns:
+ Batched dictionary with model inputs
+ """
+ if indices is None:
+ if batch_size is None:
+ indices = np.arange(len(self))
+ else:
+ indices = np.random.choice(len(self), batch_size, replace=False)
+
+ # Collect samples
+ samples = [self[i] for i in indices]
+
+ # Stack into batch
+ batch = {
+ 'material_t': torch.stack([s['material_t'] for s in samples]).squeeze(-1), # (B,)
+ 'vf_category_t': torch.stack([s['vf_category_t'] for s in samples]).squeeze(-1), # (B,)
+ 'layer_t': torch.stack([s['layer_t'] for s in samples]), # (B, L)
+ 'angle_t': torch.stack([s['angle_t'] for s in samples]), # (B, L, 1)
+ 'cond': torch.stack([s['cond'] for s in samples]) # (B, C)
+ }
+
+ return batch
+
+
+def project_conditions(cond: torch.Tensor, d_model: int, proj_layer: Optional[torch.nn.Module] = None) -> Tuple[torch.Tensor, torch.nn.Module]:
+ """
+ Project condition vectors to model dimension for cross-attention.
+
+ The model expects cond_tokens: (B, n_conditions, d_model) for cross-attention,
+ but the dataset provides cond: (B, n_conditions). This function projects
+ each coefficient to d_model dimension.
+
+ Args:
+ cond: Condition tensor of shape (B, n_conditions)
+ d_model: Model dimension
+ proj_layer: Optional pre-created projection layer (for reuse)
+
+ Returns:
+ Tuple of (cond_tokens, proj_layer):
+ - cond_tokens: (B, n_conditions, d_model)
+ - proj_layer: The projection layer (for reuse in next calls)
+ """
+ import torch.nn as nn
+
+ # Create or reuse projection layer
+ if proj_layer is None:
+ proj_layer = nn.Linear(1, d_model).to(cond.device)
+
+ # Expand and project: (B, n_conditions) -> (B, n_conditions, 1) -> (B, n_conditions, d_model)
+ cond_expanded = cond.unsqueeze(-1) # (B, n_conditions, 1)
+ cond_tokens = proj_layer(cond_expanded) # (B, n_conditions, d_model)
+
+ return cond_tokens, proj_layer
+
+
+def create_dataloader(
+ data_dir: str,
+ split: str = 'train',
+ batch_size: int = 32,
+ shuffle: bool = True,
+ n_max_layer: int = 24,
+ normalize_coefficients: bool = True,
+ normalize_method: str = 'minmax',
+ num_workers: int = 0,
+ device: Optional[torch.device] = None,
+ use_discrete_angles: bool = True, # If True, use discrete angle categories
+ angle_resolution: float = 1.0 # Resolution in degrees for angle discretization
+):
+ """
+ Create a DataLoader for the dataset.
+
+ Args:
+ data_dir: Directory containing processed data
+ split: 'train' or 'test'
+ batch_size: Batch size
+ shuffle: Whether to shuffle data
+ n_max_layer: Maximum number of layers (None = use metadata)
+ normalize_coefficients: Whether to normalize coefficients
+ normalize_method: 'minmax' or 'zscore'
+ num_workers: Number of worker processes
+ device: Device to move tensors to
+ use_discrete_angles: If True, use discrete angle categories
+ angle_resolution: Resolution in degrees for angle discretization (default: 1.0)
+
+ Returns:
+ DataLoader instance
+ """
+ from torch.utils.data import DataLoader
+
+ dataset = MaterialDesignDataset(
+ data_dir=data_dir,
+ split=split,
+ n_max_layer=n_max_layer,
+ normalize_coefficients=normalize_coefficients,
+ normalize_method=normalize_method,
+ device=device,
+ use_discrete_angles=use_discrete_angles,
+ angle_resolution=angle_resolution
+ )
+
+ # Custom collate function to handle batching
+ def collate_fn(batch):
+ """Collate function to stack samples into batch."""
+ return {
+ 'material_t': torch.stack([s['material_t'] for s in batch]).squeeze(-1), # (B,)
+ 'vf_category_t': torch.stack([s['vf_category_t'] for s in batch]).squeeze(-1), # (B,)
+ 'layer_t': torch.stack([s['layer_t'] for s in batch]), # (B, L)
+ 'angle_t': torch.stack([s['angle_t'] for s in batch]), # (B, L, 1)
+ 'cond': torch.stack([s['cond'] for s in batch]) # (B, C)
+ }
+
+ dataloader = DataLoader(
+ dataset,
+ batch_size=batch_size,
+ shuffle=shuffle,
+ num_workers=num_workers,
+ collate_fn=collate_fn,
+ pin_memory=False # Disable pin_memory to avoid device conflicts
+ )
+
+ return dataloader
+
+
+if __name__ == "__main__":
+ # Example usage
+ import os
+
+ data_dir = "processed_data"
+
+ if not os.path.exists(data_dir):
+ print(f"Error: {data_dir} does not exist!")
+ print("Please run process_all_datasets.py first.")
+ else:
+ print("="*80)
+ print("Testing MaterialDesignDataset")
+ print("="*80)
+
+ # Create dataset
+ dataset = MaterialDesignDataset(
+ data_dir=data_dir,
+ split='train',
+ n_max_layer=10,
+ normalize_coefficients=True,
+ normalize_method='zscore'
+ )
+
+ # Get a single sample
+ print("\nSingle sample:")
+ sample = dataset[0]
+ for key, value in sample.items():
+ print(f" {key}: {value.shape} {value.dtype}")
+
+ # Get a batch
+ print("\nBatch of 3 samples:")
+ batch = dataset.get_batch(batch_size=3)
+ for key, value in batch.items():
+ print(f" {key}: {value.shape} {value.dtype}")
+
+ # Test DataLoader
+ print("\nDataLoader test:")
+ dataloader = create_dataloader(
+ data_dir=data_dir,
+ split='train',
+ batch_size=4,
+ shuffle=False,
+ n_max_layer=10
+ )
+
+ for i, batch in enumerate(dataloader):
+ print(f"\nBatch {i+1}:")
+ for key, value in batch.items():
+ print(f" {key}: {value.shape} {value.dtype}")
+ if i >= 1: # Just show first 2 batches
+ break
+
+ print("\n" + "="*80)
+ print("Dataset test complete!")
diff --git a/hybrid_diffusion_material_generation/load_processed_data.py b/hybrid_diffusion_material_generation/load_processed_data.py
new file mode 100644
index 0000000000000000000000000000000000000000..f90a5fdcf29414f244f4db63f88f70ff9838b8b4
--- /dev/null
+++ b/hybrid_diffusion_material_generation/load_processed_data.py
@@ -0,0 +1,180 @@
+"""
+Utility script to load and inspect processed dataset files.
+
+This demonstrates how to load the preprocessed data for model training.
+"""
+
+import numpy as np
+import json
+import os
+
+
+def load_processed_data(data_dir: str, split: str = 'train'):
+ """
+ Load processed dataset from .npz file.
+
+ Args:
+ data_dir: Directory containing processed data
+ split: 'train' or 'test'
+
+ Returns:
+ Dictionary containing all data arrays
+ """
+ filepath = os.path.join(data_dir, f"{split}_data.npz")
+ data = np.load(filepath)
+
+ # Convert to dictionary
+ result = {key: data[key] for key in data.files}
+ return result
+
+
+def load_metadata(data_dir: str):
+ """
+ Load metadata from JSON file.
+
+ Args:
+ data_dir: Directory containing processed data
+
+ Returns:
+ Dictionary containing metadata
+ """
+ filepath = os.path.join(data_dir, "metadata.json")
+ with open(filepath, 'r') as f:
+ metadata = json.load(f)
+ return metadata
+
+
+def get_minmax_statistics(data_dir: str):
+ """
+ Get min/max/std statistics from metadata.
+
+ Args:
+ data_dir: Directory containing processed data
+
+ Returns:
+ Dictionary with min/max/std statistics:
+ - coefficient_min: List of (5 * degree) min values
+ - coefficient_max: List of (5 * degree) max values
+ - coefficient_std: List of (5 * degree) std values
+ - layers_min, layers_max: Min/max number of layers
+ - fibers_min, fibers_max: Min/max number of fibers
+ - volume_fraction_min, volume_fraction_max: Min/max volume fraction
+ - angle_min, angle_max: Min/max angles in degrees
+ """
+ metadata = load_metadata(data_dir)
+
+ return {
+ 'coefficient_min': metadata.get('coefficient_min', []),
+ 'coefficient_max': metadata.get('coefficient_max', []),
+ 'coefficient_std': metadata.get('coefficient_std', []),
+ 'layers_min': metadata.get('layers_min'),
+ 'layers_max': metadata.get('layers_max'),
+ 'fibers_min': metadata.get('fibers_min'),
+ 'fibers_max': metadata.get('fibers_max'),
+ 'volume_fraction_min': metadata.get('volume_fraction_min'),
+ 'volume_fraction_max': metadata.get('volume_fraction_max'),
+ 'angle_min': metadata.get('angle_min'),
+ 'angle_max': metadata.get('angle_max')
+ }
+
+
+def print_data_summary(data_dir: str):
+ """
+ Print summary of processed data.
+
+ Args:
+ data_dir: Directory containing processed data
+ """
+ print("="*80)
+ print("PROCESSED DATA SUMMARY")
+ print("="*80)
+
+ # Load metadata
+ metadata = load_metadata(data_dir)
+
+ print(f"\nDataset Statistics:")
+ print(f" Total samples: {metadata['n_samples']}")
+ print(f" Train samples: {metadata['n_train']}")
+ print(f" Test samples: {metadata['n_test']}")
+ print(f" Polynomial degree: {metadata['polynomial_degree']}")
+ print(f" Max layers: {metadata['max_layers']}")
+ print(f" Max fibers: {metadata['max_fibers']}")
+
+ # Load train data
+ train_data = load_processed_data(data_dir, 'train')
+
+ print(f"\nTrain Data Shapes:")
+ for key, value in train_data.items():
+ print(f" {key}: {value.shape} (dtype: {value.dtype})")
+
+ # Load test data
+ test_data = load_processed_data(data_dir, 'test')
+
+ print(f"\nTest Data Shapes:")
+ for key, value in test_data.items():
+ print(f" {key}: {value.shape} (dtype: {value.dtype})")
+
+ # Material type distribution
+ print(f"\nMaterial Type Distribution (Train):")
+ unique, counts = np.unique(train_data['material_type'], return_counts=True)
+ material_names = {0: 'CPP', 1: 'CHDPE', 2: 'GPP', 3: 'GHDPE'}
+ for mat_id, count in zip(unique, counts):
+ print(f" {material_names[mat_id]} (id={mat_id}): {count} samples")
+
+ print(f"\nMaterial Type Distribution (Test):")
+ unique, counts = np.unique(test_data['material_type'], return_counts=True)
+ for mat_id, count in zip(unique, counts):
+ print(f" {material_names[mat_id]} (id={mat_id}): {count} samples")
+
+ # Print min/max/std statistics
+ print(f"\nMin/Max/Std Statistics:")
+ print(f" Polynomial coefficients:")
+ print(f" Min: {len(metadata.get('coefficient_min', []))} values")
+ print(f" Max: {len(metadata.get('coefficient_max', []))} values")
+ print(f" Std: {len(metadata.get('coefficient_std', []))} values")
+ print(f" Layers: {metadata.get('layers_min', 'N/A')} to {metadata.get('layers_max', 'N/A')}")
+ print(f" Fibers: {metadata.get('fibers_min', 'N/A')} to {metadata.get('fibers_max', 'N/A')}")
+ print(f" Volume fraction: {metadata.get('volume_fraction_min', 'N/A'):.6f} to {metadata.get('volume_fraction_max', 'N/A'):.6f}")
+ print(f" Angles: {metadata.get('angle_min', 'N/A'):.2f}° to {metadata.get('angle_max', 'N/A'):.2f}°")
+
+ print("\n" + "="*80)
+
+
+if __name__ == "__main__":
+ import argparse
+
+ parser = argparse.ArgumentParser(description="Load and inspect processed data")
+ parser.add_argument(
+ "--data_dir",
+ type=str,
+ default="processed_data",
+ help="Directory containing processed data"
+ )
+
+ args = parser.parse_args()
+
+ if not os.path.exists(args.data_dir):
+ print(f"Error: Directory {args.data_dir} does not exist!")
+ print("Please run process_all_datasets.py first.")
+ else:
+ print_data_summary(args.data_dir)
+
+ # Example: Load a single sample
+ print("\n" + "="*80)
+ print("EXAMPLE: Loading a single sample")
+ print("="*80)
+
+ train_data = load_processed_data(args.data_dir, 'train')
+
+ # Get first sample
+ idx = 0
+ print(f"\nSample {idx}:")
+ print(f" Polynomial coefficients shape: {train_data['polynomial_coefficients'][idx].shape}")
+ print(f" Material type: {train_data['material_type'][idx]}")
+ print(f" Number of fibers: {train_data['number_of_fibers'][idx]}")
+ print(f" Volume fraction: {train_data['volume_fraction'][idx]:.6f}")
+ print(f" Stacking sequence length: {train_data['stacking_sequence_lengths'][idx]}")
+ print(f" Stacking sequence: {train_data['stacking_sequence'][idx][:train_data['stacking_sequence_lengths'][idx]]}")
+ print(f" Fiber centers length: {train_data['fiber_center_lengths'][idx]}")
+ print(f" Fiber centers shape: {train_data['fiber_centers_YZ'][idx][:train_data['fiber_center_lengths'][idx]].shape}")
+
diff --git a/hybrid_diffusion_material_generation/models.py b/hybrid_diffusion_material_generation/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..dc2014ee42e7f4bf5c4235923e92af62ffe7b97d
--- /dev/null
+++ b/hybrid_diffusion_material_generation/models.py
@@ -0,0 +1,400 @@
+import torch
+import torch.nn as nn
+from typing import Dict, Tuple
+from dataclasses import dataclass
+import math
+
+
+# =========================
+# Config
+# =========================
+
+@dataclass
+class ModelConfig:
+ # problem sizes
+ n_conditions: int = 8
+ n_materials: int = 10
+ n_vf_categories: int = 5 # Volume fraction categories: 0.0924, 0.2155, 0.3079, 0.4002, 0.4926
+ n_max_layer: int = 24
+
+ # model architecture
+ d_model: int = 256
+ n_heads: int = 4
+ n_layers: int = 6
+ dropout: float = 0.0
+
+ # angle is in radians, limited to (-pi/2, pi/2)
+
+# =========================
+# Model
+# =========================
+
+def timestep_embedding(t: torch.Tensor, dim: int) -> torch.Tensor:
+ """
+ Sinusoidal timestep embedding. t: (B,)
+ """
+ half = dim // 2
+ freqs = torch.exp(-math.log(10000) * torch.arange(0, half, device=t.device) / half)
+ args = t.float().unsqueeze(1) * freqs.unsqueeze(0)
+ emb = torch.cat([torch.cos(args), torch.sin(args)], dim=1)
+ if dim % 2 == 1:
+ emb = torch.cat([emb, torch.zeros_like(emb[:, :1])], dim=1)
+ return emb # (B, dim)
+
+class SelfCrossAttnBlock(nn.Module):
+ def __init__(self, d_model, n_heads, dropout=0.0):
+ super().__init__()
+ self.self_attn = nn.MultiheadAttention(
+ d_model, n_heads, dropout=dropout, batch_first=True
+ )
+ self.cross_attn = nn.MultiheadAttention(
+ d_model, n_heads, dropout=dropout, batch_first=True
+ )
+ self.ff = nn.Sequential(
+ nn.Linear(d_model, 4 * d_model),
+ nn.SiLU(),
+ nn.Linear(4 * d_model, d_model),
+ )
+
+ self.ln1 = nn.LayerNorm(d_model)
+ self.ln2 = nn.LayerNorm(d_model)
+ self.ln3 = nn.LayerNorm(d_model)
+
+ def forward(self, x, cond_tokens, key_padding_mask=None):
+ """
+ x: (B, N, d) ← material + nfiber + angle tokens
+ cond_tokens:(B, M, d) ← condition tokens
+ key_padding_mask: (B, N) optional padding mask (True = mask out, False = keep)
+ """
+ # self-attention (within tokens)
+ x = self.ln1(x + self.self_attn(x, x, x, key_padding_mask=key_padding_mask)[0])
+
+ # cross-attention (tokens attend to conditions)
+ x = self.ln2(x + self.cross_attn(x, cond_tokens, cond_tokens)[0])
+
+ # feed-forward
+ x = self.ln3(x + self.ff(x))
+ return x
+
+class MaterialHybridDenoiser(nn.Module):
+ """
+ Inputs:
+ material_t: (B,) in [0..n_materials-1] or MASK
+ vf_category_t: (B,) in [0..4] volume fraction category or MASK
+ layer_t: (B,L) in {0,1} or MASK
+ Note: When use_discrete_angles=True, layer_t is redundant (derived from angle_t,
+ where angle_t==n_angle_categories means dead layer). The model ignores layer_emb
+ in this case and only uses angle_emb.
+ angle_t: (B,L) discrete category indices [0..n_angle_categories-1] or MASK (if use_discrete_angles)
+ OR (B,L,1) continuous (if not use_discrete_angles)
+ When discrete: category n_angle_categories = dead layer, n_angle_categories+1 = MASK
+ cond: (B,C) continuous
+ t: (B,) timestep
+
+ Outputs:
+ material logits: (B, n_materials)
+ vf_category_logits: (B, 5) # 5 volume fraction categories
+ layer logits: (B,L,2) # alive/dead (only if not use_discrete_angles)
+ angle_logits: (B,L,n_angle_categories+1) # discrete angle categories + dead (if use_discrete_angles)
+ OR angle: (B,L,1) # angle in radians, range (0, pi/2) (if not use_discrete_angles)
+ """
+ def __init__(self, cfg: ModelConfig, mask_ids: Dict[str, int], use_discrete_angles: bool = True, n_angle_categories: int = 7):
+ super().__init__()
+ self.cfg = cfg
+ self.L = cfg.n_max_layer
+ d = cfg.d_model
+ self.mask_ids = mask_ids
+ self.use_discrete_angles = use_discrete_angles
+ self.n_angle_categories = n_angle_categories # 7 categories: 0, 15, 30, 45, 60, 75, 90 degrees
+
+ # +1 to include mask token for material
+ self.material_emb = nn.Embedding(cfg.n_materials + 1, d)
+ # vf_category: 5 categories (0-4) plus mask; we allocate 6
+ self.vf_category_emb = nn.Embedding(cfg.n_vf_categories + 1, d)
+
+ if use_discrete_angles:
+ # Angle categories: 0, 15, 30, 45, 60, 75, 90 degrees (7 categories)
+ # Category 7: dead layer
+ # Category 8: mask token
+ # Total: n_angle_categories (7) + 1 (dead) + 1 (mask) = 9
+ # Note: layer state is encoded in angle_emb (category 7 = dead), so no separate layer_emb needed
+ self.angle_emb = nn.Embedding(n_angle_categories + 2, d)
+ self.layer_emb = None # Not needed when using discrete angles
+ else:
+ # layer token: {MASK, 0, 1} => 3 (only needed for continuous angles)
+ self.layer_emb = nn.Embedding(3, d)
+ self.angle_in = nn.Linear(1, d)
+
+ # Condition projection (TRAINED).
+ # We represent each scalar condition coefficient as a token embedding of size d_model.
+ # Input cond can be either:
+ # - (B, C): raw condition vector (preferred; gets projected here)
+ # - (B, C, d): already-projected condition tokens (backward-compatible)
+ # Use separate projection for each condition to allow condition-specific transformations
+ self.cond_proj = nn.ModuleList([
+ nn.Linear(1, d) for _ in range(cfg.n_conditions)
+ ])
+
+ self.blocks = nn.ModuleList([
+ SelfCrossAttnBlock(d, cfg.n_heads, cfg.dropout)
+ for _ in range(cfg.n_layers)
+ ])
+
+ # Positional embeddings for entire sequence: material (pos 0) + vf_category (pos 1) + layers (pos 2 to 2+L-1)
+ # This replaces role embeddings - position encodes both role and location
+ # Needed to enforce that dead tokens must be at the end of the sequence
+ self.pos_emb = nn.Embedding(2 + cfg.n_max_layer, d)
+
+ self.t_proj = nn.Linear(d, d)
+
+ enc_layer = nn.TransformerEncoderLayer(
+ d_model=d,
+ nhead=cfg.n_heads,
+ dropout=cfg.dropout,
+ batch_first=True,
+ )
+ self.encoder = nn.TransformerEncoder(enc_layer, num_layers=cfg.n_layers)
+ self.ln = nn.LayerNorm(d)
+
+ self.material_head = nn.Linear(d, cfg.n_materials)
+ self.vf_category_head = nn.Linear(d, cfg.n_vf_categories) # 5 volume fraction categories
+ if use_discrete_angles:
+ # Combined angle+layer logits: n_angle_categories for angles + 1 for dead layer = n_angle_categories + 1
+ # Categories 0 to n_angle_categories-1: angle categories (0, 15, 30, 45, 60, 75, 90 degrees)
+ # Category n_angle_categories: dead layer
+ self.angle_head = nn.Linear(d, n_angle_categories + 1)
+ self.layer_head = None # Not needed when using discrete angles
+ else:
+ self.layer_head = nn.Linear(d, 2) # alive/dead for continuous mode
+ self.angle_head = nn.Linear(d, 1)
+
+ def forward(self, material_t, vf_category_t, layer_t, angle_t, cond, t):
+ B, L = layer_t.shape
+ assert L == self.L
+
+ # Project conditions if provided as raw scalars (B, C)
+ if cond.dim() == 2:
+ # Apply condition-specific projections: each condition gets its own transformation
+ cond_list = []
+ for i in range(cond.shape[1]):
+ cond_list.append(self.cond_proj[i](cond[:, i:i+1].unsqueeze(-1))) # (B, 1, d)
+ cond = torch.cat(cond_list, dim=1) # (B, C, d)
+
+ # global tokens as a 2-token "prefix"
+ g_mat = self.material_emb(material_t).unsqueeze(1) # (B,1,d)
+ g_vf = self.vf_category_emb(vf_category_t).unsqueeze(1) # (B,1,d)
+
+ # per-layer tokens
+ # NOTE: Positional embeddings are critical - they allow the model to enforce
+ # that dead tokens (category 7) must appear at the end of the sequence.
+ # Without positional info, the model can't distinguish positions and dead tokens
+ # could appear anywhere, which doesn't match the data structure.
+ if self.use_discrete_angles:
+ # angle_t is (B, L) with category indices
+ # Layer state is encoded in angle_emb (category 7 = dead), so no layer_emb needed
+ layer_h = self.angle_emb(angle_t) # (B, L, d)
+ else:
+ # angle_t is (B, L, 1) continuous
+ # For continuous angles, layer and angle are separate, so we need both embeddings
+ layer_h = self.layer_emb(layer_t) + self.angle_in(angle_t) # (B,L,d)
+
+ h = torch.cat([g_mat, g_vf, layer_h], dim=1) # (B, 2+L, d)
+
+ # Add positional embeddings to entire sequence
+ # Position 0: material token, Position 1: vf_category token, Positions 2+: layer tokens
+ # This replaces role embeddings - position encodes both role and location
+ pos_indices = torch.arange(2 + self.L, device=h.device) # (2+L,)
+ h = h + self.pos_emb(pos_indices).unsqueeze(0) # (B, 2+L, d)
+
+ # add timestep + conditions
+ t_emb = timestep_embedding(t, h.size(-1)) # (B,d)
+ h = h + self.t_proj(t_emb).unsqueeze(1)
+
+ # Create key padding mask to enforce that tokens after first dead token are invalid
+ # This ensures dead tokens must be at the end of the sequence
+ # key_padding_mask: (B, N) where True = mask out, False = keep
+ key_padding_mask = None
+ if self.use_discrete_angles:
+ # Find first dead token position for each batch
+ # angle_t shape: (B, L), dead_category = n_angle_categories
+ dead_category = self.n_angle_categories
+ is_dead = (angle_t == dead_category) # (B, L)
+
+ # Find first dead position for each batch (or L if no dead tokens)
+ first_dead_pos = torch.zeros(B, dtype=torch.long, device=angle_t.device)
+ for b in range(B):
+ dead_positions = torch.where(is_dead[b])[0]
+ if len(dead_positions) > 0:
+ first_dead_pos[b] = dead_positions[0].item() + 2 # +2 for global tokens offset
+ else:
+ first_dead_pos[b] = 2 + L # No dead tokens, mask nothing
+
+ # Create key padding mask: (B, N) where N = 2 + L
+ # Mask out positions >= first_dead_pos (only for layer tokens, keep global tokens)
+ N = 2 + L
+ key_padding_mask = torch.zeros(B, N, dtype=torch.bool, device=h.device)
+ for b in range(B):
+ first_invalid = first_dead_pos[b].item()
+ if first_invalid < 2 + L: # Only mask if there are dead tokens
+ # Mask out invalid layer token positions (>= first_invalid)
+ # True means mask out, so set positions >= first_invalid to True
+ key_padding_mask[b, first_invalid:] = True
+ # Keep global tokens (positions 0, 1) always unmasked
+ key_padding_mask[b, :2] = False
+
+ for block in self.blocks:
+ h = block(h, cond, key_padding_mask=key_padding_mask)
+
+ h = self.ln(h)
+
+ if self.use_discrete_angles:
+ # Combined angle+layer output: logits for angle categories + dead layer
+ # Categories 0 to n_angle_categories-1: angle categories
+ # Category n_angle_categories: dead layer
+ angle_logits = self.angle_head(h[:, 2:]) # (B, L, n_angle_categories + 1)
+ out = {
+ "material_logits": self.material_head(h[:, 0]), # (B, n_materials)
+ "vf_category_logits": self.vf_category_head(h[:, 1]), # (B, 5)
+ "angle_logits": angle_logits, # (B,L,n_angle_categories+1)
+ }
+ else:
+ # Angle output: apply sigmoid and scale by pi/2 to get range (0, pi/2)
+ angle_raw = self.angle_head(h[:, 2:]) # (B,L,1)
+ angle = torch.sigmoid(angle_raw) * (math.pi / 2) # (B,L,1) in radians
+ out = {
+ "material_logits": self.material_head(h[:, 0]), # (B, n_materials)
+ "vf_category_logits": self.vf_category_head(h[:, 1]), # (B, 5)
+ "layer_logits": self.layer_head(h[:, 2:]), # (B,L,2)
+ "angle": angle, # (B,L,1) in radians, range (0, pi/2)
+ }
+ return out
+
+# -------------------------
+# MAIN: Dummy input demo
+# -------------------------
+
+if __name__ == "__main__":
+ torch.manual_seed(0)
+ device = "cuda" if torch.cuda.is_available() else "cpu"
+
+ B = 2
+ L = 6
+
+ # Create model config
+ cfg = ModelConfig(
+ n_conditions=4,
+ n_materials=5,
+ n_fiber_max=10,
+ n_max_layer=L,
+ d_model=128,
+ n_heads=4,
+ n_layers=3,
+ dropout=0.0
+ )
+
+ # Define mask IDs (typically the last valid ID + 1)
+ mask_ids = {
+ "material": cfg.n_materials, # 5 = MASK for material
+ "nfiber": cfg.n_fiber_max + 1, # 11 = MASK for nfiber
+ "layer": 2 # 2 = MASK for layer (0=dead, 1=alive, 2=MASK)
+ }
+
+ # Create model
+ model = MaterialHybridDenoiser(cfg, mask_ids).to(device)
+
+ # dummy inputs
+ material_t = torch.tensor([mask_ids["material"], 2], device=device) # First is MASK, second is material 2
+ nfiber_t = torch.tensor([mask_ids["nfiber"], 4], device=device) # First is MASK, second is 4 fibers
+ layer_t = torch.tensor(
+ [[mask_ids["layer"], mask_ids["layer"], mask_ids["layer"], 1, 1, 1], # First 3 are MASK, rest are alive
+ [mask_ids["layer"], mask_ids["layer"], 1, 1, 1, 1]], # First 2 are MASK, rest are alive
+ device=device
+ )
+ angle_t = torch.randn(B, L, 1, device=device)
+
+ # Condition should be (B, n_conditions, d_model) for cross-attention
+ cond = torch.randn(B, cfg.n_conditions, cfg.d_model, device=device)
+ t = torch.randint(0, 100, (B,), device=device)
+
+ # Test permutation invariance
+ print("\n=== Testing Permutation Invariance ===")
+ print("Note: All layer tokens have the same role embedding (role 2), but self-attention")
+ print(" is still position-dependent because tokens at different positions see different neighbors.\n")
+
+ # Original forward pass
+ model.eval()
+ with torch.no_grad():
+ out_original = model(material_t, nfiber_t, layer_t, angle_t, cond, t)
+
+ # Test 1: Permute only angle_t (creates MISMATCH with layer_t)
+ torch.manual_seed(33)
+ perm_indices = torch.randperm(L)
+ angle_t_perm = angle_t[:, perm_indices, :]
+
+ with torch.no_grad():
+ out_perm_angle_only = model(material_t, nfiber_t, layer_t, angle_t_perm, cond, t)
+
+ print(f"1. Permuting ONLY angle_t (creates mismatch with layer_t):")
+ print(f" Permutation: {perm_indices.tolist()}")
+ print(f" Original angle[0]: {out_original['angle'][0, :, 0].tolist()}")
+ print(f" Permuted angle[0]: {out_perm_angle_only['angle'][0, :, 0].tolist()}")
+ print(f" -> Different outputs because angle_t and layer_t are misaligned!\n")
+
+ # Test 2: Permute both angle_t AND layer_t together (they stay aligned)
+ layer_t_perm = layer_t[:, perm_indices]
+
+ with torch.no_grad():
+ out_perm_both = model(material_t, nfiber_t, layer_t_perm, angle_t_perm, cond, t)
+
+ print(f"2. Permuting BOTH angle_t AND layer_t together (they stay aligned):")
+ print(f" Original angle[0]: {out_original['angle'][0, :, 0].tolist()}")
+ print(f" Permuted angle[0]: {out_perm_both['angle'][0, :, 0].tolist()}")
+ print(f" Expected (original[perm]): {out_original['angle'][0, perm_indices, 0].tolist()}")
+
+ # Check if outputs are just permuted
+ diff = torch.abs(out_original['angle'][0, perm_indices, 0] - out_perm_both['angle'][0, :, 0])
+ print(f" Difference: Max={diff.max().item():.6f}, Mean={diff.mean().item():.6f}")
+ print(f" -> Outputs are permuted (difference ~0), BUT model is still position-dependent!")
+ print(f" -> Even with same role embedding, self-attention sees different neighbors at different positions.\n")
+
+ # Test 3: Show that position matters even with identical inputs
+ # Create identical layer tokens (same layer_t and angle_t for all layers)
+ layer_t_identical = torch.ones(B, L, dtype=torch.long, device=device) # All alive
+ angle_t_identical = torch.ones(B, L, 1, device=device) * 0.5 # All same angle
+
+ with torch.no_grad():
+ out_identical = model(material_t, nfiber_t, layer_t_identical, angle_t_identical, cond, t)
+
+ print(f"3. Testing with IDENTICAL layer tokens (same layer_t=1, same angle_t=0.5 for all):")
+ print(f" All layers have same role embedding, same layer state, same angle input")
+ print(f" Output angles[0]: {out_identical['angle'][0, :, 0].tolist()}")
+ angle_std = out_identical['angle'][0, :, 0].std().item()
+ print(f" Std dev of outputs: {angle_std:.6f}")
+ if angle_std > 0.001:
+ print(f" -> Different outputs despite identical inputs!")
+ print(f" -> This proves position matters (self-attention is position-dependent)\n")
+ else:
+ print(f" -> Outputs are identical (model is position-invariant for this case)\n")
+
+ # Use the original output for display
+ out = out_original
+
+ # print outputs
+ print("\n=== Model Outputs ===")
+ for k, v in out.items():
+ print(f"{k:20s} shape = {tuple(v.shape)}")
+ if k == "material_logits":
+ print(" material logits:", v)
+ if k == "angle":
+ print(f" angle range: [{v.min().item():.4f}, {v.max().item():.4f}] radians")
+ print(f" angle range: [{v.min().item() * 180 / math.pi:.2f}°, {v.max().item() * 180 / math.pi:.2f}°] degrees")
+
+ print("\n=== Model Config ===")
+ print(f"n_conditions: {cfg.n_conditions}")
+ print(f"n_materials: {cfg.n_materials}")
+ print(f"n_fiber_max: {cfg.n_fiber_max}")
+ print(f"n_max_layer: {cfg.n_max_layer}")
+ print(f"d_model: {cfg.d_model}")
+ print(f"n_heads: {cfg.n_heads}")
+ print(f"n_layers: {cfg.n_layers}")
+ print(f"angle range: (-π/2, π/2) radians = (-90°, 90°) degrees")
\ No newline at end of file
diff --git a/hybrid_diffusion_material_generation/poster/column_hybrid_diffusion.md b/hybrid_diffusion_material_generation/poster/column_hybrid_diffusion.md
new file mode 100644
index 0000000000000000000000000000000000000000..2ab1e38aa2e61c76c46599805c06c8ded5655118
--- /dev/null
+++ b/hybrid_diffusion_material_generation/poster/column_hybrid_diffusion.md
@@ -0,0 +1,124 @@
+## Hybrid Diffusion for Conditional Material Design (1 poster column)
+
+### Problem / Goal
+- **Goal**: Generate *manufacturable laminate designs* (material + volume fraction + stacking sequence) that match a **target mechanical response**.
+- **Input (conditioning signal)**: A set of stress/strain curves summarized as **5 no-intercept polynomial fits** (degree \(d\); in training config \(d=3\Rightarrow 15\) coefficients).
+- **Output (design variables)**:
+ - **Material**: 4 classes (`CPP`, `CHDPE`, `GPP`, `GHDPE`)
+ - **Volume fraction**: 5-category discrete variable \([0.0924, 0.2155, 0.3079, 0.4002, 0.4926]\)
+ - **Stacking sequence**: up to \(L=10\) layers, represented by
+ - **Layer alive/dead mask** \( \in \{0,1\}^L\)
+ - **Layer angles** (continuous, radians) \( \in (0, \pi/2)^L\)
+
+### Conditioning: 5 polynomial relationships (degree \(d\), no intercept)
+From each dataset curve file, we fit \(d\)-degree polynomials for:
+- **(1)** \( \varepsilon_{11} \rightarrow \sigma_{11} \)
+- **(2)** \( \varepsilon_{11} \rightarrow \varepsilon_{22} \)
+- **(3)** \( \varepsilon_{22} \rightarrow \sigma_{22} \)
+- **(4)** \( \varepsilon_{22} \rightarrow \varepsilon_{11} \)
+- **(5)** \( \varepsilon_{12} \rightarrow \sigma_{12} \)
+
+Flatten the coefficients into a vector of length \(5d\), then **normalize** (e.g., z-score) using training metadata.
+
+### Method: Hybrid Diffusion + Transformer Denoiser
+- **Hybrid diffusion**:
+ - **Discrete mask diffusion** for **material**, **vf-category**, **layer mask** (randomly replace tokens with a learned MASK via a diffusion schedule).
+ - **Gaussian diffusion** for **continuous angles** (DDPM-style noise + denoise).
+- **Denoiser network**: a Transformer-style sequence model with
+ - **Tokens**: `[material] [vf-category] [layer_1] … [layer_L]`
+ - **Cross-attention** to projected condition tokens (each scalar coefficient becomes a learned token embedding)
+ - **Timestep embedding** added to all tokens
+ - **Heads**: logits for discrete variables + continuous angle regression (angles constrained to \( (0,\pi/2)\) via sigmoid scaling)
+
+### Hybrid diffusion mathematics (discrete + continuous)
+Let \(t\in\{0,\dots,T-1\}\), \(\beta_t\in(0,1)\), \(\alpha_t = 1-\beta_t\), and \(\bar\alpha_t=\prod_{s=0}^{t}\alpha_s\).
+
+**Discrete mask diffusion** (for material, vf-category, layer mask):
+- Forward noising (mask corruption) for token \(x_0\):
+ \[
+ q(x_t \mid x_0)=
+ \begin{cases}
+ x_0 & \text{with prob. } \bar\alpha_t \\
+ \text{MASK} & \text{with prob. } 1-\bar\alpha_t
+ \end{cases}
+ \]
+- Model outputs logits \(\mathrm{logits}_\theta(x_t,c,t)\) and is trained to predict \(x_0\) with cross-entropy:
+ \[
+ \mathcal{L}_{disc} = \mathrm{CE}\big(\mathrm{logits}_\theta,\; x_0\big).
+ \]
+
+**Continuous DDPM** (for angles \(a\), per-layer, continuous in radians):
+- Forward noising:
+ \[
+ q(a_t \mid a_0)=\sqrt{\bar\alpha_t}\,a_0 + \sqrt{1-\bar\alpha_t}\,\epsilon,\quad \epsilon\sim\mathcal{N}(0,I).
+ \]
+- Model predicts the *clean* angles \(\hat a_0=f_\theta(a_t,x_t,c,t)\). The reverse DDPM step uses the implied noise
+ \[
+ \hat\epsilon = \frac{a_t - \sqrt{\bar\alpha_t}\,\hat a_0}{\sqrt{1-\bar\alpha_t}}
+ \]
+ and samples
+ \[
+ p_\theta(a_{t-1}\mid a_t)=\mathcal{N}\!\Big(\mu_\theta(a_t,t),\;\beta_t I\Big),
+ \quad
+ \mu_\theta = \frac{1}{\sqrt{\alpha_t}}\!\left(a_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\hat\epsilon\right).
+ \]
+- Training loss (only on alive layers):
+ \[
+ \mathcal{L}_{angle} = \lVert \hat a_0 - a_0\rVert_2^2.
+ \]
+
+**Total objective** (weighted sum):
+\[
+\mathcal{L}=\lambda_m\mathcal{L}_{mat}+\lambda_{vf}\mathcal{L}_{vf}+\lambda_\ell\mathcal{L}_{layer}+\lambda_a\mathcal{L}_{angle}.
+\]
+
+### Training Objective
+- **Classification losses (CE)**: material, vf-category, layer mask
+- **Regression loss (MSE)**: angles (only on alive layers)
+- **Total**: weighted sum \( \mathcal{L}=\lambda_m\mathcal{L}_m+\lambda_{vf}\mathcal{L}_{vf}+\lambda_\ell\mathcal{L}_{layer}+\lambda_a\mathcal{L}_{angle}\)
+
+### Sampling (Inference)
+- **Initialize**: discrete variables as MASK; angles as Gaussian noise.
+- **Iterate \(t=T\rightarrow 0\)**:
+ - Sample discrete tokens from predicted logits (with small “remask” probability to improve mixing)
+ - DDPM reverse step for angles using the predicted clean angles
+- **Result**: a full design candidate (material, vf-category, layer mask, angles) conditioned on target curves.
+
+### Figure slot: Transformer denoiser architecture
+Paste this as your architecture figure (or recreate it in PowerPoint/Figma):
+
+```mermaid
+flowchart TB
+ subgraph Conditioning["Conditioning (target response)"]
+ C0["Stress/strain curves"] --> C1["5 polynomial fits (no intercept)"]
+ C1 --> C2["Flatten coeffs: c ∈ R^{5d}"]
+ C2 --> C3["Normalize (z-score/minmax)"]
+ end
+
+ subgraph Tokens["Design tokens (sequence)"]
+ X0["material token"] --> X
+ X1["vf-category token"] --> X
+ X2["layer_1 token"] --> X
+ X3["..."] --> X
+ X4["layer_L token"] --> X
+ X["Embed + PosEmbed + TimeEmbed"] --> TR
+ end
+
+ C3 --> P["Condition projection: per-scalar Linear(1→d_model)\n→ cond tokens (C×d_model)"]
+ P --> TR["Stacked blocks: Self-Attn + Cross-Attn(cond) + FFN"]
+
+ TR --> H1["Head: material logits"]
+ TR --> H2["Head: vf-category logits"]
+ TR --> H3["Head: layer logits"]
+ TR --> H4["Head: angle regression (0..π/2)"]
+```
+
+**Caption idea**: “Transformer denoiser over a fixed token sequence (global tokens + layer tokens) with cross-attention to condition tokens derived from polynomial coefficients; outputs discrete logits and continuous angles.”
+
+### Figure slot (recommended for this column)
+- **Figure: On-the-fly validation (condition vs generated designs)**
+ Use one of the saved plots from training artifacts, e.g.:
+ - `hybrid_diffusion_material_generation/checkpoints/config_1_continuous_100_epoch/exp_20260114_164540/nonlinear_testing_best_checkpoint_CPP_0_0.4926_5_45.png`
+
+ **Caption idea**: “Given a target response (black), we sample multiple laminate designs (colored), simulate them, and compare stress/lateral-strain curves across loading modes.”
+
diff --git a/hybrid_diffusion_material_generation/test_on_the_fly.py b/hybrid_diffusion_material_generation/test_on_the_fly.py
new file mode 100644
index 0000000000000000000000000000000000000000..08dc7434fae8d0f9389a21f5275aefbca434d790
--- /dev/null
+++ b/hybrid_diffusion_material_generation/test_on_the_fly.py
@@ -0,0 +1,581 @@
+"""
+Standalone on-the-fly test script (single condition file -> model -> simulation -> plot).
+
+What it does:
+1) Read a dataset txt file like `data_generation/test/CPP_0.0924_1_30.txt`
+2) Fit the 5 no-intercept polynomials (same as training preprocessing)
+3) Normalize coefficients using training metadata (from `processed_data/`)
+4) Load a trained diffusion model checkpoint
+5) Sample N designs from the model conditioned on the fitted coefficients
+6) Run simulations for each generated design (via data_generation/generate_data_mp.py + lam.py)
+7) Plot: condition (fit + dots) vs 3 generated designs (sim dots + fitted smooth curves)
+
+Example:
+python test_on_the_fly.py \
+ --input_file /project/luofeng/feiyang/MaterialGeneration/data_generation/test/CPP_0.0924_1_30.txt \
+ --data_dir /project/luofeng/feiyang/MaterialGeneration/hybrid_diffusion_material_generation/processed_data \
+ --checkpoint /project/luofeng/feiyang/MaterialGeneration/hybrid_diffusion_material_generation/checkpoints/config_1_discrete/exp_20251231_193421/best_model.pt \
+ --curve_dir /project/luofeng/feiyang/MaterialGeneration/data_generation/shahriar_modified_2025_12/RVE_Datasets \
+ --out_png /tmp/on_the_fly_test.png \
+ --n_generate 3 \
+ --instances 1
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+import math
+import os
+from pathlib import Path
+from typing import Dict, List, Optional, Tuple
+
+
+MATERIAL_NAMES = ["CPP", "CHDPE", "GPP", "GHDPE"]
+
+
+def _normalize_coefficients_from_metadata(
+ coeffs_5_by_deg: np.ndarray,
+ metadata: Dict,
+ normalize_method: str = "minmax",
+) -> np.ndarray:
+ """
+ Match `MaterialDesignDataset._normalize_coefficients` (flatten [5,deg] -> [5*deg]).
+ """
+ import numpy as np
+
+ coeffs_flat = np.asarray(coeffs_5_by_deg, dtype=np.float32).flatten()
+ if normalize_method == "minmax":
+ coeff_min = np.asarray(metadata.get("coefficient_min", []), dtype=np.float32)
+ coeff_max = np.asarray(metadata.get("coefficient_max", []), dtype=np.float32)
+ if coeff_min.size == 0 or coeff_max.size == 0:
+ raise ValueError("Metadata must contain 'coefficient_min' and 'coefficient_max' for minmax normalization")
+ range_vals = coeff_max - coeff_min
+ range_vals = np.where(range_vals == 0, 1.0, range_vals)
+ return ((coeffs_flat - coeff_min) / range_vals).astype(np.float32)
+ if normalize_method == "zscore":
+ coeff_mean = np.asarray(metadata.get("coefficient_mean", []), dtype=np.float32)
+ coeff_std = np.asarray(metadata.get("coefficient_std", []), dtype=np.float32)
+ if coeff_mean.size == 0 or coeff_std.size == 0:
+ raise ValueError("Metadata must contain 'coefficient_mean' and 'coefficient_std' for zscore normalization")
+ std_vals = np.where(coeff_std == 0, 1.0, coeff_std)
+ return ((coeffs_flat - coeff_mean) / std_vals).astype(np.float32)
+ raise ValueError(f"Unknown normalize_method: {normalize_method}")
+
+
+def _poly_eval_no_intercept(coeffs_row: np.ndarray, x: np.ndarray) -> np.ndarray:
+ import numpy as np
+
+ coeffs_with_zero = np.append(np.asarray(coeffs_row, dtype=np.float32), 0.0)
+ return np.polyval(coeffs_with_zero, x)
+
+
+def _angle_categories_from_metadata(metadata: Dict, angle_resolution: float) -> Tuple[np.ndarray, float, float]:
+ import numpy as np
+
+ angle_min_raw = float(metadata.get("angle_min", 0.0))
+ angle_max_raw = float(metadata.get("angle_max", 90.0))
+ angle_min = math.floor(angle_min_raw / angle_resolution) * angle_resolution
+ angle_max = math.ceil(angle_max_raw / angle_resolution) * angle_resolution
+ num_categories = int((angle_max - angle_min) / angle_resolution) + 1
+ cats = np.linspace(angle_min, angle_max, num_categories, dtype=np.float32)
+ return cats, float(angle_min), float(angle_max)
+
+
+def _load_training_config_near_checkpoint(checkpoint_path: Path) -> Optional[Dict]:
+ try:
+ candidate = checkpoint_path.parent / "training_config.json"
+ if candidate.exists():
+ return json.loads(candidate.read_text())
+ except Exception:
+ return None
+ return None
+
+
+def _resolve_data_generation_path() -> Path:
+ # This script lives in hybrid_diffusion_material_generation/
+ return (Path(__file__).parent.parent / "data_generation").resolve()
+
+
+def _simulate_design(
+ *,
+ mat_type: str,
+ vf: float,
+ upper_angles_deg: List[float],
+ curve_dir: Path,
+ instance: int,
+) -> Dict[str, Dict[str, np.ndarray]]:
+ """
+ Run simulations (11/22/12) for one design.
+ Returns dict:
+ { "11": {"strain":..., "stress":..., "lateral":...}, ... }
+ """
+ import numpy as np
+
+ data_gen_path = _resolve_data_generation_path()
+ if not data_gen_path.exists():
+ raise FileNotFoundError(f"data_generation not found at {data_gen_path}")
+
+ import sys
+
+ sys.path.insert(0, str(data_gen_path))
+ from generate_data_mp import build_full_symmetric_stack, format_vol_fraction, run_simulation_with_mat # type: ignore
+
+ curve_dir_path = curve_dir.resolve()
+ vf_str = format_vol_fraction(vf)
+ prefix = f"{mat_type}_{vf_str}_{instance}"
+
+ # Resolve lam.py similarly to validate_on_the_fly
+ lam_path = curve_dir_path.parent.parent / "shahriar_modified_2025_12"
+ if not lam_path.exists():
+ lam_path = data_gen_path / "shahriar_modified_2025_12"
+ if not lam_path.exists():
+ lam_path = curve_dir_path.parent / "shahriar_modified_2025_12"
+ if not lam_path.exists() or not (lam_path / "lam.py").exists():
+ raise FileNotFoundError(f"Could not find lam.py at {lam_path}")
+
+ sys.path.insert(0, str(lam_path))
+ import importlib.util
+
+ spec = importlib.util.spec_from_file_location("lam", lam_path / "lam.py")
+ lam = importlib.util.module_from_spec(spec)
+ assert spec.loader is not None
+ spec.loader.exec_module(lam)
+
+ read_instance_metadata = lam.read_instance_metadata
+ load_ud_material_from_files = lam.load_ud_material_from_files
+
+ # Set CURVE_DIR for lam
+ original_curve_dir = lam.CURVE_DIR
+ lam.CURVE_DIR = curve_dir_path
+ try:
+ _vf_meta, _centers_meta, _n_fibers = read_instance_metadata(prefix)
+ mat = load_ud_material_from_files(prefix)
+ finally:
+ lam.CURVE_DIR = original_curve_dir
+
+ full_angles = build_full_symmetric_stack(sorted(upper_angles_deg))
+
+ simulation_results: Dict[str, Dict[str, np.ndarray]] = {}
+ for mode in ("11", "22", "12"):
+ try:
+ ex, sx, ey, _gxy, _ezz, _g23, _g13, e11 = run_simulation_with_mat(prefix, full_angles, mode, mat)
+
+ # Interpolate to a small number of points (matches validate_on_the_fly)
+ num_output_points = 10
+ x_out = np.linspace(ex[0], ex[-1], num_output_points, dtype=np.float32)
+ sx_out_mpa = np.interp(x_out, ex, sx / 1e6).astype(np.float32)
+ if mode == "11":
+ lateral_out = np.interp(x_out, ex, ey).astype(np.float32)
+ elif mode == "22":
+ lateral_out = np.interp(x_out, ex, e11).astype(np.float32)
+ else:
+ lateral_out = None
+
+ simulation_results[mode] = {
+ "strain": x_out,
+ "stress": sx_out_mpa,
+ "lateral": lateral_out,
+ }
+ except Exception:
+ continue
+
+ if not simulation_results:
+ raise RuntimeError("All simulation modes failed")
+ return simulation_results
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(description="Standalone on-the-fly test (single condition file).")
+ parser.add_argument("--input_file", type=str, required=True, help="Dataset curve txt file")
+ parser.add_argument("--data_dir", type=str, required=True, help="processed_data directory used in training")
+ parser.add_argument("--checkpoint", type=str, required=True, help="Model checkpoint path (best_model.pt)")
+ parser.add_argument(
+ "--curve_dir",
+ type=str,
+ required=True,
+ help="Directory containing RVE_Datasets (for lam.py simulations)",
+ )
+ parser.add_argument("--out_png", type=str, required=True, help="Output plot path (png)")
+ parser.add_argument("--device", type=str, default="cuda:0", help="Device (e.g., cuda:0 or cpu)")
+ parser.add_argument("--normalization_method", type=str, default=None, choices=["minmax", "zscore"], help="Override normalization method")
+ parser.add_argument("--n_generate", type=int, default=3, help="How many samples to generate from the model")
+ parser.add_argument("--instances", type=int, nargs="+", default=[1], help="Simulation instances to run (default: 1)")
+ parser.add_argument("--remask_prob", type=float, default=0.1, help="Sampling remask probability")
+ parser.add_argument("--seed", type=int, default=123, help="Random seed for sampling")
+ args = parser.parse_args()
+
+ # Heavy imports live here so `--help` works even without the training env.
+ try:
+ import numpy as np
+ import torch
+ except Exception as e:
+ raise SystemExit(
+ "Missing dependencies (need at least numpy + torch). "
+ "Activate your training environment then rerun.\n"
+ f"Import error: {e}"
+ )
+
+ from load_processed_data import load_metadata
+ from models import MaterialHybridDenoiser, ModelConfig
+ from train import (
+ DiscreteMaskDiffusion,
+ GaussianDiffusion,
+ VF_CATEGORIES,
+ angle_category_to_degrees,
+ linear_beta_schedule,
+ sample as diffusion_sample,
+ )
+
+ # Local lightweight parsers/fits (avoid importing scipy at module import time)
+ def parse_dataset_file(filepath: str) -> Dict[str, np.ndarray]:
+ with open(filepath, "r") as f:
+ content = f.read()
+ sections = content.strip().split("\n\n")
+ data: Dict[str, np.ndarray] = {}
+ if len(sections) > 0:
+ lines = sections[0].strip().split("\n")
+ if len(lines) > 1 and "eps_11" in lines[0]:
+ rows = []
+ for line in lines[1:]:
+ parts = line.split()
+ if len(parts) >= 3:
+ rows.append([float(parts[0]), float(parts[1]), float(parts[2])])
+ data["section1"] = np.asarray(rows, dtype=np.float32)
+ if len(sections) > 1:
+ lines = sections[1].strip().split("\n")
+ if len(lines) > 1 and "eps_22" in lines[0]:
+ rows = []
+ for line in lines[1:]:
+ parts = line.split()
+ if len(parts) >= 3:
+ rows.append([float(parts[0]), float(parts[1]), float(parts[2])])
+ data["section2"] = np.asarray(rows, dtype=np.float32)
+ if len(sections) > 2:
+ lines = sections[2].strip().split("\n")
+ if len(lines) > 1 and "eps_12" in lines[0]:
+ rows = []
+ for line in lines[1:]:
+ parts = line.split()
+ if len(parts) >= 2:
+ rows.append([float(parts[0]), float(parts[1])])
+ data["section3"] = np.asarray(rows, dtype=np.float32)
+ return data
+
+ def polynomial_fit_no_intercept(
+ x: np.ndarray, y: np.ndarray, degree_: int
+ ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+ # Matches utils.fitting_utils.polynomial_fit but without scipy dependency.
+ x = np.asarray(x, dtype=np.float32).reshape(-1)
+ y = np.asarray(y, dtype=np.float32).reshape(-1)
+ vander = np.vander(x, int(degree_) + 1, increasing=False)[:, :-1] # drop constant
+ coeffs, *_ = np.linalg.lstsq(vander, y, rcond=None)
+ x_fit = np.linspace(float(x.min()), float(x.max()), 100, dtype=np.float32)
+ y_fit = np.polyval(np.append(coeffs, 0.0), x_fit).astype(np.float32)
+ return coeffs.astype(np.float32), x_fit, y_fit
+
+ input_file = Path(args.input_file).resolve()
+ data_dir = Path(args.data_dir).resolve()
+ checkpoint_path = Path(args.checkpoint).resolve()
+ curve_dir = Path(args.curve_dir).resolve()
+ out_png = Path(args.out_png).resolve()
+
+ if not input_file.exists():
+ raise FileNotFoundError(f"input_file not found: {input_file}")
+ if not data_dir.exists():
+ raise FileNotFoundError(f"data_dir not found: {data_dir}")
+ if not checkpoint_path.exists():
+ raise FileNotFoundError(f"checkpoint not found: {checkpoint_path}")
+ if not curve_dir.exists():
+ raise FileNotFoundError(f"curve_dir not found: {curve_dir}")
+
+ # Metadata (normalization + degree)
+ metadata = load_metadata(str(data_dir))
+ degree = int(metadata.get("polynomial_degree", 3))
+
+ # Training config (T, betas, angles resolution, discrete/continuous)
+ training_cfg = _load_training_config_near_checkpoint(checkpoint_path) or {}
+ normalize_method = args.normalization_method or training_cfg.get("normalization_method", "minmax")
+ T = int(training_cfg.get("T", 100))
+ beta_start = float(training_cfg.get("beta_start", 1e-4))
+ beta_end = float(training_cfg.get("beta_end", 0.02))
+ use_discrete_angles = bool(training_cfg.get("use_discrete_angles", True))
+ angle_resolution = float(training_cfg.get("angle_resolution", 1.0))
+
+ # Device
+ device = torch.device(args.device)
+
+ # Fit 5 polynomials from the input file (same relationships as training preprocessing)
+ parsed_for_fit = parse_dataset_file(str(input_file))
+ if "section1" not in parsed_for_fit or "section2" not in parsed_for_fit or "section3" not in parsed_for_fit:
+ raise ValueError(f"Could not parse all 3 sections from {input_file}")
+ s1 = parsed_for_fit["section1"]
+ s2 = parsed_for_fit["section2"]
+ s3 = parsed_for_fit["section3"]
+
+ # Relationships:
+ # 0: eps_11 -> sig_11
+ # 1: eps_11 -> eps_22
+ # 2: eps_22 -> sig_22
+ # 3: eps_22 -> eps_11
+ # 4: eps_12 -> sig_12
+ coeffs_list = []
+ coeffs_list.append(polynomial_fit_no_intercept(s1[:, 0], s1[:, 1], degree)[0])
+ coeffs_list.append(polynomial_fit_no_intercept(s1[:, 0], s1[:, 2], degree)[0])
+ coeffs_list.append(polynomial_fit_no_intercept(s2[:, 0], s2[:, 1], degree)[0])
+ coeffs_list.append(polynomial_fit_no_intercept(s2[:, 0], s2[:, 2], degree)[0])
+ coeffs_list.append(polynomial_fit_no_intercept(s3[:, 0], s3[:, 1], degree)[0])
+ cond_coeffs_5_by_deg = np.stack(coeffs_list, axis=0).astype(np.float32) # [5, degree]
+
+ # Normalize to model input
+ cond_norm = _normalize_coefficients_from_metadata(cond_coeffs_5_by_deg, metadata, normalize_method=normalize_method)
+ cond = torch.from_numpy(cond_norm).float().unsqueeze(0) # (1, C)
+ cond = cond.repeat(args.n_generate, 1).to(device)
+
+ # Angle categories (for decoding generated discrete angles)
+ if use_discrete_angles:
+ angle_categories, angle_min, angle_max = _angle_categories_from_metadata(metadata, angle_resolution)
+ n_angle_categories = int(len(angle_categories))
+ dead_category = n_angle_categories
+ else:
+ angle_categories = None
+ n_angle_categories = None
+ dead_category = None
+
+ # Load checkpoint
+ ckpt = torch.load(str(checkpoint_path), map_location="cpu")
+ state_dict = ckpt["model_state_dict"] if isinstance(ckpt, dict) and "model_state_dict" in ckpt else ckpt
+
+ # Build model config
+ if isinstance(ckpt, dict) and "config" in ckpt:
+ cfg = ckpt["config"]
+ # Older checkpoints may store config as a dataclass-like object; keep as-is.
+ else:
+ cfg_dict = (training_cfg.get("model_config") or {})
+ cfg = ModelConfig(
+ n_conditions=int(cfg_dict.get("n_conditions", 5 * degree)),
+ n_materials=int(cfg_dict.get("n_materials", 4)),
+ n_vf_categories=int(cfg_dict.get("n_vf_categories", 5)),
+ n_max_layer=int(cfg_dict.get("n_max_layer", int(training_cfg.get("n_max_layer", 10)))),
+ d_model=int(cfg_dict.get("d_model", 256)),
+ n_heads=int(cfg_dict.get("n_heads", 4)),
+ n_layers=int(cfg_dict.get("n_layers", 6)),
+ dropout=float(cfg_dict.get("dropout", 0.0)),
+ )
+
+ mask_ids = dict(training_cfg.get("mask_ids") or {})
+ if not mask_ids:
+ # Sensible defaults (will be overwritten for angle if discrete)
+ mask_ids = {"material": 4, "vf_category": 5, "layer": 2}
+ if use_discrete_angles:
+ mask_ids["angle"] = int(n_angle_categories + 1) # mask id separate from vocab (vocab includes dead token)
+
+ # Diffusions
+ betas = linear_beta_schedule(T, beta_start, beta_end, str(device))
+ disc_diff_mat = DiscreteMaskDiffusion(vocab_size=int(cfg.n_materials), mask_id=int(mask_ids["material"]), T=T, betas=betas)
+ disc_diff_vf = DiscreteMaskDiffusion(vocab_size=int(cfg.n_vf_categories), mask_id=int(mask_ids["vf_category"]), T=T, betas=betas)
+ disc_diff_layer = DiscreteMaskDiffusion(vocab_size=2, mask_id=int(mask_ids["layer"]), T=T, betas=betas)
+ if use_discrete_angles:
+ disc_diff_angle = DiscreteMaskDiffusion(
+ vocab_size=int(n_angle_categories + 1), # includes dead token
+ mask_id=int(mask_ids["angle"]),
+ T=T,
+ betas=betas,
+ )
+ cont_diff = None
+ else:
+ disc_diff_angle = None
+ cont_diff = GaussianDiffusion(T=T, betas=betas)
+
+ # Model
+ model = MaterialHybridDenoiser(cfg, mask_ids, use_discrete_angles=use_discrete_angles, n_angle_categories=n_angle_categories).to(device)
+ model.load_state_dict(state_dict, strict=True)
+ model.eval()
+
+ # Reproducibility
+ torch.manual_seed(args.seed)
+ np.random.seed(args.seed)
+
+ # Sample generated designs
+ gen = diffusion_sample(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ cond=cond,
+ mask_ids=mask_ids,
+ device=str(device),
+ remask_prob=float(args.remask_prob),
+ use_discrete_angles=use_discrete_angles,
+ )
+
+ # Parse condition points for plotting (dots)
+ parsed = parse_dataset_file(str(input_file))
+ cond_points: Dict[str, Tuple[np.ndarray, np.ndarray]] = {}
+ if "section1" in parsed and len(parsed["section1"]) > 0:
+ cond_points["11_stress"] = (parsed["section1"][:, 0], parsed["section1"][:, 1])
+ cond_points["11_lat"] = (parsed["section1"][:, 0], parsed["section1"][:, 2])
+ if "section2" in parsed and len(parsed["section2"]) > 0:
+ cond_points["22_stress"] = (parsed["section2"][:, 0], parsed["section2"][:, 1])
+ cond_points["22_lat"] = (parsed["section2"][:, 0], parsed["section2"][:, 2])
+ if "section3" in parsed and len(parsed["section3"]) > 0:
+ cond_points["12_stress"] = (parsed["section3"][:, 0], parsed["section3"][:, 1])
+
+ # Plot
+ import matplotlib
+
+ matplotlib.use("Agg")
+ import matplotlib.pyplot as plt
+
+ fig, axes = plt.subplots(2, 3, figsize=(15, 10))
+ modes = ["11", "22", "12"]
+ mode_to_row = {"11": 0, "22": 2, "12": 4}
+ lateral_row = {"11": 1, "22": 3, "12": None}
+ colors = ["b", "c", "m", "g", "y"]
+ cond_color = "k"
+ gen_lines: List[str] = []
+
+ # Title (we'll append per-generation lines later as a text block)
+ title = (
+ f"Condition file: {input_file.name}\n"
+ f"Normalization={normalize_method}, degree={degree}, discrete_angles={use_discrete_angles}"
+ )
+ fig.suptitle(title, fontsize=11)
+
+ # Helper: per-mode condition fit x-range
+ def _x_fit_for_mode(mode: str) -> Optional[np.ndarray]:
+ key = f"{mode}_stress"
+ if key in cond_points:
+ x = cond_points[key][0]
+ x_min = float(np.min(x))
+ x_max = float(np.max(x))
+ if x_max > x_min:
+ return np.linspace(x_min, x_max, 200, dtype=np.float32)
+ return None
+
+ # Plot condition fit + dots first
+ for col, mode in enumerate(modes):
+ x_fit = _x_fit_for_mode(mode)
+ if x_fit is not None and mode in mode_to_row:
+ row = mode_to_row[mode]
+ y_fit = _poly_eval_no_intercept(cond_coeffs_5_by_deg[row, :], x_fit)
+ axes[0, col].plot(x_fit, y_fit, color=cond_color, linewidth=2, label="Cond fit")
+ key = f"{mode}_stress"
+ if key in cond_points:
+ x_d, y_d = cond_points[key]
+ axes[0, col].scatter(x_d, y_d, color=cond_color, s=18, alpha=0.6, marker="x", label="_nolegend_")
+
+ if mode in ("11", "22"):
+ if x_fit is not None and lateral_row.get(mode) is not None:
+ row = lateral_row[mode]
+ assert row is not None
+ y_lat = _poly_eval_no_intercept(cond_coeffs_5_by_deg[row, :], x_fit)
+ axes[1, col].plot(x_fit, y_lat, color=cond_color, linewidth=2, label="Cond fit")
+ key = f"{mode}_lat"
+ if key in cond_points:
+ x_d, y_d = cond_points[key]
+ axes[1, col].scatter(x_d, y_d, color=cond_color, s=18, alpha=0.6, marker="x", label="_nolegend_")
+ else:
+ axes[1, col].axis("off")
+
+ # Generate + simulate + plot
+ for i in range(args.n_generate):
+ mat_id = int(gen["material_t"][i].item())
+ vf_cat = int(gen["vf_category_t"][i].item())
+ mat_name = MATERIAL_NAMES[mat_id] if 0 <= mat_id < len(MATERIAL_NAMES) else f"MAT{mat_id}"
+ vf = float(VF_CATEGORIES[vf_cat]) if 0 <= vf_cat < len(VF_CATEGORIES) else float(VF_CATEGORIES[0])
+
+ if use_discrete_angles:
+ assert angle_categories is not None and dead_category is not None
+ angle_row = gen["angle_t"][i].detach().cpu().numpy().astype(np.int64)
+ alive_mask = angle_row != dead_category
+ angle_cats = angle_row[alive_mask]
+ upper_angles = angle_category_to_degrees(angle_cats, angle_categories).tolist()
+ else:
+ # Continuous mode not the main focus here; treat as radians in angle_t with layer mask
+ layer_mask = gen["layer_t"][i].detach().cpu().numpy().astype(np.int64)
+ angle_vals = gen["angle_t"][i].detach().cpu().numpy()
+ alive_mask = layer_mask == 1
+ upper_angles = np.rad2deg(angle_vals[alive_mask, 0]).tolist()
+
+ color = colors[i % len(colors)]
+ sorted_angles = np.sort(np.asarray(upper_angles, dtype=np.float32))
+ angles_str = "[" + ", ".join(f"{float(a):.3f}" for a in sorted_angles) + "]"
+ label = f"Gen{i+1}: {mat_name}, vf={vf:.4f}, angles={angles_str}"
+ print(label)
+ gen_lines.append(label)
+
+ # Simulate for requested instances; aggregate by averaging fits on the plot (or plot each instance)
+ # Default is instances=[1] so this stays clean.
+ for inst in args.instances:
+ try:
+ sim = _simulate_design(mat_type=mat_name, vf=vf, upper_angles_deg=upper_angles, curve_dir=curve_dir, instance=int(inst))
+ except Exception as e:
+ print(f" [Gen{i+1}] simulation failed for instance {inst}: {e}")
+ continue
+
+ for col, mode in enumerate(modes):
+ if mode not in sim:
+ continue
+ s = sim[mode]
+ x = s["strain"]
+ y_stress = s["stress"]
+ # legend handle as line (like on-the-fly validation)
+ axes[0, col].plot([], [], color=color, linewidth=2, label=f"Gen{i+1} (inst{inst})")
+ axes[0, col].scatter(x, y_stress, color=color, s=22, alpha=0.85, label="_nolegend_")
+
+ # Fit smooth polynomial curve to sim points (no intercept)
+ try:
+ _c, x_fit_sim, y_fit_sim = polynomial_fit_no_intercept(np.asarray(x), np.asarray(y_stress), degree)
+ axes[0, col].plot(x_fit_sim, y_fit_sim, color=color, linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+
+ if mode in ("11", "22") and s.get("lateral", None) is not None:
+ y_lat = s["lateral"]
+ axes[1, col].plot([], [], color=color, linewidth=2, label=f"Gen{i+1} (inst{inst})")
+ axes[1, col].scatter(x, y_lat, color=color, s=22, alpha=0.85, label="_nolegend_")
+ try:
+ _c2, x_fit_sim, y_fit_sim = polynomial_fit_no_intercept(np.asarray(x), np.asarray(y_lat), degree)
+ axes[1, col].plot(x_fit_sim, y_fit_sim, color=color, linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+
+ # Formatting
+ for col, mode in enumerate(modes):
+ axes[0, col].set_xlabel("Strain")
+ axes[0, col].set_ylabel("Stress (MPa)")
+ axes[0, col].set_title(f"Mode {mode}")
+ axes[0, col].grid(True, alpha=0.3)
+ axes[0, col].legend(fontsize=8)
+ if mode in ("11", "22"):
+ axes[1, col].set_xlabel("Strain")
+ axes[1, col].set_ylabel("Lateral Strain")
+ axes[1, col].set_title(f"Mode {mode} - Lateral")
+ axes[1, col].grid(True, alpha=0.3)
+ axes[1, col].legend(fontsize=8)
+
+ out_png.parent.mkdir(parents=True, exist_ok=True)
+ # Put the generation summary text at the bottom-left (like terminal lines),
+ # and reserve some space so it doesn't overlap subplots.
+ if gen_lines:
+ fig.text(
+ 0.01,
+ 0.01,
+ "\n".join(gen_lines),
+ ha="left",
+ va="bottom",
+ fontsize=9,
+ family="monospace",
+ )
+ plt.tight_layout(rect=[0, 0.06, 1, 1])
+ plt.savefig(str(out_png), dpi=150, bbox_inches="tight")
+ plt.close()
+ print(f"Saved plot to {out_png}")
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/hybrid_diffusion_material_generation/train.py b/hybrid_diffusion_material_generation/train.py
new file mode 100644
index 0000000000000000000000000000000000000000..d0790dfffa3785e9209ac9d6dce1ef363d933a1c
--- /dev/null
+++ b/hybrid_diffusion_material_generation/train.py
@@ -0,0 +1,3166 @@
+"""
+Training script for diffusion model with support for both discrete and continuous angle diffusion.
+
+This implements:
+- Discrete diffusion for material, nfiber, layer (mask corruption)
+- Optional discrete diffusion for angles (mask corruption with 7 categories: 0, 15, 30, 45, 60, 75, 90 degrees)
+- Optional continuous diffusion for angles (Gaussian noise)
+- Combined training with separate loss terms
+- Switch between modes via use_discrete_angles parameter
+"""
+
+import math
+import random
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch.utils.data import DataLoader
+from tqdm import tqdm
+import os
+import json
+from datetime import datetime
+from typing import Dict, Tuple, Optional, List
+import multiprocessing as mp
+from functools import partial
+from pathlib import Path
+import sys
+
+# Optional wandb import
+try:
+ import wandb
+ WANDB_AVAILABLE = True
+except ImportError:
+ WANDB_AVAILABLE = False
+ wandb = None
+
+from models import MaterialHybridDenoiser, ModelConfig
+from dataset import create_dataloader
+from load_processed_data import load_metadata
+
+# Import for on-the-fly validation data generation
+import sys
+from pathlib import Path
+DATA_GEN_AVAILABLE = False
+try:
+ # Add data_generation to path
+ data_gen_path = Path(__file__).parent.parent / "data_generation"
+ if data_gen_path.exists():
+ sys.path.insert(0, str(data_gen_path))
+ # Try to import - these will be used in validate_with_on_the_fly_generation
+ # We'll import them inside the function to handle errors gracefully
+ DATA_GEN_AVAILABLE = True
+except Exception:
+ DATA_GEN_AVAILABLE = False
+
+
+# -----------------------
+# Diffusion Schedules
+# -----------------------
+
+def linear_beta_schedule(T: int, beta_start: float = 1e-4, beta_end: float = 0.02, device: str = "cpu"):
+ """Linear noise schedule for diffusion."""
+ return torch.linspace(beta_start, beta_end, T, device=device)
+
+
+def cosine_beta_schedule(T: int, s: float = 0.008, device: str = "cpu"):
+ """Cosine noise schedule for diffusion."""
+ steps = T + 1
+ x = torch.linspace(0, T, steps, device=device)
+ alphas_cumprod = torch.cos(((x / T) + s) / (1 + s) * math.pi * 0.5) ** 2
+ alphas_cumprod = alphas_cumprod / alphas_cumprod[0]
+ betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1])
+ return torch.clip(betas, 0.0001, 0.9999)
+
+
+# -----------------------
+# Discrete Diffusion: Mask Corruption
+# -----------------------
+
+class DiscreteMaskDiffusion:
+ """
+ Forward: keep token with prob alpha_bar[t], else set to mask_id.
+ Train: predict x0 with cross-entropy.
+ """
+ def __init__(self, vocab_size: int, mask_id: int, T: int, betas: torch.Tensor):
+ self.vocab_size = vocab_size
+ self.mask_id = mask_id
+ self.T = T
+ self.betas = betas
+ self.alphas = 1.0 - betas
+ self.alpha_bar = torch.cumprod(self.alphas, dim=0) # (T,)
+
+ @torch.no_grad()
+ def q_sample(self, x0: torch.Tensor, t: torch.Tensor):
+ """
+ Corrupt discrete tokens by masking.
+
+ Args:
+ x0: Original tokens (B,) or (B, L)
+ t: Timesteps (B,)
+
+ Returns:
+ Corrupted tokens with some positions masked
+ """
+ if x0.dim() == 1:
+ x0 = x0.unsqueeze(-1) # (B, 1)
+ squeeze = True
+ else:
+ squeeze = False
+
+ B, L = x0.shape
+ keep_prob = self.alpha_bar[t].view(B, 1) # (B, 1)
+ keep = (torch.rand(B, L, device=x0.device) < keep_prob)
+ xt = torch.where(keep, x0, torch.full_like(x0, self.mask_id))
+
+ if squeeze:
+ xt = xt.squeeze(-1)
+ return xt
+
+
+# -----------------------
+# Continuous Diffusion: Gaussian Noise
+# -----------------------
+
+class GaussianDiffusion:
+ """
+ Forward: x_t = sqrt(a_bar)*x0 + sqrt(1-a_bar)*eps
+ Train: predict eps (noise) with MSE.
+ """
+ def __init__(self, T: int, betas: torch.Tensor):
+ self.T = T
+ self.betas = betas
+ self.alphas = 1.0 - betas
+ self.alpha_bar = torch.cumprod(self.alphas, dim=0) # (T,)
+ self.sqrt_alpha_bar = torch.sqrt(self.alpha_bar)
+ self.sqrt_one_minus_alpha_bar = torch.sqrt(1.0 - self.alpha_bar)
+
+ # For reverse sampling
+ self.sqrt_recip_alphas = torch.sqrt(1.0 / self.alphas)
+ self.one_minus_alphas = 1.0 - self.alphas
+
+ def q_sample(self, x0: torch.Tensor, t: torch.Tensor, noise=None):
+ """
+ Add noise to continuous values.
+
+ Args:
+ x0: Original values (B, L, D)
+ t: Timesteps (B,)
+ noise: Optional noise tensor (if None, sample new noise)
+
+ Returns:
+ xt: Noisy values (B, L, D)
+ noise: The noise that was added (B, L, D)
+ """
+ if noise is None:
+ noise = torch.randn_like(x0)
+ a = self.sqrt_alpha_bar[t].view(-1, 1, 1) # (B, 1, 1)
+ b = self.sqrt_one_minus_alpha_bar[t].view(-1, 1, 1) # (B, 1, 1)
+ xt = a * x0 + b * noise
+ return xt, noise
+
+ @torch.no_grad()
+ def p_sample_step(self, x_t: torch.Tensor, t: torch.Tensor, eps_pred: torch.Tensor):
+ """
+ DDPM reverse step (denoising).
+
+ Args:
+ x_t: Noisy values (B, L, D)
+ t: Timesteps (B,)
+ eps_pred: Predicted noise (B, L, D)
+
+ Returns:
+ x_prev: Denoised values (B, L, D)
+ """
+ beta_t = self.betas[t].view(-1, 1, 1)
+ sqrt_recip_alpha_t = self.sqrt_recip_alphas[t].view(-1, 1, 1)
+ sqrt_one_minus_a_bar = self.sqrt_one_minus_alpha_bar[t].view(-1, 1, 1)
+
+ # Mean: mu = 1/sqrt(alpha_t) * (x_t - (beta_t / sqrt(1-a_bar_t)) * eps_pred)
+ mu = sqrt_recip_alpha_t * (x_t - (beta_t / sqrt_one_minus_a_bar) * eps_pred)
+
+ # Add noise except at t=0
+ noise = torch.randn_like(x_t)
+ sigma = torch.sqrt(beta_t)
+ not_zero = (t != 0).float().view(-1, 1, 1)
+ x_prev = mu + not_zero * sigma * noise
+ return x_prev
+
+
+# -----------------------
+# Training Functions
+# -----------------------
+
+def compute_loss(
+ model: MaterialHybridDenoiser,
+ disc_diff_mat: DiscreteMaskDiffusion,
+ disc_diff_vf_category: DiscreteMaskDiffusion,
+ disc_diff_layer: DiscreteMaskDiffusion,
+ disc_diff_angle: DiscreteMaskDiffusion = None,
+ cont_diff: GaussianDiffusion = None,
+ batch: Dict[str, torch.Tensor] = None,
+ mask_ids: Dict[str, int] = None,
+ lambda_angle: float = 1.0,
+ lambda_material: float = 1.0,
+ lambda_vf_category: float = 1.0,
+ lambda_layer: float = 1.0,
+ use_discrete_angles: bool = True,
+) -> Tuple[float, float, float, float, float]:
+ """
+ Compute loss without backward pass (for validation).
+
+ Supports both discrete and continuous angle diffusion based on use_discrete_angles flag.
+
+ Returns:
+ Tuple of (total_loss, loss_material, loss_nfiber, loss_layer, loss_angle)
+ """
+ device = batch['material_t'].device
+ B = batch['material_t'].shape[0]
+ L = batch['layer_t'].shape[1]
+
+ # Sample random timesteps - use appropriate diffusion process
+ if use_discrete_angles:
+ T = disc_diff_angle.T
+ else:
+ T = cont_diff.T
+ t = torch.randint(0, T, (B,), device=device)
+
+ # Extract ground truth
+ x0_material = batch['material_t']
+ x0_vf_category = batch['vf_category_t']
+ x0_layer = batch['layer_t']
+ x0_angle = batch['angle_t']
+ cond = batch['cond']
+
+ # Forward noising
+ x_material_t = disc_diff_mat.q_sample(x0_material, t)
+ x_vf_category_t = disc_diff_vf_category.q_sample(x0_vf_category, t)
+ x_layer_t = disc_diff_layer.q_sample(x0_layer, t)
+
+ if use_discrete_angles:
+ x_angle_t = disc_diff_angle.q_sample(x0_angle, t) # (B, L) discrete
+ else:
+ x_angle_t, _ = cont_diff.q_sample(x0_angle, t) # (B, L, 1) continuous
+
+ # Model prediction
+ outputs = model(x_material_t, x_vf_category_t, x_layer_t, x_angle_t, cond, t)
+
+ # Compute losses
+ loss_material = F.cross_entropy(
+ outputs['material_logits'],
+ x0_material,
+ ignore_index=mask_ids['material']
+ )
+
+ loss_vf_category = F.cross_entropy(
+ outputs['vf_category_logits'],
+ x0_vf_category,
+ ignore_index=mask_ids['vf_category']
+ )
+
+ # Layer and angle loss: depends on discrete vs continuous
+ if use_discrete_angles:
+ # Discrete: combined angle+layer logits
+ # Categories 0 to n_angle_categories-1: angle categories, Category n_angle_categories: dead layer
+ angle_logits = outputs['angle_logits'] # (B, L, n_angle_categories + 1)
+ n_angle_categories = angle_logits.size(-1) - 1 # Computed dynamically from logits
+ dead_category = n_angle_categories
+
+ # Only compute loss for valid positions: up to and including the first dead token
+ # Positions after the first dead token are invalid padding and should be masked out
+ angle_losses = []
+
+ for b in range(B):
+ # Find first dead position (or L if no dead tokens)
+ dead_positions = torch.where(x0_angle[b] == dead_category)[0]
+ if len(dead_positions) > 0:
+ first_dead_pos = dead_positions[0].item()
+ # Valid positions: 0 to first_dead_pos (inclusive)
+ # This includes all alive layers + the first dead layer
+ valid_mask = torch.zeros(L, dtype=torch.bool, device=device)
+ valid_mask[:first_dead_pos + 1] = True
+ else:
+ # No dead tokens found - this means all layers are alive (sample uses max layers)
+ # In this case, all positions are valid
+ valid_mask = torch.ones(L, dtype=torch.bool, device=device)
+
+ if not valid_mask.any():
+ raise ValueError("No valid positions found in batch")
+
+ # Get valid positions
+ valid_gt = x0_angle[b, valid_mask] # (n_valid,)
+ valid_logits = angle_logits[b, valid_mask] # (n_valid, n_angle_categories + 1)
+
+ # Compute cross-entropy loss for all valid positions (includes both alive and dead tokens)
+ # Cross-entropy handles both angle categories (0-6) and dead category (7) correctly
+ loss_b = F.cross_entropy(
+ valid_logits,
+ valid_gt,
+ reduction='mean'
+ )
+
+ angle_losses.append(loss_b)
+
+ if len(angle_losses) > 0:
+ loss_angle = torch.stack(angle_losses).mean()
+ else:
+ raise ValueError("No valid positions found in batch")
+ #loss_angle = torch.tensor(0.0, device=device)
+
+ # No separate layer loss when using discrete angles
+ loss_layer = torch.tensor(0.0, device=device)
+ else:
+ # Continuous: separate layer and angle losses
+ layer_logits_flat = outputs['layer_logits'].view(B * L, 2)
+ layer_target_flat = x0_layer.view(-1)
+ valid_mask = (layer_target_flat != mask_ids['layer'])
+ if valid_mask.any():
+ loss_layer = F.cross_entropy(
+ layer_logits_flat[valid_mask],
+ layer_target_flat[valid_mask],
+ reduction='mean'
+ )
+ else:
+ loss_layer = torch.tensor(0.0, device=device)
+
+ # Continuous: MSE with position-dependent matching (no sorting needed)
+ angle_pred = outputs['angle'] # (B, L, 1) - predicted x0
+ valid_layer_mask = (x0_layer != mask_ids['layer']) # (B, L)
+ angle_losses = []
+
+ for b in range(B):
+ valid_mask = valid_layer_mask[b] # (L,)
+ if not valid_mask.any():
+ continue
+
+ pred_angles = angle_pred[b, valid_mask, 0] # (n_valid,)
+ gt_angles = x0_angle[b, valid_mask, 0] # (n_valid,)
+
+ # Compute MSE loss position-wise (positions are now meaningful)
+ mse = (pred_angles - gt_angles) ** 2
+ angle_losses.append(mse.mean())
+
+ if len(angle_losses) > 0:
+ loss_angle = torch.stack(angle_losses).mean()
+ else:
+ loss_angle = torch.tensor(0.0, device=device)
+
+ total_loss = (
+ lambda_material * loss_material +
+ lambda_vf_category * loss_vf_category +
+ lambda_layer * loss_layer +
+ lambda_angle * loss_angle
+ )
+
+ return (
+ total_loss,
+ loss_material,
+ loss_vf_category,
+ loss_layer,
+ loss_angle
+ )
+
+
+def train_step(
+ model: MaterialHybridDenoiser,
+ disc_diff_mat: DiscreteMaskDiffusion,
+ disc_diff_vf_category: DiscreteMaskDiffusion,
+ disc_diff_layer: DiscreteMaskDiffusion,
+ disc_diff_angle: DiscreteMaskDiffusion = None,
+ cont_diff: GaussianDiffusion = None,
+ optimizer: torch.optim.Optimizer = None,
+ batch: Dict[str, torch.Tensor] = None,
+ mask_ids: Dict[str, int] = None,
+ lambda_angle: float = 1.0,
+ lambda_material: float = 1.0,
+ lambda_vf_category: float = 1.0,
+ lambda_layer: float = 1.0,
+ use_discrete_angles: bool = True,
+) -> Tuple[float, float, float, float, float]:
+ """
+ Single training step (with backward pass).
+ Supports both discrete and continuous angle diffusion.
+
+ Args:
+ model: MaterialHybridDenoiser model
+ disc_diff_mat: Discrete diffusion for material
+ disc_diff_vf_category: Discrete diffusion for volume fraction category
+ disc_diff_layer: Discrete diffusion for layer
+ disc_diff_angle: Discrete diffusion for angles (if use_discrete_angles=True)
+ cont_diff: Continuous diffusion for angles (if use_discrete_angles=False)
+ optimizer: Optimizer
+ batch: Batch dictionary with model inputs
+ mask_ids: Dictionary of mask IDs
+ lambda_angle: Weight for angle loss
+ lambda_material: Weight for material loss
+ lambda_vf_category: Weight for volume fraction category loss
+ lambda_layer: Weight for layer loss
+ use_discrete_angles: Whether to use discrete or continuous angle diffusion
+
+ Returns:
+ Tuple of (total_loss, loss_material, loss_nfiber, loss_layer, loss_angle) as floats
+ """
+ model.train()
+
+ # Compute loss (returns tensors)
+ total_loss, loss_material, loss_vf_category, loss_layer, loss_angle = compute_loss(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ batch=batch,
+ mask_ids=mask_ids,
+ lambda_angle=lambda_angle,
+ lambda_material=lambda_material,
+ lambda_vf_category=lambda_vf_category,
+ lambda_layer=lambda_layer,
+ use_discrete_angles=use_discrete_angles
+ )
+
+ # Backward pass
+ optimizer.zero_grad(set_to_none=True)
+ total_loss.backward()
+ optimizer.step()
+
+ # Return as floats
+ return (
+ float(total_loss.detach().cpu()),
+ float(loss_material.detach().cpu()),
+ float(loss_vf_category.detach().cpu()),
+ float(loss_layer.detach().cpu()),
+ float(loss_angle.detach().cpu())
+ )
+
+
+# -----------------------
+# Sampling Functions
+# -----------------------
+
+@torch.no_grad()
+def sample(
+ model: MaterialHybridDenoiser,
+ disc_diff_mat: DiscreteMaskDiffusion,
+ disc_diff_vf_category: DiscreteMaskDiffusion,
+ disc_diff_layer: DiscreteMaskDiffusion,
+ disc_diff_angle: DiscreteMaskDiffusion = None,
+ cont_diff: GaussianDiffusion = None,
+ cond: torch.Tensor = None,
+ mask_ids: Dict[str, int] = None,
+ device: str = None,
+ remask_prob: float = 0.1,
+ use_discrete_angles: bool = True,
+) -> Dict[str, torch.Tensor]:
+ """
+ Sample from the diffusion model (supports batch generation).
+ Supports both discrete and continuous angle diffusion.
+
+ Args:
+ model: MaterialHybridDenoiser model
+ disc_diff_mat: Discrete diffusion for material
+ disc_diff_vf_category: Discrete diffusion for volume fraction category
+ disc_diff_layer: Discrete diffusion for layer
+ disc_diff_angle: Discrete diffusion for angles (if use_discrete_angles=True)
+ cont_diff: Continuous diffusion for angles (if use_discrete_angles=False)
+ cond: Condition tensor (B, n_conditions)
+ mask_ids: Dictionary of mask IDs
+ device: Device to run on
+ remask_prob: Probability of re-masking during sampling
+ use_discrete_angles: Whether to use discrete or continuous angle diffusion
+
+ Returns:
+ Dictionary with sampled values:
+ - material_t: (B,)
+ - vf_category_t: (B,)
+ - layer_t: (B, L)
+ - angle_t: (B, L) discrete category indices OR (B, L, 1) continuous
+ """
+ model.eval()
+ B = cond.shape[0]
+ L = model.cfg.n_max_layer
+
+ # Start from noise/mask
+ x_material_t = torch.full((B,), mask_ids['material'], dtype=torch.long, device=device)
+ x_vf_category_t = torch.full((B,), mask_ids['vf_category'], dtype=torch.long, device=device)
+ x_layer_t = torch.full((B, L), mask_ids['layer'], dtype=torch.long, device=device)
+
+ if use_discrete_angles:
+ x_angle_t = torch.full((B, L), mask_ids['angle'], dtype=torch.long, device=device)
+ T = disc_diff_angle.T
+ else:
+ x_angle_t = torch.randn(B, L, 1, device=device)
+ T = cont_diff.T
+
+ # Reverse diffusion
+ for t_int in reversed(range(T)):
+ t = torch.full((B,), t_int, dtype=torch.long, device=device)
+
+ # Model prediction
+ outputs = model(x_material_t, x_vf_category_t, x_layer_t, x_angle_t, cond, t)
+
+ # Discrete updates (material, vf_category, layer)
+ # Material
+ probs_mat = F.softmax(outputs['material_logits'], dim=-1) # (B, n_materials)
+ remask_mat = (x_material_t == mask_ids['material']) | (torch.rand(B, device=device) < remask_prob)
+ if remask_mat.any():
+ new_material = torch.multinomial(probs_mat[remask_mat], 1).squeeze(-1) # (N,)
+ x_material_t = x_material_t.clone()
+ x_material_t[remask_mat] = new_material
+
+ # Volume fraction category (5 categories: 0-4)
+ probs_vf = F.softmax(outputs['vf_category_logits'], dim=-1) # (B, 5)
+ remask_vf = (x_vf_category_t == mask_ids['vf_category']) | (torch.rand(B, device=device) < remask_prob)
+ if remask_vf.any():
+ sampled_vf = torch.multinomial(probs_vf[remask_vf], 1).squeeze(-1) # (N,) in [0, 4]
+ x_vf_category_t = x_vf_category_t.clone()
+ x_vf_category_t[remask_vf] = sampled_vf
+
+ # Layer and angle update: depends on discrete vs continuous
+ if use_discrete_angles:
+ # Discrete sampling: combined angle+layer logits
+ # Categories 0-6: angle categories, Category 7: dead layer
+ probs_angle = F.softmax(outputs['angle_logits'], dim=-1) # (B, L, n_angle_categories + 1)
+ remask_angle = (torch.rand(B, L, device=device) < remask_prob)
+ masked_angle = (x_angle_t == mask_ids['angle']) | remask_angle
+ if masked_angle.any():
+ flat_probs_angle = probs_angle.view(-1, probs_angle.size(-1))[masked_angle.view(-1)] # (N, n_angle_categories + 1)
+ new_angle = torch.multinomial(flat_probs_angle, 1).squeeze(-1) # (N,)
+ x_angle_t = x_angle_t.clone()
+ x_angle_t[masked_angle] = new_angle
+
+ # Update layer_t based on angle_t: if angle == dead_category, layer is dead (0), else alive (1)
+ # Get dead_category from angle_logits size
+ n_angle_categories = probs_angle.size(-1) - 1
+ dead_category = n_angle_categories
+ x_layer_t = (x_angle_t != dead_category).long() # 1 if alive (angle != dead_category), 0 if dead (angle == dead_category)
+ else:
+ # Continuous: separate layer and angle updates
+ probs_layer = F.softmax(outputs['layer_logits'], dim=-1) # (B, L, 2)
+ remask_layer = (torch.rand(B, L, device=device) < remask_prob)
+ masked = (x_layer_t == mask_ids['layer']) | remask_layer
+ if masked.any():
+ flat_probs = probs_layer.view(-1, 2)[masked.view(-1)] # (N, 2)
+ new_layer = torch.multinomial(flat_probs, 1).squeeze(-1) # (N,)
+ x_layer_t = x_layer_t.clone()
+ x_layer_t[masked] = new_layer
+
+ # Continuous update (angle)
+ angle_pred = outputs['angle'] # (B, L, 1) - predicted x0
+ # Compute predicted noise from predicted x0
+ sqrt_alpha_bar_t = cont_diff.sqrt_alpha_bar[t].view(-1, 1, 1)
+ sqrt_one_minus_alpha_bar_t = cont_diff.sqrt_one_minus_alpha_bar[t].view(-1, 1, 1)
+ eps_pred = (x_angle_t - sqrt_alpha_bar_t * angle_pred) / sqrt_one_minus_alpha_bar_t.clamp_min(1e-8)
+
+ # DDPM reverse step (denoising)
+ x_angle_t = cont_diff.p_sample_step(x_angle_t, t, eps_pred)
+
+ return {
+ 'material_t': x_material_t,
+ 'vf_category_t': x_vf_category_t,
+ 'layer_t': x_layer_t,
+ 'angle_t': x_angle_t
+ }
+
+
+# -----------------------
+# Metrics Computation
+# -----------------------
+
+# Volume fraction categories
+VF_CATEGORIES = [0.0924, 0.2155, 0.3079, 0.4002, 0.4926]
+
+def vf_category_to_volume_fraction(vf_category: int) -> float:
+ """
+ Convert volume fraction category index to volume fraction value.
+
+ Args:
+ vf_category: Category index (0-4)
+
+ Returns:
+ Volume fraction value
+ """
+ if 0 <= vf_category < len(VF_CATEGORIES):
+ return VF_CATEGORIES[vf_category]
+ return VF_CATEGORIES[0] # Default to first category
+
+def angle_category_to_degrees(angle_categories: np.ndarray, angle_categories_list: np.ndarray) -> np.ndarray:
+ """
+ Convert angle category indices to degrees.
+
+ Args:
+ angle_categories: Array of category indices
+ angle_categories_list: Array of angle values in degrees corresponding to each category
+
+ Returns:
+ Array of angles in degrees
+ """
+ return np.array([angle_categories_list[int(cat)] for cat in angle_categories])
+
+
+def find_matching_samples_in_dataset(
+ generated_sample: Dict[str, torch.Tensor],
+ dataset_data: Dict[str, np.ndarray],
+ use_discrete_angles: bool = True,
+ tolerance: float = 0.1,
+ angle_categories: Optional[np.ndarray] = None
+) -> List[int]:
+ """
+ Find samples in dataset that match the generated sample.
+
+ Args:
+ generated_sample: Dictionary with generated values
+ - material_t: (1,) material type
+ - vf_category_t: (1,) volume fraction category (0-4)
+ - layer_t: (L,) layer mask
+ - angle_t: (L,) angle categories OR (L, 1) continuous
+ dataset_data: Dictionary with dataset arrays
+ use_discrete_angles: Whether using discrete angles
+ tolerance: Tolerance for angle matching in degrees (for continuous)
+
+ Returns:
+ List of matching sample indices
+ """
+ # Extract generated values
+ gen_material = generated_sample['material_t'].item()
+ gen_vf_category = generated_sample['vf_category_t'].item()
+ gen_vf = vf_category_to_volume_fraction(gen_vf_category)
+ gen_layer = generated_sample['layer_t'].cpu().numpy() # (L,)
+ gen_angle = generated_sample['angle_t'].cpu().numpy() # (L,) or (L, 1)
+
+ # Count alive layers
+ if use_discrete_angles:
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided when use_discrete_angles=True")
+ n_angle_categories = len(angle_categories)
+ dead_category = n_angle_categories
+ gen_nlayers = (gen_angle != dead_category).sum()
+ gen_alive_mask = (gen_angle != dead_category)
+ gen_angles_alive = gen_angle[gen_alive_mask]
+ gen_angles_deg = angle_category_to_degrees(gen_angles_alive, angle_categories)
+ else:
+ gen_nlayers = gen_layer.sum()
+ gen_alive_mask = gen_layer == 1
+ gen_angles_alive = gen_angle[gen_alive_mask, 0] if gen_angle.ndim > 1 else gen_angle[gen_alive_mask]
+ gen_angles_deg = np.rad2deg(gen_angles_alive)
+
+ # Sort angles for comparison
+ gen_angles_sorted = np.sort(gen_angles_deg)
+
+ # Search dataset
+ matching_indices = []
+
+ for idx in range(len(dataset_data['material_type'])):
+ # Match material
+ if dataset_data['material_type'][idx] != gen_material:
+ continue
+
+ # Match volume fraction (exact match for category)
+ dataset_vf = float(dataset_data['volume_fraction'][idx])
+ if abs(dataset_vf - gen_vf) > 1e-4: # Small tolerance for floating point
+ continue
+
+ # Match layer count
+ n_layers = dataset_data['stacking_sequence_lengths'][idx]
+ if n_layers != gen_nlayers:
+ continue
+
+ # Match angles
+ dataset_angles = dataset_data['stacking_sequence'][idx][:n_layers] # (n_layers,) in degrees
+ dataset_angles_sorted = np.sort(dataset_angles)
+
+ if use_discrete_angles:
+ # For discrete, convert dataset angles to categories and compare
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided when use_discrete_angles=True")
+ angle_cats_array = np.array(angle_categories, dtype=np.float32)
+ distances = np.abs(dataset_angles_sorted[:, np.newaxis] - angle_cats_array[np.newaxis, :])
+ dataset_angle_cats = np.argmin(distances, axis=1)
+ dataset_angles_from_cats = angle_category_to_degrees(dataset_angle_cats, angle_cats_array)
+ dataset_angles_sorted = np.sort(dataset_angles_from_cats)
+
+ # Check if angles match (within tolerance)
+ if len(dataset_angles_sorted) == len(gen_angles_sorted):
+ if use_discrete_angles:
+ # Exact match for discrete
+ if np.allclose(dataset_angles_sorted, gen_angles_sorted, atol=1e-6):
+ matching_indices.append(idx)
+ else:
+ # Within tolerance for continuous
+ if np.allclose(dataset_angles_sorted, gen_angles_sorted, atol=tolerance):
+ matching_indices.append(idx)
+
+ return matching_indices
+
+def print_sample_comparison(
+ gt_samples: Dict[str, torch.Tensor],
+ pred_samples: Dict[str, torch.Tensor],
+ n_print: int = 10,
+ material_names: list = None,
+ angle_categories: Optional[np.ndarray] = None
+):
+ """
+ Print ground truth and predicted samples for visual inspection.
+
+ Args:
+ gt_samples: Dictionary with ground truth samples
+ pred_samples: Dictionary with predicted samples
+ n_print: Number of samples to print
+ material_names: List of material names (default: ['CPP', 'CHDPE', 'GPP', 'GHDPE'])
+ """
+ if material_names is None:
+ material_names = ['CPP', 'CHDPE', 'GPP', 'GHDPE']
+
+ B = gt_samples['material_t'].shape[0]
+ n_print = min(n_print, B)
+
+ print("\n" + "="*80)
+ print("SAMPLE COMPARISON (Ground Truth vs Generated)")
+ print("="*80)
+
+ for i in range(n_print):
+ gt_mat = gt_samples['material_t'][i].item()
+ pred_mat = pred_samples['material_t'][i].item()
+ gt_vf_category = gt_samples['vf_category_t'][i].item()
+ pred_vf_category = pred_samples['vf_category_t'][i].item()
+ gt_vf = vf_category_to_volume_fraction(gt_vf_category)
+ pred_vf = vf_category_to_volume_fraction(pred_vf_category)
+ gt_layer = gt_samples['layer_t'][i] # (L,)
+ pred_layer = pred_samples['layer_t'][i] # (L,)
+ gt_angle = gt_samples['angle_t'][i]
+ pred_angle = pred_samples['angle_t'][i]
+
+ gt_nlayers = gt_layer.sum().item()
+ pred_nlayers = pred_layer.sum().item()
+
+ # Get valid angles
+ gt_alive_mask = gt_layer == 1
+ pred_alive_mask = pred_layer == 1
+
+ # Handle both discrete and continuous angles
+ # Check if angles are discrete (1D) or continuous (2D with last dim=1)
+ if gt_angle.dim() == 1:
+ # Discrete categories
+ gt_angle_cats = gt_angle[gt_alive_mask].numpy()
+ pred_angle_cats = pred_angle[pred_alive_mask].numpy()
+
+ if len(gt_angle_cats) > 0:
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided for discrete angles")
+ gt_angles_deg = np.sort(angle_category_to_degrees(gt_angle_cats, angle_categories))
+ else:
+ gt_angles_deg = np.array([])
+ if len(pred_angle_cats) > 0:
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided for discrete angles")
+ pred_angles_deg = np.sort(angle_category_to_degrees(pred_angle_cats, angle_categories))
+ else:
+ pred_angles_deg = np.array([])
+ else:
+ # Continuous (radians)
+ gt_angles = gt_angle[gt_alive_mask, 0].numpy()
+ pred_angles = pred_angle[pred_alive_mask, 0].numpy()
+
+ if len(gt_angles) > 0:
+ gt_angles_deg = np.sort(np.rad2deg(gt_angles))
+ else:
+ gt_angles_deg = np.array([])
+ if len(pred_angles) > 0:
+ pred_angles_deg = np.sort(np.rad2deg(pred_angles))
+ else:
+ pred_angles_deg = np.array([])
+
+ print(f"\nSample {i+1}:")
+ print(f" Material: GT={material_names[gt_mat] if gt_mat < len(material_names) else f'ID{gt_mat}'} | Pred={material_names[pred_mat] if pred_mat < len(material_names) else f'ID{pred_mat}'} {'✓' if gt_mat == pred_mat else '✗'}")
+ print(f" VF Category: GT={gt_vf_category} (vf={gt_vf:.4f}) | Pred={pred_vf_category} (vf={pred_vf:.4f}) {'✓' if gt_vf_category == pred_vf_category else '✗'}")
+ print(f" Nlayers: GT={gt_nlayers} | Pred={pred_nlayers} {'✓' if gt_nlayers == pred_nlayers else '✗'}")
+
+ # Always print angles, even if layer counts don't match
+ print(f" Angles (deg):")
+ if len(gt_angles_deg) > 0:
+ print(f" GT: {gt_angles_deg}")
+ else:
+ print(f" GT: []")
+ if len(pred_angles_deg) > 0:
+ print(f" Pred: {pred_angles_deg}")
+ else:
+ print(f" Pred: []")
+
+ # Compute L1 error if layer counts match
+ if gt_nlayers == pred_nlayers and gt_nlayers > 0 and len(gt_angles_deg) == len(pred_angles_deg):
+ l1_error = np.mean(np.abs(gt_angles_deg - pred_angles_deg))
+ print(f" L1 Error: {l1_error:.2f}°")
+ elif gt_nlayers != pred_nlayers:
+ print(f" (Layer count mismatch: GT={gt_nlayers}, Pred={pred_nlayers})")
+
+ print("="*80 + "\n")
+
+
+@torch.no_grad()
+def compute_generation_metrics(
+ model: MaterialHybridDenoiser,
+ disc_diff_mat: DiscreteMaskDiffusion,
+ disc_diff_vf_category: DiscreteMaskDiffusion,
+ disc_diff_layer: DiscreteMaskDiffusion,
+ disc_diff_angle: DiscreteMaskDiffusion = None,
+ cont_diff: GaussianDiffusion = None,
+ test_loader: DataLoader = None,
+ mask_ids: Dict[str, int] = None,
+ device: str = None,
+ n_samples: Optional[int] = None, # None = use all test samples
+ remask_prob: float = 0.1,
+ print_samples: bool = True,
+ n_print_samples: int = 10,
+ use_discrete_angles: bool = True,
+ dataset_data: Dict[str, np.ndarray] = None,
+ metadata: Dict = None,
+ visualize_matches: bool = False,
+ save_visualizations: bool = False,
+ vis_save_dir: str = None,
+ epoch: int = None,
+ normalization_method: str = 'minmax',
+ n_visualization_samples: int = 10, # Number of samples to generate visualizations for
+ angle_categories: Optional[np.ndarray] = None
+) -> Dict[str, float]:
+ """
+ Compute generation-based metrics by actually generating samples.
+
+ Args:
+ model: MaterialHybridDenoiser model
+ disc_diff_mat: Discrete diffusion for material
+ disc_diff_vf_category: Discrete diffusion for volume fraction category
+ disc_diff_layer: Discrete diffusion for layer
+ disc_diff_angle: Discrete diffusion for angles (if use_discrete_angles)
+ cont_diff: Continuous diffusion for angles (if not use_discrete_angles)
+ test_loader: Test dataloader
+ mask_ids: Dictionary of mask IDs
+ device: Device to run on
+ n_samples: Number of samples to generate and evaluate
+ remask_prob: Remasking probability during sampling
+ print_samples: Whether to print sample comparisons for visual inspection
+ n_print_samples: Number of samples to print (if print_samples=True)
+ use_discrete_angles: Whether using discrete angles
+ dataset_data: Dataset data dictionary for matching (optional)
+ metadata: Metadata dictionary for coefficient extraction (optional)
+ visualize_matches: Whether to visualize matches with dataset samples
+ save_visualizations: Whether to save visualization plots
+ vis_save_dir: Directory to save visualizations
+ epoch: Current epoch number (for saving)
+
+ Returns:
+ Dictionary with generation metrics:
+ - material_accuracy: Classification accuracy for material
+ - nfiber_accuracy: Exact match accuracy for number of fibers
+ - nfiber_l1_error: Average L1 error for number of fibers
+ - nlayers_accuracy: Exact match accuracy for number of layers
+ - nlayers_l1_error: Average L1 error for number of layers
+ - angle_l1_error: Average L1 error for angles in degrees (only when layer counts match)
+ - angle_valid_samples: Number of samples with matching layer counts
+ """
+ model.eval()
+
+ material_correct = []
+ vf_category_correct = []
+ nlayers_correct = []
+ nlayers_l1_errors = []
+ angle_l1_errors = []
+
+ # Store samples for printing
+ gt_samples_for_print = None
+ pred_samples_for_print = None
+
+ # Dataset matching disabled - not needed
+
+ # Visualization data
+ visualization_samples = [] if visualize_matches else None
+
+ # Determine total number of samples to process
+ if n_samples is None:
+ # Use all test samples
+ n_samples = len(test_loader.dataset)
+
+ sample_count = 0
+
+ # Create progress bar
+ pbar = tqdm(total=n_samples, desc="Generating samples for metrics")
+
+ for batch in test_loader:
+ if sample_count >= n_samples:
+ break
+
+ batch = {k: v.to(device) for k, v in batch.items()}
+ B = batch['material_t'].shape[0]
+
+ # Determine how many samples to process from this batch
+ remaining = n_samples - sample_count
+ batch_size_to_process = min(B, remaining)
+
+ # Extract batch subset
+ batch_subset = {
+ 'material_t': batch['material_t'][:batch_size_to_process],
+ 'vf_category_t': batch['vf_category_t'][:batch_size_to_process],
+ 'layer_t': batch['layer_t'][:batch_size_to_process],
+ 'angle_t': batch['angle_t'][:batch_size_to_process],
+ 'cond': batch['cond'][:batch_size_to_process]
+ }
+
+ # Generate predictions in batch
+ pred = sample(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ cond=batch_subset['cond'],
+ mask_ids=mask_ids,
+ device=device,
+ remask_prob=remask_prob,
+ use_discrete_angles=use_discrete_angles
+ )
+
+ # Store first batch for printing
+ if print_samples and gt_samples_for_print is None:
+ gt_samples_for_print = {k: v.cpu() for k, v in batch_subset.items() if k != 'cond'}
+ pred_samples_for_print = {k: v.cpu() for k, v in pred.items()}
+
+ # Dataset matching disabled - not needed
+
+ # Process each sample in batch
+ for i in range(batch_size_to_process):
+ # Material accuracy
+ pred_material = pred['material_t'][i].item()
+ gt_material = batch_subset['material_t'][i].item()
+ material_correct.append(1.0 if pred_material == gt_material else 0.0)
+
+ # VF category accuracy
+ pred_vf_category = pred['vf_category_t'][i].item()
+ gt_vf_category = batch_subset['vf_category_t'][i].item()
+ vf_category_correct.append(1.0 if pred_vf_category == gt_vf_category else 0.0)
+
+ # Layer accuracy (number of layers) and L1 error
+ if use_discrete_angles:
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided for discrete angles")
+ n_angle_categories = len(angle_categories)
+ dead_category = n_angle_categories
+ pred_nlayers = (pred['angle_t'][i] != dead_category).sum().item()
+ gt_nlayers = (batch_subset['angle_t'][i] != dead_category).sum().item()
+ else:
+ pred_nlayers = pred['layer_t'][i].sum().item()
+ gt_nlayers = batch_subset['layer_t'][i].sum().item()
+ nlayers_correct.append(1.0 if pred_nlayers == gt_nlayers else 0.0)
+ nlayers_l1_errors.append(abs(pred_nlayers - gt_nlayers))
+
+ # Angle error (only if layer counts match)
+ if pred_nlayers == gt_nlayers and pred_nlayers > 0:
+ if use_discrete_angles:
+ # Extract alive angle category indices (where angle != dead_category)
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided for discrete angles")
+ n_angle_categories = len(angle_categories)
+ dead_category = n_angle_categories
+ pred_alive_mask = (pred['angle_t'][i] != dead_category).cpu().numpy()
+ gt_alive_mask = (batch_subset['angle_t'][i] != dead_category).cpu().numpy()
+
+ pred_angle_cats = pred['angle_t'][i, pred_alive_mask].cpu().numpy()
+ gt_angle_cats = batch_subset['angle_t'][i, gt_alive_mask].cpu().numpy()
+
+ # Convert categories to degrees
+ pred_angles_deg = angle_category_to_degrees(pred_angle_cats, angle_categories)
+ gt_angles_deg = angle_category_to_degrees(gt_angle_cats, angle_categories)
+
+ # Sort angles for comparison (stacking sequence may not be sorted)
+ pred_angles_deg = np.sort(pred_angles_deg)
+ gt_angles_deg = np.sort(gt_angles_deg)
+ else:
+ # Extract continuous angles
+ pred_alive_mask = pred['layer_t'][i] == 1
+ gt_alive_mask = batch_subset['layer_t'][i] == 1
+
+ pred_angles = pred['angle_t'][i, pred_alive_mask, 0].cpu().numpy()
+ gt_angles = batch_subset['angle_t'][i, gt_alive_mask, 0].cpu().numpy()
+
+ # Convert to degrees
+ pred_angles_deg = np.rad2deg(pred_angles)
+ gt_angles_deg = np.rad2deg(gt_angles)
+
+ # Sort angles for comparison (stacking sequence may not be sorted)
+ pred_angles_deg = np.sort(pred_angles_deg)
+ gt_angles_deg = np.sort(gt_angles_deg)
+
+ # Compute L1 error on sorted angles (for meaningful comparison)
+ l1_error = np.mean(np.abs(pred_angles_deg - gt_angles_deg))
+ angle_l1_errors.append(l1_error)
+
+ sample_count += 1
+ pbar.update(1)
+
+ pbar.close()
+
+ # Print sample comparisons
+ if print_samples and gt_samples_for_print is not None:
+ print_sample_comparison(
+ gt_samples_for_print,
+ pred_samples_for_print,
+ n_print=n_print_samples,
+ angle_categories=angle_categories
+ )
+
+ # Aggregate metrics
+ material_accuracy = np.mean(material_correct) if material_correct else 0.0
+ vf_category_accuracy = np.mean(vf_category_correct) if vf_category_correct else 0.0
+ nlayers_accuracy = np.mean(nlayers_correct) if nlayers_correct else 0.0
+ nlayers_l1_error = np.mean(nlayers_l1_errors) if nlayers_l1_errors else 0.0
+
+ if len(angle_l1_errors) > 0:
+ angle_l1_error = np.mean(angle_l1_errors)
+ angle_valid_samples = len(angle_l1_errors)
+ else:
+ angle_l1_error = float('nan')
+ angle_valid_samples = 0
+
+ # Dataset matching disabled - not needed
+
+ # Create visualization plots if enabled
+ if visualize_matches and visualization_samples and len(visualization_samples) > 0:
+ try:
+ import matplotlib
+ matplotlib.use('Agg') # Non-interactive backend
+ import matplotlib.pyplot as plt
+
+ if save_visualizations and vis_save_dir:
+ # Create epoch subfolder
+ epoch_dir = os.path.join(vis_save_dir, f"epoch_{epoch}")
+ os.makedirs(epoch_dir, exist_ok=True)
+ else:
+ epoch_dir = None
+
+ for vis_idx, vis_data in enumerate(visualization_samples):
+ _plot_sample_with_matches(
+ vis_data['generated'],
+ vis_data['matching_indices'],
+ vis_data['gt'],
+ dataset_data,
+ use_discrete_angles=use_discrete_angles,
+ save_path=os.path.join(epoch_dir, f"sample_{vis_idx+1}.png") if save_visualizations and epoch_dir else None,
+ plt=plt,
+ cond=vis_data.get('cond'),
+ metadata=metadata,
+ normalize_method=normalization_method,
+ angle_categories=angle_categories
+ )
+ except ImportError:
+ print("Warning: matplotlib not available, skipping visualizations")
+ except Exception as e:
+ print(f"Warning: Failed to create visualizations: {e}")
+
+ return {
+ 'material_accuracy': material_accuracy,
+ 'vf_category_accuracy': vf_category_accuracy,
+ 'nlayers_accuracy': nlayers_accuracy,
+ 'nlayers_l1_error': nlayers_l1_error,
+ 'angle_l1_error': angle_l1_error,
+ 'angle_valid_samples': angle_valid_samples
+ }
+
+
+def _denormalize_coefficients(
+ normalized_coeffs: np.ndarray,
+ metadata: Dict,
+ normalize_method: str = 'minmax'
+) -> np.ndarray:
+ """
+ Denormalize coefficients from normalized form back to original scale.
+
+ Args:
+ normalized_coeffs: Normalized coefficients [5*degree]
+ metadata: Metadata dictionary with normalization stats
+ normalize_method: 'minmax' or 'zscore'
+
+ Returns:
+ Denormalized coefficients [5*degree]
+ """
+ coeffs = normalized_coeffs.copy()
+
+ if normalize_method == 'minmax':
+ coeff_min = np.array(metadata.get('coefficient_min', []))
+ coeff_max = np.array(metadata.get('coefficient_max', []))
+ if len(coeff_min) > 0 and len(coeff_max) > 0:
+ range_vals = coeff_max - coeff_min
+ range_vals = np.where(range_vals == 0, 1.0, range_vals)
+ coeffs = coeffs * range_vals + coeff_min
+ elif normalize_method == 'zscore':
+ # For zscore, we must use mean and std from metadata
+ coeff_mean = np.array(metadata.get('coefficient_mean', []))
+ coeff_std = np.array(metadata.get('coefficient_std', []))
+ if len(coeff_mean) == 0 or len(coeff_std) == 0:
+ raise ValueError("Metadata must contain 'coefficient_mean' and 'coefficient_std' for zscore denormalization")
+ std_vals = np.where(coeff_std == 0, 1.0, coeff_std)
+ coeffs = coeffs * std_vals + coeff_mean
+
+
+ return coeffs
+
+
+def _simulation_worker(args):
+ """
+ Worker function for multiprocessing simulations.
+
+ Args:
+ args: Tuple of (sample_idx, mat_type, vf_str, upper_angles, instance, curve_dir, data_gen_path)
+
+ Returns:
+ Tuple of (sample_idx, instance, success, simulation_results or error_message)
+ """
+ sample_idx, mat_type, vf_str, upper_angles, instance, curve_dir, data_gen_path = args
+
+ try:
+ # Import generate_data_mp functions
+ sys.path.insert(0, str(data_gen_path))
+ from generate_data_mp import run_simulation_with_mat, build_full_symmetric_stack
+
+ # Import lam module functions
+ curve_dir_path = Path(curve_dir).resolve()
+ lam_path = curve_dir_path.parent.parent / "shahriar_modified_2025_12"
+ if not lam_path.exists():
+ lam_path = data_gen_path / "shahriar_modified_2025_12"
+ if not lam_path.exists():
+ lam_path = curve_dir_path.parent / "shahriar_modified_2025_12"
+
+ if not lam_path.exists() or not (lam_path / "lam.py").exists():
+ return (sample_idx, instance, False, f"Could not find lam.py at {lam_path}")
+
+ sys.path.insert(0, str(lam_path))
+ import importlib.util
+ spec = importlib.util.spec_from_file_location("lam", lam_path / "lam.py")
+ lam = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(lam)
+
+ read_instance_metadata = lam.read_instance_metadata
+ load_ud_material_from_files = lam.load_ud_material_from_files
+
+ prefix = f"{mat_type}_{vf_str}_{instance}"
+
+ # Set CURVE_DIR
+ original_curve_dir = lam.CURVE_DIR
+ abs_curve_dir = curve_dir_path.resolve()
+ lam.CURVE_DIR = abs_curve_dir
+
+ try:
+ vf_meta, centers_meta, n_fibers = read_instance_metadata(prefix)
+ mat = load_ud_material_from_files(prefix)
+ except Exception as e:
+ lam.CURVE_DIR = original_curve_dir
+ return (sample_idx, instance, False, f"Failed to load material: {e}")
+
+ # Build full symmetric stack
+ sorted_upper_angles = sorted(upper_angles)
+ full_angles = build_full_symmetric_stack(sorted_upper_angles)
+
+ # Run simulations for all three modes
+ simulation_results = {}
+ for mode in ("11", "22", "12"):
+ try:
+ result = run_simulation_with_mat(prefix, full_angles, mode, mat)
+ ex, sx, ey, gxy, ezz, g23, g13, e11 = result
+
+ # Interpolate to output points
+ num_output_points = 10
+ x_out = np.linspace(ex[0], ex[-1], num_output_points)
+ sx_out_MPa = np.interp(x_out, ex, sx/1e6)
+
+ if mode == "11":
+ lateral_out = np.interp(x_out, ex, ey)
+ elif mode == "22":
+ lateral_out = np.interp(x_out, ex, e11)
+ else:
+ lateral_out = None
+
+ simulation_results[mode] = {
+ 'strain': x_out,
+ 'stress': sx_out_MPa,
+ 'lateral': lateral_out
+ }
+ except Exception as e:
+ # Continue with other modes if one fails
+ continue
+
+ lam.CURVE_DIR = original_curve_dir
+
+ if simulation_results:
+ return (sample_idx, instance, True, simulation_results)
+ else:
+ return (sample_idx, instance, False, "All simulation modes failed")
+
+ except Exception as e:
+ return (sample_idx, instance, False, f"Worker error: {e}")
+
+
+@torch.no_grad()
+def validate_with_on_the_fly_generation(
+ model: MaterialHybridDenoiser,
+ disc_diff_mat: DiscreteMaskDiffusion,
+ disc_diff_vf_category: DiscreteMaskDiffusion,
+ disc_diff_layer: DiscreteMaskDiffusion,
+ disc_diff_angle: DiscreteMaskDiffusion = None,
+ cont_diff: GaussianDiffusion = None,
+ test_loader: DataLoader = None,
+ mask_ids: Dict[str, int] = None,
+ device: str = None,
+ n_samples: int = 10,
+ use_discrete_angles: bool = True,
+ metadata: Dict = None,
+ angle_categories: Optional[np.ndarray] = None,
+ curve_dir: str = None,
+ instances: List[int] = None, # List of instances to simulate (default: [1, 2, 3])
+ save_dir: Optional[str] = None,
+ epoch: int = None,
+ normalization_method: str = 'minmax',
+ num_processes: int = None # Number of processes for multiprocessing (None = auto)
+):
+ """
+ Validate model by generating samples and running simulations on-the-fly.
+
+ This function:
+ 1. Generates design parameters from the model given conditioned inputs
+ 2. Runs simulations using generate_data_mp.py to get actual curves
+ 3. Plots generated curves against conditioned input coefficients
+
+ Args:
+ model: MaterialHybridDenoiser model
+ disc_diff_mat: Discrete diffusion for material
+ disc_diff_vf_category: Discrete diffusion for volume fraction category
+ disc_diff_layer: Discrete diffusion for layer
+ disc_diff_angle: Discrete diffusion for angles (if discrete)
+ cont_diff: Gaussian diffusion for angles (if continuous)
+ test_loader: Test dataloader
+ mask_ids: Dictionary of mask IDs
+ device: Device to run on
+ n_samples: Number of samples to validate
+ use_discrete_angles: Whether using discrete angles
+ metadata: Metadata dictionary
+ angle_categories: Array of angle categories in degrees
+ curve_dir: Directory containing material curve files
+ instances: List of instance numbers to simulate (default: [1, 2, 3])
+ save_dir: Directory to save plots
+ epoch: Current epoch number
+ normalization_method: Normalization method used
+ num_processes: Number of processes for multiprocessing (None = auto)
+
+ Returns:
+ Dictionary with validation metrics
+ """
+ if not DATA_GEN_AVAILABLE:
+ print("Warning: generate_data_mp.py not available, skipping on-the-fly validation")
+ return {}
+
+ if curve_dir is None:
+ print("Warning: curve_dir not provided, skipping on-the-fly validation")
+ return {}
+
+ if instances is None:
+ instances = [1, 2, 3]
+
+ if num_processes is None:
+ num_processes = min(len(instances) * 2, mp.cpu_count())
+
+ model.eval()
+
+ # Material type names
+ material_names = ['CPP', 'CHDPE', 'GPP', 'GHDPE']
+ vf_categories = [0.0924, 0.2155, 0.3079, 0.4002, 0.4926]
+
+ # Import generate_data_mp functions once
+ data_gen_path = Path(__file__).parent.parent / "data_generation"
+ sys.path.insert(0, str(data_gen_path))
+ from generate_data_mp import format_vol_fraction
+
+ # Get samples from test loader
+ validation_samples = []
+ sample_count = 0
+
+ for batch in test_loader:
+ if sample_count >= n_samples:
+ break
+
+ batch = {k: v.to(device) for k, v in batch.items()}
+ B = batch['material_t'].shape[0]
+
+ for b in range(B):
+ if sample_count >= n_samples:
+ break
+
+ # Extract conditioned input
+ cond = batch['cond'][b:b+1] # (1, n_conditions)
+
+ # Actually generate sample from model using diffusion process
+ # Use globals() to explicitly reference the sample function to avoid naming conflict
+ # with variables like sample_info, sample_data, etc.
+ sample_func = globals()['sample']
+ gen_sample_dict = sample_func(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle if use_discrete_angles else None,
+ cont_diff=cont_diff if not use_discrete_angles else None,
+ cond=cond,
+ mask_ids=mask_ids,
+ device=device,
+ remask_prob=0.1,
+ use_discrete_angles=use_discrete_angles
+ )
+
+ # Convert to the format expected by the rest of the code
+ gen_sample = {
+ 'material_t': gen_sample_dict['material_t'],
+ 'vf_category_t': gen_sample_dict['vf_category_t'],
+ 'layer_t': gen_sample_dict['layer_t'],
+ 'angle_t': gen_sample_dict['angle_t']
+ }
+
+ # Also get the input condition coefficients (from test data)
+ # The cond is already normalized, we need to denormalize it
+ cond_np = cond.cpu().numpy().flatten()
+ cond_denorm = _denormalize_coefficients(cond_np, metadata, normalization_method)
+ degree = metadata.get('polynomial_degree', 3)
+ input_cond_coeffs = cond_denorm.reshape(5, degree)
+
+ # Extract input condition parameters (from ground truth/test data)
+ input_mat_type_idx = batch['material_t'][b].item()
+ input_vf_category_idx = batch['vf_category_t'][b].item()
+ input_vf = vf_categories[input_vf_category_idx]
+ input_layer_mask = batch['layer_t'][b].cpu().numpy()
+ input_angle_t = batch['angle_t'][b].cpu().numpy()
+
+ # Get input angles
+ if use_discrete_angles:
+ if angle_categories is not None:
+ n_angle_categories = len(angle_categories)
+ dead_category = n_angle_categories
+ input_alive_mask = (input_angle_t != dead_category)
+ input_angle_cats = input_angle_t[input_alive_mask]
+ input_angles = angle_category_to_degrees(input_angle_cats, angle_categories).tolist()
+ else:
+ input_angles = []
+ else:
+ input_alive_mask = input_layer_mask == 1
+ input_angles_rad = input_angle_t[input_alive_mask, 0] if input_angle_t.ndim > 1 else input_angle_t[input_alive_mask]
+ input_angles = np.rad2deg(input_angles_rad).tolist()
+
+ # Optional: global index into metadata['file_metadata'] (if provided by dataset)
+ global_idx = int(batch['global_idx'][b].item()) if 'global_idx' in batch else -1
+
+ validation_samples.append({
+ 'generated': gen_sample,
+ 'cond': cond,
+ 'input_cond_coeffs': input_cond_coeffs, # Input condition coefficients from test data
+ 'degree': degree,
+ 'global_idx': global_idx,
+ 'input_cond_params': { # Input condition parameters
+ 'material': material_names[input_mat_type_idx],
+ 'vf': input_vf,
+ 'angles': sorted(input_angles) if input_angles else []
+ },
+ 'gt': {
+ 'material_t': batch['material_t'][b:b+1],
+ 'vf_category_t': batch['vf_category_t'][b:b+1],
+ 'layer_t': batch['layer_t'][b:b+1],
+ 'angle_t': batch['angle_t'][b:b+1]
+ }
+ })
+ sample_count += 1
+
+ # Prepare simulation tasks (all samples × all instances)
+ curve_dir_path = Path(curve_dir).resolve()
+ if not curve_dir_path.exists():
+ print(f"Warning: curve_dir does not exist: {curve_dir_path}")
+ return {}
+
+ simulation_tasks = []
+ sample_info = [] # Store sample metadata for later
+
+ print(f" Preparing {len(validation_samples)} validation samples for {len(instances)} instances...")
+ for idx, sample_data in enumerate(validation_samples):
+ try:
+ gen = sample_data['generated']
+
+ # Extract generated parameters
+ mat_type_idx = gen['material_t'].item()
+ vf_category_idx = gen['vf_category_t'].item()
+ vf = vf_categories[vf_category_idx]
+ layer_mask = gen['layer_t'].cpu().numpy()[0]
+ angle_t = gen['angle_t'].cpu().numpy()[0]
+
+ # Get angles
+ if use_discrete_angles:
+ if angle_categories is None:
+ continue
+ n_angle_categories = len(angle_categories)
+ dead_category = n_angle_categories
+ alive_mask = (angle_t != dead_category)
+ angle_cats = angle_t[alive_mask]
+ upper_angles = angle_category_to_degrees(angle_cats, angle_categories).tolist()
+ else:
+ # Continuous angles in radians
+ alive_mask = layer_mask == 1
+ angles_rad = angle_t[alive_mask, 0] if angle_t.ndim > 1 else angle_t[alive_mask]
+ upper_angles = np.rad2deg(angles_rad).tolist()
+
+ if len(upper_angles) == 0:
+ continue
+
+ mat_type = material_names[mat_type_idx]
+ vf_str = format_vol_fraction(vf)
+
+ # Store sample info
+ sample_info.append({
+ 'idx': idx,
+ 'mat_type': mat_type,
+ 'vf': vf,
+ 'vf_str': vf_str,
+ 'angles': sorted(upper_angles),
+ 'input_cond_coeffs': sample_data['input_cond_coeffs'],
+ 'global_idx': sample_data.get('global_idx', -1),
+ 'input_cond_params': sample_data.get('input_cond_params', {}), # Input condition parameters
+ 'generated_cond_coeffs': None, # Will be computed later
+ 'degree': sample_data['degree']
+ })
+
+ # Create tasks for all instances
+ for instance in instances:
+ simulation_tasks.append((idx, mat_type, vf_str, upper_angles, instance, str(curve_dir_path), str(data_gen_path)))
+
+ except Exception as e:
+ continue
+
+ # Run simulations with multiprocessing
+ print(f" Running {len(simulation_tasks)} simulations using {num_processes} processes...")
+ results_dict = {} # {(sample_idx, instance): simulation_results}
+
+ if num_processes > 1:
+ with mp.Pool(processes=num_processes) as pool:
+ sim_results = list(tqdm(
+ pool.imap(_simulation_worker, simulation_tasks),
+ total=len(simulation_tasks),
+ desc=" Simulations"
+ ))
+ else:
+ # Single process (for debugging)
+ sim_results = list(tqdm(
+ map(_simulation_worker, simulation_tasks),
+ total=len(simulation_tasks),
+ desc=" Simulations"
+ ))
+
+ # Organize results by sample and instance
+ for sample_idx, instance, success, result_data in sim_results:
+ if success:
+ results_dict[(sample_idx, instance)] = result_data
+
+ # Combine results for plotting
+ results = []
+ for sample in sample_info:
+ # Collect simulation results for all instances
+ instance_results = {}
+ for instance in instances:
+ key = (sample['idx'], instance)
+ if key in results_dict:
+ instance_results[instance] = results_dict[key]
+
+ if instance_results:
+ # Also compute generated condition coefficients from the sample's cond
+ # (This would be from the model output, but for now we use the input)
+ # In a full implementation, you'd generate this from the model
+ results.append({
+ 'sample_idx': sample['idx'],
+ 'material': sample['mat_type'],
+ 'vf': sample['vf'],
+ 'angles': sample['angles'],
+ 'simulations_by_instance': instance_results, # {instance: simulation_results}
+ 'input_cond_coeffs': sample['input_cond_coeffs'], # From test data
+ 'global_idx': sample.get('global_idx', -1),
+ 'input_cond_params': sample.get('input_cond_params', {}), # Input condition parameters
+ 'generated_cond_coeffs': sample['input_cond_coeffs'], # TODO: Replace with actual generated
+ 'degree': sample['degree']
+ })
+
+ print(f" Successfully processed {len(results)} samples with simulations")
+
+ # Plot results
+ if save_dir and len(results) > 0:
+ try:
+ import matplotlib
+ matplotlib.use('Agg')
+ import matplotlib.pyplot as plt
+ # Optional: plot original conditioned data points (from dataset files) as dots
+ try:
+ from utils.fitting_utils import parse_dataset # type: ignore
+ except Exception:
+ parse_dataset = None
+
+ # Create epoch subfolder
+ if epoch is not None:
+ epoch_save_dir = os.path.join(save_dir, f"epoch_{epoch}")
+ else:
+ epoch_save_dir = save_dir
+ os.makedirs(epoch_save_dir, exist_ok=True)
+
+ # Plot each sample (plot all results, no cap for local saving)
+ for result in results:
+ # Check if we have any instances
+ available_instances = [inst for inst in instances if inst in result['simulations_by_instance']]
+ if len(available_instances) == 0:
+ continue
+
+ # Create figure: 2 rows (stress, lateral) × 3 columns (modes)
+ fig, axes = plt.subplots(2, 3, figsize=(15, 10))
+
+ # Build title with both input condition and generated parameters
+ input_params = result.get('input_cond_params', {})
+ input_mat = input_params.get('material', 'N/A')
+ input_vf = input_params.get('vf', 0.0)
+ input_angles = input_params.get('angles', [])
+ input_angles_str = f"{input_angles}" if input_angles else "[]"
+
+ gen_mat = result['material']
+ gen_vf = result['vf']
+ gen_angles = result['angles']
+ gen_angles_str = f"{gen_angles}" if gen_angles else "[]"
+
+ title = (f"Sample {result['sample_idx']}\n"
+ f"Input Cond: {input_mat}, VF={input_vf:.4f}, Angles={input_angles_str}\n"
+ f"Generated: {gen_mat}, VF={gen_vf:.4f}, Angles={gen_angles_str}")
+
+ fig.suptitle(title, fontsize=11)
+
+ # Get coefficients
+ input_cond_coeffs = result['input_cond_coeffs'] # [5, degree]
+ degree = result['degree']
+
+ # Map mode to coefficient row index
+ # Based on fit_all_relationships in fitting_utils.py:
+ # Row 0: eps_11 vs sig_11 (mode 11 stress)
+ # Row 1: eps_11 vs eps_22 (mode 11 lateral)
+ # Row 2: eps_22 vs sig_22 (mode 22 stress)
+ # Row 3: eps_22 vs eps_11 (mode 22 lateral)
+ # Row 4: eps_12 vs sig_12 (mode 12 stress)
+ mode_to_row = {"11": 0, "22": 2, "12": 4}
+ lateral_row = {"11": 1, "22": 3, "12": None} # Mode 12 has no lateral
+
+ # Colors for different instances
+ instance_colors = ['b', 'c', 'm'] # Blue, Cyan, Magenta for instances 1, 2, 3
+
+ # Optionally load original dataset points for this conditioned sample (dots)
+ cond_points = {}
+ if parse_dataset is not None and isinstance(metadata, dict) and "file_metadata" in metadata:
+ try:
+ global_idx = int(result.get("global_idx", -1))
+ if 0 <= global_idx < len(metadata["file_metadata"]):
+ file_meta = metadata["file_metadata"][global_idx]
+ filepath = file_meta.get("filepath") or file_meta.get("file_path") or file_meta.get("filename")
+ if filepath and os.path.exists(filepath):
+ parsed = parse_dataset(filepath)
+ if "section1" in parsed and len(parsed["section1"]) > 0:
+ cond_points["11_stress"] = (parsed["section1"][:, 0], parsed["section1"][:, 1])
+ cond_points["11_lat"] = (parsed["section1"][:, 0], parsed["section1"][:, 2])
+ if "section2" in parsed and len(parsed["section2"]) > 0:
+ cond_points["22_stress"] = (parsed["section2"][:, 0], parsed["section2"][:, 1])
+ cond_points["22_lat"] = (parsed["section2"][:, 0], parsed["section2"][:, 2])
+ if "section3" in parsed and len(parsed["section3"]) > 0:
+ cond_points["12_stress"] = (parsed["section3"][:, 0], parsed["section3"][:, 1])
+ except Exception:
+ cond_points = {}
+
+ def _poly_eval_no_intercept(coeffs_row: np.ndarray, x: np.ndarray) -> np.ndarray:
+ coeffs_with_zero = np.append(np.asarray(coeffs_row, dtype=np.float32), 0.0)
+ return np.polyval(coeffs_with_zero, x)
+
+ def _fit_poly_no_intercept(x: np.ndarray, y: np.ndarray, deg: int) -> Optional[np.ndarray]:
+ x = np.asarray(x, dtype=np.float32).reshape(-1)
+ y = np.asarray(y, dtype=np.float32).reshape(-1)
+ if x.size < 2 or y.size < 2 or x.size != y.size:
+ return None
+ deg = int(max(1, deg))
+ deg = int(min(deg, max(1, x.size - 1)))
+ A = np.vstack([x ** p for p in range(deg, 0, -1)]).T # no constant term
+ try:
+ coeffs, *_ = np.linalg.lstsq(A, y, rcond=None)
+ return coeffs.astype(np.float32)
+ except Exception:
+ return None
+
+ # Color/legend order: match RO whole-parameters logic
+ cond_color = "k"
+
+ # Plot for each mode
+ modes = ["11", "22", "12"]
+ for col, mode in enumerate(modes):
+ # Determine x-range for smooth curves: prefer simulation range, else data range
+ x_min = None
+ x_max = None
+ for instance in available_instances:
+ sim_results = result["simulations_by_instance"].get(instance, {})
+ if mode in sim_results:
+ x_arr = sim_results[mode]["strain"]
+ x_min = float(np.min(x_arr))
+ x_max = float(np.max(x_arr))
+ break
+ if (x_min is None or x_max is None) and f"{mode}_stress" in cond_points:
+ x_min = float(np.min(cond_points[f"{mode}_stress"][0]))
+ x_max = float(np.max(cond_points[f"{mode}_stress"][0]))
+ x_fit = None
+ if x_min is not None and x_max is not None and x_max > x_min:
+ x_fit = np.linspace(x_min, x_max, 200, dtype=np.float32)
+
+ # Condition curve + dots (no connecting dots)
+ try:
+ if x_fit is not None and mode in mode_to_row:
+ coeff_row = mode_to_row[mode]
+ y_fit = _poly_eval_no_intercept(input_cond_coeffs[coeff_row, :], x_fit)
+ axes[0, col].plot(x_fit, y_fit, color=cond_color, linewidth=2, label="Cond input")
+ if f"{mode}_stress" in cond_points:
+ x_d, y_d = cond_points[f"{mode}_stress"]
+ axes[0, col].scatter(x_d, y_d, color=cond_color, s=18, alpha=0.6, marker="x", label="_nolegend_")
+ except Exception:
+ pass
+
+ if mode in ("11", "22"):
+ try:
+ if x_fit is not None and lateral_row.get(mode) is not None:
+ lat_row = lateral_row[mode]
+ y_lat = _poly_eval_no_intercept(input_cond_coeffs[lat_row, :], x_fit)
+ axes[1, col].plot(x_fit, y_lat, color=cond_color, linewidth=2, label="Cond input")
+ if f"{mode}_lat" in cond_points:
+ x_d, y_d = cond_points[f"{mode}_lat"]
+ axes[1, col].scatter(x_d, y_d, color=cond_color, s=18, alpha=0.6, marker="x", label="_nolegend_")
+ except Exception:
+ pass
+ else:
+ axes[1, col].axis("off")
+
+ # Simulations: dots + fitted smooth curves (no connecting dots)
+ for instance_idx, instance in enumerate(available_instances):
+ sim_results = result["simulations_by_instance"].get(instance, {})
+ if mode not in sim_results:
+ continue
+ sim_data = sim_results[mode]
+ strain = sim_data["strain"]
+ stress = sim_data["stress"]
+ color = instance_colors[instance_idx % len(instance_colors)]
+
+ axes[0, col].plot([], [], color=color, linewidth=2, label=f"Sim inst{instance}")
+ axes[0, col].scatter(strain, stress, color=color, s=22, alpha=0.85, label="_nolegend_")
+
+ if x_fit is not None and degree is not None:
+ sim_coeffs = _fit_poly_no_intercept(strain, stress, int(degree))
+ if sim_coeffs is not None:
+ y_fit_sim = _poly_eval_no_intercept(sim_coeffs, x_fit)
+ axes[0, col].plot(x_fit, y_fit_sim, color=color, linewidth=2, alpha=0.9, label="_nolegend_")
+
+ if mode in ("11", "22") and sim_data.get("lateral", None) is not None:
+ lateral = sim_data["lateral"]
+ axes[1, col].plot([], [], color=color, linewidth=2, label=f"Sim inst{instance}")
+ axes[1, col].scatter(strain, lateral, color=color, s=22, alpha=0.85, label="_nolegend_")
+ if x_fit is not None and degree is not None:
+ lat_coeffs = _fit_poly_no_intercept(strain, lateral, int(degree))
+ if lat_coeffs is not None:
+ y_fit_sim = _poly_eval_no_intercept(lat_coeffs, x_fit)
+ axes[1, col].plot(x_fit, y_fit_sim, color=color, linewidth=2, alpha=0.9, label="_nolegend_")
+
+ # Axis formatting + legend once per column
+ axes[0, col].set_xlabel("Strain")
+ axes[0, col].set_ylabel("Stress (MPa)")
+ axes[0, col].set_title(f"Mode {mode}")
+ axes[0, col].grid(True, alpha=0.3)
+ axes[0, col].legend(fontsize=8)
+
+ if mode in ("11", "22"):
+ axes[1, col].set_xlabel("Strain")
+ axes[1, col].set_ylabel("Lateral Strain")
+ axes[1, col].set_title(f"Mode {mode} - Lateral")
+ axes[1, col].grid(True, alpha=0.3)
+ axes[1, col].legend(fontsize=8)
+
+ plt.tight_layout()
+ save_path = os.path.join(epoch_save_dir, f"validation_sample_{result['sample_idx']}_epoch_{epoch}.png")
+ plt.savefig(save_path, dpi=150, bbox_inches='tight')
+ plt.close()
+
+ print(f" Saved {len(results)} validation plots to {epoch_save_dir}")
+
+ except ImportError:
+ print("Warning: matplotlib not available, skipping plots")
+ except Exception as e:
+ print(f"Warning: Failed to create plots: {e}")
+
+ return {
+ 'n_samples_validated': len(results),
+ 'n_samples_total': len(validation_samples)
+ }
+
+
+def _plot_sample_with_matches(
+ generated_sample: Dict[str, torch.Tensor],
+ matching_indices: List[int],
+ gt_sample: Dict[str, torch.Tensor],
+ dataset_data: Dict[str, np.ndarray],
+ use_discrete_angles: bool = True,
+ save_path: Optional[str] = None,
+ plt = None,
+ cond: Optional[torch.Tensor] = None,
+ metadata: Optional[Dict] = None,
+ normalize_method: str = 'minmax',
+ angle_categories: Optional[np.ndarray] = None
+):
+ """
+ Plot a generated sample with its dataset matches, including condition coefficients.
+
+ Args:
+ generated_sample: Generated sample dictionary
+ matching_indices: List of matching dataset indices
+ gt_sample: Ground truth sample dictionary
+ dataset_data: Dataset data dictionary
+ use_discrete_angles: Whether using discrete angles
+ save_path: Path to save plot (optional)
+ plt: matplotlib.pyplot module (must be provided)
+ cond: Input condition tensor [1, 5*degree] used for generation (optional)
+ metadata: Metadata dictionary with normalization stats (optional)
+ normalize_method: Normalization method used ('minmax' or 'zscore')
+ """
+ if plt is None:
+ try:
+ import matplotlib.pyplot as plt
+ except ImportError:
+ print("Warning: matplotlib not available, cannot create plot")
+ return
+ material_names = ['CPP', 'CHDPE', 'GPP', 'GHDPE']
+
+ # Extract generated values
+ gen_mat = generated_sample['material_t'].item()
+ gen_vf_category = generated_sample['vf_category_t'].item()
+ gen_vf = vf_category_to_volume_fraction(gen_vf_category)
+ gen_layer = generated_sample['layer_t'].cpu().numpy()
+ gen_angle = generated_sample['angle_t'].cpu().numpy()
+
+ if use_discrete_angles:
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided for discrete angles")
+ n_angle_categories = len(angle_categories)
+ dead_category = n_angle_categories
+ gen_nlayers = (gen_angle != dead_category).sum()
+ gen_alive_mask = (gen_angle != dead_category)
+ gen_angles = angle_category_to_degrees(gen_angle[gen_alive_mask], angle_categories)
+ else:
+ gen_nlayers = gen_layer.sum()
+ gen_alive_mask = gen_layer == 1
+ gen_angles = np.rad2deg(gen_angle[gen_alive_mask, 0]) if gen_angle.ndim > 1 else np.rad2deg(gen_angle[gen_alive_mask])
+
+ gen_angles_sorted = np.sort(gen_angles)
+
+ # Extract GT values
+ gt_mat = gt_sample['material_t'].item()
+ gt_vf_category = gt_sample['vf_category_t'].item()
+ gt_vf = vf_category_to_volume_fraction(gt_vf_category)
+ gt_layer = gt_sample['layer_t'].cpu().numpy()
+ gt_angle = gt_sample['angle_t'].cpu().numpy()
+
+ if use_discrete_angles:
+ if angle_categories is None:
+ raise ValueError("angle_categories must be provided for discrete angles")
+ gt_nlayers = (gt_angle != dead_category).sum()
+ gt_alive_mask = (gt_angle != dead_category)
+ gt_angles = angle_category_to_degrees(gt_angle[gt_alive_mask], angle_categories)
+ else:
+ gt_nlayers = gt_layer.sum()
+ gt_alive_mask = gt_layer == 1
+ gt_angles = np.rad2deg(gt_angle[gt_alive_mask, 0]) if gt_angle.ndim > 1 else np.rad2deg(gt_angle[gt_alive_mask])
+
+ gt_angles_sorted = np.sort(gt_angles)
+
+ # Extract condition coefficients if available
+ input_coeffs = None
+ degree = None
+ input_cond_length = None
+ training_degree = None
+ if cond is not None and metadata is not None:
+ try:
+ cond_np = cond.cpu().numpy().flatten() if isinstance(cond, torch.Tensor) else cond.flatten()
+ input_cond_length = len(cond_np)
+ training_degree = metadata.get('polynomial_degree', 3)
+ degree = training_degree # Use training degree for input
+ expected_length = 5 * degree
+ if len(cond_np) == expected_length:
+ input_coeffs_denorm = _denormalize_coefficients(cond_np, metadata, normalize_method)
+ # Reshape to [5, degree] for easier plotting
+ input_coeffs = input_coeffs_denorm.reshape(5, degree)
+ else:
+ print(f"Warning: Input condition length mismatch: got {len(cond_np)} coefficients, "
+ f"expected {expected_length} (5 relationships × degree {degree})")
+ except Exception as e:
+ print(f"Warning: Could not extract input coefficients: {e}")
+ input_coeffs = None
+ # Initialize match lists (always initialize to avoid reference errors)
+ match_coeffs_list = []
+ match_data_points_list = []
+
+ if len(matching_indices) > 0:
+ try:
+ # Always use training degree for fitting (from metadata)
+ fit_degree = training_degree if training_degree is not None else (degree if degree is not None else 3)
+
+ if degree is None:
+ degree = fit_degree
+
+ # Import polynomial fitting function
+ from utils.fitting_utils import parse_dataset, polynomial_fit
+
+ # Try common dataset root paths
+ potential_roots = [
+ "datasets/Laminate Datasets",
+ "/home/feiyang/Desktop/MaterialGeneration/MaterialGeneration/demo/datasets/Laminate Datasets"
+ ]
+ dataset_root_path = None
+ for root in potential_roots:
+ if os.path.exists(root):
+ dataset_root_path = root
+ break
+
+ if dataset_root_path is None:
+ # Silently skip loading original data files - not needed for testing
+ pass
+
+ material_names = ['CPP', 'CHDPE', 'GPP', 'GHDPE']
+
+ for match_idx in matching_indices[:3]: # Up to 3 matches
+ try:
+ # Extract metadata to reconstruct file path
+ material_type = int(dataset_data['material_type'][match_idx])
+ volume_fraction = float(dataset_data['volume_fraction'][match_idx])
+ n_fibers = int(dataset_data['number_of_fibers'][match_idx])
+ n_layers = int(dataset_data['stacking_sequence_lengths'][match_idx])
+ stacking_seq = dataset_data['stacking_sequence'][match_idx][:n_layers]
+
+ material_name = material_names[material_type] if material_type < len(material_names) else f'MAT{material_type}'
+
+ # Reconstruct file path: MATERIAL_VF_INSTANCE_ANGLES.txt
+ # Format: ___.txt
+ # INSTANCE is 1-5 (microstructure realization), not n_fibers
+ # STACK is only the upper half (positive angles)
+
+ # Extract upper half of stacking sequence (positive angles, or first half if symmetric)
+ # For symmetric laminates, upper half is typically the first n_layers/2 layers
+ # But we need to handle the actual format which may vary
+ # Try to get positive angles or first half
+ upper_half_angles = []
+ for angle in stacking_seq:
+ angle_rounded = int(round(angle))
+ # Only include non-negative angles (upper half)
+ if angle_rounded >= 0:
+ upper_half_angles.append(angle_rounded)
+
+ # If no positive angles found, use first half of sequence
+ if len(upper_half_angles) == 0:
+ n_upper = (n_layers + 1) // 2 # Upper half
+ upper_half_angles = [int(round(a)) for a in stacking_seq[:n_upper]]
+
+ angle_str = '_'.join([f"{a}" for a in upper_half_angles])
+
+ data_points = None
+ fitted_coeffs = None
+
+ # Try to load original data file
+ # Since we don't know the INSTANCE (1-5), try all instances
+ if dataset_root_path:
+ material_dir = os.path.join(dataset_root_path, material_name)
+
+ # Try each instance (1-5)
+ for instance in range(1, 6):
+ filename = f"{material_name}_{volume_fraction:.4f}_{instance}_{angle_str}.txt"
+ filepath = os.path.join(material_dir, filename)
+
+ if os.path.exists(filepath):
+ try:
+ # Parse original data
+ parsed_data = parse_dataset(filepath)
+
+ # Verify n_fibers matches by reading metadata
+ from utils.preprocessing import parse_metadata
+ file_metadata = parse_metadata(filepath)
+ if file_metadata.get('number_of_fibers') == n_fibers:
+ # Fit all 5 relationships with training degree
+ fitted_coeffs_list = []
+ for rel_idx in range(5):
+ if rel_idx == 0 and 'section1' in parsed_data and len(parsed_data['section1']) > 0:
+ x = parsed_data['section1'][:, 0] # eps_11
+ y = parsed_data['section1'][:, 1] # sig_11
+ elif rel_idx == 1 and 'section1' in parsed_data and len(parsed_data['section1']) > 0:
+ x = parsed_data['section1'][:, 0] # eps_11
+ y = parsed_data['section1'][:, 2] # eps_22
+ elif rel_idx == 2 and 'section2' in parsed_data and len(parsed_data['section2']) > 0:
+ x = parsed_data['section2'][:, 0] # eps_22
+ y = parsed_data['section2'][:, 1] # sig_22
+ elif rel_idx == 3 and 'section2' in parsed_data and len(parsed_data['section2']) > 0:
+ x = parsed_data['section2'][:, 0] # eps_22
+ y = parsed_data['section2'][:, 2] # eps_11
+ elif rel_idx == 4 and 'section3' in parsed_data and len(parsed_data['section3']) > 0:
+ x = parsed_data['section3'][:, 0] # eps_12
+ y = parsed_data['section3'][:, 1] # sig_12
+ else:
+ # Missing data, use zeros
+ fitted_coeffs_list.append(np.zeros(fit_degree))
+ continue
+
+ # Fit polynomial with training degree
+ coeffs, _, _, _ = polynomial_fit(x, y, degree=fit_degree)
+ fitted_coeffs_list.append(coeffs)
+
+ fitted_coeffs = np.array(fitted_coeffs_list) # [5, fit_degree]
+ data_points = parsed_data
+ break # Found matching file, exit instance loop
+
+ except Exception as e:
+ # Try next instance
+ continue
+
+ # If still not found after trying all instances, try searching by matching metadata
+ if fitted_coeffs is None:
+ # File not found, try searching by matching metadata
+ if os.path.exists(material_dir):
+ for filename_candidate in os.listdir(material_dir):
+ if filename_candidate.endswith('.txt') and material_name in filename_candidate:
+ # Check if volume fraction and n_fibers match
+ parts = filename_candidate.replace('.txt', '').split('_')
+ if len(parts) >= 3:
+ try:
+ vf_candidate = float(parts[1])
+ if abs(vf_candidate - volume_fraction) < 1e-4:
+ # Check if angles match (compare upper half)
+ candidate_angles_str = '_'.join(parts[3:]) # Everything after instance
+ if candidate_angles_str == angle_str:
+ filepath = os.path.join(material_dir, filename_candidate)
+ try:
+ # Verify n_fibers matches by reading metadata
+ from utils.preprocessing import parse_metadata
+ file_metadata = parse_metadata(filepath)
+ if file_metadata.get('number_of_fibers') == n_fibers:
+ parsed_data = parse_dataset(filepath)
+ # Fit polynomials
+ fitted_coeffs_list = []
+ for rel_idx in range(5):
+ if rel_idx == 0 and 'section1' in parsed_data and len(parsed_data['section1']) > 0:
+ x = parsed_data['section1'][:, 0]
+ y = parsed_data['section1'][:, 1]
+ elif rel_idx == 1 and 'section1' in parsed_data and len(parsed_data['section1']) > 0:
+ x = parsed_data['section1'][:, 0]
+ y = parsed_data['section1'][:, 2]
+ elif rel_idx == 2 and 'section2' in parsed_data and len(parsed_data['section2']) > 0:
+ x = parsed_data['section2'][:, 0]
+ y = parsed_data['section2'][:, 1]
+ elif rel_idx == 3 and 'section2' in parsed_data and len(parsed_data['section2']) > 0:
+ x = parsed_data['section2'][:, 0]
+ y = parsed_data['section2'][:, 2]
+ elif rel_idx == 4 and 'section3' in parsed_data and len(parsed_data['section3']) > 0:
+ x = parsed_data['section3'][:, 0]
+ y = parsed_data['section3'][:, 1]
+ else:
+ fitted_coeffs_list.append(np.zeros(fit_degree))
+ continue
+
+ coeffs, _, _, _ = polynomial_fit(x, y, degree=fit_degree)
+ fitted_coeffs_list.append(coeffs)
+
+ fitted_coeffs = np.array(fitted_coeffs_list)
+ data_points = parsed_data
+ break
+ except Exception:
+ continue
+ except (ValueError, IndexError):
+ continue
+
+ if fitted_coeffs is not None:
+ match_coeffs_list.append(fitted_coeffs)
+ match_data_points_list.append(data_points)
+ else:
+ # Silently skip if data file not found - not needed for testing
+ match_coeffs_list.append(None)
+ match_data_points_list.append(None)
+
+ except Exception as e:
+ print(f"Warning: Error processing match #{match_idx}: {e}")
+ import traceback
+ traceback.print_exc()
+ match_coeffs_list.append(None)
+ match_data_points_list.append(None)
+
+ # Filter out None values
+ match_coeffs_list = [mc for mc in match_coeffs_list if mc is not None]
+ match_data_points_list = [dp for dp in match_data_points_list if dp is not None]
+
+ except Exception as e:
+ print(f"Warning: Could not extract match coefficients: {e}")
+ import traceback
+ traceback.print_exc()
+ match_coeffs_list = []
+ match_data_points_list = []
+
+ # Create figure: 2 rows (angles, polynomial curves) - removed comparison row
+ n_matches = min(len(matching_indices), 3) # Show up to 3 matches
+ n_cols = max(n_matches + 2, 5) # At least 5 columns for polynomial plots
+ fig, axes = plt.subplots(2, n_cols, figsize=(4 * n_cols, 8))
+ if n_matches == 0:
+ axes = axes.reshape(2, 5)
+
+ # Top row: GT, Generated, Matches
+ # Angle categories for x-axis: 0, 15, 30, 45, 60, 75, 90
+ angle_categories = [0, 15, 30, 45, 60, 75, 90]
+ max_layers_display = 6 # Fixed to max 6 layers for y-axis
+
+ # GT
+ ax = axes[0, 0]
+ if len(gt_angles_sorted) > 0:
+ # Limit to max 6 layers for display
+ display_angles = gt_angles_sorted[:max_layers_display]
+ display_indices = list(range(len(display_angles)))
+ ax.barh(display_indices, display_angles, color='green', alpha=0.7)
+ ax.set_xlabel('Angle (degrees)')
+ ax.set_ylabel('Layer Index')
+ ax.set_title(f'Ground Truth\n{material_names[gt_mat]}, VF: {gt_vf:.4f}, Layers: {gt_nlayers}')
+ ax.set_xlim(-5, 90) # Start from negative to see 0 degree
+ ax.set_xticks(angle_categories)
+ ax.set_ylim(-0.5, max_layers_display - 0.5)
+ ax.set_yticks(range(max_layers_display))
+ ax.grid(True, alpha=0.3)
+
+ # Generated
+ ax = axes[0, 1]
+ if len(gen_angles_sorted) > 0:
+ # Limit to max 6 layers for display
+ display_angles = gen_angles_sorted[:max_layers_display]
+ display_indices = list(range(len(display_angles)))
+ ax.barh(display_indices, display_angles, color='blue', alpha=0.7)
+ ax.set_xlabel('Angle (degrees)')
+ ax.set_ylabel('Layer Index')
+ ax.set_title(f'Generated\n{material_names[gen_mat]}, VF: {gen_vf:.4f}, Layers: {gen_nlayers}')
+ ax.set_xlim(-5, 90) # Start from negative to see 0 degree
+ ax.set_xticks(angle_categories)
+ ax.set_ylim(-0.5, max_layers_display - 0.5)
+ ax.set_yticks(range(max_layers_display))
+ ax.grid(True, alpha=0.3)
+
+ # Dataset matches
+ for i, match_idx in enumerate(matching_indices[:n_matches]):
+ ax = axes[0, i + 2]
+ dataset_angles = dataset_data['stacking_sequence'][match_idx][:dataset_data['stacking_sequence_lengths'][match_idx]]
+ dataset_angles_sorted = np.sort(dataset_angles)
+
+ if len(dataset_angles_sorted) > 0:
+ # Limit to max 6 layers for display
+ display_angles = dataset_angles_sorted[:max_layers_display]
+ display_indices = list(range(len(display_angles)))
+ ax.barh(display_indices, display_angles, color='orange', alpha=0.7)
+ ax.set_xlabel('Angle (degrees)')
+ ax.set_ylabel('Layer Index')
+ ax.set_title(f'Match #{i+1}\n{material_names[dataset_data["material_type"][match_idx]]}, '
+ f'Fibers: {dataset_data["number_of_fibers"][match_idx]}, '
+ f'Layers: {dataset_data["stacking_sequence_lengths"][match_idx]}')
+ ax.set_xlim(-5, 90) # Start from negative to see 0 degree
+ ax.set_xticks(angle_categories)
+ ax.set_ylim(-0.5, max_layers_display - 0.5)
+ ax.set_yticks(range(max_layers_display))
+ ax.grid(True, alpha=0.3)
+
+ # Hide unused subplots in row 0
+ for i in range(n_matches + 2, axes.shape[1]):
+ axes[0, i].axis('off')
+
+ # Row 1: Polynomial curves comparison (one subplot per relationship)
+ if input_coeffs is not None and len(match_coeffs_list) > 0 and degree is not None:
+ # Helper function to create polynomial from coefficients
+ def create_poly_func(coeffs_row):
+ """Create poly1d function from coefficients (highest degree first, no constant term)"""
+ # Append 0 for constant term (polynomial passes through origin)
+ coeffs_with_zero = np.append(coeffs_row, 0)
+ return np.poly1d(coeffs_with_zero)
+
+ # Generate x values for plotting (based on actual data ranges: 0 to 0.1 for all relationships)
+ # All strain values (eps_11, eps_22, eps_12) range from 0 to 0.1 based on dataset
+ x_ranges = [
+ np.linspace(0, 0.1, 100), # eps_11 → sig_11
+ np.linspace(0, 0.1, 100), # eps_11 → eps_22
+ np.linspace(0, 0.1, 100), # eps_22 → sig_22
+ np.linspace(0, 0.1, 100), # eps_22 → eps_11
+ np.linspace(0, 0.1, 100) # eps_12 → sig_12
+ ]
+
+ relationship_names = ['eps_11→sig_11', 'eps_11→eps_22', 'eps_22→sig_22', 'eps_22→eps_11', 'eps_12→sig_12']
+ relationship_labels = [
+ ('eps_11', 'sig_11'),
+ ('eps_11', 'eps_22'),
+ ('eps_22', 'sig_22'),
+ ('eps_22', 'eps_11'),
+ ('eps_12', 'sig_12')
+ ]
+
+ # Plot each relationship in a separate subplot in row 2
+ n_relationships = 5
+ n_plots_to_show = min(n_relationships, n_cols)
+
+ for rel_idx in range(n_plots_to_show):
+ if rel_idx < n_cols:
+ ax = axes[1, rel_idx] # Changed from axes[2, ...] to axes[1, ...] since we removed row 1
+
+ # Plot input polynomial
+ poly_func_input = create_poly_func(input_coeffs[rel_idx])
+ x_vals = x_ranges[rel_idx]
+ y_vals_input = poly_func_input(x_vals)
+ ax.plot(x_vals, y_vals_input, 'b-', label='Input', linewidth=2, alpha=0.8)
+
+ # Plot match polynomials and data points
+ for i in range(len(match_coeffs_list)):
+ match_coeffs = match_coeffs_list[i]
+ data_points = match_data_points_list[i] if i < len(match_data_points_list) else None
+
+ if match_coeffs is not None:
+ poly_func_match = create_poly_func(match_coeffs[rel_idx])
+ y_vals_match = poly_func_match(x_vals)
+ ax.plot(x_vals, y_vals_match, '--', label=f'Match #{i+1} Fit', linewidth=1.5, alpha=0.7)
+
+ # Plot original data points if available
+ if data_points is not None:
+ try:
+ if rel_idx == 0 and 'section1' in data_points:
+ x_data = data_points['section1'][:, 0] # eps_11
+ y_data = data_points['section1'][:, 1] # sig_11
+ elif rel_idx == 1 and 'section1' in data_points:
+ x_data = data_points['section1'][:, 0] # eps_11
+ y_data = data_points['section1'][:, 2] # eps_22
+ elif rel_idx == 2 and 'section2' in data_points:
+ x_data = data_points['section2'][:, 0] # eps_22
+ y_data = data_points['section2'][:, 1] # sig_22
+ elif rel_idx == 3 and 'section2' in data_points:
+ x_data = data_points['section2'][:, 0] # eps_22
+ y_data = data_points['section2'][:, 2] # eps_11
+ elif rel_idx == 4 and 'section3' in data_points:
+ x_data = data_points['section3'][:, 0] # eps_12
+ y_data = data_points['section3'][:, 1] # sig_12
+ else:
+ x_data = None
+ y_data = None
+
+ if x_data is not None and len(x_data) > 0:
+ # Only add label for first relationship to avoid clutter
+ label = f'Match #{i+1} Data' if rel_idx == 0 else ''
+ ax.scatter(x_data, y_data, s=30, alpha=0.6,
+ label=label,
+ marker='o', edgecolors='black', linewidths=0.5, zorder=5)
+ except Exception:
+ pass # Skip if can't plot data points
+
+ # Plot average of matches
+ if len(match_coeffs_list) > 0:
+ avg_match_coeffs = np.mean(match_coeffs_list, axis=0)
+ poly_func_avg = create_poly_func(avg_match_coeffs[rel_idx])
+ y_vals_avg = poly_func_avg(x_vals)
+ ax.plot(x_vals, y_vals_avg, 'r:', label='Avg Match', linewidth=2, alpha=0.8)
+
+ ax.set_xlabel(relationship_labels[rel_idx][0])
+ ax.set_ylabel(relationship_labels[rel_idx][1])
+ ax.set_title(relationship_names[rel_idx])
+ ax.legend(fontsize=7, loc='best')
+ ax.grid(True, alpha=0.3)
+
+ # Hide unused subplots in row 1
+ for i in range(n_plots_to_show, n_cols):
+ axes[1, i].axis('off')
+ else:
+ # Hide all subplots in row 1 if no coefficient data
+ for i in range(n_cols):
+ axes[1, i].axis('off')
+
+ plt.tight_layout()
+
+ if save_path:
+ plt.savefig(save_path, dpi=150, bbox_inches='tight')
+ plt.close()
+ else:
+ plt.close()
+
+
+@torch.no_grad()
+def compute_metrics(
+ model: MaterialHybridDenoiser,
+ batch: Dict[str, torch.Tensor],
+ mask_ids: Dict[str, int],
+ device: str,
+) -> Dict[str, float]:
+ """
+ Compute human-readable metrics from model predictions.
+
+ Args:
+ model: MaterialHybridDenoiser model
+ batch: Batch dictionary with ground truth
+ mask_ids: Dictionary of mask IDs
+ device: Device to run on
+
+ Returns:
+ Dictionary with metrics:
+ - material_accuracy: Classification accuracy for material
+ - nfiber_accuracy: Exact match accuracy for number of fibers
+ - nlayers_accuracy: Exact match accuracy for number of layers
+ - angle_l1_error: Average L1 error for angles (only when layer counts match)
+ - angle_valid_samples: Number of samples with matching layer counts
+ """
+ model.eval()
+
+ # Extract ground truth
+ gt_material = batch['material_t'] # (B,)
+ gt_vf_category = batch['vf_category_t'] # (B,)
+ gt_layer = batch['layer_t'] # (B, L)
+ gt_angle = batch['angle_t'] # (B, L) discrete category indices
+ cond = batch['cond'] # (B, n_conditions)
+
+ B, L = gt_layer.shape
+
+ # Run model at t=0 (no corruption) to get predictions
+ t = torch.zeros(B, dtype=torch.long, device=device)
+
+ # Use ground truth as input (no corruption for metrics)
+ x_material = gt_material
+ x_vf_category = gt_vf_category
+ x_layer = gt_layer
+ x_angle = gt_angle
+
+ # Get model predictions
+ outputs = model(x_material, x_vf_category, x_layer, x_angle, cond, t)
+
+ # Material: argmax of logits
+ pred_material = torch.argmax(outputs['material_logits'], dim=-1) # (B,)
+ material_correct = (pred_material == gt_material).float()
+ material_accuracy = material_correct.mean().item()
+
+ # VF Category: argmax of logits
+ pred_vf_category = torch.argmax(outputs['vf_category_logits'], dim=-1) # (B,) in [0, 4]
+ vf_category_correct = (pred_vf_category == gt_vf_category).float()
+ vf_category_accuracy = vf_category_correct.mean().item()
+
+ # Layer and angles: depends on discrete vs continuous
+ use_discrete = 'angle_logits' in outputs
+
+ if use_discrete:
+ # Discrete: combined angle+layer logits
+ pred_angle_cats = torch.argmax(outputs['angle_logits'], dim=-1) # (B, L) category indices
+ # n_angle_categories should be passed as parameter or extracted from model
+ # For now, we'll skip angle L1 computation in this function since it needs angle_categories
+ # This function is mainly for quick validation, detailed metrics are in compute_generation_metrics
+ n_angle_categories = None # Will be determined from angle_categories if provided
+ dead_category = None # Will be set if n_angle_categories is available
+ # Count alive layers: where angle != dead_category
+ pred_nlayers = (pred_angle_cats != dead_category).sum(dim=1) # (B,)
+ gt_nlayers = (gt_angle != dead_category).sum(dim=1) # (B,)
+ pred_layer_logits = None # Not used in discrete mode
+ pred_angle = None # Not used in discrete mode
+ else:
+ # Continuous: separate layer and angle
+ pred_layer_logits = torch.argmax(outputs['layer_logits'], dim=-1) # (B, L) in {0, 1}
+ pred_nlayers = pred_layer_logits.sum(dim=1) # (B,) - count of alive layers
+ pred_angle = outputs['angle'] # (B, L, 1) in radians
+ gt_nlayers = gt_layer.sum(dim=1) # (B,) - count of alive layers
+
+ nlayers_correct = (pred_nlayers == gt_nlayers).float()
+ nlayers_accuracy = nlayers_correct.mean().item()
+
+ # Angles: only compute when layer counts match
+
+ # For each sample, if layer counts match, sort and compute L1
+ angle_l1_errors = []
+ for b in range(B):
+ if pred_nlayers[b] == gt_nlayers[b]:
+ if use_discrete:
+ # Extract alive angle category indices (where angle != dead_category)
+ pred_alive_mask = (pred_angle_cats[b] != dead_category) # (L,)
+ gt_alive_mask = (gt_angle[b] != dead_category) # (L,)
+
+ pred_angle_cats_alive = pred_angle_cats[b, pred_alive_mask].cpu().numpy() # (n_layers,)
+ gt_angle_cats_alive = gt_angle[b, gt_alive_mask].cpu().numpy() # (n_layers,)
+
+ if len(pred_angle_cats_alive) > 0 and len(gt_angle_cats_alive) > 0 and len(pred_angle_cats_alive) == len(gt_angle_cats_alive):
+ # Skip angle L1 computation in this function - it's done in compute_generation_metrics
+ # which has access to angle_categories
+ pass
+ else:
+ # Continuous angles
+ pred_alive_mask = pred_layer_logits[b] == 1 # (L,)
+ gt_alive_mask = gt_layer[b] == 1 # (L,)
+
+ pred_alive = pred_angle[b, pred_alive_mask, 0] # (n_layers,)
+ gt_alive = gt_angle[b, gt_alive_mask, 0] # (n_layers,)
+
+ if len(pred_alive) > 0 and len(gt_alive) > 0 and len(pred_alive) == len(gt_alive):
+ # Convert to degrees
+ pred_angle_deg = pred_alive * 180.0 / math.pi
+ gt_angle_deg = gt_alive * 180.0 / math.pi
+
+ # Compute L1 error position-wise (positions are now meaningful)
+ l1_error = torch.abs(pred_angle_deg - gt_angle_deg).mean().item()
+ angle_l1_errors.append(l1_error)
+
+ if len(angle_l1_errors) > 0:
+ angle_l1_error = sum(angle_l1_errors) / len(angle_l1_errors)
+ angle_valid_samples = len(angle_l1_errors)
+ else:
+ angle_l1_error = float('nan')
+ angle_valid_samples = 0
+
+ return {
+ 'material_accuracy': material_accuracy,
+ 'vf_category_accuracy': vf_category_accuracy,
+ 'nlayers_accuracy': nlayers_accuracy,
+ 'angle_l1_error': angle_l1_error,
+ 'angle_valid_samples': angle_valid_samples
+ }
+
+
+# -----------------------
+# Main Training Loop
+# -----------------------
+
+def train(
+ data_dir: str = "processed_data",
+ output_dir: str = "checkpoints",
+ batch_size: int = 32,
+ num_epochs: int = 100,
+ learning_rate: float = 3e-4,
+ T: int = 1000,
+ n_max_layer: int = 24,
+ beta_start: float = 1e-4,
+ beta_end: float = 0.02,
+ lambda_angle: float = 1.0,
+ lambda_material: float = 1.0,
+ lambda_vf_category: float = 1.0,
+ lambda_layer: float = 1.0,
+ save_every: int = 10,
+ normalization_method: str = 'minmax',
+ random_seed: int = 42,
+ device: str = None,
+ gen_eval_n_samples: Optional[int] = None, # None = use all test samples
+ gen_eval_every: int = 1,
+ use_discrete_angles: bool = True,
+ visualize_matches: bool = False,
+ save_visualizations: bool = False,
+ n_visualization_samples: int = 10, # Number of samples to generate visualizations for
+ use_wandb: bool = False,
+ wandb_project: str = "material-generation",
+ wandb_name: Optional[str] = None,
+ warmup_ratio: float = 0.01, # Warmup ratio (fraction of total steps, default: 0.01 = 1%)
+ log_every_n_steps: int = 100, # Log training metrics every N steps (default: 100)
+ angle_resolution: float = 1.0, # Resolution in degrees for angle discretization (default: 1.0)
+ curve_dir: Optional[str] = None, # Directory containing RVE_Datasets for on-the-fly validation
+ demo_steps_per_epoch: Optional[int] = None, # Demo mode: limit steps per epoch (default: None = all steps)
+ num_processes: Optional[int] = None, # Number of processes for multiprocessing during validation (default: None = auto-detect)
+ n_validation_samples: int = 100, # Number of samples to generate and simulate during validation (default: 100)
+):
+ """
+ Main training function.
+
+ Args:
+ data_dir: Directory with processed data
+ output_dir: Directory to save checkpoints
+ batch_size: Batch size
+ num_epochs: Number of training epochs
+ learning_rate: Learning rate
+ T: Number of diffusion timesteps
+ n_max_layer: Maximum number of layers
+ beta_start: Starting beta for noise schedule
+ beta_end: Ending beta for noise schedule
+ lambda_angle: Weight for angle loss
+ lambda_material: Weight for material loss
+ lambda_vf_category: Weight for volume fraction category loss
+ lambda_layer: Weight for layer loss
+ save_every: Save checkpoint every N epochs
+ normalization_method: Normalization method ('minmax' or 'zscore'), default 'minmax'
+ random_seed: Random seed for reproducibility (default: 42)
+ device: GPU device string (e.g., 'cuda:0', 'cuda:1')
+ gen_eval_n_samples: Number of samples to generate for generation metrics evaluation (None = use all test samples, default: None)
+ gen_eval_every: Evaluate generation metrics every N epochs (default: 1 = every epoch)
+ use_discrete_angles: If True, use discrete angle categories (0, 15, 30, 45, 60, 75, 90 degrees);
+ If False, use continuous angles with Gaussian diffusion
+ visualize_matches: Whether to visualize matches with dataset samples during evaluation
+ save_visualizations: Whether to save visualization plots to disk
+ n_visualization_samples: Number of samples to generate visualizations for
+ warmup_ratio: Warmup ratio (fraction of total training steps, default: 0.01 = 1%)
+ angle_resolution: Resolution in degrees for angle discretization (default: 1.0)
+ curve_dir: Directory containing RVE_Datasets for on-the-fly validation (default: None, will try to auto-detect)
+ demo_steps_per_epoch: Demo mode: limit training to N steps per epoch (default: None = use all steps)
+ num_processes: Number of processes for multiprocessing during validation (default: None = auto-detect)
+ n_validation_samples: Number of samples to generate and simulate during validation (default: 100)
+ """
+ # Set random seeds for reproducibility
+ random.seed(random_seed)
+ np.random.seed(random_seed)
+ torch.manual_seed(random_seed)
+ torch.cuda.manual_seed(random_seed)
+ torch.cuda.manual_seed_all(random_seed)
+ # Make CUDA operations deterministic (may reduce performance)
+ torch.backends.cudnn.deterministic = True
+ torch.backends.cudnn.benchmark = False
+
+ # Device is already set to cuda:{gpu_index} from command line args
+ # Print device information
+ gpu_idx = int(device.split(":")[1])
+ print("="*80)
+ print(f"Device: {device}")
+ print(f"GPU {gpu_idx}: {torch.cuda.get_device_name(gpu_idx)}")
+ print("="*80)
+ if use_discrete_angles:
+ print("DISCRETE DIFFUSION TRAINING (All variables discrete)")
+ else:
+ print("HYBRID DIFFUSION TRAINING (Discrete + Continuous angles)")
+ print("="*80)
+ print(f"Random seed: {random_seed}")
+ print(f"Angle diffusion: {'Discrete (categories)' if use_discrete_angles else 'Continuous (Gaussian)'}")
+
+ # Load metadata and dataset data for matching
+ print("\nLoading metadata...")
+ metadata = load_metadata(data_dir)
+ degree = metadata['polynomial_degree']
+ n_coeffs = 5 * degree
+
+ # Load dataset data for matching (use train data for searching)
+ print("Loading dataset data for matching...")
+ from load_processed_data import load_processed_data
+ dataset_data_for_matching = load_processed_data(data_dir, 'train')
+
+ print(f" Polynomial degree: {degree}")
+ print(f" Number of coefficients: {n_coeffs}")
+ print(f" Max layers in data: {metadata['max_layers']}")
+ print(f" Max fibers in data: {metadata['fibers_max']}")
+ print(f" Using n_max_layer: {n_max_layer}")
+
+ # Create model config
+ cfg = ModelConfig(
+ n_conditions=n_coeffs,
+ n_materials=4, # CPP, CHDPE, GPP, GHDPE
+ n_vf_categories=5, # 5 volume fraction categories
+ n_max_layer=n_max_layer,
+ d_model=256,
+ n_heads=4,
+ n_layers=6,
+ dropout=0.0
+ )
+
+ # Define mask IDs
+ mask_ids = {
+ "material": cfg.n_materials,
+ "vf_category": cfg.n_vf_categories, # 5 categories (0-4), mask is 5
+ "layer": 2,
+ }
+
+ # Note: n_angle_categories will be determined from dataset after dataloader creation
+ # We'll update mask_ids after creating the dataloaders
+ n_angle_categories_temp = None # Temporary, will be set after dataloader creation
+
+ print(f"\nModel Configuration:")
+ print(f" n_conditions: {cfg.n_conditions}")
+ print(f" n_materials: {cfg.n_materials}")
+ print(f" n_vf_categories: {cfg.n_vf_categories}")
+ print(f" n_max_layer: {cfg.n_max_layer}")
+ print(f" d_model: {cfg.d_model}")
+
+ # Create model (n_angle_categories will be set after dataloader creation)
+ # We'll create it after dataloaders are created
+ print("\nModel will be created after dataloaders to get correct n_angle_categories...")
+
+ # Create diffusion processes
+ print(f"\nCreating diffusion processes (T={T})...")
+ betas = linear_beta_schedule(T, beta_start, beta_end, device)
+
+ disc_diff_mat = DiscreteMaskDiffusion(
+ vocab_size=cfg.n_materials,
+ mask_id=mask_ids['material'],
+ T=T,
+ betas=betas
+ )
+
+ disc_diff_vf_category = DiscreteMaskDiffusion(
+ vocab_size=cfg.n_vf_categories, # 5 volume fraction categories
+ mask_id=mask_ids['vf_category'],
+ T=T,
+ betas=betas
+ )
+
+ disc_diff_layer = DiscreteMaskDiffusion(
+ vocab_size=2, # 0=dead, 1=alive
+ mask_id=mask_ids['layer'],
+ T=T,
+ betas=betas
+ )
+
+ # Create angle diffusion based on mode
+ disc_diff_angle = None
+ cont_diff = None
+ # Create dataloaders first to get n_angle_categories
+ print("\nCreating dataloaders...")
+ train_loader = create_dataloader(
+ data_dir=data_dir,
+ split='train',
+ batch_size=batch_size,
+ shuffle=True,
+ n_max_layer=n_max_layer,
+ normalize_coefficients=True,
+ normalize_method=normalization_method,
+ use_discrete_angles=use_discrete_angles,
+ angle_resolution=angle_resolution
+ )
+
+ test_loader = create_dataloader(
+ data_dir=data_dir,
+ split='test',
+ batch_size=batch_size,
+ shuffle=False,
+ n_max_layer=n_max_layer,
+ normalize_coefficients=True,
+ normalize_method=normalization_method,
+ use_discrete_angles=use_discrete_angles,
+ angle_resolution=angle_resolution
+ )
+
+ # Get angle categories from dataset and update mask_ids
+ if use_discrete_angles:
+ angle_categories = train_loader.dataset.angle_categories
+ n_angle_categories = train_loader.dataset.n_angle_categories
+ # Categories: 0 to n_angle_categories-1 (angle categories), n_angle_categories (dead layer), n_angle_categories+1 (mask)
+ mask_ids["angle"] = n_angle_categories + 1 # Mask ID for angles
+ print(f" Angle categories: {n_angle_categories} categories from {train_loader.dataset.angle_min}° to {train_loader.dataset.angle_max}° (resolution: {angle_resolution}°)")
+ print(f" Updated angle mask_id: {mask_ids['angle']} (n_angle_categories={n_angle_categories})")
+ else:
+ angle_categories = None
+ n_angle_categories = None
+
+ print(f" Train batches: {len(train_loader)}")
+ print(f" Test batches: {len(test_loader)}")
+
+ # Create angle diffusion process now that we have n_angle_categories
+ if use_discrete_angles:
+ # Vocab size: n_angle_categories+1 categories (0 to n_angle_categories-1: angles, n_angle_categories: dead layer)
+ # Mask ID: n_angle_categories+1 (separate from vocab)
+ disc_diff_angle = DiscreteMaskDiffusion(
+ vocab_size=n_angle_categories + 1,
+ mask_id=mask_ids['angle'],
+ T=T,
+ betas=betas
+ )
+ else:
+ cont_diff = GaussianDiffusion(T=T, betas=betas)
+ disc_diff_angle = None
+
+ # Create model now that we have n_angle_categories
+ print("\nCreating model...")
+ model = MaterialHybridDenoiser(cfg, mask_ids, use_discrete_angles=use_discrete_angles, n_angle_categories=n_angle_categories).to(device)
+ print(f" Model parameters: {sum(p.numel() for p in model.parameters()):,}")
+ if use_discrete_angles:
+ print(f" Using discrete angles: {n_angle_categories} categories from {train_loader.dataset.angle_min}° to {train_loader.dataset.angle_max}° (resolution: {angle_resolution}°)")
+ else:
+ print(f" Using continuous angles: Gaussian diffusion")
+
+ # Calculate total training steps for step-based scheduling
+ total_steps = num_epochs * len(train_loader)
+ # Calculate warmup steps based on ratio
+ warmup_steps = int(total_steps * warmup_ratio)
+ print(f" Total training steps: {total_steps}")
+ print(f" Warmup steps: {warmup_steps} ({warmup_steps/total_steps*100:.2f}% of total, ratio={warmup_ratio})")
+
+ # Create optimizer
+ optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate)
+
+ # Create learning rate scheduler with step-based warmup
+ # Always use warmup (based on warmup_ratio)
+ if warmup_steps > 0:
+ # Warmup: linear increase from 1% to 100% of learning_rate over warmup_steps
+ warmup_scheduler = torch.optim.lr_scheduler.LinearLR(
+ optimizer,
+ start_factor=0.01, # Start at 1% of learning_rate
+ end_factor=1.0,
+ total_iters=warmup_steps
+ )
+ # Cosine annealing: after warmup, cosine decay over remaining steps
+ cosine_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
+ optimizer,
+ T_max=total_steps - warmup_steps,
+ eta_min=learning_rate * 0.1 # Minimum learning rate is 1% of initial
+ )
+ # Combine warmup and cosine annealing
+ scheduler = torch.optim.lr_scheduler.SequentialLR(
+ optimizer,
+ schedulers=[warmup_scheduler, cosine_scheduler],
+ milestones=[warmup_steps]
+ )
+ # Note: warmup_steps is always > 0 (default is 1% of total steps), so we always use warmup
+
+ # Create timestamped experiment directory
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ exp_dir = os.path.join(output_dir, f"exp_{timestamp}")
+ os.makedirs(exp_dir, exist_ok=True)
+
+ # Save training settings as JSON
+ training_config = {
+ 'data_dir': data_dir,
+ 'output_dir': output_dir,
+ 'experiment_dir': exp_dir,
+ 'timestamp': timestamp,
+ 'batch_size': batch_size,
+ 'num_epochs': num_epochs,
+ 'learning_rate': learning_rate,
+ 'T': T,
+ 'n_max_layer': n_max_layer,
+ 'beta_start': beta_start,
+ 'beta_end': beta_end,
+ 'lambda_angle': lambda_angle,
+ 'lambda_material': lambda_material,
+ 'lambda_vf_category': lambda_vf_category,
+ 'lambda_layer': lambda_layer,
+ 'save_every': save_every,
+ 'normalization_method': normalization_method,
+ 'random_seed': random_seed,
+ 'device': device,
+ 'gen_eval_n_samples': gen_eval_n_samples,
+ 'gen_eval_every': gen_eval_every,
+ 'use_discrete_angles': use_discrete_angles,
+ 'visualize_matches': visualize_matches,
+ 'save_visualizations': save_visualizations,
+ 'n_visualization_samples': n_visualization_samples,
+ 'warmup_ratio': warmup_ratio,
+ 'log_every_n_steps': log_every_n_steps,
+ 'model_config': {
+ 'n_conditions': cfg.n_conditions,
+ 'n_materials': cfg.n_materials,
+ 'n_vf_categories': cfg.n_vf_categories,
+ 'n_max_layer': cfg.n_max_layer,
+ 'd_model': cfg.d_model,
+ 'n_heads': cfg.n_heads,
+ 'n_layers': cfg.n_layers,
+ 'dropout': cfg.dropout,
+ },
+ 'mask_ids': mask_ids,
+ }
+
+ config_path = os.path.join(exp_dir, "training_config.json")
+ with open(config_path, 'w') as f:
+ json.dump(training_config, f, indent=2)
+ print(f"\n✓ Training configuration saved to {config_path}")
+ print(f"✓ Experiment directory: {exp_dir}")
+
+ # Initialize wandb if requested
+ if use_wandb:
+ if not WANDB_AVAILABLE:
+ raise ImportError("wandb is not installed. Install it with: pip install wandb")
+ wandb.init(
+ project=wandb_project,
+ name=wandb_name or f"exp_{timestamp}",
+ config=training_config,
+ dir=exp_dir
+ )
+ print(f"✓ Wandb initialized: project={wandb_project}, name={wandb_name or f'exp_{timestamp}'}")
+
+ # Training loop
+ print("\n" + "="*80)
+ print("STARTING TRAINING")
+ print("="*80)
+
+ best_test_loss = float('inf')
+ global_step = 0 # Track global training step
+
+ for epoch in range(num_epochs):
+ # Training
+ model.train()
+ train_losses = {
+ 'total': 0.0,
+ 'material': 0.0,
+ 'vf_category': 0.0,
+ 'layer': 0.0,
+ 'angle': 0.0
+ }
+
+ # Demo mode: limit number of steps per epoch
+ if demo_steps_per_epoch is not None:
+ # Create iterator and limit to demo_steps_per_epoch steps
+ train_iter = iter(train_loader)
+ max_steps = min(demo_steps_per_epoch, len(train_loader))
+ pbar = tqdm(range(max_steps), desc=f"Epoch {epoch+1}/{num_epochs} (Demo: {max_steps} steps)")
+ for step_idx in pbar:
+ try:
+ batch = next(train_iter)
+ except StopIteration:
+ # Restart iterator if we run out of batches
+ train_iter = iter(train_loader)
+ batch = next(train_iter)
+
+ # Move to device
+ batch = {k: v.to(device) for k, v in batch.items()}
+
+ # Training step
+ loss, loss_mat, loss_nf, loss_layer, loss_angle = train_step(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ optimizer=optimizer,
+ batch=batch,
+ mask_ids=mask_ids,
+ lambda_angle=lambda_angle,
+ lambda_material=lambda_material,
+ lambda_vf_category=lambda_vf_category,
+ lambda_layer=lambda_layer,
+ use_discrete_angles=use_discrete_angles
+ )
+
+ # Step the scheduler (step-based, not epoch-based)
+ scheduler.step()
+ current_lr = scheduler.get_last_lr()[0]
+ global_step += 1
+
+ train_losses['total'] += loss
+ train_losses['material'] += loss_mat
+ train_losses['vf_category'] += loss_nf
+ train_losses['layer'] += loss_layer
+ train_losses['angle'] += loss_angle
+
+ # Log training metrics every n steps
+ if global_step % log_every_n_steps == 0 and use_wandb:
+ step_train_losses = {
+ 'train_step/total_loss': loss, # Already a float from train_step
+ 'train_step/material_loss': loss_mat,
+ 'train_step/vf_category_loss': loss_nf,
+ 'train_step/layer_loss': loss_layer,
+ 'train_step/angle_loss': loss_angle,
+ 'train_step/learning_rate': current_lr,
+ 'global_step': global_step,
+ }
+ wandb.log(step_train_losses)
+
+ # Update progress bar
+ pbar.set_postfix({
+ 'loss': f"{loss:.4f}",
+ 'mat': f"{loss_mat:.4f}",
+ 'nf': f"{loss_nf:.4f}",
+ 'lay': f"{loss_layer:.4f}",
+ 'ang': f"{loss_angle:.4f}"
+ })
+ else:
+ # Normal training mode: iterate through all batches
+ pbar = tqdm(train_loader, desc=f"Epoch {epoch+1}/{num_epochs}")
+ for batch in pbar:
+ # Move to device
+ batch = {k: v.to(device) for k, v in batch.items()}
+
+ # Training step
+ loss, loss_mat, loss_nf, loss_layer, loss_angle = train_step(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ optimizer=optimizer,
+ batch=batch,
+ mask_ids=mask_ids,
+ lambda_angle=lambda_angle,
+ lambda_material=lambda_material,
+ lambda_vf_category=lambda_vf_category,
+ lambda_layer=lambda_layer,
+ use_discrete_angles=use_discrete_angles
+ )
+
+ # Step the scheduler (step-based, not epoch-based)
+ scheduler.step()
+ current_lr = scheduler.get_last_lr()[0]
+ global_step += 1
+
+ train_losses['total'] += loss
+ train_losses['material'] += loss_mat
+ train_losses['vf_category'] += loss_nf
+ train_losses['layer'] += loss_layer
+ train_losses['angle'] += loss_angle
+
+ # Log training metrics every n steps
+ if global_step % log_every_n_steps == 0 and use_wandb:
+ step_train_losses = {
+ 'train_step/total_loss': loss, # Already a float from train_step
+ 'train_step/material_loss': loss_mat,
+ 'train_step/vf_category_loss': loss_nf,
+ 'train_step/layer_loss': loss_layer,
+ 'train_step/angle_loss': loss_angle,
+ 'train_step/learning_rate': current_lr,
+ 'global_step': global_step,
+ }
+ wandb.log(step_train_losses)
+
+ # Update progress bar
+ pbar.set_postfix({
+ 'loss': f"{loss:.4f}",
+ 'mat': f"{loss_mat:.4f}",
+ 'nf': f"{loss_nf:.4f}",
+ 'lay': f"{loss_layer:.4f}",
+ 'ang': f"{loss_angle:.4f}"
+ })
+
+ # Average losses
+ if demo_steps_per_epoch is not None:
+ n_batches = min(demo_steps_per_epoch, len(train_loader))
+ else:
+ n_batches = len(train_loader)
+ for key in train_losses:
+ train_losses[key] /= n_batches
+
+ # Validation
+ model.eval()
+ test_losses = {
+ 'total': 0.0,
+ 'material': 0.0,
+ 'vf_category': 0.0,
+ 'layer': 0.0,
+ 'angle': 0.0
+ }
+
+ with torch.no_grad():
+ for batch in test_loader:
+ batch = {k: v.to(device) for k, v in batch.items()}
+
+ # Compute loss without backward pass
+ total_loss, loss_mat, loss_nf, loss_layer, loss_angle = compute_loss(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ batch=batch,
+ mask_ids=mask_ids,
+ lambda_angle=lambda_angle,
+ lambda_material=lambda_material,
+ lambda_vf_category=lambda_vf_category,
+ lambda_layer=lambda_layer,
+ use_discrete_angles=use_discrete_angles
+ )
+
+ test_losses['total'] += float(total_loss.detach().cpu())
+ test_losses['material'] += float(loss_mat.detach().cpu())
+ test_losses['vf_category'] += float(loss_nf.detach().cpu())
+ test_losses['layer'] += float(loss_layer.detach().cpu())
+ test_losses['angle'] += float(loss_angle.detach().cpu())
+
+ n_test_batches = len(test_loader)
+ for key in test_losses:
+ test_losses[key] /= n_test_batches
+
+ # Get current learning rate (scheduler is already stepped during training)
+ current_lr = scheduler.get_last_lr()[0]
+
+ # On-the-fly validation: generate data and plot against conditioned input
+ # Only run every gen_eval_every epochs to avoid slowing down training
+ on_the_fly_validation_results = None
+ if (epoch + 1) % gen_eval_every == 0:
+ print(" Running on-the-fly validation (generating simulation data)...")
+ # Get curve_dir - use provided value or try to auto-detect
+ validation_curve_dir = curve_dir
+ if validation_curve_dir is None:
+ # Try common locations (including absolute path)
+ possible_paths = [
+ "/project/luofeng/feiyang/MaterialGeneration/data_generation/shahriar_modified_2025_12/RVE_Datasets", # Absolute path
+ os.path.join(data_dir, "..", "data_generation", "shahriar_modified_2025_12", "RVE_Datasets"),
+ os.path.join(data_dir, "..", "..", "data_generation", "shahriar_modified_2025_12", "RVE_Datasets"),
+ "shahriar_modified_2025_12/RVE_Datasets",
+ "../data_generation/shahriar_modified_2025_12/RVE_Datasets",
+ ]
+ for path in possible_paths:
+ # If path is already absolute, use it directly; otherwise convert to absolute
+ if os.path.isabs(path):
+ abs_path = path
+ else:
+ abs_path = os.path.abspath(path)
+ if os.path.exists(abs_path):
+ validation_curve_dir = abs_path
+ print(f" Auto-detected curve_dir: {validation_curve_dir}")
+ break
+ if validation_curve_dir is None:
+ print(f" Warning: Could not find RVE_Datasets directory. Tried: {possible_paths}")
+ print(f" Please specify --curve_dir argument to enable on-the-fly validation")
+
+ val_save_dir = os.path.join(exp_dir, "on_the_fly_validation") if save_visualizations else None
+ on_the_fly_validation_results = validate_with_on_the_fly_generation(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ test_loader=test_loader,
+ mask_ids=mask_ids,
+ device=device,
+ n_samples=min(n_validation_samples, len(test_loader.dataset)), # Use specified number of samples
+ use_discrete_angles=use_discrete_angles,
+ metadata=metadata,
+ angle_categories=angle_categories,
+ curve_dir=validation_curve_dir,
+ instances=[1, 2, 3], # Simulate 3 instances
+ save_dir=val_save_dir,
+ epoch=epoch + 1,
+ normalization_method=normalization_method,
+ num_processes=num_processes
+ )
+
+ # Compute generation-based metrics (actual generation from noise)
+ # Only evaluate every gen_eval_every epochs
+ gen_metrics = None
+ if (epoch + 1) % gen_eval_every == 0:
+ print(" Computing generation metrics (this may take a while)...")
+ # Disable visualization saving - we use on-the-fly validation instead
+ gen_metrics = compute_generation_metrics(
+ model=model,
+ disc_diff_mat=disc_diff_mat,
+ disc_diff_vf_category=disc_diff_vf_category,
+ disc_diff_layer=disc_diff_layer,
+ disc_diff_angle=disc_diff_angle,
+ cont_diff=cont_diff,
+ test_loader=test_loader,
+ mask_ids=mask_ids,
+ device=device,
+ n_samples=gen_eval_n_samples,
+ remask_prob=0.1,
+ use_discrete_angles=use_discrete_angles,
+ dataset_data=dataset_data_for_matching,
+ metadata=metadata,
+ visualize_matches=False, # Disable visualization
+ save_visualizations=False, # Disable visualization saving
+ vis_save_dir=None, # No visualization directory
+ epoch=epoch + 1,
+ normalization_method=normalization_method,
+ angle_categories=angle_categories
+ )
+
+ # Print epoch summary
+ print(f"\nEpoch {epoch+1}/{num_epochs}")
+ print(f" Train - Total: {train_losses['total']:.4f}, "
+ f"Mat: {train_losses['material']:.4f}, "
+ f"VF: {train_losses['vf_category']:.4f}, "
+ f"Lay: {train_losses['layer']:.4f}, "
+ f"Ang: {train_losses['angle']:.4f}")
+ print(f" Test - Total: {test_losses['total']:.4f}, "
+ f"Mat: {test_losses['material']:.4f}, "
+ f"VF: {test_losses['vf_category']:.4f}, "
+ f"Lay: {test_losses['layer']:.4f}, "
+ f"Ang: {test_losses['angle']:.4f}")
+ print(f" LR: {current_lr:.6f}")
+
+ # Log metrics to wandb
+ if use_wandb:
+ log_dict = {
+ 'epoch': epoch + 1,
+ 'train/total_loss': train_losses['total'],
+ 'train/material_loss': train_losses['material'],
+ 'train/vf_category_loss': train_losses['vf_category'],
+ 'train/layer_loss': train_losses['layer'],
+ 'train/angle_loss': train_losses['angle'],
+ 'test/total_loss': test_losses['total'],
+ 'test/material_loss': test_losses['material'],
+ 'test/vf_category_loss': test_losses['vf_category'],
+ 'test/layer_loss': test_losses['layer'],
+ 'test/angle_loss': test_losses['angle'],
+ 'learning_rate': current_lr,
+ }
+
+ # Log to wandb (both generation metrics and validation plots)
+ if use_wandb:
+ log_dict = {}
+
+ if gen_metrics is not None:
+ n_eval_samples = gen_eval_n_samples if gen_eval_n_samples is not None else len(test_loader.dataset)
+ print(f" Generation Metrics (Actual generation from noise, n={n_eval_samples}):")
+ print(f" Material Acc: {gen_metrics['material_accuracy']:.4f} ({gen_metrics['material_accuracy']*100:.2f}%)")
+ print(f" VF Category Acc: {gen_metrics['vf_category_accuracy']:.4f} ({gen_metrics['vf_category_accuracy']*100:.2f}%)")
+ print(f" Nlayers Acc: {gen_metrics['nlayers_accuracy']:.4f} ({gen_metrics['nlayers_accuracy']*100:.2f}%), L1 Err: {gen_metrics['nlayers_l1_error']:.4f}")
+ if not math.isnan(gen_metrics['angle_l1_error']):
+ print(f" Angle L1 Err: {gen_metrics['angle_l1_error']:.4f}° (valid samples: {gen_metrics['angle_valid_samples']})")
+ else:
+ print(f" Angle L1 Err: N/A (no valid samples with matching layer counts)")
+
+ # Add generation metrics to wandb log
+ log_dict.update({
+ 'gen/material_accuracy': gen_metrics['material_accuracy'],
+ 'gen/vf_category_accuracy': gen_metrics['vf_category_accuracy'],
+ 'gen/nlayers_accuracy': gen_metrics['nlayers_accuracy'],
+ 'gen/nlayers_l1_error': gen_metrics['nlayers_l1_error'],
+ })
+ if not math.isnan(gen_metrics['angle_l1_error']):
+ log_dict['gen/angle_l1_error'] = gen_metrics['angle_l1_error']
+
+ # Visualization saving disabled - we use on-the-fly validation instead
+
+ # Log on-the-fly validation plots to wandb (even if gen_metrics is None)
+ if save_visualizations and on_the_fly_validation_results is not None:
+ val_save_dir = os.path.join(exp_dir, "on_the_fly_validation")
+ epoch_val_dir = os.path.join(val_save_dir, f"epoch_{epoch+1}")
+ if os.path.exists(epoch_val_dir):
+ # Log validation plots (cap at 100 for wandb to avoid clutter)
+ n_wandb_val_images = min(n_validation_samples, 100) # Limit wandb to 100
+ for i in range(n_wandb_val_images):
+ img_path = os.path.join(epoch_val_dir, f"validation_sample_{i}_epoch_{epoch+1}.png")
+ if os.path.exists(img_path):
+ log_dict[f'on_the_fly_validation/sample_{i}'] = wandb.Image(img_path)
+
+ # Log to wandb if we have anything to log
+ if log_dict:
+ wandb.log(log_dict)
+
+ # Save checkpoint
+ if (epoch + 1) % save_every == 0 or test_losses['total'] < best_test_loss:
+ checkpoint_path = os.path.join(exp_dir, f"checkpoint_epoch_{epoch+1}.pt")
+ torch.save({
+ 'epoch': epoch + 1,
+ 'model_state_dict': model.state_dict(),
+ 'optimizer_state_dict': optimizer.state_dict(),
+ 'scheduler_state_dict': scheduler.state_dict(),
+ 'train_losses': train_losses,
+ 'test_losses': test_losses,
+ 'config': cfg,
+ 'mask_ids': mask_ids,
+ }, checkpoint_path)
+
+ if test_losses['total'] < best_test_loss:
+ best_test_loss = test_losses['total']
+ best_path = os.path.join(exp_dir, "best_model.pt")
+ torch.save({
+ 'epoch': epoch + 1,
+ 'model_state_dict': model.state_dict(),
+ 'optimizer_state_dict': optimizer.state_dict(),
+ 'scheduler_state_dict': scheduler.state_dict(),
+ 'train_losses': train_losses,
+ 'test_losses': test_losses,
+ 'config': cfg,
+ 'mask_ids': mask_ids,
+ }, best_path)
+ print(f" ✓ Saved best model (test loss: {best_test_loss:.4f})")
+ else:
+ print(f" ✓ Saved checkpoint")
+
+ # Close wandb
+ if use_wandb:
+ wandb.finish()
+
+ print("\n" + "="*80)
+ print("TRAINING COMPLETE")
+ print("="*80)
+
+
+if __name__ == "__main__":
+ import argparse
+
+ parser = argparse.ArgumentParser(description="Train hybrid diffusion model")
+ parser.add_argument("--data_dir", type=str, default="processed_data", help="Data directory")
+ parser.add_argument("--output_dir", type=str, default="checkpoints", help="Output directory")
+ parser.add_argument("--batch_size", type=int, default=32, help="Batch size")
+ parser.add_argument("--num_epochs", type=int, default=100, help="Number of epochs")
+ parser.add_argument("--learning_rate", type=float, default=1e-4, help="Learning rate")
+ parser.add_argument("--T", type=int, default=100, help="Number of diffusion timesteps")
+ parser.add_argument("--n_max_layer", type=int, default=10, help="Maximum number of layers")
+ parser.add_argument("--beta_start", type=float, default=1e-4, help="Beta schedule start")
+ parser.add_argument("--beta_end", type=float, default=0.02, help="Beta schedule end")
+ parser.add_argument("--lambda_angle", type=float, default=1.0, help="Angle loss weight")
+ parser.add_argument("--lambda_material", type=float, default=1.0, help="Material loss weight")
+ parser.add_argument("--lambda_vf_category", type=float, default=1.0, help="Volume fraction category loss weight")
+ parser.add_argument("--lambda_layer", type=float, default=1.0, help="Layer loss weight")
+ parser.add_argument("--save_every", type=int, default=10, help="Save checkpoint every N epochs")
+ parser.add_argument("--normalization_method", type=str, default='minmax',
+ choices=['minmax', 'zscore'],
+ help="Normalization method for coefficients (default: minmax)")
+ parser.add_argument("--random_seed", type=int, default=533, help="Random seed for reproducibility (default: 533)")
+ parser.add_argument("--gpu", type=int, default=0,
+ help="GPU index to use (e.g., 0, 1, 2). Default: 0")
+ parser.add_argument("--gen_eval_n_samples", type=int, default=None,
+ help="Number of samples to generate for generation metrics evaluation (default: None = use all test samples)")
+ parser.add_argument("--gen_eval_every", type=int, default=10,
+ help="Evaluate generation metrics every N epochs (default: 1 = every epoch)")
+ parser.add_argument("--use_discrete_angles", action="store_true", default=True,
+ help="Use discrete angle categories (0, 15, 30, 45, 60, 75, 90 degrees). Default: True")
+ parser.add_argument("--use_continuous_angles", action="store_true", default=False,
+ help="Use continuous angles with Gaussian diffusion. Overrides --use_discrete_angles")
+ parser.add_argument("--visualize_matches", action="store_true", default=False,
+ help="Visualize matches with dataset samples during generation evaluation")
+ parser.add_argument("--save_visualizations", action="store_true", default=False,
+ help="Save visualization plots to disk during training")
+ parser.add_argument("--n_visualization_samples", type=int, default=10,
+ help="Number of samples to generate visualizations for (default: 10)")
+ parser.add_argument("--warmup_ratio", type=float, default=0.01,
+ help="Warmup ratio (fraction of total training steps, default: 0.01 = 1%%)")
+ parser.add_argument("--log_every_n_steps", type=int, default=100,
+ help="Log training metrics every N steps (default: 100)")
+ parser.add_argument("--use_wandb", action="store_true", default=False,
+ help="Use Weights & Biases for logging metrics and images")
+ parser.add_argument("--wandb_project", type=str, default="material-generation",
+ help="Wandb project name (default: material-generation)")
+ parser.add_argument("--wandb_name", type=str, default=None,
+ help="Wandb run name (default: uses experiment timestamp)")
+ parser.add_argument("--angle_resolution", type=float, default=1.0,
+ help="Resolution in degrees for angle discretization (default: 1.0)")
+ parser.add_argument("--curve_dir", type=str, default=None,
+ help="Directory containing RVE_Datasets for on-the-fly validation simulations (default: None, will try to auto-detect)")
+ parser.add_argument("--demo_steps_per_epoch", type=int, default=None,
+ help="Demo mode: limit training to N steps per epoch (default: None = use all steps). Useful for quick testing.")
+ parser.add_argument("--num_processes", type=int, default=None,
+ help="Number of processes for multiprocessing during on-the-fly validation simulations (default: None = auto-detect based on CPU count)")
+ parser.add_argument("--n_validation_samples", type=int, default=100,
+ help="Number of samples to generate and simulate during on-the-fly validation (default: 100)")
+
+ args = parser.parse_args()
+
+ # Determine angle diffusion mode
+ if args.use_continuous_angles:
+ use_discrete_angles = False
+ else:
+ use_discrete_angles = args.use_discrete_angles
+
+ # Handle GPU selection
+ if not torch.cuda.is_available():
+ raise ValueError("CUDA is not available. This script requires GPU support.")
+ if args.gpu < 0 or args.gpu >= torch.cuda.device_count():
+ raise ValueError(f"GPU {args.gpu} is out of range. Available GPUs: 0-{torch.cuda.device_count()-1}")
+ device = f"cuda:{args.gpu}"
+ print(f"Using GPU {args.gpu}: {torch.cuda.get_device_name(args.gpu)}")
+
+ train(
+ data_dir=args.data_dir,
+ output_dir=args.output_dir,
+ batch_size=args.batch_size,
+ num_epochs=args.num_epochs,
+ learning_rate=args.learning_rate,
+ T=args.T,
+ n_max_layer=args.n_max_layer,
+ beta_start=args.beta_start,
+ beta_end=args.beta_end,
+ lambda_angle=args.lambda_angle,
+ lambda_material=args.lambda_material,
+ lambda_vf_category=args.lambda_vf_category,
+ lambda_layer=args.lambda_layer,
+ save_every=args.save_every,
+ normalization_method=args.normalization_method,
+ random_seed=args.random_seed,
+ device=device,
+ gen_eval_n_samples=args.gen_eval_n_samples,
+ gen_eval_every=args.gen_eval_every,
+ use_discrete_angles=use_discrete_angles,
+ visualize_matches=args.visualize_matches,
+ save_visualizations=args.save_visualizations,
+ n_visualization_samples=args.n_visualization_samples,
+ warmup_ratio=args.warmup_ratio,
+ log_every_n_steps=args.log_every_n_steps,
+ use_wandb=args.use_wandb,
+ wandb_project=args.wandb_project,
+ wandb_name=args.wandb_name,
+ angle_resolution=args.angle_resolution,
+ curve_dir=args.curve_dir,
+ demo_steps_per_epoch=args.demo_steps_per_epoch,
+ num_processes=args.num_processes
+ )
diff --git a/hybrid_diffusion_material_generation/utils/__init__.py b/hybrid_diffusion_material_generation/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..2602cbc52767b49d04bf7a5ce9fcf4a395f32b23
--- /dev/null
+++ b/hybrid_diffusion_material_generation/utils/__init__.py
@@ -0,0 +1,31 @@
+"""
+Utility modules for material design data processing.
+"""
+
+from .fitting_utils import (
+ parse_dataset,
+ polynomial_fit,
+ calculate_r2,
+ fit_all_relationships,
+ fit_all_relationships_detailed
+)
+
+from .preprocessing import (
+ parse_metadata,
+ preprocess_dataset,
+ preprocess_dataset_batch,
+ MATERIAL_TYPES
+)
+
+__all__ = [
+ 'parse_dataset',
+ 'polynomial_fit',
+ 'calculate_r2',
+ 'fit_all_relationships',
+ 'fit_all_relationships_detailed',
+ 'parse_metadata',
+ 'preprocess_dataset',
+ 'preprocess_dataset_batch',
+ 'MATERIAL_TYPES'
+]
+
diff --git a/hybrid_diffusion_material_generation/utils/fitting_utils.py b/hybrid_diffusion_material_generation/utils/fitting_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..856645ae8b66831ef39764d7a770164f6b0001bd
--- /dev/null
+++ b/hybrid_diffusion_material_generation/utils/fitting_utils.py
@@ -0,0 +1,641 @@
+"""
+Utility functions for polynomial fitting of material dataset.
+
+This module provides functions for:
+- Parsing dataset files
+- Performing polynomial fitting
+- Performing Ramberg-Osgood fitting
+- Calculating fit quality metrics
+- Fitting all relationships in the dataset
+"""
+
+import numpy as np
+from typing import Dict, Tuple, Optional, Callable
+from scipy.optimize import curve_fit
+
+
+def parse_dataset(filepath: str) -> Dict[str, np.ndarray]:
+ """
+ Parse the dataset file and extract the three sections:
+ 1. eps_11 vs sig_11 and eps_22
+ 2. eps_22 vs sig_22 and eps_11
+ 3. eps_12 vs sig_12
+
+ Args:
+ filepath: Path to the dataset file
+
+ Returns:
+ Dictionary with keys 'section1', 'section2', 'section3' containing numpy arrays
+ """
+ with open(filepath, 'r') as f:
+ content = f.read()
+
+ # Split by empty lines to get sections
+ sections = content.strip().split('\n\n')
+
+ data = {}
+
+ # Section 1: eps_11, sig_11, eps_22
+ if len(sections) > 0:
+ lines = sections[0].strip().split('\n')
+ if len(lines) > 1 and 'eps_11' in lines[0]:
+ data['section1'] = []
+ for line in lines[1:]:
+ if line.strip():
+ parts = line.split()
+ if len(parts) >= 3:
+ data['section1'].append([float(parts[0]), float(parts[1]), float(parts[2])])
+ data['section1'] = np.array(data['section1'])
+
+ # Section 2: eps_22, sig_22, eps_11
+ if len(sections) > 1:
+ lines = sections[1].strip().split('\n')
+ if len(lines) > 1 and 'eps_22' in lines[0]:
+ data['section2'] = []
+ for line in lines[1:]:
+ if line.strip():
+ parts = line.split()
+ if len(parts) >= 3:
+ data['section2'].append([float(parts[0]), float(parts[1]), float(parts[2])])
+ data['section2'] = np.array(data['section2'])
+
+ # Section 3: eps_12, sig_12
+ if len(sections) > 2:
+ lines = sections[2].strip().split('\n')
+ if len(lines) > 1 and 'eps_12' in lines[0]:
+ data['section3'] = []
+ for line in lines[1:]:
+ if line.strip():
+ parts = line.split()
+ if len(parts) >= 2:
+ data['section3'].append([float(parts[0]), float(parts[1])])
+ data['section3'] = np.array(data['section3'])
+
+ return data
+
+
+def polynomial_fit(x: np.ndarray, y: np.ndarray, degree: int = 3) -> Tuple[np.ndarray, np.poly1d, np.ndarray, np.ndarray]:
+ """
+ Perform polynomial fitting of specified degree with no bias term.
+ This ensures that when x=0, y=0 (the polynomial passes through the origin).
+
+ Args:
+ x: Independent variable data
+ y: Dependent variable data
+ degree: Degree of the polynomial (default: 3)
+
+ Returns:
+ Tuple of (coefficients, polynomial function, x_fit, y_fit)
+ - coefficients: numpy array of polynomial coefficients (highest degree first)
+ - polynomial function: numpy poly1d object
+ - x_fit: x values for fitted curve
+ - y_fit: y values for fitted curve
+ """
+ # Fit polynomial without constant term by using least squares on Vandermonde matrix
+ # Create Vandermonde matrix without the constant column (x^0)
+ vander = np.vander(x, degree + 1, increasing=False)[:, :-1] # Remove last column (constant term)
+
+ # Solve least squares: vander @ coeffs = y
+ coeffs, _, _, _ = np.linalg.lstsq(vander, y, rcond=None)
+
+ # Create polynomial function (append 0 for constant term for poly1d compatibility)
+ coeffs_with_zero = np.append(coeffs, 0)
+ poly_func = np.poly1d(coeffs_with_zero)
+
+ # Generate fitted curve
+ x_fit = np.linspace(x.min(), x.max(), 100)
+ y_fit = poly_func(x_fit)
+
+ return coeffs, poly_func, x_fit, y_fit
+
+
+def calculate_r2(y_true: np.ndarray, y_pred: np.ndarray) -> float:
+ """
+ Calculate R-squared value.
+
+ Args:
+ y_true: True y values
+ y_pred: Predicted y values
+
+ Returns:
+ R-squared value
+ """
+ ss_res = np.sum((y_true - y_pred) ** 2)
+ ss_tot = np.sum((y_true - np.mean(y_true)) ** 2)
+ r2 = 1 - (ss_res / ss_tot) if ss_tot != 0 else 0
+ return r2
+
+
+def ramberg_osgood_stress_strain(x: np.ndarray, a: float, b: float, c: float) -> np.ndarray:
+ """
+ Ramberg-Osgood relationship for stress-strain: y = a*x + b*x^c
+
+ This form is suitable for fitting stress as a function of strain,
+ where a represents the elastic modulus and b, c represent the
+ nonlinear hardening behavior.
+
+ Args:
+ x: Independent variable (strain)
+ a: Linear coefficient (elastic modulus)
+ b: Nonlinear coefficient
+ c: Power exponent
+
+ Returns:
+ Predicted y values (stress)
+ """
+ # Ensure we handle negative values appropriately
+ x_abs = np.abs(x)
+ sign = np.sign(x)
+ return sign * (a * x_abs + b * np.power(x_abs, c))
+
+
+def ramberg_osgood_power_law(x: np.ndarray, a: float, b: float) -> np.ndarray:
+ """
+ Power law relationship: y = a*x^b
+
+ This form is suitable for strain-strain relationships or
+ other power-law dependencies.
+
+ Args:
+ x: Independent variable
+ a: Coefficient
+ b: Power exponent
+
+ Returns:
+ Predicted y values
+ """
+ # Ensure we handle negative values appropriately
+ x_abs = np.abs(x)
+ sign = np.sign(x)
+ return sign * a * np.power(x_abs, b)
+
+
+def ramberg_osgood_fit(x: np.ndarray, y: np.ndarray, use_power_law: bool = False) -> Tuple[np.ndarray, Callable, np.ndarray, np.ndarray]:
+ """
+ Perform Ramberg-Osgood fitting.
+
+ For stress-strain relationships: uses y = a*x + b*x^c
+ For strain-strain relationships: uses y = a*x^b
+
+ Args:
+ x: Independent variable data
+ y: Dependent variable data
+ use_power_law: If True, use power law (y = a*x^b) instead of full Ramberg-Osgood
+
+ Returns:
+ Tuple of (parameters, fit function, x_fit, y_fit)
+ - parameters: numpy array of fitted parameters
+ - fit function: function that takes x and returns y
+ - x_fit: x values for fitted curve
+ - y_fit: y values for fitted curve
+ """
+ # Filter out zero values to avoid issues with power functions
+ mask = (x != 0) & (y != 0) & np.isfinite(x) & np.isfinite(y)
+ if np.sum(mask) < 3:
+ # Not enough data points, return default values
+ if use_power_law:
+ params = np.array([1.0, 1.0])
+ fit_func = lambda x_val: ramberg_osgood_power_law(x_val, params[0], params[1])
+ else:
+ params = np.array([1.0, 0.0, 1.0])
+ fit_func = lambda x_val: ramberg_osgood_stress_strain(x_val, params[0], params[1], params[2])
+ x_fit = np.linspace(x.min(), x.max(), 100)
+ y_fit = fit_func(x_fit)
+ return params, fit_func, x_fit, y_fit
+
+ x_fit_data = x[mask]
+ y_fit_data = y[mask]
+
+ try:
+ if use_power_law:
+ # Power law: y = a*x^b
+ # Initial guess: linear relationship (a=slope, b=1)
+ if len(x_fit_data) > 0:
+ slope = np.mean(y_fit_data / x_fit_data) if np.any(x_fit_data != 0) else 1.0
+ else:
+ slope = 1.0
+ p0 = [abs(slope), 1.0]
+
+ # Bounds: a > 0, b can be any positive value
+ bounds = ([0, 0.1], [np.inf, 10.0])
+
+ params, _ = curve_fit(
+ ramberg_osgood_power_law,
+ x_fit_data,
+ y_fit_data,
+ p0=p0,
+ bounds=bounds,
+ maxfev=5000
+ )
+
+ fit_func = lambda x_val: ramberg_osgood_power_law(x_val, params[0], params[1])
+ else:
+ # Full Ramberg-Osgood: y = a*x + b*x^c
+ # Initial guess: linear relationship (a=slope, b=small, c=2)
+ if len(x_fit_data) > 0:
+ slope = np.mean(y_fit_data / x_fit_data) if np.any(x_fit_data != 0) else 1.0
+ else:
+ slope = 1.0
+ p0 = [abs(slope), 0.01, 2.0]
+
+ # Bounds: a > 0, b >= 0, c > 0
+ bounds = ([0, 0, 0.1], [np.inf, np.inf, 10.0])
+
+ params, _ = curve_fit(
+ ramberg_osgood_stress_strain,
+ x_fit_data,
+ y_fit_data,
+ p0=p0,
+ bounds=bounds,
+ maxfev=5000
+ )
+
+ fit_func = lambda x_val: ramberg_osgood_stress_strain(x_val, params[0], params[1], params[2])
+
+ # Generate fitted curve
+ x_fit = np.linspace(x.min(), x.max(), 100)
+ y_fit = fit_func(x_fit)
+
+ return params, fit_func, x_fit, y_fit
+
+ except Exception as e:
+ # If fitting fails, return default values
+ if use_power_law:
+ params = np.array([1.0, 1.0])
+ fit_func = lambda x_val: ramberg_osgood_power_law(x_val, params[0], params[1])
+ else:
+ params = np.array([1.0, 0.0, 1.0])
+ fit_func = lambda x_val: ramberg_osgood_stress_strain(x_val, params[0], params[1], params[2])
+ x_fit = np.linspace(x.min(), x.max(), 100)
+ y_fit = fit_func(x_fit)
+ return params, fit_func, x_fit, y_fit
+
+
+def fit_all_relationships(data: Dict[str, np.ndarray], degree: int = 3) -> np.ndarray:
+ """
+ Fit all 5 relationships in the dataset.
+
+ Relationships (in order):
+ 0. eps_11 vs sig_11
+ 1. eps_11 vs eps_22
+ 2. eps_22 vs sig_22
+ 3. eps_22 vs eps_11
+ 4. eps_12 vs sig_12
+
+ Args:
+ data: Dictionary containing parsed dataset sections
+ degree: Degree of polynomial fit (default: 3)
+
+ Returns:
+ Numpy array of shape [5, degree] containing polynomial coefficients.
+ Each row corresponds to one relationship, with coefficients ordered
+ from highest degree to first degree (e.g., [x^3, x^2, x] for degree=3).
+ Note: There is no constant term, ensuring y=0 when x=0.
+ """
+ coeffs_list = []
+
+ # Relationship 0: eps_11 vs sig_11
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ sig_11 = data['section1'][:, 1]
+ coeffs, _, _, _ = polynomial_fit(eps_11, sig_11, degree)
+ coeffs_list.append(coeffs)
+ else:
+ coeffs_list.append(np.zeros(degree))
+
+ # Relationship 1: eps_11 vs eps_22
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ eps_22 = data['section1'][:, 2]
+ coeffs, _, _, _ = polynomial_fit(eps_11, eps_22, degree)
+ coeffs_list.append(coeffs)
+ else:
+ coeffs_list.append(np.zeros(degree))
+
+ # Relationship 2: eps_22 vs sig_22
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ sig_22 = data['section2'][:, 1]
+ coeffs, _, _, _ = polynomial_fit(eps_22, sig_22, degree)
+ coeffs_list.append(coeffs)
+ else:
+ coeffs_list.append(np.zeros(degree))
+
+ # Relationship 3: eps_22 vs eps_11
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ eps_11 = data['section2'][:, 2]
+ coeffs, _, _, _ = polynomial_fit(eps_22, eps_11, degree)
+ coeffs_list.append(coeffs)
+ else:
+ coeffs_list.append(np.zeros(degree))
+
+ # Relationship 4: eps_12 vs sig_12
+ if 'section3' in data and len(data['section3']) > 0:
+ eps_12 = data['section3'][:, 0]
+ sig_12 = data['section3'][:, 1]
+ coeffs, _, _, _ = polynomial_fit(eps_12, sig_12, degree)
+ coeffs_list.append(coeffs)
+ else:
+ coeffs_list.append(np.zeros(degree))
+
+ # Stack into [5, degree] array
+ return np.array(coeffs_list)
+
+
+def fit_all_relationships_detailed(data: Dict[str, np.ndarray], degree: int = 3) -> Dict[str, Dict]:
+ """
+ Fit all 5 relationships in the dataset and return detailed results.
+
+ This is a helper function for visualization and debugging purposes.
+ For data processing, use fit_all_relationships() which returns a tensor.
+
+ Relationships:
+ 1. eps_11 vs sig_11
+ 2. eps_11 vs eps_22
+ 3. eps_22 vs sig_22
+ 4. eps_22 vs eps_11
+ 5. eps_12 vs sig_12
+
+ Args:
+ data: Dictionary containing parsed dataset sections
+ degree: Degree of polynomial fit (default: 3)
+
+ Returns:
+ Dictionary with fitting results for each relationship.
+ Each entry contains:
+ - 'coeffs': polynomial coefficients
+ - 'r2': R-squared value
+ - 'poly_func': polynomial function (numpy poly1d)
+ - 'x': original x data
+ - 'y': original y data
+ """
+ results = {}
+
+ # Relationship 1: eps_11 vs sig_11
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ sig_11 = data['section1'][:, 1]
+
+ coeffs, poly_func, _, _ = polynomial_fit(eps_11, sig_11, degree)
+ r2 = calculate_r2(sig_11, poly_func(eps_11))
+
+ results['eps_11_vs_sig_11'] = {
+ 'coeffs': coeffs,
+ 'r2': r2,
+ 'poly_func': poly_func,
+ 'x': eps_11,
+ 'y': sig_11
+ }
+
+ # Relationship 2: eps_11 vs eps_22
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ eps_22 = data['section1'][:, 2]
+
+ coeffs, poly_func, _, _ = polynomial_fit(eps_11, eps_22, degree)
+ r2 = calculate_r2(eps_22, poly_func(eps_11))
+
+ results['eps_11_vs_eps_22'] = {
+ 'coeffs': coeffs,
+ 'r2': r2,
+ 'poly_func': poly_func,
+ 'x': eps_11,
+ 'y': eps_22
+ }
+
+ # Relationship 3: eps_22 vs sig_22
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ sig_22 = data['section2'][:, 1]
+
+ coeffs, poly_func, _, _ = polynomial_fit(eps_22, sig_22, degree)
+ r2 = calculate_r2(sig_22, poly_func(eps_22))
+
+ results['eps_22_vs_sig_22'] = {
+ 'coeffs': coeffs,
+ 'r2': r2,
+ 'poly_func': poly_func,
+ 'x': eps_22,
+ 'y': sig_22
+ }
+
+ # Relationship 4: eps_22 vs eps_11
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ eps_11 = data['section2'][:, 2]
+
+ coeffs, poly_func, _, _ = polynomial_fit(eps_22, eps_11, degree)
+ r2 = calculate_r2(eps_11, poly_func(eps_22))
+
+ results['eps_22_vs_eps_11'] = {
+ 'coeffs': coeffs,
+ 'r2': r2,
+ 'poly_func': poly_func,
+ 'x': eps_22,
+ 'y': eps_11
+ }
+
+ # Relationship 5: eps_12 vs sig_12
+ if 'section3' in data and len(data['section3']) > 0:
+ eps_12 = data['section3'][:, 0]
+ sig_12 = data['section3'][:, 1]
+
+ coeffs, poly_func, _, _ = polynomial_fit(eps_12, sig_12, degree)
+ r2 = calculate_r2(sig_12, poly_func(eps_12))
+
+ results['eps_12_vs_sig_12'] = {
+ 'coeffs': coeffs,
+ 'r2': r2,
+ 'poly_func': poly_func,
+ 'x': eps_12,
+ 'y': sig_12
+ }
+
+ return results
+
+
+def fit_all_relationships_ramberg_osgood(data: Dict[str, np.ndarray]) -> np.ndarray:
+ """
+ Fit all 5 relationships in the dataset using Ramberg-Osgood relationship.
+
+ Relationships (in order):
+ 0. eps_11 vs sig_11 (stress-strain: uses full Ramberg-Osgood)
+ 1. eps_11 vs eps_22 (strain-strain: uses power law)
+ 2. eps_22 vs sig_22 (stress-strain: uses full Ramberg-Osgood)
+ 3. eps_22 vs eps_11 (strain-strain: uses power law)
+ 4. eps_12 vs sig_12 (stress-strain: uses full Ramberg-Osgood)
+
+ Args:
+ data: Dictionary containing parsed dataset sections
+
+ Returns:
+ Numpy array of shape [5, 3] containing Ramberg-Osgood parameters.
+ For stress-strain relationships: [a, b, c] where y = a*x + b*x^c
+ For strain-strain relationships: [a, b, 0] where y = a*x^b (c is unused)
+ """
+ params_list = []
+
+ # Relationship 0: eps_11 vs sig_11 (stress-strain)
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ sig_11 = data['section1'][:, 1]
+ params, _, _, _ = ramberg_osgood_fit(eps_11, sig_11, use_power_law=False)
+ params_list.append(params)
+ else:
+ params_list.append(np.array([1.0, 0.0, 1.0]))
+
+ # Relationship 1: eps_11 vs eps_22 (strain-strain)
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ eps_22 = data['section1'][:, 2]
+ params, _, _, _ = ramberg_osgood_fit(eps_11, eps_22, use_power_law=True)
+ # Pad with 0 for consistency (power law only has 2 params)
+ params_padded = np.append(params, 0.0)
+ params_list.append(params_padded)
+ else:
+ params_list.append(np.array([1.0, 1.0, 0.0]))
+
+ # Relationship 2: eps_22 vs sig_22 (stress-strain)
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ sig_22 = data['section2'][:, 1]
+ params, _, _, _ = ramberg_osgood_fit(eps_22, sig_22, use_power_law=False)
+ params_list.append(params)
+ else:
+ params_list.append(np.array([1.0, 0.0, 1.0]))
+
+ # Relationship 3: eps_22 vs eps_11 (strain-strain)
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ eps_11 = data['section2'][:, 2]
+ params, _, _, _ = ramberg_osgood_fit(eps_22, eps_11, use_power_law=True)
+ # Pad with 0 for consistency (power law only has 2 params)
+ params_padded = np.append(params, 0.0)
+ params_list.append(params_padded)
+ else:
+ params_list.append(np.array([1.0, 1.0, 0.0]))
+
+ # Relationship 4: eps_12 vs sig_12 (stress-strain)
+ if 'section3' in data and len(data['section3']) > 0:
+ eps_12 = data['section3'][:, 0]
+ sig_12 = data['section3'][:, 1]
+ params, _, _, _ = ramberg_osgood_fit(eps_12, sig_12, use_power_law=False)
+ params_list.append(params)
+ else:
+ params_list.append(np.array([1.0, 0.0, 1.0]))
+
+ # Stack into [5, 3] array
+ return np.array(params_list)
+
+
+def fit_all_relationships_ramberg_osgood_detailed(data: Dict[str, np.ndarray]) -> Dict[str, Dict]:
+ """
+ Fit all 5 relationships in the dataset using Ramberg-Osgood and return detailed results.
+
+ This is a helper function for visualization and debugging purposes.
+ For data processing, use fit_all_relationships_ramberg_osgood() which returns a tensor.
+
+ Relationships:
+ 1. eps_11 vs sig_11 (stress-strain: full Ramberg-Osgood)
+ 2. eps_11 vs eps_22 (strain-strain: power law)
+ 3. eps_22 vs sig_22 (stress-strain: full Ramberg-Osgood)
+ 4. eps_22 vs eps_11 (strain-strain: power law)
+ 5. eps_12 vs sig_12 (stress-strain: full Ramberg-Osgood)
+
+ Args:
+ data: Dictionary containing parsed dataset sections
+
+ Returns:
+ Dictionary with fitting results for each relationship.
+ Each entry contains:
+ - 'params': Ramberg-Osgood parameters
+ - 'r2': R-squared value
+ - 'fit_func': fitting function
+ - 'x': original x data
+ - 'y': original y data
+ """
+ results = {}
+
+ # Relationship 1: eps_11 vs sig_11 (stress-strain)
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ sig_11 = data['section1'][:, 1]
+
+ params, fit_func, _, _ = ramberg_osgood_fit(eps_11, sig_11, use_power_law=False)
+ r2 = calculate_r2(sig_11, fit_func(eps_11))
+
+ results['eps_11_vs_sig_11'] = {
+ 'params': params,
+ 'r2': r2,
+ 'fit_func': fit_func,
+ 'x': eps_11,
+ 'y': sig_11
+ }
+
+ # Relationship 2: eps_11 vs eps_22 (strain-strain)
+ if 'section1' in data and len(data['section1']) > 0:
+ eps_11 = data['section1'][:, 0]
+ eps_22 = data['section1'][:, 2]
+
+ params, fit_func, _, _ = ramberg_osgood_fit(eps_11, eps_22, use_power_law=True)
+ r2 = calculate_r2(eps_22, fit_func(eps_11))
+
+ results['eps_11_vs_eps_22'] = {
+ 'params': params,
+ 'r2': r2,
+ 'fit_func': fit_func,
+ 'x': eps_11,
+ 'y': eps_22
+ }
+
+ # Relationship 3: eps_22 vs sig_22 (stress-strain)
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ sig_22 = data['section2'][:, 1]
+
+ params, fit_func, _, _ = ramberg_osgood_fit(eps_22, sig_22, use_power_law=False)
+ r2 = calculate_r2(sig_22, fit_func(eps_22))
+
+ results['eps_22_vs_sig_22'] = {
+ 'params': params,
+ 'r2': r2,
+ 'fit_func': fit_func,
+ 'x': eps_22,
+ 'y': sig_22
+ }
+
+ # Relationship 4: eps_22 vs eps_11 (strain-strain)
+ if 'section2' in data and len(data['section2']) > 0:
+ eps_22 = data['section2'][:, 0]
+ eps_11 = data['section2'][:, 2]
+
+ params, fit_func, _, _ = ramberg_osgood_fit(eps_22, eps_11, use_power_law=True)
+ r2 = calculate_r2(eps_11, fit_func(eps_22))
+
+ results['eps_22_vs_eps_11'] = {
+ 'params': params,
+ 'r2': r2,
+ 'fit_func': fit_func,
+ 'x': eps_22,
+ 'y': eps_11
+ }
+
+ # Relationship 5: eps_12 vs sig_12 (stress-strain)
+ if 'section3' in data and len(data['section3']) > 0:
+ eps_12 = data['section3'][:, 0]
+ sig_12 = data['section3'][:, 1]
+
+ params, fit_func, _, _ = ramberg_osgood_fit(eps_12, sig_12, use_power_law=False)
+ r2 = calculate_r2(sig_12, fit_func(eps_12))
+
+ results['eps_12_vs_sig_12'] = {
+ 'params': params,
+ 'r2': r2,
+ 'fit_func': fit_func,
+ 'x': eps_12,
+ 'y': sig_12
+ }
+
+ return results
+
diff --git a/hybrid_diffusion_material_generation/utils/preprocessing.py b/hybrid_diffusion_material_generation/utils/preprocessing.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa7bec350bed521c86fe8cedbba6d3060f7b6582
--- /dev/null
+++ b/hybrid_diffusion_material_generation/utils/preprocessing.py
@@ -0,0 +1,175 @@
+"""
+Preprocessing utilities for material dataset files.
+
+This module provides functions for:
+- Parsing dataset files and extracting all metadata
+- Performing polynomial fitting
+- Returning structured data for model training
+"""
+
+import numpy as np
+import re
+from typing import Dict, Tuple, Optional
+from .fitting_utils import parse_dataset, fit_all_relationships
+
+
+# Material type mapping
+MATERIAL_TYPES = {
+ 'CPP': 0,
+ 'CHDPE': 1,
+ 'GPP': 2,
+ 'GHDPE': 3
+}
+
+
+def parse_metadata(filepath: str) -> Dict:
+ """
+ Parse metadata from dataset file.
+
+ Args:
+ filepath: Path to the dataset file
+
+ Returns:
+ Dictionary containing parsed metadata:
+ - 'volume_fraction': float
+ - 'material_type': str (e.g., 'CHDPE')
+ - 'material_type_id': int (0-3)
+ - 'number_of_fibers': int
+ - 'fiber_centers_YZ': np.ndarray of shape [n_fibers, 2]
+ - 'stacking_sequence': list of floats (angles in degrees)
+ """
+ with open(filepath, 'r') as f:
+ lines = f.readlines()
+
+ metadata = {}
+
+ for line in lines:
+ line = line.strip()
+
+ # Parse volume fraction
+ if line.startswith('volume fraction='):
+ value = line.split('=')[1].strip()
+ metadata['volume_fraction'] = float(value)
+
+ # Parse material type
+ elif line.startswith('material type='):
+ value = line.split('=')[1].strip()
+ metadata['material_type'] = value
+ metadata['material_type_id'] = MATERIAL_TYPES.get(value, -1)
+ if metadata['material_type_id'] == -1:
+ raise ValueError(f"Unknown material type: {value}")
+
+ # Parse number of fibers
+ elif line.startswith('number of fibers='):
+ value = line.split('=')[1].strip()
+ metadata['number_of_fibers'] = int(value)
+
+ # Parse stacking sequence
+ elif line.startswith('stacking sequence='):
+ value = line.split('=')[1].strip()
+ # Parse comma-separated angles
+ angles = [float(x.strip()) for x in value.split(',')]
+ metadata['stacking_sequence'] = np.array(angles, dtype=np.float32)
+
+ # Parse fiber centers
+ elif line.startswith('fiber_centers_YZ='):
+ value = line.split('=')[1].strip()
+ # Parse pattern: (y1,z1) (y2,z2) ...
+ pattern = r'\(([^,]+),([^)]+)\)'
+ matches = re.findall(pattern, value)
+ centers = []
+ for match in matches:
+ y = float(match[0].strip())
+ z = float(match[1].strip())
+ centers.append([y, z])
+ metadata['fiber_centers_YZ'] = np.array(centers, dtype=np.float32)
+
+ return metadata
+
+
+def preprocess_dataset(filepath: str, degree: int = 3) -> Dict:
+ """
+ Preprocess a dataset file and extract all required information.
+
+ Args:
+ filepath: Path to the dataset file
+ degree: Degree of polynomial fit (default: 3)
+
+ Returns:
+ Dictionary containing:
+ - 'polynomial_coefficients': np.ndarray of shape [5, degree]
+ - 'material_type': int (0 to n_materials-1)
+ - 'number_of_fibers': np.ndarray of shape [1] (int)
+ - 'volume_fraction': np.ndarray of shape [1] (float)
+ - 'fiber_centers_YZ': np.ndarray of shape [number_of_fibers, 2]
+ - 'stacking_sequence': np.ndarray of shape [n_layers] (float, angles in degrees)
+ """
+ # Parse the dataset for polynomial fitting
+ data = parse_dataset(filepath)
+
+ # Perform polynomial fitting
+ polynomial_coefficients = fit_all_relationships(data, degree=degree)
+
+ # Parse metadata
+ metadata = parse_metadata(filepath)
+
+ # Construct output dictionary
+ result = {
+ 'polynomial_coefficients': polynomial_coefficients, # [5, degree]
+ 'material_type': np.array([metadata['material_type_id']], dtype=np.int64), # [1]
+ 'number_of_fibers': np.array([metadata['number_of_fibers']], dtype=np.int64), # [1]
+ 'volume_fraction': np.array([metadata['volume_fraction']], dtype=np.float32), # [1]
+ 'fiber_centers_YZ': metadata['fiber_centers_YZ'], # [number_of_fibers, 2]
+ 'stacking_sequence': metadata['stacking_sequence'], # [n_layers]
+ }
+
+ return result
+
+
+def preprocess_dataset_batch(filepaths: list, degree: int = 3) -> Dict:
+ """
+ Preprocess multiple dataset files and return batched arrays.
+
+ Args:
+ filepaths: List of paths to dataset files
+ degree: Degree of polynomial fit (default: 3)
+
+ Returns:
+ Dictionary containing batched arrays:
+ - 'polynomial_coefficients': np.ndarray of shape [batch_size, 5, degree]
+ - 'material_type': np.ndarray of shape [batch_size, 1]
+ - 'number_of_fibers': np.ndarray of shape [batch_size, 1]
+ - 'volume_fraction': np.ndarray of shape [batch_size, 1]
+ - 'fiber_centers_YZ': list of np.ndarray (variable length per sample)
+ - 'stacking_sequence': list of np.ndarray (variable length per sample)
+ """
+ batch_results = {
+ 'polynomial_coefficients': [],
+ 'material_type': [],
+ 'number_of_fibers': [],
+ 'volume_fraction': [],
+ 'fiber_centers_YZ': [],
+ 'stacking_sequence': []
+ }
+
+ for filepath in filepaths:
+ result = preprocess_dataset(filepath, degree=degree)
+
+ batch_results['polynomial_coefficients'].append(result['polynomial_coefficients'])
+ batch_results['material_type'].append(result['material_type'])
+ batch_results['number_of_fibers'].append(result['number_of_fibers'])
+ batch_results['volume_fraction'].append(result['volume_fraction'])
+ batch_results['fiber_centers_YZ'].append(result['fiber_centers_YZ'])
+ batch_results['stacking_sequence'].append(result['stacking_sequence'])
+
+ # Stack arrays where possible
+ batch_results['polynomial_coefficients'] = np.array(batch_results['polynomial_coefficients'])
+ batch_results['material_type'] = np.array(batch_results['material_type'])
+ batch_results['number_of_fibers'] = np.array(batch_results['number_of_fibers'])
+ batch_results['volume_fraction'] = np.array(batch_results['volume_fraction'])
+
+ # Keep lists for variable-length arrays
+ # (fiber_centers_YZ and stacking_sequence remain as lists)
+
+ return batch_results
+
diff --git a/inverse_design_demo/.gitattributes b/inverse_design_demo/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..54d9a7290224dc04bbac33f49ad3e1e6cc831958
--- /dev/null
+++ b/inverse_design_demo/.gitattributes
@@ -0,0 +1,38 @@
+*.7z filter=lfs diff=lfs merge=lfs -text
+*.arrow filter=lfs diff=lfs merge=lfs -text
+*.bin filter=lfs diff=lfs merge=lfs -text
+*.bz2 filter=lfs diff=lfs merge=lfs -text
+*.ckpt filter=lfs diff=lfs merge=lfs -text
+*.ftz filter=lfs diff=lfs merge=lfs -text
+*.gz filter=lfs diff=lfs merge=lfs -text
+*.h5 filter=lfs diff=lfs merge=lfs -text
+*.joblib filter=lfs diff=lfs merge=lfs -text
+*.lfs.* filter=lfs diff=lfs merge=lfs -text
+*.mlmodel filter=lfs diff=lfs merge=lfs -text
+*.model filter=lfs diff=lfs merge=lfs -text
+*.msgpack filter=lfs diff=lfs merge=lfs -text
+*.npy filter=lfs diff=lfs merge=lfs -text
+*.npz filter=lfs diff=lfs merge=lfs -text
+*.onnx filter=lfs diff=lfs merge=lfs -text
+*.ot filter=lfs diff=lfs merge=lfs -text
+*.parquet filter=lfs diff=lfs merge=lfs -text
+*.pb filter=lfs diff=lfs merge=lfs -text
+*.pickle filter=lfs diff=lfs merge=lfs -text
+*.pkl filter=lfs diff=lfs merge=lfs -text
+*.pt filter=lfs diff=lfs merge=lfs -text
+*.pth filter=lfs diff=lfs merge=lfs -text
+*.rar filter=lfs diff=lfs merge=lfs -text
+*.safetensors filter=lfs diff=lfs merge=lfs -text
+saved_model/**/* filter=lfs diff=lfs merge=lfs -text
+*.tar.* filter=lfs diff=lfs merge=lfs -text
+*.tar filter=lfs diff=lfs merge=lfs -text
+*.tflite filter=lfs diff=lfs merge=lfs -text
+*.tgz filter=lfs diff=lfs merge=lfs -text
+*.wasm filter=lfs diff=lfs merge=lfs -text
+*.xz filter=lfs diff=lfs merge=lfs -text
+*.zip filter=lfs diff=lfs merge=lfs -text
+*.zst filter=lfs diff=lfs merge=lfs -text
+*tfevents* filter=lfs diff=lfs merge=lfs -text
+material_res3.png filter=lfs diff=lfs merge=lfs -text
+figures/material_res3.png filter=lfs diff=lfs merge=lfs -text
+figures/forming_angle.png filter=lfs diff=lfs merge=lfs -text
diff --git a/inverse_design_demo/Data/DataForThermoforming.xlsx b/inverse_design_demo/Data/DataForThermoforming.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..36ebd54e89ebdb13b2c31d561e60d7484237ee6c
Binary files /dev/null and b/inverse_design_demo/Data/DataForThermoforming.xlsx differ
diff --git a/inverse_design_demo/Dataset.py b/inverse_design_demo/Dataset.py
new file mode 100644
index 0000000000000000000000000000000000000000..4fee1e37d4f97f758ca4b34d8111acf32f11aaaf
--- /dev/null
+++ b/inverse_design_demo/Dataset.py
@@ -0,0 +1,65 @@
+import numpy as np
+import pandas as pd
+
+np.random.seed(42)
+epsilon = 1e-8
+
+class Dataset:
+ def __init__(self, inverse=False):
+ filename = './Data/DataForThermoforming.xlsx'
+ self.df = pd.read_excel(filename, sheet_name='CFPEEK')
+ # remove rows by index
+ # self.df = self.df.drop([20, 48], axis=0)
+ self.df = self.df.drop([7, 78, 101, 129], axis=0)
+
+ # normalize data
+ if inverse:
+ self.input_columns = ['Ply_Number', 'Fiber_Volume_Fractions', 'A1(abs)', 'B1(abs)', 'C1(abs)', 'Stress(Max) MPa']
+ self.output_columns = ['Initial_Temp (degree celsius)', 'Punch_Velocity (mm/s)', 'Cooling_Time (s)']
+ else:
+ self.input_columns = ['Ply_Number', 'Fiber_Volume_Fractions', 'Initial_Temp (degree celsius)', 'Punch_Velocity (mm/s)', 'Cooling_Time (s)']
+ self.output_columns = ['A1(abs)', 'B1(abs)', 'C1(abs)', 'Stress(Max) MPa']
+
+ 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
+
+if __name__ == "__main__":
+ dataset = Dataset()
+
+ # Example usage
+ input_data = dataset.get_input(normalize=True)
+ output_data = dataset.get_output(normalize=True)
+
+ print("Input shape:", input_data.shape)
+ print("Output shape:", output_data.shape)
diff --git a/inverse_design_demo/README.md b/inverse_design_demo/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b78fc00faae40bc47b7822a7b28e4d1f14d6ccbb
--- /dev/null
+++ b/inverse_design_demo/README.md
@@ -0,0 +1,27 @@
+---
+title: Thermoforming inverse design
+sdk: streamlit
+emoji: 🚀
+colorFrom: red
+colorTo: red
+short_description: Thermoforming inverse design
+---
+# 🏂 US Population Dashboard
+
+A dashboard web app template built in Python using Streamlit.
+
+## Demo App
+
+[](https://population-dashboard.streamlit.app/)
+
+## Colab notebook
+[](https://github.com/dataprofessor/population-dashboard/blob/master/US_Population.ipynb)
+
+## Prerequisite libraries
+Here are the Python libraries used in the creation of this dashboard app
+
+## Data source
+US Population data spanning the duration of 2010-2019 was obtained from the [U.S. Census Bureau](https://www.census.gov/data/datasets/time-series/demo/popest/2010s-state-total.html).
+
+## Reference
+A talk entitled [_Crafting a Dashboard App in Python using Streamlit_](https://budapestbi.hu/2023/hu/program/speakers/chanin-nantasenamat/) showing how to build this app is given at the [Budapest BI Forum (Data Visualization track)](https://budapestbi.hu/2023/hu/en/program-data-visualization-track/) on November 22, 2023.
\ No newline at end of file
diff --git a/inverse_design_demo/app.py b/inverse_design_demo/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..cfa9902ed520d92f64924b76dfc540157656ffd9
--- /dev/null
+++ b/inverse_design_demo/app.py
@@ -0,0 +1,1168 @@
+#######################
+# Import libraries
+import streamlit as st
+import pandas as pd
+import altair as alt
+# import plotly.express as px
+from PIL import Image # Used to open and handle image files
+import matplotlib
+import matplotlib.pyplot as plt
+import numpy as np
+import os
+import sys
+import importlib.util
+import time
+import secrets
+from typing import Optional
+
+from model_inverse import inverse_design
+
+# --- Backend wiring only (UI layout below remains unchanged) ---
+# Use polynomial-conditioned hybrid diffusion model from:
+# /project/luofeng/feiyang/MaterialGeneration/hybrid_diffusion_material_generation
+APP_DIR = os.path.dirname(os.path.abspath(__file__))
+ROOT_DIR = os.path.abspath(os.path.join(APP_DIR, ".."))
+
+HYBRID_DIR = os.path.join(ROOT_DIR, "hybrid_diffusion_material_generation")
+if HYBRID_DIR not in sys.path:
+ sys.path.insert(0, HYBRID_DIR)
+
+# For laminate simulation we reuse the validated implementation from:
+# /project/luofeng/feiyang/MaterialGeneration/data_generation/hf_space_generation_ro/space_lib/simulate.py
+# We load it by file path to avoid Python module-name collisions (both repos have a `models.py`).
+_HF_SIMULATE_PY = os.path.join(
+ ROOT_DIR,
+ "data_generation",
+ "hf_space_generation_ro",
+ "space_lib",
+ "simulate.py",
+)
+_hf_sim_spec = importlib.util.spec_from_file_location("mg_hf_simulate", _HF_SIMULATE_PY)
+_hf_sim_mod = importlib.util.module_from_spec(_hf_sim_spec) # type: ignore[arg-type]
+assert _hf_sim_spec and _hf_sim_spec.loader
+_hf_sim_spec.loader.exec_module(_hf_sim_mod) # type: ignore[union-attr]
+simulate_instances = _hf_sim_mod.simulate_instances # type: ignore[attr-defined]
+default_lam_dir = _hf_sim_mod.default_lam_dir # type: ignore[attr-defined]
+
+# These imports are intentionally localized to the backend; UI code stays as-is.
+import torch # noqa: E402
+
+from models import MaterialHybridDenoiser, ModelConfig # noqa: E402
+from train import ( # noqa: E402
+ DiscreteMaskDiffusion,
+ GaussianDiffusion,
+ VF_CATEGORIES,
+ linear_beta_schedule,
+ sample as diffusion_sample,
+ vf_category_to_volume_fraction,
+)
+
+#######################
+# Page configuration
+st.set_page_config(
+ page_title="Inverse Design of Thermoplastic Composites for Thermoforming",
+# page_icon="🏂",
+ layout="wide",
+ initial_sidebar_state="collapsed")
+
+alt.themes.enable('default')
+
+#######################
+# CSS styling
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+
+st.set_page_config(initial_sidebar_state="collapsed")
+
+st.markdown(
+ """
+
+""",
+ unsafe_allow_html=True,
+)
+
+#######################
+font = {'size' : 18}
+
+matplotlib.rc('font', **font)
+
+#######################
+if 'input_changed' not in st.session_state:
+ st.session_state.input_changed= False
+def input_typed_in():
+ st.session_state.input_changed= True
+
+if 'forming_input_changed' not in st.session_state:
+ st.session_state.forming_input_changed= False
+def forming_typed_in():
+ st.session_state.forming_input_changed= True
+
+
+
+if 'input_curve_button_clicked' not in st.session_state:
+ st.session_state.input_curve_button_clicked= False
+def input_curve_click():
+ st.session_state.input_curve_button_clicked = True
+
+if 'material_design_button_clicked' not in st.session_state:
+ st.session_state.material_design_button_clicked= False
+def material_design_click():
+ st.session_state.material_design_button_clicked = True
+ # allow repeated attempts: each click increments run id
+ st.session_state.material_design_run_id = int(st.session_state.get("material_design_run_id", 0)) + 1
+
+if 'forming_input_button_clicked' not in st.session_state:
+ st.session_state.forming_input_button_clicked= False
+def forming_input_click():
+ st.session_state.forming_input_button_clicked = True
+
+if 'forming_design_button_clicked' not in st.session_state:
+ st.session_state.forming_design_button_clicked= False
+def forming_design_click():
+ st.session_state.forming_design_button_clicked = True
+
+
+
+#######################
+# Load data
+#df_reshaped = pd.read_csv('data/us-population-2010-2019-reshaped.csv')
+
+######## Initialize data #############
+E1aV=0 # initial longitudinal stiffness
+E1bV=0 # 10% strain longitudinal stiffness
+G12aV=0 # initial longitudinal stiffness
+G12bV=0 # 10% strain longitudinal stiffness
+nlayers=4
+vf=0.6
+angle=30
+
+#######################
+# Backend helpers (no UI changes)
+
+DEFAULT_CHECKPOINT_DIR = os.environ.get(
+ "MG_CHECKPOINT_DIR",
+ os.path.join(
+ ROOT_DIR,
+ "hybrid_diffusion_material_generation",
+ "checkpoints",
+ "config_1_continuous_100_epoch",
+ "exp_20260114_164540",
+ ),
+)
+DEFAULT_DATA_DIR = os.environ.get(
+ "MG_DATA_DIR",
+ os.path.join(ROOT_DIR, "data_generation", "processed_dataset", "config_1"),
+)
+DEFAULT_CURVE_DIR = os.environ.get(
+ "MG_CURVE_DIR",
+ os.path.join(ROOT_DIR, "data_generation", "shahriar_modified_2025_12", "RVE_Datasets"),
+)
+
+CHECKPOINT_DIR = DEFAULT_CHECKPOINT_DIR
+DATA_DIR = DEFAULT_DATA_DIR
+CURVE_DIR = DEFAULT_CURVE_DIR
+LAM_DIR = default_lam_dir()
+
+_device_env = (os.environ.get("MG_DEVICE") or "").strip().lower()
+if os.environ.get("MG_FORCE_CPU", "").strip() in {"1", "true", "yes"}:
+ DEVICE = "cpu"
+elif _device_env in {"cpu", "cuda"}:
+ DEVICE = _device_env
+else:
+ DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
+print(f"[mg-demo] torch={torch.__version__} cuda_available={torch.cuda.is_available()} device={DEVICE}")
+REMASK_PROB = 0.1
+NORMALIZATION_METHOD = os.environ.get("MG_NORMALIZATION_METHOD", "").strip().lower() or None
+
+MATERIAL_NAMES = ["CPP", "CHDPE", "GPP", "GHDPE"]
+N_INPUT_POINTS = int(os.environ.get("MG_INPUT_POINTS", "10"))
+
+
+def _seed_from_env() -> Optional[int]:
+ """
+ If MG_DEMO_SEED (or MG_SEED) is set, we use it to make results repeatable.
+ """
+ for k in ("MG_DEMO_SEED", "MG_SEED"):
+ v = os.environ.get(k)
+ if v is None or str(v).strip() == "":
+ continue
+ try:
+ return int(str(v).strip())
+ except Exception:
+ raise ValueError(f"{k} must be an integer, got: {v!r}")
+ return None
+
+
+def _get_demo_seed_if_match() -> Optional[int]:
+ """
+ If the current inputs match one of the demo cases, return its fixed seed.
+ """
+ def _matches(values: dict, tol: float = 1e-6) -> bool:
+ for key, expected in values.items():
+ actual = st.session_state.get(key, None)
+ if actual is None:
+ return False
+ if abs(float(actual) - float(expected)) > tol:
+ return False
+ return True
+
+ demo_cases = [
+ (
+ {
+ "E1a": 22500, "E1b": 22500, "S1b": 2250,
+ "E2a": 37500, "E2b": 37500, "S2b": 3750,
+ "G12a": 16000, "G12b": 16200, "S12b": 1610,
+ "v12a": 0.20, "v12b": 0.21,
+ "v21a": 0.40, "v21b": 0.41,
+ },
+ 547238375,
+ ),
+ (
+ {
+ "E1a": 7300, "E1b": -1000, "S1b": 150,
+ "E2a": 1400, "E2b": 10, "S2b": 58,
+ "G12a": 8000, "G12b": 4000, "S12b": 640,
+ "v12a": 0.80, "v12b": 7.50,
+ "v21a": 0.38, "v21b": 0.40,
+ },
+ 1520908510,
+ ),
+ (
+ {
+ "E1a": 5000, "E1b": 4000, "S1b": 480,
+ "E2a": 1400, "E2b": 400, "S2b": 103,
+ "G12a": 2600, "G12b": 1700, "S12b": 168,
+ "v12a": 0.55, "v12b": 1.20,
+ "v21a": 0.19, "v21b": 0.17,
+ },
+ 1288865411,
+ ),
+ ]
+
+ for values, seed in demo_cases:
+ if _matches(values):
+ return int(seed)
+ return None
+
+
+def _get_run_seed() -> tuple[int, str]:
+ """
+ Returns (seed, mode).
+ - demo: fixed seed from env (replicable)
+ - attempt: random seed each run
+ """
+ demo_seed = _get_demo_seed_if_match()
+ if demo_seed is not None:
+ return int(demo_seed), "demo"
+ fixed = _seed_from_env()
+ if fixed is not None:
+ return int(fixed), "demo"
+ return int(secrets.randbelow(2**31 - 1)), "attempt"
+
+
+def _apply_global_seed(seed: int) -> None:
+ seed = int(seed)
+ # Make results deterministic across CPU/GPU when possible.
+ os.environ.setdefault("CUBLAS_WORKSPACE_CONFIG", ":4096:8")
+ torch.use_deterministic_algorithms(True)
+ torch.backends.cudnn.deterministic = True
+ torch.backends.cudnn.benchmark = False
+ np.random.seed(seed)
+ torch.manual_seed(seed)
+ if torch.cuda.is_available():
+ torch.cuda.manual_seed_all(seed)
+
+
+def _apply_axes_padding(ax, x_min: float, x_max: float, y_min: float, y_max: float, pad_frac: float = 0.06):
+ """
+ Add a little space around data bounds so plots don't look clipped.
+ Never disables axes.
+ """
+ x_min = float(x_min)
+ x_max = float(x_max)
+ y_min = float(y_min)
+ y_max = float(y_max)
+
+ if not np.isfinite(x_min) or not np.isfinite(x_max) or x_max <= x_min:
+ return
+ if not np.isfinite(y_min) or not np.isfinite(y_max) or y_max <= y_min:
+ return
+
+ dx = (x_max - x_min) * float(pad_frac)
+ dy = (y_max - y_min) * float(pad_frac)
+ ax.set_xlim(x_min - dx, x_max + dx)
+ ax.set_ylim(y_min - dy, y_max + dy)
+
+
+def _apply_axes_padding_from_series(ax, xs: list[np.ndarray], ys: list[np.ndarray], pad_frac: float = 0.06):
+ x_all = np.concatenate([np.asarray(x, dtype=np.float32).reshape(-1) for x in xs if x is not None]) if xs else None
+ y_all = np.concatenate([np.asarray(y, dtype=np.float32).reshape(-1) for y in ys if y is not None]) if ys else None
+ if x_all is None or y_all is None or x_all.size == 0 or y_all.size == 0:
+ return
+ _apply_axes_padding(
+ ax,
+ float(np.min(x_all)),
+ float(np.max(x_all)),
+ float(np.min(y_all)),
+ float(np.max(y_all)),
+ pad_frac=pad_frac,
+ )
+
+
+def _poly_eval_no_intercept(coeffs_row: np.ndarray, x: np.ndarray) -> np.ndarray:
+ """
+ Evaluate no-intercept polynomial with coeffs in np.polyval order [x^d..x^1].
+ """
+ coeffs_with_zero = np.append(np.asarray(coeffs_row, dtype=np.float32), 0.0)
+ return np.polyval(coeffs_with_zero, np.asarray(x, dtype=np.float32))
+
+
+def _extract_json_value_prefix(text: str, key: str) -> str:
+ """
+ Extract the JSON value for a top-level key from a prefix of metadata.json.
+ Supports numbers and arrays.
+ """
+ key_pat = f"\"{key}\""
+ i = text.find(key_pat)
+ if i < 0:
+ raise KeyError(f"Key '{key}' not found in metadata prefix")
+ j = text.find(":", i)
+ if j < 0:
+ raise ValueError(f"Malformed JSON near key '{key}'")
+ k = j + 1
+ while k < len(text) and text[k] in " \t\r\n":
+ k += 1
+ if k >= len(text):
+ raise ValueError(f"Truncated JSON near key '{key}'")
+ if text[k] == "[":
+ # bracket matching
+ depth = 0
+ end = k
+ while end < len(text):
+ ch = text[end]
+ if ch == "[":
+ depth += 1
+ elif ch == "]":
+ depth -= 1
+ if depth == 0:
+ return text[k : end + 1]
+ end += 1
+ raise ValueError(f"Truncated array for key '{key}' (increase prefix read)")
+ # number/bool/string: read to comma/newline/}
+ end = k
+ while end < len(text) and text[end] not in ",\n\r}":
+ end += 1
+ return text[k:end].strip()
+
+
+@st.cache_resource(show_spinner=False)
+def _load_poly_metadata_small(data_dir: str) -> dict:
+ """
+ metadata.json in processed_dataset can be huge; we only need a few scalar/array fields.
+ We read a prefix and parse those fields only.
+ """
+ import json
+
+ meta_path = os.path.join(str(data_dir), "metadata.json")
+ if not os.path.exists(meta_path):
+ raise FileNotFoundError(f"metadata.json not found in {data_dir}")
+
+ # These keys live very early in the file (per grep): keep this small for Streamlit responsiveness.
+ keys = [
+ "coefficient_min",
+ "coefficient_max",
+ "coefficient_mean",
+ "coefficient_std",
+ "polynomial_degree",
+ "angle_min",
+ "angle_max",
+ ]
+
+ prefix_bytes = 256_000
+ with open(meta_path, "r") as f:
+ prefix = f.read(prefix_bytes)
+
+ out = {}
+ for k in keys:
+ raw = _extract_json_value_prefix(prefix, k)
+ # json.loads handles arrays and numeric scalars (including scientific notation)
+ out[k] = json.loads(raw)
+ return out
+
+
+@st.cache_resource(show_spinner=False)
+def _load_model_bundle_poly(checkpoint_dir: str, device: str):
+ """
+ Load polynomial-conditioned diffusion model from hybrid_diffusion_material_generation checkpoint dir.
+ Returns dict: model, diffusion processes, training_cfg.
+ """
+ import json
+
+ ckpt_dir = str(checkpoint_dir)
+ cfg_path = os.path.join(ckpt_dir, "training_config.json")
+ with open(cfg_path, "r") as f:
+ training_cfg = json.load(f)
+
+ use_discrete_angles = bool(training_cfg.get("use_discrete_angles", True))
+ model_cfg = ModelConfig(**training_cfg["model_config"])
+ mask_ids = dict(training_cfg.get("mask_ids", {}))
+
+ # Load checkpoint (prefer best_model.pt)
+ ckpt_path = os.path.join(ckpt_dir, "best_model.pt")
+ # PyTorch 2.6+ defaults weights_only=True, which can reject custom classes.
+ # We trust this checkpoint, so load with weights_only=False.
+ ckpt = torch.load(ckpt_path, map_location="cpu", weights_only=False)
+ state_dict = ckpt["model_state_dict"] if isinstance(ckpt, dict) and "model_state_dict" in ckpt else ckpt
+
+ # Discrete-angles only: determine n_angle_categories from metadata (not needed for continuous)
+ n_angle_categories = int(training_cfg.get("n_angle_categories", 7))
+
+ model = MaterialHybridDenoiser(
+ model_cfg,
+ mask_ids=mask_ids,
+ use_discrete_angles=use_discrete_angles,
+ n_angle_categories=n_angle_categories,
+ ).to(device)
+ model.load_state_dict(state_dict, strict=True)
+ model.eval()
+
+ T = int(training_cfg.get("T", 100))
+ beta_start = float(training_cfg.get("beta_start", 1e-4))
+ beta_end = float(training_cfg.get("beta_end", 2e-2))
+ betas = linear_beta_schedule(T, beta_start=beta_start, beta_end=beta_end, device=str(device))
+
+ disc_diff_mat = DiscreteMaskDiffusion(vocab_size=int(model_cfg.n_materials), mask_id=int(mask_ids["material"]), T=T, betas=betas)
+ disc_diff_vf = DiscreteMaskDiffusion(vocab_size=int(model_cfg.n_vf_categories), mask_id=int(mask_ids["vf_category"]), T=T, betas=betas)
+ disc_diff_layer = DiscreteMaskDiffusion(vocab_size=2, mask_id=int(mask_ids["layer"]), T=T, betas=betas)
+
+ if use_discrete_angles:
+ # Not expected for this checkpoint, but keep compatible.
+ # Vocab includes dead category, so +1.
+ disc_diff_angle = DiscreteMaskDiffusion(vocab_size=int(n_angle_categories + 1), mask_id=int(mask_ids["angle"]), T=T, betas=betas)
+ cont_diff = None
+ else:
+ disc_diff_angle = None
+ cont_diff = GaussianDiffusion(T=T, betas=betas)
+
+ return {
+ "training_cfg": training_cfg,
+ "model": model,
+ "disc_diff_mat": disc_diff_mat,
+ "disc_diff_vf": disc_diff_vf,
+ "disc_diff_layer": disc_diff_layer,
+ "disc_diff_angle": disc_diff_angle,
+ "cont_diff": cont_diff,
+ "mask_ids": mask_ids,
+ "use_discrete_angles": use_discrete_angles,
+ }
+
+
+def _polyfit_no_intercept(x: np.ndarray, y: np.ndarray, degree: int) -> np.ndarray:
+ """
+ Fit y ≈ sum_{k=1..degree} c_k * x^k (no intercept).
+ Returns coeffs in numpy.polyval order: [x^degree, ..., x^1] with length=degree.
+ """
+ x = np.asarray(x, dtype=np.float32).reshape(-1)
+ y = np.asarray(y, dtype=np.float32).reshape(-1)
+ if x.size < 4 or y.size != x.size:
+ raise ValueError("Not enough points for polynomial fit")
+ vander = np.vander(x, int(degree) + 1, increasing=False)[:, :-1] # drop constant
+ coeffs, *_ = np.linalg.lstsq(vander, y, rcond=None)
+ return coeffs.astype(np.float32)
+
+
+def _normalize_poly_coeffs(coeffs_5_by_deg: np.ndarray, metadata: dict, normalize_method: str) -> np.ndarray:
+ coeffs_flat = np.asarray(coeffs_5_by_deg, dtype=np.float32).flatten()
+ method = (normalize_method or "minmax").lower()
+ if method == "minmax":
+ mn = np.asarray(metadata["coefficient_min"], dtype=np.float32)
+ mx = np.asarray(metadata["coefficient_max"], dtype=np.float32)
+ rng = mx - mn
+ rng = np.where(rng == 0, 1.0, rng)
+ return ((coeffs_flat - mn) / rng).astype(np.float32)
+ if method == "zscore":
+ mu = np.asarray(metadata["coefficient_mean"], dtype=np.float32)
+ sd = np.asarray(metadata["coefficient_std"], dtype=np.float32)
+ sd = np.where(sd == 0, 1.0, sd)
+ return ((coeffs_flat - mu) / sd).astype(np.float32)
+ raise ValueError(f"Unknown normalization_method: {normalize_method}")
+
+
+def _mat_type_to_matrix_fiber(mat_type: str) -> tuple[str, str]:
+ """
+ Model emits: CPP / GPP / CHDPE / GHDPE.
+ We map:
+ - leading C/G -> Carbon / Glass fiber
+ - suffix PP/HDPE -> matrix
+ """
+ mt = (mat_type or "").upper().strip()
+ fiber = "Carbon" if mt.startswith("C") else ("Glass" if mt.startswith("G") else mt[:1])
+ matrix = "HDPE" if mt.endswith("HDPE") else ("PP" if mt.endswith("PP") else mt[1:])
+ return matrix, fiber
+
+
+def _run_inverse_design_from_required_curves() -> dict:
+ """
+ Uses curves cached in st.session_state (from 'Generate required stress-strain curves')
+ to run the diffusion generator and a single simulation instance.
+ Returns dict with predicted materials, vf, full_angles, and simulation curves.
+ """
+ if "required_curves" not in st.session_state:
+ raise RuntimeError("Required curves not found. Please click 'Generate required stress-strain curves' first.")
+
+ metadata = _load_poly_metadata_small(DATA_DIR)
+ bundle = _load_model_bundle_poly(CHECKPOINT_DIR, device=DEVICE)
+ training_cfg = bundle["training_cfg"]
+ degree = int(metadata.get("polynomial_degree", 3))
+ normalize_method = (NORMALIZATION_METHOD or training_cfg.get("normalization_method") or "minmax")
+
+ seed, seed_mode = _get_run_seed()
+ _apply_global_seed(seed)
+
+ curves = st.session_state.required_curves
+ coeffs_list = []
+ coeffs_list.append(_polyfit_no_intercept(curves["eps11"], curves["sig11_mpa"], degree))
+ coeffs_list.append(_polyfit_no_intercept(curves["eps11"], curves["eps22_from_eps11"], degree))
+ coeffs_list.append(_polyfit_no_intercept(curves["eps22"], curves["sig22_mpa"], degree))
+ coeffs_list.append(_polyfit_no_intercept(curves["eps22"], curves["eps11_from_eps22"], degree))
+ coeffs_list.append(_polyfit_no_intercept(curves["eps12"], curves["sig12_mpa"], degree))
+ cond_coeffs_5_by_deg = np.stack(coeffs_list, axis=0).astype(np.float32) # (5, degree)
+ cond_norm = _normalize_poly_coeffs(cond_coeffs_5_by_deg, metadata, normalize_method)
+
+ cond_t = torch.tensor(cond_norm, dtype=torch.float32, device=DEVICE).view(1, -1)
+ out = diffusion_sample(
+ model=bundle["model"],
+ disc_diff_mat=bundle["disc_diff_mat"],
+ disc_diff_vf_category=bundle["disc_diff_vf"],
+ disc_diff_layer=bundle["disc_diff_layer"],
+ disc_diff_angle=bundle["disc_diff_angle"],
+ cont_diff=bundle["cont_diff"],
+ cond=cond_t,
+ mask_ids=bundle["mask_ids"],
+ device=DEVICE,
+ remask_prob=float(REMASK_PROB),
+ use_discrete_angles=bundle["use_discrete_angles"],
+ )
+
+ # Decode generated design
+ mat_idx = int(out["material_t"].item())
+ mat_type = MATERIAL_NAMES[mat_idx] if 0 <= mat_idx < len(MATERIAL_NAMES) else f"MAT{mat_idx}"
+ vf_cat = int(out["vf_category_t"].item())
+ vf_pred = float(vf_category_to_volume_fraction(vf_cat))
+ # Use layer mask to select alive layers; handle both continuous and discrete angle outputs.
+ layer_t = out["layer_t"]
+ angle_t = out["angle_t"]
+ if layer_t is None or angle_t is None:
+ raise RuntimeError(
+ f"Diffusion sample returned None tensors: layer_t={layer_t}, angle_t={angle_t}"
+ )
+ if torch.is_tensor(layer_t):
+ layer_np = layer_t.detach().cpu().numpy()
+ else:
+ layer_np = np.asarray(layer_t)
+ if torch.is_tensor(angle_t):
+ angle_np = angle_t.detach().cpu().numpy()
+ else:
+ angle_np = np.asarray(angle_t)
+
+ if layer_np.ndim == 1:
+ layer_mask = layer_np.astype(np.int64)
+ else:
+ layer_mask = layer_np[0].astype(np.int64)
+
+ if angle_np.ndim == 3:
+ angle_vals = angle_np[0] # (L,1)
+ elif angle_np.ndim == 2:
+ angle_vals = angle_np[0].reshape(-1, 1) # (L,1)
+ if bundle["use_discrete_angles"]:
+ ang_min = float(metadata.get("angle_min", 0.0))
+ ang_max = float(metadata.get("angle_max", 90.0))
+ ang_res = float(metadata.get("angle_resolution", 1.0))
+ n_cats = int(round((ang_max - ang_min) / ang_res)) + 1
+ categories = np.linspace(ang_min, ang_max, n_cats, dtype=np.float32)
+ idx = np.clip(angle_vals.astype(np.int64).reshape(-1), 0, len(categories) - 1)
+ angle_vals = np.deg2rad(categories[idx]).reshape(-1, 1)
+ else:
+ raise RuntimeError(f"Unexpected angle_t shape: {angle_np.shape}")
+
+ min_len = min(len(layer_mask), angle_vals.shape[0])
+ layer_mask = layer_mask[:min_len]
+ angle_vals = angle_vals[:min_len]
+ alive_mask = layer_mask == 1
+ upper_angles = np.rad2deg(angle_vals[alive_mask, 0]).astype(np.float32).tolist()
+ # Clip angles to metadata range
+ ang_min = float(metadata.get("angle_min", 0.0))
+ ang_max = float(metadata.get("angle_max", 90.0))
+ upper_angles = [min(max(float(a), ang_min), ang_max) for a in upper_angles]
+
+ # Print run settings to server log for "attempt mode" record-keeping (no UI changes).
+ try:
+ run_id = int(st.session_state.get("material_design_run_id", 0))
+ except Exception:
+ run_id = 0
+ print(
+ "\n".join(
+ [
+ "=== Material Inverse Design run ===",
+ f"time: {time.strftime('%Y-%m-%d %H:%M:%S')}",
+ f"run_id: {run_id}",
+ f"seed_mode: {seed_mode}",
+ f"seed: {seed}",
+ f"checkpoint_dir: {CHECKPOINT_DIR}",
+ f"data_dir: {DATA_DIR}",
+ f"curve_dir: {CURVE_DIR}",
+ f"normalization_method: {normalize_method}",
+ f"poly_degree: {degree}",
+ f"pred_mat_type: {mat_type}",
+ f"pred_vf: {vf_pred:.6f}",
+ f"pred_upper_angles_deg: {sorted([float(a) for a in upper_angles])}",
+ ]
+ )
+ )
+
+ # Simulate 3 instances (as before)
+ sim_by_instance = simulate_instances(
+ curve_dir=CURVE_DIR,
+ lam_dir=LAM_DIR,
+ mat_type=mat_type,
+ vf=float(vf_pred),
+ upper_angles=upper_angles,
+ instances=[1, 2, 3],
+ # Match previous behavior: sparse sim points, then we plot polynomial fits (no connecting lines).
+ num_output_points=10,
+ )
+
+ matrix, fiber = _mat_type_to_matrix_fiber(mat_type)
+ upper_sorted = sorted([float(a) for a in upper_angles])
+ full_angles = upper_sorted + [-a for a in reversed(upper_sorted)]
+
+ return {
+ "seed": int(seed),
+ "seed_mode": str(seed_mode),
+ "run_id": int(run_id),
+ "mat_type": mat_type,
+ "matrix": matrix,
+ "fiber": fiber,
+ "vf": float(vf_pred),
+ "upper_angles": upper_angles,
+ "full_angles": full_angles,
+ "simulations_by_instance": sim_by_instance,
+ "degree": int(degree),
+ "cond_coeffs_5_by_deg": cond_coeffs_5_by_deg,
+ }
+
+#######################
+# Main Panel
+
+data_materials={
+ 'Matrix':['ABS','Polyurethane','Nylon 6','Nylon 6','Nylon 66','PE','PP'],
+ 'Filler':['Carbon Black','Glass Fiber','Glass Fiber','Carbon Fiber','Glass Fiber','Carbon Fiber','Glass Fiber'],
+ 'VF':['15%','20%','20%','40%','30%','20%','30%'],
+ 'Feature':['Blend','Extruded','Molded','Molded','Molded','Molded','Molded']
+ }
+
+data_physical = {
+ 'Forming T (C)': ['180', '185', '190'],
+ 'Punch V (m/s)': ['1.05', '1.8','1.67'],
+ 'Cooling time (s)': ['45','80','120'],
+ 'Holding force (kN)': ['23','24','25']
+ }
+
+st.title("Inverse Design of Thermoplastic Composites for Thermoforming")
+st.write("")
+st.write("")
+st.write("")
+st.write(r"$\textsf{\textbf{\Large Material Design Requirements}}$")
+#st.text_input(r"$\textsf{\textbf{\Large Material Design Requirements}}$")
+
+# First row with 5 columns
+col1_row1, col2_row1, col3_row1, col4_row1, col5_row1= st.columns([0.25,0.25,0.25,0.25,0.25])
+with col1_row1:
+ with st.container(border=False): # Container with a border
+ E1aV= st.number_input("Initial x-stiffness (MPa):", value=2000.00, format="%.2f", width=250, key="E1a", on_change=input_typed_in)
+ E1bV= st.number_input("10% strain x-stiffness (MPa):", value=1000.00, format="%.2f", width=250, key="E1b", on_change=input_typed_in)
+ S1bV= st.number_input("10% strain x-stress (MPa):", value=1000.00, format="%.2f", width=250, key="S1b", on_change=input_typed_in)
+
+with col2_row1:
+ with st.container(border=False): # Container with a border
+ E2aV= st.number_input("Initial y-stiffness (MPa):", value=2000.00, format="%.2f", width=250, key="E2a", on_change=input_typed_in)
+ E2bV= st.number_input("10% strain y-stiffness (MPa):", value=1000.00, format="%.2f", width=250, key="E2b", on_change=input_typed_in)
+ S2bV= st.number_input("10% strain y-stress (MPa):", value=1000.00, format="%.2f", width=250, key="S2b", on_change=input_typed_in)
+
+
+with col3_row1:
+ with st.container(border=False): # Container with a border
+ G12aV= st.number_input("Initial shear stiffness (MPa):", value=1800.00, format="%.2f", width=250, key="G12a", on_change=input_typed_in)
+ G12bV= st.number_input("0.1 shear strain stiffness (MPa):", value=1000.00, format="%.2f", width=250, key="G12b", on_change=input_typed_in)
+ S12bV= st.number_input("10% strain shear stress (MPa):", value=1000.00, format="%.2f", width=250, key="S12b", on_change=input_typed_in)
+
+with col4_row1:
+ with st.container(border=False): # Container with a border
+ v12aV= st.number_input("Initial Poisson's ratio (vxy):", value=0.3, format="%.2f", width=250, key="v12a", on_change=input_typed_in)
+ v12bV= st.number_input("0.1 strain Poisson's ratio (vxy):", value=0.4, format="%.2f", width=250, key="v12b", on_change=input_typed_in)
+
+
+with col5_row1:
+ with st.container(border=False): # Container with a border
+ v21aV= st.number_input("Initial Poisson's ratio (vyx):", value=0.3, format="%.2f", width=250, key="v21a", on_change=input_typed_in)
+ v21bV= st.number_input("0.1 strain Poisson's ratio (vyx):", value=0.4, format="%.2f", width=250, key="v21b", on_change=input_typed_in)
+
+
+
+st.write("")
+if st.session_state.input_changed == True:
+ st.session_state.input_curve_button_clicked = False
+ st.session_state.material_design_button_clicked = False
+ st.session_state.forming_input_button_clicked = False
+ st.session_state.forming_design_button_clicked = False
+ # Invalidate cached downstream artifacts when inputs change
+ if "required_curves" in st.session_state:
+ del st.session_state["required_curves"]
+ if "inverse_design_result" in st.session_state:
+ del st.session_state["inverse_design_result"]
+ if "material_design_last_run_id" in st.session_state:
+ del st.session_state["material_design_last_run_id"]
+ st.session_state.input_changed = False
+
+st.button("Generate required stress-strain curves", use_container_width=True, on_click=input_curve_click)
+
+if st.session_state.input_curve_button_clicked == True:
+ #st.write(E1aV)
+ #st.write(E1bV)
+ n_pts = int(max(4, N_INPUT_POINTS))
+ x = np.linspace(0, 0.1, n_pts)
+ A = np.array([[0.2, 0.03], [0.01, 0.001]])
+ b = np.array([E1bV-E1aV, S1bV-E1aV*0.1])
+ a = np.linalg.solve(A, b)
+ y1= E1aV*x + a[0]*x**2 + a[1]*x**3
+ b = np.array([E2bV-E2aV, S2bV-E2aV*0.1])
+ a = np.linalg.solve(A, b)
+ y2= E2aV*x + a[0]*x**2 + a[1]*x**3
+ b = np.array([G12bV-G12aV, S12bV-G12aV*0.1])
+ a = np.linalg.solve(A, b)
+ y3= G12aV*x + a[0]*x**2 + a[1]*x**3
+
+ y4 = v12aV*x + (v12bV - v12aV)/0.2*x*x
+ y5 = v21aV*x + (v21bV - v21aV)/0.2*x*x
+
+ # Cache required curves for inverse design (model conditioning)
+ st.session_state.required_curves = {
+ "eps11": x.astype(np.float32),
+ "sig11_mpa": y1.astype(np.float32),
+ "eps22": x.astype(np.float32),
+ "sig22_mpa": y2.astype(np.float32),
+ "eps12": x.astype(np.float32),
+ "sig12_mpa": y3.astype(np.float32),
+ "eps22_from_eps11": (-y4).astype(np.float32),
+ "eps11_from_eps22": (-y5).astype(np.float32),
+ }
+ # New curves -> invalidate any previous inverse-design result
+ if "inverse_design_result" in st.session_state:
+ del st.session_state["inverse_design_result"]
+
+
+ #ylimit=np.max([np.max(y1),np.max(y2), np.max(y3)])
+ # 2nd row with 3 columns
+ col1_row2, col2_row2, col3_row2, col4_row2, col5_row2= st.columns([0.2,0.2,0.2,0.2,0.2])
+ with col1_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, y1)
+ #ax.set_ylim([0, ylimit])
+ ax.set_ylabel('Stress (MPa)')
+ ax.set_xlabel('Strain')
+ ax.set_title('Longitudinal stress-strain (xx)')
+ st.pyplot(fig)
+ with col2_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, y2)
+ #ax.set_ylim([0, ylimit])
+ ax.set_ylabel('Stress (MPa)')
+ ax.set_xlabel('Strain')
+ ax.set_title('Transverse stress-strain (yy)')
+ st.pyplot(fig)
+ with col3_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, y3)
+ #ax.set_ylim([0, ylimit])
+ ax.set_ylabel('Stress (MPa)')
+ ax.set_xlabel('Strain')
+ ax.set_title('Shear stress-strain (xy')
+ st.pyplot(fig)
+ with col4_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, -y4)
+ #ax.set_ylim([-0.05, 0])
+ ax.set_xlabel('Strain xx')
+ ax.set_ylabel('Strain yy')
+ ax.set_title('Strain ratio with stress xx')
+ st.pyplot(fig)
+ with col5_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, -y5)
+ #ax.set_ylim([-0.05, 0])
+ ax.set_xlabel('Strain yy')
+ ax.set_ylabel('Strain xx')
+ ax.set_title('Strain ratio with stress yy')
+ st.pyplot(fig)
+
+ st.write("")
+ st.button("Material Inverse Design", use_container_width=True, on_click=material_design_click)
+ if st.session_state.material_design_button_clicked == True:
+ # Run model + simulation once per click (attempt mode supports repeated runs)
+ current_run_id = int(st.session_state.get("material_design_run_id", 0))
+ last_run_id = int(st.session_state.get("material_design_last_run_id", -1))
+ if ("inverse_design_result" not in st.session_state) or (current_run_id != last_run_id):
+ with st.spinner("Running inverse design model + simulation..."):
+ st.session_state.inverse_design_result = _run_inverse_design_from_required_curves()
+ st.session_state.material_design_last_run_id = current_run_id
+ res = st.session_state.inverse_design_result
+
+ # 3rd row with 3 columns
+ col1_row3, col2_row3, col3_row3, col4_row3, col5_row3= st.columns([0.15,0.15,0.23,0.23,0.23])
+ with col1_row3:
+ with st.container(border=False): # Container with a border
+ st.write("Matrix material = ", res["matrix"])
+ st.write("Fiber material = ", res["fiber"])
+
+ with col2_row3:
+ with st.container(border=False): # Container with a border
+ st.write("Number of layers =", int(len(res["full_angles"])))
+ st.write("Volume fraction =", f"{float(res['vf']):.3f}")
+
+ with col3_row3:
+ with st.container(border=False): # Container with a border
+ df = pd.DataFrame({'Ply': [], 'Orientation': []})
+ plies = np.array([[i + 1, float(a)] for i, a in enumerate(res["full_angles"])], dtype=object)
+ plies_df=pd.DataFrame(plies, columns=df.columns)
+ df = pd.concat([df, plies_df], ignore_index=True)
+ st.dataframe(df, hide_index=True)
+
+
+ # 3.5rd row with 3 columns
+ col1_row35, col2_row35, col3_row35, col4_row35, col5_row35= st.columns([0.2,0.2,0.2,0.2,0.2])
+
+ # Plot condition + simulations overlays in required order (left -> right)
+ # - Condition: show sampled points + polynomial fit (black)
+ # - Simulations: show simulation points (no connecting lines) + polynomial fit for each instance
+ sims_by_inst = res["simulations_by_instance"]
+ cond = st.session_state.get("required_curves", None)
+ colors = ["C0", "C1", "C2", "C3", "C4"]
+ degree = int(res.get("degree", 3))
+ cond_coeffs = res.get("cond_coeffs_5_by_deg", None)
+ x_fit = np.linspace(0.0, 0.1, 200, dtype=np.float32)
+ fig1, ax1 = plt.subplots()
+ if cond is not None:
+ ax1.scatter(cond["eps11"], cond["sig11_mpa"], color="k", s=18, alpha=0.7, label="Cond samples")
+ if cond_coeffs is not None:
+ ax1.plot(x_fit, _poly_eval_no_intercept(cond_coeffs[0], x_fit), color="k", linewidth=2, label="Cond fit")
+ for idx, inst in enumerate(sorted(sims_by_inst.keys())):
+ sim = sims_by_inst[inst]["11"]
+ ax1.scatter(sim["strain"], sim["stress"], color=colors[idx % len(colors)], s=22, alpha=0.85, label=f"Sim inst{inst}")
+ try:
+ c = _polyfit_no_intercept(sim["strain"], sim["stress"], degree)
+ ax1.plot(x_fit, _poly_eval_no_intercept(c, x_fit), color=colors[idx % len(colors)], linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+ ax1.set_xlabel("eps_11")
+ ax1.set_ylabel("sig_11 (MPa)")
+ ax1.set_title("sig_11 vs eps_11")
+ ax1.grid(True, alpha=0.25)
+ ax1.legend(fontsize=11, loc="best")
+ _apply_axes_padding_from_series(
+ ax1,
+ [cond["eps11"]] + [sims_by_inst[i]["11"]["strain"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["11"]["strain"] for i in sorted(sims_by_inst.keys())],
+ [cond["sig11_mpa"]] + [sims_by_inst[i]["11"]["stress"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["11"]["stress"] for i in sorted(sims_by_inst.keys())],
+ pad_frac=0.05,
+ )
+
+ fig2, ax2 = plt.subplots()
+ if cond is not None:
+ ax2.scatter(cond["eps22"], cond["sig22_mpa"], color="k", s=18, alpha=0.7, label="Cond samples")
+ if cond_coeffs is not None:
+ ax2.plot(x_fit, _poly_eval_no_intercept(cond_coeffs[2], x_fit), color="k", linewidth=2, label="Cond fit")
+ for idx, inst in enumerate(sorted(sims_by_inst.keys())):
+ sim = sims_by_inst[inst]["22"]
+ ax2.scatter(sim["strain"], sim["stress"], color=colors[idx % len(colors)], s=22, alpha=0.85, label=f"Sim inst{inst}")
+ try:
+ c = _polyfit_no_intercept(sim["strain"], sim["stress"], degree)
+ ax2.plot(x_fit, _poly_eval_no_intercept(c, x_fit), color=colors[idx % len(colors)], linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+ ax2.set_xlabel("eps_22")
+ ax2.set_ylabel("sig_22 (MPa)")
+ ax2.set_title("sig_22 vs eps_22")
+ ax2.grid(True, alpha=0.25)
+ ax2.legend(fontsize=11, loc="best")
+ _apply_axes_padding_from_series(
+ ax2,
+ [cond["eps22"]] + [sims_by_inst[i]["22"]["strain"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["22"]["strain"] for i in sorted(sims_by_inst.keys())],
+ [cond["sig22_mpa"]] + [sims_by_inst[i]["22"]["stress"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["22"]["stress"] for i in sorted(sims_by_inst.keys())],
+ pad_frac=0.05,
+ )
+
+ fig3, ax3 = plt.subplots()
+ if cond is not None:
+ ax3.scatter(cond["eps12"], cond["sig12_mpa"], color="k", s=18, alpha=0.7, label="Cond samples")
+ if cond_coeffs is not None:
+ ax3.plot(x_fit, _poly_eval_no_intercept(cond_coeffs[4], x_fit), color="k", linewidth=2, label="Cond fit")
+ for idx, inst in enumerate(sorted(sims_by_inst.keys())):
+ sim = sims_by_inst[inst]["12"]
+ ax3.scatter(sim["strain"], sim["stress"], color=colors[idx % len(colors)], s=22, alpha=0.85, label=f"Sim inst{inst}")
+ try:
+ c = _polyfit_no_intercept(sim["strain"], sim["stress"], degree)
+ ax3.plot(x_fit, _poly_eval_no_intercept(c, x_fit), color=colors[idx % len(colors)], linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+ ax3.set_xlabel("eps_12")
+ ax3.set_ylabel("sig_12 (MPa)")
+ ax3.set_title("sig_12 vs eps_12")
+ ax3.grid(True, alpha=0.25)
+ ax3.legend(fontsize=11, loc="best")
+ _apply_axes_padding_from_series(
+ ax3,
+ [cond["eps12"]] + [sims_by_inst[i]["12"]["strain"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["12"]["strain"] for i in sorted(sims_by_inst.keys())],
+ [cond["sig12_mpa"]] + [sims_by_inst[i]["12"]["stress"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["12"]["stress"] for i in sorted(sims_by_inst.keys())],
+ pad_frac=0.05,
+ )
+
+ fig4, ax4 = plt.subplots()
+ if cond is not None:
+ ax4.scatter(cond["eps11"], cond["eps22_from_eps11"], color="k", s=18, alpha=0.7, label="Cond samples")
+ if cond_coeffs is not None:
+ ax4.plot(x_fit, _poly_eval_no_intercept(cond_coeffs[1], x_fit), color="k", linewidth=2, label="Cond fit")
+ for idx, inst in enumerate(sorted(sims_by_inst.keys())):
+ sim = sims_by_inst[inst]["11"]
+ ax4.scatter(sim["strain"], sim["lateral"], color=colors[idx % len(colors)], s=22, alpha=0.85, label=f"Sim inst{inst}")
+ try:
+ c = _polyfit_no_intercept(sim["strain"], sim["lateral"], degree)
+ ax4.plot(x_fit, _poly_eval_no_intercept(c, x_fit), color=colors[idx % len(colors)], linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+ ax4.set_xlabel("eps_11")
+ ax4.set_ylabel("eps_22")
+ ax4.set_title("eps_22 vs eps_11")
+ ax4.grid(True, alpha=0.25)
+ ax4.legend(fontsize=11, loc="best")
+ _apply_axes_padding_from_series(
+ ax4,
+ [cond["eps11"]] + [sims_by_inst[i]["11"]["strain"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["11"]["strain"] for i in sorted(sims_by_inst.keys())],
+ [cond["eps22_from_eps11"]] + [sims_by_inst[i]["11"]["lateral"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["11"]["lateral"] for i in sorted(sims_by_inst.keys())],
+ pad_frac=0.06,
+ )
+
+ fig5, ax5 = plt.subplots()
+ if cond is not None:
+ ax5.scatter(cond["eps22"], cond["eps11_from_eps22"], color="k", s=18, alpha=0.7, label="Cond samples")
+ if cond_coeffs is not None:
+ ax5.plot(x_fit, _poly_eval_no_intercept(cond_coeffs[3], x_fit), color="k", linewidth=2, label="Cond fit")
+ for idx, inst in enumerate(sorted(sims_by_inst.keys())):
+ sim = sims_by_inst[inst]["22"]
+ ax5.scatter(sim["strain"], sim["lateral"], color=colors[idx % len(colors)], s=22, alpha=0.85, label=f"Sim inst{inst}")
+ try:
+ c = _polyfit_no_intercept(sim["strain"], sim["lateral"], degree)
+ ax5.plot(x_fit, _poly_eval_no_intercept(c, x_fit), color=colors[idx % len(colors)], linewidth=2, alpha=0.9, label="_nolegend_")
+ except Exception:
+ pass
+ ax5.set_xlabel("eps_22")
+ ax5.set_ylabel("eps_11")
+ ax5.set_title("eps_11 vs eps_22")
+ ax5.grid(True, alpha=0.25)
+ ax5.legend(fontsize=11, loc="best")
+ _apply_axes_padding_from_series(
+ ax5,
+ [cond["eps22"]] + [sims_by_inst[i]["22"]["strain"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["22"]["strain"] for i in sorted(sims_by_inst.keys())],
+ [cond["eps11_from_eps22"]] + [sims_by_inst[i]["22"]["lateral"] for i in sorted(sims_by_inst.keys())] if cond is not None else [sims_by_inst[i]["22"]["lateral"] for i in sorted(sims_by_inst.keys())],
+ pad_frac=0.06,
+ )
+
+ with col1_row35:
+ with st.container(border=False): # Container with a border
+ st.pyplot(fig1)
+
+ with col2_row35:
+ with st.container(border=False): # Container with a border
+ st.pyplot(fig2)
+
+ with col3_row35:
+ with st.container(border=False): # Container with a border
+ st.pyplot(fig3)
+
+ with col4_row35:
+ with st.container(border=False): # Container with a border
+ st.pyplot(fig4)
+
+
+ with col5_row35:
+ with st.container(border=False): # Container with a border
+ st.pyplot(fig5)
+
+
+ st.write("")
+ st.button("Thermoforming Requirements", use_container_width=True, on_click=forming_input_click)
+ if st.session_state.forming_input_button_clicked == True:
+ #st.write("")
+ # 4th row with 3 columns
+ col1_row4, col2_row4, col3_row4, col4_row4, col5_row4 = st.columns([0.16,0.16,0.2,0.24,0.24])
+ with col1_row4:
+ with st.container(border=False): # Container with a border
+ st.write("Matrix material", "PEEK")
+ st.write("Fiber material=", "Carbon")
+ st.write("Number of layers=", nlayers)
+ st.write("Volume fraction=", vf)
+ with col2_row4:
+ with st.container(border=False): # Container with a border
+ df = pd.DataFrame({'Ply': [], 'Orientation': []})
+ plies = np.array([[1,90], [2,45], [3,-45], [4,-90]])
+ plies_df=pd.DataFrame(plies, columns=df.columns)
+ df = pd.concat([df, plies_df], ignore_index=True)
+ st.dataframe(df, hide_index=True)
+
+ with col3_row4:
+ with st.container(border=False): # Container with a border
+ image = Image.open(os.path.join(APP_DIR, "figures", "forming_angle.png"))
+ new_image = image.resize((250, 200))
+ st.image(new_image, caption='')
+
+ with col4_row4:
+ with st.container(border=False): # Container with a border
+ angleA= st.number_input("Maximum warpage angle A (degree):", format="%.2f", width=300, key="A", on_change=forming_typed_in)
+ angleB= st.number_input("Maximum warpage angle B (degree):", format="%.2f", width=300, key="B", on_change=forming_typed_in)
+
+
+ with col5_row4:
+ with st.container(border=False): # Container with a border
+ angleC= st.number_input("Maximum warpage angle C (degree):", format="%.2f", width=300, key="C", on_change=forming_typed_in)
+ max_stress= st.number_input("Maximum residual stress (MPa):", format="%.2f", width=300, key="max_stress", on_change=forming_typed_in)
+
+
+ st.write("")
+ if st.session_state.forming_input_changed == True:
+ st.session_state.forming_design_button_clicked = False
+ st.session_state.forming_input_changed = False
+ st.button("Thermoforming process design", use_container_width=True, on_click=forming_design_click)
+ if st.session_state.forming_design_button_clicked == True:
+ best = inverse_design(ply_number=nlayers,
+ fiber_vf=vf,
+ y_target=[angleA, angleB, angleC, max_stress],
+ n_restarts=5,
+ epochs=100)
+ # 5th row with 3 columns
+ col1_row5, col2_row5,col3_row5 = st.columns([0.25,0.25,0.25])
+ with col1_row5:
+ with st.container(border=False): # Container with a border
+ st.write("Forming temperature (C)=", best["input"][0])
+ with col2_row5:
+ with st.container(border=False): # Container with a border
+ st.write("Punching velocity (mm/s)=", best["input"][1])
+ with col3_row5:
+ with st.container(border=False): # Container with a border
+ st.write("Cooling time (s)=", best["input"][2])
+
+
+
+
+
+
+
diff --git a/inverse_design_demo/figures/a.txt b/inverse_design_demo/figures/a.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b55c7b9b1b03994a24e780f240a7c604c23cc902
--- /dev/null
+++ b/inverse_design_demo/figures/a.txt
@@ -0,0 +1 @@
+dede
\ No newline at end of file
diff --git a/inverse_design_demo/figures/forming_angle.png b/inverse_design_demo/figures/forming_angle.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d4f3ed588a527accf063031c1cf4bf9b95a4c09
--- /dev/null
+++ b/inverse_design_demo/figures/forming_angle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc9ebe02d592189681889baf8ff15b12b12f680e47ab8073ed5b796247d20313
+size 139480
diff --git a/inverse_design_demo/figures/material_res3.png b/inverse_design_demo/figures/material_res3.png
new file mode 100644
index 0000000000000000000000000000000000000000..5cb1b50d93c8e7d7e18fb93a863f269a1c87df70
--- /dev/null
+++ b/inverse_design_demo/figures/material_res3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:435bec3f74968e08715052c0ffe28afab314258bdcb12b839542e014675c1cbe
+size 102163
diff --git a/inverse_design_demo/main_thermo.py b/inverse_design_demo/main_thermo.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e1eb78632711a2b7526aa4de595131c9fe8acf1
--- /dev/null
+++ b/inverse_design_demo/main_thermo.py
@@ -0,0 +1,176 @@
+import torch
+import numpy as np
+import matplotlib.pyplot as plt
+from Dataset import Dataset
+from model import NeuralNetwork
+
+DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
+# Set global plotting parameters
+plt.rcParams.update({'font.size': 14,
+ 'figure.figsize': (10, 8),
+ 'lines.linewidth': 2,
+ 'lines.markersize': 6,
+ 'axes.grid': True,
+ 'axes.labelsize': 16,
+ 'legend.fontsize': 14,
+ 'xtick.labelsize': 14,
+ 'ytick.labelsize': 14,
+ 'figure.autolayout': True
+ })
+
+def set_seed(seed=42):
+ np.random.seed(seed)
+ torch.manual_seed(seed)
+ if torch.cuda.is_available():
+ torch.cuda.manual_seed_all(seed)
+
+def train_neural_network(model, inputs, outputs, optimizer, epochs=1000, lr_scheduler=None):
+ model.train()
+ for epoch in range(epochs):
+ optimizer.zero_grad()
+ predictions = model(inputs)
+ loss = torch.mean(torch.square(predictions - outputs))
+ loss.backward()
+ optimizer.step()
+
+ if lr_scheduler:
+ lr_scheduler.step()
+
+ if epoch % 100 == 0:
+ print(f'Epoch {epoch}, Loss: {loss.item()}, Learning Rate: {optimizer.param_groups[0]["lr"]}')
+
+def main():
+ set_seed(5324)
+ dataset = Dataset()
+ inputs = dataset.get_input(normalize=True)
+ outputs = dataset.get_output(normalize=True)
+
+ idx_train = np.random.choice(len(inputs), size=int(0.98 * len(inputs)), replace=False)
+ idx_test = np.setdiff1d(np.arange(len(inputs)), idx_train)
+
+ inputs_train = torch.tensor(inputs[idx_train], dtype=torch.float32).to(DEVICE)
+ outputs_train = torch.tensor(outputs[idx_train], dtype=torch.float32).to(DEVICE)
+
+ inputs_test = torch.tensor(inputs[idx_test], dtype=torch.float32).to(DEVICE)
+ outputs_test = torch.tensor(outputs[idx_test], dtype=torch.float32).to(DEVICE)
+
+ layer_sizes = [inputs.shape[1]] + [64] * 4 + [outputs.shape[1]]
+ dropout_rate = 0.00
+ model = NeuralNetwork(layer_sizes, dropout_rate=dropout_rate, activation=torch.nn.ReLU).to(DEVICE)
+ optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
+ lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5000, gamma=0.9)
+
+ # Create a proper dataset that keeps input-output pairs together
+ train_dataset = torch.utils.data.TensorDataset(inputs_train, outputs_train)
+ train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True)
+
+ # Train the model
+ epochs = 20000
+ for epoch in range(epochs):
+ model.train()
+ for inputs_batch, outputs_batch in train_loader:
+ inputs_batch = inputs_batch.to(DEVICE)
+ outputs_batch = outputs_batch.to(DEVICE)
+ optimizer.zero_grad()
+ predictions = model(inputs_batch)
+ loss = torch.mean(torch.square(predictions - outputs_batch))
+ loss.backward()
+ optimizer.step()
+
+ if lr_scheduler:
+ lr_scheduler.step()
+
+ if epoch % 500 == 0:
+ train_pred = model(inputs_train)
+ train_loss = torch.mean(torch.square(train_pred - outputs_train))
+ test_pred = model(inputs_test)
+ test_loss = torch.mean(torch.square(test_pred - outputs_test))
+ print(f'Epoch {epoch}, Train Loss: {train_loss.item():.6f}, Test Loss: {test_loss.item():.6f}')
+ # print(f'Learning Rate: {optimizer.param_groups[0]["lr"]}')
+
+
+ predictions = model.predict(inputs_test)
+ test_loss = torch.mean(torch.square(predictions - outputs_test))
+ print(f'Test Loss: {test_loss.item()}. Samples: {idx_test}')
+
+ x = np.arange(0, len(idx_test))
+
+ outputs_test = dataset.denormalize_output(outputs_test.cpu().numpy())
+ predictions = dataset.denormalize_output(predictions.cpu().numpy())
+ # for sample in outputs_test:
+ # print(f'Test samples: {sample}')
+ plt.figure(figsize=(10, 6))
+ plt.plot(x, outputs_test[:, 0], color='b', linestyle='--', label='True A1')
+ plt.plot(x, predictions[:, 0], color='b', linestyle='-', label='Predicted A1')
+ plt.plot(x, outputs_test[:, 1], color='r', linestyle='--', label='True B1')
+ plt.plot(x, predictions[:, 1], color='r', linestyle='-', label='Predicted B1')
+ plt.plot(x, outputs_test[:, 2], color='g', linestyle='--', label='True C1')
+ plt.plot(x, predictions[:, 2], color='g', linestyle='-', label='Predicted C1')
+ plt.gca().xaxis.set_major_locator(plt.MaxNLocator(integer=True))
+ plt.xlabel('Sample Index')
+ plt.xticks(ticks=range(len(idx_test)),labels=idx_test + 1)
+ plt.ylabel('Springback Angle (Degrees)')
+ plt.title('Springback Angle Prediction')
+ plt.legend(loc='upper right')
+ plt.savefig('springback_angle_prediction.png')
+
+
+ plt.figure(figsize=(10, 6))
+ plt.plot(x, outputs_test[:, 3], color='m', linestyle='--', label='True Stress(Max)')
+ plt.plot(x, predictions[:, 3], color='m', linestyle='-', label='Predicted Stress(Max)')
+ plt.xlabel('Sample Index')
+ plt.xticks(ticks=range(len(idx_test)),labels=idx_test + 1)
+ plt.ylabel('Stress (MPa)')
+ plt.legend(loc='upper left')
+ plt.savefig('stress_max_prediction.png')
+
+
+
+ # MSE
+ mse = np.mean((predictions - outputs_test) ** 2, axis=0)
+ print(f'Mean Squared Error for A1: {mse[0]:.6f}, B1: {mse[1]:.6f}, C1: {mse[2]:.6f}, Stress(Max): {mse[3]:.6f}')
+
+ # R 2 score
+ ss_ress = np.sum((outputs_test - predictions) ** 2, axis=0)
+ ss_tots = np.sum((outputs_test - np.mean(outputs_test, axis=0)) ** 2, axis=0)
+ r2_scores = 1 - ss_ress / ss_tots
+ print(f'R² Score for A1: {r2_scores[0]:.6f}, B1: {r2_scores[1]:.6f}, C1: {r2_scores[2]:.6f}, Stress(Max): {r2_scores[3]:.6f}')
+
+ # Error
+
+ # Save the model
+ model_save_path = './model_checkpoint.pth'
+ model_config = {'layer_sizes': layer_sizes,
+ 'dropout_rate': dropout_rate
+ }
+ checkpoint = {
+ 'model_state_dict': model.state_dict(),
+ 'model_config': model_config
+ }
+ torch.save(checkpoint, model_save_path)
+ # Load the model
+ # model = NeuralNetwork(layer_sizes)
+ # model.load_state_dict(torch.load(model_save_path))
+
+def load_model(model_path):
+ checkpoint = torch.load(model_path)
+ model_config = checkpoint['model_config']
+ model = NeuralNetwork(model_config['layer_sizes'], dropout_rate=model_config['dropout_rate'], activation=torch.nn.ReLU).to(DEVICE)
+ model.load_state_dict(checkpoint['model_state_dict'])
+ print(f"Model loaded from {model_path}")
+ return model
+
+
+if __name__ == "__main__":
+ main()
+
+ # model = load_model('./model_checkpoint.pth').to(torch.device('cpu'))
+ # data = Dataset()
+ # data = Dataset()
+ # print(np.unique(data.df['Fiber_Volume_Fractions'].to_numpy())[:10])
+
+ # test_input = torch.tensor([[2, 0.6, 450.0, 100.0, 500.0]], dtype=torch.float32)
+ # test_output = model.predict((test_input - torch.tensor(data.input_mean)) / torch.tensor(data.input_std))
+ # test_output = test_output * torch.tensor(data.output_std) + torch.tensor(data.output_mean)
+ # print(f"Test Prediction for fixed input {test_input.numpy()}: {test_output.numpy()}")
+
diff --git a/inverse_design_demo/material_res3.png b/inverse_design_demo/material_res3.png
new file mode 100644
index 0000000000000000000000000000000000000000..5cb1b50d93c8e7d7e18fb93a863f269a1c87df70
--- /dev/null
+++ b/inverse_design_demo/material_res3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:435bec3f74968e08715052c0ffe28afab314258bdcb12b839542e014675c1cbe
+size 102163
diff --git a/inverse_design_demo/model.py b/inverse_design_demo/model.py
new file mode 100644
index 0000000000000000000000000000000000000000..973461bf4aea741da0ef01191f2753492279c478
--- /dev/null
+++ b/inverse_design_demo/model.py
@@ -0,0 +1,39 @@
+import torch
+
+
+class NeuralNetwork(torch.nn.Module):
+ def __init__(self, layer_sizes, dropout_rate=0.0, activation=torch.nn.ReLU):
+ super(NeuralNetwork, self).__init__()
+
+ if dropout_rate > 0:
+ self.dropout_layer = torch.nn.Dropout(dropout_rate)
+
+ self.layer_sizes = layer_sizes
+ self.layers = torch.nn.ModuleList()
+ for i in range(len(layer_sizes) - 2):
+ self.layers.append(torch.nn.Linear(layer_sizes[i], layer_sizes[i + 1]))
+ self.layers.append(activation())
+ self.layers.append(torch.nn.Linear(layer_sizes[-2], layer_sizes[-1]))
+
+ # self.sequential = torch.nn.Sequential(*self.layers)
+
+ self.init_weights()
+
+ def init_weights(self):
+ for layer in self.layers:
+ if isinstance(layer, torch.nn.Linear):
+ torch.nn.init.xavier_normal_(layer.weight)
+ layer.bias.data.fill_(0.0)
+
+ def forward(self, x, train=True):
+ for layer in self.layers:
+ x = layer(x)
+ if train and hasattr(self, 'dropout_layer'):
+ x = self.dropout_layer(x)
+
+ return x
+
+ def predict(self, x, train=False):
+ self.eval()
+ with torch.no_grad():
+ return self.forward(x, train)
diff --git a/inverse_design_demo/model_checkpoint.pth b/inverse_design_demo/model_checkpoint.pth
new file mode 100644
index 0000000000000000000000000000000000000000..d63586933c53d2b2a451cbc65f47d5e864e721fa
--- /dev/null
+++ b/inverse_design_demo/model_checkpoint.pth
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6170b3c02cd10a5db53184cfc0438ce279fe87ed4ffd4e7cf5a31a3945391326
+size 57109
diff --git a/inverse_design_demo/model_inverse.py b/inverse_design_demo/model_inverse.py
new file mode 100644
index 0000000000000000000000000000000000000000..aeb6b92f4ce9af7416cbed2e28431dca4c9d1c8d
--- /dev/null
+++ b/inverse_design_demo/model_inverse.py
@@ -0,0 +1,267 @@
+import torch
+import numpy as np
+import matplotlib.pyplot as plt
+from Dataset import Dataset
+
+# DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
+DEVICE = torch.device('cpu')
+
+# Set global plotting parameters
+plt.rcParams.update({'font.size': 14,
+ 'figure.figsize': (10, 8),
+ 'lines.linewidth': 2,
+ 'lines.markersize': 6,
+ 'axes.grid': True,
+ 'axes.labelsize': 16,
+ 'legend.fontsize': 14,
+ 'xtick.labelsize': 14,
+ 'ytick.labelsize': 14,
+ 'figure.autolayout': True
+ })
+
+def set_seed(seed=42):
+ np.random.seed(seed)
+ torch.manual_seed(seed)
+ if torch.cuda.is_available():
+ torch.cuda.manual_seed_all(seed)
+
+class NeuralNetwork(torch.nn.Module):
+ def __init__(self, layer_sizes, dropout_rate=0.0, activation=torch.nn.ReLU):
+ super(NeuralNetwork, self).__init__()
+
+ if dropout_rate > 0:
+ self.dropout_layer = torch.nn.Dropout(dropout_rate)
+
+ self.layer_sizes = layer_sizes
+ self.layers = torch.nn.ModuleList()
+ for i in range(len(layer_sizes) - 2):
+ self.layers.append(torch.nn.Linear(layer_sizes[i], layer_sizes[i + 1]))
+ self.layers.append(activation())
+ self.layers.append(torch.nn.Linear(layer_sizes[-2], layer_sizes[-1]))
+
+ # self.sequential = torch.nn.Sequential(*self.layers)
+
+ self.init_weights()
+
+ def init_weights(self):
+ for layer in self.layers:
+ if isinstance(layer, torch.nn.Linear):
+ torch.nn.init.xavier_normal_(layer.weight)
+ layer.bias.data.fill_(0.0)
+
+ def forward(self, x, train=True):
+ for layer in self.layers:
+ x = layer(x)
+ if train and hasattr(self, 'dropout_layer'):
+ x = self.dropout_layer(x)
+
+ return x
+
+ def predict(self, x, train=False):
+ self.eval()
+ with torch.no_grad():
+ return self.forward(x, train)
+
+def train_neural_network(model, inputs, outputs, optimizer, epochs=1000, lr_scheduler=None):
+ model.train()
+ for epoch in range(epochs):
+ optimizer.zero_grad()
+ predictions = model(inputs)
+ loss = torch.mean(torch.square(predictions - outputs))
+ loss.backward()
+ optimizer.step()
+
+ if lr_scheduler:
+ lr_scheduler.step()
+
+ if epoch % 100 == 0:
+ print(f'Epoch {epoch}, Loss: {loss.item()}, Learning Rate: {optimizer.param_groups[0]["lr"]}')
+
+
+def load_model(model_path):
+ checkpoint = torch.load(model_path, map_location=DEVICE)
+ model_config = checkpoint['model_config']
+ model = NeuralNetwork(model_config['layer_sizes'], dropout_rate=model_config['dropout_rate'])
+ model.load_state_dict(checkpoint['model_state_dict'])
+ print(f"Model loaded from {model_path}")
+
+ model.to(DEVICE)
+ model.eval()
+ return model
+
+def inverse_design(ply_number, fiber_vf, y_target, n_restarts=10, epochs=100, use_lbfgs=False):
+ model = load_model('./model_checkpoint.pth')
+
+ data = Dataset()
+ y_target_norm = data.normalize_output(y_target) # (A1, B1, C1, Stress)
+ y_target_tensor = torch.tensor(y_target, dtype=torch.float32)
+ input_mean = torch.tensor(data.input_mean)
+ input_std = torch.tensor(data.input_std)
+ output_mean = torch.tensor(data.output_mean)
+ output_std = torch.tensor(data.output_std)
+
+
+ weights = torch.tensor([1.0, 1.0, 1.0, 0.5], dtype=torch.float32)
+ bounds = torch.tensor([[50., 600.], [50., 600.], [50., 600.]], dtype=torch.float32) # Initial_Temp, Punch_Velocity, Cooling_Time
+ best = {"loss": float('inf'), "input": None, "output": None}
+
+ for restart in range(n_restarts):
+ z = torch.randn(3, requires_grad=True)
+
+ if use_lbfgs:
+ optimizer = torch.optim.LBFGS([z], lr=0.1, max_iter=epochs, line_search_fn="strong_wolfe")
+ steps = 1
+ else:
+ optimizer = torch.optim.Adam([z], lr=0.001)
+ steps = epochs
+
+ for step in range(steps):
+ def closure():
+ var = bounds[:, 0] + (bounds[:, 1] - bounds[:, 0]) * torch.sigmoid(z)
+ optimizer.zero_grad()
+ input_raw = torch.cat([torch.tensor([ply_number, fiber_vf]), var]).unsqueeze(0)
+ input_norm = (input_raw - input_mean) / input_std
+ output_pred = model(input_norm, train=False)
+ output_pred = (output_pred * output_std) + output_mean
+ loss = torch.sum(weights * (output_pred - y_target_tensor) ** 2)
+ loss.backward()
+ return loss
+
+ if use_lbfgs:
+ loss = optimizer.step(closure)
+ else:
+ loss = closure()
+ optimizer.step()
+
+ if (step + 1) % 200 == 0:
+ print(f'Restart {restart + 1}, Step {step + 1}, Loss: {loss.item():.6f}, grad: {z.grad.norm().item():.6f}')
+
+ with torch.no_grad():
+ var = bounds[:, 0] + (bounds[:, 1] - bounds[:, 0]) * torch.sigmoid(z)
+ input_raw = torch.cat([torch.tensor([ply_number, fiber_vf]), var])
+ input_norm = (input_raw - input_mean) / input_std
+ output_pred = model.predict(input_norm)
+ output_pred = data.denormalize_output(output_pred.numpy())
+ final_loss = np.sum(weights.numpy() * (output_pred - y_target) ** 2).item()
+ if final_loss < best["loss"]:
+ best["loss"] = final_loss
+ best["input"] = var.detach().cpu().numpy()
+ best["output"] = output_pred
+
+ return best
+
+
+def inverse_model():
+ set_seed(5324)
+ dataset = Dataset(inverse=True)
+ inputs, outputs = dataset.get_input(normalize=True), dataset.get_output(normalize=True)
+
+ idx_train = np.random.choice(len(inputs), size=int(0.85 * len(inputs)), replace=False)
+ idx_test = np.setdiff1d(np.arange(len(inputs)), idx_train)
+ # idx_test = np.array([1, 14+1, 18+1, 20+1, 23+1])
+ # idx_train = np.setdiff1d(np.arange(len(inputs)), idx_test)
+
+ inputs_train = torch.tensor(inputs[idx_train], dtype=torch.float32).to(DEVICE)
+ outputs_train = torch.tensor(outputs[idx_train], dtype=torch.float32).to(DEVICE)
+
+ inputs_test = torch.tensor(inputs[idx_test], dtype=torch.float32).to(DEVICE)
+ outputs_test = torch.tensor(outputs[idx_test], dtype=torch.float32).to(DEVICE)
+
+ layer_sizes = [inputs.shape[1]] + [64] * 4 + [outputs.shape[1]]
+ dropout_rate =0.05
+ model = NeuralNetwork(layer_sizes, dropout_rate=dropout_rate, activation=torch.nn.ReLU).to(DEVICE)
+ optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
+ lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5000, gamma=0.9)
+
+ # Create a proper dataset that keeps input-output pairs together
+ train_dataset = torch.utils.data.TensorDataset(inputs_train, outputs_train)
+ train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True)
+
+ # Train the model
+ epochs = 20000
+ for epoch in range(epochs):
+ model.train()
+ for inputs_batch, outputs_batch in train_loader:
+ inputs_batch = inputs_batch.to(DEVICE)
+ outputs_batch = outputs_batch.to(DEVICE)
+ optimizer.zero_grad()
+ predictions = model(inputs_batch)
+ loss = torch.mean(torch.square(predictions - outputs_batch))
+ loss.backward()
+ optimizer.step()
+
+ if lr_scheduler:
+ lr_scheduler.step()
+
+ if epoch % 500 == 0:
+ train_pred = model(inputs_train)
+ train_loss = torch.mean(torch.square(train_pred - outputs_train))
+ test_pred = model(inputs_test)
+ test_loss = torch.mean(torch.square(test_pred - outputs_test))
+ print(f'Epoch {epoch}, Train Loss: {train_loss.item():.6f}, Test Loss: {test_loss.item():.6f}')
+ # print(f'Learning Rate: {optimizer.param_groups[0]["lr"]}')
+
+
+ predictions = model.predict(inputs_test)
+ test_loss = torch.mean(torch.square(predictions - outputs_test))
+ print(f'Test Loss: {test_loss.item()}. Samples: {idx_test}')
+
+ x = np.arange(0, len(idx_test))
+
+ outputs_test = dataset.denormalize_output(outputs_test.cpu().numpy())
+ predictions = dataset.denormalize_output(predictions.cpu().numpy())
+ # for sample in outputs_test:
+ # print(f'Test samples: {sample}')
+ plt.figure(figsize=(10, 6))
+ plt.plot(x, outputs_test[:, 0], color='b', linestyle='--', label='True Initial Temp')
+ plt.plot(x, predictions[:, 0], color='b', linestyle='-', label='Predicted Initial Temp')
+ plt.plot(x, outputs_test[:, 1], color='r', linestyle='--', label='True Punch Velocity')
+ plt.plot(x, predictions[:, 1], color='r', linestyle='-', label='Predicted Punch Velocity')
+ plt.plot(x, outputs_test[:, 2], color='g', linestyle='--', label='True Cooling Time')
+ plt.plot(x, predictions[:, 2], color='g', linestyle='-', label='Predicted Cooling Time')
+ plt.gca().xaxis.set_major_locator(plt.MaxNLocator(integer=True))
+ plt.xlabel('Sample Index')
+ plt.xticks(ticks=range(len(idx_test)),labels=idx_test + 1)
+ plt.ylabel('Processing Parameters')
+ plt.legend(loc='upper right')
+ plt.savefig('inverse_design.png')
+
+ # MSE
+ mse = np.mean((predictions - outputs_test) ** 2, axis=0)
+ print(f'Mean Squared Error for Initial Temp: {mse[0]:.6f}, Punch Velocity: {mse[1]:.6f}, Cooling Time: {mse[2]:.6f}')
+
+ # R 2 score
+ ss_ress = np.sum((outputs_test - predictions) ** 2, axis=0)
+ ss_tots = np.sum((outputs_test - np.mean(outputs_test, axis=0)) ** 2, axis=0)
+ r2_scores = 1 - ss_ress / ss_tots
+ print(f'R² Score for Initial Temp: {r2_scores[0]:.6f}, Punch Velocity: {r2_scores[1]:.6f}, Cooling Time: {r2_scores[2]:.6f}')
+
+ # Error
+
+ # Save the model
+ model_save_path = './model_inverse_ckpt.pth'
+ model_config = {'layer_sizes': layer_sizes,
+ 'dropout_rate': dropout_rate
+ }
+ checkpoint = {
+ 'model_state_dict': model.state_dict(),
+ 'model_config': model_config
+ }
+ torch.save(checkpoint, model_save_path)
+
+
+if __name__ == "__main__":
+ # train the inverse model over springback data
+ # inverse_model()
+
+ # perform inverse design
+ import time
+ start_time = time.time()
+ # best = inverse_design(ply_number=2, fiber_vf=0.6, y_target=np.array([0.89, 0.83, 0.12, 180.2]), n_restarts=50, epochs=100, use_lbfgs=True, feasibility_samples=2000)
+ best = inverse_design(ply_number=2, fiber_vf=0.4, y_target=np.array([0.45, 9.03, 1.87, 187.4]), n_restarts=50, epochs=100, use_lbfgs=True)
+ end_time = time.time()
+ time_elapsed = (end_time - start_time)
+ print(f"Inverse design completed in {time_elapsed:.2f} seconds.")
+ print("Best Input (Initial Temp, Punch Velocity, Cooling Time):", best["input"])
+ print("Best Output (A1, B1, C1, Stress):", best["output"])
+
diff --git a/inverse_design_demo/requirements.txt b/inverse_design_demo/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..75c2af523a7071b20ab1819370de8fd5aaacfd8f
--- /dev/null
+++ b/inverse_design_demo/requirements.txt
@@ -0,0 +1,9 @@
+streamlit
+pandas
+altair
+plotly
+pathlib
+numpy
+matplotlib
+openpyxl
+torch
\ No newline at end of file
diff --git a/inverse_design_demo/thermoforming.py b/inverse_design_demo/thermoforming.py
new file mode 100644
index 0000000000000000000000000000000000000000..7caccaf09289bb112d61388f08c91b553d2cbd09
--- /dev/null
+++ b/inverse_design_demo/thermoforming.py
@@ -0,0 +1,368 @@
+#######################
+# Import libraries
+import streamlit as st
+import pandas as pd
+import altair as alt
+import plotly.express as px
+from PIL import Image # Used to open and handle image files
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+#######################
+# Page configuration
+st.set_page_config(
+ page_title="Inverse Design of Thermoplastic Composites for Thermoforming",
+# page_icon="🏂",
+ layout="wide",
+ initial_sidebar_state="collapsed")
+
+alt.themes.enable('default')
+
+#######################
+# CSS styling
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+st.markdown("""
+
+""", unsafe_allow_html=True)
+
+
+st.set_page_config(initial_sidebar_state="collapsed")
+
+st.markdown(
+ """
+
+""",
+ unsafe_allow_html=True,
+)
+#######################
+if 'input_changed' not in st.session_state:
+ st.session_state.input_changed= False
+def input_typed_in():
+ st.session_state.input_changed= True
+
+if 'forming_input_changed' not in st.session_state:
+ st.session_state.forming_input_changed= False
+def forming_typed_in():
+ st.session_state.forming_input_changed= True
+
+
+
+if 'input_curve_button_clicked' not in st.session_state:
+ st.session_state.input_curve_button_clicked= False
+def input_curve_click():
+ st.session_state.input_curve_button_clicked = True
+
+if 'material_design_button_clicked' not in st.session_state:
+ st.session_state.material_design_button_clicked= False
+def material_design_click():
+ st.session_state.material_design_button_clicked = True
+
+if 'forming_input_button_clicked' not in st.session_state:
+ st.session_state.forming_input_button_clicked= False
+def forming_input_click():
+ st.session_state.forming_input_button_clicked = True
+
+if 'forming_design_button_clicked' not in st.session_state:
+ st.session_state.forming_design_button_clicked= False
+def forming_design_click():
+ st.session_state.forming_design_button_clicked = True
+
+
+
+#######################
+# Load data
+#df_reshaped = pd.read_csv('data/us-population-2010-2019-reshaped.csv')
+
+######## Initialize data #############
+E1aV=0 # initial longitudinal stiffness
+E1bV=0 # 10% strain longitudinal stiffness
+G12aV=0 # initial longitudinal stiffness
+G12bV=0 # 10% strain longitudinal stiffness
+nlayers=4
+vf=0.5
+angle=30
+
+#######################
+# Main Panel
+
+data_materials={
+ 'Matrix':['ABS','Polyurethane','Nylon 6','Nylon 6','Nylon 66','PE','PP'],
+ 'Filler':['Carbon Black','Glass Fiber','Glass Fiber','Carbon Fiber','Glass Fiber','Carbon Fiber','Glass Fiber'],
+ 'VF':['15%','20%','20%','40%','30%','20%','30%'],
+ 'Feature':['Blend','Extruded','Molded','Molded','Molded','Molded','Molded']
+ }
+
+data_physical = {
+ 'Forming T (C)': ['180', '185', '190'],
+ 'Punch V (m/s)': ['1.05', '1.8','1.67'],
+ 'Cooling time (s)': ['45','80','120'],
+ 'Holding force (kN)': ['23','24','25']
+ }
+
+st.title("Inverse Design of Thermoplastic Composites for Thermoforming")
+st.write("")
+st.write("")
+st.write("")
+st.write(r"$\textsf{\textbf{\Large Material Design Requirements}}$")
+#st.text_input(r"$\textsf{\textbf{\Large Material Design Requirements}}$")
+
+# First row with 3 columns
+col1_row1, col2_row1, col3_row1 = st.columns([0.3,0.3,0.3])
+with col1_row1:
+ with st.container(border=False): # Container with a border
+ E1aV= st.number_input("Initial tensile stiffness (MPa):", format="%.2f", width=250, key="E1a", on_change=input_typed_in)
+ E1bV= st.number_input("10% tensile stiffness (MPa):", format="%.2f", width=250, key="E1b", on_change=input_typed_in)
+
+with col2_row1:
+ with st.container(border=False): # Container with a border
+ G12aV= st.number_input("Initial shear stiffness (MPa):", format="%.2f", width=250, key="G12a", on_change=input_typed_in)
+ G12bV= st.number_input("0.1 shear strain stiffness (MPa):", format="%.2f", width=250, key="G12b", on_change=input_typed_in)
+
+with col3_row1:
+ with st.container(border=False): # Container with a border
+ EratioV= st.number_input("Anisotropicity (Ex/Ey):", format="%.2f", width=250, key="Eratio", on_change=input_typed_in)
+
+
+st.write("")
+if st.session_state.input_changed == True:
+ st.session_state.input_curve_button_clicked = False
+ st.session_state.material_design_button_clicked = False
+ st.session_state.forming_input_button_clicked = False
+ st.session_state.forming_design_button_clicked = False
+ st.session_state.input_changed = False
+
+st.button("Generate required stress-strain curves", width=400, on_click=input_curve_click)
+
+if st.session_state.input_curve_button_clicked == True:
+ #st.write(E1aV)
+ #st.write(E1bV)
+ x = np.linspace(0, 0.1, 20)
+ y1 = E1aV*x + (E1bV-E1aV)/0.2*x*x
+ y2 = G12aV*x + (G12bV-G12aV)/0.2*x*x
+ y3 = y1/EratioV
+ ylimit=np.max([np.max(y1),np.max(y2), np.max(y3)])
+ # 2nd row with 3 columns
+ col1_row2, col2_row2, col3_row2, col4_row2= st.columns([0.25,0.25,0.25,0.25])
+ with col1_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, y1)
+ ax.set_ylim([0, ylimit])
+ ax.set_xlabel('Stress (MPa)')
+ ax.set_ylabel('Strain')
+ ax.set_title('Longitudinal stress-strain')
+ st.pyplot(fig)
+ with col2_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, y2)
+ ax.set_ylim([0, ylimit])
+ ax.set_xlabel('Stress (MPa)')
+ ax.set_ylabel('Strain')
+ ax.set_title('Shear stress-strain')
+ st.pyplot(fig)
+ with col3_row2:
+ with st.container(border=False): # Container with a border
+ fig, ax = plt.subplots()
+ ax.plot(x, y3)
+ ax.set_ylim([0, ylimit])
+ ax.set_xlabel('Stress (MPa)')
+ ax.set_ylabel('Strain')
+ ax.set_title('Shear stress-strain')
+ st.pyplot(fig)
+
+ st.write("")
+ st.button("Material Inverse Design", width=400, on_click=material_design_click)
+ if st.session_state.material_design_button_clicked == True:
+ #st.write("")
+ # 3rd row with 3 columns
+ col1_row3, col2_row3, col3_row3, col4_row3, col5_row3= st.columns([0.15,0.15,0.23,0.23,0.23])
+ with col1_row3:
+ with st.container(border=False): # Container with a border
+ st.write("Number of layers=", nlayers)
+ st.write("Volume fraction=", vf)
+
+ with col2_row3:
+ with st.container(border=False): # Container with a border
+ df = pd.DataFrame({'Ply': [], 'Orientation': []})
+ plies = np.array([[1,90], [2,45], [3,-45], [4,-90]])
+ plies_df=pd.DataFrame(plies, columns=df.columns)
+ df = pd.concat([df, plies_df], ignore_index=True)
+ st.dataframe(df, hide_index=True)
+
+ with col3_row3:
+ with st.container(border=False): # Container with a border
+ image = Image.open('figures/material_res3.png')
+ new_image = image.resize((250, 200))
+ st.image(new_image, caption='')
+
+ with col4_row3:
+ with st.container(border=False): # Container with a border
+ image = Image.open('figures/material_res3.png')
+ new_image = image.resize((250, 200))
+ st.image(new_image, caption='')
+
+
+ with col5_row3:
+ with st.container(border=False): # Container with a border
+ image = Image.open('figures/material_res3.png')
+ new_image = image.resize((250, 200))
+ st.image(new_image, caption='')
+
+
+ st.write("")
+ st.button("Thermoforming Requirements", width=400, on_click=forming_input_click)
+ if st.session_state.forming_input_button_clicked == True:
+ #st.write("")
+ # 4th row with 3 columns
+ col1_row4, col2_row4, col3_row4, col4_row4, col5_row4 = st.columns([0.16,0.16,0.2,0.24,0.24])
+ with col1_row4:
+ with st.container(border=False): # Container with a border
+ st.write("Number of layers=", nlayers)
+ st.write("Volume fraction=", vf)
+ st.write("Fiber orientation=", angle)
+ with col2_row4:
+ with st.container(border=False): # Container with a border
+ df = pd.DataFrame({'Ply': [], 'Orientation': []})
+ plies = np.array([[1,90], [2,45], [3,-45], [4,-90]])
+ plies_df=pd.DataFrame(plies, columns=df.columns)
+ df = pd.concat([df, plies_df], ignore_index=True)
+ st.dataframe(df, hide_index=True)
+
+ with col3_row4:
+ with st.container(border=False): # Container with a border
+ image = Image.open('figures/forming_angle.png')
+ new_image = image.resize((250, 200))
+ st.image(new_image, caption='')
+
+ with col4_row4:
+ with st.container(border=False): # Container with a border
+ angleA= st.number_input("Maximum warpage angle A (degree):", format="%.2f", width=300, key="A", on_change=forming_typed_in)
+ angleB= st.number_input("Maximum warpage angle B (degree):", format="%.2f", width=300, key="B", on_change=forming_typed_in)
+
+
+ with col5_row4:
+ with st.container(border=False): # Container with a border
+ angleC= st.number_input("Maximum warpage angle C (degree):", format="%.2f", width=300, key="C", on_change=forming_typed_in)
+ max_stress= st.number_input("Maximum residual stress (MPa):", format="%.2f", width=300, key="max_stress", on_change=forming_typed_in)
+
+ st.write("")
+ if st.session_state.forming_input_changed == True:
+ st.session_state.forming_design_button_clicked = False
+ st.session_state.forming_input_changed = False
+ st.button("Thermoforming process design", width=400, on_click=forming_design_click)
+ if st.session_state.forming_design_button_clicked == True:
+ # 5th row with 3 columns
+ col1_row5, col2_row5,col3_row5 = st.columns([0.25,0.25,0.25])
+ with col1_row5:
+ with st.container(border=False): # Container with a border
+ st.write("Forming temperature (C)=", nlayers)
+ with col2_row5:
+ with st.container(border=False): # Container with a border
+ st.write("Punching velocity (mm/s)=", nlayers)
+ with col3_row5:
+ with st.container(border=False): # Container with a border
+ st.write("Cooling time (s)=", nlayers)
+
+
+
+
+
+
+
+
diff --git a/requirements.txt b/requirements.txt
index 75c2af523a7071b20ab1819370de8fd5aaacfd8f..ea8f8581e5a9d6e9c3c7c102bbd588959cfb826e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,7 +3,7 @@ pandas
altair
plotly
pathlib
-numpy
+numpy==1.26.4
matplotlib
openpyxl
torch
\ No newline at end of file