Merge pull request #661 from proxima-one/no-rand-2

feature-gate rand
This commit is contained in:
Daniel Lubarov 2022-08-06 22:07:14 -04:00 committed by GitHub
commit 0263116e6c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 44 additions and 23 deletions

View File

@ -4,12 +4,16 @@ description = "Finite field arithmetic"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
[features]
default = ["rand"]
rand = ["dep:rand"]
[dependencies] [dependencies]
plonky2_util = { path = "../util" } plonky2_util = { path = "../util" }
anyhow = "1.0.40" anyhow = "1.0.40"
itertools = "0.10.0" itertools = "0.10.0"
num = { version = "0.4", features = [ "rand" ] } num = { version = "0.4", features = [ "rand" ] }
rand = "0.8.4" rand = { optional = true, version = "0.8.4" }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
unroll = "0.1.5" unroll = "0.1.5"
static_assertions = "1.1.0" static_assertions = "1.1.0"

View File

@ -4,7 +4,6 @@ use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssi
use num::bigint::BigUint; use num::bigint::BigUint;
use num::Integer; use num::Integer;
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::extension::{Extendable, FieldExtension, Frobenius, OEF}; use crate::extension::{Extendable, FieldExtension, Frobenius, OEF};
@ -103,7 +102,8 @@ impl<F: Extendable<2>> Field for QuadraticExtension<F> {
F::from_noncanonical_u128(n).into() F::from_noncanonical_u128(n).into()
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
Self([F::rand_from_rng(rng), F::rand_from_rng(rng)]) Self([F::rand_from_rng(rng), F::rand_from_rng(rng)])
} }
} }

View File

@ -5,7 +5,6 @@ use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssi
use num::bigint::BigUint; use num::bigint::BigUint;
use num::traits::Pow; use num::traits::Pow;
use num::Integer; use num::Integer;
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::extension::{Extendable, FieldExtension, Frobenius, OEF}; use crate::extension::{Extendable, FieldExtension, Frobenius, OEF};
@ -115,7 +114,8 @@ impl<F: Extendable<4>> Field for QuarticExtension<F> {
F::from_noncanonical_u128(n).into() F::from_noncanonical_u128(n).into()
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
Self::from_basefield_array([ Self::from_basefield_array([
F::rand_from_rng(rng), F::rand_from_rng(rng),
F::rand_from_rng(rng), F::rand_from_rng(rng),

View File

@ -4,7 +4,6 @@ use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssi
use num::bigint::BigUint; use num::bigint::BigUint;
use num::traits::Pow; use num::traits::Pow;
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::extension::{Extendable, FieldExtension, Frobenius, OEF}; use crate::extension::{Extendable, FieldExtension, Frobenius, OEF};
@ -112,7 +111,8 @@ impl<F: Extendable<5>> Field for QuinticExtension<F> {
F::from_noncanonical_u128(n).into() F::from_noncanonical_u128(n).into()
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
Self::from_basefield_array([ Self::from_basefield_array([
F::rand_from_rng(rng), F::rand_from_rng(rng),
F::rand_from_rng(rng), F::rand_from_rng(rng),

View File

@ -6,7 +6,6 @@ use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssi
use num::{BigUint, Integer}; use num::{BigUint, Integer};
use plonky2_util::{assume, branch_hint}; use plonky2_util::{assume, branch_hint};
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::inversion::try_inverse_u64; use crate::inversion::try_inverse_u64;
@ -105,7 +104,8 @@ impl Field for GoldilocksField {
reduce128(n) reduce128(n)
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
Self::from_canonical_u64(rng.gen_range(0..Self::ORDER)) Self::from_canonical_u64(rng.gen_range(0..Self::ORDER))
} }

View File

@ -5,9 +5,8 @@ use std::iter::{Product, Sum};
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign}; use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
use itertools::Itertools; use itertools::Itertools;
use num::bigint::{BigUint, RandBigInt}; use num::bigint::BigUint;
use num::{Integer, One}; use num::{Integer, One};
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::{Field, PrimeField}; use crate::types::{Field, PrimeField};
@ -133,7 +132,9 @@ impl Field for Secp256K1Base {
Self([n.0, n.1 as u64, 0, 0]) Self([n.0, n.1 as u64, 0, 0])
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
use num::bigint::RandBigInt;
Self::from_biguint(rng.gen_biguint_below(&Self::order())) Self::from_biguint(rng.gen_biguint_below(&Self::order()))
} }
} }

View File

@ -6,9 +6,8 @@ use std::iter::{Product, Sum};
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign}; use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
use itertools::Itertools; use itertools::Itertools;
use num::bigint::{BigUint, RandBigInt}; use num::bigint::BigUint;
use num::{Integer, One}; use num::{Integer, One};
use rand::Rng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::{Field, PrimeField}; use crate::types::{Field, PrimeField};
@ -142,7 +141,9 @@ impl Field for Secp256K1Scalar {
Self([n.0, n.1 as u64, 0, 0]) Self([n.0, n.1 as u64, 0, 0])
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
use num::bigint::RandBigInt;
Self::from_biguint(rng.gen_biguint_below(&Self::order())) Self::from_biguint(rng.gen_biguint_below(&Self::order()))
} }
} }

View File

@ -6,7 +6,6 @@ use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssi
use num::bigint::BigUint; use num::bigint::BigUint;
use num::{Integer, One, ToPrimitive, Zero}; use num::{Integer, One, ToPrimitive, Zero};
use plonky2_util::bits_u64; use plonky2_util::bits_u64;
use rand::Rng;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use serde::Serialize; use serde::Serialize;
@ -312,7 +311,8 @@ pub trait Field:
Self::from_noncanonical_u128(n) Self::from_noncanonical_u128(n)
} }
fn rand_from_rng<R: Rng>(rng: &mut R) -> Self; #[cfg(feature = "rand")]
fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self;
fn exp_power_of_2(&self, power_log: usize) -> Self { fn exp_power_of_2(&self, power_log: usize) -> Self {
let mut res = *self; let mut res = *self;
@ -391,14 +391,17 @@ pub trait Field:
} }
} }
#[cfg(feature = "rand")]
fn rand() -> Self { fn rand() -> Self {
Self::rand_from_rng(&mut rand::thread_rng()) Self::rand_from_rng(&mut rand::thread_rng())
} }
#[cfg(feature = "rand")]
fn rand_arr<const N: usize>() -> [Self; N] { fn rand_arr<const N: usize>() -> [Self; N] {
Self::rand_vec(N).try_into().unwrap() Self::rand_vec(N).try_into().unwrap()
} }
#[cfg(feature = "rand")]
fn rand_vec(n: usize) -> Vec<Self> { fn rand_vec(n: usize) -> Vec<Self> {
(0..n).map(|_| Self::rand()).collect() (0..n).map(|_| Self::rand()).collect()
} }

