Skip to content

Deduplicate/move libff util functions #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 13, 2021
Merged
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,6 @@ gtest_main.pc
gtest.pc
DartConfiguration.tcl
.DartConfiguration.tcl.swp
.ninja_deps
.ninja_log
build.ninja
8 changes: 0 additions & 8 deletions libiop/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ add_library(
iop

common/common.cpp
common/profiling.cpp

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

# algebra
add_executable(test_common tests/algebra/test_common.cpp)
target_link_libraries(test_common iop gtest_main)

add_executable(test_exponentiation tests/algebra/test_exponentiation.cpp)
target_link_libraries(test_exponentiation iop gtest_main)

Expand Down Expand Up @@ -130,10 +126,6 @@ target_link_libraries(test_successor_ordering iop gtest_main)
add_executable(test_algebra_utils tests/algebra/test_algebra_utils.cpp)
target_link_libraries(test_algebra_utils iop gtest_main)

add_test(
NAME test_common
COMMAND test_common
)
add_test(
NAME test_exponentiation
COMMAND test_exponentiation
Expand Down
6 changes: 0 additions & 6 deletions libiop/algebra/exponentiation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@

namespace libiop {

template<typename FieldT>
FieldT power(const FieldT &base, const std::size_t exponent);

template<typename FieldT>
FieldT power(const FieldT &base, const std::vector<std::size_t> exponent);

template<typename FieldT>
std::vector<FieldT> subset_element_powers(const field_subset<FieldT> &S,
const std::size_t exponent);
Expand Down
54 changes: 1 addition & 53 deletions libiop/algebra/exponentiation.tcc
Original file line number Diff line number Diff line change
@@ -1,57 +1,5 @@
namespace libiop {

template<typename FieldT>
FieldT power(const FieldT &base, const std::size_t exponent)
{
FieldT result = FieldT::one();

bool found_one = false;

for (long i = 8 * sizeof(exponent) - 1; i >= 0; --i)
{
if (found_one)
{
result = result.squared();
}

if (exponent & (1ull << i))
{
found_one = true;
result *= base;
}
}

return result;
}

template<typename FieldT>
FieldT power(const FieldT &base, const std::vector<std::size_t> exponent)
{
FieldT result = FieldT::one();

bool found_one = false;

for (size_t j = 0; j < exponent.size(); j++)
{
size_t cur_exp = exponent[j];
for (long i = 8 * sizeof(cur_exp) - 1; i >= 0; --i)
{
if (found_one)
{
result = result.squared();
}

if (cur_exp & (1ull << i))
{
found_one = true;
result *= base;
}
}
}

return result;
}

template<typename FieldT>
std::vector<FieldT> subspace_to_power_of_two(const affine_subspace<FieldT> &S,
const size_t power_of_two)
Expand Down Expand Up @@ -81,7 +29,7 @@ std::vector<FieldT> subspace_element_powers(const affine_subspace<FieldT> &S,
*
* In the case where the exponent is a power of two, we skip the multiplications.
*/
if (is_power_of_2(exponent))
if (libff::is_power_of_2(exponent))
{
return subspace_to_power_of_two(S, exponent);
}
Expand Down
14 changes: 7 additions & 7 deletions libiop/algebra/fft.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include "libiop/algebra/field_subset/field_subset.hpp"
#include "libiop/algebra/field_subset/subspace.hpp"
#include "libiop/algebra/field_subset/subgroup.hpp"
#include "libiop/common/common.hpp"
#include <libff/common/utils.hpp>

namespace libiop {

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

template<typename FieldT>
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
field_subset<FieldT> domain);

template<typename FieldT>
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> coeffs,
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> coeffs,
field_subset<FieldT> domain);

template<typename FieldT>
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
field_subset<FieldT> domain);

template<typename FieldT>
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
field_subset<FieldT> domain);

template<typename FieldT>
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
size_t degree_bound,
field_subset<FieldT> domain);

template<typename FieldT>
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
size_t degree_bound,
field_subset<FieldT> domain);

Expand Down
66 changes: 33 additions & 33 deletions libiop/algebra/fft.tcc
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
#include <libfqfft/evaluation_domain/domains/basic_radix2_domain.hpp>
#include <libfqfft/evaluation_domain/domains/basic_radix2_domain_aux.hpp>

#include "libiop/algebra/field_utils.hpp"
#include <libff/common/profiling.hpp>
#include <libff/algebra/field_utils/field_utils.hpp>
#include "libiop/algebra/utils.hpp"
#include "libiop/common/profiling.hpp"

