source_graph/source_canon_id for before state, result_graph/result_coloring/result_canon_id for after state.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace iterative tutte_embedding in lib with numpy direct-solve version from example.py
- Import tutte_embedding into example.py from lib instead of defining it locally
- Fix g._embedding -> g.get_embedding() in outer_face
- Add bash completion to run.sh alongside existing zsh completion
- Use nix-shell -p gcc for plantri build step on NixOS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces is_planar(set_embedding=True) calls in pluck and squish so the embedding
stays consistent with inherited positions across reduction steps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds outer face detection via face traversal and signed area, Tutte embedding
for clean planar layouts, and moves g/g_prime/coloring_prime into base Operation
type. Pluck and squish now carry positions and recompute embeddings via is_planar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>