Source code for src.compare_execution_logs

"""
Author: Ismael Seidel
Affiliation: Embedded Computing Lab (ECL), Federal University of Santa Catarina (UFSC)

Description:
    This module compares execution logs from multiple codec runs to verify consistency
    of MD5 checksums across raw files, encoded bitstreams, and decoded outputs.
"""

import json
import sys


[docs] def load_json(file_path: str) -> dict: """Load and parse a JSON file. :param file_path: Path to the JSON file :type file_path: str :return: Parsed JSON content as dictionary :rtype: dict """ with open(file_path, 'r') as f: return json.load(f)
[docs] def compare_json_files(file_paths: list, names: list) -> dict: """Compare execution logs from multiple codec runs. Analyzes and compares MD5 checksums for: - Raw light field files - Encoded bitstreams from each codec - Decoded outputs from each codec :param file_paths: List of paths to execution log JSON files :type file_paths: list :param names: List of names/labels for each codec run :type names: list :return: Comparison results with matching checksum analysis :rtype: dict """ files = {names[i]: file_paths[i] for i in range(len(file_paths))} comparison_result = {"files": files, "results": {}} json_data = {key: load_json(path) for key, path in files.items()} first_key = next(iter(json_data)) for lightfield in json_data[first_key]["results"]: comparison_result["results"][lightfield] = {} # Compare raw_md5 raw_md5s = {key: json_data[key]["results"][lightfield]["raw_md5"] for key in files} comparison_result["results"][lightfield]["raw_md5"] = raw_md5s comparison_result["results"][lightfield]["raw_md5"]["matching_checksum"] = len(set(raw_md5s.values())) == 1 # Compare encoder md5s comparison_result["results"][lightfield]["encoder"] = {} for bpp in json_data[first_key]["results"][lightfield]["encoder"]: md5s = {key: json_data[key]["results"][lightfield]["encoder"][bpp]["md5_of_encoded"] for key in files} comparison_result["results"][lightfield]["encoder"][bpp] = {"md5_of_encoded": md5s} comparison_result["results"][lightfield]["encoder"][bpp]["md5_of_encoded"]["matching_checksum"] = len(set(md5s.values())) == 1 # Compare decoder md5s comparison_result["results"][lightfield]["decoder"] = {} for bpp in json_data[first_key]["results"][lightfield]["decoder"]: md5s = {key: json_data[key]["results"][lightfield]["decoder"][bpp]["decoded_md5"] for key in files} comparison_result["results"][lightfield]["decoder"][bpp] = {"decoded_md5": md5s} comparison_result["results"][lightfield]["decoder"][bpp]["decoded_md5"]["matching_checksum"] = len(set(md5s.values())) == 1 return comparison_result
if __name__ == "__main__": if len(sys.argv) < 4 or len(sys.argv) % 2 == 0: print("Usage: python compare_json_md5.py name1 file1.json name2 file2.json [name3 file3.json ...]") sys.exit(1) args = sys.argv[1:] names = args[0::2] file_paths = args[1::2] result = compare_json_files(file_paths, names) print(json.dumps(result, indent=4))