#numeric

no-std common_traits

用于在不同数值类型上编写泛型函数的特质,具有原子支持和其他功能

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 数学

Download history 150/week @ 2024-05-01 119/week @ 2024-05-08 98/week @ 2024-05-15 214/week @ 2024-05-22 135/week @ 2024-05-29 182/week @ 2024-06-05 257/week @ 2024-06-12 173/week @ 2024-06-19 86/week @ 2024-06-26 49/week @ 2024-07-03 66/week @ 2024-07-10 154/week @ 2024-07-17 491/week @ 2024-07-24 224/week @ 2024-07-31 224/week @ 2024-08-07 141/week @ 2024-08-14

1,124 每月下载量
用于 8 个crates(6个直接使用)

Apache-2.0

230KB
4.5K SLoC

common_traits

downloads dependents GitHub CI license Latest version Documentation

一组特质和依赖项的集合,可用于编写泛型数值类型代码。它还提供了使用相同位数的整数原子字节实现的原子浮点数,并通过crate half 支持半精度浮点数。

此外,还有一些标准库中缺失的特质,例如 Sequence,现有库特质的变体,如 [Rng] 和 Hash,以及宏如 invariant

最后,我们提供了类型之间的转换特质,如 UpcastableInto,以及一些原语的快速实现,例如 FastRangeSelectInWord

所有内容都是实验性的,我会根据我的需求进行更改,并尊重语义版本控制。 :)

示例

混合精度泛型点积!

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最值得注意的功能。

此软件包添加了以下宏,invariantinvariant_eqinvariant_ne,它们与 std debug_assert 宏类似,在调试运行时进行检查,并在发布构建时替换为 unreachable_unchecked

结构体

此软件包通过 fetch_update 添加以下类型的模拟原子浮点数:

数值特性

此软件包为数值类型提供了以下特性:

原子数值特性

有两个主要特性用于处理原子值:

  • Atomic 用于可以原子地读取和写入的值。
  • IntoAtomic 用于可以转换为原子类型的值。

每个数值特性都有一个原子等效特性

其他特性

该软件包还包含几个额外的特性

转换特质

还提供了类型之间转换的特质。

Castable 和 [To] 之间的区别在于,Castable 不允许将 f32 转换为 u32 等,因为 Castable 仅在整数和浮点数之间实现,而 [To] 则为所有原始类型实现。

功能

此包具有以下功能

  • simd:启用 portable_simd 并能够执行泛型 simd 代码
  • atomic_from_mut:添加 get_mut_slicefrom_mut_slice 方法
  • std:禁用 no_std
  • half:启用对 half::f16 的支持(实验性)

依赖项

~0.6–1.1MB
~24K SLoC