Source code for coreai_opt.pruning.spec.spec

# Copyright 2026 Apple Inc.
#
# Use of this source code is governed by a BSD-3-Clause license that can
# be found in the LICENSE file or at https://opensource.org/licenses/BSD-3-Clause

"""Pruning specification."""

from __future__ import annotations

from typing import Annotated, Any

from pydantic import BeforeValidator, Field, PrivateAttr, field_validator, model_validator

from coreai_opt.common import CompressionType
from coreai_opt.config.spec import CompressionSpec

from .prune import PruneImplBase
from .scheme import PruningScheme, Unstructured


[docs] class PruningSpec(CompressionSpec): """Specification for pruning tensors. Attributes: target_sparsity (float): Fraction of elements to prune, in ``[0, 1]``. Default: 0.5. pruning_scheme (PruningScheme): Structural pattern of sparsity. Default: ``Unstructured()``. pruning_algo (type[PruneImplBase]): Pruning implementation class. Default: ``"default"`` (magnitude-based pruning). Example: >>> spec = PruningSpec() >>> spec.target_sparsity 0.5 >>> spec = PruningSpec(target_sparsity=0.75) """ _compression_type: CompressionType = PrivateAttr(default=CompressionType.PRUNING) target_sparsity: float = Field(default=0.5, ge=0.0, le=1.0) pruning_scheme: Annotated[ PruningScheme, BeforeValidator(PruningScheme.maybe_build_from_dict), ] = Field(default_factory=Unstructured) pruning_algo: type[PruneImplBase] = Field(default="default", validate_default=True) @field_validator("pruning_algo", mode="before") @classmethod def convert_pruning_algo(cls, data: Any) -> type[PruneImplBase]: """Resolve string keys to registered pruning implementation classes.""" return PruneImplBase.resolve(data) @model_validator(mode="before") @classmethod def _strip_computed_fields(cls, data: Any) -> Any: """Strip computed fields when deserializing from dict for round-trip support.""" if isinstance(data, dict): declared = set(cls.model_fields.keys()) return {k: v for k, v in data.items() if k in declared} return data
[docs] def default_weight_pruning_spec() -> PruningSpec: """Return the default pruning spec for weight tensors.""" return PruningSpec( target_sparsity=0.5, pruning_scheme=Unstructured(), pruning_algo="default", )