Spaces:
Sleeping
Sleeping
File size: 3,437 Bytes
67fb03c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
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()
|