AnsysLPFMTrame-App / utils /Cosine-score.py
udbhav
Recreate Trame_app branch with clean history
67fb03c
import pyvista as pv
import numpy as np
from scipy.spatial.distance import cosine
from scipy.ndimage import gaussian_filter
import matplotlib.pyplot as plt
import os
# -------------------- PyVista Config --------------------
pv.OFF_SCREEN = True
pv.set_plot_theme("document")
# -------------------- Paths --------------------
dataset = "cadillac_const_vel_30"
dataname = "cadillac_3"
train_folder = f'/raid/ansysai/pkakka/6-Transformers/comparePhysicsLM/Data/{dataset}/'
train_save_dir = os.path.join(train_folder, f"../../metrics/{dataset}/")
os.makedirs(train_save_dir, exist_ok=True)
# -------------------- Utility Functions --------------------
def get_points(file_path, max_points=5000):
"""Extract and subsample point cloud from VTP file."""
try:
mesh = pv.read(file_path)
points = mesh.points
if len(points) > max_points:
indices = np.random.choice(len(points), max_points, replace=False)
points = points[indices]
return points
except Exception as e:
raise ValueError(f"Error reading {file_path}: {e}")
# -------------------- Single VTP Score Function --------------------
def compute_single_vtp_score(vtp_file_path, train_dist_file='train_dist.npz', smooth_sigma=1):
"""
Compute Cosine similarity score for a single VTP file against saved training distribution.
Args:
vtp_file_path: Path to the VTP file to analyze
train_dist_file: Name of the saved training distribution file
smooth_sigma: Gaussian smoothing parameter
Returns:
float: Cosine similarity score (0-1), higher means closer to training distribution
"""
# Load the saved training distribution
train_dist_path = os.path.join(train_folder + "1_VTK_surface", train_dist_file)
if not os.path.exists(train_dist_path):
raise ValueError(f"Training distribution file not found: {train_dist_path}")
data = np.load(train_dist_path)
train_hist = data['hist']
bin_edges = [data['edges0'], data['edges1'], data['edges2']]
# Check if VTP file exists
if not os.path.exists(vtp_file_path):
raise ValueError(f"VTP file not found: {vtp_file_path}")
# Get test points from VTP file
test_points = get_points(vtp_file_path)
# Create 3D histogram for test points using same bins as training
test_hist, _ = np.histogramdd(test_points, bins=bin_edges, density=True)
test_hist = gaussian_filter(test_hist, sigma=smooth_sigma)
# Flatten and normalize
test_hist = test_hist.flatten()
test_hist /= test_hist.sum()
# Add small epsilon to avoid zero values
epsilon = 1e-12
train_hist_safe = train_hist + epsilon
test_hist_safe = test_hist + epsilon
# Compute Cosine similarity (1 - cosine distance)
cosine_distance = cosine(train_hist_safe, test_hist_safe)
cosine_similarity = 1 - cosine_distance
print(f"Cosine Score for {os.path.basename(vtp_file_path)}: {cosine_similarity:.6f}")
return cosine_similarity
# -------------------- Main --------------------
if __name__ == "__main__":
try:
compute_single_vtp_score(vtp_file_path=train_folder+f"1_VTK_surface/{dataname}/{dataname}.vtp")
print("Cosine similarity analysis completed successfully!")
except Exception as e:
print(f"Error during analysis: {e}")
import traceback
traceback.print_exc()