Spaces:
Running on Zero
Running on Zero
File size: 1,145 Bytes
a064299 | 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 | import torch
def compute_ecms(velocities, alpha=0.1):
"""
velocities: (T, N, 3)
返回一个平均化后的 ECMS,不随粒子数/时间长度爆炸
"""
velocities = velocities.float()
T, N, C = velocities.shape
if T < 3:
raise ValueError("ECMS 需要至少 3 个时间步")
# ---- 1. 一阶差分(平均化)----
vel_diff = velocities[1:] - velocities[:-1] # (T-1, N, 3)
velocity_change_term = torch.mean(vel_diff ** 2) # <---- mean!
# ---- 2. 二阶差分(平均化)----
vel_second = velocities[2:] - 2*velocities[1:-1] + velocities[:-2]
velocity_grad_term = torch.mean(vel_second ** 2) # <---- mean!
# ---- 3. 速度范数(平均化)----
velocity_norm = torch.mean(torch.norm(velocities, dim=-1))
normalization_term = alpha * velocity_norm # 或 alpha * mean(norm)
ecms = velocity_change_term + velocity_grad_term + normalization_term
print(f"ECMS(mean): {ecms.item()} -> "
f"({velocity_change_term.item()}, {velocity_grad_term.item()}, {normalization_term.item()})")
return ecms
|