Files
torus-ml/docs/references/api/torus.ml.quantization.base_quantized_op.md
zeekay e037e8f7ea torus: one name for the package, and it is ours
The distribution called itself torus-ml while shipping a package directory
named concrete, so the name a user installs and the name they import disagreed
— and most of the tree already said torus.ml, which could not resolve against
src/concrete. Moved src/concrete to src/torus and pointed the include at it.

The dependency was Zama's concrete-python from their index. It is torus-fhe
from ours, which is what luxfhe/torus already ships: that frontend declares
torus-fhe and ships a torus/fhe module, so every 'from torus.fhe' in this tree
was already naming our compiler and only the dependency lagged.

Two distributions share one namespace, which is the shape the upstream this
forked from used and the reason the split works: torus-fhe gives torus.fhe,
torus-ml gives torus.ml.

Swept every other spelling — identifiers, enum members, workflow variables,
filenames, notebooks. LICENSE and NOTICE keep the upstream attribution a fork
owes; the figures carry the old name in JPEG metadata a text sweep cannot
reach.
2026-08-27 13:20:50 -07:00

30 KiB

module torus.ml.quantization.base_quantized_op

Base Quantized Op class that implements quantization for a float numpy op.

Global Variables

  • ONNX_OPS_TO_NUMPY_IMPL
  • ALL_QUANTIZED_OPS
  • ONNX_OPS_TO_QUANTIZED_IMPL
  • DEFAULT_MODEL_BITS

class QuantizedOp

Base class for quantized ONNX ops implemented in numpy.

Args:

  • n_bits_output (int): The number of bits to use for the quantization of the output
  • op_instance_name (str): The name that should be assigned to this operation, used to retrieve it later or get debugging information about this op (bit-width, value range, integer intermediary values, op-specific error messages). Usually this name is the same as the ONNX operation name for which this operation is constructed.
  • int_input_names (Set[str]): The set of names of integer tensors that are inputs to this op
  • constant_inputs (Optional[Union[Dict[str, Any], Dict[int, Any]]]): The constant tensors that are inputs to this op
  • input_quant_opts (QuantizationOptions): Input quantizer options, determine the quantization that is applied to input tensors (that are not constants)

method __init__

__init__(
    n_bits_output: int,
    op_instance_name: str,
    int_input_names: Optional[Set[str]] = None,
    constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
    input_quant_opts: Optional[QuantizationOptions] = None,
    **attrs
) → None

property int_input_names

Get the names of encrypted integer tensors that are used by this op.

Returns:

  • Set[str]: the names of the tensors

method calibrate

calibrate(*inputs: Union[QuantizedArray, ndarray]) → ndarray

Create corresponding QuantizedArray for the output of the activation function.

Args:

  • *inputs (numpy.ndarray): Calibration sample inputs.

Returns:

  • numpy.ndarray: the output values for the provided calibration samples.

method calibrate_analytical_output

calibrate_analytical_output(*inputs: QuantizedArray) → UniformQuantizer

Calibrate output quantization based on analytical formulas.

Args:

  • *inputs (QuantizedArray): quantized operation inputs. Quantized weights are storea in the op instance

Raises:

  • AssertionError: if the operation does not support analytical calibration

method call_impl

call_impl(*inputs: Optional[ndarray, QuantizedArray], **attrs) → ndarray

Call self.impl to centralize mypy bug workaround.

Args:

  • *inputs (numpy.ndarray): real valued inputs.
  • **attrs: the QuantizedOp attributes.

Returns:

  • numpy.ndarray: return value of self.impl

method can_fuse

can_fuse() → bool

Determine if the operator impedes graph fusion.

This function shall be overloaded by inheriting classes to test self._int_input_names, to determine whether the operation can be fused to a TLU or not. For example an operation that takes inputs produced by a unique integer tensor can be fused to a TLU. Example: f(x) = x * (x + 1) can be fused. A function that does f(x) = x * (x @ w + 1) can't be fused.

Returns:

  • bool: whether this QuantizedOp instance produces Torus code that can be fused to TLUs

