hbutils.algorithm.linear
Piecewise linear mapping utilities.
This module provides utilities for creating multi-staged linear gradient mappings
based on float numbers. It exposes a single public factory function,
linear_map(), which builds a callable piecewise linear mapping from
control points. Control points can be specified as a sequence of y-values with
automatic x-spacing or as explicit (x, y) tuples.
The module contains the following main components:
linear_map()- Create a callable piecewise linear mapping function
Note
When using implicit x-spacing (a sequence of y-values), at least two points
are required. A single point causes a ZeroDivisionError because the
spacing denominator becomes zero.
Example:
>>> from hbutils.algorithm.linear import linear_map
>>> # Implicit x-spacing over [0, 1]
>>> f = linear_map((0.0, 1.0, 0.5))
>>> f(0.5)
1.0
>>> # Explicit x-coordinates
>>> g = linear_map(((-0.2, 0.0), (0.7, 1.0), (1.1, 0.5)))
>>> g(0.7)
1.0
__all__
- hbutils.algorithm.linear.__all__ = ['linear_map']
Built-in mutable sequence.
If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.
linear_map
- hbutils.algorithm.linear.linear_map(points: Sequence[float] | Sequence[Tuple[float, float]]) Callable[[float], float][source]
Create a multiple-staged linear gradient calculation function based on control points.
This function generates a piecewise linear mapping function from a sequence of control points. The points can be specified in two ways:
Simple sequence of y-values: x-values are automatically distributed evenly from 0 to 1. The spacing uses
i / (n - 1), so at least two points are required.Sequence of
(x, y)tuples: explicit x and y coordinates for each control point.
The returned callable performs linear interpolation between the neighboring control points. If explicit tuples are supplied, the order check uses Python’s tuple ordering, which requires the sequence of tuples to be strictly increasing lexicographically (typically implying strictly increasing x-values; if x-values are equal, the y-values must be strictly increasing).
- Parameters:
points (Union[Sequence[float], Sequence[Tuple[float, float]]]) – Points for this linear mapping. If the sequence consists of float numbers, it will be seen as the simple linear mapping with x-values automatically distributed from 0 to 1. If the elements are binary tuples (contains 2 float numbers), it means the x-range is assigned explicitly.
- Returns:
A callable function for linear mapping that takes a float x-value and returns the interpolated y-value.
- Return type:
Callable[[float], float]
- Raises:
AssertionError – If
pointsis empty or if the control points are not strictly increasing under tuple ordering.ZeroDivisionError – If
pointscontains a single y-value, causing the implicit x-spacing denominator to be zero.TypeError – If
pointsis not iterable or contains elements incompatible with the expected formats.ValueError – If the input x-value to the returned function is outside the valid range.
- Examples::
Simple Linear Mapping
>>> from hbutils.algorithm import linear_map >>> >>> f = linear_map((0, 1, 0.5)) >>> f(0) 0.0 >>> f(0.25) 0.5 >>> f(1 / 3) 0.6666666666666666 >>> f(0.5) 1.0 >>> f(2 / 3) 0.8333333333333334 >>> f(0.75) 0.75 >>> f(1) 0.5
Complex Linear Mapping (x values are customized)
>>> f = linear_map(((-0.2, 0), (0.7, 1), (1.1, 0.5))) >>> f(-0.2) 0.0 >>> f(0) 0.22222222222222227 >>> f(0.25) 0.5000000000000001 >>> f(1 / 3) 0.5925925925925927 >>> f(0.5) 0.7777777777777778 >>> f(2 / 3) 0.9629629629629631 >>> f(0.7) 1.0 >>> f(0.75) 0.9375 >>> f(0.8) 0.875 >>> f(1) 0.625 >>> f(1.1) 0.5