View File

@ -11,8 +11,11 @@ edition = "2021"
default-run = "generate_constants" default-run = "generate_constants"
[features] [features]
default = ["parallel"] default = ["parallel", "rand", "rand_chacha", "gate_testing"]
parallel = ["maybe_rayon/parallel"] parallel = ["maybe_rayon/parallel"]
rand = ["dep:rand", "plonky2_field/rand"]
gate_testing = ["rand"]
rand_chacha = ["dep:rand_chacha"]
[dependencies] [dependencies]
plonky2_field = { path = "../field" } plonky2_field = { path = "../field" }
@ -21,8 +24,8 @@ env_logger = "0.9.0"
log = "0.4.14" log = "0.4.14"
itertools = "0.10.0" itertools = "0.10.0"
num = { version = "0.4", features = [ "rand" ] } num = { version = "0.4", features = [ "rand" ] }
rand = "0.8.4" rand = { version = "0.8.4", optional = true }
rand_chacha = "0.3.1" rand_chacha = { version = "0.3.1", optional = true }
maybe_rayon = { path = "../maybe_rayon" } maybe_rayon = { path = "../maybe_rayon" }
unroll = "0.1.5" unroll = "0.1.5"
anyhow = "1.0.40" anyhow = "1.0.40"
@ -32,6 +35,8 @@ keccak-hash = "0.8.0"
static_assertions = "1.1.0" static_assertions = "1.1.0"
[dev-dependencies] [dev-dependencies]
rand = "0.8.4"
rand_chacha = "0.3.1"
criterion = "0.3.5" criterion = "0.3.5"
tynm = "0.1.6" tynm = "0.1.6"
structopt = "0.3.26" structopt = "0.3.26"
@ -41,6 +46,10 @@ rayon = "1.5.1"
[target.'cfg(not(target_env = "msvc"))'.dev-dependencies] [target.'cfg(not(target_env = "msvc"))'.dev-dependencies]
jemallocator = "0.3.2" jemallocator = "0.3.2"
[[bin]]
name = "generate_constants"
required-features = ["rand", "rand_chacha"]
[[bench]] [[bench]]
name = "field_arithmetic" name = "field_arithmetic"
harness = false harness = false

View File

@ -24,4 +24,5 @@ pub mod util;
// Can't use #[cfg(test)] here because it needs to be visible to other crates. // Can't use #[cfg(test)] here because it needs to be visible to other crates.
// See https://github.com/rust-lang/cargo/issues/8379 // See https://github.com/rust-lang/cargo/issues/8379
#[cfg(any(feature = "gate_testing", test))]
pub mod gate_testing; pub mod gate_testing;

View File

@ -1,6 +1,5 @@
use plonky2_field::goldilocks_field::GoldilocksField; use plonky2_field::goldilocks_field::GoldilocksField;
use plonky2_field::types::{Field, PrimeField64}; use plonky2_field::types::{Field, PrimeField64};
use rand::Rng;
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::hash::poseidon::Poseidon; use crate::hash::poseidon::Poseidon;
@ -37,7 +36,8 @@ impl<F: Field> HashOut<F> {
Self { elements } Self { elements }
} }
pub fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "parallel")]
pub fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
Self { Self {
elements: [ elements: [
F::rand_from_rng(rng), F::rand_from_rng(rng),
@ -115,12 +115,14 @@ pub struct MerkleCapTarget(pub Vec<HashOutTarget>);
pub struct BytesHash<const N: usize>(pub [u8; N]); pub struct BytesHash<const N: usize>(pub [u8; N]);
impl<const N: usize> BytesHash<N> { impl<const N: usize> BytesHash<N> {
pub fn rand_from_rng<R: Rng>(rng: &mut R) -> Self { #[cfg(feature = "parallel")]
pub fn rand_from_rng<R: rand::Rng>(rng: &mut R) -> Self {
let mut buf = [0; N]; let mut buf = [0; N];
rng.fill_bytes(&mut buf); rng.fill_bytes(&mut buf);
Self(buf) Self(buf)
} }
#[cfg(feature = "rand")]
pub fn rand() -> Self { pub fn rand() -> Self {
Self::rand_from_rng(&mut rand::thread_rng()) Self::rand_from_rng(&mut rand::thread_rng())
} }