pub use crate::engines::soa::interaction::{
Interaction, InteractionError, InteractionId, InteractionNodes, InteractionOrder,
InteractionTopology, ObjId,
};
pub use crate::engines::soa::neighbor_list::{NeighborList, NeighborListError};
pub use crate::engines::soa::phys_obj::{AttrId, AttrsCore, AttrsError, AttrsMeta};
pub use crate::math::tensor::rank_2::matrix::{
AntiSymmetricMatrix, DiagonalMatrix, LowerTriangularMatrix, StrictLowerTriangularMatrix,
StrictUpperTriangularMatrix, SymmetricMatrix, UpperTriangularMatrix,
};
pub use crate::sampling::{DynamicWeightedIndex, DynamicWeightedIndexError};
pub use crate::space::discrete::square_lattice::kernel::{
Kernel, NearestNeighborKernel, PowerLawKernel, UniformDistanceKernel,
};
use crate::engines::soa::phys_obj::PhysObj;
use crate::math::{Matrix, Scalar, StorageKind, Tensor, VectorList};
use crate::space::SquareLattice;
pub trait PhysObjAdvanced {
fn from_raw_parts(metadata: AttrsMeta, attributes: AttrsCore) -> Self;
fn metadata(&self) -> &AttrsMeta;
fn metadata_mut(&mut self) -> &mut AttrsMeta;
fn attributes(&self) -> &AttrsCore;
fn attributes_mut(&mut self) -> &mut AttrsCore;
}
impl PhysObjAdvanced for PhysObj {
fn from_raw_parts(metadata: AttrsMeta, attributes: AttrsCore) -> Self {
PhysObj::new(metadata, attributes)
}
fn metadata(&self) -> &AttrsMeta {
&self.meta
}
fn metadata_mut(&mut self) -> &mut AttrsMeta {
&mut self.meta
}
fn attributes(&self) -> &AttrsCore {
&self.core
}
fn attributes_mut(&mut self) -> &mut AttrsCore {
&mut self.core
}
}
pub trait SquareLatticeAdvanced<T: Scalar> {
fn downsample(&self, target_shape: &[usize]) -> SquareLattice<T>;
}
impl<T: Scalar> SquareLatticeAdvanced<T> for SquareLattice<T> {
fn downsample(&self, target_shape: &[usize]) -> SquareLattice<T> {
SquareLattice::downsample(self, target_shape)
}
}
pub trait RawStorage<T: Scalar> {
fn value_at_index(&self, index: usize) -> Option<T>;
fn set_value_at_index(&mut self, index: usize, value: T) -> bool;
fn dense_values(&self) -> Option<&[T]>;
fn dense_values_mut(&mut self) -> Option<&mut [T]>;
fn stored_entries(&self) -> Vec<(usize, T)>;
}
impl<T: Scalar> RawStorage<T> for Tensor<T> {
fn value_at_index(&self, index: usize) -> Option<T> {
(index < self.size()).then(|| self.get_flat_unchecked(index))
}
fn set_value_at_index(&mut self, index: usize, value: T) -> bool {
if index >= self.size() {
return false;
}
self.set_flat_unchecked(index, value);
true
}
fn dense_values(&self) -> Option<&[T]> {
self.dense_values()
}
fn dense_values_mut(&mut self) -> Option<&mut [T]> {
self.dense_values_mut()
}
fn stored_entries(&self) -> Vec<(usize, T)> {
match self.storage_kind() {
StorageKind::Dense => self.values().enumerate().collect(),
StorageKind::Sparse => self
.sparse_entries()
.expect("sparse representation has sparse entries")
.collect(),
}
}
}
macro_rules! delegate_raw_storage {
($container:ident) => {
impl<T: Scalar> RawStorage<T> for $container<T> {
fn value_at_index(&self, index: usize) -> Option<T> {
RawStorage::value_at_index(self.tensor(), index)
}
fn set_value_at_index(&mut self, index: usize, value: T) -> bool {
RawStorage::set_value_at_index(self.tensor_mut(), index, value)
}
fn dense_values(&self) -> Option<&[T]> {
RawStorage::dense_values(self.tensor())
}
fn dense_values_mut(&mut self) -> Option<&mut [T]> {
RawStorage::dense_values_mut(self.tensor_mut())
}
fn stored_entries(&self) -> Vec<(usize, T)> {
RawStorage::stored_entries(self.tensor())
}
}
};
}
delegate_raw_storage!(Matrix);
delegate_raw_storage!(VectorList);