From e31a2e5405cae18b8d7795c42198ad23e7e0623a Mon Sep 17 00:00:00 2001 From: TPTBusiness Date: Sun, 5 Apr 2026 12:24:04 +0200 Subject: [PATCH] fix: Handle timeout exceptions safely in predix_full_eval.py Problem: - When factor evaluation timed out (5 min), result was undefined - save_single_result(result) crashed with NameError - factor.factor_name[:40] could fail if factor_name wasn't a string Fix: - Initialize result = None before try block - Set result to failed EvalResult on exception - Only call save_single_result() if result is not None - Use getattr(factor, 'factor_name', 'unknown') for safe access - Convert to string before slicing [:40] Now the evaluator continues even when individual factors timeout. --- .gitignore | 1 + predix_full_eval.py | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index cbcab4d6..3140e8c8 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,4 @@ test_credentials.py # Closed source local components rdagent/scenarios/qlib/local/ +docs/COMPLETE_WORKFLOW.md diff --git a/predix_full_eval.py b/predix_full_eval.py index 865a0cad..10d84787 100644 --- a/predix_full_eval.py +++ b/predix_full_eval.py @@ -383,27 +383,34 @@ def run_evaluation( for future in as_completed(futures): factor = futures[future] + result = None try: result = future.result(timeout=300) results.append(result) except Exception as e: + # Handle timeout and other exceptions + fname = str(getattr(factor, 'factor_name', 'unknown'))[:40] results.append(EvalResult( - factor_name=factor.factor_name, - workspace_hash=factor.workspace_hash, + factor_name=fname, + workspace_hash=getattr(factor, 'workspace_hash', 'unknown'), status="failed", error_message=f"Exception: {str(e)[:300]}", )) + result = results[-1] n_success = sum(1 for r in results if r.status == "success") n_fail = sum(1 for r in results if r.status == "failed") # Save immediately after each factor - save_single_result(result) + if result is not None: + save_single_result(result) + # Update progress with safe string handling + fname = str(getattr(factor, 'factor_name', 'unknown'))[:40] progress.update( task, advance=1, - description=f"Evaluating: {n_success}✅ {n_fail}❌ | {factor.factor_name[:40]}", + description=f"Evaluating: {n_success}✅ {n_fail}❌ | {fname}", ) return results