| |
| """ |
| Analyze expression complexity to understand why model fails on Nguyen-5. |
| """ |
|
|
| import json |
| import re |
| from collections import Counter |
|
|
| def count_operators(expr_str): |
| """Count operator occurrences.""" |
| ops = ['+', '-', '*', '/', 'sin', 'cos', 'sqrt', 'log', 'exp', 'pow', '**'] |
| counts = {} |
| for op in ops: |
| if op in ['**', 'pow']: |
| |
| counts['pow'] = expr_str.count('**') + expr_str.count('pow(') |
| else: |
| counts[op] = expr_str.count(op) |
| return counts |
|
|
| def max_nesting_depth(expr_str): |
| """Estimate max nesting depth by counting parentheses.""" |
| max_depth = 0 |
| current_depth = 0 |
| for char in expr_str: |
| if char == '(': |
| current_depth += 1 |
| max_depth = max(max_depth, current_depth) |
| elif char == ')': |
| current_depth -= 1 |
| return max_depth |
|
|
| def main(): |
| |
| with open("debug_expressions.json", "r") as f: |
| data = json.load(f) |
|
|
| all_expressions = data["all_expressions"] |
| valid_exprs = [e for e in all_expressions if e["is_valid"]] |
|
|
| print("="*80) |
| print("COMPLEXITY ANALYSIS") |
| print("="*80) |
| print() |
|
|
| |
| print("TARGET FUNCTION: sin(x_1**2)*cos(x_1) - 1") |
| print(" - Has power operation: x_1**2") |
| print(" - Has nested sin and cos") |
| print(" - Has multiplication of functions") |
| print(" - Nesting depth: 2") |
| print() |
|
|
| |
| all_ops = Counter() |
| depths = [] |
| has_power = 0 |
| has_nested_trig = 0 |
|
|
| for expr in valid_exprs: |
| expr_str = expr["expression"] |
|
|
| |
| ops = count_operators(expr_str) |
| for op, count in ops.items(): |
| all_ops[op] += count |
|
|
| |
| if ops.get('pow', 0) > 0: |
| has_power += 1 |
|
|
| |
| if 'sin(sin' in expr_str or 'sin(cos' in expr_str or 'cos(sin' in expr_str or 'cos(cos' in expr_str: |
| has_nested_trig += 1 |
|
|
| |
| depth = max_nesting_depth(expr_str) |
| depths.append(depth) |
|
|
| print("GENERATED VALID EXPRESSIONS STATISTICS:") |
| print(f" Total valid: {len(valid_exprs)}") |
| print(f" With power operations: {has_power} ({100*has_power/len(valid_exprs):.1f}%)") |
| print(f" With nested trig functions: {has_nested_trig} ({100*has_nested_trig/len(valid_exprs):.1f}%)") |
| print(f" Average nesting depth: {sum(depths)/len(depths):.2f}") |
| print(f" Max nesting depth: {max(depths)}") |
| print() |
|
|
| print("OPERATOR USAGE:") |
| for op, count in sorted(all_ops.items(), key=lambda x: -x[1])[:10]: |
| print(f" {op:6s}: {count:4d} times") |
| print() |
|
|
| |
| print("="*80) |
| print("EXPRESSIONS WITH POWER OPERATIONS (closest to target):") |
| print("="*80) |
| print() |
| power_exprs = [e for e in valid_exprs if 'pow' in e["expression"] or '**' in e["expression"]] |
| if power_exprs: |
| for i, expr in enumerate(power_exprs[:10], 1): |
| print(f"{i:2d}. R2={expr['r2']:7.4f} | {expr['expression']}") |
| else: |
| print(" No expressions with power operations found!") |
| print() |
|
|
| |
| print("="*80) |
| print("EXPRESSIONS WITH NESTED TRIGONOMETRIC FUNCTIONS:") |
| print("="*80) |
| print() |
| nested_trig = [e for e in valid_exprs if 'sin(sin' in e["expression"] or 'sin(cos' in e["expression"] or 'cos(sin' in e["expression"] or 'cos(cos' in e["expression"]] |
| if nested_trig: |
| for i, expr in enumerate(nested_trig[:10], 1): |
| print(f"{i:2d}. R2={expr['r2']:7.4f} | {expr['expression']}") |
| else: |
| print(" No expressions with nested trig functions found!") |
|
|
| if __name__ == "__main__": |
| main() |
|
|