(&self, data: crate::utils::tensor_storage::TensorData)
| 415 | /// Convert raw TensorData to a candle Tensor with target dtype/device. |
| 416 | #[inline] |
| 417 | fn materialize(&self, data: crate::utils::tensor_storage::TensorData) -> Result<Tensor> { |
| 418 | let target_device = if self.needs_device_transfer { |
| 419 | &self.device |
| 420 | } else { |
| 421 | &Device::Cpu |
| 422 | }; |
| 423 | |
| 424 | // Fast path: F32 storage → F32 target, zero-copy via Vec ownership transfer |
| 425 | if data.dtype == DType::F32 && self.dtype == DType::F32 { |
| 426 | let f32_data = Self::bytes_to_f32_vec(data.bytes); |
| 427 | return Tensor::from_vec(f32_data, &*data.shape, target_device); |
| 428 | } |
| 429 | |
| 430 | let tensor = if data.dtype == self.dtype { |
| 431 | Tensor::from_raw_buffer(&data.bytes, data.dtype, &data.shape, target_device)? |
| 432 | } else { |
| 433 | let tensor = Tensor::from_raw_buffer(&data.bytes, data.dtype, &data.shape, &Device::Cpu)?; |
| 434 | let tensor = tensor.to_dtype(self.dtype)?; |
| 435 | if self.needs_device_transfer { |
| 436 | tensor.to_device(&self.device)? |
| 437 | } else { |
| 438 | tensor |
| 439 | } |
| 440 | }; |
| 441 | |
| 442 | Ok(tensor) |
| 443 | } |
| 444 | } |
| 445 | |
| 446 | impl ExpertProvider for DiskExpertProvider { |
no outgoing calls
no test coverage detected