""" Validation runner for SimCluster ITS validation suite Automatically discovers and runs all validation files in the validation/ directory """ import argparse import glob import os import sys def get_validation_description(validation_file): """Generate a description for the validation file based on its name""" descriptions = { "validation_all_samplers_basic.py": "Basic Sampler validations (Int, Float, Datetime)", "validation_cumulative_count.py": "Cumulative Count Conversion validations", "validation_datetime_sampler.py": "Datetime Sampler validations", "validation_distribution_formats.py": "Distribution Format validations (PMF, Histogram)", "validation_float_sampler.py": "Float Sampler validations", "validation_int_sampler.py": "Integer Sampler validations", "validation_its_comprehensive.py": "Comprehensive ITS validations (Functionality + Performance)", "validation_prepare_integration.py": "Prepare.py Integration validations", "validation_scalar_to_string.py": "Scalar to String Conversion validations", "validation_text_compatibility.py": "Text Sampler Compatibility validations", "validation_text_sampler.py": "Text Sampler validations", "validation_tuple_compatibility.py": "Tuple Format Compatibility validations", } filename = os.path.basename(validation_file) return descriptions.get(filename, f"validations from {filename}") def discover_validation_files(): """Automatically discover all validation files in the validations directory""" validation_pattern = "validation/validate_*.py" validation_files = glob.glob(validation_pattern) # Sort for consistent order validation_files.sort() return [ (validation_file, get_validation_description(validation_file)) for validation_file in validation_files ] def run_validation_file(validation_file, description, seed=None): """Run a single validation file""" print(f"\n๐Ÿงช Running {description}") if seed is not None: print(f"๐ŸŽฒ Using seed: {seed}") print("=" * 60) # Set environment variable for seed if provided env = os.environ.copy() if seed is not None: env["ITS_VALIDATION_SEED"] = str(seed) try: # Import and run the validation with environment import subprocess result = subprocess.run( [sys.executable, validation_file], env=env, capture_output=False ) if result.returncode == 0: print(f"โœ… {description} - PASSED") return True else: print(f"โŒ {description} - FAILED") return False except Exception as e: print(f"โŒ {description} - ERROR: {e}") return False def main(): """Run all validations""" # Parse command line arguments parser = argparse.ArgumentParser( description="SimCluster ITS validation Suite Runner", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: python run_validations.py # Run with default seed (42) python run_validations.py --seed 123 # Run with custom seed python run_validations.py --seed random # Run with random seed """, ) parser.add_argument( "--seed", type=str, default="42", help='Random seed for reproducible validations (default: 42, use "random" for random seed)', ) args = parser.parse_args() # Handle seed argument if args.seed.lower() == "random": import time seed = int(time.time()) % 10000 # Use timestamp as seed print("๐ŸŽฒ Using random seed") else: try: seed = int(args.seed) except ValueError: print( f"โŒ Invalid seed value: {args.seed}. Must be an integer or 'random'." ) return 1 print("๐Ÿš€ SimCluster ITS validation Suite Runner") print("=" * 80) print(f"๐ŸŽฒ Validation seed: {seed}") print() # Automatically discover all validation files validation_files = discover_validation_files() if not validation_files: print("โš ๏ธ No validation files found in validation/ directory") return 1 print(f"๐Ÿ“‹ Discovered {len(validation_files)} validation files:") for validation_file, description in validation_files: print(f" โ€ข {validation_file}") print() results = [] for validation_file, description in validation_files: success = run_validation_file(validation_file, description, seed=seed) results.append((validation_file, description, success)) # Summary print("\n" + "=" * 80) print("๐Ÿ“Š Validation Suite Summary") print("=" * 80) passed = 0 failed = 0 skipped = 0 for validation_file, description, result in results: if result is True: print(f"โœ… {description}") passed += 1 elif result is False: print(f"โŒ {description}") failed += 1 else: print(f"โš ๏ธ {description} - SKIPPED") skipped += 1 print(f"\nResults: {passed} passed, {failed} failed, {skipped} skipped") if failed == 0: print("๐ŸŽ‰ All validations passed!") return 0 else: print(f"๐Ÿ’ฅ {failed} validation(s) failed") return 1 if __name__ == "__main__": exit(main())