본문 바로가기
예바의 LAB

[CAUTION] 코드 수정 시, 기본 코드 내의 식별자 및 흐름 확인하기

by 예바두비두밥바 2024. 8. 20.

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

 


 논문에 나온 모델을 실행하기 위해 코드를 살짝 수정하였다.

앞, 뒤 흐름을 유심히 보지 않고 수정한 탓에 생각지도 못한 오류가 발생했다.

앞으로 충분히 겪을 수 있는 사소한 실수라 생각하여 이를 기억하기 위해 간단히 적어보았다.