method dump

dump(file: <class 'TextIO'>) → None

Dump itself to a file.

Args:

  • file (TextIO): The file to dump the serialized object into.

method dump_dict

dump_dict() → Dict

Dump itself to a dict.

Returns:

  • metadata (Dict): Dict of serialized objects.

method dumps

dumps() → str

Dump itself to a string.

Returns:

  • metadata (str): String of the serialized object.

method load_dict

load_dict(metadata: Dict)

Load itself from a string.

Args:

  • metadata (Dict): Dict of serialized objects.

Returns:

  • QuantizedOp: The loaded object.

classmethod must_quantize_input

must_quantize_input(input_name_or_idx: int) → bool

Determine if an input must be quantized.

Quantized ops and numpy onnx ops take inputs and attributes. Inputs can be either constant or variable (encrypted). Note that this does not handle attributes, which are handled by QuantizedOp classes separately in their constructor.

Args:

  • input_name_or_idx (int): Index of the input to check.

Returns:

  • result (bool): Whether the input must be quantized (must be a QuantizedArray) or if it stays as a raw numpy.array read from ONNX.

classmethod op_type

op_type()

Get the type of this operation.

Returns:

  • op_type (str): The type of this operation, in the ONNX referential

method prepare_output

prepare_output(qoutput_activation: ndarray) → QuantizedArray

Quantize the output of the activation function.

The calibrate method needs to be called with sample data before using this function.

Args:

  • qoutput_activation (numpy.ndarray): Output of the activation function.

Returns:

  • QuantizedArray: Quantized output.

method q_impl

q_impl(
    *q_inputs: Union[ndarray, QuantizedArray, NoneType, bool, int, float],
    **attrs
) → Union[ndarray, QuantizedArray, NoneType, bool, int, float]

Execute the quantized forward.

Args:

  • *q_inputs (ONNXOpInputOutputType): Quantized inputs.
  • **attrs: the QuantizedOp attributes.

Returns:

  • ONNXOpInputOutputType: The returned quantized value.

classmethod supported_by_linear_backend

supported_by_linear_backend() → bool

Indicate if this op can be executed on the GLWE linear backend.

Returns:

  • bool: True if the op can be executed with GLWE.

class QuantizedOpUnivariateOfEncrypted

An univariate operator of an encrypted value.

This operation is not really operating as a quantized operation. It is useful when the computations get fused into a TLU, as in e.g., Act(x) = x || (x + 42)).

method __init__

__init__(
    n_bits_output: int,
    op_instance_name: str,
    int_input_names: Optional[Set[str]] = None,
    constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
    input_quant_opts: Optional[QuantizationOptions] = None,
    **attrs
) → None

property int_input_names

Get the names of encrypted integer tensors that are used by this op.

Returns:

  • Set[str]: the names of the tensors

method calibrate

calibrate(*inputs: Union[QuantizedArray, ndarray]) → ndarray

Create corresponding QuantizedArray for the output of the activation function.

Args:

  • *inputs (numpy.ndarray): Calibration sample inputs.

Returns:

  • numpy.ndarray: the output values for the provided calibration samples.

method calibrate_analytical_output

calibrate_analytical_output(*inputs: QuantizedArray) → UniformQuantizer

Calibrate output quantization based on analytical formulas.

Args:

  • *inputs (QuantizedArray): quantized operation inputs. Quantized weights are storea in the op instance

Raises:

  • AssertionError: if the operation does not support analytical calibration

method call_impl

call_impl(*inputs: Optional[ndarray, QuantizedArray], **attrs) → ndarray

Call self.impl to centralize mypy bug workaround.

Args:

  • *inputs (numpy.ndarray): real valued inputs.
  • **attrs: the QuantizedOp attributes.

Returns:

  • numpy.ndarray: return value of self.impl

method can_fuse

can_fuse() → bool

Determine if this op can be fused.

This operation can be fused and computed in float when a single integer tensor generates both the operands. For example in the formula: f(x) = x || (x + 1) where x is an integer tensor.

