co_design

End-to-end topology + dimensions co-design pipeline.

End-to-end walking mechanism design pipeline.

Connects pylinkage’s topology co-optimization (co_optimize) with leggedsnake’s physics simulation, enabling automatic discovery of both the mechanism topology and its dimensions for optimal walking performance.

Example:

from leggedsnake import (
    DistanceFitness, StrideFitness,
    WalkingDesignSpec, optimize_walking_mechanism,
)

spec = WalkingDesignSpec(
    objectives=[DistanceFitness(duration=10.0, n_legs=4)],
    objective_names=["walking distance"],
    kinematic_prefilter=StrideFitness(),
    max_links=6,
)
result = optimize_walking_mechanism(spec)
for walker, metrics in zip(result.walkers, result.fitness_results):
    print(walker.name, metrics)
class leggedsnake.co_design.WalkingDesignResult(walkers: list[Walker], fitness_results: list[dict[str, FitnessResult]], co_opt_result: Any, spec: WalkingDesignSpec)

Bases: object

Result of a full-stack walking mechanism design run.

Variables:
  • walkers (list[Walker]) – Ranked Walker solutions (best first by primary objective).

  • fitness_results (list[dict[str, FitnessResult]]) – Per-walker fitness results keyed by objective name.

  • co_opt_result (CoOptimizationResult) – Raw co-optimization result with Pareto front and convergence data.

  • spec (WalkingDesignSpec) – The design specification used.

__init__(walkers: list[Walker], fitness_results: list[dict[str, FitnessResult]], co_opt_result: Any, spec: WalkingDesignSpec) None
co_opt_result: Any
fitness_results: list[dict[str, FitnessResult]]
spec: WalkingDesignSpec
walkers: list[Walker]
class leggedsnake.co_design.WalkingDesignSpec(objectives: list[DynamicFitness] = <factory>, objective_names: list[str] | None = None, world_config: WorldConfig | None = None, terrain: TerrainConfig | None = None, n_legs: int = 4, motor_rates: float | dict[str, float] = -4.0, max_links: int = 8, kinematic_prefilter: DynamicFitness | None = None, catalog: TopologyCatalog | None = None, co_opt_config: CoOptimizationConfig | None = None, use_warm_start: bool = False, precision_points: list[tuple[float, float]] | None = None)

Bases: object

Specification for a walking mechanism design problem.

Variables:
  • objectives (list[DynamicFitness]) – Fitness evaluators to optimize (e.g., DistanceFitness).

  • objective_names (list[str] | None) – Human-readable names for objectives.

  • world_config (WorldConfig | None) – Full simulation config. Overrides terrain if both given.

  • terrain (TerrainConfig | None) – Terrain parameters. Ignored when world_config is provided.

  • n_legs (int) – Number of legs for each walker candidate.

  • motor_rates (float | dict[str, float]) – Motor angular velocity.

  • max_links (int) – Maximum linkage complexity to explore in the catalog.

  • kinematic_prefilter (DynamicFitness | None) – Optional fast pre-filter (e.g., StrideFitness).

  • catalog (TopologyCatalog | None) – Topology catalog. None loads the built-in catalog.

  • co_opt_config (CoOptimizationConfig | None) – Co-optimization parameters. None uses defaults.

  • use_warm_start (bool) – If True, run synthesis first to seed the optimizer.

  • precision_points (list[tuple[float, float]] | None) – Target foot-path points for warm-start synthesis.

__init__(objectives: list[DynamicFitness] = <factory>, objective_names: list[str] | None = None, world_config: WorldConfig | None = None, terrain: TerrainConfig | None = None, n_legs: int = 4, motor_rates: float | dict[str, float] = -4.0, max_links: int = 8, kinematic_prefilter: DynamicFitness | None = None, catalog: TopologyCatalog | None = None, co_opt_config: CoOptimizationConfig | None = None, use_warm_start: bool = False, precision_points: list[tuple[float, float]] | None = None) None
catalog: TopologyCatalog | None = None
co_opt_config: CoOptimizationConfig | None = None
kinematic_prefilter: DynamicFitness | None = None
motor_rates: float | dict[str, float] = -4.0
n_legs: int = 4
objective_names: list[str] | None = None
objectives: list[DynamicFitness]
precision_points: list[tuple[float, float]] | None = None
terrain: TerrainConfig | None = None
use_warm_start: bool = False
world_config: WorldConfig | None = None
leggedsnake.co_design.optimize_walking_mechanism(spec: WalkingDesignSpec) WalkingDesignResult

End-to-end walking mechanism design pipeline.

Pipeline stages:

  1. Build WorldConfig from spec (terrain, gravity, etc.).

  2. Wrap each DynamicFitness objective via co_optimize_objective() to match co_optimize()’s minimization contract.

  3. Run warm_start_co_optimization() or co_optimize() (depending on spec.use_warm_start).

  4. Convert Pareto-front solutions to Walker instances via Walker.from_synthesis(), which wraps pylinkage’s Linkage.to_hypergraph() bridge.

  5. Re-evaluate each walker with the original fitness functions to produce full FitnessResult dicts (with metrics and loci).

  6. Rank by primary objective score (highest first).

Parameters:

spec (WalkingDesignSpec) – Complete design specification.

Returns:

Ranked walker solutions with metrics and the raw Pareto front.

Return type:

WalkingDesignResult

Raises:

ValueError – If spec.objectives is empty.