tensormesh.optimizer

OC Optimizer

class OCOptimizer(params: Tensor | List[Tensor], vf: float, move_limit: float = 0.2, rho_min: float = 1e-3, rho_max: float = 1.0, eta: float = 0.5, bisection_tol: float = 1e-4, bisection_max_iter: int = 50)[源代码]

基类:object

Optimality Criteria (OC) optimizer for topology optimization.

Similar interface to torch.optim.Optimizer, but specifically designed for density-based topology optimization with volume constraints.

The OC update rule is:

\[\rho_{\text{new}} = \rho \cdot B_e^{\eta}\]

where:

\[B_e = \sqrt{\frac{-\frac{\partial C}{\partial \rho}}{\lambda \cdot \frac{\partial V}{\partial \rho}}}\]
  • \(\lambda\): Lagrange multiplier (found by bisection to satisfy volume constraint)

  • \(\eta = 0.5\): damping exponent

参数:
  • params (Tensor or List[Tensor]) -- Tensor or list of tensors (design variables)

  • vf (float) -- Target volume fraction

  • move_limit (float, optional) -- Maximum density change per iteration default: 0.2

  • rho_min (float, optional) -- Minimum density default: 1e-3

  • rho_max (float, optional) -- Maximum density default: 1.0

  • eta (float, optional) -- Damping exponent default: 0.5

  • bisection_tol (float, optional) -- Tolerance for bisection default: 1e-4

  • bisection_max_iter (int, optional) -- Maximum bisection iterations default: 50

示例

optimizer = OCOptimizer(rho, vf=0.5, move_limit=0.2)

for epoch in range(max_iter):
    # Forward pass and compute compliance
    compliance = compute_compliance(rho)

    # Backward pass
    compliance.backward()

    # OC update
    optimizer.step(rho.grad)
    optimizer.zero_grad()
__init__(params: Tensor | List[Tensor], vf: float, move_limit: float = 0.2, rho_min: float = 1e-3, rho_max: float = 1.0, eta: float = 0.5, bisection_tol: float = 1e-4, bisection_max_iter: int = 50)[源代码]
zero_grad()[源代码]

Clear gradients of all parameters.

step(dc: Tensor | None = None, dv: Tensor | None = None)[源代码]

Perform one OC update step.

If dc is omitted, uses each parameter's gradient (negative for compliance minimization). If dv is omitted, uses a uniform volume sensitivity. Returns a dict with keys lambda and volume.

get_volume()[源代码]

Get current volume fraction.

get_stats()[源代码]

Get optimizer statistics.