Skip to content

Commit a2ed2ec

Browse files
authored
Deduplicate/move libff util functions (#43)
* Move all utils in profiling.hpp into libff * Remove unnecessary namespace for profiling functions * Move utils in common.hpp into libff as well as the test * Move most field utils to libff * Move power and its tests to libff * Move libff to latest commit in develop
1 parent ddff983 commit a2ed2ec

File tree

157 files changed

+1348
-1771
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

157 files changed

+1348
-1771
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,6 @@ gtest_main.pc
3737
gtest.pc
3838
DartConfiguration.tcl
3939
.DartConfiguration.tcl.swp
40+
.ninja_deps
41+
.ninja_log
42+
build.ninja

libiop/CMakeLists.txt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ add_library(
22
iop
33

44
common/common.cpp
5-
common/profiling.cpp
65

76
bcs/hashing/blake2b.cpp
87
protocols/ldt/ldt_reducer.cpp
@@ -97,9 +96,6 @@ target_link_libraries(instrument_algebra iop ${Boost_LIBRARIES})
9796
include(CTest)
9897

9998
# algebra
100-
add_executable(test_common tests/algebra/test_common.cpp)
101-
target_link_libraries(test_common iop gtest_main)
102-
10399
add_executable(test_exponentiation tests/algebra/test_exponentiation.cpp)
104100
target_link_libraries(test_exponentiation iop gtest_main)
105101

@@ -130,10 +126,6 @@ target_link_libraries(test_successor_ordering iop gtest_main)
130126
add_executable(test_algebra_utils tests/algebra/test_algebra_utils.cpp)
131127
target_link_libraries(test_algebra_utils iop gtest_main)
132128

133-
add_test(
134-
NAME test_common
135-
COMMAND test_common
136-
)
137129
add_test(
138130
NAME test_exponentiation
139131
COMMAND test_exponentiation

libiop/algebra/exponentiation.hpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@
1414

1515
namespace libiop {
1616

17-
template<typename FieldT>
18-
FieldT power(const FieldT &base, const std::size_t exponent);
19-
20-
template<typename FieldT>
21-
FieldT power(const FieldT &base, const std::vector<std::size_t> exponent);
22-
2317
template<typename FieldT>
2418
std::vector<FieldT> subset_element_powers(const field_subset<FieldT> &S,
2519
const std::size_t exponent);

libiop/algebra/exponentiation.tcc

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,5 @@
11
namespace libiop {
22

3-
template<typename FieldT>
4-
FieldT power(const FieldT &base, const std::size_t exponent)
5-
{
6-
FieldT result = FieldT::one();
7-
8-
bool found_one = false;
9-
10-
for (long i = 8 * sizeof(exponent) - 1; i >= 0; --i)
11-
{
12-
if (found_one)
13-
{
14-
result = result.squared();
15-
}
16-
17-
if (exponent & (1ull << i))
18-
{
19-
found_one = true;
20-
result *= base;
21-
}
22-
}
23-
24-
return result;
25-
}
26-
27-
template<typename FieldT>
28-
FieldT power(const FieldT &base, const std::vector<std::size_t> exponent)
29-
{
30-
FieldT result = FieldT::one();
31-
32-
bool found_one = false;
33-
34-
for (size_t j = 0; j < exponent.size(); j++)
35-
{
36-
size_t cur_exp = exponent[j];
37-
for (long i = 8 * sizeof(cur_exp) - 1; i >= 0; --i)
38-
{
39-
if (found_one)
40-
{
41-
result = result.squared();
42-
}
43-
44-
if (cur_exp & (1ull << i))
45-
{
46-
found_one = true;
47-
result *= base;
48-
}
49-
}
50-
}
51-
52-
return result;
53-
}
54-
553
template<typename FieldT>
564
std::vector<FieldT> subspace_to_power_of_two(const affine_subspace<FieldT> &S,
575
const size_t power_of_two)
@@ -81,7 +29,7 @@ std::vector<FieldT> subspace_element_powers(const affine_subspace<FieldT> &S,
8129
*
8230
* In the case where the exponent is a power of two, we skip the multiplications.
8331
*/
84-
if (is_power_of_2(exponent))
32+
if (libff::is_power_of_2(exponent))
8533
{
8634
return subspace_to_power_of_two(S, exponent);
8735
}

libiop/algebra/fft.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include "libiop/algebra/field_subset/field_subset.hpp"
1616
#include "libiop/algebra/field_subset/subspace.hpp"
1717
#include "libiop/algebra/field_subset/subgroup.hpp"
18-
#include "libiop/common/common.hpp"
18+
#include <libff/common/utils.hpp>
1919

2020
namespace libiop {
2121

@@ -60,30 +60,30 @@ std::vector<FieldT> multiplicative_IFFT_wrapper(const std::vector<FieldT> &v,
6060
const multiplicative_coset<FieldT> &H);
6161

6262
template<typename FieldT>
63-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
63+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
6464
field_subset<FieldT> domain);
6565

6666
template<typename FieldT>
67-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> coeffs,
67+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> coeffs,
6868
field_subset<FieldT> domain);
6969

7070
template<typename FieldT>
71-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
71+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
7272
field_subset<FieldT> domain);
7373

7474
template<typename FieldT>
75-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
75+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
7676
field_subset<FieldT> domain);
7777

7878
template<typename FieldT>
7979
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
80-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
80+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
8181
size_t degree_bound,
8282
field_subset<FieldT> domain);
8383

8484
template<typename FieldT>
8585
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
86-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
86+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
8787
size_t degree_bound,
8888
field_subset<FieldT> domain);
8989

libiop/algebra/fft.tcc

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
#include <libfqfft/evaluation_domain/domains/basic_radix2_domain.hpp>
44
#include <libfqfft/evaluation_domain/domains/basic_radix2_domain_aux.hpp>
55

6-
#include "libiop/algebra/field_utils.hpp"
6+
#include <libff/common/profiling.hpp>
7+
#include <libff/algebra/field_utils/field_utils.hpp>
78
#include "libiop/algebra/utils.hpp"
8-
#include "libiop/common/profiling.hpp"
99

1010
namespace libiop {
1111

@@ -207,23 +207,23 @@ template<typename FieldT>
207207
std::vector<FieldT> additive_FFT_wrapper(const std::vector<FieldT> &v,
208208
const affine_subspace<FieldT> &H)
209209
{
210-
libiop::enter_block("Call to additive_FFT_wrapper");
211-
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
212-
libiop::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
210+
libff::enter_block("Call to additive_FFT_wrapper");
211+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
212+
libff::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
213213
const std::vector<FieldT> result = additive_FFT(v, H);
214-
libiop::leave_block("Call to additive_FFT_wrapper");
214+
libff::leave_block("Call to additive_FFT_wrapper");
215215
return result;
216216
}
217217

218218
template<typename FieldT>
219219
std::vector<FieldT> additive_IFFT_wrapper(const std::vector<FieldT> &v,
220220
const affine_subspace<FieldT> &H)
221221
{
222-
libiop::enter_block("Call to additive_IFFT_wrapper");
223-
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
224-
libiop::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
222+
libff::enter_block("Call to additive_IFFT_wrapper");
223+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
224+
libff::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
225225
const std::vector<FieldT> result = additive_IFFT(v, H);
226-
libiop::leave_block("Call to additive_IFFT_wrapper");
226+
libff::leave_block("Call to additive_IFFT_wrapper");
227227
return result;
228228
}
229229

@@ -239,7 +239,7 @@ std::vector<FieldT> multiplicative_FFT_degree_aware(const std::vector<FieldT> &p
239239
const FieldT &shift)
240240
{
241241
assert(poly_coeffs.size() <= coset.num_elements());
242-
const size_t n = coset.num_elements(), logn = libiop::log2(n);
242+
const size_t n = coset.num_elements(), logn = libff::log2(n);
243243

244244
std::vector<FieldT> a(poly_coeffs);
245245
/** If there is a coset shift x, the degree i term of the polynomial is multiplied by x^i */
@@ -249,7 +249,7 @@ std::vector<FieldT> multiplicative_FFT_degree_aware(const std::vector<FieldT> &p
249249
}
250250
a.resize(n, FieldT::zero());
251251

252-
const size_t poly_dimension = libiop::log2(poly_coeffs.size());
252+
const size_t poly_dimension = libff::log2(poly_coeffs.size());
253253
const size_t poly_size = poly_coeffs.size();
254254
/** When the polynomial is of size k*|coset|, for k < 2^i,
255255
* the first i iterations of Cooley Tukey are easily predictable.
@@ -318,7 +318,7 @@ std::vector<FieldT> multiplicative_FFT_degree_aware(const std::vector<FieldT> &p
318318

319319
template<typename FieldT>
320320
std::vector<FieldT> multiplicative_FFT_internal(
321-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> &poly_coeffs,
321+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> &poly_coeffs,
322322
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
323323
{
324324
assert(poly_coeffs.size() <= domain.num_elements());
@@ -327,7 +327,7 @@ std::vector<FieldT> multiplicative_FFT_internal(
327327

328328
template<typename FieldT>
329329
std::vector<FieldT> multiplicative_FFT_internal(
330-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> &poly_coeffs,
330+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> &poly_coeffs,
331331
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
332332
{
333333
throw std::invalid_argument("attempting to perform multiplicative IFFT with non-multiplicative field type");
@@ -342,7 +342,7 @@ std::vector<FieldT> multiplicative_FFT(const std::vector<FieldT> &poly_coeffs,
342342

343343
template<typename FieldT>
344344
std::vector<FieldT> multiplicative_IFFT_internal(
345-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> &evals,
345+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> &evals,
346346
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
347347
{
348348
assert(domain.num_elements() == evals.size());
@@ -362,7 +362,7 @@ std::vector<FieldT> multiplicative_IFFT_internal(
362362

363363
template<typename FieldT>
364364
std::vector<FieldT> multiplicative_IFFT_internal(
365-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> &evals,
365+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> &evals,
366366
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
367367
{
368368
throw std::invalid_argument("attempting to perform multiplicative IFFT with non-multiplicative field type");
@@ -379,62 +379,62 @@ template<typename FieldT>
379379
std::vector<FieldT> multiplicative_FFT_wrapper(const std::vector<FieldT> &v,
380380
const multiplicative_coset<FieldT> &H)
381381
{
382-
libiop::enter_block("Call to multiplicative_FFT_wrapper");
383-
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
384-
libiop::print_indent(); printf("* Subgroup size: %zu\n", H.num_elements());
382+
libff::enter_block("Call to multiplicative_FFT_wrapper");
383+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
384+
libff::print_indent(); printf("* Subgroup size: %zu\n", H.num_elements());
385385
const std::vector<FieldT> result = multiplicative_FFT(v, H);
386-
libiop::leave_block("Call to multiplicative_FFT_wrapper");
386+
libff::leave_block("Call to multiplicative_FFT_wrapper");
387387
return result;
388388
}
389389

390390
template<typename FieldT>
391391
std::vector<FieldT> multiplicative_IFFT_wrapper(const std::vector<FieldT> &v,
392392
const multiplicative_coset<FieldT> &H)
393393
{
394-
libiop::enter_block("Call to multiplicative_IFFT_wrapper");
395-
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
396-
libiop::print_indent(); printf("* Coset size: %zu\n", H.num_elements());
394+
libff::enter_block("Call to multiplicative_IFFT_wrapper");
395+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
396+
libff::print_indent(); printf("* Coset size: %zu\n", H.num_elements());
397397
if (v.size() == 1)
398398
{
399-
libiop::leave_block("Call to multiplicative_IFFT_wrapper");
399+
libff::leave_block("Call to multiplicative_IFFT_wrapper");
400400
return {v[0]};
401401
}
402402
const std::vector<FieldT> result = multiplicative_IFFT(v, H);
403-
libiop::leave_block("Call to multiplicative_IFFT_wrapper");
403+
libff::leave_block("Call to multiplicative_IFFT_wrapper");
404404
return result;
405405
}
406406

407407
template<typename FieldT>
408-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
408+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
409409
field_subset<FieldT> domain)
410410
{
411411
return multiplicative_FFT_wrapper<FieldT>(coeffs, domain.coset());
412412
}
413413

414414
template<typename FieldT>
415-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> coeffs,
415+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> coeffs,
416416
field_subset<FieldT> domain)
417417
{
418418
return additive_FFT_wrapper<FieldT>(coeffs, domain.subspace());
419419
}
420420

421421
template<typename FieldT>
422-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
422+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
423423
field_subset<FieldT> domain)
424424
{
425425
return multiplicative_IFFT_wrapper<FieldT>(evals, domain.coset());
426426
}
427427

428428
template<typename FieldT>
429-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
429+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
430430
field_subset<FieldT> domain)
431431
{
432432
return additive_IFFT_wrapper<FieldT>(evals, domain.subspace());
433433
}
434434

435435
template<typename FieldT>
436436
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
437-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
437+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
438438
size_t degree,
439439
field_subset<FieldT> domain)
440440
{
@@ -443,7 +443,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
443443
* The evaluations in this coset are every nth element of the evaluations
444444
* over the entire domain, where n = |domain| / |degree|
445445
*/
446-
const size_t closest_power_of_two = round_to_next_power_of_2(degree);
446+
const size_t closest_power_of_two = libff::round_to_next_power_of_2(degree);
447447
field_subset<FieldT> minimal_coset = domain.get_subset_of_order(closest_power_of_two);
448448
std::vector<FieldT> evals_in_minimal_coset;
449449
evals_in_minimal_coset.reserve(closest_power_of_two);
@@ -457,7 +457,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
457457

458458
template<typename FieldT>
459459
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
460-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
460+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
461461
size_t degree,
462462
field_subset<FieldT> domain)
463463
{
@@ -466,7 +466,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
466466
* therefore the evaluations are the first elements of the evaluations
467467
* over the entire domain.
468468
*/
469-
const size_t closest_power_of_two = round_to_next_power_of_2(degree);
469+
const size_t closest_power_of_two = libff::round_to_next_power_of_2(degree);
470470
field_subset<FieldT> minimal_subspace = domain.get_subset_of_order(closest_power_of_two);
471471
std::vector<FieldT> evals_in_minimal_subspace;
472472
evals_in_minimal_subspace.insert(

libiop/algebra/field_subset/basis_utils.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
#include <cstddef>
1212
#include <vector>
13-
#include "libiop/algebra/field_utils.hpp"
13+
#include <libff/algebra/field_utils/field_utils.hpp>
1414
#include "libiop/algebra/polynomials/polynomial.hpp"
1515

1616
namespace libiop {

libiop/algebra/field_subset/field_subset.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ class field_subset {
7171
bool operator!=(const field_subset<FieldT> &other) const;
7272
protected:
7373
void construct_internal(const std::size_t num_elements,
74-
const typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type coset_shift);
74+
const typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type coset_shift);
7575
void construct_internal(const std::size_t num_elements,
76-
const typename enable_if<is_additive<FieldT>::value, FieldT>::type coset_shift);
76+
const typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type coset_shift);
7777
};
7878

7979
} // namespace libiop

0 commit comments

Comments
 (0)