use super::{Param, Reparameterization};
use crate as burn;
use crate::module::Module;
use burn_tensor::Tensor;
#[derive(Debug, Module)]
pub struct LoraAdapter {
pub a: Param<Tensor<2>>,
pub b: Param<Tensor<2>>,
pub scale: f64,
}
impl Reparameterization for LoraAdapter {
const NAME: &'static str = "lora";
fn materialize<const D: usize>(&self, base: Tensor<D>) -> Tensor<D> {
let delta = self.delta().reshape(base.shape());
base + delta
}
}
impl LoraAdapter {
pub fn delta(&self) -> Tensor<2> {
self.a.val().matmul(self.b.val()).mul_scalar(self.scale)
}
}