From f6a4bef6c65fc35f249e6f0439061bdbb4735da3 Mon Sep 17 00:00:00 2001 From: JaroSant <74154059+JaroSant@users.noreply.github.com> Date: Tue, 26 Mar 2024 11:36:25 +0000 Subject: [PATCH] Bug fixes, UI + installation overhaul --- CMakeLists.txt | 44 + Makefile | 18 - R-plotter.r | 16 - README.md | 45 +- UserManual.pdf | Bin 206822 -> 187999 bytes config.cfg | 42 - configBridge.cfg | 48 - configDiffusion.cfg | 36 - configHorseCoat.cfg | 63 - examples/bridge_diffusion_sim.py | 51 + examples/diffusion_sim.py | 49 + main.cpp | 1004 +------- run.sh | 7 +- setup.py | 106 + src/CMakeLists.txt | 40 + src/EWF_pybind.cpp | 45 + Polynomial.cpp => src/Polynomial.cpp | 0 Polynomial.h => src/Polynomial.h | 0 .../PolynomialRootFinder.cpp | 0 .../PolynomialRootFinder.h | 0 PolynomialTest.cpp => src/PolynomialTest.cpp | 0 WrightFisher.cpp => src/WrightFisher.cpp | 2227 +++++++++-------- WrightFisher.h => src/WrightFisher.h | 121 +- src/__init__.py | 1 + myHelpers.cpp => src/myHelpers.cpp | 0 myHelpers.h => src/myHelpers.h | 23 +- 26 files changed, 1678 insertions(+), 2308 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 Makefile delete mode 100644 R-plotter.r delete mode 100644 config.cfg delete mode 100644 configBridge.cfg delete mode 100644 configDiffusion.cfg delete mode 100644 configHorseCoat.cfg create mode 100644 examples/bridge_diffusion_sim.py create mode 100644 examples/diffusion_sim.py create mode 100644 setup.py create mode 100644 src/CMakeLists.txt create mode 100644 src/EWF_pybind.cpp rename Polynomial.cpp => src/Polynomial.cpp (100%) rename Polynomial.h => src/Polynomial.h (100%) rename PolynomialRootFinder.cpp => src/PolynomialRootFinder.cpp (100%) rename PolynomialRootFinder.h => src/PolynomialRootFinder.h (100%) rename PolynomialTest.cpp => src/PolynomialTest.cpp (100%) rename WrightFisher.cpp => src/WrightFisher.cpp (81%) rename WrightFisher.h => src/WrightFisher.h (77%) create mode 100644 src/__init__.py rename myHelpers.cpp => src/myHelpers.cpp (100%) rename myHelpers.h => src/myHelpers.h (80%) diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b6cb7be --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.16) +message(STATUS "Using CMake version ${CMAKE_VERSION}") +cmake_policy(VERSION 3.16) + +project(EWF LANGUAGES CXX VERSION 1.0.1) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +option(BUILD_SHARED_LIBS "Enable compilations of shared libraries" OFF) + +option(PYTHON_BINDINGS "Whether to build python bindings" ON) +if (PYTHON_BINDINGS) + include(FetchContent) + FetchContent_Declare( + pybind11 + GIT_REPOSITORY https://github.com/pybind/pybind11 + GIT_TAG 80dc998efced8ceb2be59756668a7e90e8bef917 # Version 2.10.1 + ) + FetchContent_GetProperties(pybind11) + if (NOT pybind11_POPULATED) + FetchContent_Populate(pybind11) + add_subdirectory(${pybind11_SOURCE_DIR} ${pybind11_BINARY_DIR}) + endif() +endif() + +add_subdirectory(src) + +#Clang format target +find_program(CLANG_FORMAT_EXE NAMES "clang-format-16" "clang-format-15" "clang-format-14" "clang-format-13" "clang-format-12" +"clang-format-11" "clang-format-10" "clang-format" DOC "Path to clang-format executable" +) +if (NOT CLANG_FORMAT_EXE) +message(STATUS "clang-format not found.") +else () +message(STATUS "clang-format found: ${CLANG_FORMAT_EXE}") +add_custom_target( + EWF_clang_format + COMMAND ${CLANG_FORMAT_EXE} -style=file -i ${CMAKE_SOURCE_DIR}/src/*pp + COMMAND ${CLANG_FORMAT_EXE} -style=file -i ${CMAKE_SOURCE_DIR}/example/*pp + COMMAND ${CLANG_FORMAT_EXE} -style=file -i ${CMAKE_SOURCE_DIR}/test/*pp +) +endif () \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 857688a..0000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -CC := g++ -CFLAGS := -Wall -Wextra -std=c++11 -O3 # -g -LDFLAGS := -I/home/ubuntu/Desktop/boost_1_78_0 -I/home/ubuntu/Desktop/EWF /usr/local/lib/libconfig++.a - -#Make sure LDFLAGS points towards the locations where: - -# 1. your boost library resides(e.g.'/home/ubuntu/Desktop/boost_1_78_0') -# 2. the source files for the program reside(e.g.'/home/ubuntu/Desktop/EWF') -# 3. the library libconfig ++.a resides(e.g.'/usr/local/lib/libconfig++.a') - -PROGRAMS := main - -all: $(PROGRAMS) - -main: main.cpp WrightFisher.cpp myHelpers.cpp Polynomial.cpp PolynomialRootFinder.cpp - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) - -clean: rm -f *.o $(PROGRAMS) diff --git a/R-plotter.r b/R-plotter.r deleted file mode 100644 index 9157b79..0000000 --- a/R-plotter.r +++ /dev/null @@ -1,16 +0,0 @@ -cols <- hcl.colors(30, "Spectral") - -Ne = 10000 #Quantities needed to recale time back into years before present -g = 5 - -ImpT <- t(read.table("D:/ImpT.txt", quote = "\"", comment.char = "")) #Input location of file ImpT.txt here! -ImpT <-(((ImpT * 2 * Ne * g) - 20000)) #Converting from diffusion time to years before present -ImpHT <-(t(read.table("D:/HorseTrajectories.txt", quote = "\"", comment.char = ""))) #Input location of file ImpHT.txt here! -OGT <-t(read.table("D:/OGT.txt", quote = "\"", comment.char = "")) #Input location of file OGT.txt here! -OGT <-(((OGT * 2 * Ne * g) - 20000)) #Converting from diffusion time to years before present -OGHT <-(t(read.table("D:/OGHT.txt", quote = "\"", comment.char = ""))) #Input location of file OGHT.txt here - -setEPS() -postscript(file = "horseTrajectories.eps") #Selection of figure format -matplot(ImpT, ImpHT, type = "l", col = cols, lwd = 1, lty = 1, xlab = "Time in years before present", ylab = "Frequency", ylim = c(0, 0.85)) #Plots all the generated paths -points(OGT, OGHT, pch = 4, bg = "black", col = "black", lwd = 4, cex = 1.5) #Superimposes the original observations dev.off() diff --git a/README.md b/README.md index fab3ba5..b7ec0fc 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,31 @@ -#EWF +# EWF -An efficient simulator for exact Wright-Fisher diffusion and diffusion bridge paths, accounting for a wide class of selective regimes (genic, diploid and arbitrary polynomial selection), and the presence/absence of mutation. Please consult the _UserManual.pdf_ for all details with regards to installing dependencies, setting the correct linker flags, running the program and configuring the program input. +An efficient simulator for exact Wright-Fisher diffusion and diffusion bridge paths, accounting for a wide class of selective regimes (genic, diploid and arbitrary polynomial selection), and the presence/absence of mutation. Please consult the _UserManual.pdf_ for all details with regards to installing dependencies, installing the program, and calling it from within python. *Dependencies* -EWF has been tested out on Ubuntu 20.04, and requires the following: +EWF requires the following: -- g++ compiler (tested on version 9.4.0) -- libconfig library (tested on version 1.7.3), available from http://hyperrealm.github.io/libconfig -- boost library (tested on version 1.78.0), available from https://boost.org -- R (tested on version 4.2.1 using RStudio version 2022.07.1+554), available from https://www.r-project.org/ +- g++ compiler +- boost library (https://boost.org) +- python and pip +- CMake +- pybind11 -*Compilation* +*Installation* -Please ensure that the compiler and linker flags in 'Makefile' point towards where the 'libconfig' and 'boost' libraries are on your platform! Please ignore the [-Wmaybe-uninitialized ] compiler warnings generated by the PolynomialRootFinder.cpp file! +To install, run the following instructions in terminal at the root directory of EWF: +`mkdir build` +`cd build` +`cmake ..` +`cmake --build .` +`cd ..` +`pip install .` -*Configuration files* +*Calling in python* -The underlying Wright-Fisher diffusion/diffusion bridge can be configured via the 'config.cfg' file, where the mutation and selection parameters can be suitably altered. +Once installed, you can call EWF from python by including +`import EWF_pybind` +at the start of your python script. Please see the scripts in the `examples` directory for more details and use cases. -The configuration setup for simulating draws from the law of a _diffusion_ are found in 'configDiffusion.cfg' which allows for the start points, start times and sample times to be modified (as well as number of samples to generate and mesh size if the truncated transition density is desired). If multiple simulation setups are desired, the corresponding setup inputs need to be entered as an array. Precise instructions on input syntax can be found in the file itself. - -The configuration setup for simulating draws from the law of a _diffusion bridge_ are found in 'configBridge.cfg' which allows for the start/end points and times, sampling times, number of bridges to simulate, etc. to be modified. Please see the details within the configuration file for exact instructions with regards to input syntax. The number of simulations and mesh sizes (for the truncated transition density) can also be modified. - -*Running the program* - -When in the root directory run 'run.sh'. This first compiles the program by invoking the makefile, and subsequently calls the program using './main horses' where the second argument invokes the demo described below. The program can be run as a diffusion or diffusion bridge simulator by changing the program invocation to simply './main', whence the program asks whether the user desires to simulate draws from a diffusion law or from a diffusion bridge law, whether they wish to condition on non-absorption and further offers the option of computing a truncation to the transition density. - -*Output files* - -Output for the diffusion simulator is saved using the format 'YYYY-MM-DD-HH-mmAbsDiffusionSamplesX%T%S%.txt' for the samples generated (where 'Abs' is either 'Conditioned' (if absorption is not allowed at the boundaries) or 'Unconditioned' (if absorption at the boundaries is allowed), 'T' denotes the start time and 'S' the sampling time), and 'YYYY-MM-DD-HH-mmAbsDiffusionDensityX%T%S%.txt' for the truncated transition density. - -A similar system is in place for the diffusion bridge simulator, where the output is saved as 'YYYY-MM-DD-HH-mmAbsBridgeSamplesX%Z%T1%T2%S%.txt' with 'X' denoting the start point, 'Z' the end point, 'T1' the start time, 'T2' the end time and 'S' the sampling time. A similar setup is in place for the truncated transition density. +If you come across any bugs, or have any queries/comments/suggestions please do get in touch using the email address Jaromir.Sant@gmail.com! \ No newline at end of file diff --git a/UserManual.pdf b/UserManual.pdf index 133662e82bcf9ebeb5a34fd54f43c4562b6e4e4c..68b03f99654e131e838a6de98c8cdfe73873e325 100644 GIT binary patch delta 154249 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∾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 %48Xt$S?SMe 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 #include #include -#include // for beta function -#include // for function binomial_coefficient -#include // for erf function +#include +#include +#include #include #include #include #include -#include #include #include #include -using namespace std; - -int main(int argc, char **argv) { - if ((argc == 2) && (static_cast(argv[1]) == "horses")) { - cout << "================================" << endl; - cout << "Demo invoked - allele frequency paths for horse coat coloration " - "(ASIP locus) will be generated, using data from Ludwig et al. 2009" - << endl; - cout << "================================" << endl; - - vector thetaP_in; - bool non_neut_in, Absorption; - double100 sigma_in, genGap; - int SelPolyDeg_in, SelSetup_in, Ne_in, nEndpoints, nSim, nInterTimes; - double dom_in; - vector selCoefs_in; - - libconfig::Config cfg; - try { - cfg.readFile("configHorseCoat.cfg"); - } catch (libconfig::FileIOException &e) { - cerr << "FileIOException occurred. Could not read configHorseCoat.cfg!" - << endl; - return (EXIT_FAILURE); - } catch (libconfig::ParseException &e) { - cerr << "Parse error at " << e.getFile() << ":" << e.getLine() << "-" - << e.getError() << endl; - return (EXIT_FAILURE); - } - - if ((cfg.lookupValue("g_entry", genGap)) && (genGap > 0.0)) { - cout << "Generation age set to " << genGap << " years." << endl; - } else { - cerr - << "Error in reading generation age - please check input is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("nonneutral_entry", non_neut_in)) { - if (non_neut_in) { - cout << "You have requested non-neutral paths." << endl; - if (cfg.lookupValue("s_entry", sigma_in)) { - cout << "Prelimiting selection coefficient set to " << sigma_in << "." - << endl; - } else { - cerr << "Error in reading prelimiting selection coefficient - please " - "check input is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("selSetup_entry", SelSetup_in) && - (SelSetup_in == 0 || SelSetup_in == 1 || SelSetup_in == 2)) { - if (SelSetup_in == 0) { - cout << "You have chosen to have genic selection." << endl; - } else if (SelSetup_in == 1) { - cout << "you have chosen to have diploid selection. " << endl; - } else { - cout << "You have chosen to have polynomial selection." << endl; - } - } else { - cerr << "Error in reading selection setup indicator function - " - "please check input is correct!"; - return (EXIT_FAILURE); - } - - if (SelSetup_in == 1) { - if ((cfg.lookupValue("dominance_entry", dom_in)) && (dom_in >= 0.0) && - (dom_in <= 1.0)) { - cout << "You have set the dominance parameter to be " << dom_in - << "." << endl; - } else { - cerr << "Error in reading dominance parameter - please check input " - "is correct!"; - return (EXIT_FAILURE); - } - } - - if (SelSetup_in == 2) { - if (cfg.lookupValue("polyDeg_entry", SelPolyDeg_in) && - (SelPolyDeg_in > 0)) { - cout << "You have chosen a degree " << SelPolyDeg_in - << " polynomial as selection function." << endl; - } else { - cerr << "Error in reading degree of selection polynomial - please " - "check input is correct!"; - return (EXIT_FAILURE); - } - } - } else { - cout << "You have requested neutral paths." << endl; - } - } else { - cerr << "Error in reading non-neutral indicator function - please check " - "input is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("Ne_entry", Ne_in) && (Ne_in > 0)) { - cout << "You have chosen an effective population size of " << Ne_in - << endl; - } else { - cerr << "Error in reading effective population size - please check input " - "is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("Absorption_entry", Absorption)) { - if (Absorption) { - cout << "You have chosen to not condition on non-absorption." << endl; - } else { - cout << "You have chosen to condition on non-absorption." << endl; - } - } else { - cerr << "Error in reading absorption indicator function - please check " - "input is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("nEndpoints", nEndpoints) && (nEndpoints > 0)) { - cout << "You have chosen to have " << nEndpoints << " endpoints." << endl; - } else { - cerr << "Error in number of endpoints - please check input is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("nSim_entry", nSim) && (nSim > 0)) { - cout << "You have chosen to run " << nSim << " simulations." << endl; - } else { - cerr << "Error in reading number of simulations - please check input is " - "correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("nInterTimes", nInterTimes) && (nInterTimes > 0)) { - cout << "You have chosen to simulate " << nInterTimes - << " intermediate time points." << endl; - } else { - cerr << "Error in reading number of intermediate times to sample - " - "please check input is correct!"; - return (EXIT_FAILURE); - } - - const libconfig::Setting &root = cfg.getRoot(); - if (root["mu_entry"].getLength() > 2) { - cerr << "Mutation vector should contain only two entries!"; - } - for (int i = 0; i < root["mu_entry"].getLength(); i++) { - thetaP_in.push_back(2.0 * static_cast(Ne_in) * - ((double)root["mu_entry"][i])); - if (i == 0 && (thetaP_in.back() > 0.0)) { - cout << "theta_1 = " << thetaP_in.back() << "." << endl; - } else if (thetaP_in.back() > 0.0) { - cout << "theta_2 = " << thetaP_in.back() << "." << endl; - } - } - if (!(thetaP_in[0] > 0.0) && !(thetaP_in[1] > 0.0)) { - thetaP_in.clear(); - cout << "(theta_1,theta_2) = (0,0)." << endl; - } - - if (SelSetup_in == 2) { - if (root["polyCoeffs_entries"].getLength() != SelPolyDeg_in) { - cerr << "Mismatch in given selection coefficient vector and specified " - "degree of polynomial!"; - return (EXIT_FAILURE); - } - cout << "The inputted selection polynomial has: " << endl; - for (int i = 0; i < root["polyCoeffs_entries"].getLength(); i++) { - selCoefs_in.push_back((double)root["polyCoeffs_entries"][i]); - cout << " a coefficient " << selCoefs_in.back() << " for the " - << root["polyCoeffs_entries"].getLength() - 1 - i - << "-th power of x." << endl; - } - } - - if (non_neut_in) { - sigma_in = 2.0 * static_cast(Ne_in) * sigma_in; - cout << "With the above input, the population rescaled selection " - "coefficient sigma is " - << sigma_in << endl; - } - cout << "================================" << endl; - - WrightFisher Horses(thetaP_in, non_neut_in, sigma_in, SelSetup_in, dom_in, - SelPolyDeg_in, selCoefs_in); - - Options o; - boost::random::mt19937 gen; - - if (!(Absorption)) { - Horses.ThetaResetter(); - } - - if ((root["observationTimes_entry"].getLength() != - root["observationSamples_entry"].getLength()) || - (root["observationTimes_entry"].getLength() != - root["observationCount_entry"].getLength()) || - (root["observationSamples_entry"].getLength() != - root["observationCount_entry"].getLength())) { - cerr << "Mismatch in the inputted observation times, samples and counts!" - << endl; - return (EXIT_FAILURE); - } - - vector obsTimes; - vector obsSamples, obsCount; - - for (int i = 0; i < nEndpoints; i++) { - obsTimes.push_back(root["observationTimes_entry"][i]); - obsSamples.push_back(root["observationSamples_entry"][i]); - obsCount.push_back(root["observationCount_entry"][i]); - } - - vector obsTimesDiff, obsFrequencies; - vector::iterator oSi = obsSamples.begin(), oCi = obsCount.begin(); - for (vector::iterator yearIter = obsTimes.begin(); - yearIter != obsTimes.end(); yearIter++, oSi++, oCi++) { - obsTimesDiff.push_back( - static_cast(abs(*yearIter - obsTimes.front())) / - (2.0 * static_cast(Ne_in) * genGap)); - obsFrequencies.push_back(static_cast(*oCi) / - static_cast(*oSi)); - } - - ofstream originalTrajectoryFile, originalTimesFile; - string originalTrajectoryFilename = "OGHT.txt", - originalTimesFilename = "OGT.txt"; - originalTrajectoryFile.open(originalTrajectoryFilename); - originalTimesFile.open(originalTimesFilename); - - for (vector::iterator tit = obsTimesDiff.begin(), - xit = obsFrequencies.begin(); - tit != obsTimesDiff.end(); tit++, xit++) { - originalTrajectoryFile << *xit << " "; - originalTimesFile << *tit << " "; - if (xit == obsFrequencies.end() - 1) { - originalTrajectoryFile << "\n"; - originalTimesFile << "\n"; - } - } - - originalTrajectoryFile.close(); - originalTimesFile.close(); - - vector skeletonPoints, skeletonTimes, samplingTimes, - samplingValues; - - for (int j = 0; j != nInterTimes; j++) { - samplingTimes.push_back( - obsTimesDiff.back() * - (static_cast(j) / static_cast(nInterTimes))); - } - - ofstream imputedTrajectoryFile, imputedTimesFile; - string imputedTrajectoryFilename = "ImpHT.txt", - imputedTimesFilename = "ImpT.txt"; - imputedTrajectoryFile.open(imputedTrajectoryFilename); - imputedTimesFile.open(imputedTimesFilename); - - for (int i = 0; i != nSim; i++) { - vector::iterator leftTime = samplingTimes.begin(), rightTime; - for (vector::iterator tIt = obsTimesDiff.begin(), - xIt = obsFrequencies.begin(); - tIt != (obsTimesDiff.end() - 1); tIt++, xIt++) { - vector> Skeleton = Horses.NonNeutralDrawBridge( - *xIt, *tIt, *(tIt + 1), *(xIt + 1), Absorption, o, gen); - vector skeletonPoints(Skeleton[0]), - skeletonTimes(Skeleton[1]); - skeletonPoints.push_back(*(xIt + 1)); - skeletonTimes.push_back(*(tIt + 1)); - - vector::iterator timeRunner = leftTime; - if (tIt != obsTimesDiff.end() - 2) { - while (*timeRunner < *(tIt + 1)) { - timeRunner++; - } - - rightTime = timeRunner - 1; - } else { - rightTime = samplingTimes.end() - 1; - } - - vector::iterator skeltimeIt = skeletonTimes.begin(), - skelvalIt = skeletonPoints.begin(); - for (vector::iterator timeIt = leftTime; - timeIt != rightTime - 1; timeIt++) { - if (timeIt == leftTime) { - samplingValues.push_back(*xIt); - imputedTrajectoryFile << samplingValues.back() << " "; - imputedTimesFile << *tIt << " "; - } else { - if (*(timeIt + 1) > *(skeltimeIt)) { - skeltimeIt++; - skelvalIt++; - } - samplingValues.push_back( - Horses - .DrawBridgepoint(samplingValues.back(), *skelvalIt, *timeIt, - *skeltimeIt, *(timeIt + 1), o, gen) - .first); - imputedTrajectoryFile << samplingValues.back() << " "; - imputedTimesFile << *timeIt << " "; - } - } - - leftTime = rightTime; - } - - imputedTrajectoryFile << obsFrequencies.back() << "\n"; - imputedTimesFile << samplingTimes.back() << "\n"; - - cout << "path " << i << " ready!" << endl; - } - - imputedTrajectoryFile.close(); - imputedTimesFile.close(); - cout << "================================" << endl; - cout << "Simulations complete - the generated paths can be found in " - "'ImpHT.txt', whilst 'ImpT.txt' contains the corresponding time " - "stamps." - << endl; - cout << "The files 'OGT.txt' and 'OGHT.txt' contain the observation times " - "and observed frequencies respectively." - << endl; - cout << "================================" << endl; - - } else { - vector thetaP_in; - bool non_neut_in; - double100 sigma_in; - int SelPolyDeg_in, SelSetup_in; - double dom_in; - vector selCoefs_in; - - libconfig::Config cfg; - try { - cfg.readFile("config.cfg"); - } catch (libconfig::FileIOException &e) { - cerr << "FileIOException occurred. Could not read config.cfg!" << endl; - return (EXIT_FAILURE); - } catch (libconfig::ParseException &e) { - cerr << "Parse error at " << e.getFile() << ":" << e.getLine() << "-" - << e.getError() << endl; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("nonneutral_entry", non_neut_in)) { - if (non_neut_in) { - cout << "You have requested non-neutral paths." << endl; - if ((cfg.lookupValue("sigma_entry", sigma_in))) { - cout << "You have set the population rescaled selection parameter to " - "be " - << sigma_in << "." << endl; - } else { - cerr << "Error in reading population rescaled selection parameter - " - "please check input is correct!"; - return (EXIT_FAILURE); - } - - if (cfg.lookupValue("selSetup_entry", SelSetup_in) && - (SelSetup_in == 0 || SelSetup_in == 1 || SelSetup_in == 2)) { - if (SelSetup_in == 0) { - cout << "You have chosen to have genic selection." << endl; - } else if (SelSetup_in == 1) { - cout << "you have chosen to have diploid selection. " << endl; - } else { - cout << "You have chosen to have polynomial selection." << endl; - } - } else { - cerr << "Error in reading selection setup indicator function - " - "please check input is correct!"; - return (EXIT_FAILURE); - } - - if (SelSetup_in == 1) { - if ((cfg.lookupValue("dominance_entry", dom_in)) && (dom_in >= 0.0) && - (dom_in <= 1.0)) { - cout << "You have set the dominance parameter to be " << dom_in - << "." << endl; - } else { - cerr << "Error in reading dominance parameter - please check input " - "is correct!"; - return (EXIT_FAILURE); - } - } - - if (SelSetup_in == 2) { - if (cfg.lookupValue("polyDeg_entry", SelPolyDeg_in) && - (SelPolyDeg_in > 0)) { - cout << "You have chosen a degree " << SelPolyDeg_in - << " polynomial as selection function." << endl; - } else { - cerr << "Error in reading degree of selection polynomial - please " - "check input is correct!"; - return (EXIT_FAILURE); - } - } - } else { - cout << "You have requested neutral paths." << endl; - } - } else { - cerr << "Error in reading non-neutral indicator function - please check " - "input is correct!"; - return (EXIT_FAILURE); - } - - const libconfig::Setting &root = cfg.getRoot(); - if (root["theta_entries"].getLength() > 2) { - cerr << "Mutation vector should contain only two entries!"; - } - for (int i = 0; i < root["theta_entries"].getLength(); i++) { - thetaP_in.push_back((double)root["theta_entries"][i]); - if (i == 0 && (thetaP_in.back() > 0.0)) { - cout << "theta_1 = " << thetaP_in.back() << "." << endl; - } else if (thetaP_in.back() > 0.0) { - cout << "theta_2 = " << thetaP_in.back() << "." << endl; - } - } - if (!(thetaP_in[0] > 0.0) && !(thetaP_in[1] > 0.0)) { - thetaP_in.clear(); - cout << "(theta_1,theta_2) = (0,0)." << endl; - } - - if (SelSetup_in == 2) { - if (root["polyCoeffs_entries"].getLength() != SelPolyDeg_in) { - cerr << "Mismatch in given selection coefficient vector and specified " - "degree of polynomial!"; - return (EXIT_FAILURE); - } - cout << "The inputted selection polynomial has: " << endl; - for (int i = 0; i < root["polyCoeffs_entries"].getLength(); i++) { - selCoefs_in.push_back((double)root["polyCoeffs_entries"][i]); - cout << " a coefficient " << selCoefs_in.back() << " for the " - << root["polyCoeffs_entries"].getLength() - 1 - i - << "-th power of x." << endl; - } - } - - WrightFisher test(thetaP_in, non_neut_in, sigma_in, SelSetup_in, dom_in, - SelPolyDeg_in, selCoefs_in); - - Options o; - boost::random::mt19937 gen; - - cout << "================================" << endl; - cout << "Please choose whether you wish to simulate draws from the " - "Wright-Fisher diffusion, or from the diffusion bridge." - << endl; - cout << "Enter: 1 for diffusion, 2 for diffusion bridge" << endl; - cout << "================================" << endl; - int DiffOrBridge; - cin >> DiffOrBridge; - bool stop = - (cin.fail() - ? false - : ((DiffOrBridge != 1 && DiffOrBridge != 2) ? false : true)); - - while (!stop) { - cout << "Please enter either 1 for diffusion simulation or 2 for " - "diffusion bridge simulation!" - << endl; - cin.clear(); - cin.ignore(256, '\n'); - cin >> DiffOrBridge; - stop = (cin.fail() - ? false - : ((DiffOrBridge != 1 && DiffOrBridge != 2) ? false : true)); - } - - if (DiffOrBridge == 1) { - cout << "================================" << endl; - cout << "You have chosen to simulate a diffusion!" << endl; - cout << "================================" << endl; - cout << "Would you like to additionally compute the truncated transition " - "density?" - << endl; - cout << "Please enter 1 for yes, 2 for no." << endl; - cout << "================================" << endl; - - int Density; - cin >> Density; - bool stopyn = - (cin.fail() ? false - : ((Density != 1 && Density != 2) ? false : true)); - - while (!stopyn) { - cout << "Please enter either 1 for yes or 2 for no!" << endl; - cin.clear(); - cin.ignore(256, '\n'); - cin >> Density; - stopyn = (cin.fail() ? false - : ((Density != 1 && Density != 2) ? false : true)); - } - - vector startPoints, startTimes, sampleTimes; - vector nSim, meshSize; - - libconfig::Config cfgDiff; - try { - cfgDiff.readFile("configDiffusion.cfg"); - } catch (libconfig::FileIOException &e) { - cerr << "FileIOException occurred. Could not read configDiffusion.cfg!" - << endl; - return (EXIT_FAILURE); - } catch (libconfig::ParseException &e) { - cerr << "Parse error at " << e.getFile() << ":" << e.getLine() << "-" - << e.getError() << endl; - return (EXIT_FAILURE); - } - - bool Absorption; - if (cfgDiff.lookupValue("Absorption_entry", Absorption)) { - if (Absorption) { - cout << "You have chosen to not condition on non-absorption." << endl; - } else { - cout << "You have chosen to condition on non-absorption." << endl; - } - } else { - cerr << "Error in reading absorption indicator function - please check " - "input is correct!"; - return (EXIT_FAILURE); - } - - const libconfig::Setting &root = cfgDiff.getRoot(); - int xlen = root["startDiff_entry"].getLength(), - tlen = root["startDiffTime_entry"].getLength(), - slen = root["sampleDiffTime_entry"].getLength(); - int nlen = root["nSim_entry"].getLength(), - mlen = root["meshSize_entry"].getLength(); - - if ((xlen == tlen) && (tlen == slen) && (slen == nlen)) { - if (Density == 1) { - if (mlen != xlen) { - cout << "Mismatch in the configuration file input!" << endl; - if (mlen < xlen) { - cout << "There are too few mesh size entries!" << endl; - } else { - cout << "There are too many mesh size entries!" << endl; - } - cerr << "Simulation aborted - please fix configDiffusion.cfg as " - "per the above suggestions." - << endl; - return (EXIT_FAILURE); - } - } - cout << "Reading in diffusion simulation configuration from " - "configDiffusion.cfg" - << endl; - cout << "================================" << endl; - } else { - cout << "There is a mismatch in the configuration file input!" << endl; - if (xlen < tlen) { - cout << "There are more diffusion start points than start times!" - << endl; - } - if (xlen > tlen) { - cout << "There are more diffusion start times than start points!" - << endl; - } - if (slen < tlen) { - cout << "There are more diffusion start times than sample times!" - << endl; - } - if (slen > tlen) { - cout << "There are more diffusion sample times than start times!" - << endl; - } - if (xlen < slen) { - cout << "There are more diffusion start points than sample times!" - << endl; - } - if (xlen > slen) { - cout << "There are more diffusion sample times than start points!" - << endl; - } - if (xlen < nlen) { - cout - << "There are more number of samples than diffusion start points!" - << endl; - } - if (xlen > nlen) { - cout - << "There are more diffusion start points than number of samples!" - << endl; - } - if (slen < nlen) { - cout - << "There are more number of samples than diffusion sample times!" - << endl; - } - if (slen > nlen) { - cout - << "There are more diffusion sample times than number of samples!" - << endl; - } - if (tlen < nlen) { - cout << "There are more number of samples than diffusion start times!" - << endl; - } - if (tlen > nlen) { - cout << "There are more diffusion start times than number of samples!" - << endl; - } - cout << "Simulation aborted - please fix configDiffusion.cfg as per " - "the above suggestions." - << endl; - return (EXIT_FAILURE); - } - - cout << "================================" << endl; - cout << "Diffusion input read in without errors." << endl; - cout << "================================" << endl; - - for (int i = 0; i < root["startDiff_entry"].getLength(); i++) { - startPoints.push_back(root["startDiff_entry"][i]); - startTimes.push_back(root["startDiffTime_entry"][i]); - sampleTimes.push_back(root["sampleDiffTime_entry"][i]); - nSim.push_back(root["nSim_entry"][i]); - if (Density == 1) { - meshSize.push_back(root["meshSize_entry"][i]); - } - } - - cout << "You have chosen to perform the following simulations:" << endl; - int i = 1; - vector::iterator nit = nSim.begin(); - for (vector::iterator xit = startPoints.begin(), - tit = startTimes.begin(), - sit = sampleTimes.begin(); - xit != startPoints.end(); xit++, tit++, sit++, nit++) { - cout << "Diffusion " << i << " : x = " << *xit << ", t_0 = " << *tit - << ", t = " << *sit << ", nSim = " << *nit << endl; - i++; - } - - cout << "================================" << endl; - nit = nSim.begin(); - vector::iterator mit = meshSize.begin(); - for (vector::iterator xit = startPoints.begin(), - tit = startTimes.begin(), - sit = sampleTimes.begin(); - xit != startPoints.end(); xit++, tit++, sit++, nit++, mit++) { - cout << " Simulating diffusion draws started at x " << *xit - << " at time " << *tit << ", sampled at time " << *sit << endl; - time_t t = time(0); // get time now - struct tm *now = localtime(&t); - - char bufferSaveFile[80]; - strftime(bufferSaveFile, 80, "%Y-%m-%d-%H-%M", now); - string absnoabs; - if (Absorption) { - absnoabs = "Unconditioned"; - } else { - absnoabs = "Conditioned"; - } - string saveFilename = - static_cast(bufferSaveFile) + absnoabs + "Diffusion" + - "SamplesX" + - boost::lexical_cast(static_cast(100.0 * (*xit))) + - "T" + - boost::lexical_cast(static_cast(100.0 * (*tit))) + - "S" + - boost::lexical_cast(static_cast(100.0 * (*sit))) + - ".txt"; - cout << "Output will be saved in the file " << saveFilename << endl; - - test.DiffusionRunner(*nit, *xit, *tit, *sit, Absorption, saveFilename, - o, gen); - - if (Density == 1) { - string densityFilename = static_cast(bufferSaveFile) + - absnoabs + "Diffusion" + "DensityX" + - boost::lexical_cast( - static_cast(100.0 * (*xit))) + - "T" + - boost::lexical_cast( - static_cast(100.0 * (*tit))) + - "S" + - boost::lexical_cast( - static_cast(100.0 * (*sit))) + - ".txt"; - cout << "Truncated density will be saved in the file " - << densityFilename << endl; - test.DiffusionDensityCalculator(*mit, *xit, *tit, *sit, Absorption, - densityFilename, o); - } - cout << "================================" << endl; - } - - } else { - cout << "================================" << endl; - cout << "You have chosen to simulate a diffusion bridge!" << endl; - cout << "Would you like to additionally compute the truncated transition " - "density?" - << endl; - cout << "Please enter 1 for yes, 2 for no." << endl; - cout << "================================" << endl; - - int Density; - cin >> Density; - bool stopyn = - (cin.fail() ? false - : ((Density != 1 && Density != 2) ? false : true)); - - while (!stopyn) { - cout << "Please enter either 1 for yes or 2 for no!" << endl; - cin.clear(); - cin.ignore(256, '\n'); - cin >> Density; - stopyn = (cin.fail() ? false - : ((Density != 1 && Density != 2) ? false : true)); - } - - libconfig::Config cfgBridge; - try { - cfgBridge.readFile("configBridge.cfg"); - } catch (libconfig::FileIOException &e) { - cerr << "FileIOException occurred. Could not read configBridge.cfg!" - << endl; - return (EXIT_FAILURE); - } catch (libconfig::ParseException &e) { - cerr << "Parse error at " << e.getFile() << ":" << e.getLine() << "-" - << e.getError() << endl; - return (EXIT_FAILURE); - } - - bool Absorption; - if (cfgBridge.lookupValue("Absorption_entry", Absorption)) { - if (Absorption) { - cout << "You have chosen to not condition on non-absorption." << endl; - } else { - cout << "You have chosen to condition on non-absorption." << endl; - } - } else { - cerr << "Error in reading absorption indicator function - please check " - "input is correct!"; - return (EXIT_FAILURE); - } - - const libconfig::Setting &root = cfgBridge.getRoot(); - int nBridges = root["nEndpoints"].getLength(), - xlen = root["bridgePoints_entry"].getLength(), - tlen = root["bridgeTimes_entry"].getLength(); - int nSamples = root["nSampleTimes_entry"].getLength(), - slen = root["sampleTimes_entry"].getLength(), - nlen = root["nSim_entry"].getLength(), - mlen = root["meshSize_entry"].getLength(); - int nBridgeChecker = -1; - - if ((xlen == tlen) && (tlen == slen) && (slen == nlen)) { - if (Density == 1) { - if (mlen != xlen) { - cout << "Mismatch in the configuration file input!" << endl; - if (mlen < xlen) { - cout << "There are too few mesh size entries!" << endl; - } else { - cout << "There are too many mesh size entries!" << endl; - } - cerr << "Simulation aborted - please fix configBridge.cfg as per " - "the above suggestions." - << endl; - return (EXIT_FAILURE); - } - } - cout << "Reading in bridge simulation configuration from " - "configBridge.cfg" - << endl; - cout << "================================" << endl; - } else { - cout << "There is a mismatch in the configuration file input!" << endl; - - if (xlen < tlen) { - cout << "There are more diffusion start points than start times!" - << endl; - } - if (xlen > tlen) { - cout << "There are more diffusion start times than start points!" - << endl; - } - if (slen < tlen) { - cout << "There are more diffusion start times than sample times!" - << endl; - } - if (slen > tlen) { - cout << "There are more diffusion sample times than start times!" - << endl; - } - if (xlen < slen) { - cout << "There are more diffusion start points than sample times!" - << endl; - } - if (xlen > slen) { - cout << "There are more diffusion sample times than start points!" - << endl; - } - if (xlen < nlen) { - cout - << "There are more number of samples than diffusion start points!" - << endl; - } - if (xlen > nlen) { - cout - << "There are more diffusion start points than number of samples!" - << endl; - } - if (slen < nlen) { - cout - << "There are more number of samples than diffusion sample times!" - << endl; - } - if (slen > nlen) { - cout - << "There are more diffusion sample times than number of samples!" - << endl; - } - if (tlen < nlen) { - cout << "There are more number of samples than diffusion start times!" - << endl; - } - if (tlen > nlen) { - cout << "There are more diffusion start times than number of samples!" - << endl; - } - cout << "Simulation aborted - please fix configDiffusion.cfg as per " - "the above suggestions." - << endl; - return (EXIT_FAILURE); - } - - if ((nBridges < 1) || (nSamples < 1)) { - cerr << "No bridge or sampling information provided! Please amend " - "configBridge.cfg appropriately!"; - return (EXIT_FAILURE); - } else { - nBridgeChecker = 0; - for (int i = 0; i < nBridges; i++) { - nBridgeChecker += (int)root["nEndpoints"][i]; - } - - if (nBridgeChecker != nBridges + nSamples) { - cerr << "Mismatch in nEndpoints and nSampleTimes_entry input in " - "configBridge.cfg! Please consult config file for info on " - "how to set these two quantities up!"; - return (EXIT_FAILURE); - } - } - - cout << "================================" << endl; - cout << "Bridge input read in without errors." << endl; - cout << "================================" << endl; - - vector bridgePoints, bridgeTimes, sampleTimes; - vector nSim, meshSize, nEndpoints, nSampleTimes; - - for (int i = 0; i < nBridges; i++) { - nEndpoints.push_back(root["nEndpoints"][i]); - } - - for (int i = 0; i < nSamples; i++) { - nSampleTimes.push_back(root["nSampleTimes_entry"][i]); - } - - for (int i = 0; i < xlen; i++) { - bridgePoints.push_back(root["bridgePoints_entry"][i]); - bridgeTimes.push_back(root["bridgeTimes_entry"][i]); - } - for (int i = 0; i < slen; i++) { - sampleTimes.push_back(root["sampleTimes_entry"][i]); - nSim.push_back(root["nSim_entry"][i]); - meshSize.push_back(root["meshSize_entry"][i]); - } - - cout << "You have chosen to perform the following simulations:" << endl; - vector::iterator indexbP = bridgePoints.begin(); - vector::iterator indexbT = bridgeTimes.begin(); - vector::iterator indexnS = nSampleTimes.begin(); - vector::iterator indexsT = sampleTimes.begin(); - int counter = 1; - for (vector::iterator nEp = nEndpoints.begin(); - nEp != nEndpoints.end(); nEp++) { - cout << "Bridge " << counter << " : " << endl; - vector brPt(indexbP, indexbP + (*nEp)), - brTs(indexbT, indexbT + (*nEp)); - vector nsT(indexnS, indexnS + (*nEp) - 1); - indexbP += *nEp; - indexbT += *nEp; - indexnS += (*nEp) - 1; - vector::iterator nsti = nsT.begin(); - for (vector::iterator bP = brPt.begin(), bT = brTs.begin(); - bP != brPt.end() - 1; bP++, bT++) { - vector nsTs(indexsT, indexsT + *nsti); - indexsT += *nsti; - for (vector::iterator sT = nsTs.begin(); sT != nsTs.end(); - sT++) { - cout << "x = " << *bP << ", z = " << *(bP + 1) << ", t1 = " << *bT - << ", t2 = " << *(bT + 1) << ", s = " << *sT << endl; - } - nsti++; - } - counter++; - } - - indexbP = bridgePoints.begin(); - indexbT = bridgeTimes.begin(); - indexnS = nSampleTimes.begin(); - indexsT = sampleTimes.begin(); - vector::iterator nS = nSim.begin(), nM = meshSize.begin(); - for (vector::iterator nEp = nEndpoints.begin(); - nEp != nEndpoints.end(); nEp++) { - vector brPt(indexbP, indexbP + (*nEp)), - brTs(indexbT, indexbT + (*nEp)); - vector nsT(indexnS, indexnS + (*nEp) - 1); - indexbP += *nEp; - indexbT += *nEp; - indexnS += (*nEp) - 1; - vector::iterator nsti = nsT.begin(); - for (vector::iterator bP = brPt.begin(), bT = brTs.begin(); - bP != brPt.end() - 1; bP++, bT++) { - vector nsTs(indexsT, indexsT + *nsti); - indexsT += *nsti; - for (vector::iterator sT = nsTs.begin(); sT != nsTs.end(); - sT++) { - cout << "================================" << endl; - cout << "Simulating diffusion bridges draws for x = " << *bP - << ", z = " << *(bP + 1) << ", t1 = " << *bT - << ", t2 = " << *(bT + 1) << ", s = " << *sT << endl; - time_t t = time(0); // get time now - struct tm *now = localtime(&t); - - char bufferSaveFile[80]; - strftime(bufferSaveFile, 80, "%Y-%m-%d-%H-%M", now); - string absnoabs; - if (Absorption) { - absnoabs = "Unconditioned"; - } else { - absnoabs = "Conditioned"; - } - string saveFilename = static_cast(bufferSaveFile) + - absnoabs + "Bridge" + "SamplesX" + - boost::lexical_cast( - static_cast(100.0 * (*bP))) + - "Z" + - boost::lexical_cast( - static_cast(100.0 * (*(bP + 1)))) + - "T1" + - boost::lexical_cast( - static_cast(100.0 * (*bT))) + - "T2" + - boost::lexical_cast( - static_cast(100.0 * (*(bT + 1)))) + - "S" + - boost::lexical_cast( - static_cast(100.0 * (*sT))) + - ".txt"; - cout << "Output will be saved in the file " << saveFilename << endl; - - test.BridgeDiffusionRunner(*nS, *bP, *(bP + 1), *bT, *(bT + 1), *sT, - Absorption, saveFilename, o, gen); - nS++; +#include "WrightFisher.h" - if (Density == 1) { - string densityFilename = - static_cast(bufferSaveFile) + absnoabs + "Bridge" + - "DensityX" + - boost::lexical_cast( - static_cast(100.0 * (*bP))) + - "Z" + - boost::lexical_cast( - static_cast(100.0 * (*(bP + 1)))) + - "T1" + - boost::lexical_cast( - static_cast(100.0 * (*bT))) + - "T2" + - boost::lexical_cast( - static_cast(100.0 * (*(bT + 1)))) + - "S" + - boost::lexical_cast( - static_cast(100.0 * (*sT))) + - ".txt"; - cout << "Truncated density will be saved in the file " - << densityFilename << endl; - test.BridgeDiffusionDensityCalculator(*nM, *bP, *(bP + 1), *bT, - *(bT + 1), *sT, Absorption, - densityFilename, o); - } - cout << "================================" << endl; - } - nsti++; - } - } - } - } +using namespace std; - return 0; -} +int main() { return 0; } diff --git a/run.sh b/run.sh index e0a4159..a8d6b69 100644 --- a/run.sh +++ b/run.sh @@ -2,6 +2,7 @@ echo "Compilation started!" make -echo "Code compiled! Execution started!" -./main horses -echo "Execution completed!" +echo "Code compiled!" +echo "Creating python bindings!" +pip install -e . -vvv +echo "Python bindings created! You can now invoke EWF from python!" \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..337fe0c --- /dev/null +++ b/setup.py @@ -0,0 +1,106 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Based on https://github.com/pybind/cmake_example + +import os +import sys +import subprocess + +from setuptools import setup, Extension, find_namespace_packages +from setuptools.command.build_ext import build_ext + +PLAT_TO_CMAKE = { + "win32": "Win32", + "win-amd64": "x64", + "win-arm32": "ARM", + "win-arm64": "ARM64", +} + + +class CMakeExtension(Extension): + def __init__(self, name, sourcedir=""): + Extension.__init__(self, name, sources=[]) + self.sourcedir = os.path.abspath(sourcedir) + + +class CMakeBuild(build_ext): + + def build_extension(self, ext): + extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) + + if not extdir.endswith(os.path.sep): + extdir += os.path.sep + + cfg = "Debug" if self.debug else "Release" + + cmake_generator = os.environ.get("CMAKE_GENERATOR", "") + + cmake_args = [ + f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}", + f"-DPYTHON_EXECUTABLE={sys.executable}", + f"-DCMAKE_BUILD_TYPE={cfg}", + "-DWARNINGS_AS_ERRORS=OFF", + "-DENABLE_TESTING=OFF", + "-DBoost_NO_BOOST_CMAKE=ON", + "-DMAKE_DOCS=OFF" + ] + build_args = [] + + if self.compiler.compiler_type != "msvc": + if not cmake_generator: + cmake_args += ["-GNinja"] + + else: + + single_config = any(x in cmake_generator for x in {"NMake", "Ninja"}) + + contains_arch = any(x in cmake_generator for x in {"ARM", "Win64"}) + + if not single_config and not contains_arch: + cmake_args += ["-A", PLAT_TO_CMAKE[self.plat_name]] + + if not single_config: + cmake_args += [ + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}".format(cfg.upper(), extdir) + ] + build_args += ["--config", cfg] + + if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ: + if hasattr(self, "parallel") and self.parallel: + build_args += ["-j{}".format(self.parallel)] + + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + + subprocess.check_call( + ["cmake", ext.sourcedir] + cmake_args, cwd=self.build_temp + ) + subprocess.check_call( + ["cmake", "--build", "."] + build_args, cwd=self.build_temp + ) + +setup( + name='EWF', + version='1.0.1', + author='Jaromir Sant', + url='https://jarosant.github.io/', + install_requires=[ + 'pybind11', + ], + description='Exact simulation for Wright--Fisher diffusions.', + packages=find_namespace_packages(), + ext_modules=[CMakeExtension('EWF')], + cmdclass=dict(build_ext=CMakeBuild), + zip_safe=False, +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..3534825 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,40 @@ +# Boost setup (needed for Windows to work) +set(Boost_USE_STATIC_LIBS OFF CACHE BOOL "use static libraries from Boost") +find_package(Boost REQUIRED COMPONENTS) +include_directories(${Boost_INCLUDE_DIRS}) +link_libraries(${Boost_LIBRARIES}) + +if (WIN32) + # disable autolinking in boost + add_definitions( -DBOOST_ALL_NO_LIB ) + + # force all boost libraries to dynamic link (we already disabled + # autolinking, so I don't know why we need this, but we do!) + add_definitions( -DBOOST_ALL_DYN_LINK ) +endif() + +set(EWF_src myHelpers.cpp Polynomial.cpp PolynomialRootFinder.cpp WrightFisher.cpp) + +set(EWF_hdr myHelpers.h Polynomial.h PolynomialRootFinder.h WrightFisher.h) + +add_library(EWF STATIC ${EWF_src} ${EWF_hdr}) + +target_include_directories( + EWF INTERFACE + $ + $ +) + +set_target_properties(EWF PROPERTIES PUBLIC_HEADER "${EWF_hdr}") + +target_link_libraries(EWF PRIVATE Boost::boost) + +target_include_directories(EWF PUBLIC ${Boost_INCLUDE_DIRS}) + +if (PYTHON_BINDINGS) + set_target_properties(EWF PROPERTIES POSITION_INDEPENDENT_CODE TRUE) + pybind11_add_module(EWF_pybind EWF_pybind.cpp) + target_link_libraries(EWF_pybind PRIVATE EWF) +endif() + + diff --git a/src/EWF_pybind.cpp b/src/EWF_pybind.cpp new file mode 100644 index 0000000..65d0c4c --- /dev/null +++ b/src/EWF_pybind.cpp @@ -0,0 +1,45 @@ +#include +#include + +#include +#include +#include +#include + +#include "WrightFisher.h" + +namespace py = pybind11; + +double dt_default = 0.1; +double bt_default = 0.04; + +PYBIND11_MODULE(EWF_pybind, m) { + py::class_(m, "WrightFisher") + .def(py::init, bool, double100, int, double, int, + vector>(), + py::arg("thetaP"), py::arg("non_neut"), py::arg("sigma"), + py::arg("selectionSetup"), py::arg("dom"), py::arg("SelPolyDeg"), + py::arg("selCoefs")) + .def("DiffusionRunner", &WrightFisher::DiffusionRunner, py::arg("nSim"), + py::arg("x"), py::arg("startT"), py::arg("endT"), + py::arg("Absorption"), py::arg("Filename"), + py::arg("diffusion_threshold") = dt_default, + py::arg("bridge_threshold") = bt_default) + .def("BridgeDiffusionRunner", &WrightFisher::BridgeDiffusionRunner, + py::arg("nSim"), py::arg("x"), py::arg("z"), py::arg("startT"), + py::arg("endT"), py::arg("sampleT"), py::arg("Absorption"), + py::arg("Filename"), py::arg("diffusion_threshold") = dt_default, + py::arg("bridge_threshold") = bt_default) + .def("DiffusionDensityCalculator", + &WrightFisher::DiffusionDensityCalculator, py::arg("meshSize"), + py::arg("x"), py::arg("startT"), py::arg("endT"), + py::arg("Absorption"), py::arg("Filename"), + py::arg("diffusion_threshold") = dt_default, + py::arg("bridge_threshold") = bt_default) + .def("BridgeDiffusionDensityCalculator", + &WrightFisher::BridgeDiffusionDensityCalculator, py::arg("meshSize"), + py::arg("x"), py::arg("z"), py::arg("startT"), py::arg("endT"), + py::arg("sampleT"), py::arg("Absorption"), py::arg("Filename"), + py::arg("diffusion_threshold") = dt_default, + py::arg("bridge_threshold") = bt_default); +} \ No newline at end of file diff --git a/Polynomial.cpp b/src/Polynomial.cpp similarity index 100% rename from Polynomial.cpp rename to src/Polynomial.cpp diff --git a/Polynomial.h b/src/Polynomial.h similarity index 100% rename from Polynomial.h rename to src/Polynomial.h diff --git a/PolynomialRootFinder.cpp b/src/PolynomialRootFinder.cpp similarity index 100% rename from PolynomialRootFinder.cpp rename to src/PolynomialRootFinder.cpp diff --git a/PolynomialRootFinder.h b/src/PolynomialRootFinder.h similarity index 100% rename from PolynomialRootFinder.h rename to src/PolynomialRootFinder.h diff --git a/PolynomialTest.cpp b/src/PolynomialTest.cpp similarity index 100% rename from PolynomialTest.cpp rename to src/PolynomialTest.cpp diff --git a/WrightFisher.cpp b/src/WrightFisher.cpp similarity index 81% rename from WrightFisher.cpp rename to src/WrightFisher.cpp index 75953e4..3c52497 100644 --- a/WrightFisher.cpp +++ b/src/WrightFisher.cpp @@ -1,3 +1,7 @@ +#include "WrightFisher.h" + +#include + #include #include #include @@ -12,39 +16,38 @@ #include #include #include -#include #include "Polynomial.h" -#include "WrightFisher.h" /// HELPER FUNCTIONS -void WrightFisher::ThetaSetter() /// Set theta depending on what thetaP is - /// entered +void WrightFisher::ThetaSetter() /// Set theta depending on what thetaP is + /// entered { - if (!thetaP.empty()) /// When thetaP is not empty, set theta to be the L1 norm - /// of thetaP + if (!thetaP.empty()) /// When thetaP is not empty, set theta to be the L1 + /// norm of thetaP { theta = accumulate(thetaP.begin(), thetaP.end(), 0.0); } else { - theta = 0.0; /// Otherwise thetaP is empty and we set theta to be 0.0 + theta = 0.0; /// Otherwise thetaP is empty and we set theta to be 0.0 } } -void WrightFisher:: - ThetaResetter() /// For conditioned bridge ONLY - set thetaP empty to (2,2), - /// or thetaP = (0,theta)/(theta,0) to (2,theta)/(theta,2) +void WrightFisher::ThetaResetter() /// For conditioned bridge ONLY - set thetaP + /// empty to (2,2), or thetaP = + /// (0,theta)/(theta,0) to + /// (2,theta)/(theta,2) { - if (thetaP.empty()) /// If no mutation present, we need to set both thetaP - /// entries to 2 + if (thetaP.empty()) /// If no mutation present, we need to set both thetaP + /// entries to 2 { thetaP.push_back(2.0); thetaP.push_back(2.0); theta = 4.0; } else if (!(thetaP[0] > 0.0) || - !(thetaP[1] > 0.0)) /// If one sided mutation, we need to set - /// corresponding parameter to 2 + !(thetaP[1] > 0.0)) /// If one sided mutation, we need to set + /// corresponding parameter to 2 { if (!(thetaP[0] > 0.0)) { thetaP[0] = 2.0; @@ -57,28 +60,28 @@ void WrightFisher:: } } -void WrightFisher::SelectionSetter() /// Setting up selection mechanisms +void WrightFisher::SelectionSetter() /// Setting up selection mechanisms { - if (non_neutral) /// If false, we don't need to run anything + if (non_neutral) /// If false, we don't need to run anything { Polynomial GenicSelection(-1.0, 1.0, - 0.0); /// Set up genic selection (which will - /// always be present) as Polynomial class + 0.0); /// Set up genic selection (which will + /// always be present) as Polynomial class double100 AlphaC1 = (thetaP.empty() ? 0.0 : 0.5 * thetaP[0]), AlphaC2 = (thetaP.empty() ? 0.0 : -0.5 * theta); Polynomial Alpha(AlphaC2, AlphaC1); - if (SelectionSetup == 0) /// Genic Selection - sigma*x*(1-x) + if (SelectionSetup == 0) /// Genic Selection - sigma*x*(1-x) { SelPolyDeg = 2; SelectionFunction.Copy(0.5 * sigma * GenicSelection); Polynomial temp_Phi = 0.5 * (2.0 * 0.5 * sigma * Alpha + pow(0.5 * sigma, 2.0) * GenicSelection); - Polynomial temp_A(0.5 * sigma, 0.0); //= sigma*; + Polynomial temp_A(0.5 * sigma, 0.0); //= sigma*; PhiFunction.Copy(temp_Phi); AtildeFunction.Copy(temp_A); } else if (SelectionSetup == - 1) /// Diploid Selection - sigma*x*(1-x)*(h+x*(1-2*h)) + 1) /// Diploid Selection - sigma*x*(1-x)*(h+x*(1-2*h)) { SelPolyDeg = 4; Polynomial Eta(1.0 - 2.0 * dominanceParameter, dominanceParameter); @@ -92,7 +95,7 @@ void WrightFisher::SelectionSetter() /// Setting up selection mechanisms PhiFunction.Copy(temp_Phi); AtildeFunction.Copy(temp_A); } else if (SelectionSetup == - 2) /// General polynomial selection - sigma*x*(1-x)*eta(x) + 2) /// General polynomial selection - sigma*x*(1-x)*eta(x) { SelPolyDeg = 2 * selectionCoeffs.size(); double *coeff_ptr = &selectionCoeffs[0]; @@ -101,13 +104,13 @@ void WrightFisher::SelectionSetter() /// Setting up selection mechanisms 0.5 * (2.0 * 0.5 * sigma * Alpha * Eta + pow(0.5 * sigma, 2.0) * GenicSelection * Eta * Eta + 0.5 * sigma * GenicSelection * Eta.Derivative()); - cout << temp_Phi.EvaluateReal(0.5) << endl; + std::cout << temp_Phi.EvaluateReal(0.5) << endl; vector ACoeffs(SelPolyDeg + 1); for (int i = 0; i <= SelPolyDeg; i++) { ACoeffs[i] = (0.5 * sigma * selectionCoeffs[i]) / (static_cast( - i + 1)); /// Scaling polynomials coefficients appropriately + i + 1)); /// Scaling polynomials coefficients appropriately } coeff_ptr = &ACoeffs[0]; Polynomial temp_A(coeff_ptr, SelPolyDeg); @@ -115,26 +118,27 @@ void WrightFisher::SelectionSetter() /// Setting up selection mechanisms PhiFunction.Copy(temp_Phi); AtildeFunction.Copy(temp_A); } else { - cout << "Please enter a valid selection setup!" - << endl; /// If values not within {0,1,2} complain! + std::cout << "Please enter a valid selection setup!" + << endl; /// If values not within {0,1,2} complain! } } - PhiSetter(); /// Run function to set phi values + PhiSetter(); /// Run function to set phi values } -void WrightFisher::PhiSetter() /// Compute max and min of Phi & Atilde functions +void WrightFisher::PhiSetter() /// Compute max and min of Phi & Atilde + /// functions { - if (non_neutral) /// If false, we don't need to bother + if (non_neutral) /// If false, we don't need to bother { - if (SelectionSetup == 0) /// Genic selection case + if (SelectionSetup == 0) /// Genic selection case { vector GenicSelMinMax = PhitildeMinMaxRange(); phiMin = GenicSelMinMax[0]; phiMax = GenicSelMinMax[1]; AtildeMax = 0.5 * sigma; - } else /// Otherwise we set Phi & Atilde fns, then use the - /// PolynomialRootFinder to compute their extrema + } else /// Otherwise we set Phi & Atilde fns, then use the + /// PolynomialRootFinder to compute their extrema { Polynomial temp1 = PhiFunction.Derivative(), temp2 = AtildeFunction.Derivative(); @@ -201,11 +205,13 @@ void WrightFisher::PhiSetter() /// Compute max and min of Phi & Atilde functions } } +vector WrightFisher::get_Theta() { return thetaP; } + double100 WrightFisher::Phitilde( - double100 y) /// Returns value of the quadratic function phitilde(y) + double100 y) /// Returns value of the quadratic function phitilde(y) { assert((y >= 0.0) && (y <= 1.0)); - if (SelectionSetup == 0) /// For genic selection + if (SelectionSetup == 0) /// For genic selection { if (sigma == 0.0) { return 0.0; @@ -214,30 +220,30 @@ double100 WrightFisher::Phitilde( (-(0.5) * sigma * y * y + ((0.5 * sigma) - theta) * y + (thetaP.empty() ? 0.0 : thetaP[0]))); } - } else /// Otherwise use Polynomial class to evaluate + } else /// Otherwise use Polynomial class to evaluate { return PhiFunction.EvaluateReal(y); } } vector -WrightFisher::PhitildeMinMaxRange() /// Returns the minimum, maximum and range - /// of phitilde respectively for genic - /// selection case +WrightFisher::PhitildeMinMaxRange() /// Returns the minimum, maximum and range + /// of phitilde respectively for genic + /// selection case { double100 phiargmin, phiargmax = max(min(0.5 - (theta / sigma), 1.0), - 0.0); /// Find out max value of phitilde by plugging in - /// derivative(phitilde)=0 + 0.0); /// Find out max value of phitilde by plugging in + /// derivative(phitilde)=0 - if (!(phiargmax > 0.0)) /// Figure out if max is at either boundary and set - /// min to be other + if (!(phiargmax > 0.0)) /// Figure out if max is at either boundary and set + /// min to be other { phiargmin = 1.0; } else if (!(phiargmax < 1.0)) { phiargmin = 0.0; - } else /// Otherwise we need to choose the smaller value at each endpoints as - /// the min + } else /// Otherwise we need to choose the smaller value at each endpoints as + /// the min { double100 phizero = Phitilde(0.0), phione = Phitilde(1.0); @@ -257,25 +263,25 @@ WrightFisher::PhitildeMinMaxRange() /// Returns the minimum, maximum and range return MinMaxRange; } -double100 WrightFisher::Atilde(double100 x) /// Returns the value of Atilde(x) +double100 WrightFisher::Atilde(double100 x) /// Returns the value of Atilde(x) { assert((x >= 0.0) && (x <= 1.0)); - if (SelectionSetup == 0) /// Genic selection case + if (SelectionSetup == 0) /// Genic selection case { return 0.5 * (sigma * x); - } else /// Otherwise use Polynomial class + } else /// Otherwise use Polynomial class { return AtildeFunction.EvaluateReal(x); } } -double100 WrightFisher::Atildeplus() /// Returns the max of Atilde +double100 WrightFisher::Atildeplus() /// Returns the max of Atilde { return AtildeMax; } pair WrightFisher::GriffithsParas( - double100 t) /// Compute parameters for Griffiths approximation + double100 t) /// Compute parameters for Griffiths approximation { assert(t > 0.0); double beta = (theta - 1.0) * static_cast(t) / 2.0; @@ -291,8 +297,8 @@ pair WrightFisher::GriffithsParas( } int WrightFisher::radiate_from_mode(int index, const double100 t) - const /// Moving from mode as opposed to starting from m = 0 and working - /// upwards + const /// Moving from mode as opposed to starting from m = 0 and working + /// upwards { double beta = (theta - 1.0) * static_cast(t) / 2.0; double eta = (abs(beta) <= 2.5e-5 ? 1.0 : beta / (exp(beta) - 1.0)); @@ -307,7 +313,7 @@ int WrightFisher::radiate_from_mode(int index, const double100 t) void WrightFisher::increment_on_mk(vector &mk, const double100 s, const double100 t) - const /// Incrementing (m,k) in bridge sampler using bijective fn + const /// Incrementing (m,k) in bridge sampler using bijective fn { int &m_index = mk[2], &k_index = mk[3]; --m_index; @@ -322,10 +328,9 @@ void WrightFisher::increment_on_mk(vector &mk, const double100 s, double100 WrightFisher::Getd( vector &d, int i, double100 x, double100 z, - double100 t) /// Compute contributions to denom for DrawBridgePMF cases + double100 t) /// Compute contributions to denom for DrawBridgePMF cases { - if (i > static_cast(d.size()) - 1) - d.resize(i + 1, -1.0); + if (i > static_cast(d.size()) - 1) d.resize(i + 1, -1.0); if (d[i] < 0.0) { d[i] = 0.0; int m = i / 2, offset = i % 2; @@ -355,13 +360,12 @@ double100 WrightFisher::Getd( return d[i]; } -double100 -WrightFisher::Getd2(vector &d, int i, double100 x, - double100 t) /// Compute contributions to denom for - /// AncestralProcessConditional function +double100 WrightFisher::Getd2( + vector &d, int i, double100 x, + double100 t) /// Compute contributions to denom for + /// AncestralProcessConditional function { - if (i > static_cast(d.size()) - 1) - d.resize(i + 1, -1.0); + if (i > static_cast(d.size()) - 1) d.resize(i + 1, -1.0); if (d[i] < 0.0) { d[i] = 0.0; int m = i / 2, offset = i % 2; @@ -374,8 +378,8 @@ WrightFisher::Getd2(vector &d, int i, double100 x, pow(x, static_cast(c2))) : (1.0 - pow(1.0 - x, static_cast(c2))); boost::math::binomial_distribution B( - c2, x); // Could make these distributions static for the duration of - // this x and z + c2, x); // Could make these distributions static for the duration of + // this x and z d[i] += exp(Getlogakm(c1, c2) + static_cast(-c1 * (c1 + theta - 1) * t / 2.0)) * binomialremainder; @@ -386,13 +390,12 @@ WrightFisher::Getd2(vector &d, int i, double100 x, return d[i]; } -double100 -WrightFisher::GetdBridgeSame(vector &d, int i, double100 x, - double100 t) /// Compute contributions to denom for - /// DrawBridgePMFSame function +double100 WrightFisher::GetdBridgeSame( + vector &d, int i, double100 x, + double100 + t) /// Compute contributions to denom for DrawBridgePMFSame function { - if (i > static_cast(d.size()) - 1) - d.resize(i + 1, -1.0); + if (i > static_cast(d.size()) - 1) d.resize(i + 1, -1.0); if (d[i] < 0.0) { d[i] = 0.0; int m = i / 2, offset = i % 2; @@ -425,11 +428,10 @@ WrightFisher::GetdBridgeSame(vector &d, int i, double100 x, double100 WrightFisher::GetdBridgeInterior( vector &d, int i, double100 x, double100 z, - double100 - t) /// Compute contributions to denom for DrawBridgePMFInterior function + double100 t) /// Compute contributions to denom for DrawBridgePMFInterior + /// function { - if (i > static_cast(d.size()) - 1) - d.resize(i + 1, -1.0); + if (i > static_cast(d.size()) - 1) d.resize(i + 1, -1.0); if (d[i] < 0.0) { d[i] = 0.0; int m = i / 2, offset = i % 2; @@ -460,12 +462,11 @@ double100 WrightFisher::GetdBridgeInterior( double100 WrightFisher::GetdBridgeUnconditional( vector &d, int i, double100 x, double100 z, - double100 t) /// Compute contributions to denom for - /// DrawBridgePMFUnconditioned function + double100 t) /// Compute contributions to denom for + /// DrawBridgePMFUnconditioned function { int thetaDep = (thetaP.empty() ? 1 : 0); - if (i > static_cast(d.size()) - 1) - d.resize(i + 1, -1.0); + if (i > static_cast(d.size()) - 1) d.resize(i + 1, -1.0); if (d[i] < 0.0) { d[i] = 0.0; int m = i / 2, offset = i % 2; @@ -487,7 +488,7 @@ double100 WrightFisher::GetdBridgeUnconditional( double100 WrightFisher::computeA( int m, int k, int l, int j, double100 x, - double100 z) /// Compute weights for bridge diffusion decomposition + double100 z) /// Compute weights for bridge diffusion decomposition { assert((m >= 0) && (k >= 0) && (l >= 0) && (j >= 0) && (m >= l) && (k >= j) && (x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0)); @@ -498,27 +499,30 @@ double100 WrightFisher::computeA( double100 betaBinPdfs; if (!(x > 0.0) || !(x < 1.0)) { - betaBinPdfs = 1.0; /// If x = 0.0 or 1.0, then there is no contribution + betaBinPdfs = 1.0; /// If x = 0.0 or 1.0, then there is no contribution } else { betaBinPdfs = pdf(BIN, l); } - if (!(z > 0.0) || !(z < 1.0)) /// Same as above but for z + if (!(z > 0.0) || !(z < 1.0)) /// Same as above but for z { - } else { betaBinPdfs *= pdf(BETA, z); } - return betaBinPdfs * boost::math::binomial_coefficient(k, j) * - (boost::math::beta(theta1 + l + j, theta2 + m - l + k - j) / - boost::math::beta(theta1 + l, theta2 + m - l)); + double100 log_bin = LogBinomialCoefficientCalculator(k, j); + double100 log_beta_1 = + log(boost::math::beta(theta1 + l + j, theta2 + m - l + k - j)); + double100 log_beta_2 = + log(boost::math::beta(theta1 + l, theta2 + m - l)); + + return betaBinPdfs * exp(log_bin + log_beta_1 - log_beta_2); } double100 WrightFisher::computeAUnconditional( int m, int k, int l, double100 x, double100 - z) /// Compute weights for unconditioned bridge diffusion decomposition + z) /// Compute weights for unconditioned bridge diffusion decomposition { assert((m >= 0) && (k >= 0) && (l >= 0) && (m >= l) && (x > 0.0) && (x < 1.0) && (!(z > 0.0) || !(z < 1.0))); @@ -549,7 +553,7 @@ double100 WrightFisher::computeAUnconditional( } int WrightFisher::computeC( - int m, pair, double100> &C) /// Compute the quantity C_m + int m, pair, double100> &C) /// Compute the quantity C_m { assert(m >= 0); if (m > static_cast(C.first.size() - 1) || C.first[m] < 0) { @@ -573,7 +577,7 @@ int WrightFisher::computeC( } int WrightFisher::computeE( - pair, double100> &C) /// Compute the quantity E + pair, double100> &C) /// Compute the quantity E { int next_constraint = computeC(0, C), curr_row = 0; int diag_index = next_constraint + (next_constraint % 2); @@ -585,15 +589,14 @@ int WrightFisher::computeE( diag_index = next_constraint + curr_row; diag_index += (diag_index % 2); } - if (curr_row == diag_index / 2) - Efound = true; + if (curr_row == diag_index / 2) Efound = true; } return curr_row; } -double100 -WrightFisher::NormCDF(double100 x, double100 m, - double100 v) /// CDF for N(m,v) - v is the variance +double100 WrightFisher::NormCDF( + double100 x, double100 m, + double100 v) /// CDF for N(m,v) - v is the variance { return 0.5 * erfc(-(x - m) / sqrt(2 * v)); } @@ -601,11 +604,12 @@ WrightFisher::NormCDF(double100 x, double100 m, double100 WrightFisher::DiscretisedNormCDF( int m, double100 - t) /// CDF for discretised normal, binning mass into nearest integer + t) /// CDF for discretised normal, binning mass into nearest integer { double100 returnval; - int threshold = - (thetaP.empty() ? 2 : (thetaP[0] == 0 || !(thetaP[1] > 0.0)) ? 1 : 0); + int threshold = (thetaP.empty() ? 2 + : (thetaP[0] == 0 || !(thetaP[1] > 0.0)) ? 1 + : 0); double beta = (theta - 1.0) * static_cast(t) / 2.0; double eta = (abs(beta) <= 2.5e-5 ? 1.0 : beta / (exp(beta) - 1.0)); double v = @@ -628,15 +632,33 @@ double100 WrightFisher::DiscretisedNormCDF( return returnval; } +double100 WrightFisher::LogBinomialCoefficientCalculator( + int n, int k) /// Calculate usual binomial, with approximations kicking in + /// for large n and k +{ + assert(n >= 0 && k >= 0 && k <= n); + if (n <= 1000) { + return log(boost::math::binomial_coefficient(n, k)); + } else { // Compute log approximation using Stirling's formula + return static_cast(n) * log(static_cast(n)) - + static_cast(k) * log(static_cast(k)) - + static_cast(n - k) * log(static_cast(n - k)) + + 0.5 * (log(static_cast(n)) - + log(static_cast(k)) - + log(static_cast(n - k)) - + log(2 * boost::math::constants::pi())); + } +} + double100 WrightFisher::UnconditionedDiffusionDensity( double100 x, double100 y, double100 t, - const Options &o) /// Compute truncation to diffusion transition density - /// where diffusion can be absorbed at any time + const Options &o) /// Compute truncation to diffusion transition density + /// where diffusion can be absorbed at any time { assert((x > 0.0) && (x < 1.0) && (y >= 0.0) && (y <= 1.0) && (t > 0.0)); int thetaDependent = - (thetaP.empty() ? 1 : 0); /// Check what thetaP configuration we have + (thetaP.empty() ? 1 : 0); /// Check what thetaP configuration we have double100 density = 0.0, density_inc, threshold = 1.0e-12; int mMode = static_cast(floor(GriffithsParas(t).first)), m = mMode, mFlip = 1, mU = 0, mD = 0; @@ -677,7 +699,7 @@ double100 WrightFisher::UnconditionedDiffusionDensity( density += density_inc; - if (!(mDownSwitch)) /// Switching mechanism + if (!(mDownSwitch)) /// Switching mechanism { if (sgn(m - mMode) <= 0) { mDownSwitch = @@ -712,8 +734,8 @@ double100 WrightFisher::UnconditionedDiffusionDensity( double100 WrightFisher::DiffusionDensityApproximationDenom( double100 x, double100 t, const Options - &o) /// Compute denominator for truncation to diffusion transition - /// density when diffusion conditioned on non-absorption + &o) /// Compute denominator for truncation to diffusion transition + /// density when diffusion conditioned on non-absorption { assert((x >= 0.0) && (x <= 1.0) && (t > 0.0)); int thetaDependent = @@ -722,7 +744,7 @@ double100 WrightFisher::DiffusionDensityApproximationDenom( double100 denom; if ((thetaDependent == 1) || - (thetaDependent == 2)) /// Check whether we have a zero mutation entry + (thetaDependent == 2)) /// Check whether we have a zero mutation entry { double100 denom_inc = 1.0; denom = 0.0; @@ -730,7 +752,7 @@ double100 WrightFisher::DiffusionDensityApproximationDenom( Dflip = 1, Djm = 0, Djp = 0; while (denom_inc > - 0.0) /// As long as increments are positive, keep computing + 0.0) /// As long as increments are positive, keep computing { if (!(x > 0.0) || !(x < 1.0)) { denom_inc = QmApprox(d, t, o) * static_cast(d); @@ -743,8 +765,8 @@ double100 WrightFisher::DiffusionDensityApproximationDenom( denom += denom_inc; if (Dflip == -1 && - (dMode - Djm - 1 >= - thetaDependent)) /// Mechanism to explore either side around the mode + (dMode - Djm - 1 >= thetaDependent)) /// Mechanism to explore either + /// side around the mode { Djm++; d = dMode - Djm; @@ -764,14 +786,14 @@ double100 WrightFisher::DiffusionDensityApproximationDenom( double100 WrightFisher::DiffusionDensityApproximation( double100 x, double100 y, double100 t, - const Options &o) /// Compute truncation to diffusion transition density + const Options &o) /// Compute truncation to diffusion transition density { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (t > 0.0)); int thetaDependent = (thetaP.empty() ? 2 : ((thetaP[0] > 0.0 && thetaP[1] > 0.0) ? 0 - : 1)); /// Check what thetaP configuration we have + : 1)); /// Check what thetaP configuration we have double100 density = 0.0, density_inc, denom = DiffusionDensityApproximationDenom(x, t, o), threshold = max(1.0e-12 * denom, 1.0e-50); @@ -793,11 +815,17 @@ double100 WrightFisher::DiffusionDensityApproximation( boost::math::binomial_distribution<> BIN(m, x); boost::math::beta_distribution BETA( static_cast(l), static_cast(m - l)); - addon += pdf(BIN, l) * pdf(BETA, y); + if (l < 1 && y == 0.0) { + addon += pdf(BIN, l) * pdf(BETA, y + 1.0e-12); + } else if (m - l < 1 && y == 1.0) { + addon += pdf(BIN, l) * pdf(BETA, y - 1.0e-12); + } else { + addon += pdf(BIN, l) * pdf(BETA, y); + } } density_inc = QmApprox(m, t, o) * addon; } - } else if (!(thetaP[0] > 0.0)) //|| !( thetaP[1] > 0.0 ) ) + } else if (!(thetaP[0] > 0.0)) //|| !( thetaP[1] > 0.0 ) ) { /*bool thetaSwitch = false; if ( !( thetaP[1] > 0.0 ) ) @@ -816,7 +844,13 @@ double100 WrightFisher::DiffusionDensityApproximation( boost::math::binomial_distribution<> BIN(m, x); boost::math::beta_distribution BETA( static_cast(l), static_cast(theta + m - l)); - addon += pdf(BIN, l) * pdf(BETA, y); + if (l < 1 && y == 0.0) { + addon += pdf(BIN, l) * pdf(BETA, y + 1.0e-12); + } else if (theta + m - l < 1.0 && y == 1.0) { + addon += pdf(BIN, l) * pdf(BETA, y - 1.0e-12); + } else { + addon += pdf(BIN, l) * pdf(BETA, y); + } } density_inc = QmApprox(m, t, o) * addon; } @@ -836,7 +870,13 @@ double100 WrightFisher::DiffusionDensityApproximation( boost::math::binomial_distribution<> BIN(m, x); boost::math::beta_distribution BETA( static_cast(theta + l), static_cast(m - l)); - addon += pdf(BIN, l) * pdf(BETA, y); + if (theta + l < 1.0 && y == 0.0) { + addon += pdf(BIN, l) * pdf(BETA, y + 1.0e-12); + } else if (m - l < 1 && y == 1.0) { + addon += pdf(BIN, l) * pdf(BETA, y - 1.0e-12); + } else { + addon += pdf(BIN, l) * pdf(BETA, y); + } } density_inc = QmApprox(m, t, o) * addon; } @@ -847,14 +887,20 @@ double100 WrightFisher::DiffusionDensityApproximation( boost::math::beta_distribution BETA( static_cast(thetaP[0] + l), static_cast(thetaP[1] + m - l)); - addon += pdf(BIN, l) * pdf(BETA, y); + if (thetaP[0] + l < 1.0 && y == 0.0) { + addon += pdf(BIN, l) * pdf(BETA, y + 1.0e-12); + } else if (thetaP[1] + m - l < 1.0 && y == 1.0) { + addon += pdf(BIN, l) * pdf(BETA, y - 1.0e-12); + } else { + addon += pdf(BIN, l) * pdf(BETA, y); + } } density_inc = QmApprox(m, t, o) * addon; } density += density_inc / denom; - if (!(mDownSwitch)) /// Switching mechanism + if (!(mDownSwitch)) /// Switching mechanism { if (sgn(m - mMode) <= 0) { mDownSwitch = @@ -886,21 +932,21 @@ double100 WrightFisher::DiffusionDensityApproximation( return density; } -double100 -WrightFisher::QmApprox(int m, double100 t, - const Options &o) /// Compute an approximation to q_m(t) +double100 WrightFisher::QmApprox( + int m, double100 t, + const Options &o) /// Compute an approximation to q_m(t) { assert((m >= 0) && (t > 0.0)); double100 qm = 0.0, qmold = -1.0; - if (t <= o.g1984threshold) /// If time increment is too small, use discretised - /// Gaussian + if (t <= o.g1984threshold) /// If time increment is too small, use + /// discretised Gaussian { qm = DiscretisedNormCDF(m, t); } else { int mkIndex = m; while (abs(qm - qmold) > 1.0e-12 || qm < 0.0 || - qm > 1.0) /// If increments are big enough, keep going + qm > 1.0) /// If increments are big enough, keep going { qmold = qm; qm += pow(-1.0, mkIndex - m) * @@ -910,8 +956,8 @@ WrightFisher::QmApprox(int m, double100 t, mkIndex++; if (!(qm > qmold) && !(qm < qmold) && - (qm < 0.0 || qm > 1.0)) /// We have lost precision, so use discretised - /// normal approximation + (qm < 0.0 || qm > 1.0)) /// We have lost precision, so use + /// discretised normal approximation { return DiscretisedNormCDF(m, t); } @@ -925,8 +971,8 @@ WrightFisher::QmApprox(int m, double100 t, double100 WrightFisher::UnconditionedBridgeDensity( double100 x, double100 z, double100 y, double100 s, double100 t, const Options - &o) /// Compute an approximation to the transition density of the - /// diffusion bridge when absorption can happen at any time + &o) /// Compute an approximation to the transition density of the + /// diffusion bridge when absorption can happen at any time { assert((x > 0.0) && (x < 1.0) && (y >= 0.0) && (y <= 1.0) && (s > 0.0) && (s < t)); @@ -940,12 +986,13 @@ double100 WrightFisher::UnconditionedBridgeDensity( int dmode = static_cast(ceil(GriffithsParas(t).first)), d = dmode, Dflip = 1, Djm = 0, Djp = 0, mkdLower = (thetaP.empty() ? 1 : 0); - while (denom_inc > 0.0) /// As long as increments are positive, keep computing + while (denom_inc > + 0.0) /// As long as increments are positive, keep computing { - if (!(z > 0.0)) /// z = 0 + if (!(z > 0.0)) /// z = 0 { denom_inc = QmApprox(d, t, o) * pow(1.0 - x, static_cast(d)); - } else /// z = 1 + } else /// z = 1 { denom_inc = QmApprox(d, t, o) * pow(x, static_cast(d)); } @@ -954,7 +1001,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( if (Dflip == -1 && (dmode - Djm - 1 >= - mkdLower)) /// Mechanism to explore either side around the mode + mkdLower)) /// Mechanism to explore either side around the mode { Djm++; d = dmode - Djm; @@ -969,8 +1016,8 @@ double100 WrightFisher::UnconditionedBridgeDensity( if ((!(y > 0.0) && ((thetaP.empty() || !(thetaP[0] > 0.0)))) || (!(y < 1.0) && ((thetaP.empty() || !(thetaP[1] > 0.0))))) { int mMode = GriffithsParas(s).first, - kMode = GriffithsParas(t - s).first; /// Use these together eC to get - /// estimate of suitable threshold + kMode = GriffithsParas(t - s).first; /// Use these together eC to get + /// estimate of suitable threshold double100 constcontr = ((!(y > 0.0) && ((thetaP.empty() || !(thetaP[0] > 0.0)))) ? static_cast(mMode) * log(1.0 - x) @@ -997,18 +1044,18 @@ double100 WrightFisher::UnconditionedBridgeDensity( exp(log(max(1.0e-300, QmApprox(m, s, o))) + log(max(1.0e-300, QmApprox(k, t - s, o))) + static_cast(m) * log(1.0 - x) - - log(eC)); /// Putting all the separate contributions together + log(eC)); /// Putting all the separate contributions together } else { num_inc = exp(log(max(1.0e-300, QmApprox(m, s, o))) + log(max(1.0e-300, QmApprox(k, t - s, o))) + static_cast(m) * log(x) - - log(eC)); /// Putting all the separate contributions together + log(eC)); /// Putting all the separate contributions together } density += num_inc; - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = @@ -1037,7 +1084,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = @@ -1070,10 +1117,10 @@ double100 WrightFisher::UnconditionedBridgeDensity( return density; } else if (thetaP.empty() || !(thetaP[0] > 0.0)) { vector modeGuess = mklModeFinder( - x, z, s, t, o); /// Compute mode over (m,k,l) to use as start points + x, z, s, t, o); /// Compute mode over (m,k,l) to use as start points int mMode = modeGuess[0], kMode = modeGuess[1], - lMode = modeGuess[2]; /// Use these estimates together with eC as a - /// gauge for suitable threshold + lMode = modeGuess[2]; /// Use these estimates together with eC as a + /// gauge for suitable threshold double100 ycontr, xcontr; if (((lMode == 0) && (!(z > 0.0))) || ((lMode == mMode) && (!(z < 1.0)))) { xcontr = @@ -1104,7 +1151,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( /// Allows to avoid calling beta functions, and thus faster while (!mSwitch) { double100 qm = max(1.0e-300, QmApprox(m, s, o)); - if (m != mMode) /// Increment m contributions accordingly + if (m != mMode) /// Increment m contributions accordingly { if (mU > mD) { mContr_U += log(static_cast(theta + (m - 1))); @@ -1121,7 +1168,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( bool kSwitch = false, kDownSwitch = false, kUpSwitch = false; double100 kContr_D = static_cast(k) * (!(z > 0.0) ? log(1.0 - y) : log(y)), - kContr_U = kContr_D, kContr; /// Calculate k contributions + kContr_U = kContr_D, kContr; /// Calculate k contributions while (!kSwitch) { double100 qk = max(1.0e-300, QmApprox(k, t - s, o)); @@ -1144,9 +1191,9 @@ double100 WrightFisher::UnconditionedBridgeDensity( ? m - 1 : ((!(thetaP[1] > 0.0) && !(z < 1.0)) ? m - 1 : m)); int lFlip = 1, newlMode = min(lMode, lUpper), l = newlMode, lU = 0, - lD = 0; /// Need to ensure l <= m as m changes! + lD = 0; /// Need to ensure l <= m as m changes! bool lSwitch = false, lDownSwitch = false, - lUpSwitch = false; /// Compute l contributions + lUpSwitch = false; /// Compute l contributions boost::math::binomial_distribution BIN(m, x); double100 lContr_D = log(pdf(BIN, l)) + static_cast(l) * log(y) + @@ -1177,10 +1224,10 @@ double100 WrightFisher::UnconditionedBridgeDensity( } double100 density_inc = exp(constContr + mContr + kContr + lContr - - log(eC)); /// Putting all separate contributions together + log(eC)); /// Putting all separate contributions together density += density_inc; - if (!(lDownSwitch)) /// Switching mechanism for l + if (!(lDownSwitch)) /// Switching mechanism for l { if (sgn(l - newlMode) <= 0) { lDownSwitch = @@ -1212,7 +1259,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( } } - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = @@ -1241,7 +1288,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = @@ -1274,10 +1321,10 @@ double100 WrightFisher::UnconditionedBridgeDensity( return density; } else { vector modeGuess = mklModeFinder( - x, z, s, t, o); /// Compute mode over (m,k,l) to use as start points + x, z, s, t, o); /// Compute mode over (m,k,l) to use as start points int mMode = modeGuess[0], kMode = modeGuess[1], - lMode = modeGuess[2]; /// Use these estimates together with eC as a - /// gauge for suitable threshold + lMode = modeGuess[2]; /// Use these estimates together with eC as a + /// gauge for suitable threshold double100 xcontr, ycontr; if (lMode == 0) { xcontr = static_cast(mMode) * log(x); @@ -1306,7 +1353,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( /// Allows to avoid calling beta functions, and thus faster while (!mSwitch) { double100 qm = max(1.0e-300, QmApprox(m, s, o)); - if (m != mMode) /// Increment m contributions accordingly + if (m != mMode) /// Increment m contributions accordingly { if (mU > mD) { mContr_U += log(static_cast(theta + (m - 1))); @@ -1322,7 +1369,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( int k = kMode, kFlip = 1, kD = 0, kU = 0; bool kSwitch = false, kDownSwitch = false, kUpSwitch = false; double100 kContr_D = static_cast(k) * log(y), - kContr_U = kContr_D, kContr; /// Calculate k contributions + kContr_U = kContr_D, kContr; /// Calculate k contributions while (!kSwitch) { double100 qk = max(1.0e-300, QmApprox(k, t - s, o)); @@ -1339,7 +1386,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( } int lFlip = 1, newlMode = min(lMode, m), l = newlMode, lU = 0, - lD = 0; /// Need to ensure l <= m as m changes! + lD = 0; /// Need to ensure l <= m as m changes! int lLower = (thetaP.empty() ? 1 : ((!(thetaP[0] > 0.0) && !(z > 0.0)) ? 1 : 0)), @@ -1347,7 +1394,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( ? m - 1 : ((!(thetaP[1] > 0.0) && !(z < 1.0)) ? m - 1 : m)); bool lSwitch = false, lDownSwitch = false, - lUpSwitch = false; /// Compute l contributions + lUpSwitch = false; /// Compute l contributions boost::math::binomial_distribution BIN(m, x); double100 lContr_D = log(pdf(BIN, l)) + static_cast(l) * log(y) + @@ -1378,10 +1425,10 @@ double100 WrightFisher::UnconditionedBridgeDensity( } double100 density_inc = exp(constContr + mContr + kContr + lContr - - log(eC)); /// Putting all separate contributions together + log(eC)); /// Putting all separate contributions together density += density_inc; - if (!(lDownSwitch)) /// Switching mechanism for l + if (!(lDownSwitch)) /// Switching mechanism for l { if (sgn(l - newlMode) <= 0) { lDownSwitch = @@ -1413,7 +1460,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( } } - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = @@ -1442,7 +1489,7 @@ double100 WrightFisher::UnconditionedBridgeDensity( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = @@ -1478,8 +1525,8 @@ double100 WrightFisher::UnconditionedBridgeDensity( double100 WrightFisher::BridgeDenom( double100 x, double100 z, double100 y, double100 s, double100 t, - const Options &o) /// Compute an approximation to the denominator for the - /// transition density of the diffusion bridge + const Options &o) /// Compute an approximation to the denominator for the + /// transition density of the diffusion bridge { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t > 0.0) && (s > 0.0) && (s < t)); @@ -1488,9 +1535,9 @@ double100 WrightFisher::BridgeDenom( int dmode = static_cast(ceil(GriffithsParas(t).first)), d = dmode, Dflip = 1, Djm = 0, Djp = 0; - while (inc > 0.0) /// As long as increments are positive, keep computing + while (inc > 0.0) /// As long as increments are positive, keep computing { - if ((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0)) /// x,z in (0,1) + if ((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0)) /// x,z in (0,1) { double100 betabin = 0.0; for (int f = 0; f != d + 1; f++) { @@ -1504,7 +1551,7 @@ double100 WrightFisher::BridgeDenom( inc = QmApprox(d, t, o) * betabin; } else if ((z > 0.0) && (z < 1.0) && - (!(x > 0.0) || !(x < 1.0))) /// x in {0,1}, z in (0,1) + (!(x > 0.0) || !(x < 1.0))) /// x in {0,1}, z in (0,1) { double100 para1 = (!(x > 0.0) ? thetaP[0] : static_cast(thetaP[0] + d)), @@ -1513,7 +1560,7 @@ double100 WrightFisher::BridgeDenom( boost::math::beta_distribution BETAZ(para1, para2); inc = QmApprox(d, t, o) * pdf(BETAZ, z); } else if ((x > 0.0) && (x < 1.0) && - (!(z > 0.0) || !(z < 1.0))) /// x in (0,1), z in {0,1} + (!(z > 0.0) || !(z < 1.0))) /// x in (0,1), z in {0,1} { double100 para1 = (!(z > 0.0) ? thetaP[0] : static_cast(thetaP[0] + d)), @@ -1523,14 +1570,14 @@ double100 WrightFisher::BridgeDenom( : pow(x, static_cast(d))); inc = QmApprox(d, t, o) * xcon * (1.0 / boost::math::beta(para1, para2)); - } else if (!(x < z) && !(x > z)) /// x,z in {0,1} and x=z + } else if (!(x < z) && !(x > z)) /// x,z in {0,1} and x=z { double100 para1 = (!(x > 0.0) ? thetaP[0] : static_cast(thetaP[0] + d)), para2 = (!(x > 0.0) ? static_cast(thetaP[1] + d) : thetaP[1]); inc = QmApprox(d, t, o) / boost::math::beta(para1, para2); - } else /// x,z in {0,1} and x!=z + } else /// x,z in {0,1} and x!=z { return QmApprox(0, t, o) / boost::math::beta(thetaP[0], thetaP[1]); @@ -1539,7 +1586,7 @@ double100 WrightFisher::BridgeDenom( denom += inc; if (Dflip == -1 && - (dmode - Djm > 0)) /// Mechanism to explore either side around the mode + (dmode - Djm > 0)) /// Mechanism to explore either side around the mode { Djm++; d = dmode - Djm; @@ -1556,7 +1603,7 @@ double100 WrightFisher::BridgeDenom( double100 WrightFisher::ComputeDensity1( double100 x, double100 z, double100 y, double100 s, double100 t, - const Options &o) /// Compute bridge density when x,z in (0,1) (any theta!) + const Options &o) /// Compute bridge density when x,z in (0,1) (any theta!) { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t > 0.0) && (s > 0.0) && (s < t)); @@ -1565,10 +1612,10 @@ double100 WrightFisher::ComputeDensity1( } vector modeGuess = mkljModeFinder( - x, z, s, t, o); /// Compute mode over (m,k,l,j) to use as start points + x, z, s, t, o); /// Compute mode over (m,k,l,j) to use as start points int mMode = modeGuess[0], kMode = modeGuess[1], lMode = modeGuess[2], - jMode = modeGuess[3]; /// Use these estimates together with eC as a gauge - /// for suitable threshold + jMode = modeGuess[3]; /// Use these estimates together with eC as a gauge + /// for suitable threshold double100 qmmode = max(1.0e-300, QmApprox(mMode, s, o)), qkmode = max(1.0e-300, QmApprox(kMode, t - s, o)); boost::math::binomial_distribution<> BINx(mMode, x), BINy(kMode, y); @@ -1590,11 +1637,11 @@ double100 WrightFisher::ComputeDensity1( double100 mContr_D = boost::math::lgamma( static_cast(thetaP[0] + thetaP[1] + m)), mContr_U = mContr_D, - mContr; /// Compute contributions depending only on m + mContr; /// Compute contributions depending only on m /// Allows to avoid calling beta functions, and thus faster while (!mSwitch) { double100 qm = QmApprox(m, s, o); - if (m != mMode) /// Increment m contributions accordingly + if (m != mMode) /// Increment m contributions accordingly { if (mU > mD) { mContr_U += @@ -1613,7 +1660,7 @@ double100 WrightFisher::ComputeDensity1( bool kSwitch = false, kDownSwitch = false, kUpSwitch = false; double100 kContr_D = boost::math::lgamma( static_cast(thetaP[0] + thetaP[1] + k)), - kContr_U = kContr_D, kContr; /// Calculate k contributions + kContr_U = kContr_D, kContr; /// Calculate k contributions while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); @@ -1632,10 +1679,10 @@ double100 WrightFisher::ComputeDensity1( } int lFlip = 1, lU = 0, lD = 0, newlMode = min(lMode, m), - l = newlMode; /// Need to ensure l <= m since m changes! + l = newlMode; /// Need to ensure l <= m since m changes! bool lSwitch = false, lDownSwitch = false, lUpSwitch = false; boost::math::binomial_distribution BINL( - m, x); /// Contributions from l + m, x); /// Contributions from l double100 lContr_D = (log(pdf(BINL, l)) - boost::math::lgamma(static_cast(thetaP[0] + l)) - @@ -1670,11 +1717,12 @@ double100 WrightFisher::ComputeDensity1( } int jFlip = 1, jU = 0, jD = 0, newjMode = min(jMode, k), - j = newjMode; /// Need to ensure j <= k as k changes! + j = newjMode; /// Need to ensure j <= k as k changes! bool jSwitch = false, jDownSwitch = false, - jUpSwitch = false; /// Compute j contributions + jUpSwitch = false; /// Compute j contributions + double100 jContr_D = - log(boost::math::binomial_coefficient(k, j)) - + LogBinomialCoefficientCalculator(k, j) - boost::math::lgamma(static_cast(thetaP[0] + j)) - boost::math::lgamma(static_cast(thetaP[1] + k - j)) + static_cast(thetaP[0] + j - 1) * log(z) + @@ -1709,10 +1757,10 @@ double100 WrightFisher::ComputeDensity1( double100 density_inc = exp(mContr + kContr + lContr + jContr - - log(eC)); /// Put all separate contributions together + log(eC)); /// Put all separate contributions together density += density_inc; - if (!(jDownSwitch)) /// Check whether we can still move downwards + if (!(jDownSwitch)) /// Check whether we can still move downwards { if (sgn(j - newjMode) <= 0) { jDownSwitch = @@ -1720,7 +1768,7 @@ double100 WrightFisher::ComputeDensity1( } } - if (!(jUpSwitch)) /// Check whether we can still move downwards + if (!(jUpSwitch)) /// Check whether we can still move downwards { if (sgn(j - newjMode) >= 0) { jUpSwitch = @@ -1729,9 +1777,9 @@ double100 WrightFisher::ComputeDensity1( } jSwitch = (jDownSwitch && - jUpSwitch); /// Decide if we can move out and change l + jUpSwitch); /// Decide if we can move out and change l - if (!jSwitch) /// If we cannot, we need to move upwards or downwards + if (!jSwitch) /// If we cannot, we need to move upwards or downwards { if ((jFlip == 1 && (newjMode + jU + 1 <= k)) || (jDownSwitch && !(jUpSwitch))) { @@ -1747,9 +1795,9 @@ double100 WrightFisher::ComputeDensity1( } } - if (!(lDownSwitch)) /// Same procedure as for j contributions, but now - /// we don't need to worry about increments being - /// below threshold + if (!(lDownSwitch)) /// Same procedure as for j contributions, but now + /// we don't need to worry about increments being + /// below threshold { if (sgn(l - newlMode) <= 0) { lDownSwitch = (((jU == 0) && (jD == 0)) || (newlMode - lD - 1) < 0); @@ -1779,7 +1827,7 @@ double100 WrightFisher::ComputeDensity1( } } - if (!(kDownSwitch)) /// Same switching procedure as for l + if (!(kDownSwitch)) /// Same switching procedure as for l { if (sgn(k - kMode) <= 0) { kDownSwitch = (((lU == 0) && (lD == 0)) || (kMode - kD - 1 < 0)); @@ -1807,7 +1855,7 @@ double100 WrightFisher::ComputeDensity1( } } - if (!(mDownSwitch)) /// Same switching procedure as for k + if (!(mDownSwitch)) /// Same switching procedure as for k { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -1842,7 +1890,7 @@ double100 WrightFisher::ComputeDensity1( double100 WrightFisher::ComputeDensity2( double100 x, double100 z, double100 y, double100 s, double100 t, const Options - &o) /// Compute bridge density when x in {0,1},z in (0,1) (any theta!) + &o) /// Compute bridge density when x in {0,1},z in (0,1) (any theta!) { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t > 0.0) && (s > 0.0) && (s < t)); @@ -1851,10 +1899,10 @@ double100 WrightFisher::ComputeDensity2( } vector modeGuess = mkjModeFinder( - x, z, s, t, o); /// Compute mode over (m,k,j) to use as start points + x, z, s, t, o); /// Compute mode over (m,k,j) to use as start points int mMode = modeGuess[0], kMode = modeGuess[1], - jMode = modeGuess[2]; /// Use these estimates together with eC as a gauge - /// for suitable threshold + jMode = modeGuess[2]; /// Use these estimates together with eC as a gauge + /// for suitable threshold double100 qmmode = max(1.0e-300, QmApprox(mMode, s, o)), qkmode = max(1.0e-300, QmApprox(kMode, t - s, o)); double100 p1 = static_cast(!(x > 0.0) ? thetaP[0] @@ -1895,7 +1943,7 @@ double100 WrightFisher::ComputeDensity2( /// Allows to avoid calling beta functions, and thus faster while (!mSwitch) { double100 qm = QmApprox(m, s, o); - if (m != mMode) /// Increment m contributions accordingly + if (m != mMode) /// Increment m contributions accordingly { if (mU > mD) { mContr_U += @@ -1922,7 +1970,7 @@ double100 WrightFisher::ComputeDensity2( bool kSwitch = false, kDownSwitch = false, kUpSwitch = false; double100 kContr_D = boost::math::lgamma( static_cast(thetaP[0] + thetaP[1] + k)), - kContr_U = kContr_D, kContr; /// Calculate k contributions + kContr_U = kContr_D, kContr; /// Calculate k contributions while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); @@ -1941,11 +1989,12 @@ double100 WrightFisher::ComputeDensity2( } int jFlip = 1, newjMode = min(jMode, k), j = newjMode, jU = 0, - jD = 0; /// Need to ensure j <= k as k changes! + jD = 0; /// Need to ensure j <= k as k changes! bool jSwitch = false, jDownSwitch = false, - jUpSwitch = false; /// Compute j contributions + jUpSwitch = false; /// Compute j contributions + double100 jContr_D = - log(boost::math::binomial_coefficient(k, j)) - + LogBinomialCoefficientCalculator(k, j) - boost::math::lgamma(static_cast(thetaP[0] + j)) - boost::math::lgamma(static_cast(thetaP[1] + k - j)) + static_cast(thetaP[0] + j) * log(z) + @@ -1979,11 +2028,11 @@ double100 WrightFisher::ComputeDensity2( } double100 density_inc = exp(constContr + mContr + kContr + jContr - - log(eC)); /// Putting all separate contributions together + log(eC)); /// Putting all separate contributions together density += density_inc; - if (!(jDownSwitch)) /// Switching mechnism for j, exactly as in - /// ComputeDensity1 function + if (!(jDownSwitch)) /// Switching mechnism for j, exactly as in + /// ComputeDensity1 function { if (sgn(j - newjMode) <= 0) { jDownSwitch = @@ -2014,7 +2063,7 @@ double100 WrightFisher::ComputeDensity2( } } - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = (((jU == 0) && (jD == 0)) || (kMode - kD - 1 < 0)); @@ -2042,7 +2091,7 @@ double100 WrightFisher::ComputeDensity2( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -2077,7 +2126,7 @@ double100 WrightFisher::ComputeDensity2( double100 WrightFisher::ComputeDensity3( double100 x, double100 z, double100 y, double100 s, double100 t, const Options - &o) /// Compute bridge density when x,z in {0,1}, x=z (any theta!) + &o) /// Compute bridge density when x,z in {0,1}, x=z (any theta!) { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t > 0.0) && (s > 0.0) && (s < t)); @@ -2085,10 +2134,10 @@ double100 WrightFisher::ComputeDensity3( return 0.0; } - vector modeGuess = mkModeFinder(x, z, s, t, o); /// Find mode over (m,k) + vector modeGuess = mkModeFinder(x, z, s, t, o); /// Find mode over (m,k) int mMode = modeGuess[0], - kMode = modeGuess[1]; /// Use these together eC to get estimate of - /// suitable threshold + kMode = modeGuess[1]; /// Use these together eC to get estimate of + /// suitable threshold double100 qmmode = max(1.0e-300, QmApprox(mMode, s, o)), qkmode = max(1.0e-300, QmApprox(kMode, t - s, o)); double100 th1 = static_cast(!(x > 0.0) ? thetaP[0] : thetaP[1]), @@ -2127,7 +2176,7 @@ double100 WrightFisher::ComputeDensity3( static_cast(m) * log(1.0 - y) : -boost::math::lgamma(static_cast(thetaP[0] + m)) + static_cast(m) * log(y)); - double100 mContr_U = mContr_D, mContr; /// Contributions from m + double100 mContr_U = mContr_D, mContr; /// Contributions from m while (!mSwitch) { double100 qm = QmApprox(m, s, o); @@ -2163,7 +2212,7 @@ double100 WrightFisher::ComputeDensity3( static_cast(k) * log(1.0 - y) : -boost::math::lgamma(static_cast(thetaP[0] + k)) + static_cast(k) * log(y))); - double100 kContr_U = kContr_D, kContr; /// Contributions from k + double100 kContr_U = kContr_D, kContr; /// Contributions from k while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); @@ -2193,10 +2242,10 @@ double100 WrightFisher::ComputeDensity3( double100 density_inc = exp(constContr + mContr + kContr - - log(eC)); /// Putting all the separate contributions together + log(eC)); /// Putting all the separate contributions together density += density_inc; - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = ((density_inc < threshold) || (kMode - kD - 1 < 0)); @@ -2224,7 +2273,7 @@ double100 WrightFisher::ComputeDensity3( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -2259,7 +2308,7 @@ double100 WrightFisher::ComputeDensity3( double100 WrightFisher::ComputeDensity4( double100 x, double100 z, double100 y, double100 s, double100 t, const Options - &o) /// Compute bridge density when x,z in {0,1}, x!=z (any theta!) + &o) /// Compute bridge density when x,z in {0,1}, x!=z (any theta!) { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t > 0.0) && (s > 0.0) && (s < t)); @@ -2267,9 +2316,9 @@ double100 WrightFisher::ComputeDensity4( return 0.0; } - vector modeGuess = mkModeFinder(x, z, s, t, o); /// Find mode over (m,k) + vector modeGuess = mkModeFinder(x, z, s, t, o); /// Find mode over (m,k) int mMode = modeGuess[0], - kMode = modeGuess[1]; /// Use together with eC to get suitable threshold + kMode = modeGuess[1]; /// Use together with eC to get suitable threshold double100 qmmode = max(1.0e-300, QmApprox(mMode, s, o)), qkmode = max(1.0e-300, QmApprox(kMode, t - s, o)); double100 gammaratios = @@ -2303,7 +2352,7 @@ double100 WrightFisher::ComputeDensity4( static_cast(m) * log(1.0 - y) : -boost::math::lgamma(static_cast(thetaP[0] + m)) + static_cast(m) * log(y)); - double100 mContr_U = mContr_D, mContr; /// Contributions from m + double100 mContr_U = mContr_D, mContr; /// Contributions from m while (!mSwitch) { double100 qm = QmApprox(m, s, o); @@ -2338,7 +2387,7 @@ double100 WrightFisher::ComputeDensity4( static_cast(k) * log(y) : -boost::math::lgamma(static_cast(thetaP[1] + k)) + static_cast(k) * log(1.0 - y))); - double100 kContr_U = kContr_D, kContr; /// Contributions from k + double100 kContr_U = kContr_D, kContr; /// Contributions from k while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); @@ -2367,10 +2416,10 @@ double100 WrightFisher::ComputeDensity4( double100 density_inc = exp(constContr + mContr + kContr - - log(eC)); /// Putting all separate contributions together + log(eC)); /// Putting all separate contributions together density += density_inc; - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = ((density_inc < threshold) || (kMode - kD - 1 < 0)); @@ -2398,7 +2447,7 @@ double100 WrightFisher::ComputeDensity4( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -2432,27 +2481,27 @@ double100 WrightFisher::ComputeDensity4( double100 WrightFisher::BridgeDensity( double100 x, double100 z, double100 y, double100 s, double100 t, - const Options &o) /// Function to determine which case from the above - /// computeDensity to invoke + const Options &o) /// Function to determine which case from the above + /// computeDensity to invoke { assert((x >= 0.0) && (x <= 1.0) && (y >= 0.0) && (y <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t > 0.0) && (s > 0.0) && (s < t)); - if ((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0)) /// x,z in (0,1) + if ((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0)) /// x,z in (0,1) { return ComputeDensity1(x, z, y, s, t, o); - } else if ((x > 0.0) && (x < 1.0)) /// x in (0,1), z in {0,1} + } else if ((x > 0.0) && (x < 1.0)) /// x in (0,1), z in {0,1} { return ComputeDensity2(z, x, y, t - s, t, - o); /// Equivalent to a reverse bridge going from z - /// to y in time t-s and ending at x at time t - } else if ((z > 0.0) && (z < 1.0)) /// x in {0,1}, z in (0,1) + o); /// Equivalent to a reverse bridge going from z + /// to y in time t-s and ending at x at time t + } else if ((z > 0.0) && (z < 1.0)) /// x in {0,1}, z in (0,1) { return ComputeDensity2(x, z, y, s, t, o); - } else if (x == z) /// x,z in {0,1}, x=z + } else if (x == z) /// x,z in {0,1}, x=z { return ComputeDensity3(x, z, y, s, t, o); - } else /// x,z in {0,1}, x!=z + } else /// x,z in {0,1}, x!=z { return ComputeDensity4(x, z, y, s, t, o); } @@ -2460,7 +2509,7 @@ double100 WrightFisher::BridgeDensity( double100 WrightFisher::LogSumExp( vector &vecProb, - double100 maxProb) /// Routine to perform log-sum-exp trick + double100 maxProb) /// Routine to perform log-sum-exp trick { double100 sumexp = 0.0; for (vector::iterator vPi = vecProb.begin(); vPi != vecProb.end(); @@ -2480,8 +2529,8 @@ double100 WrightFisher::LogSumExp( pair WrightFisher::DrawAncestralProcess( double100 t, const Options &o, - boost::random::mt19937 &gen) /// Draws from the law of the Ancestral Process - /// using upper and lower sums + boost::random::mt19937 &gen) /// Draws from the law of the Ancestral + /// Process using upper and lower sums { assert(t > 0.0); /// Pre-computing all necessary quantities @@ -2499,12 +2548,12 @@ pair WrightFisher::DrawAncestralProcess( while (!m_found) { if (mup > mdown && mmode - mdown > - threshold) /// Checking if down moves still possible - ensures we do - /// not get m smaller than it should be allowed! + threshold) /// Checking if down moves still possible - ensures we + /// do not get m smaller than it should be allowed! { ++mdown; m = mmode - mdown; - } else /// Up moves can keep happening + } else /// Up moves can keep happening { ++mup; m = mmode + mup; @@ -2518,7 +2567,7 @@ pair WrightFisher::DrawAncestralProcess( while (n < 1 || !coefficients_converging || ((dU[m]) > 1.0 && - dL[m] < 0.0)) /// Checking if upper and lower sums converging + dL[m] < 0.0)) /// Checking if upper and lower sums converging { n += 2; double100 newcoefficientU = @@ -2544,20 +2593,17 @@ pair WrightFisher::DrawAncestralProcess( if (o.debug > 2) { cerr << "\nk "; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << k << " "; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << dL[k] << " "; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << dU[k] << " "; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << dU[k] << " "; cerr << endl; } } if (dL[m] > 1.0 || - dU[m] < 0.0) /// If we fall out of bounds, use Gaussian approximations + dU[m] < 0.0) /// If we fall out of bounds, use Gaussian approximations { cerr << "Numerical error detected: dL[" << m << "] = " << dL[m] << ", dU[" << m << "] = " << dU[m] @@ -2579,7 +2625,8 @@ pair WrightFisher::DrawAncestralProcess( bool decision_on_m_made = (currsumL > u || currsumU < u); - while (!decision_on_m_made) /// We need to refine our upper and lower bounds + while ( + !decision_on_m_made) /// We need to refine our upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -2611,14 +2658,16 @@ pair WrightFisher::DrawAncestralProcess( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " << currsumL + << " = currsumL." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " << currsumU + << " = currsumU." << endl; + // exit(1); } decision_on_m_made = (currsumL > u || currsumU < u); @@ -2634,8 +2683,7 @@ pair WrightFisher::DrawAncestralProcess( if (o.debug > 2) { cerr << "d_m(t): Returned m = " << m << "\n"; cerr << "m =\t\t\t"; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << k << "\t"; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << k << "\t"; cerr << "\nn_used =\t"; for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << n_used[k] << "\t"; @@ -2648,8 +2696,8 @@ pair WrightFisher::DrawAncestralProcess( pair WrightFisher::DrawAncestralProcessConditionalZero( double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of the Ancestral Process when conditioning - /// the diffusion on non-absorption but started from boundary + &gen) /// Draws from the law of the Ancestral Process when conditioning + /// the diffusion on non-absorption but started from boundary { assert(t > 0.0); /// Pre-computing all necessary quantities @@ -2675,12 +2723,12 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( while (!m_found) { if (mup > mdown && mmode - mdown > - threshold) /// Checking whether down moves still allow - makes sure - /// m does not go below allowed values + threshold) /// Checking whether down moves still allow - makes sure + /// m does not go below allowed values { ++mdown; m = mmode - mdown; - } else /// Otherwise move upwards, which is always allowed + } else /// Otherwise move upwards, which is always allowed { ++mup; m = max(mmode + mup, threshold); @@ -2710,7 +2758,7 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( while (n < F || v < F3 || !coefficients_converging || ((dU[m]) > 1.0 && - dL[m] < 0.0)) /// Checking if upper and lower sums converging + dL[m] < 0.0)) /// Checking if upper and lower sums converging { n += 2; n1 += 2; @@ -2727,8 +2775,8 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( if ((thetaP.empty()) && (2 * (n1 + 1) > - q1index)) /// If mutation vector is empty, we need to subtract q_1 - /// from normalising constant (because m can only be >= 2) + q1index)) /// If mutation vector is empty, we need to subtract q_1 + /// from normalising constant (because m can only be >= 2) { double100 newcoefficientUq1 = (((n1 - 1) % 2 != 0) ? -1.0 : 1.0) * @@ -2745,10 +2793,10 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( q1index += 2; } - if ((v + 1) > - eCindex_computed) /// Computing the denominator by using explicit - /// expression for falling factorial moments of - /// ancestral process and subtracting q_1 + if ((v + 1) > eCindex_computed) /// Computing the denominator by using + /// explicit expression for falling + /// factorial moments of ancestral + /// process and subtracting q_1 { eCL += eCnew; eCnew = exp(static_cast(-(v + 1) * (v + theta) * t / 2.0) + @@ -2772,20 +2820,17 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( if (o.debug > 2) { cerr << "\nk "; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << k << " "; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << dL[k] << " "; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = mmode - mdown; k <= mmode + mup; ++k) - cerr << dU[k] << " "; + for (int k = mmode - mdown; k <= mmode + mup; ++k) cerr << dU[k] << " "; cerr << endl; } } if (eAL[m] < 0.0 || - eCL < 0.0) /// If we fall out of bounds, use Gaussian approximations + eCL < 0.0) /// If we fall out of bounds, use Gaussian approximations { cerr << "Numerical error detected: eAL[" << m << "] = " << eAL[m] << ", eAU[" << m << "] = " << eAU[m] << ", eCL = " << eCL @@ -2818,7 +2863,7 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( bool decision_on_m_made = (currsumL > u || currsumU < u); - while (!decision_on_m_made) /// Refine upper and lower bounds + while (!decision_on_m_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -2827,7 +2872,7 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( for (int k = max(mmode, threshold) - mdown; k <= max(mmode, threshold) + mup; ++k) { ++n_used[k]; - ++v_used[k]; /// Adding on more contributions to sharpen bounds + ++v_used[k]; /// Adding on more contributions to sharpen bounds if (thetaP.empty() && ((n_used[k] + 1) > q1index)) { double100 newcoefficientUq1 = @@ -2889,14 +2934,16 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " << currsumL + << " = currsumL." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " << currsumU + << " = currsumU." << endl; + // exit(1); } decision_on_m_made = (currsumL > u || currsumU < u); @@ -2929,8 +2976,8 @@ pair WrightFisher::DrawAncestralProcessConditionalZero( pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( double100 t, double100 x, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of the Ancestral Process when conditioning - /// the diffusion on non-absorption but started from inside (0,1) + &gen) /// Draws from the law of the Ancestral Process when conditioning + /// the diffusion on non-absorption but started from inside (0,1) { assert((x > 0.0) && (x <= 1.0) && (t > 0.0)); /// Pre-computing all necessary quantities @@ -2954,11 +3001,11 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( while (!ml_found) { if (mup > mdown && mmode - mdown > - threshold) /// Checking whether down moves are still possible + threshold) /// Checking whether down moves are still possible { ++mdown; m = mmode - mdown; - } else /// If not, upward moves are always allowed + } else /// If not, upward moves are always allowed { ++mup; m = max(mmode + mup, threshold); @@ -2987,10 +3034,10 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( while (2 * v < F || n < F || !coefficients_converging || ((dU[m]) > 1.0 && - dL[m] < 0.0)) /// Checking if upper and lower sums converging + dL[m] < 0.0)) /// Checking if upper and lower sums converging { n += 2; - v++; /// Adding on new contributions for numerator + v++; /// Adding on new contributions for numerator double100 newcoefficientU = (((n - m) % 2 != 0) ? -1.0 : 1.0) * exp(Getlogakm(n, m) + @@ -3001,7 +3048,7 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( static_cast( -(n + 1) * ((n + 1) + theta - 1) * t / 2.0)); - if (2 * (v + 1) > eCindex_computed) /// Computing denominator + if (2 * (v + 1) > eCindex_computed) /// Computing denominator { assert(2 * v == eCindex_computed); eCL = eCU - Getd2(eCvec, 2 * v + 1, x, t); @@ -3038,7 +3085,7 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( } if (eAL[m] < 0.0 || - eCL < 0.0) /// If we fall out of bounds, use Gaussian approximations + eCL < 0.0) /// If we fall out of bounds, use Gaussian approximations { cerr << "Numerical error detected: eAL[" << m << "] = " << eAL[m] << ", eAU[" << m << "] = " << eAU[m] << ", eCL = " << eCL @@ -3065,11 +3112,11 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( int llimit = (threshold == 2) ? m - 1 : m; boost::math::binomial_distribution BIN(m, x); for (int l = 1; l <= llimit && !ml_found; - ++l) /// Adding on the corresponding binomial terms (minus the edge - /// cases i.e. l=0 and potentially l=m (depending on theta)) + ++l) /// Adding on the corresponding binomial terms (minus the edge + /// cases i.e. l=0 and potentially l=m (depending on theta)) { double100 currsummaddon = - pdf(BIN, l); //( ( !(x < 1.0) || !(x > 0.0) ) ? 1.0 : pdf(BIN,l) ); + pdf(BIN, l); //( ( !(x < 1.0) || !(x > 0.0) ) ? 1.0 : pdf(BIN,l) ); currsumL += currsummaddon * dL[m]; currsumU += currsummaddon * dU[m]; @@ -3082,7 +3129,7 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( exit(1); } - while (!decision_on_ml_made) /// Refine upper and lower bounds + while (!decision_on_ml_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -3092,7 +3139,7 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( for (int k = max(mmode, threshold) - mdown; k <= max(mmode, threshold) + mup; ++k) { ++v_used[k]; - ++n_used[k]; /// Adding on new contributions to sharpen bounds + ++n_used[k]; /// Adding on new contributions to sharpen bounds double100 newcoefficientU = exp(Getlogakm(k + 2 * n_used[k], k) + static_cast( @@ -3135,16 +3182,18 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,l) = (" << n << "," << m << "," << l << ")." - << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,l) = (" << n << "," << m + << "," << l << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,l) = (" << n << "," << m << "," << l << ")." - << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,l) = (" << n << "," << m + << "," << l << ")." << endl; + // exit(1); } decision_on_ml_made = (currsumL > u || currsumU < u); @@ -3177,26 +3226,27 @@ pair, int> WrightFisher::DrawAncestralProcessConditionalInterior( } int WrightFisher::DrawAncestralProcessG1984( - double100 t, - boost::random::mt19937 &gen) /// Draws from the law of the Ancestral Process - /// when time increment falls below threshold + double100 t, boost::random::mt19937 + &gen) /// Draws from the law of the Ancestral Process when + /// time increment falls below threshold { assert(t > 0.0); - int threshold = - (thetaP.empty() ? 2 : (!(thetaP[0] > 0.0) || !(thetaP[1] > 0.0)) ? 1 : 0); + int threshold = (thetaP.empty() ? 2 + : (!(thetaP[0] > 0.0) || !(thetaP[1] > 0.0)) ? 1 + : 0); /// Pre-compute all necessary quantities double mean = GriffithsParas(t).first, v = GriffithsParas(t).second; assert(v > 0.0); boost::random::normal_distribution NORMAL(mean, sqrt(v)); return max(static_cast(round(NORMAL(gen))), - threshold); // Return discretised Gaussian approximation + threshold); // Return discretised Gaussian approximation } int WrightFisher::DrawSizebiasedAncestralProcess( int d, double100 t, boost::random::mt19937 - &gen) /// Draws from the size-biased distribution of the Ancestral - /// process when the time increment falls below threshold + &gen) /// Draws from the size-biased distribution of the Ancestral + /// process when the time increment falls below threshold { assert((d > 0) && (t > 0.0)); /// Pre-compute all necessary quantities @@ -3212,31 +3262,32 @@ int WrightFisher::DrawSizebiasedAncestralProcess( bool decision = false; int flip = 1, mlimit = thetaP.empty() ? 2 : 1, mode = static_cast(round(mean)), m = mode, jp = 0, - jm = 0; /// Starting m from mode to speed up routine + jm = 0; /// Starting m from mode to speed up routine double mlim = static_cast(mlimit) + 0.5, summqm = 0.0; boost::random::uniform_01 U01; double100 u = U01(gen); while (!decision) { - if (m == mlimit) /// Computing correct border (i.e. m = 1 or 2) contribution + if (m == + mlimit) /// Computing correct border (i.e. m = 1 or 2) contribution { summqm += exp(static_cast(d) * log(static_cast(mlim))) * 0.5 * erfc(-(static_cast(mlim) - mean) / (sqrt(2.0 * v))); - } else /// Add on discretised Gaussian contributions + } else /// Add on discretised Gaussian contributions { summqm += exp(static_cast(d) * log(static_cast(m))) * 0.5 * (erfc(-(static_cast(m) + 0.5 - mean) / (sqrt(2.0 * v))) - erfc(-(static_cast(m) - 0.5 - mean) / (sqrt(2.0 * v)))); } - if (summqm / normalisation > u) /// Return last m + if (summqm / normalisation > u) /// Return last m { decision = true; } else { if (flip == -1 && - (mode - jm > 2)) /// Mechanism to explore either side around mode + (mode - jm > 2)) /// Mechanism to explore either side around mode { jm++; m = mode - jm; @@ -3254,26 +3305,28 @@ int WrightFisher::DrawSizebiasedAncestralProcess( pair WrightFisher::DrawEndpoint( double100 x, double100 t1, double100 t2, const Options &o, - boost::random::mt19937 &gen) /// Draws from the law of a Wright-Fisher - /// diffusion conditioned on non-absorption + boost::random::mt19937 &gen) /// Draws from the law of a Wright-Fisher + /// diffusion conditioned on non-absorption { - assert((x >= 0.0) && (x <= 1.0) && (t1 >= 0.0) && (t2 > 0.0) && (t1 < t2)); + // std::cout << "x is " << x << ", t1 is " << t1 << ", t2 is " << t2 + // << std::endl; + assert((x >= 0.0) && (x <= 1.0) && (t1 < t2)); double100 y; int m, coeffcount; pair m_and_coeffcount; - if (thetaP.empty()) /// No mutation - condition on avoiding either boundary + if (thetaP.empty()) /// No mutation - condition on avoiding either boundary { if (!(x > - 0.0)) /// Diffusion conditioned on non-absorption but started from 0 + 0.0)) /// Diffusion conditioned on non-absorption but started from 0 { if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawSizebiasedAncestralProcess(1, t2 - t1, gen); coeffcount = -1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { m_and_coeffcount = DrawAncestralProcessConditionalZero(t2 - t1, o, gen); m = m_and_coeffcount.first; @@ -3284,21 +3337,21 @@ pair WrightFisher::DrawEndpoint( GAMMA2(static_cast(m) - 1.0, 1.0); y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); } - } else if (!(x < 1.0)) /// Diffusion conditioned on non-absorption but - /// started from 1 + } else if (!(x < 1.0)) /// Diffusion conditioned on non-absorption but + /// started from 1 { if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawSizebiasedAncestralProcess(1, t2 - t1, gen); coeffcount = -1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { m_and_coeffcount = DrawAncestralProcessConditionalZero(t2 - t1, o, gen); m = m_and_coeffcount.first; @@ -3310,19 +3363,19 @@ pair WrightFisher::DrawEndpoint( GAMMA2(1.0, 1.0); y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); } - } else /// Diffusion conditioned on non-absorption but started from the - /// interior (0,1) + } else /// Diffusion conditioned on non-absorption but started from the + /// interior (0,1) { int l; if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawAncestralProcessG1984(t2 - t1, gen); coeffcount = -1; @@ -3335,7 +3388,7 @@ pair WrightFisher::DrawEndpoint( boost::random::discrete_distribution<> CATEGORICAL(binomialBins.begin(), binomialBins.end()); l = CATEGORICAL(gen) + 1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { pair, int> storer = DrawAncestralProcessConditionalInterior(t2 - t1, x, o, gen); @@ -3348,26 +3401,27 @@ pair WrightFisher::DrawEndpoint( GAMMA2(static_cast(m - l), 1.0); y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); } } } else if ((!(thetaP[0] > 0.0)) || - (!(thetaP[1] > 0.0))) /// One sided mutation - condition on - /// avoiding one boundary only + (!(thetaP[1] > 0.0))) /// One sided mutation - condition on + /// avoiding one boundary only { if ((!(thetaP[0] > 0.0)) && - (!(x > 0.0))) /// Diffusion conditioned on avoiding 0 but started from 0 + (!(x > + 0.0))) /// Diffusion conditioned on avoiding 0 but started from 0 { if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawSizebiasedAncestralProcess(1, t2 - t1, gen); coeffcount = -1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { m_and_coeffcount = DrawAncestralProcessConditionalZero(t2 - t1, o, gen); m = m_and_coeffcount.first; @@ -3378,26 +3432,26 @@ pair WrightFisher::DrawEndpoint( GAMMA2(thetaP[1] + static_cast(m) - 1.0, 1.0); y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); } } else if ((!(thetaP[1] > 0.0)) && - (!(x < 1.0))) /// Diffusion conditioned on avoiding 1 but started - /// from 1 - can translate to diffusion with - /// mutation entries swapped avoiding 0 started - /// from 0 by symmetry + (!(x < 1.0))) /// Diffusion conditioned on avoiding 1 but + /// started from 1 - can translate to diffusion + /// with mutation entries swapped avoiding 0 + /// started from 0 by symmetry { - iter_swap(thetaP.begin(), thetaP.begin() + 1); /// Swap mutation entries + iter_swap(thetaP.begin(), thetaP.begin() + 1); /// Swap mutation entries if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawSizebiasedAncestralProcess(1, t2 - t1, gen); coeffcount = -1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { m_and_coeffcount = DrawAncestralProcessConditionalZero(t2 - t1, o, gen); m = m_and_coeffcount.first; @@ -3408,7 +3462,7 @@ pair WrightFisher::DrawEndpoint( GAMMA2(thetaP[1] + static_cast(m) - 1.0, 1.0); double100 y1 = -1.0; - while (!(0.0 < y1 && y1 < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y1 && y1 < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y1 = G1 / (G1 + G2); @@ -3417,20 +3471,20 @@ pair WrightFisher::DrawEndpoint( y = 1.0 - y1; iter_swap(thetaP.begin(), - thetaP.begin() + 1); /// Swap back mutation entries + thetaP.begin() + 1); /// Swap back mutation entries } else if (!(thetaP[1] > - 0.0)) /// Diffusion conditioned on avoiding 1 but started from - /// x in [0,1) - can translate to diffusion with mutation - /// entries swapped avoiding 0 started from 1-x in - /// interior (0,1] by symmetry + 0.0)) /// Diffusion conditioned on avoiding 1 but started from + /// x in [0,1) - can translate to diffusion with + /// mutation entries swapped avoiding 0 started from 1-x + /// in interior (0,1] by symmetry { - iter_swap(thetaP.begin(), thetaP.begin() + 1); /// Swap mutation entries + iter_swap(thetaP.begin(), thetaP.begin() + 1); /// Swap mutation entries int l; if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawAncestralProcessG1984(t2 - t1, gen); coeffcount = -1; @@ -3442,7 +3496,7 @@ pair WrightFisher::DrawEndpoint( boost::random::discrete_distribution<> CATEGORICAL(binomialBins.begin(), binomialBins.end()); l = CATEGORICAL(gen) + 1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { pair, int> storer = DrawAncestralProcessConditionalInterior(t2 - t1, 1.0 - x, o, gen); @@ -3456,7 +3510,7 @@ pair WrightFisher::DrawEndpoint( GAMMA2(thetaP[1] + static_cast(m - l), 1.0); double100 y1 = -1.0; - while (!(0.0 < y1 && y1 < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y1 && y1 < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y1 = G1 / (G1 + G2); @@ -3464,14 +3518,14 @@ pair WrightFisher::DrawEndpoint( y = 1.0 - y1; iter_swap(thetaP.begin(), - thetaP.begin() + 1); /// Swap mutation entries back - } else /// Diffusion conditioned on avoiding 0 but started from x in (0,1] + thetaP.begin() + 1); /// Swap mutation entries back + } else /// Diffusion conditioned on avoiding 0 but started from x in (0,1] { int l; if (t2 - t1 <= - o.g1984threshold) /// Time increment smaller than threshold, use - /// Gaussian approximations + o.g1984threshold) /// Time increment smaller than threshold, use + /// Gaussian approximations { m = DrawAncestralProcessG1984(t2 - t1, gen); coeffcount = -1; @@ -3483,7 +3537,7 @@ pair WrightFisher::DrawEndpoint( boost::random::discrete_distribution<> CAT(binomialBins.begin(), binomialBins.end()); l = CAT(gen) + 1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { pair, int> storer = DrawAncestralProcessConditionalInterior(t2 - t1, x, o, gen); @@ -3497,22 +3551,21 @@ pair WrightFisher::DrawEndpoint( GAMMA2(thetaP[1] + static_cast(m - l), 1.0); y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); } } - } else /// Strictly positive entries in mutation vector, so unconditioned - /// diffusion + } else /// Strictly positive entries in mutation vector, so unconditioned + /// diffusion { - - if (t2 - t1 <= o.g1984threshold) /// Time increment smaller than threshold, - /// use Gaussian approximations + if (t2 - t1 <= o.g1984threshold) /// Time increment smaller than threshold, + /// use Gaussian approximations { m = DrawAncestralProcessG1984(t2 - t1, gen); coeffcount = -1; - } else /// Otherwise use alternating series technique + } else /// Otherwise use alternating series technique { m_and_coeffcount = DrawAncestralProcess(t2 - t1, o, gen); m = m_and_coeffcount.first; @@ -3528,7 +3581,7 @@ pair WrightFisher::DrawEndpoint( GAMMA2(thetaP[1] + static_cast(m - l), 1.0); y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); @@ -3540,23 +3593,24 @@ pair WrightFisher::DrawEndpoint( pair WrightFisher::DrawUnconditionedDiffusion( double100 x, double100 t, const Options &o, - boost::random::mt19937 - &gen) /// Draws from the law of an unconditioned Wright-Fisher diffusion + boost::random::mt19937 & + gen) /// Draws from the law of an unconditioned Wright-Fisher diffusion { assert((x >= 0.0) && (x <= 1.0) && (t > 0.0)); - if (!(x > 0.0) && (thetaP.empty() || - (!(thetaP[0] > 0.0)))) /// If we start at 0 and there is no - /// mutation, diffusion stays there + if (!(x > 0.0) && + (thetaP.empty() || + (!(thetaP[0] > 0.0)))) /// If we start at 0 and there is no + /// mutation, diffusion stays there { return make_pair(0.0, -1); } else if (!(x < 1.0) && (thetaP.empty() || (!(thetaP[1] > - 0.0)))) /// Similarly if started from 1 with no mutation + 0.0)))) /// Similarly if started from 1 with no mutation { return make_pair(1.0, -1); - } else /// Otherwise we first draw M ~ {q_m} + } else /// Otherwise we first draw M ~ {q_m} { int m, coefcount; if (t <= o.g1984threshold) { @@ -3569,10 +3623,10 @@ pair WrightFisher::DrawUnconditionedDiffusion( } double100 para1, para2; - boost::random::binomial_distribution<> BIN(m, x); /// Draw L ~ Bin(m,x) + boost::random::binomial_distribution<> BIN(m, x); /// Draw L ~ Bin(m,x) int l = BIN(gen); - if (thetaP.empty()) /// Sort out cases based on what mutation parameters is + if (thetaP.empty()) /// Sort out cases based on what mutation parameters is { if (l == 0) { return make_pair(0.0, coefcount); @@ -3604,7 +3658,7 @@ pair WrightFisher::DrawUnconditionedDiffusion( boost::random::gamma_distribution GAMMA1(para1, 1.0), GAMMA2(para2, 1.0); double100 y = -1.0; - while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 + while (!(0.0 < y && y < 1.0)) /// Occasionally get y == 0.0 or y == 1.0 { double100 G1 = GAMMA1(gen), G2 = GAMMA2(gen); y = G1 / (G1 + G2); @@ -3618,55 +3672,57 @@ pair WrightFisher::DrawUnconditionedDiffusion( vector> WrightFisher::NonNeutralDraw( double100 x, double100 t1, double100 t2, bool Absorption, const Options &o, - boost::random::mt19937 &gen) /// Draws of paths from non-neutral WF - /// diffusion started from x at time t1 + boost::random::mt19937 &gen) /// Draws of paths from non-neutral WF + /// diffusion started from x at time t1 { - assert((x >= 0.0) && (x <= 1.0) && (t1 >= 0.0) && (t2 > 0.0) && (t1 < t2)); + assert((x >= 0.0) && (x <= 1.0) && (t1 < t2)); bool accept = false; vector paras{phiMin, phiMax, phiMax - phiMin}; vector> ptr; - double100 kapmean = paras[2] * (t2 - t1); /// Rate of Poisson point process + double100 kapmean = paras[2] * (t2 - t1); /// Rate of Poisson point process boost::random::poisson_distribution kap(static_cast(kapmean)); boost::random::uniform_01 unift, unifm, - unifU; /// Set up uniform generators for points over [t1,t2] * - /// [0,phiMax-phiMin] * [0,1] + unifU; /// Set up uniform generators for points over [t1,t2] * + /// [0,phiMax-phiMin] * [0,1] int rcount = 0; - while (!accept) /// Until all skeleton points get accepted, keep going + while (!accept) /// Until all skeleton points get accepted, keep going { - int kappa = kap(gen); /// Generate kappa ~ Pois + int kappa = kap(gen); /// Generate kappa ~ Pois double100 u = unifU(gen); + double100 small_offset = 1.0e-14; vector path, times(kappa), marks(kappa), rejcount; - auto gent = [&t1, &t2, &unift, &gen]() /// time stamps ~ Unif [t1,t2] - { return (t1 + ((t2 - t1) * unift(gen))); }; - auto genm = [¶s, &unifm, &gen]() /// marks ~ Unif [0,phiMax-phiMin] + auto gent = [&t1, &t2, &unift, &small_offset, + &gen]() /// time stamps ~ Unif [t1,t2] + { return (t1 + small_offset + ((t2 - t1) * unift(gen))); }; + auto genm = [¶s, &unifm, &gen]() /// marks ~ Unif [0,phiMax-phiMin] { return (paras[2] * unifm(gen)); }; - generate(begin(times), end(times), gent); - generate(begin(marks), end(marks), genm); + std::generate(begin(times), end(times), gent); + std::generate(begin(marks), end(marks), genm); sortVectorsAscending(times, times, - marks); /// Sort vectors according to timestamps + marks); /// Sort vectors according to timestamps times.push_back(t2); marks.push_back( - u); /// Add on end point - to be checked differently to skeleton points + u); /// Add on end point - to be checked differently to skeleton points for (vector::iterator itt = times.begin(), itm = marks.begin(); itt != times.end(); itt++, itm++) { - if (kappa == 0) /// No skeleton points -> check end point directly + if (kappa == 0) /// No skeleton points -> check end point directly { if (Absorption) { path.push_back(DrawUnconditionedDiffusion(x, t2 - t1, o, gen) - .first); /// Generate endpoint + .first); /// Generate endpoint } else { path.push_back( - DrawEndpoint(x, t1, t2, o, gen).first); /// Generate endpoint + DrawEndpoint(x, t1, t2, o, gen).first); /// Generate endpoint } if (exp(Atilde(path.back()) - Atildeplus()) < - *itm) /// Test if generated point is good; if not generate new - /// Poisson point process + *itm) /// Test if generated point is good; if not generate new + /// Poisson point process { rcount++; break; @@ -3677,29 +3733,29 @@ vector> WrightFisher::NonNeutralDraw( ptr.push_back(times); ptr.push_back(rejcount); accept = true; - } else /// kappa > 0 - generate skeleton points and endpoint + } else /// kappa > 0 - generate skeleton points and endpoint { if (itt == times.begin()) { if (Absorption) { path.push_back( DrawUnconditionedDiffusion(x, (*itt) - t1, o, gen) - .first); /// Generate skeleton points sequentially + .first); /// Generate skeleton points sequentially } else { path.push_back( DrawEndpoint(x, t1, *itt, o, gen) - .first); /// Generate skeleton points sequentially + .first); /// Generate skeleton points sequentially } if (Phitilde(path.back()) - paras[0] > - *itm) /// Test generated point is OK, otherwise can stop and - /// generate a new Poisson point process + *itm) /// Test generated point is OK, otherwise can stop and + /// generate a new Poisson point process { rcount++; break; } - } else if (*itt != t2) /// Separate first time stamp and rest to ensure - /// correct sequential sampling + } else if (*itt != t2) /// Separate first time stamp and rest to ensure + /// correct sequential sampling { if (Absorption) { path.push_back(DrawUnconditionedDiffusion( @@ -3715,7 +3771,7 @@ vector> WrightFisher::NonNeutralDraw( break; } - } else /// Endpoint draw + } else /// Endpoint draw { if (Absorption) { path.push_back(DrawUnconditionedDiffusion( @@ -3727,7 +3783,7 @@ vector> WrightFisher::NonNeutralDraw( } if (exp(Atilde(path.back()) - Atildeplus()) < - *itm) /// Check corresponding endpoint condition + *itm) /// Check corresponding endpoint condition { rcount++; break; @@ -3749,8 +3805,8 @@ vector> WrightFisher::NonNeutralDraw( pair WrightFisher::NonNeutralDrawEndpoint( double100 x, double100 t1, double100 t2, bool Absorption, const Options &o, boost::random::mt19937 - &gen) /// Invoke NonNeutralDraw to generate a whole path, but retains - /// only the endpoint at time t2 + &gen) /// Invoke NonNeutralDraw to generate a whole path, but retains + /// only the endpoint at time t2 { vector> ptr = NonNeutralDraw(x, t1, t2, Absorption, o, gen); return make_pair(ptr[0].back(), -1); @@ -3761,9 +3817,9 @@ pair WrightFisher::NonNeutralDrawEndpoint( vector WrightFisher::DrawBridgePMFUnconditional( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting within (0,1), ending - /// at some boundary point (absorption can happen at any time) - /// with time increments being large enough + &gen) /// Draws from the law of a bridge starting within (0,1), ending + /// at some boundary point (absorption can happen at any time) + /// with time increments being large enough { assert((x > 0.0) && (x < 1.0) && (!(z > 0.0) || !(z < 1.0)) && (s > 0.0) && (t > 0.0)); @@ -3799,8 +3855,7 @@ vector WrightFisher::DrawBridgePMFUnconditional( while (!mkl_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; @@ -3860,7 +3915,7 @@ vector WrightFisher::DrawBridgePMFUnconditional( } if (eAU[n] == eAL[n] && eBU[n] == eBL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmkj. + eCL == eCU) /// ...then we have lost precision before reaching Fmkj. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmkj = " << Fmkl @@ -3892,14 +3947,11 @@ vector WrightFisher::DrawBridgePMFUnconditional( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -3939,7 +3991,7 @@ vector WrightFisher::DrawBridgePMFUnconditional( exit(1); } - while (!decision_on_mkl_made) /// Refine upper and lower bounds + while (!decision_on_mkl_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -4040,16 +4092,18 @@ vector WrightFisher::DrawBridgePMFUnconditional( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k,l) = (" << n << "," << m << "," << k - << "," << l << ")." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,k,l) = (" << n << "," << m + << "," << k << "," << l << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k,l) = (" << n << "," << m << "," << k - << "," << l << ")." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,k,l) = (" << n << "," << m + << "," << k << "," << l << ")." << endl; + // exit(1); } decision_on_mkl_made = (currsumL > u || currsumU < u); @@ -4059,10 +4113,10 @@ vector WrightFisher::DrawBridgePMFUnconditional( if (mkl_found) { if (!(z > 0.0)) { - curr_mk[n][2] = l; /// Sets j = 0 + curr_mk[n][2] = l; /// Sets j = 0 curr_mk[n][3] = 0; } else { - curr_mk[n][2] = l; /// Sets j = k + curr_mk[n][2] = l; /// Sets j = k curr_mk[n][3] = k; } } @@ -4070,8 +4124,7 @@ vector WrightFisher::DrawBridgePMFUnconditional( } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -4079,11 +4132,9 @@ vector WrightFisher::DrawBridgePMFUnconditional( cerr << "p_m,k,j: Returned (m,k,j) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << "," << curr_mk[n][3] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -4093,14 +4144,14 @@ vector WrightFisher::DrawBridgePMFUnconditional( vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting within (0,1), ending - /// at some boundary point (absorption can happen at any time) - /// with one time increment falling below the threshold + &gen) /// Draws from the law of a bridge starting within (0,1), ending + /// at some boundary point (absorption can happen at any time) + /// with one time increment falling below the threshold { assert((x > 0.0) && (x < 1.0) && (!(z > 0.0) || !(z < 1.0)) && (t > s) && (s > 0.0)); bool ind1 = - (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k + (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k double100 sorts = (ind1 ? s : t - s), sortsapprox = (sorts == s ? t - s : s); vector> curr_mk; @@ -4145,14 +4196,12 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( while (!mkl_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; int mork = (ind1 ? m : k), morkapprox = (mork == m ? k : m); - if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) - counter++; + if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) counter++; if (o.debug > 2) cerr << "New n = " << n << ", (m,k) = (" << m << ", " << k << ")" << endl; @@ -4197,7 +4246,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( } if (eAU[n] == eAL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmkj. + eCL == eCU) /// ...then we have lost precision before reaching Fmkj. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmkj = " << Fmkl @@ -4228,14 +4277,11 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -4283,7 +4329,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( exit(1); } - while (!decision_on_mkl_made) /// Refine upper and lower bounds + while (!decision_on_mkl_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -4373,16 +4419,18 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k,l) = (" << n << "," << m << "," << k - << "," << l << ")." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,k,l) = (" << n << "," << m + << "," << k << "," << l << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k,l) = (" << n << "," << m << "," << k - << "," << l << ")." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,k,l) = (" << n << "," << m + << "," << k << "," << l << ")." << endl; + // exit(1); } decision_on_mkl_made = (currsumL > u || currsumU < u); @@ -4392,18 +4440,18 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( if (mkl_found) { if (!(z > 0.0)) { - curr_mk[n][2] = l; /// Sets j = 0 + curr_mk[n][2] = l; /// Sets j = 0 curr_mk[n][3] = 0; } else { - curr_mk[n][2] = l; /// Sets j = k + curr_mk[n][2] = l; /// Sets j = k curr_mk[n][3] = k; } } } if (counter == - totalpts) /// Gaussian approximation leads to currsum summing to < 1.0, - /// so we renormalise and sample from the computed quantities + totalpts) /// Gaussian approximation leads to currsum summing to < 1.0, + /// so we renormalise and sample from the computed quantities { LogSumExp(currsumStore, runningMax); double100 sum = 0.0; @@ -4434,19 +4482,16 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); if (o.debug > 2) { cerr << "p_m,k,j: Returned (m,k,j) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << "," << curr_mk[n][3] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -4456,9 +4501,9 @@ vector WrightFisher::DrawBridgePMFUnconditionalOneQApprox( vector WrightFisher::DrawBridgePMFUnconditionalApprox( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting within (0,1), ending - /// at some boundary point (absorption can happen at any time) - /// with both time increments falling below the threshold + &gen) /// Draws from the law of a bridge starting within (0,1), ending + /// at some boundary point (absorption can happen at any time) + /// with both time increments falling below the threshold { assert((x > 0.0) && (x < 1.0) && (!(z > 0.0) || !(z < 1.0)) && (t > s) && (s > 0.0)); @@ -4471,7 +4516,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( int Dflip = 1, Djm = 0, Djp = 0, mkLower = (thetaP.empty() ? 1 : 0); int dmode = static_cast(ceil(GriffithsParas(t).first)), d = dmode; - while (max(eCOldInc, eCInc) > 0.0) { + while (max(eCOldInc, eCInc) > 0.0 || (!(eC > 0.0))) { eCOldInc = eCInc; double100 xcont = (!(z > 0.0) ? static_cast(d) * log(1.0 - x) : static_cast(d) * log(x)); @@ -4480,7 +4525,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( eC += eCInc; if (Dflip == -1 && - (dmode - Djm - 1 > 0)) /// Mechanism to explore either side around mode + (dmode - Djm - 1 > 0)) /// Mechanism to explore either side around mode { Djm++; d = dmode - Djm; @@ -4492,12 +4537,12 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( } vector modeGuess = mklModeFinder( - x, z, s, t, o); /// Get a guess to location of mode over (m,k,l) + x, z, s, t, o); /// Get a guess to location of mode over (m,k,l) int mMode = modeGuess[0], kMode = modeGuess[1], lMode = modeGuess[2]; boost::random::uniform_01 - U01; /// Use these guesses & eC to set a suitable threshold for subsequent - /// computations + U01; /// Use these guesses & eC to set a suitable threshold for + /// subsequent computations double100 currsum = 0.0, u = U01(gen), threshold = exp(mklModeFinder_Evaluator(mMode, kMode, lMode, x, z, s, t, o) - @@ -4508,12 +4553,12 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( bool mSwitch = false, mDownSwitch = false, mUpSwitch = false; double100 mContr_D = boost::math::lgamma(static_cast(theta + m)); double100 mContr_U = mContr_D, mContr, - runningMax = -1.0e100; /// Computing m contributions + runningMax = -1.0e100; /// Computing m contributions while (!mSwitch) { double100 qm = QmApprox(m, s, o); - if (!(qm > 0.0)) /// This should not trigger, but if it does, sets to very - /// small value (taking logs later so cannot be 0!) + if (!(qm > 0.0)) /// This should not trigger, but if it does, sets to very + /// small value (taking logs later so cannot be 0!) { qm = 1.0e-300; } @@ -4532,15 +4577,15 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( int k = kMode, j = (!(z > 0.0) ? 0 : k); kFlip = 1, kD = 0, kU = 0; bool kSwitch = false, kDownSwitch = false, - kUpSwitch = false; /// Computing k contributions + kUpSwitch = false; /// Computing k contributions double100 kContr_D = -boost::math::lgamma(static_cast(theta + m + k)), kContr_U = kContr_D, kContr; while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); - if (!(qk > 0.0)) /// This should not trigger, but if it does, sets to very - /// small value (taking logs later so cannot be 0!) + if (!(qk > 0.0)) /// This should not trigger, but if it does, sets to + /// very small value (taking logs later so cannot be 0!) { qk = 1.0e-300; } @@ -4557,7 +4602,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( } int lFlip = 1, newlMode = min(m, lMode), l = newlMode, lU = 0, - lD = 0; /// Need to redefine lMode as m might be too small! + lD = 0; /// Need to redefine lMode as m might be too small! int lLower = ((thetaP.empty() && !(z < 1.0)) ? 1 : 0), lUpper = ((thetaP.empty() && !(z > 0.0)) ? m : m - 1); bool lSwitch = false, lDownSwitch = false, lUpSwitch = false; @@ -4605,8 +4650,8 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( } double100 currsum_inc = mContr + kContr + lContr - log(eC); runningMax = - max(currsum_inc, runningMax); /// Running max of log probabilities - /// for use in log-sum-exp trick + max(currsum_inc, runningMax); /// Running max of log probabilities + /// for use in log-sum-exp trick currsum += exp(currsum_inc); currsumStore.push_back(currsum_inc); @@ -4616,7 +4661,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( mkljStore[2 + (4 * (currsumStore.size() - 1))] = l; mkljStore[3 + (4 * (currsumStore.size() - 1))] = j; - if (!(lDownSwitch)) /// Switching mechanism for l + if (!(lDownSwitch)) /// Switching mechanism for l { if (sgn(l - newlMode) <= 0) { lDownSwitch = ((exp(currsum_inc) < threshold) || @@ -4648,7 +4693,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( } } - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = @@ -4677,7 +4722,7 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < mkLower)); @@ -4743,8 +4788,8 @@ vector WrightFisher::DrawBridgePMFUnconditionalApprox( vector WrightFisher::DrawBridgePMFSameMutation( double100 x, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting and ending at the same - /// boundary point and time increments are large enough + &gen) /// Draws from the law of a bridge starting and ending at the + /// same boundary point and time increments are large enough { assert((!(x > 0.0) || !(x < 1.0)) && (t > s) && (s > 0.0)); vector> curr_mk; @@ -4779,8 +4824,7 @@ vector WrightFisher::DrawBridgePMFSameMutation( while (!mk_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; @@ -4840,7 +4884,7 @@ vector WrightFisher::DrawBridgePMFSameMutation( } if (eAU[n] == eAL[n] && eBU[n] == eBL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmkj. + eCL == eCU) /// ...then we have lost precision before reaching Fmkj. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmkj = " << Fmkj @@ -4863,7 +4907,7 @@ vector WrightFisher::DrawBridgePMFSameMutation( } } - double100 addon; /// Compute the appropriate additional terms + double100 addon; /// Compute the appropriate additional terms if ((thetaP[0] > 0.0 && thetaP[1] > 0.0) && !(x > 0.0)) { addon = log(boost::math::beta(thetaP[0], thetaP[1] + m + k)) - @@ -4888,14 +4932,11 @@ vector WrightFisher::DrawBridgePMFSameMutation( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -4911,7 +4952,7 @@ vector WrightFisher::DrawBridgePMFSameMutation( exit(1); } - while (!decision_on_mk_made) /// Need to refine upper and lower bounds + while (!decision_on_mk_made) /// Need to refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -5014,16 +5055,18 @@ vector WrightFisher::DrawBridgePMFSameMutation( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " << currsumL + << " = currsumL (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " << currsumU + << " = currsumU (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } decision_on_mk_made = (currsumL > u || currsumU < u); @@ -5033,17 +5076,16 @@ vector WrightFisher::DrawBridgePMFSameMutation( } if (!(x > 0.0)) { - curr_mk[n][2] = 0; /// Setting l & j to be 0 + curr_mk[n][2] = 0; /// Setting l & j to be 0 curr_mk[n][3] = 0; } else { - curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & k respectively + curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & k respectively curr_mk[n][3] = curr_mk[n][1]; } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -5051,11 +5093,9 @@ vector WrightFisher::DrawBridgePMFSameMutation( cerr << "p_m,k,l,j: Returned (m,k) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -5065,13 +5105,13 @@ vector WrightFisher::DrawBridgePMFSameMutation( vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( double100 x, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting and ending at the same - /// boundary point, but one of the time increments falls below - /// threshold + &gen) /// Draws from the law of a bridge starting and ending at the + /// same boundary point, but one of the time increments falls + /// below threshold { assert((!(x > 0.0) || !(x < 1.0)) && (t > s) && (s > 0.0)); bool ind1 = - (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k + (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k double100 sorts = (ind1 ? s : t - s), sortsapprox = (sorts == s ? t - s : s); vector> curr_mk; @@ -5120,15 +5160,14 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( while (!mk_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; int mork = (ind1 ? m : k), morkapprox = (mork == m ? k : m); if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) - counter++; /// Keep track of the points we have visited inside the - /// specified (m,k)-square + counter++; /// Keep track of the points we have visited inside the + /// specified (m,k)-square if (o.debug > 2) cerr << "New n = " << n << ", (m,k) = (" << m << ", " << k << ")" << endl; @@ -5173,7 +5212,7 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( } if (eAU[n] == eAL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmkj. + eCL == eCU) /// ...then we have lost precision before reaching Fmkj. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmkj = " << Fmkj @@ -5196,7 +5235,7 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( } } - double100 addon; /// Computing the appropriate additional contributions + double100 addon; /// Computing the appropriate additional contributions if ((thetaP[0] > 0.0 && thetaP[1] > 0.0) && !(x > 0.0)) { addon = log(boost::math::beta(thetaP[0], thetaP[1] + m + k)) - @@ -5220,14 +5259,11 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -5242,8 +5278,8 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( mkljStore[2 + (4 * (currsumStore.size() - 1))] = (!(x > 0.0) ? 0 : m); mkljStore[3 + (4 * (currsumStore.size() - 1))] = (!(x > 0.0) ? 0 : k); - if (counter == totalpts) /// Gaussian approximation leads to currsum summing - /// to < 1.0, so we renormalise and sample + if (counter == totalpts) /// Gaussian approximation leads to currsum + /// summing to < 1.0, so we renormalise and sample { LogSumExp(currsumStore, runningMax); double100 sum = 0.0; @@ -5281,7 +5317,7 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( exit(1); } - while (!decision_on_mk_made) /// Need to refine the upper and lower bounds + while (!decision_on_mk_made) /// Need to refine the upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -5374,16 +5410,18 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " << currsumL + << " = currsumL (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " << currsumU + << " = currsumU (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } decision_on_mk_made = (currsumL > u || currsumU < u); @@ -5393,17 +5431,16 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( } if (!(x > 0.0)) { - curr_mk[n][2] = 0; /// Setting l & j to be 0 + curr_mk[n][2] = 0; /// Setting l & j to be 0 curr_mk[n][3] = 0; } else { - curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & k respectively + curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & k respectively curr_mk[n][3] = curr_mk[n][1]; } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -5411,11 +5448,9 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( cerr << "p_m,k,l,j: Returned (m,k) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -5424,8 +5459,8 @@ vector WrightFisher::DrawBridgePMFSameMutationOneQApprox( vector WrightFisher::DrawBridgePMFSameMutationApprox( double100 x, double100 s, double100 t, - boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting and ending at the same + boost::random::mt19937 & + gen) /// Draws from the law of a bridge starting and ending at the same /// boundary point, but both time increments fall below threshold { assert((!(x > 0.0) || !(x < 1.0)) && (t > s) && (s > 0.0)); @@ -5449,9 +5484,9 @@ vector WrightFisher::DrawBridgePMFSameMutationApprox( while (!accept) { m = DrawSizebiasedAncestralProcess(2, s, gen), k = DrawSizebiasedAncestralProcess( - 2, t - s, gen); /// Draw (m,k) from a size-biased Ancestral Process + 2, t - s, gen); /// Draw (m,k) from a size-biased Ancestral Process boost::random::uniform_01<> - U01; /// Compute alpha and run an accept/reject step + U01; /// Compute alpha and run an accept/reject step double u = U01(gen), alpha = boost::math::lgamma(static_cast(thetaP[1] + m + k)) + @@ -5473,10 +5508,10 @@ vector WrightFisher::DrawBridgePMFSameMutationApprox( returnvec.push_back(k); if (!(x > 0.0)) { - returnvec.push_back(0); /// Setting l & j to be m & k respectively + returnvec.push_back(0); /// Setting l & j to be m & k respectively returnvec.push_back(0); } else { - returnvec.push_back(m); /// Setting l & j to be m & k respectively + returnvec.push_back(m); /// Setting l & j to be m & k respectively returnvec.push_back(k); } @@ -5485,8 +5520,8 @@ vector WrightFisher::DrawBridgePMFSameMutationApprox( vector WrightFisher::DrawBridgePMFDifferentMutation( double100 s, double100 t, double100 x, const Options &o, - boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting and ending at + boost::random::mt19937 & + gen) /// Draws from the law of a bridge starting and ending at /// different boundary points and time increments are large enough { assert((!(x > 0.0) || !(x < 1.0)) && (t > s) && (s > 0.0)); @@ -5518,8 +5553,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( while (!mk_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; @@ -5578,7 +5612,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( exp(Getlogakm(denomqindex + 2 * v, denomqindex) + static_cast(-(denomqindex + 2 * v) * (denomqindex + 2 * v + theta - 1) * (t) / - 2.0)); // Computing q_2 + 2.0)); // Computing q_2 newcoefficientL = exp(Getlogakm(denomqindex + 2 * v + 1, denomqindex) + static_cast(-(denomqindex + 2 * v + 1) * @@ -5590,7 +5624,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( if (eAU[n] == eAL[n] && eBU[n] == eBL[n] && eCL[n] == - eCU[n]) /// ...then we have lost precision before reaching Fmk. + eCU[n]) /// ...then we have lost precision before reaching Fmk. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmk = " << Fmk @@ -5637,14 +5671,11 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -5660,7 +5691,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( exit(1); } - while (!decision_on_mk_made) /// Refine upper and lower bounds + while (!decision_on_mk_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -5769,16 +5800,18 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " << currsumL + << " = currsumL (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " << currsumU + << " = currsumU (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } decision_on_mk_made = (currsumL > u || currsumU < u); @@ -5788,17 +5821,16 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( } if (!(x > 0.0)) { - curr_mk[n][2] = 0; /// Setting l & j to be 0 & k respectively + curr_mk[n][2] = 0; /// Setting l & j to be 0 & k respectively curr_mk[n][3] = curr_mk[n][1]; } else { - curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & 0 respectively + curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & 0 respectively curr_mk[n][3] = 0; } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -5806,11 +5838,9 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( cerr << "p_m,k,l,j: Returned (m,k) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -5820,13 +5850,13 @@ vector WrightFisher::DrawBridgePMFDifferentMutation( vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( double100 s, double100 t, double100 x, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting and ending at - /// different boundary points, but one of the time increments - /// falls below threshold + &gen) /// Draws from the law of a bridge starting and ending at + /// different boundary points, but one of the time increments + /// falls below threshold { assert((!(x > 0.0) || !(x < 1.0)) && (t > s) && (s > 0.0)); bool ind1 = - (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k + (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k double100 sorts = (ind1 ? s : t - s), sortsapprox = (sorts == s ? t - s : s); vector> curr_mk; @@ -5867,14 +5897,12 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( while (!mk_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; int mork = (ind1 ? m : k), morkapprox = (mork == m ? k : m); - if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) - counter++; + if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) counter++; if (o.debug > 2) cerr << "New n = " << n << ", (m,k) = (" << m << ", " << k << ")" << endl; @@ -5886,8 +5914,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( dL.push_back(0.0); dU.push_back(0.0); int F1 = computeC(mork, Csorts), F3 = computeC(denomqindex, Ct); - if (o.debug > 2) - cerr << "(F1,F3) = (" << F1 << "," << F3 << ")" << endl; + if (o.debug > 2) cerr << "(F1,F3) = (" << F1 << "," << F3 << ")" << endl; Fmk = max(max(F1, F3), F4); int v = -1; @@ -5916,7 +5943,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( exp(Getlogakm(denomqindex + 2 * v, denomqindex) + static_cast(-(denomqindex + 2 * v) * (denomqindex + 2 * v + theta - 1) * (t) / - 2.0)); // Computing q_2 + 2.0)); // Computing q_2 newcoefficientL = exp(Getlogakm(denomqindex + 2 * v + 1, denomqindex) + static_cast(-(denomqindex + 2 * v + 1) * @@ -5928,7 +5955,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( if (eAU[n] == eAL[n] && eCL[n] == - eCU[n]) /// ...then we have lost precision before reaching Fmk. + eCU[n]) /// ...then we have lost precision before reaching Fmk. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmk = " << Fmk @@ -5975,14 +6002,11 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -5997,8 +6021,8 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( mkljStore[2 + (4 * (currsumStore.size() - 1))] = (!(x > 0.0) ? 0 : m); mkljStore[3 + (4 * (currsumStore.size() - 1))] = (!(x > 0.0) ? k : 0); - if (counter == totalpts) /// Gaussian approximation leads to currsum summing - /// to < 1.0, so we renormalise and sample + if (counter == totalpts) /// Gaussian approximation leads to currsum + /// summing to < 1.0, so we renormalise and sample { LogSumExp(currsumStore, runningMax); double100 sum = 0.0; @@ -6036,7 +6060,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( exit(1); } - while (!decision_on_mk_made) /// Refine upper and lower bounds + while (!decision_on_mk_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -6135,16 +6159,18 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " << currsumL + << " = currsumL (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k) = (" << n << "," << m << "," << k << ")." - << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " << currsumU + << " = currsumU (n,m,k) = (" << n << "," << m << "," << k + << ")." << endl; + // exit(1); } decision_on_mk_made = (currsumL > u || currsumU < u); @@ -6154,17 +6180,16 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( } if (!(x > 0.0)) { - curr_mk[n][2] = 0; /// Setting l & j to be 0 & k respectively + curr_mk[n][2] = 0; /// Setting l & j to be 0 & k respectively curr_mk[n][3] = curr_mk[n][1]; } else { - curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & 0 respectively + curr_mk[n][2] = curr_mk[n][0]; /// Setting l & j to be m & 0 respectively curr_mk[n][3] = 0; } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -6172,11 +6197,9 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( cerr << "p_m,k,l,j: Returned (m,k) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -6185,9 +6208,10 @@ vector WrightFisher::DrawBridgePMFDifferentMutationOneQApprox( vector WrightFisher::DrawBridgePMFDifferentMutationApprox( double100 s, double100 t, double100 x, const Options &o, - boost::random::mt19937 & - gen) /// Draws from the law of a bridge starting and ending at different - /// boundary points, but both time increments fall below threshold + boost::random::mt19937 + &gen) /// Draws from the law of a bridge starting and ending at + /// different boundary points, but both time increments fall + /// below threshold { assert((!(x > 0.0) || !(x < 1.0)) && (t > s) && (s > 0.0)); vector returnvec; @@ -6203,8 +6227,8 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( /// Compute a guess to the mode over (m,k) vector modeGuess = mkModeFinder(x, 1.0 - x, s, t, o); int mMode = modeGuess[0], - kMode = modeGuess[1]; /// Use this guess & eC to obtain a suitable - /// threshold for subsequent calculations + kMode = modeGuess[1]; /// Use this guess & eC to obtain a suitable + /// threshold for subsequent calculations double100 constContr = -log(eC) - boost::math::lgamma(thetaP[0]) - boost::math::lgamma(thetaP[1]); double100 currsum = 0.0, @@ -6230,16 +6254,15 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( constContr; currsum += exp(currsum_inc); - runningMax = - max(currsum_inc, runningMax); /// Storing maximum of log probabilities - /// for log-sum-exp trick + runningMax = max(currsum_inc, runningMax); /// Storing maximum of log + /// probabilities for log-sum-exp trick currsumStore.push_back(currsum_inc); mkStore.resize(mkStore.size() + 2, -1); mkStore[0 + (2 * (currsumStore.size() - 1))] = m; mkStore[1 + (2 * (currsumStore.size() - 1))] = k; - if (!(kDownSwitch)) /// Mechanism to explore k + if (!(kDownSwitch)) /// Mechanism to explore k { if (sgn(k - kMode) <= 0) { kDownSwitch = @@ -6269,7 +6292,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( } } - if (!(mDownSwitch)) /// Mechanism to explore m + if (!(mDownSwitch)) /// Mechanism to explore m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -6297,8 +6320,8 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( } } - LogSumExp(currsumStore, runningMax); /// Log-sum-exp trick to normalise vector - /// of log probabilities + LogSumExp(currsumStore, runningMax); /// Log-sum-exp trick to normalise + /// vector of log probabilities double100 sum = 0.0; int index, ind = 0; boost::random::uniform_01 U01; @@ -6308,7 +6331,7 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( for (int i = 0; i != static_cast(indexing.size()); i++) { indexing[i] = i; } - sort(indexing.begin(), indexing.end(), /// Sort vector + sort(indexing.begin(), indexing.end(), /// Sort vector [&](const int &a, const int &b) { return (currsumStore[a] > currsumStore[b]); }); @@ -6319,10 +6342,10 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( sum += currsumStore[indexing[ind]]; if (sum > u) { index = - indexing[ind]; /// Figure out what the correct index for mkljStore is + indexing[ind]; /// Figure out what the correct index for mkljStore is found = true; } - if (ind == static_cast(currsumStore.size())) /// Ending condition + if (ind == static_cast(currsumStore.size())) /// Ending condition { index = indexing[ind]; found = true; @@ -6330,13 +6353,13 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( ind++; } - if (!(x > 0.0)) /// Setting l = 0, j = k + if (!(x > 0.0)) /// Setting l = 0, j = k { returnvec.push_back(mkStore[0 + (2 * index)]); returnvec.push_back(mkStore[1 + (2 * index)]); returnvec.push_back(0); returnvec.push_back(mkStore[1 + (2 * index)]); - } else /// Setting l = m, j = 0 + } else /// Setting l = m, j = 0 { returnvec.push_back(mkStore[0 + (2 * index)]); returnvec.push_back(mkStore[1 + (2 * index)]); @@ -6350,9 +6373,9 @@ vector WrightFisher::DrawBridgePMFDifferentMutationApprox( vector WrightFisher::DrawBridgePMFInteriorMutation( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting at a boundary point - /// but ending in the interior of (0,1) with both time increments - /// large enough + &gen) /// Draws from the law of a bridge starting at a boundary point + /// but ending in the interior of (0,1) with both time increments + /// large enough { assert((!(x > 0.0) || !(x < 1.0)) && (z > 0.0) && (z < 1.0) && (t > s) && (s > 0.0)); @@ -6393,8 +6416,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( while (!mkj_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; @@ -6454,7 +6476,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( } if (eAU[n] == eAL[n] && eBU[n] == eBL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmkj. + eCL == eCU) /// ...then we have lost precision before reaching Fmkj. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmkj = " << Fmkj @@ -6486,14 +6508,11 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -6529,7 +6548,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( exit(1); } - while (!decision_on_mkj_made) /// Refine upper and lower bounds + while (!decision_on_mkj_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -6623,16 +6642,18 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k,j) = (" << n << "," << m << "," << k - << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,k,j) = (" << n << "," << m + << "," << k << "," << j << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k,j) = (" << n << "," << m << "," << k - << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,k,j) = (" << n << "," << m + << "," << k << "," << j << ")." << endl; + // exit(1); } decision_on_mkj_made = (currsumL > u || currsumU < u); @@ -6642,10 +6663,10 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( if (mkj_found) { if (!(x > 0.0)) { - curr_mk[n][2] = 0; /// Sets l = 0 + curr_mk[n][2] = 0; /// Sets l = 0 curr_mk[n][3] = j; } else { - curr_mk[n][2] = m; /// Sets l = m + curr_mk[n][2] = m; /// Sets l = m curr_mk[n][3] = j; } } @@ -6653,8 +6674,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -6662,11 +6682,9 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( cerr << "p_m,k,j: Returned (m,k,j) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << "," << curr_mk[n][3] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -6676,14 +6694,14 @@ vector WrightFisher::DrawBridgePMFInteriorMutation( vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting at a boundary point - /// but ending in the interior of (0,1) but one time increment is - /// below the threshold + &gen) /// Draws from the law of a bridge starting at a boundary point + /// but ending in the interior of (0,1) but one time increment is + /// below the threshold { assert((!(x > 0.0) || !(x < 1.0)) && (z > 0.0) && (z < 1.0) && (t > s) && (s > 0.0)); bool ind1 = - (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k + (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k double100 sorts = (ind1 ? s : t - s), sortsapprox = (sorts == s ? t - s : s); vector> curr_mk; @@ -6727,14 +6745,12 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( while (!mkj_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; int mork = (ind1 ? m : k), morkapprox = (mork == m ? k : m); - if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) - counter++; + if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) counter++; if (o.debug > 2) cerr << "New n = " << n << ", (m,k) = (" << m << ", " << k << ")" << endl; @@ -6779,7 +6795,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( } if (eAU[n] == eAL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmkj. + eCL == eCU) /// ...then we have lost precision before reaching Fmkj. { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmkj = " << Fmkj @@ -6810,14 +6826,11 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -6861,7 +6874,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( exit(1); } - while (!decision_on_mkj_made) /// Refine upper and lower bounds + while (!decision_on_mkj_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -6942,16 +6955,18 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k,l,j) = (" << n << "," << m << "," << k - << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,k,l,j) = (" << n << "," + << m << "," << k << "," << j << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k,l,j) = (" << n << "," << m << "," << k - << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,k,l,j) = (" << n << "," + << m << "," << k << "," << j << ")." << endl; + // exit(1); } decision_on_mkj_made = (currsumL > u || currsumU < u); @@ -6961,17 +6976,17 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( if (mkj_found) { if (!(x > 0.0)) { - curr_mk[n][2] = 0; /// Sets l = 0 + curr_mk[n][2] = 0; /// Sets l = 0 curr_mk[n][3] = j; } else { - curr_mk[n][2] = m; /// Sets l = m + curr_mk[n][2] = m; /// Sets l = m curr_mk[n][3] = j; } } } - if (counter == totalpts) /// Gaussian approximation leads to currsum summing - /// to < 1.0, so we renormalise and sample + if (counter == totalpts) /// Gaussian approximation leads to currsum + /// summing to < 1.0, so we renormalise and sample { LogSumExp(currsumStore, runningMax); double100 sum = 0.0; @@ -7002,19 +7017,16 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); if (o.debug > 2) { cerr << "p_m,k,j: Returned (m,k,j) = (" << curr_mk[n][0] << "," << curr_mk[n][1] << "," << curr_mk[n][3] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -7024,9 +7036,9 @@ vector WrightFisher::DrawBridgePMFInteriorMutationOneQApprox( vector WrightFisher::DrawBridgePMFInteriorMutationApprox( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting at a boundary point - /// but ending in the interior of (0,1) with both time increments - /// below the threshold + &gen) /// Draws from the law of a bridge starting at a boundary point + /// but ending in the interior of (0,1) with both time increments + /// below the threshold { assert((!(x > 0.0) || !(x < 1.0)) && (z > 0.0) && (z < 1.0) && (t > s) && (s > 0.0)); @@ -7039,7 +7051,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( int Dflip = 1, Djm = 0, Djp = 0; int dmode = static_cast(ceil(GriffithsParas(t).first)), d = dmode; - while (max(eCOldInc, eCInc) > 0.0) { + while (max(eCOldInc, eCInc) > 0.0 || (!(eC > 0.0))) { eCOldInc = eCInc; double100 para1 = (!(x > 0.0) ? static_cast(thetaP[0]) : static_cast(thetaP[0] + d)); @@ -7055,7 +7067,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( eC += eCInc; if (Dflip == -1 && - (dmode - Djm - 1 > 0)) /// Mechanism to explore either side around mode + (dmode - Djm - 1 > 0)) /// Mechanism to explore either side around mode { Djm++; d = dmode - Djm; @@ -7067,12 +7079,12 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( } vector modeGuess = mkjModeFinder( - x, z, s, t, o); /// Get a guess to location of mode over (m,k,j) + x, z, s, t, o); /// Get a guess to location of mode over (m,k,j) int mMode = modeGuess[0], kMode = modeGuess[1], jMode = modeGuess[2]; boost::random::uniform_01 - U01; /// Use these guesses & eC to set a suitable threshold for subsequent - /// computations + U01; /// Use these guesses & eC to set a suitable threshold for + /// subsequent computations double100 currsum = 0.0, u = U01(gen), threshold = exp(mkjModeFinder_Evaluator(mMode, kMode, jMode, x, z, s, t, o) - @@ -7092,12 +7104,12 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( ? -boost::math::lgamma(static_cast(thetaP[1] + m)) : -boost::math::lgamma(static_cast(thetaP[0] + m))); double100 mContr_U = mContr_D, mContr, - runningMax = -1.0e100; /// Computing m contributions + runningMax = -1.0e100; /// Computing m contributions while (!mSwitch) { double100 qm = QmApprox(m, s, o); - if (!(qm > 0.0)) /// This should not trigger, but if it does, sets to very - /// small value (taking logs later so cannot be 0!) + if (!(qm > 0.0)) /// This should not trigger, but if it does, sets to very + /// small value (taking logs later so cannot be 0!) { qm = 1.0e-300; } @@ -7123,7 +7135,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( int k = kMode; kFlip = 1, kD = 0, kU = 0; bool kSwitch = false, kDownSwitch = false, - kUpSwitch = false; /// Computing k contributions + kUpSwitch = false; /// Computing k contributions double100 kContr_D = (boost::math::lgamma( static_cast(thetaP[0] + thetaP[1] + k)) - @@ -7134,8 +7146,8 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); - if (!(qk > 0.0)) /// This should not trigger, but if it does, sets to very - /// small value (taking logs later so cannot be 0!) + if (!(qk > 0.0)) /// This should not trigger, but if it does, sets to + /// very small value (taking logs later so cannot be 0!) { qk = 1.0e-300; } @@ -7159,11 +7171,11 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( } int jFlip = 1, newjMode = min(k, jMode), j = newjMode, jU = 0, - jD = 0; /// Need to redefine jMode as k might be too small! + jD = 0; /// Need to redefine jMode as k might be too small! bool jSwitch = false, jDownSwitch = false, jUpSwitch = false; double100 jContr_D = - log(boost::math::binomial_coefficient(k, j)) + + LogBinomialCoefficientCalculator(k, j) + (!(x > 0.0) ? boost::math::lgamma( static_cast(thetaP[1] + m + k - j)) - boost::math::lgamma( @@ -7210,8 +7222,8 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( } double100 currsum_inc = constContr + mContr + kContr + jContr - log(eC); runningMax = - max(currsum_inc, runningMax); /// Running max of log probabilities - /// for use in log-sum-exp trick + max(currsum_inc, runningMax); /// Running max of log probabilities + /// for use in log-sum-exp trick currsum += exp(currsum_inc); currsumStore.push_back(currsum_inc); @@ -7221,7 +7233,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( mkljStore[2 + (4 * (currsumStore.size() - 1))] = l; mkljStore[3 + (4 * (currsumStore.size() - 1))] = j; - if (!(jDownSwitch)) /// Switching mechanism for j + if (!(jDownSwitch)) /// Switching mechanism for j { if (sgn(j - newjMode) <= 0) { jDownSwitch = @@ -7253,7 +7265,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( } } - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = (((jU == 0) && (jD == 0)) || (kMode - kD - 1 < 0)); @@ -7281,7 +7293,7 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -7347,8 +7359,8 @@ vector WrightFisher::DrawBridgePMFInteriorMutationApprox( vector WrightFisher::DrawBridgePMF( double100 x, double100 z, double100 s, double100 t, const Options &o, boost::random::mt19937 - &gen) /// Draws from the law of a bridge starting and ending in the - /// interior of (0,1) with both time increments large enough + &gen) /// Draws from the law of a bridge starting and ending in the + /// interior of (0,1) with both time increments large enough { assert((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0) && (t > s) && (s > 0.0)); @@ -7398,8 +7410,7 @@ vector WrightFisher::DrawBridgePMF( while (!mklj_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; @@ -7459,7 +7470,7 @@ vector WrightFisher::DrawBridgePMF( } if (eAU[n] == eAL[n] && eBU[n] == eBL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmklj + eCL == eCU) /// ...then we have lost precision before reaching Fmklj { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmklj = " << Fmklj @@ -7492,14 +7503,11 @@ vector WrightFisher::DrawBridgePMF( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -7534,7 +7542,7 @@ vector WrightFisher::DrawBridgePMF( exit(1); } - while (!decision_on_mklj_made) /// Refine upper and lower bounds + while (!decision_on_mklj_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -7631,16 +7639,20 @@ vector WrightFisher::DrawBridgePMF( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k,l,j) = (" << n << "," << m << "," << k - << "," << l << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << + // currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,k,l,j) = (" << n << "," + << m << "," << k << "," << l << "," << j << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k,l,j) = (" << n << "," << m << "," << k - << "," << l << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << + // currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,k,l,j) = (" << n << "," + << m << "," << k << "," << l << "," << j << ")." << endl; + // exit(1); } decision_on_mklj_made = (currsumL > u || currsumU < u); @@ -7656,8 +7668,7 @@ vector WrightFisher::DrawBridgePMF( } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -7666,11 +7677,9 @@ vector WrightFisher::DrawBridgePMF( << curr_mk[n][1] << "," << curr_mk[n][2] << "," << curr_mk[n][3] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -7679,14 +7688,14 @@ vector WrightFisher::DrawBridgePMF( vector WrightFisher::DrawBridgePMFOneQApprox( double100 x, double100 z, double100 s, double100 t, const Options &o, - boost::random::mt19937 &gen) /// Draws from the law of a bridge starting and - /// ending in the interior of (0,1), but one - /// time increment is below the threshold + boost::random::mt19937 &gen) /// Draws from the law of a bridge starting + /// and ending in the interior of (0,1), but + /// one time increment is below the threshold { assert((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0) && (t > s) && (s > 0.0)); bool ind1 = - (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k + (s > o.g1984threshold); /// Figure out whether to approximate q_m or q_k double100 sorts = (ind1 ? s : t - s), sortsapprox = (sorts == s ? t - s : s); vector> curr_mk; @@ -7744,14 +7753,12 @@ vector WrightFisher::DrawBridgePMFOneQApprox( while (!mklj_found) { ++n; - if (n > 0) - curr_mk.push_back(curr_mk.back()); + if (n > 0) curr_mk.push_back(curr_mk.back()); increment_on_mk(curr_mk.back(), s, t); int &m = curr_mk[n][0]; int &k = curr_mk[n][1]; int mork = (ind1 ? m : k), morkapprox = (mork == m ? k : m); - if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) - counter++; + if (m <= mlimU && m >= mlimL && k <= klimU && k >= klimL) counter++; if (o.debug > 2) cerr << "New n = " << n << ", (m,k) = (" << m << ", " << k << ")" << endl; @@ -7796,7 +7803,7 @@ vector WrightFisher::DrawBridgePMFOneQApprox( } if (eAU[n] == eAL[n] && - eCL == eCU) /// ...then we have lost precision before reaching Fmklj + eCL == eCU) /// ...then we have lost precision before reaching Fmklj { if (o.debug > 2) { cerr << "Abandoning loop for n = " << n << ", Fmklj = " << Fmklj @@ -7828,14 +7835,11 @@ vector WrightFisher::DrawBridgePMFOneQApprox( if (o.debug > 2) { cerr << "\nn "; - for (int k = 0; k <= n; ++k) - cerr << k << " "; + for (int k = 0; k <= n; ++k) cerr << k << " "; cerr << "\ndL "; - for (int k = 0; k <= n; ++k) - cerr << dL[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dL[k] << " "; cerr << "\ndU "; - for (int k = 0; k <= n; ++k) - cerr << dU[k] << " "; + for (int k = 0; k <= n; ++k) cerr << dU[k] << " "; cerr << endl; } @@ -7845,7 +7849,7 @@ vector WrightFisher::DrawBridgePMFOneQApprox( if (o.debug > 2) cerr << "Adding to currsums with A(n,m,k,l,j) = A(" << n << "," << m << "," << k << "," << l << "," << j - << ") = " << endl; // Amklj[Akey] << endl; + << ") = " << endl; // Amklj[Akey] << endl; if (Amklj * dL[n] > 1.0 || Amklj * dU[n] < 0.0 || eAU[n] < 0.0 || eAL[n] > 1.0 || eCU < 0.0) { @@ -7879,7 +7883,7 @@ vector WrightFisher::DrawBridgePMFOneQApprox( exit(1); } - while (!decision_on_mklj_made) /// Refine upper and lower bounds + while (!decision_on_mklj_made) /// Refine upper and lower bounds { double100 currsumLold = currsumL, currsumUold = currsumU; currsumL = 0.0; @@ -7965,16 +7969,20 @@ vector WrightFisher::DrawBridgePMFOneQApprox( } if (currsumLold > currsumL) { - cerr << "Error: currsumLold = " << currsumLold << " > " << currsumL - << " = currsumL (n,m,k,l,j) = (" << n << "," << m << "," << k - << "," << l << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumLold = " << currsumLold << " > " << + // currsumL + std::cout << "Error: currsumLold = " << currsumLold << " > " + << currsumL << " = currsumL (n,m,k,l,j) = (" << n << "," + << m << "," << k << "," << l << "," << j << ")." << endl; + // exit(1); } if (currsumUold < currsumU) { - cerr << "Error: currsumUold = " << currsumUold << " < " << currsumU - << " = currsumU (n,m,k,l,j) = (" << n << "," << m << "," << k - << "," << l << "," << j << ")." << endl; - exit(1); + // cerr << "Error: currsumUold = " << currsumUold << " < " << + // currsumU + std::cout << "Error: currsumUold = " << currsumUold << " < " + << currsumU << " = currsumU (n,m,k,l,j) = (" << n << "," + << m << "," << k << "," << l << "," << j << ")." << endl; + // exit(1); } decision_on_mklj_made = (currsumL > u || currsumU < u); @@ -7988,8 +7996,8 @@ vector WrightFisher::DrawBridgePMFOneQApprox( } } - if (counter == totalpts) /// Gaussian approximation leads to currsum summing - /// to < 1.0, so we renormalise and sample + if (counter == totalpts) /// Gaussian approximation leads to currsum + /// summing to < 1.0, so we renormalise and sample { LogSumExp(currsumStore, runningMax); double100 sum = 0.0; @@ -8020,8 +8028,7 @@ vector WrightFisher::DrawBridgePMFOneQApprox( } int coeffcount = 0; - for (int i = 0; i <= n; ++i) - coeffcount += (v_used[i] + 1); + for (int i = 0; i <= n; ++i) coeffcount += (v_used[i] + 1); curr_mk[n].push_back(coeffcount); curr_mk[n].push_back(0); @@ -8030,11 +8037,9 @@ vector WrightFisher::DrawBridgePMFOneQApprox( << curr_mk[n][1] << "," << curr_mk[n][2] << "," << curr_mk[n][3] << ")\n"; cerr << "n =\t\t\t"; - for (int i = 0; i <= n; ++i) - cerr << i << "\t"; + for (int i = 0; i <= n; ++i) cerr << i << "\t"; cerr << "\nv_used =\t"; - for (int i = 0; i <= n; ++i) - cerr << v_used[i] << "\t"; + for (int i = 0; i <= n; ++i) cerr << v_used[i] << "\t"; cerr << "Coeffcount = " << coeffcount << endl; } @@ -8043,9 +8048,10 @@ vector WrightFisher::DrawBridgePMFOneQApprox( vector WrightFisher::DrawBridgePMFG1984( double100 x, double100 z, double100 s, double100 t, const Options &o, - boost::random::mt19937 &gen) /// Draws from the law of a bridge starting and - /// ending in the interior of (0,1), but both - /// time increments are below the threshold + boost::random::mt19937 + &gen) /// Draws from the law of a bridge starting and ending in the + /// interior of (0,1), but both time increments are below the + /// threshold { assert((x > 0.0) && (x < 1.0) && (z > 0.0) && (z < 1.0) && (t > s) && (s > 0.0)); @@ -8054,16 +8060,16 @@ vector WrightFisher::DrawBridgePMFG1984( vector mkljStore; bool mklj_found = false, earlyStop = - (abs(x - z) <= 0.6); /// earlyStop gauges whether we can use currsum - /// as is, or whether we should compute all - /// probabilities and then sample + (abs(x - z) <= 0.6); /// earlyStop gauges whether we can use currsum + /// as is, or whether we should compute all + /// probabilities and then sample /// Compute denominator double100 eC = 0.0, eCInc = 1.0, eCOldInc = 1.0; int Dflip = 1, Djm = 0, Djp = 0; int dmode = static_cast(ceil(GriffithsParas(t).first)), d = dmode; - while (max(eCOldInc, eCInc) > 0.0) { + while (max(eCOldInc, eCInc) > 0.0 || (!(eC > 0.0))) { eCOldInc = eCInc; double100 addon = 0.0; for (int f = 0; f != d; f++) { @@ -8078,7 +8084,7 @@ vector WrightFisher::DrawBridgePMFG1984( eC += eCInc; if (Dflip == -1 && - (dmode - Djm - 1 > 0)) // Mechanism to explore either side around mode + (dmode - Djm - 1 > 0)) // Mechanism to explore either side around mode { Djm++; d = dmode - Djm; @@ -8090,13 +8096,13 @@ vector WrightFisher::DrawBridgePMFG1984( } vector modeGuess = - mkljModeFinder(x, z, s, t, o); /// Get a guess on mode over (m,k,l,j) + mkljModeFinder(x, z, s, t, o); /// Get a guess on mode over (m,k,l,j) int mMode = modeGuess[0], kMode = modeGuess[1], lMode = modeGuess[2], jMode = modeGuess[3]; boost::random::uniform_01 - U01; /// Use this guess & eC to compute a suitable threshold for - /// subsequent computations + U01; /// Use this guess & eC to compute a suitable threshold for + /// subsequent computations double100 currsum = 0.0, u = U01(gen), threshold = exp(mkljModeFinder_Evaluator(mMode, kMode, lMode, jMode, x, z, s, t, o) - @@ -8105,15 +8111,15 @@ vector WrightFisher::DrawBridgePMFG1984( int m = mMode, mFlip = 1, mD = 0, mU = 0; bool mSwitch = false, mDownSwitch = false, - mUpSwitch = false; /// Compute m contributions + mUpSwitch = false; /// Compute m contributions double100 mContr_D = boost::math::lgamma( static_cast(thetaP[0] + thetaP[1] + m)), mContr_U = mContr_D, mContr, runningMax = -1.0e100; while (!mSwitch) { double100 qm = QmApprox(m, s, o); - if (!(qm > 0.0)) /// This should not trigger, but if it does, sets to very - /// small value (taking logs later so cannot be 0!) + if (!(qm > 0.0)) /// This should not trigger, but if it does, sets to very + /// small value (taking logs later so cannot be 0!) { qm = 1.0e-300; } @@ -8133,7 +8139,7 @@ vector WrightFisher::DrawBridgePMFG1984( int k = kMode, kFlip = 1, kD = 0, kU = 0; bool kSwitch = false, kDownSwitch = false, - kUpSwitch = false; /// Compute k contributions + kUpSwitch = false; /// Compute k contributions double100 kContr_D = (boost::math::lgamma( static_cast(thetaP[0] + thetaP[1] + k)) - @@ -8143,8 +8149,8 @@ vector WrightFisher::DrawBridgePMFG1984( while (!kSwitch) { double100 qk = QmApprox(k, t - s, o); - if (!(qk > 0.0)) /// This should not trigger, but if it does, sets to very - /// small value (taking logs later so cannot be 0!) + if (!(qk > 0.0)) /// This should not trigger, but if it does, sets to + /// very small value (taking logs later so cannot be 0!) { qk = 1.0e-300; } @@ -8169,10 +8175,10 @@ vector WrightFisher::DrawBridgePMFG1984( } int lFlip = 1, lU = 0, lD = 0, newlMode = min(lMode, m), - l = newlMode; /// Redefine lMode in case m is too small! + l = newlMode; /// Redefine lMode in case m is too small! bool lSwitch = false, lDownSwitch = false, lUpSwitch = false; boost::math::binomial_distribution BINL( - m, x); /// Compute l contributions + m, x); /// Compute l contributions double100 lContr_D = (log(pdf(BINL, l)) - boost::math::lgamma( static_cast(thetaP[0] + l)) - @@ -8204,11 +8210,12 @@ vector WrightFisher::DrawBridgePMFG1984( } int jFlip = 1, jU = 0, jD = 0, newjMode = min(jMode, k), - j = newjMode; /// Redefine jMode in case k is too small! + j = newjMode; /// Redefine jMode in case k is too small! bool jSwitch = false, jDownSwitch = false, - jUpSwitch = false; /// Compute j contributions + jUpSwitch = false; /// Compute j contributions + double100 jContr_D = - log(boost::math::binomial_coefficient(k, j)) + + LogBinomialCoefficientCalculator(k, j) + boost::math::lgamma(static_cast(thetaP[0] + l + j)) - boost::math::lgamma(static_cast(thetaP[0] + j)) + boost::math::lgamma( @@ -8249,7 +8256,7 @@ vector WrightFisher::DrawBridgePMFG1984( exp(mContr + kContr + lContr + jContr - log(eC)); runningMax = max( currsum_inc, - runningMax); /// Running max needed for log-sum-exp trick later + runningMax); /// Running max needed for log-sum-exp trick later currsum += currsum_inc; currsumStore.push_back(currsum); @@ -8259,8 +8266,8 @@ vector WrightFisher::DrawBridgePMFG1984( mkljStore[2 + (4 * (currsumStore.size() - 1))] = l; mkljStore[3 + (4 * (currsumStore.size() - 1))] = j; - if ((currsum > u) && earlyStop) /// if earlyStop is allowed, we can - /// stop once currsum exceeds u + if ((currsum > u) && earlyStop) /// if earlyStop is allowed, we can + /// stop once currsum exceeds u { returnvec.push_back(m); returnvec.push_back(k); @@ -8271,7 +8278,7 @@ vector WrightFisher::DrawBridgePMFG1984( goto End; } - if (!(jDownSwitch)) /// Switching mechanism for j + if (!(jDownSwitch)) /// Switching mechanism for j { if (sgn(j - newjMode) <= 0) { jDownSwitch = @@ -8303,7 +8310,7 @@ vector WrightFisher::DrawBridgePMFG1984( } } - if (!(lDownSwitch)) /// Switching mechanism for l + if (!(lDownSwitch)) /// Switching mechanism for l { if (sgn(l - newlMode) <= 0) { lDownSwitch = (((jU == 0) && (jD == 0)) || (newlMode - lD - 1) < 0); @@ -8333,7 +8340,7 @@ vector WrightFisher::DrawBridgePMFG1984( } } - if (!(kDownSwitch)) /// Switching mechanism for k + if (!(kDownSwitch)) /// Switching mechanism for k { if (sgn(k - kMode) <= 0) { kDownSwitch = (((lU == 0) && (lD == 0)) || (kMode - kD - 1 < 0)); @@ -8361,7 +8368,7 @@ vector WrightFisher::DrawBridgePMFG1984( } } - if (!(mDownSwitch)) /// Switching mechanism for m + if (!(mDownSwitch)) /// Switching mechanism for m { if (sgn(m - mMode) <= 0) { mDownSwitch = (((kU == 0) && (kD == 0)) || (mMode - mD - 1 < 0)); @@ -8391,13 +8398,14 @@ vector WrightFisher::DrawBridgePMFG1984( End: - if (!mklj_found) /// Either earlyStop disable or even with it we still did not - /// get currsum > u - guards against cases when earlyStop is - /// not a good enough indicator of currsum summing to < 1 + if (!mklj_found) /// Either earlyStop disable or even with it we still did + /// not get currsum > u - guards against cases when + /// earlyStop is not a good enough indicator of currsum + /// summing to < 1 { LogSumExp(currsumStore, - runningMax); /// log-sum-exp trick to normalise and transform - /// vector of log probabilities + runningMax); /// log-sum-exp trick to normalise and transform + /// vector of log probabilities double100 sum = 0.0; int index, ind = 0; @@ -8405,7 +8413,7 @@ vector WrightFisher::DrawBridgePMFG1984( for (int i = 0; i != static_cast(indexing.size()); i++) { indexing[i] = i; } - sort(indexing.begin(), indexing.end(), /// Sort probabilities + sort(indexing.begin(), indexing.end(), /// Sort probabilities [&](const int &a, const int &b) { return (currsumStore[a] > currsumStore[b]); }); @@ -8415,10 +8423,11 @@ vector WrightFisher::DrawBridgePMFG1984( while (!found) { sum += currsumStore[indexing[ind]]; if (sum > u) { - index = indexing[ind]; /// Return correct index to sorted probabilities + index = indexing[ind]; /// Return correct index to sorted probabilities found = true; } - if (ind == static_cast(currsumStore.size() - 1)) /// Ending condition + if (ind == + static_cast(currsumStore.size() - 1)) /// Ending condition { index = indexing[ind]; found = true; @@ -8437,13 +8446,13 @@ vector WrightFisher::DrawBridgePMFG1984( double100 WrightFisher::mkModeFinder_Evaluator( int m, int k, double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Evaluation function for finding mode over (m,k) + const Options &o) /// Evaluation function for finding mode over (m,k) { assert((m >= 0) && (k >= 0) && (x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (s > 0.0) && (s < t)); double100 qm = QmApprox(m, s, o), qk = QmApprox(k, t - s, o); - if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they - /// are, set to a very small positive value + if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they + /// are, set to a very small positive value { qm = 1.0e-300; } @@ -8471,14 +8480,14 @@ double100 WrightFisher::mkModeFinder_Evaluator( double100 WrightFisher::mkjModeFinder_Evaluator( int m, int k, int j, double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Evaluation function for finding mode over (m,k,j) + const Options &o) /// Evaluation function for finding mode over (m,k,j) { assert((m >= 0) && (k >= 0) && (j >= 0) && (j <= k) && (x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (s > 0.0) && (s < t)); boost::math::binomial_distribution<> BIN(k, z); double100 qm = QmApprox(m, s, o), qk = QmApprox(k, t - s, o); - if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they - /// are, set to a very small positive value + if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they + /// are, set to a very small positive value { qm = 1.0e-300; } @@ -8503,15 +8512,15 @@ double100 WrightFisher::mkjModeFinder_Evaluator( double100 WrightFisher::mkljModeFinder_Evaluator( int m, int k, int l, int j, double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Evaluation function for finding mode over (m,k,l,j) + const Options &o) /// Evaluation function for finding mode over (m,k,l,j) { assert((m >= 0) && (k >= 0) && (j >= 0) && (j <= k) && (l >= 0) && (l <= m) && (x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (s > 0.0) && (s < t)); boost::math::binomial_distribution<> BIN(m, x), BINZ(k, z); double100 qm = QmApprox(m, s, o), qk = QmApprox(k, t - s, o); - if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they - /// are, set to a very small positive value + if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they + /// are, set to a very small positive value { qm = 1.0e-300; } @@ -8530,13 +8539,13 @@ double100 WrightFisher::mkljModeFinder_Evaluator( double100 WrightFisher::mklModeFinder_Evaluator( int m, int k, int l, double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Evaluation function for finding mode over (m,k,l) + const Options &o) /// Evaluation function for finding mode over (m,k,l) { assert((m >= 0) && (k >= 0) && (l >= 0) && (l <= m) && (x > 0.0) && (x < 1.0) && (!(z > 0.0) || !(z < 1.0)) && (s > 0.0) && (s < t)); double100 qm = QmApprox(m, s, o), qk = QmApprox(k, t - s, o); - if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they - /// are, set to a very small positive value + if (!(qm > 0.0)) /// Ensure qm and qk are not zero when taking logs! If they + /// are, set to a very small positive value { qm = 1.0e-300; } @@ -8556,13 +8565,13 @@ double100 WrightFisher::mklModeFinder_Evaluator( vector WrightFisher::mkModeFinder( double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Routine for finding mode over (m,k) + const Options &o) /// Routine for finding mode over (m,k) { vector returnvec; int m = static_cast(floor(GriffithsParas(s).first)), k = static_cast(floor(GriffithsParas(t - s).first)); - int m_ud, k_ud; /// Start at mode from qm and qk + int m_ud, k_ud; /// Start at mode from qm and qk double100 currMode_eval = mkModeFinder_Evaluator(m, k, x, z, s, t, o); bool stop = false; @@ -8595,7 +8604,7 @@ vector WrightFisher::mkModeFinder( currMode_eval = mkModeFinder_Evaluator(m, k, x, z, s, t, o); if (!(m_ud > 0) && !(m_ud < 0) && !(k_ud > 0) && - !(k_ud < 0)) /// Keep iterating until both m & k told to not change + !(k_ud < 0)) /// Keep iterating until both m & k told to not change { stop = true; returnvec.push_back(m); @@ -8608,14 +8617,14 @@ vector WrightFisher::mkModeFinder( vector WrightFisher::mkjModeFinder( double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Routine for finding mode over (m,k,j) + const Options &o) /// Routine for finding mode over (m,k,j) { vector returnvec; int m = static_cast(floor(GriffithsParas(s).first)), k = static_cast(floor(GriffithsParas(t - s).first)); int j = static_cast(floor(static_cast(k) * z)); - int m_ud, k_ud, j_ud; /// Starting from the modes of qm, qk and Bin(k,z) + int m_ud, k_ud, j_ud; /// Starting from the modes of qm, qk and Bin(k,z) double100 currMode_eval = mkjModeFinder_Evaluator(m, k, j, x, z, s, t, o); bool stop = false; @@ -8706,7 +8715,7 @@ vector WrightFisher::mkjModeFinder( vector WrightFisher::mkljModeFinder( double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Routine for finding mode over (m,k,l,j) + const Options &o) /// Routine for finding mode over (m,k,l,j) { vector returnvec; int m = static_cast(floor(GriffithsParas(s).first)), @@ -8715,7 +8724,7 @@ vector WrightFisher::mkljModeFinder( j = static_cast(floor(static_cast(k) * z)); int m_ud, k_ud, l_ud, - j_ud; /// Initialise at modes from qm, qk, Bin(m,x), Bin(k,z) + j_ud; /// Initialise at modes from qm, qk, Bin(m,x), Bin(k,z) double100 currMode_eval = mkljModeFinder_Evaluator(m, k, l, j, x, z, s, t, o); bool stop = false; @@ -8852,7 +8861,7 @@ vector WrightFisher::mkljModeFinder( vector WrightFisher::mklModeFinder( double100 x, double100 z, double100 s, double100 t, - const Options &o) /// Routine for finding mode over (m,k,l) + const Options &o) /// Routine for finding mode over (m,k,l) { vector returnvec; int m = static_cast(floor(GriffithsParas(s).first)), @@ -8863,7 +8872,7 @@ vector WrightFisher::mklModeFinder( int m_ud = -1, k_ud = -1, l_ud = -1, mkLower = thetaP.empty() ? 1 - : 0; /// Starting from the modes of qm, qk and Bin(m,x) + : 0; /// Starting from the modes of qm, qk and Bin(m,x) double100 currMode_eval = mklModeFinder_Evaluator(m, k, l, x, z, s, t, o); bool rerun = false; @@ -8961,8 +8970,8 @@ vector WrightFisher::mklModeFinder( (thetaP.empty() || (!(thetaP[1] > 0.0) && (l == m)))) { l = ((thetaP.empty() || (!(thetaP[0] > 0.0) && (l == 0))) ? 1 - : m - 1); /// Sometimes l == 0/m but cannot be for cases when - /// thetaP.empty() + : m - 1); /// Sometimes l == 0/m but cannot be for cases when + /// thetaP.empty() } returnvec.push_back(m); @@ -8976,13 +8985,13 @@ pair WrightFisher::DrawBridgepoint( double100 x, double100 z, double100 t1, double100 t2, double100 s, const Options &o, boost::random::mt19937 - &gen) /// Routine to decide which bridge sampler to invoke for sampling - /// at time s from neutral bridge diffusion started at x at time - /// t1, ending at z in time t2, conditioned on non-absorption on - /// (t1,t2) + &gen) /// Routine to decide which bridge sampler to invoke for sampling + /// at time s from neutral bridge diffusion started at x at time + /// t1, ending at z in time t2, conditioned on non-absorption on + /// (t1,t2) { - assert((x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t1 >= 0.0) && - (s > t1) && (s < t2)); + assert((x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (s > t1) && + (s < t2)); double100 y, para1, para2; int m, k, j, l, coeffcount = -1; vector mklj; @@ -8990,38 +8999,41 @@ pair WrightFisher::DrawBridgepoint( if ((s - t1 <= o.bridgethreshold || t2 - s <= o.bridgethreshold) || (((theta - 1.0) / (exp(0.5 * theta * (s - t1)))) + ((theta - 1.0) / (exp(0.5 * theta * (t2 - s)))) > - 260.0)) /// Use diffusion approximations - { /// Last condition checks that corresponding m and k terms are not too large + 260.0)) /// Use diffusion approximations + { + /// Last condition checks that corresponding m and k terms are not too + /// large /// to create computational bottleneck double100 y1 = DrawEndpoint(x, t1, s, o, gen) - .first; /// Diffusion approximation for when times are too small and - /// bridge takes too long to compute + .first; /// Diffusion approximation for when times are too small + /// and bridge takes too long to compute y = abs((y1 - x) + ((t2 - s) / (t2 - t1)) * x + - ((s - t1) / (t2 - t1)) * z); /// Ensures y remains positive + ((s - t1) / (t2 - t1)) * z); /// Ensures y remains positive - if (y > 1.0) /// Ensure y remains <= 1.0 + if (y > 1.0) /// Ensure y remains <= 1.0 { y = 1.0 - abs(1.0 - y); } - } else /// Else use bridge simulator + } else /// Else use bridge simulator { - if (!(x > 0.0)) /// x = 0 + if (!(x > 0.0)) /// x = 0 { - if (!(z > 0.0)) /// x = 0 & z = 0 + if (!(z > 0.0)) /// x = 0 & z = 0 { if (s - t1 <= o.g1984threshold && - t2 - s <= o.g1984threshold) /// Time increments both below threshold + t2 - s <= + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFSameMutationApprox(x, s - t1, t2 - t1, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFSameMutationOneQApprox(x, s - t1, t2 - t1, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFSameMutation(x, s - t1, t2 - t1, o, gen); } @@ -9030,20 +9042,21 @@ pair WrightFisher::DrawBridgepoint( k = mklj[1]; l = 0; j = 0; - } else if (!(z < 1.0)) /// x = 0 & z = 1 + } else if (!(z < 1.0)) /// x = 0 & z = 1 { if (s - t1 <= o.g1984threshold && - t2 - s <= o.g1984threshold) /// Time increments both below threshold + t2 - s <= + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFDifferentMutationApprox(s - t1, t2 - t1, x, o, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFDifferentMutationOneQApprox(s - t1, t2 - t1, x, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFDifferentMutation(s - t1, t2 - t1, x, o, gen); } @@ -9052,20 +9065,21 @@ pair WrightFisher::DrawBridgepoint( k = mklj[1]; l = 0; j = k; - } else /// x = 0 & z in (0,1) + } else /// x = 0 & z in (0,1) { if (s - t1 <= o.g1984threshold && - t2 - s <= o.g1984threshold) /// Time increments both below threshold + t2 - s <= + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFInteriorMutationApprox(x, z, s - t1, t2 - t1, o, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFInteriorMutationOneQApprox(x, z, s - t1, t2 - t1, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFInteriorMutation(x, z, s - t1, t2 - t1, o, gen); } @@ -9075,22 +9089,23 @@ pair WrightFisher::DrawBridgepoint( l = mklj[2]; j = mklj[3]; } - } else if (!(x < 1.0)) /// x = 1 + } else if (!(x < 1.0)) /// x = 1 { - if (!(z > 0.0)) /// x = 1 & z = 0 + if (!(z > 0.0)) /// x = 1 & z = 0 { if (s - t1 <= o.g1984threshold && - t2 - s <= o.g1984threshold) /// Time increments both below threshold + t2 - s <= + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFDifferentMutationApprox(s - t1, t2 - t1, x, o, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFDifferentMutationOneQApprox(s - t1, t2 - t1, x, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFDifferentMutation(s - t1, t2 - t1, x, o, gen); } @@ -9099,19 +9114,20 @@ pair WrightFisher::DrawBridgepoint( k = mklj[1]; l = m; j = 0; - } else if (!(z < 1.0)) /// x = 1 & z = 1 + } else if (!(z < 1.0)) /// x = 1 & z = 1 { if (s - t1 <= o.g1984threshold && - t2 - s <= o.g1984threshold) /// Time increments both below threshold + t2 - s <= + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFSameMutationApprox(x, s - t1, t2 - t1, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFSameMutationOneQApprox(x, s - t1, t2 - t1, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFSameMutation(x, s - t1, t2 - t1, o, gen); } @@ -9120,20 +9136,21 @@ pair WrightFisher::DrawBridgepoint( k = mklj[1]; l = m; j = k; - } else /// x = 1 & z in (0,1) + } else /// x = 1 & z in (0,1) { if (s - t1 <= o.g1984threshold && - t2 - s <= o.g1984threshold) /// Time increments both below threshold + t2 - s <= + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFInteriorMutationApprox(x, z, s - t1, t2 - t1, o, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFInteriorMutationOneQApprox(x, z, s - t1, t2 - t1, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFInteriorMutation(x, z, s - t1, t2 - t1, o, gen); } @@ -9143,82 +9160,82 @@ pair WrightFisher::DrawBridgepoint( l = mklj[2]; j = mklj[3]; } - } else /// x in (0,1) + } else /// x in (0,1) { - if (!(z > 0.0)) /// x in (0,1) & z = 0 + if (!(z > 0.0)) /// x in (0,1) & z = 0 { double100 newt2 = t2 - t1, news = t2 - s; if (news <= o.g1984threshold && newt2 - news <= - o.g1984threshold) /// Time increments both below threshold + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFInteriorMutationApprox( z, x, news, newt2, o, - gen); /// Time reversal! Flip x and z because reverse time bridge - } /// One time increment both below threshold + gen); /// Time reversal! Flip x and z because reverse time bridge + } /// One time increment both below threshold else if ((news <= o.g1984threshold && newt2 - news > o.g1984threshold) || (news > o.g1984threshold && newt2 - news <= o.g1984threshold)) { mklj = DrawBridgePMFInteriorMutationOneQApprox( z, x, news, newt2, o, - gen); /// Time reversal! Flip x and z because reverse time bridge - } else /// Time increments are large enough for alternating series - /// method + gen); /// Time reversal! Flip x and z because reverse time bridge + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFInteriorMutation( z, x, news, newt2, o, - gen); /// Time reversal! Flip x and z because reverse time bridge + gen); /// Time reversal! Flip x and z because reverse time bridge } m = mklj[0]; k = mklj[1]; l = mklj[2]; j = mklj[3]; - } else if (!(z < 1.0)) /// x in (0,1) & z = 1 + } else if (!(z < 1.0)) /// x in (0,1) & z = 1 { double100 newt2 = t2 - t1, news = t2 - s; if (news <= o.g1984threshold && newt2 - news <= - o.g1984threshold) /// Time increments both below threshold + o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFInteriorMutationApprox( z, x, news, newt2, o, - gen); /// Time reversal! Flip x and z because reverse time bridge - } /// One time increment both below threshold + gen); /// Time reversal! Flip x and z because reverse time bridge + } /// One time increment both below threshold else if ((news <= o.g1984threshold && newt2 - news > o.g1984threshold) || (news > o.g1984threshold && newt2 - news <= o.g1984threshold)) { mklj = DrawBridgePMFInteriorMutationOneQApprox( z, x, news, newt2, o, - gen); /// Time reversal! Flip x and z because reverse time bridge - } else /// Time increments are large enough for alternating series - /// method + gen); /// Time reversal! Flip x and z because reverse time bridge + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMFInteriorMutation( z, x, news, newt2, o, - gen); /// Time reversal! Flip x and z because reverse time bridge + gen); /// Time reversal! Flip x and z because reverse time bridge } m = mklj[0]; k = mklj[1]; l = mklj[2]; j = mklj[3]; - } else /// x in (0,1) & z in (0,1) + } else /// x in (0,1) & z in (0,1) { if (s - t1 <= o.g1984threshold && - t2 - s < o.g1984threshold) /// Time increments both below threshold + t2 - s < o.g1984threshold) /// Time increments both below threshold { mklj = DrawBridgePMFG1984(x, z, s - t1, t2 - t1, o, gen); - } /// One time increment both below threshold + } /// One time increment both below threshold else if ((s - t1 <= o.g1984threshold && t2 - s > o.g1984threshold) || (s - t1 > o.g1984threshold && t2 - s <= o.g1984threshold)) { mklj = DrawBridgePMFOneQApprox(x, z, s - t1, t2 - t1, o, gen); - } else /// Time increments are large enough for alternating series - /// method + } else /// Time increments are large enough for alternating series + /// method { mklj = DrawBridgePMF(x, z, s - t1, t2 - t1, o, gen); } @@ -9249,13 +9266,13 @@ pair WrightFisher::DrawUnconditionedBridge( double100 x, double100 z, double100 t1, double100 t2, double100 s, const Options &o, boost::random::mt19937 - &gen) /// Routine to decide which bridge sampler to invoke for sampling - /// at time s from neutral bridge diffusion started at x at time - /// t1, ending at z in time t2, with potential absorption at any - /// time in between [t1,t2] + &gen) /// Routine to decide which bridge sampler to invoke for sampling + /// at time s from neutral bridge diffusion started at x at time + /// t1, ending at z in time t2, with potential absorption at any + /// time in between [t1,t2] { - assert((x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (t1 >= 0.0) && - (s > t1) && (s < t2)); + assert((x >= 0.0) && (x <= 1.0) && (z >= 0.0) && (z <= 1.0) && (s > t1) && + (s < t2)); double100 y, para1, para2; int m = -1, k = -1, j = -1, l = -1, coeffcount = -1; vector mklj; @@ -9263,18 +9280,20 @@ pair WrightFisher::DrawUnconditionedBridge( if ((s - t1 <= o.bridgethreshold || t2 - s <= o.bridgethreshold) || (((theta - 1.0) / (exp(0.5 * theta * (s - t1)))) + ((theta - 1.0) / (exp(0.5 * theta * (t2 - s)))) > - 260.0)) /// Use diffusion approximations - { /// Last condition checks that corresponding m and k terms are not too large + 260.0)) /// Use diffusion approximations + { + /// Last condition checks that corresponding m and k terms are not too + /// large /// to create computational bottleneck double100 y1 = DrawEndpoint(x, t1, s, o, gen) - .first; /// Diffusion approximation for when times are too small and - /// bridge takes too long to compute + .first; /// Diffusion approximation for when times are too small + /// and bridge takes too long to compute y = abs((y1 - x) + ((t2 - s) / (t2 - t1)) * x + - ((s - t1) / (t2 - t1)) * z); /// Ensures y remains positive + ((s - t1) / (t2 - t1)) * z); /// Ensures y remains positive - if (y > 1.0) /// Ensure y remains <= 1.0 + if (y > 1.0) /// Ensure y remains <= 1.0 { y = 1.0 - abs(1.0 - y); } @@ -9347,8 +9366,8 @@ pair WrightFisher::DrawUnconditionedBridge( if (l == m) { return make_pair(1.0, coeffcount); } - } else /// Otherwise the conditions imposed imply the diffusion cannot - /// be absorbed over [t1,t2], so we can use Drawbridgepoint + } else /// Otherwise the conditions imposed imply the diffusion cannot + /// be absorbed over [t1,t2], so we can use Drawbridgepoint { ThetaResetter(); return DrawBridgepoint(x, z, t1, t2, s, o, gen); @@ -9436,8 +9455,8 @@ pair WrightFisher::DrawUnconditionedBridge( } } } - } else /// No absorption can happen, so we are in the same case as in - /// DrawBridgepoint + } else /// No absorption can happen, so we are in the same case as in + /// DrawBridgepoint { ThetaResetter(); return DrawBridgepoint(x, z, t1, t2, s, o, gen); @@ -9471,44 +9490,45 @@ vector> WrightFisher::NonNeutralDrawBridge( double100 x, double100 t1, double100 t2, double100 z, bool Absorption, const Options &o, boost::random::mt19937 - &gen) /// Draws of paths from non-neutral WF diffusion bridge started - /// from x at time t1 and ending at z at time t2 + &gen) /// Draws of paths from non-neutral WF diffusion bridge started + /// from x at time t1 and ending at z at time t2 { bool accept = false; vector paras{phiMin, phiMax, phiMax - phiMin}; - double100 kapmean = paras[2] * (t2 - t1); /// Rate of Poisson point process + double100 kapmean = paras[2] * (t2 - t1); /// Rate of Poisson point process boost::random::poisson_distribution kap(static_cast(kapmean)); boost::random::uniform_01 unift, - unifm; /// Set up uniform generators for points over [t1,t2] * - /// [0,phiMax-phiMin] * [0,1] + unifm; /// Set up uniform generators for points over [t1,t2] * + /// [0,phiMax-phiMin] * [0,1] vector> ptr; int rcount = 0; vector kappastore; - while (!accept) /// Until all skeleton points get accepted, keep going + while (!accept) /// Until all skeleton points get accepted, keep going { - int kappa = kap(gen); /// Generate kappa ~ Pois + int kappa = kap(gen); /// Generate kappa ~ Pois + double100 small_offset = 1.0e-14; vector path, times(kappa), marks(kappa), rejcount; - auto gent = [&t1, &t2, &unift, &gen]() /// time stamps ~ Unif [t1,t2] - { return (t1 + ((t2 - t1) * unift(gen))); }; - auto genm = [¶s, &unifm, &gen]() /// marks ~ Unif [0,phiMax-phiMin] + auto gent = [&t1, &t2, &unift, &small_offset, + &gen]() /// time stamps ~ Unif [t1,t2] + { return (t1 + small_offset + ((t2 - t1) * unift(gen))); }; + auto genm = [¶s, &unifm, &gen]() /// marks ~ Unif [0,phiMax-phiMin] { return (paras[2] * unifm(gen)); }; - generate(begin(times), end(times), gent); - generate(begin(marks), end(marks), genm); + std::generate(begin(times), end(times), gent); + std::generate(begin(marks), end(marks), genm); sortVectorsAscending(times, times, - marks); /// Sort vectors according to timestamps + marks); /// Sort vectors according to timestamps - if (kappa == 0) /// No skeleton points -> accept + if (kappa == 0) /// No skeleton points -> accept { - rejcount.push_back(rcount); kappastore.push_back(1.0 * kappa); ptr.push_back(path); ptr.push_back(times); - ptr.push_back(rejcount); + ptr.push_back(marks); ptr.push_back(kappastore); accept = true; - } else /// kappa > 0 - generate skeleton points and check them + } else /// kappa > 0 - generate skeleton points and check them { for (vector::iterator itt = times.begin(), itm = marks.begin(); itt != times.end(); itt++, itm++) { @@ -9519,31 +9539,30 @@ vector> WrightFisher::NonNeutralDrawBridge( } else { path.push_back( DrawBridgepoint(x, z, t1, t2, *itt, o, gen) - .first); /// Generate skeleton points sequentially + .first); /// Generate skeleton points sequentially } if (Phitilde(path.back()) - paras[0] > - *itm) /// Test generated point is OK, otherwise can stop and - /// generate a new Poisson point process + *itm) /// Test generated point is OK, otherwise can stop and + /// generate a new Poisson point process { rcount++; break; } - if (kappa == 1) /// We only needed to generate one skeleton point, - /// which we accepted, so we can exit + if (kappa == 1) /// We only needed to generate one skeleton point, + /// which we accepted, so we can exit { - rejcount.push_back(rcount); kappastore.push_back(1.0 * kappa); ptr.push_back(path); ptr.push_back(times); - ptr.push_back(rejcount); + ptr.push_back(marks); ptr.push_back(kappastore); accept = true; } } else if (*itt != - times.back()) /// There are more than 2 skeleton points, and - /// we are not at the last one yet + times.back()) /// There are more than 2 skeleton points, and + /// we are not at the last one yet { if (Absorption) { path.push_back(DrawUnconditionedBridge(path.back(), z, *(itt - 1), @@ -9552,40 +9571,40 @@ vector> WrightFisher::NonNeutralDrawBridge( } else { path.push_back( DrawBridgepoint(path.back(), z, *(itt - 1), t2, *itt, o, gen) - .first); /// Generate skeleton points sequentially + .first); /// Generate skeleton points sequentially } if (Phitilde(path.back()) - paras[0] > - *itm) /// Check the generated point is OK, otherwise can stop and - /// generate a new Poisson point process + *itm) /// Check the generated point is OK, otherwise can stop and + /// generate a new Poisson point process { rcount++; break; } - } else /// We are at the last skeleton point + } else /// We are at the last skeleton point { if (Absorption) { - path.push_back(DrawUnconditionedBridge(path.back(), z, *(itt - 1), - t2, *itt, o, gen) - .first); /// Generate skeleton point sequentially + path.push_back( + DrawUnconditionedBridge(path.back(), z, *(itt - 1), t2, *itt, o, + gen) + .first); /// Generate skeleton point sequentially } else { path.push_back( DrawBridgepoint(path.back(), z, *(itt - 1), t2, *itt, o, gen) - .first); /// Generate skeleton point sequentially + .first); /// Generate skeleton point sequentially } if (Phitilde(path.back()) - paras[0] > - *itm) /// Check the generated point is OK, otherwise can stop and - /// generate a new Poisson point process + *itm) /// Check the generated point is OK, otherwise can stop and + /// generate a new Poisson point process { rcount++; break; } - rejcount.push_back(rcount); /// We are at the end, so we can just exit kappastore.push_back(1.0 * kappa); ptr.push_back(path); ptr.push_back(times); - ptr.push_back(rejcount); + ptr.push_back(marks); ptr.push_back(kappastore); accept = true; } @@ -9600,16 +9619,16 @@ pair WrightFisher::NonNeutralDrawBridgepoint( double100 x, double100 t1, double100 t2, double100 z, double100 testT, bool Absorption, const Options &o, boost::random::mt19937 - &gen) /// Invoke NonNeutralDrawBridge to generate a whole bridge path, - /// conditionally on the generated path, generate a neutral draw - /// at time testT + &gen) /// Invoke NonNeutralDrawBridge to generate a whole bridge path, + /// conditionally on the generated path, generate a neutral draw + /// at time testT { vector bridgeSection, bridgeTimes; bridgeSection.push_back(x); bridgeTimes.push_back(t1); vector> skeleton = NonNeutralDrawBridge( - x, t1, t2, z, Absorption, o, gen); /// Create skeleton points for bridge + x, t1, t2, z, Absorption, o, gen); /// Create skeleton points for bridge bridgeSection.insert(bridgeSection.end(), skeleton[0].begin(), skeleton[0].end()); bridgeTimes.insert(bridgeTimes.end(), skeleton[1].begin(), skeleton[1].end()); @@ -9619,8 +9638,9 @@ pair WrightFisher::NonNeutralDrawBridgepoint( vector::iterator timeIt = bridgeTimes.begin(), xIt = bridgeSection.begin(); - while (*timeIt < - testT) /// Cycle through skeleton points to find appropriate end points + while ( + *timeIt < + testT) /// Cycle through skeleton points to find appropriate end points { timeIt++; xIt++; @@ -9632,8 +9652,8 @@ pair WrightFisher::NonNeutralDrawBridgepoint( testT, o, gen); } else { return DrawBridgepoint(*xIt, *(xIt + 1), *timeIt, *(timeIt + 1), testT, o, - gen); /// Return neutral draw using corresponding - /// endpoints and time increments + gen); /// Return neutral draw using corresponding + /// endpoints and time increments } } @@ -9641,13 +9661,53 @@ pair WrightFisher::NonNeutralDrawBridgepoint( void WrightFisher::DiffusionRunner( int nSim, double100 x, double100 startT, double100 endT, bool Absorption, - string &Filename, const Options &o, - boost::random::mt19937 - &gen) /// Function to generate specified number of diffusion draws + string &Filename, double100 diffusion_threshold, + double100 bridge_threshold) /// Function to generate specified number of + /// diffusion draws { + std::cout << "You've asked to generate " << nSim + << " draws from the law of a Wright--Fisher diffusion with the " + "following properties:" + << std::endl; + std::cout << "Start point: " << x << std::endl; + std::cout << "Start time: " << startT << std::endl; + std::cout << "Sampling time: " << endT << std::endl; + if (Absorption) { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive, so the diffusion cannot be absorbed" + << std::endl; + } + } else { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion cannot be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout + << "You have further specified that the diffusion cannot be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive and thus already ensure this, so the " + "resulting draws are coming from the *unconditioned* diffusion!" + << std::endl; + } + } + std::cout << "You've further specified the time threshold for Gaussian " + "approximations at " + << diffusion_threshold << std::endl; + std::cout << "Output will be printed to file in " << Filename << std::endl; + const Options o(diffusion_threshold, bridge_threshold); ofstream saveFile; saveFile.open(Filename); + boost::random::mt19937 gen; int nosamples = 1, loader = floor(0.1 * nSim), loader_count = 1; while (nosamples < nSim + 1) { if (non_neutral) { @@ -9665,23 +9725,69 @@ void WrightFisher::DiffusionRunner( nosamples++; if (nosamples % (loader * loader_count) == 0) { - cout << "Simulated " << nosamples << " samples." << endl; + std::cout << "Simulated " << nosamples << " samples." << endl; loader_count++; } } - cout << "Diffusion simulation complete." << endl; + std::cout << "Diffusion simulation complete." << endl; } void WrightFisher::BridgeDiffusionRunner( int nSim, double100 x, double100 z, double100 startT, double100 endT, - double100 sampleT, bool Absorption, string &Filename, const Options &o, - boost::random::mt19937 - &gen) /// Function to generate specified number of bridge draws + double100 sampleT, bool Absorption, string &Filename, + double100 diffusion_threshold, + double100 bridge_threshold) /// Function to generate specified number of + /// bridge draws { + std::cout + << "You've asked to generate " << nSim + << " draws from the law of a Wright--Fisher diffusion bridge with the " + "following properties:" + << std::endl; + std::cout << "Start point: " << x << std::endl; + std::cout << "Start time: " << startT << std::endl; + std::cout << "End point: " << z << std::endl; + std::cout << "End time: " << endT << std::endl; + std::cout << "Sampling time: " << sampleT << std::endl; + if (Absorption) { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive, so the diffusion cannot be absorbed" + << std::endl; + } + } else { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion cannot be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout + << "You have further specified that the diffusion cannot be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive and thus already ensure this, so the " + "resulting draws are coming from the *unconditioned* diffusion!" + << std::endl; + } + } + std::cout << "You've further specified the time threshold for Gaussian " + "approximations at " + << diffusion_threshold + << ", whilst the bridge approximations threshold was set to " + << bridge_threshold << std::endl; + std::cout << "Output will be printed to file in " << Filename << std::endl; + const Options o(diffusion_threshold, bridge_threshold); ofstream saveFile; saveFile.open(Filename); + boost::random::mt19937 gen; int nosamples = 1, loader = floor(0.1 * nSim), loader_count = 1; while (nosamples < nSim + 1) { if (non_neutral) { @@ -9703,38 +9809,80 @@ void WrightFisher::BridgeDiffusionRunner( nosamples++; if (nosamples % (loader * loader_count) == 0) { - cout << "Simulated " << nosamples << " samples." << endl; + std::cout << "Simulated " << nosamples << " samples." << endl; loader_count++; } } - cout << "Bridge simulation complete." << endl; + std::cout << "Bridge simulation complete." << endl; } void WrightFisher::DiffusionDensityCalculator( int meshSize, double100 x, double100 startT, double100 endT, - bool Absorption, string &Filename, - const Options - &o) /// Function to compute truncated diffusion transition density + bool Absorption, string &Filename, double100 diffusion_threshold, + double100 bridge_threshold) /// Function to compute truncated diffusion + /// transition density { + std::cout << "You've asked to compute the transition density of a " + "Wright--Fisher diffusion with the " + "following properties:" + << std::endl; + std::cout << "Start point: " << x << std::endl; + std::cout << "Start time: " << startT << std::endl; + std::cout << "Sampling time: " << endT << std::endl; + if (Absorption) { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive, so the diffusion cannot be absorbed" + << std::endl; + } + } else { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion cannot be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout + << "You have further specified that the diffusion cannot be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive and thus already ensure this, so the " + "resulting draws are coming from the *unconditioned* diffusion!" + << std::endl; + } + } + std::cout << "You've further specified the time threshold for Gaussian " + "approximations at " + << diffusion_threshold << std::endl; + std::cout << "The pointwise computation will be performed over a mesh " + "consisting of " + << meshSize << " equally spaced intervals on [0,1]" << std::endl; + std::cout << "Output will be printed to file in " << Filename << std::endl; + const Options o(diffusion_threshold, bridge_threshold); ofstream saveFile; saveFile.open(Filename); int counter = 0; double100 timeInc = endT - startT, yinc = 1.0 / static_cast(meshSize), y, ycount = 0.1; - while (counter <= meshSize) { - if (counter == 0) { - y = 0.0; - } else if (counter == meshSize) { - y = 1.0; - } else { - y += yinc; - } - if (non_neutral) { - cerr << "Truncated density cannot be computed for non-neutral case due " - "to presence of intractable quantities!"; - } else { + if (non_neutral) { + cerr << "Truncated density cannot be computed for non-neutral case due " + "to presence of intractable quantities!"; + } else { + while (counter <= meshSize) { + if (counter == 0) { + y = 0.0; + } else if (counter == meshSize) { + y = 1.0; + } else { + y += yinc; + } if (Absorption) { if ((x > 0.0) && (x < 1.0)) { saveFile << y << " " @@ -9750,26 +9898,73 @@ void WrightFisher::DiffusionDensityCalculator( saveFile << y << " " << DiffusionDensityApproximation(x, y, timeInc, o) << "\n"; } - } - if (y >= ycount) { - cout << "Calculated density up to y = " << ycount << endl; - ycount += 0.1; + if (y >= ycount) { + std::cout << "Calculated density up to y = " << ycount << endl; + ycount += 0.1; + } + counter++; } - counter++; - } - cout << "Density calculation complete." << endl; + std::cout << "Density calculation complete." << endl; - saveFile.close(); + saveFile.close(); + } } void WrightFisher::BridgeDiffusionDensityCalculator( int meshSize, double100 x, double100 z, double100 startT, double100 endT, double100 sampleT, bool Absorption, string &Filename, - const Options & - o) /// Function to compute truncated diffusion bridge transition density + double100 diffusion_threshold, + double100 bridge_threshold) /// Function to compute truncated diffusion + /// bridge transition density { + std::cout << "You've asked to compute the transition density of a " + "Wright--Fisher diffusion bridge with the " + "following properties:" + << std::endl; + std::cout << "Start point: " << x << std::endl; + std::cout << "Start time: " << startT << std::endl; + std::cout << "End point: " << z << std::endl; + std::cout << "End time: " << endT << std::endl; + std::cout << "Sampling time: " << sampleT << std::endl; + if (Absorption) { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout << "You have further specified that the diffusion can be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive, so the diffusion cannot be absorbed" + << std::endl; + } + } else { + if (thetaP.empty() || ((thetaP.front() == 0.0 && thetaP.back() != 0.0) || + (thetaP.front() != 0.0 && thetaP.back() == 0.0))) { + std::cout << "You have further specified that the diffusion cannot be " + "absorbed at the boundary" + << std::endl; + } else { + std::cout + << "You have further specified that the diffusion cannot be " + "absorbed at the boundary, but the provided mutation rates " + "are strictly positive and thus already ensure this, so the " + "resulting draws are coming from the *unconditioned* diffusion!" + << std::endl; + } + } + std::cout << "You've further specified the time threshold for Gaussian " + "approximations at " + << diffusion_threshold + << ", whilst the bridge approximations threshold was set to " + << bridge_threshold << std::endl; + std::cout << "The pointwise computation will be performed over a mesh " + "consisting of " + << meshSize << "equally spaced intervals on [0,1]" << std::endl; + std::cout << "Output will be printed to file in " << Filename << std::endl; + const Options o(diffusion_threshold, bridge_threshold); ofstream saveFile; saveFile.open(Filename); @@ -9807,13 +10002,13 @@ void WrightFisher::BridgeDiffusionDensityCalculator( } if (y >= ycount) { - cout << "Calculated density up to y = " << ycount << endl; + std::cout << "Calculated density up to y = " << ycount << endl; ycount += 0.1; } counter++; } - cout << "Density calculation complete." << endl; + std::cout << "Density calculation complete." << endl; saveFile.close(); } diff --git a/WrightFisher.h b/src/WrightFisher.h similarity index 77% rename from WrightFisher.h rename to src/WrightFisher.h index af9c92d..17f36e5 100644 --- a/WrightFisher.h +++ b/src/WrightFisher.h @@ -18,24 +18,70 @@ using namespace boost::multiprecision; typedef double double100; class WrightFisher { -public: + public: WrightFisher(vector thetaP_in, bool non_neut_in, double100 sigma_in, int selectionsetup_in, double dom_in, int SelPolyDeg_in, vector selCoefs_in) - : thetaP(thetaP_in), non_neutral(non_neut_in), sigma(sigma_in), - SelectionSetup(selectionsetup_in), dominanceParameter(dom_in), - SelPolyDeg(SelPolyDeg_in), selectionCoeffs(selCoefs_in) { + : thetaP(thetaP_in), + non_neutral(non_neut_in), + sigma(sigma_in), + SelectionSetup(selectionsetup_in), + dominanceParameter(dom_in), + SelPolyDeg(SelPolyDeg_in), + selectionCoeffs(selCoefs_in) { ThetaSetter(); SelectionSetter(); PhiSetter(); - } + std::cout << R"( + + +++ )|( + (o o) (o o) +ooO--(_)--Ooo-ooO--(_)--Ooo + _______ ________ + / ____/ | / / ____/ + / __/ | | /| / / /_ + / /___ | |/ |/ / __/ +/_____/ |__/|__/_/ + +)" << '\n'; + std::cout << "You've instantiated a WrightFisher class with the following " + "parameters:" + << std::endl; + if (!thetaP.empty()) { + std::cout << "Theta vector: (" << thetaP.front() << ", " << thetaP.back() + << ")" << std::endl; + } else { + std::cout << "Theta vector: (0.0, 0.0)" << std::endl; + } + if (non_neutral) { + if (SelectionSetup == 0) { + std::cout << "Genic selection: " << sigma << std::endl; + } else if (SelectionSetup == 1) { + std::cout << "Diploid selection with:" << std::endl; + std::cout << "Sigma: " << sigma << std::endl; + std::cout << "Dominance parameter: " << dominanceParameter << std::endl; + } else { + std::cout << "Polynomial selection with degree " << SelPolyDeg + << " with entries:" << std::endl; + for (vector::iterator sc_it = selectionCoeffs.begin(); + sc_it != selectionCoeffs.end(); sc_it++) { + std::cout << *sc_it << ", "; + } + std::cout << "." << std::endl; + } + } else { + std::cout << "No selection." << std::endl; + } + } - /// HELPER FUNCTIONS + double100 phiMin, phiMax, AtildeMax; + /// HELPER FUNCTIONS void ThetaSetter(); void ThetaResetter(); void SelectionSetter(); void PhiSetter(); + vector get_Theta(); double100 Phitilde(double100 y); vector PhitildeMinMaxRange(); double100 Atilde(double100 x); @@ -44,6 +90,7 @@ class WrightFisher { double100 computeLogBeta(int m, int k); double100 NormCDF(double100 x, double100 m, double100 v); double100 DiscretisedNormCDF(int m, double100 t); + double100 LogBinomialCoefficientCalculator(int n, int k); double100 UnconditionedDiffusionDensity(double100 x, double100 y, double100 t, const Options &o); double100 DiffusionDensityApproximationDenom(double100 x, double100 t, @@ -77,9 +124,8 @@ class WrightFisher { pair DrawAncestralProcess(double100 t, const Options &o, boost::random::mt19937 &gen); - pair - DrawAncestralProcessConditionalZero(double100 t, const Options &o, - boost::random::mt19937 &gen); + pair DrawAncestralProcessConditionalZero( + double100 t, const Options &o, boost::random::mt19937 &gen); pair, int> DrawAncestralProcessConditionalInterior( double100 t, double100 x, const Options &o, boost::random::mt19937 &gen); int DrawAncestralProcessG1984(double100 t, boost::random::mt19937 &gen); @@ -128,10 +174,9 @@ class WrightFisher { vector DrawBridgePMFDifferentMutation(double100 s, double100 t, double100 x, const Options &o, boost::random::mt19937 &gen); - vector - DrawBridgePMFDifferentMutationOneQApprox(double100 s, double100 t, - double100 x, const Options &o, - boost::random::mt19937 &gen); + vector DrawBridgePMFDifferentMutationOneQApprox( + double100 s, double100 t, double100 x, const Options &o, + boost::random::mt19937 &gen); vector DrawBridgePMFDifferentMutationApprox(double100 s, double100 t, double100 x, const Options &o, @@ -140,10 +185,9 @@ class WrightFisher { double100 s, double100 t, const Options &o, boost::random::mt19937 &gen); - vector - DrawBridgePMFInteriorMutationOneQApprox(double100 x, double100 z, double100 s, - double100 t, const Options &o, - boost::random::mt19937 &gen); + vector DrawBridgePMFInteriorMutationOneQApprox( + double100 x, double100 z, double100 s, double100 t, const Options &o, + boost::random::mt19937 &gen); vector DrawBridgePMFInteriorMutationApprox(double100 x, double100 z, double100 s, double100 t, const Options &o, @@ -191,37 +235,41 @@ class WrightFisher { bool Absorption, const Options &o, boost::random::mt19937 &gen); - pair - NonNeutralDrawBridgepoint(double100 x, double100 t1, double100 t2, - double100 z, double100 testT, bool Absorption, - const Options &o, boost::random::mt19937 &gen); + pair NonNeutralDrawBridgepoint( + double100 x, double100 t1, double100 t2, double100 z, double100 testT, + bool Absorption, const Options &o, boost::random::mt19937 &gen); /// SIMULATION RUNNER FUNCTIONS void DiffusionRunner(int nSim, double100 x, double100 startT, double100 endT, - bool Absorption, string &Filename, const Options &o, - boost::random::mt19937 &gen); + bool Absorption, string &Filename, + double100 diffusion_threshold, + double100 bridge_threshold); void BridgeDiffusionRunner(int nSim, double100 x, double100 z, double100 startT, double100 endT, double100 sampleT, bool Absorption, - string &Filename, const Options &o, - boost::random::mt19937 &gen); + string &Filename, double100 diffusion_threshold, + double100 bridge_threshold); void DiffusionDensityCalculator(int meshSize, double100 x, double100 startT, double100 endT, bool Absorption, - string &Filename, const Options &o); + string &Filename, + double100 diffusion_threshold, + double100 bridge_threshold); void BridgeDiffusionDensityCalculator(int meshSize, double100 x, double100 z, double100 startT, double100 endT, double100 sampleT, bool Absorption, - string &Filename, const Options &o); + string &Filename, + double100 diffusion_threshold, + double100 bridge_threshold); -private: + private: /// WRIGHT-FISHER PROPERTIES vector thetaP; bool non_neutral; double theta, sigma; int SelectionSetup; - double dominanceParameter, phiMin, phiMax, AtildeMax; + double dominanceParameter; int SelPolyDeg; vector selectionCoeffs; Polynomial SelectionFunction, PhiFunction, AtildeFunction; @@ -230,7 +278,8 @@ class WrightFisher { /// HELPER FUNCTIONS - template T Getlogakm(int k, int m); + template + T Getlogakm(int k, int m); int radiate_from_mode(int index, const double100 t) const; void increment_on_mk(vector &mk, const double100 s, const double100 t) const; @@ -250,10 +299,10 @@ class WrightFisher { int computeE(pair, double100> &C); }; -template T WrightFisher::Getlogakm(int k, int m) { +template +T WrightFisher::Getlogakm(int k, int m) { assert(k >= m); - if (m > static_cast(akm.size()) - 1) - akm.resize(m + 1); + if (m > static_cast(akm.size()) - 1) akm.resize(m + 1); if ((k - m > static_cast(akm[m].size()) - 1)) { int oldsize = static_cast(akm[m].size()); akm[m].resize(k - m + 1, 0); @@ -266,11 +315,11 @@ template T WrightFisher::Getlogakm(int k, int m) { for (int j = 2; j <= i; ++j) { a += log(theta + m + j - 2.0); if (j <= i - m) - a -= log(static_cast(j)); /// We need (n-m)! in the denominator + a -= log(static_cast(j)); /// We need (n-m)! in the denominator if (j <= m) - a -= log(static_cast(j)); /// We need m! in the denominator + a -= log(static_cast(j)); /// We need m! in the denominator } - akm[m][i - m] = a; /// So akm[m] = (a{m,m}, a{m+1,m} a{m+2,m}, ...) + akm[m][i - m] = a; /// So akm[m] = (a{m,m}, a{m+1,m} a{m+2,m}, ...) } } } diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..6f757f1 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1 @@ +from EWF_pybind import * \ No newline at end of file diff --git a/myHelpers.cpp b/src/myHelpers.cpp similarity index 100% rename from myHelpers.cpp rename to src/myHelpers.cpp diff --git a/myHelpers.h b/src/myHelpers.h similarity index 80% rename from myHelpers.h rename to src/myHelpers.h index 9635d15..25fb305 100644 --- a/myHelpers.h +++ b/src/myHelpers.h @@ -21,16 +21,20 @@ bool EqualFirstCoord(const pair &P1, const pair &P2) { } struct Options { - Options() - : w(20), g1984threshold(0.08), bridgethreshold(0.008), eps(0.99), + Options(double diffusion_threshold, double bridge_threshold) + : w(20), + g1984threshold(diffusion_threshold), + bridgethreshold(bridge_threshold), + eps(0.99), debug(0){}; - int w; /// w is the field width for outputting + int w; /// w is the field width for outputting double100 g1984threshold, bridgethreshold, eps; vector thetaP; int debug; }; -template void printVec(const vector &vec, ostream &o = cout) { +template +void printVec(const vector &vec, ostream &o = cout) { for (unsigned int i = 0; i < vec.size(); i++) { o << vec[i] << " "; } @@ -58,24 +62,27 @@ void applyPermutation(const std::vector &order, std::vector &t) { template void applyPermutation(const std::vector &order, std::vector &t, - std::vector &... s) { + std::vector &...s) { applyPermutation(order, t); applyPermutation(order, s...); } template void sortVectors(const std::vector &t, Compare comp, - std::vector &... ss) { + std::vector &...ss) { std::vector order; getSortPermutation(order, t, comp); applyPermutation(order, ss...); } template -void sortVectorsAscending(const std::vector &t, std::vector &... ss) { +void sortVectorsAscending(const std::vector &t, std::vector &...ss) { sortVectors(t, std::less(), ss...); } -template int sgn(T val) { return (T(0) < val) - (val < T(0)); } +template +int sgn(T val) { + return (T(0) < val) - (val < T(0)); +} #endif