#![allow(missing_docs)]
use burn_tensor::quantization::QuantizationScheme;
use cubecl::prelude::*;
#[derive(CubeLaunch)]
pub struct QParams {
#[cube(comptime)]
scheme: QuantizationScheme,
}
pub type QTensor = Array<Line<u32>>;
#[cube]
impl QParams {
pub fn new(scheme: QuantizationScheme) -> Self {
QParams { scheme }
}
pub fn values(&self, tensor: &QTensor) -> (f32, i32) {
let len = tensor.len();
match comptime!(self.scheme) {
QuantizationScheme::PerTensorAffine(_) => match comptime!(tensor.line_size()) {
1 => (
f32::bitcast_from(tensor[len - 1][tensor.line_size() - 1]),
i32::cast_from(tensor[len - 2][tensor.line_size() - 1]),
),
_ => {
let values = tensor[len - 1];
(
f32::bitcast_from(values[tensor.line_size() - 1]),
i32::cast_from(values[tensor.line_size() - 2]),
)
}
},
QuantizationScheme::PerTensorSymmetric(_) => (
f32::bitcast_from(tensor[len - 1][tensor.line_size() - 1]),
0,
),
}
}
}