#线性代数 # #graph-blas

stacked_linear_algebra_graph

使用稀疏线性代数嵌入内存的图

25 个版本 (12 个破坏性更新)

0.13.0 2024年5月10日
0.11.7 2024年4月9日
0.10.0 2024年3月17日
0.9.0 2023年12月11日
0.4.0 2023年7月30日

#187 in 数学

Download history 264/week @ 2024-05-02 166/week @ 2024-05-09 7/week @ 2024-05-16 4/week @ 2024-05-23 31/week @ 2024-07-04 138/week @ 2024-07-25 14/week @ 2024-08-01

每月152 次下载

CC-BY-NC-4.0

640KB
15K SLoC

test

堆叠线性代数图

使用稀疏线性代数嵌入内存的图。

功能

架构

堆叠线性代数图实现了一个带权重的有向图,每个顶点和边都有一个权重。图将顶点和邻接矩阵分别建模为 GraphBLAS 稀疏矢量和矩阵。图使用 GraphBLAS 操作符对其顶点矢量和邻接矩阵进行操作。

索引

图为每个新顶点、顶点矢量和邻接矩阵分配一个无符号整数索引。在索引被删除后,图可能会重复使用索引。

数值顶点索引在所有顶点矢量和邻接矩阵中引用相同的坐标。因此,所有顶点矢量和邻接矩阵都具有兼容的大小。

每个顶点矢量和邻接矩阵的组合定义了一个独立的图。所有图共享相同的坐标。

随着新顶点的添加,图自动扩展顶点矢量和邻接矩阵的大小。图无法减小它们的大小。

数据类型

图在顶点和边中存储以下 Rust 原始数值类型:bool; i8; i16; i32; i64; u8; u16; u32; u64; f32; f64; isize; usize

类型转换

每个顶点矢量和邻接矩阵具有单一的数据数据类型。数据类型是在将顶点矢量和邻接矩阵添加到图中时设置的。

涉及不同值类型的操作将根据 ANSI C 进行类型转换,但有以下例外

  • +-Inf 或超出其最大范围的整数值将被截断
  • NaN 转换为零

线性代数操作

图操作应用于任何适用的顶点矢量和邻接矩阵组合。

事务

图不实现 ACID 数据库事务。

持久性

图位于内存中,不存在于持久存储中。

最小示例

use graphblas_sparse_linear_algebra::operators::binary_operator::{Assignment, Plus};
use graphblas_sparse_linear_algebra::operators::index_unary_operator::IsValueEqualTo;
use graphblas_sparse_linear_algebra::operators::options::OperatorOptions;
use graphblas_sparse_linear_algebra::operators::semiring::PlusTimes;

use stacked_linear_algebra_graph::graph::edge::{DirectedEdgeCoordinate, WeightedDirectedEdge};
use stacked_linear_algebra_graph::graph::graph::Graph;
use stacked_linear_algebra_graph::graph::indexing::{VertexIndex, VertexTypeIndex};
use stacked_linear_algebra_graph::operators::add::{AddEdge, AddEdgeType, AddVertex, AddVertexType};
use stacked_linear_algebra_graph::operators::apply_operator::ApplyIndexUnaryOperatorToVertexVector;
use stacked_linear_algebra_graph::operators::element_wise_multiplication::BinaryOperatorElementWiseVertexVectorMultiplication;
use stacked_linear_algebra_graph::operators::multiplication::VertexVectorAdjacencyMatrixMultiplication;
use stacked_linear_algebra_graph::operators::options::OptionsForOperatorWithAdjacencyMatrixAsRightArgument;
use stacked_linear_algebra_graph::operators::read::GetVertexValue;

fn main() {
    let mut graph = Graph::with_initial_capacity(&5, &5, &5).unwrap();

    let numbers_vertex_type_index: VertexTypeIndex =
        AddVertexType::<i32>::apply(&mut graph).unwrap();
    let odd_number_sequence_edge_type_index = AddEdgeType::<i32>::apply(&mut graph).unwrap();

    // Add vertices
    let mut vertex_indices: Vec<VertexIndex> = Vec::new();
    for n in 0..12 {
        vertex_indices.push(
            graph
                .add_vertex(&numbers_vertex_type_index, n as u8)
                .unwrap(),
        );
    }

    // Define a sequence of subsequent odd numbers
    for i in [1, 3, 5, 7, 9] {
        let edge = WeightedDirectedEdge::new(
            DirectedEdgeCoordinate::new(
                odd_number_sequence_edge_type_index,
                vertex_indices[i],
                vertex_indices[i + 2],
            ),
            true,
        );

        graph.add_or_replace_edge_from_edge(edge).unwrap();
    }

    // Find the fourth number in the sequence, starting at 1
    let selected_vertices_index: VertexTypeIndex = AddVertexType::<i32>::apply(&mut graph).unwrap();

    ApplyIndexUnaryOperatorToVertexVector::<u8>::apply(
        &mut graph,
        &numbers_vertex_type_index,
        &IsValueEqualTo::<u8>::new(),
        &1,
        &Assignment::new(),
        &selected_vertices_index,
        None,
        &OperatorOptions::new_default(),
    )
    .unwrap();

    for _i in 0..2 {
        VertexVectorAdjacencyMatrixMultiplication::<u8>::by_index(
            &mut graph,
            &selected_vertices_index,
            &PlusTimes::<u8>::new(),
            &odd_number_sequence_edge_type_index,
            &Assignment::new(),
            &selected_vertices_index,
            None,
            &&OptionsForOperatorWithAdjacencyMatrixAsRightArgument::new_default(),
        )
        .unwrap();
    }

    BinaryOperatorElementWiseVertexVectorMultiplication::<u8>::apply(
        &mut graph,
        &selected_vertices_index,
        &Plus::<u8>::new(),
        &numbers_vertex_type_index,
        &Assignment::new(),
        &selected_vertices_index,
        None,
        &OperatorOptions::new_default(),
    )
    .unwrap();

    assert_eq!(
        GetVertexValue::<u8>::vertex_value(&graph, &numbers_vertex_type_index, &vertex_indices[7])
            .unwrap(),
        Some(7u8)
    )
}

要求

请确保满足构建 graphblas_sparse_linear_algebra 的要求。

贡献

太棒了,欢迎贡献。stacked_linear_algebra_graph 和您的贡献将来可能被重新许可并集成到商业软件中。因此,当您发起拉取请求时,将被要求同意贡献者许可协议

许可

stacked_linear_algebra_graph 在Creative Commons Attribution Non Commercial 4.0 国际下许可。如需其他许可选项,请联系Sam Dekker。

致谢

Stacked Linear Algebra Graph 受LAGraph的启发,并使用了来自Timothy A. Davis的相同底层GraphBLAS实现。

依赖

~3.5–7MB
~144K SLoC