optimize.Optimization
optimize.Optimization(
name,
objective=None,
of=None,
study=None,
metric=None,
*,
regularizer=None,
regularizer_weight=0.0,
remesh_every=None,
gradient_path=GradientPath.DIRECT,
steps=30,
learning_rate=0.05,
method=OptimizerMethod.ADAM,
precision=Precision.SINGLE,
)
Declarative gradient-based optimization of a scene’s free parameters.
Attributes
| Name | Type | Description |
|---|---|---|
| name | str | Optimization identifier (unique within a scene program). |
| objective | Callable[[dict[str, Any]], Any] | None | Callable (params: dict) -> scalar — a JAX-traceable function of the free-parameter dict, minimized by :meth:run (objective form; leave None for the study form). |
| of | Any | The scene object whose FREE parameters are optimized (anything :func:cadjoint.extract_parameters accepts; objective form only). |
| study | Any | A declared :class:~cadjoint.fem.study.ThermalStudy / :class:~cadjoint.fem.study.ElasticStudy (or its name) whose solved field the run minimizes (study form; mutually exclusive with objective/of). |
| metric | ObjectiveMetricLike | None | Study-form objective — a :class:~cadjoint.enums.ObjectiveMetric or its plain string spelling: "mean" or "max" of the result’s objective scalar (temperature / displacement magnitude), or "compliance" (traction work, twice the strain energy; elastic studies only). |
| regularizer | Callable[[dict[str, Any]], Any] | None | Optional callable (params: dict) -> scalar added to the study metric as regularizer_weight * regularizer, e.g. a smoothed material volume (study form, keyword-only). |
| regularizer_weight | float | Weight of the regularizer term (keyword-only). |
| remesh_every | int | None | Study form: re-extract the frozen mesh topology at the current design every this many steps (0: never; default 6). In between, only node positions move — differentiably. |
| gradient_path | GradientPathLike | Study form: how the design->points derivative is carried per step (keyword-only) — a :class:~cadjoint.enums.GradientPath or its plain string spelling, normalised on construction. "direct" (default) is the validated frozen-topology path — node positions Newton re-projected onto the true SDF, solved in-process. "tesseract" runs the packaged two-tesseract chain instead (lattice samples -> mesher tesseract with its surface-interpolation VJP -> solver tesseract adjoint); it meshes the trilinear interpolant of the samples, so it can need a finer lattice than the direct path and its gradient carries only normal boundary motion (measured in research/tet-vs-hex.md). "tesseract-dc" is the narrow cut: dual contouring stays in JAX on the true SDF and only TetGen is wrapped (tetfill tesseract, exact pass-through VJP on the vertices -Y preserves), so it meshes the same geometry the direct path does — tet SimMesh only. Both chain paths resolve each stage through :mod:cadjoint.plugins, so where the mesher and the solver actually run is configuration (plugins.toml). Both require the tesseract extra. The final reported result is always evaluated on the direct path. |
| steps | int | Default number of optimizer steps (keyword-only). |
| learning_rate | float | Optimizer step size (keyword-only). |
| method | OptimizerMethodLike | A :class:~cadjoint.enums.OptimizerMethod or its plain string spelling — "adam" (default) or "sgd" (keyword-only). Runs through optax; plain gradient descent when optax is missing. |
| precision | PrecisionLike | A :class:~cadjoint.enums.Precision or its plain string spelling, "single" (default) or "double" (keyword-only). "double" holds jax_enable_x64 for the whole of :meth:run and restores it afterwards. An objective whose solver needs float64 needs this, and a scope inside the solver is not enough: :func:cadjoint.flow.precision.double_precision covers the forward pass, but :func:jax.grad runs the transposed pass after that scope has closed, and a float32 process cannot then materialise the float64 intermediates the forward built (lax.dynamic_update_slice requires arguments to have the same dtypes, got float32, float64). Declaring it here rather than flipping the flag at a scene’s module scope is what keeps the scene itself float32 for the WGSL shader, which has no f64 – so a scene carrying a flow optimization still opens in the viewer, and the viewer can still run it. |
Methods
| Name | Description |
|---|---|
| describe | JSON-ready payload: everything the viewer needs to display it. |
| run | Minimize the objective over the target’s free parameters. |
| study_target | The object whose free parameters a study-backed run optimizes. |
describe
optimize.Optimization.describe(scene=None)
JSON-ready payload: everything the viewer needs to display it.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| scene | Any | Optional scene object; lets a study-backed optimization whose study meshes the whole scene report the scene’s free parameters (the compile worker passes it). | None |
run
optimize.Optimization.run(steps=None, callback=None, *, scene=None)
Minimize the objective over the target’s free parameters.
Pure reverse-mode differentiation (:func:jax.value_and_grad) through the objective. Objective-form runs never touch the scene object; study-backed runs restore the target’s original parameter values before returning (topology refreezes write the candidate design into the target while extracting) — the returned run carries the optimized values either way.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| steps | int | None | Number of optimizer steps (default: the declared steps). |
None |
| callback | Optional callback(record) invoked with each history record as it is produced. |
None |
|
| scene | Any | Study form only — the scene object the study meshes, required when neither the study nor its SimMesh declares a domain (keyword-only; ignored by the objective form). |
None |
Returns
| Name | Type | Description |
|---|---|---|
| OptimizationRun | The finished :class:OptimizationRun. Study-backed runs also |
|
| OptimizationRun | carry the final design’s concrete result, solved on a |
|
| OptimizationRun | freshly extracted mesh. |
Raises
| Name | Type | Description |
|---|---|---|
| ValueError | When the target has no free parameters, the objective (or its gradient) leaves the finite range, or a study-backed run cannot resolve its target. |
study_target
optimize.Optimization.study_target(scene=None)
The object whose free parameters a study-backed run optimizes.
The study’s meshed domain when it declares one (on its SimMesh or on the study itself); otherwise the scene the caller supplies — the same field the study would mesh at solve time. None when neither is available (describe degrades, run raises). Callers that write optimized values back (apply_parameters) write them here. Only defined for a study-backed optimization (study= given).