mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 05:06:44 +01:00
VecZnx: added ring degree switching
This commit is contained in:
@@ -1,55 +1,6 @@
|
|||||||
//use bindgen;
|
|
||||||
//use std::env;
|
|
||||||
//use std::fs;
|
|
||||||
use std::path::absolute;
|
use std::path::absolute;
|
||||||
//use std::path::PathBuf;
|
|
||||||
//use std::time::SystemTime;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
/*
|
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
bindgen ="0.71.1"
|
|
||||||
|
|
||||||
// Path to the C header file
|
|
||||||
let header_paths: [&str; 2] = [
|
|
||||||
"spqlios-arithmetic/spqlios/coeffs/coeffs_arithmetic.h",
|
|
||||||
"spqlios-arithmetic/spqlios/arithmetic/vec_znx_arithmetic.h",
|
|
||||||
];
|
|
||||||
|
|
||||||
let out_path: PathBuf = PathBuf::from(env::var("OUT_DIR").unwrap());
|
|
||||||
let bindings_file = out_path.join("bindings.rs");
|
|
||||||
|
|
||||||
let regenerate: bool = header_paths.iter().any(|header| {
|
|
||||||
let header_metadata: SystemTime = fs::metadata(header)
|
|
||||||
.and_then(|m| m.modified())
|
|
||||||
.unwrap_or(SystemTime::UNIX_EPOCH);
|
|
||||||
let bindings_metadata: SystemTime = fs::metadata(&bindings_file)
|
|
||||||
.and_then(|m| m.modified())
|
|
||||||
.unwrap_or(SystemTime::UNIX_EPOCH);
|
|
||||||
header_metadata > bindings_metadata
|
|
||||||
});
|
|
||||||
|
|
||||||
if regenerate {
|
|
||||||
// Generate the Rust bindings
|
|
||||||
let mut builder: bindgen::Builder = bindgen::Builder::default();
|
|
||||||
for header in header_paths {
|
|
||||||
builder = builder.header(header);
|
|
||||||
}
|
|
||||||
|
|
||||||
let bindings = builder
|
|
||||||
.generate_comments(false) // Optional: includes comments in bindings
|
|
||||||
.generate_inline_functions(true) // Optional: includes inline functions
|
|
||||||
.generate()
|
|
||||||
.expect("Unable to generate bindings");
|
|
||||||
|
|
||||||
// Write the bindings to the OUT_DIR
|
|
||||||
bindings
|
|
||||||
.write_to_file(&bindings_file)
|
|
||||||
.expect("Couldn't write bindings!");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"cargo:rustc-link-search=native={}",
|
"cargo:rustc-link-search=native={}",
|
||||||
absolute("./spqlios-arithmetic/build/spqlios")
|
absolute("./spqlios-arithmetic/build/spqlios")
|
||||||
|
|||||||
Submodule base2k/spqlios-arithmetic deleted from 7ea875f61c
36
base2k/src/bindgen.rs
Normal file
36
base2k/src/bindgen.rs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
[build-dependencies]
|
||||||
|
bindgen ="0.71.1"
|
||||||
|
|
||||||
|
//use bindgen;
|
||||||
|
//use std::env;
|
||||||
|
//use std::fs;
|
||||||
|
//use std::path::PathBuf;
|
||||||
|
//use std::time::SystemTime;
|
||||||
|
|
||||||
|
// Path to the C header file
|
||||||
|
let header_paths: [&str; 2] = [
|
||||||
|
"spqlios-arithmetic/spqlios/coeffs/coeffs_arithmetic.h",
|
||||||
|
"spqlios-arithmetic/spqlios/arithmetic/vec_znx_arithmetic.h",
|
||||||
|
];
|
||||||
|
|
||||||
|
let out_path: PathBuf = PathBuf::from(env::var("OUT_DIR").unwrap());
|
||||||
|
let bindings_file = out_path.join("bindings.rs");
|
||||||
|
|
||||||
|
let mut builder: bindgen::Builder = bindgen::Builder::default();
|
||||||
|
for header in header_paths {
|
||||||
|
builder = builder.header(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
let bindings = builder
|
||||||
|
.generate_comments(false) // Optional: includes comments in bindings
|
||||||
|
.generate_inline_functions(true) // Optional: includes inline functions
|
||||||
|
.generate()
|
||||||
|
.expect("Unable to generate bindings");
|
||||||
|
|
||||||
|
// Write the bindings to the OUT_DIR
|
||||||
|
bindings
|
||||||
|
.write_to_file(&bindings_file)
|
||||||
|
.expect("Couldn't write bindings!");
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::Module;
|
||||||
use rand::seq::SliceRandom;
|
use rand::seq::SliceRandom;
|
||||||
use rand_core::RngCore;
|
use rand_core::RngCore;
|
||||||
use rand_distr::{Distribution, WeightedIndex};
|
use rand_distr::{Distribution, WeightedIndex};
|
||||||
@@ -5,6 +6,12 @@ use sampling::source::Source;
|
|||||||
|
|
||||||
pub struct Scalar(pub Vec<i64>);
|
pub struct Scalar(pub Vec<i64>);
|
||||||
|
|
||||||
|
impl Module {
|
||||||
|
pub fn new_scalar(&self) -> Scalar {
|
||||||
|
Scalar::new(self.n())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Scalar {
|
impl Scalar {
|
||||||
pub fn new(n: usize) -> Self {
|
pub fn new(n: usize) -> Self {
|
||||||
Self(vec![i64::default(); Self::buffer_size(n)])
|
Self(vec![i64::default(); Self::buffer_size(n)])
|
||||||
|
|||||||
@@ -2,9 +2,13 @@ use crate::ffi::svp::{delete_svp_ppol, new_svp_ppol, svp_apply_dft, svp_ppol_t,
|
|||||||
use crate::scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
use crate::{Module, VecZnx, VecZnxDft};
|
use crate::{Module, VecZnx, VecZnxDft};
|
||||||
|
|
||||||
pub struct SvpPPol(pub *mut svp_ppol_t);
|
pub struct SvpPPol(pub *mut svp_ppol_t, pub usize);
|
||||||
|
|
||||||
impl SvpPPol {
|
impl SvpPPol {
|
||||||
|
pub fn n(&self) -> usize {
|
||||||
|
self.1
|
||||||
|
}
|
||||||
|
|
||||||
pub fn delete(self) {
|
pub fn delete(self) {
|
||||||
unsafe { delete_svp_ppol(self.0) };
|
unsafe { delete_svp_ppol(self.0) };
|
||||||
let _ = drop(self);
|
let _ = drop(self);
|
||||||
@@ -20,7 +24,7 @@ impl Module {
|
|||||||
|
|
||||||
// Allocates a scalar-vector-product prepared-poly (VecZnxBig).
|
// Allocates a scalar-vector-product prepared-poly (VecZnxBig).
|
||||||
pub fn svp_new_ppol(&self) -> SvpPPol {
|
pub fn svp_new_ppol(&self) -> SvpPPol {
|
||||||
unsafe { SvpPPol(new_svp_ppol(self.0)) }
|
unsafe { SvpPPol(new_svp_ppol(self.0), self.n()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Applies a scalar x vector product: res <- a (ppol) x b
|
// Applies a scalar x vector product: res <- a (ppol) x b
|
||||||
|
|||||||
@@ -98,6 +98,10 @@ impl VecZnx {
|
|||||||
&mut self.data[i * self.n..(i + 1) * self.n]
|
&mut self.data[i * self.n..(i + 1) * self.n]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn zero(&mut self) {
|
||||||
|
unsafe { znx_zero_i64_ref(self.data.len() as u64, self.data.as_mut_ptr()) }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn from_i64(&mut self, data: &[i64], log_max: usize) {
|
pub fn from_i64(&mut self, data: &[i64], log_max: usize) {
|
||||||
let size: usize = min(data.len(), self.n());
|
let size: usize = min(data.len(), self.n());
|
||||||
let k_rem: usize = self.log_base2k - (self.log_q % self.log_base2k);
|
let k_rem: usize = self.log_base2k - (self.log_q % self.log_base2k);
|
||||||
@@ -362,6 +366,28 @@ impl VecZnx {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn switch_degree(&self, a: &mut VecZnx) {
|
||||||
|
let (n_in, n_out) = (self.n(), a.n());
|
||||||
|
let (gap_in, gap_out): (usize, usize);
|
||||||
|
|
||||||
|
if n_in > n_out {
|
||||||
|
(gap_in, gap_out) = (n_in / n_out, 1)
|
||||||
|
} else {
|
||||||
|
(gap_in, gap_out) = (1, n_out / n_in);
|
||||||
|
a.zero();
|
||||||
|
}
|
||||||
|
|
||||||
|
let limbs = min(self.limbs(), a.limbs());
|
||||||
|
|
||||||
|
(0..limbs).for_each(|i| {
|
||||||
|
izip!(
|
||||||
|
self.at(i).iter().step_by(gap_in),
|
||||||
|
a.at_mut(i).iter_mut().step_by(gap_out)
|
||||||
|
)
|
||||||
|
.for_each(|(x_in, x_out)| *x_out = *x_in);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
Reference in New Issue
Block a user