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
作为AtomicF16
half::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_std
half
:启用对half::f16
的支持(实验性)
依赖项
~0.6–1.1MB
~24K SLoC