Add some rudimentary error and debug handling

This commit is contained in:
Ben Edgington 2021-02-03 12:57:47 +00:00
parent 1e885ff898
commit ece913f636
6 changed files with 47 additions and 45 deletions

View File

@ -20,16 +20,14 @@
typedef enum { typedef enum {
C_KZG_SUCCESS = 0, C_KZG_SUCCESS = 0,
C_KZG_BADARGS, C_KZG_BADARGS,
c_KZG_ERROR, C_KZG_ERROR,
} C_KZG_RET; } C_KZG_RET;
#include <stdbool.h> #include <stdbool.h>
#include "../inc/blst.h" #include "../inc/blst.h"
#define DEBUG
#include <assert.h>
#ifdef DEBUG #ifdef DEBUG
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#define ASSERT(cond, ret) if (!(cond)) \ #define ASSERT(cond, ret) if (!(cond)) \
{ \ { \

View File

@ -41,7 +41,8 @@ const uint64_t inv_fft_expected[][4] =
void compare_sft_fft(void) { void compare_sft_fft(void) {
// Initialise: ascending values of i (could be anything), and arbitrary size // Initialise: ascending values of i (could be anything), and arbitrary size
unsigned int size = 12; unsigned int size = 12;
FFTSettings fs = new_fft_settings(size); FFTSettings fs;
TEST_CHECK(new_fft_settings(&fs, size) == C_KZG_SUCCESS);
blst_fr data[fs.max_width], out0[fs.max_width], out1[fs.max_width]; blst_fr data[fs.max_width], out0[fs.max_width], out1[fs.max_width];
for (int i = 0; i < fs.max_width; i++) { for (int i = 0; i < fs.max_width; i++) {
fr_from_uint64(data + i, i); fr_from_uint64(data + i, i);
@ -62,7 +63,8 @@ void compare_sft_fft(void) {
void roundtrip_fft(void) { void roundtrip_fft(void) {
// Initialise: ascending values of i, and arbitrary size // Initialise: ascending values of i, and arbitrary size
unsigned int size = 12; unsigned int size = 12;
FFTSettings fs = new_fft_settings(size); FFTSettings fs;
TEST_CHECK(new_fft_settings(&fs, size) == C_KZG_SUCCESS);
blst_fr data[fs.max_width], coeffs[fs.max_width]; blst_fr data[fs.max_width], coeffs[fs.max_width];
for (int i = 0; i < fs.max_width; i++) { for (int i = 0; i < fs.max_width; i++) {
fr_from_uint64(data + i, i); fr_from_uint64(data + i, i);
@ -84,7 +86,8 @@ void roundtrip_fft(void) {
void inverse_fft(void) { void inverse_fft(void) {
// Initialise: ascending values of i // Initialise: ascending values of i
FFTSettings fs = new_fft_settings(4); FFTSettings fs;
TEST_CHECK(new_fft_settings(&fs, 4) == C_KZG_SUCCESS);
blst_fr data[fs.max_width], out[fs.max_width]; blst_fr data[fs.max_width], out[fs.max_width];
for (int i = 0; i < fs.max_width; i++) { for (int i = 0; i < fs.max_width; i++) {
fr_from_uint64(&data[i], i); fr_from_uint64(&data[i], i);

View File

@ -59,7 +59,8 @@ void p1_sub_works(void) {
void compare_sft_fft(void) { void compare_sft_fft(void) {
// Initialise: arbitrary size // Initialise: arbitrary size
unsigned int size = 6; unsigned int size = 6;
FFTSettings fs = new_fft_settings(size); FFTSettings fs;
TEST_CHECK(new_fft_settings(&fs, size) == C_KZG_SUCCESS);
blst_p1 data[fs.max_width], slow[fs.max_width], fast[fs.max_width]; blst_p1 data[fs.max_width], slow[fs.max_width], fast[fs.max_width];
make_data(data, fs.max_width); make_data(data, fs.max_width);
@ -78,7 +79,8 @@ void compare_sft_fft(void) {
void roundtrip_fft(void) { void roundtrip_fft(void) {
// Initialise: arbitrary size // Initialise: arbitrary size
unsigned int size = 10; unsigned int size = 10;
FFTSettings fs = new_fft_settings(size); FFTSettings fs;
TEST_CHECK(new_fft_settings(&fs, size) == C_KZG_SUCCESS);
blst_p1 expected[fs.max_width], data[fs.max_width], coeffs[fs.max_width]; blst_p1 expected[fs.max_width], data[fs.max_width], coeffs[fs.max_width];
make_data(expected, fs.max_width); make_data(expected, fs.max_width);
make_data(data, fs.max_width); make_data(data, fs.max_width);

View File

@ -31,41 +31,42 @@ void fr_from_uint64(blst_fr *a, uint64_t n) {
blst_fr_from_uint64(a, vals); blst_fr_from_uint64(a, vals);
} }
// Returns an array of powers of the root of unity // Create an array of powers of the root of unity
// Allocates space for the array that needs to be freed later // The `out` array must be of size `width + 1`
blst_fr *expand_root_of_unity(blst_fr *root_of_unity, uint64_t width) { C_KZG_RET expand_root_of_unity(blst_fr *roots, blst_fr *root_of_unity, uint64_t width) {
blst_fr *roots = malloc((width + 1) * sizeof(blst_fr));
roots[0] = one; roots[0] = one;
roots[1] = *root_of_unity; roots[1] = *root_of_unity;
for (int i = 2; !is_one(&roots[i - 1]); i++) { for (int i = 2; !is_one(&roots[i - 1]); i++) {
//ASSERT(i <= width, C_KZG_ERROR); ASSERT(i <= width, C_KZG_ERROR);
assert(i <= width);
blst_fr_mul(&roots[i], &roots[i - 1], root_of_unity); blst_fr_mul(&roots[i], &roots[i - 1], root_of_unity);
} }
assert(is_one(&roots[width])); ASSERT(is_one(&roots[width]), C_KZG_ERROR);
return roots; return C_KZG_SUCCESS;
} }
// Return a reversed copy of the list of Fr provided // Create a reversed list of Fr provided
// `width` is one less than the length of `r` // `width` is one less than the length of `roots`
// Allocates space for the array that needs to be freed later C_KZG_RET reverse(blst_fr *out, blst_fr *roots, uint64_t width) {
blst_fr *reverse(blst_fr *r, uint64_t width) {
blst_fr *rr = malloc((width + 1) * sizeof(blst_fr));
for (int i = 0; i <= width; i++) { for (int i = 0; i <= width; i++) {
rr[i] = r[width - i]; out[i] = roots[width - i];
} }
return rr;
return C_KZG_SUCCESS;
} }
FFTSettings new_fft_settings(unsigned int max_scale) { C_KZG_RET new_fft_settings(FFTSettings *s, unsigned int max_scale) {
FFTSettings s; C_KZG_RET ret;
s.max_width = (uint64_t)1 << max_scale; s->max_width = (uint64_t)1 << max_scale;
blst_fr_from_uint64(&s.root_of_unity, scale2_root_of_unity[max_scale]); blst_fr_from_uint64(&s->root_of_unity, scale2_root_of_unity[max_scale]);
s.expanded_roots_of_unity = expand_root_of_unity(&s.root_of_unity, s.max_width); s->expanded_roots_of_unity = malloc((s->max_width + 1) * sizeof(blst_fr));
s.reverse_roots_of_unity = reverse(s.expanded_roots_of_unity, s.max_width); s->reverse_roots_of_unity = malloc((s->max_width + 1) * sizeof(blst_fr));
return s;
ret = expand_root_of_unity(s->expanded_roots_of_unity, &s->root_of_unity, s->max_width);
if (ret != C_KZG_SUCCESS) return ret;
ret = reverse(s->reverse_roots_of_unity, s->expanded_roots_of_unity, s->max_width);
return ret;
} }
void free_fft_settings(FFTSettings *s) { void free_fft_settings(FFTSettings *s) {

View File

@ -72,7 +72,7 @@ typedef struct {
bool is_one(const blst_fr *fr_p); bool is_one(const blst_fr *fr_p);
bool is_power_of_two(uint64_t n); bool is_power_of_two(uint64_t n);
void fr_from_uint64(blst_fr *a, uint64_t n); void fr_from_uint64(blst_fr *a, uint64_t n);
blst_fr *expand_root_of_unity(blst_fr *root_of_unity, uint64_t width); C_KZG_RET expand_root_of_unity(blst_fr * roots, blst_fr *root_of_unity, uint64_t width);
blst_fr *reverse(blst_fr *r, uint64_t width); C_KZG_RET reverse(blst_fr *out, blst_fr *roots, uint64_t width);
FFTSettings new_fft_settings(unsigned int max_scale); C_KZG_RET new_fft_settings(FFTSettings *s, unsigned int max_scale);
void free_fft_settings(FFTSettings *s); void free_fft_settings(FFTSettings *s);

View File

@ -43,8 +43,8 @@ void roots_of_unity_are_plausible(void) {
void reverse_works(void) { void reverse_works(void) {
int n = 24; int n = 24;
blst_fr arr[n + 1]; blst_fr arr[n + 1], rev[n + 1];
blst_fr *rev, diff; blst_fr diff;
// Initialise - increasing values // Initialise - increasing values
arr[0] = one; arr[0] = one;
@ -53,7 +53,7 @@ void reverse_works(void) {
} }
// Reverse // Reverse
rev = reverse(arr, n); TEST_CHECK(reverse(rev, arr, n) == C_KZG_SUCCESS);
// Verify - decreasing values // Verify - decreasing values
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
@ -61,19 +61,17 @@ void reverse_works(void) {
TEST_CHECK(true == is_one(&diff)); TEST_CHECK(true == is_one(&diff));
} }
TEST_CHECK(true == is_one(rev + n)); TEST_CHECK(true == is_one(rev + n));
free(rev);
} }
void expand_roots_is_plausible(void) { void expand_roots_is_plausible(void) {
// Just test one (largeish) value of scale // Just test one (largeish) value of scale
unsigned int scale = 20; unsigned int scale = 15;
unsigned int width = 1 << scale; unsigned int width = 1 << scale;
blst_fr root, *expanded, prod; blst_fr root, expanded[width + 1], prod;
// Initialise // Initialise
blst_fr_from_uint64(&root, scale2_root_of_unity[scale]); blst_fr_from_uint64(&root, scale2_root_of_unity[scale]);
expanded = expand_root_of_unity(&root, width); TEST_CHECK(expand_root_of_unity(expanded, &root, width) == C_KZG_SUCCESS);
// Verify - each pair should multiply to one // Verify - each pair should multiply to one
TEST_CHECK(true == is_one(expanded + 0)); TEST_CHECK(true == is_one(expanded + 0));
@ -82,8 +80,6 @@ void expand_roots_is_plausible(void) {
blst_fr_mul(&prod, expanded + i, expanded + width - i); blst_fr_mul(&prod, expanded + i, expanded + width - i);
TEST_CHECK(true == is_one(&prod)); TEST_CHECK(true == is_one(&prod));
} }
free(expanded);
} }
void new_fft_settings_is_plausible(void) { void new_fft_settings_is_plausible(void) {
@ -91,7 +87,9 @@ void new_fft_settings_is_plausible(void) {
unsigned int scale = 21; unsigned int scale = 21;
unsigned int width = 1 << scale; unsigned int width = 1 << scale;
blst_fr prod; blst_fr prod;
FFTSettings s = new_fft_settings(scale); FFTSettings s;
TEST_CHECK(new_fft_settings(&s, scale) == C_KZG_SUCCESS);
// Verify - each pair should multiply to one // Verify - each pair should multiply to one
for (unsigned int i = 1; i <= width; i++) { for (unsigned int i = 1; i <= width; i++) {