34个版本 (10个破坏性版本)
| 0.11.0 | 2024年6月14日 |
|---|---|
| 0.10.2 | 2024年2月3日 |
| 0.10.0 | 2023年10月11日 |
| 0.7.0 | 2023年7月31日 |
| 0.2.4 | 2023年2月9日 |
#39 in 数学
1,124 每月下载量
用于 8 个crates(6个直接使用)
230KB
4.5K SLoC
common_traits
一组特质和依赖项的集合,可用于编写泛型数值类型代码。它还提供了使用相同位数的整数原子字节实现的原子浮点数,并通过crate half 支持半精度浮点数。
此外,还有一些标准库中缺失的特质,例如 Sequence,现有库特质的变体,如 [Rng] 和 Hash,以及宏如 invariant。
最后,我们提供了类型之间的转换特质,如 UpcastableInto,以及一些原语的快速实现,例如 FastRange 和 SelectInWord。
所有内容都是实验性的,我会根据我的需求进行更改,并尊重语义版本控制。 :)
示例
混合精度泛型点积!
use common_traits::*;
#[inline]
pub fn dot_product<MT: Number, RT: Number, A, B>(a: A, b: B) -> RT
where
A: Sequence,
B: Sequence,
A::Item: To<MT>,
B::Item: To<MT>,
MT: To<RT>,
RT: To<MT>,
{
// Ensure compatability of the vectors
invariant_eq!(a.len(), b.len());
// Compute the dot product
let mut accum = RT::ZERO;
for (a, b) in a.iter().zip(b.iter()) {
accum = (a.to()).mul_add(b.to(), accum.to()).to();
}
accum
}
let x: Vec<f32> = vec![1.0, 2.0, 3.0];
let w: Vec<u8> = vec![3, 2, 1];
// compute the dot product between f32 and u8, casting to f64 and
// accumulating as u16
let res: u16 = dot_product::<f64, _, _, _>(&x, &w);
println!("{:?}", res);
数值特质一览
数值特质依赖链如下。黑色弧线代表特质的依赖关系,蓝色弧线代表访问实现该特质的关联类型的可能性。
为什么?
将此crate公开的目的在于能够讨论它,因为它涵盖了Rust的许多核心缺失。
此crate中的特质与 num-traits 中的特质类似,但它们联系更为紧密(前图中蓝色弧线),这允许更轻松地编写泛型代码(例如,混合类型及其关联的原子类型),并且具有更少的特质限制。
摘要
突出显示common_traits最值得注意的功能。
宏
此软件包添加了以下宏,invariant,invariant_eq,invariant_ne,它们与 std debug_assert 宏类似,在调试运行时进行检查,并在发布构建时替换为 unreachable_unchecked。
结构体
此软件包通过 fetch_update 添加以下类型的模拟原子浮点数:
- [
f64] 作为AtomicF64 - [
f32] 作为AtomicF32 half::f16作为AtomicF16half::bf16作为AtomicBF16
数值特性
此软件包为数值类型提供了以下特性:
Number可以进行加减乘除运算,并且有一个零和一个一。FiniteRangeNumber具有最小值和最大值的Number。Float浮点数。Integer用位序列表示的整数。SignedInt用补码表示的整数。UnsignedInt无符号整数。
原子数值特性
有两个主要特性用于处理原子值:
Atomic用于可以原子地读取和写入的值。IntoAtomic用于可以转换为原子类型的值。
每个数值特性都有一个原子等效特性
其他特性
该软件包还包含几个额外的特性
Sequence,SequenceMut,以及SequenceGrowable,用于抽象切片和其他类似序列的类型。AsBytes、ToBytes和FromBytes是用于将类型转换成字节并反向转换的特质。NonZero是一种不能为零的Self版本,与UnsignedInt和SignedInt相关的类型实现此特质。FastRange用于更快的除法、取模和范围操作。SelectInWord用于在内存字中查找第 i 个 1 或 0 的位置。Splat用于将较小的类型广播到较大的类型,主要用于 SWAR。- [
Rng] 用于泛型随机数生成器。 Hasher类似于std::hash::Hasher,但允许返回泛型类型而不是u64。SeedableHasher是初始化哈希器的一种标准方式。
转换特质
还提供了类型之间转换的特质。
- [
To],用于使用as转换基本值。 DoubleType和HalfType可用于以泛型方式访问更大或更小的类型。UpcastableInto和UpcastableFrom用于转换不会丢失精度的原始值。
DowncastableInto和DowncastableFrom用于转换可能会丢失精度的原始值。
CastableInto和CastableFrom用于转换可能或可能不丢失精度的原始值。这是DowncastableInto和UpcastableInto的并集。
Castable 和 [To] 之间的区别在于,Castable 不允许将 f32 转换为 u32 等,因为 Castable 仅在整数和浮点数之间实现,而 [To] 则为所有原始类型实现。
功能
此包具有以下功能
simd:启用portable_simd并能够执行泛型 simd 代码atomic_from_mut:添加get_mut_slice和from_mut_slice方法std:禁用no_stdhalf:启用对half::f16的支持(实验性)
依赖项
~0.6–1.1MB
~24K SLoC