Files
local-deep-research/examples/optimization/example_quick_optimization.py
LearningCircuit 653707a556 fix(encoding): add encoding="utf-8" to bare open() / read_text / write_text in examples and scripts (#4118)
Cleanup follow-up to #3797. The check-open-encoding hook was originally scoped
with exclude: ^(tests/|examples/|scripts/) because those directories had ~45
pre-existing bare open() calls and addressing them was out of scope for the
core Windows bug fix.

This commit:
  * adds encoding="utf-8" to 45 read/write call sites under examples/ and
    scripts/ — JSON benchmark results, config-doc generators, workflow
    status pages, and the datetime-timezone pre-commit hook
  * narrows the hook exclude to ^tests/ only, so future regressions in
    examples/scripts/ are blocked at commit time

Windows users running the benchmark scripts and config-doc generator would
previously hit silent failures or UnicodeDecodeErrors on non-ASCII content
under cp1252. The package itself was already protected by #3797.
2026-05-18 21:45:04 +02:00

283 lines
7.9 KiB
Python

# example_quick_optimization.py - Simplified Demo
"""
Simplified parameter optimization demo for Local Deep Research.
This script demonstrates basic parameter optimization with simulated results.
Usage:
# Install dependencies with PDM
cd /path/to/local-deep-research
pdm install
# Run the script with PDM
pdm run python examples/optimization/example_quick_optimization.py
"""
import json
import random
import time
from datetime import datetime, UTC
from pathlib import Path
from typing import Any, Dict, Tuple
from loguru import logger
# Loguru automatically handles logging configuration
def simulate_optimization(
param_space: Dict[str, Any],
n_trials: int = 5,
metric_weights: Dict[str, float] = None,
) -> Tuple[Dict[str, Any], float]:
"""
Simulate an optimization process without actually running benchmarks.
This is just for demonstration purposes.
Args:
param_space: Dictionary defining parameter search spaces
n_trials: Number of simulated trials
metric_weights: Weights for quality vs speed metrics
Returns:
Tuple of (best_parameters, best_score)
"""
if metric_weights is None:
metric_weights = {"quality": 0.5, "speed": 0.5}
logger.info(f"Starting simulated optimization with {n_trials} trials")
logger.info(f"Parameter space: {param_space}")
logger.info(f"Metric weights: {metric_weights}")
# Generate random trials
best_score = 0.0
best_params = {}
for i in range(n_trials):
# Generate random parameters
params = {}
for param_name, param_config in param_space.items():
if param_config.get("type") == "int":
params[param_name] = random.randint(
param_config.get("low", 1), param_config.get("high", 5)
)
elif param_config.get("type") == "categorical":
params[param_name] = random.choice(
param_config.get("choices", ["standard"])
)
logger.info(f"Trial {i}: Testing parameters: {params}")
# Simulate execution delay
time.sleep(1)
# Simulate metrics calculation
quality_score = random.uniform(0.5, 0.9) # Random quality score
speed_score = 1.0 - (
params.get("iterations", 1) * 0.1
) # More iterations = slower
# Calculate weighted score
combined_score = quality_score * metric_weights.get(
"quality", 0.5
) + speed_score * metric_weights.get("speed", 0.5)
logger.info(
f"Trial {i}: Quality: {quality_score:.2f}, Speed: {speed_score:.2f}, Score: {combined_score:.2f}"
)
# Update best parameters if this trial is better
if combined_score > best_score:
best_score = combined_score
best_params = params.copy()
logger.info(
f"New best parameters found: {best_params} with score: {best_score:.2f}"
)
return best_params, best_score
def optimize_for_speed(
param_space: Dict[str, Any] = None, n_trials: int = 3
) -> Tuple[Dict[str, Any], float]:
"""
Simulate speed-focused optimization.
Args:
param_space: Parameter space definition (optional)
n_trials: Number of trials
Returns:
Tuple of (best_parameters, best_score)
"""
if param_space is None:
param_space = {
"iterations": {
"type": "int",
"low": 1,
"high": 3,
},
"questions_per_iteration": {
"type": "int",
"low": 1,
"high": 3,
},
"search_strategy": {
"type": "categorical",
"choices": ["rapid", "parallel"],
},
}
# Speed-focused weights
metric_weights = {
"speed": 0.8,
"quality": 0.2,
}
return simulate_optimization(
param_space=param_space,
n_trials=n_trials,
metric_weights=metric_weights,
)
def optimize_for_quality(
param_space: Dict[str, Any] = None, n_trials: int = 3
) -> Tuple[Dict[str, Any], float]:
"""
Simulate quality-focused optimization.
Args:
param_space: Parameter space definition (optional)
n_trials: Number of trials
Returns:
Tuple of (best_parameters, best_score)
"""
if param_space is None:
param_space = {
"iterations": {
"type": "int",
"low": 1,
"high": 5,
},
"questions_per_iteration": {
"type": "int",
"low": 1,
"high": 5,
},
"search_strategy": {
"type": "categorical",
"choices": ["standard", "iterdrag", "source_based"],
},
}
# Quality-focused weights
metric_weights = {
"quality": 0.9,
"speed": 0.1,
}
return simulate_optimization(
param_space=param_space,
n_trials=n_trials,
metric_weights=metric_weights,
)
def main():
# Create timestamp for unique output directory
timestamp = datetime.now(UTC).strftime("%Y%m%d_%H%M%S")
output_dir = str(
Path("examples")
/ "optimization"
/ "results"
/ f"optimization_demo_{timestamp}"
)
Path(output_dir).mkdir(parents=True, exist_ok=True)
print(
f"Starting quick optimization demo - results will be saved to {output_dir}"
)
# Create a simple parameter space for demonstration
param_space = {
"iterations": {
"type": "int",
"low": 1,
"high": 3,
},
"questions_per_iteration": {
"type": "int",
"low": 1,
"high": 3,
},
"search_strategy": {
"type": "categorical",
"choices": ["rapid", "standard", "iterdrag"],
},
}
# Run a balanced optimization
print("\n=== Running balanced optimization simulation ===")
balanced_params, balanced_score = simulate_optimization(
param_space=param_space,
n_trials=4,
metric_weights={"quality": 0.6, "speed": 0.4},
)
print(f"Best balanced parameters: {balanced_params}")
print(f"Best balanced score: {balanced_score:.4f}")
# Run a speed optimization
print("\n=== Running speed-focused optimization simulation ===")
speed_params, speed_score = optimize_for_speed(n_trials=3)
print(f"Best speed parameters: {speed_params}")
print(f"Best speed score: {speed_score:.4f}")
# Run a quality optimization
print("\n=== Running quality-focused optimization simulation ===")
quality_params, quality_score = optimize_for_quality(n_trials=3)
print(f"Best quality parameters: {quality_params}")
print(f"Best quality score: {quality_score:.4f}")
# Save results
summary = {
"timestamp": timestamp,
"balanced": {
"parameters": balanced_params,
"score": float(balanced_score),
},
"speed": {"parameters": speed_params, "score": float(speed_score)},
"quality": {
"parameters": quality_params,
"score": float(quality_score),
},
}
with open(
Path(output_dir) / "optimization_summary.json", "w", encoding="utf-8"
) as f:
json.dump(summary, f, indent=2)
print(
f"\nDemo complete! Results saved to {output_dir}/optimization_summary.json"
)
print("\nRecommended parameters:")
print(f"- For balanced performance: {balanced_params}")
print(f"- For speed: {speed_params}")
print(f"- For quality: {quality_params}")
print(
"\nNote: This is a simulation for demonstration purposes only. Real optimization"
)
print(
"would run actual benchmarks with these parameters to evaluate performance."
)
if __name__ == "__main__":
main()