Squashed 'core/' content from commit 4957443
git-subtree-dir: core git-subtree-split: 4957443184ae0eb6323635a90a19acffb3e01d07
This commit is contained in:
93
examples/test_plan.py
Executable file
93
examples/test_plan.py
Executable file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test the planning phase locally.
|
||||
|
||||
This tests the new human-readable names and multi-output support
|
||||
without requiring actual video files or execution.
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add artdag to path
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from artdag.planning import RecipePlanner, Recipe, ExecutionPlan
|
||||
|
||||
|
||||
def main():
|
||||
# Load recipe
|
||||
recipe_path = Path(__file__).parent / "simple_sequence.yaml"
|
||||
if not recipe_path.exists():
|
||||
print(f"Recipe not found: {recipe_path}")
|
||||
return 1
|
||||
|
||||
recipe = Recipe.from_file(recipe_path)
|
||||
print(f"Recipe: {recipe.name} v{recipe.version}")
|
||||
print(f"Nodes: {len(recipe.nodes)}")
|
||||
print()
|
||||
|
||||
# Fake input hash (would be real content hash in production)
|
||||
fake_input_hash = hashlib.sha3_256(b"fake video content").hexdigest()
|
||||
input_hashes = {"video": fake_input_hash}
|
||||
|
||||
print(f"Input: video -> {fake_input_hash[:16]}...")
|
||||
print()
|
||||
|
||||
# Generate plan
|
||||
planner = RecipePlanner(use_tree_reduction=True)
|
||||
plan = planner.plan(
|
||||
recipe=recipe,
|
||||
input_hashes=input_hashes,
|
||||
seed=42, # Optional seed for reproducibility
|
||||
)
|
||||
|
||||
print("=== Generated Plan ===")
|
||||
print(f"Plan ID: {plan.plan_id[:24]}...")
|
||||
print(f"Plan Name: {plan.name}")
|
||||
print(f"Recipe Name: {plan.recipe_name}")
|
||||
print(f"Output: {plan.output_name}")
|
||||
print(f"Steps: {len(plan.steps)}")
|
||||
print()
|
||||
|
||||
# Show steps by level
|
||||
steps_by_level = plan.get_steps_by_level()
|
||||
for level in sorted(steps_by_level.keys()):
|
||||
steps = steps_by_level[level]
|
||||
print(f"Level {level}: {len(steps)} step(s)")
|
||||
for step in steps:
|
||||
# Show human-readable name
|
||||
name = step.name or step.step_id[:20]
|
||||
print(f" - {name}")
|
||||
print(f" Type: {step.node_type}")
|
||||
print(f" Cache ID: {step.cache_id[:16]}...")
|
||||
if step.outputs:
|
||||
print(f" Outputs: {len(step.outputs)}")
|
||||
for out in step.outputs:
|
||||
print(f" - {out.name} ({out.media_type})")
|
||||
if step.inputs:
|
||||
print(f" Inputs: {[inp.name for inp in step.inputs]}")
|
||||
print()
|
||||
|
||||
# Save plan for inspection
|
||||
plan_path = Path(__file__).parent.parent / "test_plan_output.json"
|
||||
with open(plan_path, "w") as f:
|
||||
f.write(plan.to_json())
|
||||
print(f"Plan saved to: {plan_path}")
|
||||
|
||||
# Show plan JSON structure
|
||||
print()
|
||||
print("=== Plan JSON Preview ===")
|
||||
plan_dict = json.loads(plan.to_json())
|
||||
# Show first step as example
|
||||
if plan_dict.get("steps"):
|
||||
first_step = plan_dict["steps"][0]
|
||||
print(json.dumps(first_step, indent=2)[:500] + "...")
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user