Returns:

  • bool: Can fuse

method dump

dump(file: <class 'TextIO'>) → None

Dump itself to a file.

Args:

  • file (TextIO): The file to dump the serialized object into.

method dump_dict

dump_dict() → Dict

Dump itself to a dict.

Returns:

  • metadata (Dict): Dict of serialized objects.

method dumps

dumps() → str

Dump itself to a string.

Returns:

  • metadata (str): String of the serialized object.

method load_dict

load_dict(metadata: Dict)

Load itself from a string.

Args:

  • metadata (Dict): Dict of serialized objects.

Returns:

  • QuantizedOp: The loaded object.

classmethod must_quantize_input

must_quantize_input(input_name_or_idx: int) → bool

Determine if an input must be quantized.

Quantized ops and numpy onnx ops take inputs and attributes. Inputs can be either constant or variable (encrypted). Note that this does not handle attributes, which are handled by QuantizedOp classes separately in their constructor.

Args:

  • input_name_or_idx (int): Index of the input to check.

Returns:

  • result (bool): Whether the input must be quantized (must be a QuantizedArray) or if it stays as a raw numpy.array read from ONNX.

classmethod op_type

op_type()

Get the type of this operation.

Returns:

  • op_type (str): The type of this operation, in the ONNX referential

method prepare_output

prepare_output(qoutput_activation: ndarray) → QuantizedArray

Quantize the output of the activation function.

The calibrate method needs to be called with sample data before using this function.

Args:

  • qoutput_activation (numpy.ndarray): Output of the activation function.

Returns:

  • QuantizedArray: Quantized output.

method q_impl

q_impl(
    *q_inputs: Union[ndarray, QuantizedArray, NoneType, bool, int, float],
    **attrs
) → Union[ndarray, QuantizedArray, NoneType, bool, int, float]

Execute the quantized forward.

Args:

  • *q_inputs (ONNXOpInputOutputType): Quantized inputs.
  • **attrs: the QuantizedOp attributes.

Returns:

  • ONNXOpInputOutputType: The returned quantized value.

classmethod supported_by_linear_backend

supported_by_linear_backend() → bool

Indicate if this op can be executed on the GLWE linear backend.

Returns:

  • bool: True if the op can be executed with GLWE.

class QuantizedMixingOp

An operator that mixes (adds or multiplies) together encrypted inputs.

Mixing operators cannot be fused to TLUs.

method __init__

__init__(
    *args,
    rounding_threshold_bits: Union[NoneType, int, Dict[str, Union[str, int]]] = None,
    **kwargs
) → None

Initialize quantized ops parameters plus specific parameters.

Args:

  • rounding_threshold_bits (Union[None, int, Dict[str, Union[str, int]]]): if not None, every accumulators in the model are rounded down to the given bits of precision. Can be an int or a dictionary with keys 'method' and 'n_bits', where 'method' is either fhe.Exactness.EXACT or fhe.Exactness.APPROXIMATE, and 'n_bits' is either 'auto' or an int.
  • *args: positional argument to pass to the parent class.
  • **kwargs: named argument to pass to the parent class.

property int_input_names

Get the names of encrypted integer tensors that are used by this op.

Returns:

  • Set[str]: the names of the tensors

method calibrate

calibrate(*inputs: Union[QuantizedArray, ndarray]) → ndarray

Create corresponding QuantizedArray for the output of the activation function.

Args:

  • *inputs (numpy.ndarray): Calibration sample inputs.

Returns:

  • numpy.ndarray: the output values for the provided calibration samples.

method calibrate_analytical_output

calibrate_analytical_output(*inputs: QuantizedArray) → UniformQuantizer

Calibrate output quantization based on analytical formulas.

Args:

  • *inputs (QuantizedArray): quantized operation inputs. Quantized weights are storea in the op instance

Raises:

  • AssertionError: if the operation does not support analytical calibration

method call_impl

call_impl(*inputs: Optional[ndarray, QuantizedArray], **attrs) → ndarray

Call self.impl to centralize mypy bug workaround.

