solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit c0a4d96a4426ea5d63092ad38d2442f390b83c92
parent de3df0972520c90275b70469ac2a5c8149b2c525
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon, 10 Oct 2016 13:41:33 +0200

Change failed realisations' management.

Diffstat:
Msrc/ssol.h | 11+++++++++++
Msrc/ssol_estimator.c | 21+++++++++++++++++++++
Msrc/ssol_estimator_c.h | 1+
Msrc/ssol_solver.c | 73++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/test_ssol_estimator.c | 9+++++++++
Msrc/test_ssol_solver1.c | 51++++++++++++++++++++++++++++++++++-----------------
Msrc/test_ssol_solver2.c | 9++++++---
Msrc/test_ssol_solver2b.c | 12++++++++----
Msrc/test_ssol_solver3.c | 12++++++++----
Msrc/test_ssol_solver3N.c | 10+++++++---
Msrc/test_ssol_solver4.c | 12++++++++----
Msrc/test_ssol_solver5.c | 10+++++++---
12 files changed, 154 insertions(+), 77 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -222,6 +222,7 @@ struct ssol_estimator_status { double V; /* Variance */ double SE; /* Standard error, i.e. sqrt(V / N) */ size_t N; /* Samples count */ + size_t Nf; /* Failed samples count */ }; /* the always-ON indicators (MC computations) */ @@ -622,6 +623,16 @@ ssol_estimator_get_status struct ssol_estimator_status* status); SSOL_API res_T +ssol_estimator_get_count + (const struct ssol_estimator* estimator, + size_t* count); + +SSOL_API res_T +ssol_estimator_get_failed_count + (const struct ssol_estimator* estimator, + size_t* count); + +SSOL_API res_T ssol_estimator_clear (struct ssol_estimator* estimator); diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c @@ -114,6 +114,7 @@ ssol_estimator_get_status default: FATAL("Unreachable code.\n"); break; } status->N = estimator->realisation_count; + status->Nf = estimator->failed_count; status->E = data->weight / (double)status->N; status->V = data->sqr_weight / (double)status->N - status->E * status->E; status->SE = (status->V > 0) ? sqrt(status->V / (double)status->N) : 0; @@ -121,6 +122,26 @@ ssol_estimator_get_status } res_T +ssol_estimator_get_count +(const struct ssol_estimator* estimator, + size_t* count) +{ + if (!estimator || !count) return RES_BAD_ARG; + *count = estimator->realisation_count; + return RES_OK; +} + +res_T +ssol_estimator_get_failed_count +(const struct ssol_estimator* estimator, + size_t* count) +{ + if (!estimator || !count) return RES_BAD_ARG; + *count = estimator->failed_count; + return RES_OK; +} + +res_T ssol_estimator_clear (struct ssol_estimator* estimator) { diff --git a/src/ssol_estimator_c.h b/src/ssol_estimator_c.h @@ -33,6 +33,7 @@ static const struct mc_data MC_DATA_NULL = MC_DATA_NULL__; struct ssol_estimator { size_t realisation_count; + size_t failed_count; /* the implicit MC computations */ struct mc_data shadow; struct mc_data missing; diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -795,45 +795,40 @@ ssol_solve res = init_realisation(scene, rng, output, &rs); if (res != RES_OK) goto error; - for (r = 0; r < realisations_count; ) { - do { - struct segment* seg; - double w; - reset_realisation(r, &rs); - sample_starting_point(&rs); - sample_input_sundir(&rs); - sample_wavelength(&rs); - - /* check if the point receives sun light */ - if (receive_sunlight(&rs)) { - /* start propagating from mirror */ - do { - if (RES_OK == setup_next_segment(&rs)) { - propagate(&rs); - } - } while (!rs.end); - } - if (rs.error) { - /* TODO: must retry failed realisations */ - log_error(scene->dev, "%s: realisation failure.\n", FUNC_NAME); - goto error; - } - /* propagation ended: feed implicit MC data */ - seg = current_segment(&rs); - w = seg->weight; - - ASSERT(!rs.success | !rs.shadow); - if (rs.shadow) { - estimator->shadow.weight += w; - estimator->shadow.sqr_weight += w * w; - } - else if (!rs.success) { - estimator->missing.weight += w; - estimator->missing.sqr_weight += w * w; - } - - r++; - } while (rs.error); + for (r = 0; r < realisations_count; r++) { + struct segment* seg; + double w; + reset_realisation(r, &rs); + sample_starting_point(&rs); + sample_input_sundir(&rs); + sample_wavelength(&rs); + + /* check if the point receives sun light */ + if (receive_sunlight(&rs)) { + /* start propagating from mirror */ + do { + if (RES_OK == setup_next_segment(&rs)) { + propagate(&rs); + } + } while (!rs.end); + } + if (rs.error) { + estimator->failed_count++; + /* FIXME: remove failed realisations' outputs from the output stream */ + } + /* propagation ended: feed implicit MC data */ + seg = current_segment(&rs); + w = seg->weight; + + ASSERT(!rs.success | !rs.shadow); + if (rs.shadow) { + estimator->shadow.weight += w; + estimator->shadow.sqr_weight += w * w; + } + else if (!rs.success) { + estimator->missing.weight += w; + estimator->missing.sqr_weight += w * w; + } } estimator->realisation_count += realisations_count; diff --git a/src/test_ssol_estimator.c b/src/test_ssol_estimator.c @@ -41,6 +41,7 @@ main(int argc, char** argv) struct ssp_rng* rng; struct ssol_estimator* estimator; struct ssol_estimator_status status; + size_t count; (void) argc, (void) argv; @@ -70,6 +71,14 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, NULL), RES_BAD_ARG); CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); + CHECK(ssol_estimator_get_count(NULL, &count), RES_BAD_ARG); + CHECK(ssol_estimator_get_count(estimator, NULL), RES_BAD_ARG); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + + CHECK(ssol_estimator_get_failed_count(NULL, &count), RES_BAD_ARG); + CHECK(ssol_estimator_get_failed_count(estimator, NULL), RES_BAD_ARG); + CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK); + CHECK(ssol_estimator_ref_put(estimator), RES_OK); /* free data */ diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -67,6 +67,7 @@ main(int argc, char** argv) double transform1[12]; /* 3x4 column major matrix */ double transform2[12]; /* 3x4 column major matrix */ double dbl; + size_t count, fcount; FILE* tmp = NULL; double m, std; uint32_t r_id; @@ -196,26 +197,34 @@ main(int argc, char** argv) /* can sample any geometry; variance is high */ NCHECK(tmp = tmpfile(), 0); -#define N 10000 +#define N__ 10000 CHECK(ssol_estimator_clear(estimator), RES_OK); - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target, 1, &r_id), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(fclose(tmp), 0); + CHECK(ssol_estimator_get_failed_count(estimator, &fcount), RES_OK); + CHECK(fcount, 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); #define COS cos(PI / 4) #define DNI_cos (1000 * COS) CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); #define SQR(x) ((x)*(x)) - dbl = sqrt((SQR(12 * DNI_cos) / 3 - SQR(4 * DNI_cos)) / N); + dbl = sqrt((SQR(12 * DNI_cos) / 3 - SQR(4 * DNI_cos)) / count); CHECK(eq_eps(std, dbl, dbl*1e-2), 1); - CHECK(fclose(tmp), 0); /* target was sampled but shadowed by secondary */ CHECK(ssol_estimator_get_status(estimator, STATUS_SHADOW, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, m, 2 * dbl), 1); + CHECK(status.N, count); + CHECK(status.Nf, fcount); CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, m, status.SE), 1); + CHECK(status.N, count); + CHECK(status.Nf, fcount); /* sample primary mirror only; variance is low */ CHECK(ssol_instance_dont_sample(target, 1), RES_OK); @@ -226,12 +235,14 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); CHECK(ssol_estimator_clear(estimator), RES_OK); - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); - CHECK(fclose(tmp), 0); CHECK(ssol_estimator_get_status(estimator, STATUS_SHADOW, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); @@ -248,10 +259,12 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); CHECK(ssol_estimator_clear(estimator), RES_OK); - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); - logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); + logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); CHECK(ssol_scene_detach_atmosphere(scene, atm), RES_OK); @@ -274,10 +287,12 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); CHECK(ssol_estimator_clear(estimator), RES_OK); - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); - logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); + logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); #define K (exp(-0.1 * 4 * sqrt(2))) CHECK(eq_eps(m, 4 * K * DNI_cos, MMAX(4 * K * DNI_cos * 1e-1, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); @@ -300,10 +315,12 @@ main(int argc, char** argv) CHECK(ssol_spectrum_setup(abs, wavelengths, ka, 2), RES_OK); NCHECK(tmp = tmpfile(), 0); CHECK(ssol_estimator_clear(estimator), RES_OK); - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); - logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); + logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); #define K2 (exp(-0.121 * 4 * sqrt(2))) CHECK(eq_eps(m, 4 * K2 * DNI_cos, MMAX(4 * K2 * DNI_cos * 1e-4, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c @@ -78,6 +78,7 @@ main(int argc, char** argv) double transform1[12]; /* 3x4 column major matrix */ double transform2[12]; /* 3x4 column major matrix */ double transform3[12]; /* 3x4 column major matrix */ + size_t count; FILE* tmp; double m, std; uint32_t r_id; @@ -181,10 +182,12 @@ main(int argc, char** argv) CHECK(ssol_scene_attach_instance(scene, target), RES_OK); NCHECK(tmp = tmpfile(), 0); -#define N 10000 - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); +#define N__ 10000 + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target, 1, &r_id), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c @@ -78,6 +78,7 @@ main(int argc, char** argv) double transform1[12]; /* 3x4 column major matrix */ double transform2[12]; /* 3x4 column major matrix */ double transform3[12]; /* 3x4 column major matrix */ + size_t count; FILE* tmp; double m, std; uint32_t r_id; @@ -186,22 +187,25 @@ main(int argc, char** argv) CHECK(ssol_scene_attach_instance(scene, target), RES_OK); NCHECK(tmp = tmpfile(), 0); -#define N 50000 - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); +#define N__ 50000 + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target, 1, &r_id), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) CHECK(eq_eps(m, 2 * DNI_cos, MMAX(2 * DNI_cos * 1e-2, std)), 1); #define SQR(x) ((x)*(x)) - CHECK(eq_eps(std, sqrt((SQR(4 * DNI_cos) / 2 - SQR(2 * DNI_cos)) / N), 1e-3), 1); + CHECK(eq_eps(std, sqrt((SQR(4 * DNI_cos) / 2 - SQR(2 * DNI_cos)) / count), 1e-3), 1); CHECK(ssol_estimator_get_status(estimator, STATUS_SHADOW, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); + CHECK(status.Nf, 0); /* free data */ diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c @@ -67,6 +67,7 @@ main(int argc, char** argv) double wavelengths[3] = { 1, 2, 3 }; double intensities[3] = { 1, 0.8, 1 }; double transform[12]; /* 3x4 column major matrix */ + size_t count; FILE* tmp; double m, std; uint32_t r_id; @@ -140,22 +141,25 @@ main(int argc, char** argv) CHECK(ssol_scene_attach_instance(scene, target), RES_OK); NCHECK(tmp = tmpfile(), 0); -#define N 20000 - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); +#define N__ 20000 + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target, 1, &r_id), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) CHECK(eq_eps(m, 4 * DNI_cos, 4 * DNI_cos * 2e-1), 1); #define SQR(x) ((x)*(x)) - CHECK(eq_eps(std, sqrt((SQR(400 * DNI_cos) / 100 - SQR(4 * DNI_cos)) / N), 20), 1); + CHECK(eq_eps(std, sqrt((SQR(400 * DNI_cos) / 100 - SQR(4 * DNI_cos)) / count), 20), 1); CHECK(ssol_estimator_get_status(estimator, STATUS_SHADOW, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); + CHECK(status.Nf, 0); /* free data */ diff --git a/src/test_ssol_solver3N.c b/src/test_ssol_solver3N.c @@ -111,6 +111,7 @@ main(int argc, char** argv) double wavelengths[3] = { 1, 2, 3 }; double intensities[3] = { 1, 0.8, 1 }; double transform[12]; /* 3x4 column major matrix */ + size_t count; FILE* tmp; double m, std; int i, j, k; @@ -205,10 +206,12 @@ main(int argc, char** argv) CHECK(ssol_scene_attach_instance(scene, target), RES_OK); NCHECK(tmp = tmpfile(), 0); -#define N 10000 - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); +#define N__ 10000 + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target, 1, &r_id), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 8)) @@ -219,6 +222,7 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); + CHECK(status.Nf, 0); /* free data */ diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c @@ -68,6 +68,7 @@ main(int argc, char** argv) double wavelengths[3] = { 1, 2, 3 }; double intensities[3] = { 1, 0.8, 1 }; double transform[12]; /* 3x4 column major matrix */ + size_t count; FILE* tmp; double m1, std1, m2, std2; uint32_t r_id1, r_id2; @@ -147,12 +148,14 @@ main(int argc, char** argv) CHECK(ssol_scene_attach_instance(scene, target2), RES_OK); NCHECK(tmp = tmpfile(), 0); -#define N 10000 - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); +#define N__ 10000 + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target1, 1, &r_id1), RES_OK); CHECK(get_receiver_id(target2, 1, &r_id2), RES_OK); - CHECK(pp_sum(tmp, r_id1, N, &m1, &std1), RES_OK); - CHECK(pp_sum(tmp, r_id2, N, &m2, &std2), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id1, count, &m1, &std1), RES_OK); + CHECK(pp_sum(tmp, r_id2, count, &m2, &std2), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m1, std1); #define DNI_cos (1000 * cos(0)) @@ -166,6 +169,7 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); + CHECK(status.Nf, 0); /* free data */ diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c @@ -67,6 +67,7 @@ main(int argc, char** argv) double wavelengths[3] = { 1, 2, 3 }; double intensities[3] = { 1, 0.8, 1 }; double transform[12]; /* 3x4 column major matrix */ + size_t count; FILE* tmp; double m, std; uint32_t r_id; @@ -140,10 +141,12 @@ main(int argc, char** argv) CHECK(ssol_scene_attach_instance(scene, target), RES_OK); NCHECK(tmp = tmpfile(), 0); -#define N 10000 - CHECK(ssol_solve(scene, rng, N, tmp, estimator), RES_OK); +#define N__ 10000 + CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(get_receiver_id(target, 1, &r_id), RES_OK); - CHECK(pp_sum(tmp, r_id, N, &m, &std), RES_OK); + CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); + CHECK(count, N__); + CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(0)) @@ -155,6 +158,7 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_status(estimator, STATUS_MISSING, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.E, status.SE); CHECK(eq_eps(status.E, 0, 1e-4), 1); + CHECK(status.Nf, 0); /* free data */