| import math |
|
|
| from .linalg import Vector, mean |
|
|
|
|
| def quantize_vector_absmean( |
| values: Vector, |
| *, |
| threshold: float = 0.5, |
| ) -> tuple[float, list[int]]: |
| if not values: |
| return 1.0, [] |
|
|
| scale = mean([abs(value) for value in values]) |
| if scale == 0.0: |
| return 1.0, [0 for _ in values] |
|
|
| quantized: list[int] = [] |
| for value in values: |
| normalized = value / scale |
| if normalized >= threshold: |
| quantized.append(1) |
| elif normalized <= -threshold: |
| quantized.append(-1) |
| else: |
| quantized.append(0) |
| return scale, quantized |
|
|
|
|
| def derive_ternary_mask_from_states(states: list[Vector]) -> tuple[float, list[int]]: |
| if not states: |
| return 1.0, [] |
| feature_count = len(states[0]) |
| feature_energy = [ |
| mean([state[feature] * state[feature] for state in states]) |
| for feature in range(feature_count) |
| ] |
| return derive_ternary_mask_from_feature_energy(feature_energy) |
|
|
|
|
| def derive_ternary_mask_from_feature_energy( |
| feature_energy: Vector, |
| *, |
| threshold: float = 0.02, |
| ) -> tuple[float, list[int]]: |
| if not feature_energy: |
| return 1.0, [] |
|
|
| rms_values = [math.sqrt(max(value, 0.0)) for value in feature_energy] |
| scale = mean(rms_values) |
| if scale == 0.0: |
| return 1.0, [0 for _ in feature_energy] |
|
|
| mask = [1 if value >= threshold * scale else 0 for value in rms_values] |
| if not any(mask): |
| mask = [1 for _ in feature_energy] |
| return 1.0, mask |
|
|
|
|
| def apply_ternary_mask(values: Vector, mask: list[int], scale: float) -> Vector: |
| if not mask: |
| return values[:] |
| return [scale * mask[index] * values[index] for index in range(len(values))] |
|
|