feat: update workspace paths and enhance gitignore

- Updated stablediffusion crate path from "../stable-diffusion-burn" to "./crates/stable-diffusion-burn" for proper workspace resolution
- Enhanced .gitignore to include generated model files (.mpk, .pt, .bin, .safetensors, .ckpt) and user_data directory
- Added Cargo.lock to gitignore with appropriate comment
- Reorganized IDE files section in gitignore for better clarity
- Added newline at end of file for proper formatting
This commit is contained in:
2026-03-05 19:39:14 +01:00
parent 4bb7ca9074
commit 3a67c0979c
1605 changed files with 537032 additions and 2 deletions

View File

@@ -0,0 +1,110 @@
use super::*;
use burn_tensor::Tolerance;
#[test]
fn should_diff_cat() {
let device = Default::default();
let tensor_1 =
TestAutodiffTensor::<2>::from_data([[2.0, -1.0], [5.0, 2.0]], &device).require_grad();
let tensor_2 =
TestAutodiffTensor::<2>::from_data([[5.0, 4.0], [-1.0, 4.0]], &device).require_grad();
let tensor_3 = tensor_1.clone().matmul(tensor_2.clone());
let grads = tensor_3.backward();
let grad_1 = tensor_1.grad(&grads).unwrap();
let grad_2 = tensor_2.grad(&grads).unwrap();
let mut tensor_1_list = Vec::new();
let mut tensor_2_list = Vec::new();
for i in 0..2 {
tensor_1_list.push(tensor_1.clone().slice([i..i + 1]));
tensor_2_list.push(tensor_2.clone().slice([i..i + 1]));
}
let tensor_1_cat = TestAutodiffTensor::cat(tensor_1_list.clone(), 0);
let tensor_2_cat = TestAutodiffTensor::cat(tensor_2_list.clone(), 0);
let tensor_3_cat = tensor_1_cat.clone().matmul(tensor_2_cat.clone());
let grads = tensor_3_cat.backward();
let grad_1_slice_1 = tensor_1.grad(&grads).unwrap().slice([0..1]);
let grad_1_slice_2 = tensor_1.grad(&grads).unwrap().slice([1..2]);
let grad_2_slice_1 = tensor_2.grad(&grads).unwrap().slice([0..1]);
let grad_2_slice_2 = tensor_2.grad(&grads).unwrap().slice([1..2]);
grad_1
.clone()
.slice([0..1])
.to_data()
.assert_approx_eq::<FloatElem>(&grad_1_slice_1.to_data(), Tolerance::default());
grad_1
.slice([1..2])
.to_data()
.assert_approx_eq::<FloatElem>(&grad_1_slice_2.to_data(), Tolerance::default());
grad_2
.clone()
.slice([0..1])
.to_data()
.assert_approx_eq::<FloatElem>(&grad_2_slice_1.to_data(), Tolerance::default());
grad_2
.slice([1..2])
.to_data()
.assert_approx_eq::<FloatElem>(&grad_2_slice_2.to_data(), Tolerance::default());
}
#[test]
fn should_diff_cat_more_than_1_dim() {
let device = Default::default();
let tensor_1 =
TestAutodiffTensor::<2>::from_data([[2.0, -1.0], [5.0, 2.0]], &device).require_grad();
let tensor_2 =
TestAutodiffTensor::<2>::from_data([[5.0, 4.0], [-1.0, 4.0], [4.0, 1.0]], &device)
.require_grad();
// Concat a tensor [2, 2] with another tensor [3, 2] along dim 0.
// The resulting tensor should be [5, 2]
let tensor_3 = TestAutodiffTensor::cat(vec![tensor_1.clone(), tensor_2.clone()], 0);
assert_eq!(tensor_3.dims(), [5, 2]);
let grads = tensor_3.backward();
let grad_1 = tensor_1.grad(&grads).unwrap();
let grad_2 = tensor_2.grad(&grads).unwrap();
assert_eq!(tensor_1.dims(), grad_1.dims());
assert_eq!(tensor_2.dims(), grad_2.dims());
}
#[test]
fn should_slice_grads_correctly_when_some_inputs_not_tracked() {
let device = Default::default();
let tensor_1 = TestAutodiffTensor::<2>::from_data([[1.0]], &device).require_grad(); // tracked
let tensor_2 = TestAutodiffTensor::<2>::from_data([[10.0, 20.0]], &device); // not tracked
let tensor_3 =
TestAutodiffTensor::<2>::from_data([[100.0, 200.0, 300.0]], &device).require_grad(); // tracked
let cat = TestAutodiffTensor::cat(
vec![tensor_1.clone(), tensor_2.clone(), tensor_3.clone()],
1,
);
// Make gradient per column unique so wrong slicing shows up.
let weights = TestAutodiffTensor::<2>::from_data([[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]], &device);
let loss = (cat * weights).sum();
let grads = loss.backward();
let grad_1 = tensor_1.grad(&grads).unwrap();
let grad_3 = tensor_3.grad(&grads).unwrap();
grad_1
.to_data()
.assert_eq(&burn_tensor::TensorData::from([[1.0]]), false);
grad_3
.to_data()
.assert_eq(&burn_tensor::TensorData::from([[4.0, 5.0, 6.0]]), false);
}