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:
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 */