2024.08.19
코드 수정 시, 기본 코드 내의 식별자 및 흐름 확인하기
❌ 문제의 코드 ❌
파일 내에서 key-value 형태의 메타 데이터를 추가하기 위해 기존 모델의 코드에 메타 데이터를 개별적으로 파싱하는 부분을 추가하였다. 아무 생각 없이 key-value이니 식별자를 key로 두었는데, 이것이 문제가 되었다. 가장 바깥 쪽에 있는 for문에서 key를 사용하는데, 가장 안쪽에서도 동일한 key를 사용하여 key가 "train"이 되지 못하여 save_normalization_statistic 함수를 실행하지 못하였다.
# Start preprocessing
for key, xyzfile, lmdbfile in key_xyz_lmdb_list:
trajectory = ase.io.read(xyzfile, index=":", format="extxyz")
with open(xyzfile, 'r') as f:
lines = f.readlines()
metadata_keys = ["energy", "free_energy", "stress"]
frame_metadata = []
# 각 프레임의 헤더에서 메타데이터 추출
for line in lines:
if "Lattice=" in line: # 새로운 프레임의 시작
metadata = {}
for key in metadata_keys:
# 정규 표현식으로 key=value 쌍 추출
match = re.search(f'{key}="([^"]+)"|{meta_key}=([-0-9.e]+)', line)
if match:
value = match.group(1) or match.group(2)
if key == "stress":
metadata[key] = list(map(float, value.split()))
else:
metadata[key] = float(value)
frame_metadata.append(metadata)
# 각 프레임에 대해 메타데이터 추가
for atoms, metadata in zip(trajectory, frame_metadata):
atoms.info.update(metadata)
if key == "train" and args.save_normalization:
save_normalization_statistics(
trajectory=trajectory,
out_dir=out_dir,
energy_type=args.energy_type,
)
⭕ 코드 해결 ⭕
단순하게 메타 데이터에 관한 key를 meta_key로 지정하여 해결하였다. 문제를 파악하기 위해서 key에 대한 정보가 어떠한 것이 있는지 출력해보는 것으로 인해 빠르게 문제점을 파악할 수 있었다.
# Start preprocessing
for key, xyzfile, lmdbfile in key_xyz_lmdb_list:
trajectory = ase.io.read(xyzfile, index=":", format="extxyz")
with open(xyzfile, 'r') as f:
lines = f.readlines()
metadata_keys = ["energy", "free_energy", "stress"]
frame_metadata = []
# 각 프레임의 헤더에서 메타데이터 추출
for line in lines:
if "Lattice=" in line: # 새로운 프레임의 시작
metadata = {}
for meta_key in metadata_keys:
# 정규 표현식으로 key=value 쌍 추출
match = re.search(f'{meta_key}="([^"]+)"|{meta_key}=([-0-9.e]+)', line)
if match:
value = match.group(1) or match.group(2)
if meta_key == "stress":
metadata[meta_key] = list(map(float, value.split()))
else:
metadata[meta_key] = float(value)
frame_metadata.append(metadata)
# 각 프레임에 대해 메타데이터 추가
for atoms, metadata in zip(trajectory, frame_metadata):
atoms.info.update(metadata)
if key == "train" and args.save_normalization:
save_normalization_statistics(
trajectory=trajectory,
out_dir=out_dir,
energy_type=args.energy_type,
)
논문에 나온 모델을 실행하기 위해 코드를 살짝 수정하였다.
앞, 뒤 흐름을 유심히 보지 않고 수정한 탓에 생각지도 못한 오류가 발생했다.
앞으로 충분히 겪을 수 있는 사소한 실수라 생각하여 이를 기억하기 위해 간단히 적어보았다.