use crate::engine::gpu::partition::DevicePartition;
use crate::engine::gpu::{GpuError, GpuPartitionedSum, GpuSum};
use crate::engine::partitioned::{DistributedSum, PartitionedSum};
use crate::engine::transport::Transport;
use crate::pauli_sum::PauliSum;
pub use crate::engine::gpu::{FaultPlan, WireFault};
pub trait DeviceSplit<const W: usize> {
#[doc(hidden)]
fn device_partition_mut(&mut self, rank: usize) -> &mut DevicePartition<W>;
}
impl<const W: usize> DeviceSplit<W> for PartitionedSum<W, DevicePartition<W>> {
fn device_partition_mut(&mut self, rank: usize) -> &mut DevicePartition<W> {
&mut self.backends_mut()[rank]
}
}
impl<const W: usize, X: Transport> DeviceSplit<W> for DistributedSum<W, X, DevicePartition<W>> {
fn device_partition_mut(&mut self, rank: usize) -> &mut DevicePartition<W> {
assert_eq!(
rank,
self.rank() as usize,
"a distributed split arms faults on its own rank only"
);
self.backend_mut()
}
}
pub fn set_fault_plan<const W: usize>(
split: &mut impl DeviceSplit<W>,
rank: usize,
plan: FaultPlan,
) {
split.device_partition_mut(rank).set_fault_plan(plan);
}
pub fn assert_invariants_device<const W: usize>(sum: &GpuSum<W>) -> Result<(), String> {
sum.assert_invariants_device()
}
pub fn refine_to<const W: usize>(sum: &mut GpuSum<W>, bits: u8) -> Result<(), GpuError> {
sum.refine_to(bits)
}
pub fn from_host_with_nvrtc_options<const W: usize>(
sum: &PauliSum<W>,
device: u32,
extra_options: &[String],
) -> Result<GpuPartitionedSum<W>, GpuError> {
GpuPartitionedSum::one_device(sum, device, extra_options)
}