From 4f330122552d105e8351216b168d92acb115d89b Mon Sep 17 00:00:00 2001 From: baominghelly <1508269885@qq.com> Date: Wed, 21 Jan 2026 15:30:43 +0800 Subject: [PATCH 1/3] issue/958 - Add read tensor from file feature in dynamic ops test && fix display issue in kwargs --- test/infinicore/framework/entities.py | 9 +++++++ test/infinicore/framework/results.py | 3 --- test/infinicore/framework/tensor.py | 6 ++++- test/infinicore/framework/utils/load_utils.py | 27 +++++++++++++++---- test/infinicore/run.py | 2 +- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/test/infinicore/framework/entities.py b/test/infinicore/framework/entities.py index 275ef536f..5435bb416 100644 --- a/test/infinicore/framework/entities.py +++ b/test/infinicore/framework/entities.py @@ -133,6 +133,15 @@ def __str__(self): for key, value in self.kwargs.items(): if key == "out" and isinstance(value, int): kwargs_strs.append(f"{key}={self.inputs[value].name}") + elif isinstance(value, (list, tuple)): + # Handle tuple/list of TensorSpecs or other values + item_strs = [] + for item in value: + if isinstance(item, TensorSpec): + item_strs.append(str(item)) + else: + item_strs.append(str(item)) + kwargs_strs.append(f"{key}=({', '.join(item_strs)})") else: kwargs_strs.append(f"{key}={value}") diff --git a/test/infinicore/framework/results.py b/test/infinicore/framework/results.py index bc3c98fef..a4919061a 100644 --- a/test/infinicore/framework/results.py +++ b/test/infinicore/framework/results.py @@ -155,9 +155,6 @@ def print_live_result(self, result): if result.error_message: print(f"💥 Error: {result.error_message}") - if result.stdout or result.stderr or self.verbose: - print("-" * 40) - def print_summary(self, results, cumulative_timing, ops_dir, total_expected=0): print(f"\n{'='*80}\nCUMULATIVE TEST SUMMARY\n{'='*80}") diff --git a/test/infinicore/framework/tensor.py b/test/infinicore/framework/tensor.py index 317135d65..49c7792c9 100644 --- a/test/infinicore/framework/tensor.py +++ b/test/infinicore/framework/tensor.py @@ -358,4 +358,8 @@ def __str__(self): dtype_str = ( f", {str(self.dtype).replace('infinicore.', '')}" if self.dtype else "" ) - return f"{name_str}tensor{self.shape}{strides_str}{dtype_str}" + # Add [FROM_FILE] marker when loading from file + from_file_marker = ( + " [FROM_FILE]" if self.init_mode == TensorInitializer.FROM_FILE else "" + ) + return f"{name_str}tensor{self.shape}{strides_str}{dtype_str}{from_file_marker}" diff --git a/test/infinicore/framework/utils/load_utils.py b/test/infinicore/framework/utils/load_utils.py index a17c26b48..cb4678303 100644 --- a/test/infinicore/framework/utils/load_utils.py +++ b/test/infinicore/framework/utils/load_utils.py @@ -20,6 +20,7 @@ import infinicore from framework import ( BaseOperatorTest, + TensorInitializer, TensorSpec, TestCase, GenericTestRunner, @@ -42,11 +43,25 @@ def _parse_dtype(dtype_str): def _dict_to_spec(spec_dict): """Convert JSON dict to TensorSpec object.""" if not isinstance(spec_dict, dict): return spec_dict + + # Collect optional fields + kwargs = {k: spec_dict[k] for k in ('name', 'file_path') if k in spec_dict} + + # Determine init_mode: explicit spec > file_path inference > default RANDOM + init_mode = spec_dict.get('init_mode') + if isinstance(init_mode, str): + init_mode = TensorInitializer.FROM_FILE if init_mode.upper() == 'FROM_FILE' else TensorInitializer.RANDOM + elif init_mode is None and 'file_path' in spec_dict: + init_mode = TensorInitializer.FROM_FILE + else: + init_mode = init_mode or TensorInitializer.RANDOM + return TensorSpec( shape=tuple(spec_dict['shape']), dtype=_parse_dtype(spec_dict['dtype']), - name=spec_dict.get('name'), - strides=tuple(spec_dict['strides']) if spec_dict.get('strides') else None + strides=tuple(spec_dict['strides']) if spec_dict.get('strides') else None, + init_mode=init_mode, + **kwargs ) def parse_test_cases(): @@ -131,6 +146,7 @@ def main(): main() ''' + class TestGenerator: def __init__(self, project_root): @@ -151,8 +167,9 @@ def generate(self, json_list, output_dir): # If the op name is provided, generate the return statement. # If it's None/null, use 'pass' to avoid syntax errors. make_body = lambda name, tag: ( - f"return {name}(*args, **self._resolve_kwargs(args, kwargs))" - if name else f"pass # {tag} is null, skipping implementation" + f"return {name}(*args, **self._resolve_kwargs(args, kwargs))" + if name + else f"pass # {tag} is null, skipping implementation" ) torch_body = make_body(torch_op_name, "torch_op") @@ -162,7 +179,7 @@ def generate(self, json_list, output_dir): config_str = pprint.pformat(op_config, indent=4, width=120) file_content = _TEST_FILE_TEMPLATE.replace("{op_config_json}", config_str) file_content = file_content.replace("{project_root}", self.project_root) - + # Injected Method Bodies file_content = file_content.replace("{torch_method_body}", torch_body) file_content = file_content.replace("{infini_method_body}", infini_body) diff --git a/test/infinicore/run.py b/test/infinicore/run.py index 1b5e34067..67e0505c1 100644 --- a/test/infinicore/run.py +++ b/test/infinicore/run.py @@ -280,7 +280,7 @@ def main(): ) if bench: - print(f"Benchmark mode: {args.bench.upper()} timing") + print(f"Benchmark mode: {bench.upper()} timing") # 3. Initialize and Execute test_manager = TestManager( From 04d39a6b18b8800d9cf36e432562cbdce0252d44 Mon Sep 17 00:00:00 2001 From: baominghelly <1508269885@qq.com> Date: Wed, 21 Jan 2026 15:48:30 +0800 Subject: [PATCH 2/3] issue/958 - Simplify logic --- test/infinicore/framework/entities.py | 7 +------ test/infinicore/framework/utils/load_utils.py | 12 ++++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/test/infinicore/framework/entities.py b/test/infinicore/framework/entities.py index 5435bb416..f2045b8d0 100644 --- a/test/infinicore/framework/entities.py +++ b/test/infinicore/framework/entities.py @@ -135,12 +135,7 @@ def __str__(self): kwargs_strs.append(f"{key}={self.inputs[value].name}") elif isinstance(value, (list, tuple)): # Handle tuple/list of TensorSpecs or other values - item_strs = [] - for item in value: - if isinstance(item, TensorSpec): - item_strs.append(str(item)) - else: - item_strs.append(str(item)) + item_strs = [str(item) for item in value] kwargs_strs.append(f"{key}=({', '.join(item_strs)})") else: kwargs_strs.append(f"{key}={value}") diff --git a/test/infinicore/framework/utils/load_utils.py b/test/infinicore/framework/utils/load_utils.py index cb4678303..1e2bf482b 100644 --- a/test/infinicore/framework/utils/load_utils.py +++ b/test/infinicore/framework/utils/load_utils.py @@ -47,14 +47,14 @@ def _dict_to_spec(spec_dict): # Collect optional fields kwargs = {k: spec_dict[k] for k in ('name', 'file_path') if k in spec_dict} - # Determine init_mode: explicit spec > file_path inference > default RANDOM - init_mode = spec_dict.get('init_mode') - if isinstance(init_mode, str): - init_mode = TensorInitializer.FROM_FILE if init_mode.upper() == 'FROM_FILE' else TensorInitializer.RANDOM - elif init_mode is None and 'file_path' in spec_dict: + # Determine init_mode: file_path always uses FROM_FILE, otherwise use specified mode or default RANDOM + if 'file_path' in spec_dict: init_mode = TensorInitializer.FROM_FILE else: - init_mode = init_mode or TensorInitializer.RANDOM + init_mode = spec_dict.get('init_mode', TensorInitializer.RANDOM) + if isinstance(init_mode, str): + # Map string to enum, default to RANDOM if unknown + init_mode = getattr(TensorInitializer, init_mode.upper(), TensorInitializer.RANDOM) return TensorSpec( shape=tuple(spec_dict['shape']), From cc55de223f3ec8413a24e285141928655d8ca9ac Mon Sep 17 00:00:00 2001 From: baominghelly <1508269885@qq.com> Date: Wed, 21 Jan 2026 16:03:50 +0800 Subject: [PATCH 3/3] issue/958 - Add file_path if not empty in result file --- test/infinicore/framework/results.py | 7 ++++++- test/infinicore/framework/utils/json_utils.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/test/infinicore/framework/results.py b/test/infinicore/framework/results.py index a4919061a..00c7f6440 100644 --- a/test/infinicore/framework/results.py +++ b/test/infinicore/framework/results.py @@ -364,12 +364,17 @@ def _resolve_name(self, obj, default_name): return getattr(obj, "name", None) or default_name def _spec_to_dict(self, s, name=None): - return { + spec_dict = { "name": name if name else getattr(s, "name", "unknown"), "shape": list(s.shape) if s.shape else None, "dtype": str(s.dtype).split(".")[-1], "strides": list(s.strides) if s.strides else None, } + # Add file_path if it exists (stored in kwargs for TensorSpec) + file_path = getattr(s, "kwargs", {}).get("file_path") + if file_path: + spec_dict["file_path"] = file_path + return spec_dict def _fmt_result(self, res): if not (is_dataclass(res) or hasattr(res, "success")): diff --git a/test/infinicore/framework/utils/json_utils.py b/test/infinicore/framework/utils/json_utils.py index 1c299f585..03d574a2d 100644 --- a/test/infinicore/framework/utils/json_utils.py +++ b/test/infinicore/framework/utils/json_utils.py @@ -120,6 +120,7 @@ def _write_field(f, key, value, indent, sub_indent, close_comma=""): items = value current_len = len(indent) + len(f'"{key}": {open_char}') + wrapped = False # Track if we wrapped to new line for i, item in enumerate(items): if is_dict: @@ -135,8 +136,12 @@ def _write_field(f, key, value, indent, sub_indent, close_comma=""): if current_len + len(item_str) + len(item_comma) > 180: f.write(f"\n{sub_indent}") current_len = len(sub_indent) + wrapped = True f.write(f"{item_str}{item_comma}") current_len += len(item_str) + len(item_comma) + # Add newline before closing bracket if we wrapped + if wrapped: + f.write(f"\n{indent}") f.write(f"{close_char}{close_comma}\n")