diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e229a29a99db2d9b2e2e26e7500ffdbedf97503..b39d94c6a59ba9b13c52909c4f1b54490a9ea985 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -87,17 +87,21 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.8.0) endif() if(CMAKE_VERSION VERSION_GREATER 3.18)# language specific checks from SWIG only available in newer cmake versions - - if(SWIG_r_FOUND) + find_program(R_EXECUTABLE NAMES R R.exe) # make sure that we have R and can query for the header + + if(SWIG_r_FOUND AND R_EXECUTABLE) message(STATUS "R found, trying to build R bindings. Make sure development headers are present!") - INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) - INCLUDE_DIRECTORIES("/usr/share/R/include/") # Debian Bullseye path, could also carry over to Ubuntu + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + find_path(R_INCLUDE_DIRS R.h PATHS /usr/local/lib /usr/local/lib64 /usr/share PATH_SUFFIXES include R/include DOC "filepath to R.h") + + INCLUDE_DIRECTORIES(${R_INCLUDE_DIRS}) INCLUDE(${SWIG_USE_FILE}) swig_add_library(RShowcase TYPE SHARED LANGUAGE R SOURCES libshowcase.i libshowcase.cpp) SWIG_LINK_LIBRARIES(RShowcase libMARQOV) endif() - if(SWIG_ocaml_FOUND) + + if(SWIG_ocaml_FOUND AND (SWIG_VERSION VERSION_GREATER "3.0.12")) # prevent ocaml builds on 3.0.12 which is used on Debian Buster message(STATUS "ocaml found, trying to build OCaml bindings. Make sure development headers are present!") INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE(${SWIG_USE_FILE}) diff --git a/src/libmarqov/marqovscheduler.h b/src/libmarqov/marqovscheduler.h index 93bfc05950e9815bbe082f78cd6739faddaffba0..eb7b428b23e78fbaa7deab531dc5277c6d9b1d09 100644 --- a/src/libmarqov/marqovscheduler.h +++ b/src/libmarqov/marqovscheduler.h @@ -76,22 +76,22 @@ namespace MARQOV void createSimfromParameter(ParamType& p, Callable filter = defaultfilter) { mlogstate.reset(); - auto t = filter(p);//FIXME: I think the filter may not modify the type of parameters anymore. - bool needswarmup = !Sim::dumppresent(std::get<1>(t)); + auto margs = filter(p);//FIXME: I think the filter may not modify the type of parameters anymore. + bool needswarmup = !Sim::dumppresent(std::get<1>(margs)); int idx = gamekernels.size(); - std::get<1>(t).id = idx; + std::get<1>(margs).id = idx; - auto loadkernel = [&, t]() + auto loadkernel = [&, margs]() { - return makeCore(t, mutexes.hdf); + return makeCore(margs, mutexes.hdf); }; - std::function gamekernel = [&, t](Simstate mywork, int npt) + std::function gamekernel = [&, margs](Simstate mywork, int npt) { mlogstate.reset(); MLOGRELEASEVERBOSE<< "executing gameloop of "<(t, mutexes.hdf); +// auto sim = makeCore(margs, mutexes.hdf); auto sim = kernelloaders[mywork.id](); // We loop until the next PT step for(; mywork.npt < npt; ++mywork.npt) @@ -122,11 +122,11 @@ namespace MARQOV gamekernelmutex.unlock(); if(needswarmup) { - std::function warmupkernel = [&, t, idx] + std::function warmupkernel = [&, margs, idx] { MLOGRELEASEVERBOSE<<"Beginning warmup of "<(t, mutexes.hdf); + auto sim = makeCore(margs, mutexes.hdf); sim.init(); sim.wrmploop(); } @@ -136,8 +136,9 @@ namespace MARQOV }; taskqueue.enqueue(warmupkernel); } - else + else if(std::get<1>(margs).gameloopsteps > 0) { + //Do not submit a job to the scheduler if no gameloop steps are requested MLOGRELEASEVERBOSE<<"[MARQOV::CXX11Scheduler] Previous step found! Restarting!"<