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()