commit 9c0d4f50a31ee739d9aa72c38b4f96cfd869f235
parent 9a5052f9134043e62f9711c1172211150f2d029e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 15 Jun 2021 10:22:22 +0200
Add the read/write of random state feature
Scope limited to probe computations, more later
Diffstat:
8 files changed, 109 insertions(+), 4 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -75,6 +75,7 @@ find_package(Star3D 0.7.3 REQUIRED)
find_package(StarEnc3D 0.4.2 REQUIRED)
find_package(Stardis 0.11 REQUIRED)
find_package(StarSTL 0.3 REQUIRED)
+find_package(StarSP 0.8.1 REQUIRED)
if(MSVC)
find_package(MuslGetopt REQUIRED)
endif()
@@ -86,6 +87,7 @@ include_directories(
${StarEnc3D_INCLUDE_DIR}
${Stardis_INCLUDE_DIR}
${StarSTL_INCLUDE_DIR}
+ ${StarSP_INCLUDE_DIR}
${CMAKE_CURRENT_BINARY_DIR})
if(MSVC)
include_directories(${MuslGetopt_INCLUDE_DIR})
@@ -97,11 +99,11 @@ include(rcmake_runtime)
if(CMAKE_COMPILER_IS_GNUCC)
rcmake_append_runtime_dirs(_runtime_dirs
- RSys Stardis Star3D StarGeom3D StarEnc3D StarSTL)
+ RSys Stardis Star3D StarGeom3D StarEnc3D StarSTL StarSP)
endif()
if(MSVC)
rcmake_append_runtime_dirs(_runtime_dirs
- RSys MuslGetopt Stardis Star3D StarGeom3D StarEnc3D StarSTL)
+ RSys MuslGetopt Stardis Star3D StarGeom3D StarEnc3D StarSTL StarSP)
endif()
###############################################################################
@@ -156,7 +158,7 @@ set_target_properties(stardis
PROPERTIES VERSION ${SDIS_VERSION})
target_link_libraries(stardis
- Stardis Star3D StarGeom3D StarEnc3D StarSTL RSys ${GETOPT_LIB} ${MATH_LIB})
+ Stardis Star3D StarGeom3D StarEnc3D StarSTL StarSP RSys ${GETOPT_LIB} ${MATH_LIB})
###############################################################################
# Define output & install directories
diff --git a/src/stardis-app.c b/src/stardis-app.c
@@ -225,6 +225,8 @@ stardis_init
str_init(stardis->allocator, &stardis->paths_filename);
str_init(stardis->allocator, &stardis->bin_green_filename);
str_init(stardis->allocator, &stardis->end_paths_filename);
+ str_init(stardis->allocator, &stardis->rndgen_state_in_filename);
+ str_init(stardis->allocator, &stardis->rndgen_state_out_filename);
str_init(stardis->allocator, &stardis->chunks_prefix);
darray_size_t_init(stardis->allocator, &stardis->compute_surface.primitives);
darray_sides_init(stardis->allocator, &stardis->compute_surface.sides);
@@ -362,6 +364,14 @@ stardis_init
if(args->end_paths_filename) {
ERR(str_set(&stardis->end_paths_filename, args->end_paths_filename));
}
+ if(args->rndgen_state_in_filename) {
+ ERR(str_set(&stardis->rndgen_state_in_filename,
+ args->rndgen_state_in_filename));
+ }
+ if(args->rndgen_state_out_filename) {
+ ERR(str_set(&stardis->rndgen_state_out_filename,
+ args->rndgen_state_out_filename));
+ }
}
/* If computation is on a volume, check medium is known */
diff --git a/src/stardis-app.h b/src/stardis-app.h
@@ -814,6 +814,8 @@ struct stardis {
struct str paths_filename;
struct str bin_green_filename;
struct str end_paths_filename;
+ struct str rndgen_state_in_filename;
+ struct str rndgen_state_out_filename;
struct str chunks_prefix;
int mode;
size_t samples;
diff --git a/src/stardis-compute.c b/src/stardis-compute.c
@@ -24,6 +24,7 @@
#include <star/s3d.h>
#include <star/sg3d_sXd_helper.h>
+#include <star/ssp.h>
#include <rsys/double3.h>
#include <rsys/double2.h>
@@ -428,6 +429,17 @@ compute_probe(struct stardis* stardis, struct time* start)
ERR(dump_green_ascii(green, stardis, stdout));
}
} else {
+ /* Input random state? */
+ if(!str_is_empty(&stardis->rndgen_state_in_filename)) {
+ stream = fopen(str_cget(&stardis->rndgen_state_in_filename), "r");
+ if(!stream) {
+ res = RES_IO_ERR;
+ goto error;
+ }
+ ERR(ssp_rng_create(stardis->allocator, &ssp_rng_mt19937_64, &args.rng_state));
+ ERR(read_random_generator_state(args.rng_state, stream));
+ fclose(stream); stream = NULL;
+ }
args.register_paths = stardis->dump_paths;
time_current(&compute_start);
ERR(sdis_solve_probe(stardis->sdis_scn, &args, &estimator));
@@ -440,6 +452,17 @@ compute_probe(struct stardis* stardis, struct time* start)
dump_ctx.stardis = stardis;
dump_ctx.rank = 0;
ERR(sdis_estimator_for_each_path(estimator, dump_path, &dump_ctx));
+
+ /* Output random state? */
+ if(!str_is_empty(&stardis->rndgen_state_out_filename)) {
+ stream = fopen(str_cget(&stardis->rndgen_state_out_filename), "wb");
+ if(!stream) {
+ res = RES_IO_ERR;
+ goto error;
+ }
+ ERR(write_random_generator_state(estimator, stream));
+ fclose(stream); stream = NULL;
+ }
}
end:
diff --git a/src/stardis-output.c b/src/stardis-output.c
@@ -25,6 +25,7 @@
#include<star/senc3d.h>
#include<star/sg3d.h>
+#include<star/ssp.h>
#include <rsys/math.h>
#include <rsys/mem_allocator.h>
@@ -1823,3 +1824,23 @@ exit:
error:
goto exit;
}
+
+res_T
+write_random_generator_state
+ (struct sdis_estimator* estimator,
+ FILE* stream)
+{
+ res_T res;
+ struct ssp_rng* state;
+ res = sdis_estimator_get_rng_state(estimator, &state);
+ if(res != RES_OK) return res;
+ return ssp_rng_write(state, stream);
+}
+
+res_T
+read_random_generator_state
+ (struct ssp_rng* state,
+ FILE* stream)
+{
+ return ssp_rng_read(state, stream);
+}
diff --git a/src/stardis-output.h b/src/stardis-output.h
@@ -32,6 +32,7 @@ struct geometry;
struct vertex;
struct darray_estimators;
struct time;
+struct ssp_rng;
struct dump_path_context {
unsigned long rank;
@@ -117,4 +118,14 @@ dump_model_as_c_chunks
(struct stardis* stardis,
FILE* stream);
+extern res_T
+write_random_generator_state
+ (struct sdis_estimator* estimator,
+ FILE* stream);
+
+extern res_T
+read_random_generator_state
+ (struct ssp_rng* state,
+ FILE* stream);
+
#endif
diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c
@@ -502,6 +502,12 @@ short_help
fprintf(stream, "\n -V LEVEL\n");
fprintf(stream, " Set the verbosity level.\n");
+
+ fprintf(stream, "\n -x <FILE>\n");
+ fprintf(stream, " Use a random generator's state read from a file.\n");
+
+ fprintf(stream, "\n -X <FILE>\n");
+ fprintf(stream, " Save the final random generator's state in a file.\n");
}
#define FREE_AARRAY(ARRAY) \
@@ -559,7 +565,7 @@ parse_args
{
int opt = 0, n_used = 0;
size_t len = 0;
- const char option_list[] = "a:c:dD:eF:gG:hm:M:n:p:P:r:R:s:S:t:vV:";
+ const char option_list[] = "a:c:dD:eF:gG:hm:M:n:p:P:r:R:s:S:t:vV:x:X:";
char buf[128];
struct str keep;
char** line = NULL;
@@ -885,6 +891,14 @@ parse_args
goto error;
}
break;
+
+ case 'x':
+ args->rndgen_state_in_filename = optarg;
+ break;
+
+ case 'X':
+ args->rndgen_state_out_filename = optarg;
+ break;
}
}
@@ -973,6 +987,26 @@ parse_args
}
}
+ if(args->rndgen_state_in_filename && !(args->mode & COMPUTE_MODES)) {
+ res = RES_BAD_ARG;
+ print_multiple_modes(buf, sizeof(buf), COMPUTE_MODES, 0);
+ logger_print(args->logger, LOG_ERROR,
+ "Option -x can only be used in conjunction with an option"
+ " that launch a MC computation (%s).\n",
+ buf);
+ goto error;
+ }
+
+ if(args->rndgen_state_out_filename && !(args->mode & COMPUTE_MODES)) {
+ res = RES_BAD_ARG;
+ print_multiple_modes(buf, sizeof(buf), COMPUTE_MODES, 0);
+ logger_print(args->logger, LOG_ERROR,
+ "Option -X can only be used in conjunction with an option"
+ " that launch a MC computation (%s).\n",
+ buf);
+ goto error;
+ }
+
end:
FREE_AARRAY(line);
str_release(&keep);
diff --git a/src/stardis-parsing.h b/src/stardis-parsing.h
@@ -103,6 +103,8 @@ struct args {
char* bin_green_filename;
char* end_paths_filename;
char* paths_filename;
+ char* rndgen_state_in_filename;
+ char* rndgen_state_out_filename;
char* chunks_prefix;
size_t samples;
unsigned nthreads;