openvm-circuit-primitives 2.0.1

Library of plonky3 primitives for general purpose use in other ZK circuits.
Documentation
use std::sync::Arc;

use openvm_cuda_backend::{
    base::DeviceMatrix, data_transporter::assert_eq_host_and_device_matrix, prelude::F,
};
use openvm_stark_backend::{p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix};

use crate::{cuda_abi::encoder, encoder::Encoder, utils::test_device_ctx};

#[test]
fn test_cuda_encoder_with_invalid_row() {
    let device_ctx = test_device_ctx();
    // Max number of flags for k = 6
    let num_flags = 461;
    let max_degree = 5;
    let reserve_invalid = true;

    let encoder = Encoder::new(num_flags, max_degree, reserve_invalid);
    let expected_k = encoder.width();

    let values = (0..num_flags)
        .map(|i| encoder.get_flag_pt(i))
        .collect::<Vec<_>>();
    let cpu_matrix = Arc::new(RowMajorMatrix::<F>::new(
        values
            .into_iter()
            .flat_map(|v| v.into_iter().map(F::from_u32))
            .collect(),
        expected_k,
    ));

    let gpu_matrix = DeviceMatrix::<F>::with_capacity_on(num_flags, expected_k, &device_ctx);
    unsafe {
        encoder::dummy_tracegen(
            gpu_matrix.buffer(),
            num_flags as u32,
            max_degree,
            reserve_invalid,
            expected_k as u32,
            device_ctx.stream.as_raw(),
        )
        .unwrap();
    };

    assert_eq_host_and_device_matrix(cpu_matrix, &gpu_matrix, &device_ctx);
}

#[test]
fn test_cuda_encoder_without_invalid_row() {
    let device_ctx = test_device_ctx();
    let num_flags = 18;
    let max_degree = 2;
    let reserve_invalid = false;

    let encoder = Encoder::new(num_flags, max_degree, reserve_invalid);
    let expected_k = encoder.width();

    let values = (0..num_flags)
        .map(|i| encoder.get_flag_pt(i))
        .collect::<Vec<_>>();
    let cpu_matrix = Arc::new(RowMajorMatrix::<F>::new(
        values
            .into_iter()
            .flat_map(|v| v.into_iter().map(F::from_u32))
            .collect(),
        expected_k,
    ));

    let gpu_matrix = DeviceMatrix::<F>::with_capacity_on(num_flags, expected_k, &device_ctx);
    unsafe {
        encoder::dummy_tracegen(
            gpu_matrix.buffer(),
            num_flags as u32,
            max_degree,
            reserve_invalid,
            expected_k as u32,
            device_ctx.stream.as_raw(),
        )
        .unwrap();
    };

    assert_eq_host_and_device_matrix(cpu_matrix, &gpu_matrix, &device_ctx);
}