namespace libiop {

Expand Down Expand Up @@ -207,23 +207,23 @@ template<typename FieldT>
std::vector<FieldT> additive_FFT_wrapper(const std::vector<FieldT> &v,
const affine_subspace<FieldT> &H)
{
libiop::enter_block("Call to additive_FFT_wrapper");
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
libiop::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
libff::enter_block("Call to additive_FFT_wrapper");
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
libff::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
const std::vector<FieldT> result = additive_FFT(v, H);
libiop::leave_block("Call to additive_FFT_wrapper");
libff::leave_block("Call to additive_FFT_wrapper");
return result;
}

template<typename FieldT>
std::vector<FieldT> additive_IFFT_wrapper(const std::vector<FieldT> &v,
const affine_subspace<FieldT> &H)
{
libiop::enter_block("Call to additive_IFFT_wrapper");
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
libiop::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
libff::enter_block("Call to additive_IFFT_wrapper");
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
libff::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
const std::vector<FieldT> result = additive_IFFT(v, H);
libiop::leave_block("Call to additive_IFFT_wrapper");
libff::leave_block("Call to additive_IFFT_wrapper");
return result;
}

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

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

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

template<typename FieldT>
std::vector<FieldT> multiplicative_FFT_internal(
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> &poly_coeffs,
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> &poly_coeffs,
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
{
assert(poly_coeffs.size() <= domain.num_elements());
Expand All @@ -327,7 +327,7 @@ std::vector<FieldT> multiplicative_FFT_internal(

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

template<typename FieldT>
std::vector<FieldT> multiplicative_IFFT_internal(
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> &evals,
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> &evals,
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
{
assert(domain.num_elements() == evals.size());
Expand All @@ -362,7 +362,7 @@ std::vector<FieldT> multiplicative_IFFT_internal(

template<typename FieldT>
std::vector<FieldT> multiplicative_IFFT_internal(
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> &evals,
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> &evals,
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
{
throw std::invalid_argument("attempting to perform multiplicative IFFT with non-multiplicative field type");
Expand All @@ -379,62 +379,62 @@ template<typename FieldT>
std::vector<FieldT> multiplicative_FFT_wrapper(const std::vector<FieldT> &v,
const multiplicative_coset<FieldT> &H)
{
libiop::enter_block("Call to multiplicative_FFT_wrapper");
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
libiop::print_indent(); printf("* Subgroup size: %zu\n", H.num_elements());
libff::enter_block("Call to multiplicative_FFT_wrapper");
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
libff::print_indent(); printf("* Subgroup size: %zu\n", H.num_elements());
const std::vector<FieldT> result = multiplicative_FFT(v, H);
libiop::leave_block("Call to multiplicative_FFT_wrapper");
libff::leave_block("Call to multiplicative_FFT_wrapper");
return result;
}

template<typename FieldT>
std::vector<FieldT> multiplicative_IFFT_wrapper(const std::vector<FieldT> &v,
const multiplicative_coset<FieldT> &H)
{
libiop::enter_block("Call to multiplicative_IFFT_wrapper");
libiop::print_indent(); printf("* Vector size: %zu\n", v.size());
libiop::print_indent(); printf("* Coset size: %zu\n", H.num_elements());
libff::enter_block("Call to multiplicative_IFFT_wrapper");
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
libff::print_indent(); printf("* Coset size: %zu\n", H.num_elements());
if (v.size() == 1)
{
libiop::leave_block("Call to multiplicative_IFFT_wrapper");
libff::leave_block("Call to multiplicative_IFFT_wrapper");
return {v[0]};
}
const std::vector<FieldT> result = multiplicative_IFFT(v, H);
libiop::leave_block("Call to multiplicative_IFFT_wrapper");
libff::leave_block("Call to multiplicative_IFFT_wrapper");
return result;
}

template<typename FieldT>
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
field_subset<FieldT> domain)
{
return multiplicative_FFT_wrapper<FieldT>(coeffs, domain.coset());
}

template<typename FieldT>
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> coeffs,
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> coeffs,
field_subset<FieldT> domain)
{
return additive_FFT_wrapper<FieldT>(coeffs, domain.subspace());
}

template<typename FieldT>
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
field_subset<FieldT> domain)
{
return multiplicative_IFFT_wrapper<FieldT>(evals, domain.coset());
}

template<typename FieldT>
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
field_subset<FieldT> domain)
{
return additive_IFFT_wrapper<FieldT>(evals, domain.subspace());
}

template<typename FieldT>
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
size_t degree,
field_subset<FieldT> domain)
{
Expand All @@ -443,7 +443,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
* The evaluations in this coset are every nth element of the evaluations
* over the entire domain, where n = |domain| / |degree|
*/
const size_t closest_power_of_two = round_to_next_power_of_2(degree);
const size_t closest_power_of_two = libff::round_to_next_power_of_2(degree);
field_subset<FieldT> minimal_coset = domain.get_subset_of_order(closest_power_of_two);
std::vector<FieldT> evals_in_minimal_coset;
evals_in_minimal_coset.reserve(closest_power_of_two);
Expand All @@ -457,7 +457,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(

template<typename FieldT>
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
size_t degree,
field_subset<FieldT> domain)
{
Expand All @@ -466,7 +466,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
* therefore the evaluations are the first elements of the evaluations
* over the entire domain.
*/
const size_t closest_power_of_two = round_to_next_power_of_2(degree);
const size_t closest_power_of_two = libff::round_to_next_power_of_2(degree);
field_subset<FieldT> minimal_subspace = domain.get_subset_of_order(closest_power_of_two);
std::vector<FieldT> evals_in_minimal_subspace;
evals_in_minimal_subspace.insert(
Expand Down
2 changes: 1 addition & 1 deletion libiop/algebra/field_subset/basis_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

#include <cstddef>
#include <vector>
#include "libiop/algebra/field_utils.hpp"
#include <libff/algebra/field_utils/field_utils.hpp>
#include "libiop/algebra/polynomials/polynomial.hpp"

namespace libiop {
Expand Down
4 changes: 2 additions & 2 deletions libiop/algebra/field_subset/field_subset.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ class field_subset {
bool operator!=(const field_subset<FieldT> &other) const;
protected:
void construct_internal(const std::size_t num_elements,
const typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type coset_shift);
const typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type coset_shift);
void construct_internal(const std::size_t num_elements,
const typename enable_if<is_additive<FieldT>::value, FieldT>::type coset_shift);
const typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type coset_shift);
};

} // namespace libiop
Expand Down
Loading