Args:

  • *inputs (numpy.ndarray): real valued inputs.
  • **attrs: the QuantizedOp attributes.

Returns:

  • numpy.ndarray: return value of self.impl

method can_fuse

can_fuse() → bool

Determine if this op can be fused.

Mixing operations cannot be fused since it must be performed over integer tensors and it combines different encrypted elements of the input tensors. Mixing operations are Conv, MatMul, etc.

Returns:

  • bool: False, this operation cannot be fused as it adds different encrypted integers

method cnp_round

cnp_round(
    x: Union[ndarray, Tracer],
    calibrate_rounding: bool,
    rounding_operation_id: Optional[str] = 'single_rounding_op'
) → ndarray

Round the input array to the specified number of bits.

Args:

  • x (Union[numpy.ndarray, fhe.tracing.Tracer]): The input array to be rounded.
  • calibrate_rounding (bool): Whether to calibrate the rounding (compute the lsbs_to_remove).
  • rounding_operation_id (Optional[str]): The identifier for a specific rounding operation in a quantized operation. Used to create and access the lsbs_to_remove value in the dictionary. Defaults to "single_rounding_op" if not provided.

Returns:

  • numpy.ndarray: The rounded array.

method dump

dump(file: <class 'TextIO'>) → None

Dump itself to a file.

Args:

  • file (TextIO): The file to dump the serialized object into.

method dump_dict

dump_dict() → Dict

Dump itself to a dict.

Returns:

  • metadata (Dict): Dict of serialized objects.

method dumps

dumps() → str

Dump itself to a string.

Returns:

  • metadata (str): String of the serialized object.

method load_dict

load_dict(metadata: Dict)

Load itself from a string.

Args:

  • metadata (Dict): Dict of serialized objects.

Returns:

  • QuantizedOp: The loaded object.

method make_output_quant_parameters

make_output_quant_parameters(
    q_values: Union[ndarray, Any],
    scale: float64,
    zero_point: Union[int, float, ndarray]
) → QuantizedArray

Build a quantized array from quantized integer results of the op and quantization params.

Args:

  • q_values (Union[numpy.ndarray, Any]): the quantized integer values to wrap in the QuantizedArray
  • scale (float): the pre-computed scale of the quantized values
  • zero_point (Union[int, float, numpy.ndarray]): the pre-computed zero_point of the q_values

Returns:

  • QuantizedArray: the quantized array that will be passed to the QuantizedModule output.

classmethod must_quantize_input

must_quantize_input(input_name_or_idx: int) → bool

Determine if an input must be quantized.

Quantized ops and numpy onnx ops take inputs and attributes. Inputs can be either constant or variable (encrypted). Note that this does not handle attributes, which are handled by QuantizedOp classes separately in their constructor.

Args:

  • input_name_or_idx (int): Index of the input to check.

Returns:

  • result (bool): Whether the input must be quantized (must be a QuantizedArray) or if it stays as a raw numpy.array read from ONNX.

classmethod op_type

op_type()

Get the type of this operation.

Returns:

  • op_type (str): The type of this operation, in the ONNX referential

method prepare_output

prepare_output(qoutput_activation: ndarray) → QuantizedArray

Quantize the output of the activation function.

The calibrate method needs to be called with sample data before using this function.

Args:

  • qoutput_activation (numpy.ndarray): Output of the activation function.

Returns:

  • QuantizedArray: Quantized output.

method q_impl

q_impl(
    *q_inputs: Union[ndarray, QuantizedArray, NoneType, bool, int, float],
    **attrs
) → Union[ndarray, QuantizedArray, NoneType, bool, int, float]

Execute the quantized forward.

Args:

  • *q_inputs (ONNXOpInputOutputType): Quantized inputs.
  • **attrs: the QuantizedOp attributes.

Returns:

  • ONNXOpInputOutputType: The returned quantized value.

classmethod supported_by_linear_backend

supported_by_linear_backend() → bool

Indicate if this op can be executed on the GLWE linear backend.

Returns:

  • bool: True if the op can be executed with GLWE.