Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions crates/prover/src/core/backend/cpu/circle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,9 @@ impl PolyOps for CpuBackend {

let (si_i, vi_p): (Vec<_>, Vec<_>) = (0..domain.size())
.map(|i| {
let coset_point = domain.at(i).into_ef::<SecureField>();
let coset_point = domain
.at(bit_reverse_index(i, domain.log_size()))
.into_ef::<SecureField>();
let minus_two_coset_point_y = coset_point.y * SecureField::from(-2);
(
minus_two_coset_point_y
Expand All @@ -118,7 +120,6 @@ impl PolyOps for CpuBackend {
p.into_ef::<SecureField>(),
);

// TODO(Gali): Change weights order to bit-reverse order.
(0..domain.size())
.map(|i| vn_p / (si_i[i] * vi_p[i]))
.collect_vec()
Expand All @@ -129,7 +130,7 @@ impl PolyOps for CpuBackend {
weights: &Col<CpuBackend, SecureField>,
) -> SecureField {
(0..evals.domain.size()).fold(SecureField::zero(), |acc, i| {
acc + (evals.values[bit_reverse_index(i, evals.domain.log_size())] * weights[i])
acc + (evals.values[i] * weights[i])
})
}

Expand Down
35 changes: 17 additions & 18 deletions crates/prover/src/core/backend/simd/circle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ impl PolyOps for SimdBackend {
p: CirclePoint<SecureField>,
) -> Col<SimdBackend, SecureField> {
let domain = coset.circle_domain();
let log_size = domain.log_size();
let weights_vec_len = domain.size().div_ceil(N_LANES);
if weights_vec_len == 1 {
return Col::<SimdBackend, SecureField>::from_iter(CircleEvaluation::<
Expand All @@ -240,11 +241,12 @@ impl PolyOps for SimdBackend {
));
}

let p = p.into_ef::<SecureField>();
let p_0 = domain.at(0).into_ef::<SecureField>();
let si_0 = SecureField::one()
/ ((p_0.y * SecureField::from(-2))
* coset_vanishing_derivative(
Coset::new(CirclePointIndex::generator(), domain.log_size()),
Coset::new(CirclePointIndex::generator(), log_size),
p_0,
));

Expand All @@ -253,8 +255,10 @@ impl PolyOps for SimdBackend {
.map(|i| {
PackedSecureField::from_array(std::array::from_fn(|j| {
point_vanishing(
domain.at(i * N_LANES + j).into_ef::<SecureField>(),
p.into_ef::<SecureField>(),
domain
.at(bit_reverse_index(i * N_LANES + j, log_size))
.into_ef::<SecureField>(),
p,
)
}))
})
Expand All @@ -266,25 +270,21 @@ impl PolyOps for SimdBackend {
};
batch_inverse_in_place(&vi_p, &mut vi_p_inverse);

let vn_p: SecureField = coset_vanishing(
CanonicCoset::new(domain.log_size()).coset,
p.into_ef::<SecureField>(),
);

let si_0_vn_p = PackedSecureField::broadcast(si_0 * vn_p);
let vn_p: SecureField = coset_vanishing(CanonicCoset::new(log_size).coset, p);

// TODO(Gali): Change weights order to bit-reverse order.
// S_i(i) is invariant under G_(n−1) and alternate under J, meaning the S_i(i) values are
// the same for each half coset, and the second half coset values are the conjugate
// of the first half coset values.
let si_i_vn_p = PackedSecureField::from_array(std::array::from_fn(|i| {
if i % 2 == 0 {
si_0 * vn_p
} else {
-si_0 * vn_p
}
}));

let weights: Col<SimdBackend, SecureField> = (0..weights_vec_len)
.map(|i| {
if i < weights_vec_len / 2 {
vi_p_inverse[i] * si_0_vn_p
} else {
vi_p_inverse[i] * -si_0_vn_p
}
})
.map(|i| vi_p_inverse[i] * si_i_vn_p)
.collect();

weights
Expand All @@ -294,7 +294,6 @@ impl PolyOps for SimdBackend {
evals: &CircleEvaluation<SimdBackend, BaseField, BitReversedOrder>,
weights: &Col<SimdBackend, SecureField>,
) -> SecureField {
let evals = evals.clone().bit_reverse();
(0..evals.domain.size().div_ceil(N_LANES))
.fold(PackedSecureField::zero(), |acc, i| {
acc + (weights.data[i] * evals.values.data[i])
Expand Down
Loading