Commit 4b0557fe authored by kali's avatar kali
Browse files

1.2.0 - BG/Q compatibility (V.Keller, K.Ali)

git-svn-id: https://svn.vital-it.ch/svn/hp2c/trunk/Codeml_Variants/Fastcodeml@7226 95c5a404-1f88-0410-a6b0-c3f062b6f34a
parent e1013ebc
Parameter optimizers other than "-m 22" are untested and might not converge properly.
1. Parameter optimizers other than "-m 22" are untested and might not converge properly.
2. -nt 1 yields results inconsistent with the test case when specified without MPI
This diff is collapsed.
......@@ -74,10 +74,12 @@ protected:
mMaxIterations(aMaxIterations),
mDependencies(aForest, aVerbose),
mNoParallel(aNoParallel),
mSeed(aSeed),
mRelativeError(aRelativeError),
// mSeed(aSeed),
// mRelativeError(aRelativeError),
mFixedBranchLength(aFixedBranchLength),
mBranches(aNumBranches)
mBranches(aNumBranches),
mSeed(aSeed),
mRelativeError(aRelativeError)
{
setLimits(aNumBranches, static_cast<size_t>(aNumVariables), aFixedBranchLength);
}
......
FastCodeML 1.2.0:
- (Major) BG/Q compatibility (detail below)
- (Minor) Removal of -np option (now controlled by -nt), cleanup of std::cout in main.
---DETAIL
- BranchSiteModel.cpp
> l.52 int to unsigned int
> l379-l386 mFixedBranchLength switch logic (uncommitted change).
- BranchSiteModel.h
> Init order changed
- CMakeLists.txt
> Boost required at 1.55
- CmdLine.cpp + .h
> Removed OPT_FORCE_SERIAL as command line option (replaced with -nt = 1)
> Changed init order
- CompilerHints.h
> Added #defines for __xlC__
- Forest.cpp + .h
> Formatting + cleaning constructor and mAllBranchesFG member.
- Genes.cpp
> Formatting output stream.
- WriteResults.cpp
> Output to cout does not compile on BG/Q - commented out.
- blas.h
> _BGQ_COMPILER #defines
- fast.cpp
> Removal of -np option.
- SETPATHS - example explaining how to set envionment variables per machine.
FastCodeML 1.1.0:
- Few corrections to accept pipe character also in sequence names
- New option to fixed branch lengths (-bl)
......
......@@ -30,8 +30,8 @@ set(SRCS
)
# Search for Boost version 1.42 minimum
set(Boost_ADDITIONAL_VERSIONS "1.42" "1.42.0")
# Search for Boost version 1.55 minimum
set(Boost_ADDITIONAL_VERSIONS "1.42" "1.42.0" "1.55")
find_package(Boost 1.42)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
......
......@@ -128,7 +128,7 @@ void CmdLine::parseCmdLine(int aCnt, char **aVal)
OPT_COMP_TIMES,
OPT_TRACE,
OPT_NUM_THREADS,
OPT_FORCE_SERIAL,
// OPT_FORCE_SERIAL,
OPT_BRANCH_FROM_FILE,
OPT_ONE_HYP_ONLY,
OPT_INIT_H0_FROM_H1,
......@@ -142,8 +142,7 @@ void CmdLine::parseCmdLine(int aCnt, char **aVal)
OPT_CLEAN_DATA,
OPT_NO_PRE_STOP,
OPT_MAX_ITER,
OPT_BRANCH_LENGTH,
// OPT_FG_BRANCHES
OPT_BRANCH_LENGTH
};
// Then the definitions of each command line option
......@@ -182,8 +181,8 @@ void CmdLine::parseCmdLine(int aCnt, char **aVal)
{ OPT_TRACE, "--trace", SO_NONE, "" },
{ OPT_NUM_THREADS, "-nt", SO_REQ_SEP, "Number of threads (1 for non parallel execution)" },
{ OPT_NUM_THREADS, "--number-of-threads", SO_REQ_SEP, "" },
{ OPT_FORCE_SERIAL, "-np", SO_NONE, "Don't use parallel execution" },
{ OPT_FORCE_SERIAL, "--no-parallel", SO_NONE, "" },
//{ OPT_FORCE_SERIAL, "-np", SO_NONE, "Don't use parallel execution" },
//{ OPT_FORCE_SERIAL, "--no-parallel", SO_NONE, "" },
{ OPT_BRANCH_FROM_FILE, "-bf", SO_NONE, "Do only the branch marked in the file as foreground branch" },
{ OPT_BRANCH_FROM_FILE, "--branch-from-file", SO_NONE, "" },
{ OPT_ONE_HYP_ONLY, "-hy", SO_REQ_SEP, "Compute only H0 if 0, H1 if 1" },
......@@ -211,9 +210,7 @@ void CmdLine::parseCmdLine(int aCnt, char **aVal)
{ OPT_MAX_ITER, "-mi", SO_REQ_SEP, "Maximum number of iterations for the maximizer (default: 10000)" },
{ OPT_MAX_ITER, "--max-iterations", SO_REQ_SEP, "" },
{OPT_BRANCH_LENGTH, "-bl", SO_NONE, "The length of the brances is fixed"},
{OPT_BRANCH_LENGTH, "--branch-lengths-fixed", SO_NONE, ""},
//{OPT_ALL_BRANCHES, "-ab", SO_NONE, "Do all the branches as foreground branch (by default it does only the internal branches)"},
//{OPT_ALL_BRANCHES, "--all-branches", SO_NONE, ""},
{OPT_BRANCH_LENGTH, "--branch-lengths-fixed", SO_NONE, ""},
SO_END_OF_OPTIONS
};
......@@ -316,9 +313,9 @@ void CmdLine::parseCmdLine(int aCnt, char **aVal)
mTrace = true;
break;
case OPT_FORCE_SERIAL:
/* case OPT_FORCE_SERIAL:
mForceSerial = true;
break;
break;*/
case OPT_BRANCH_FROM_FILE:
mBranchFromFile = true;
......@@ -381,17 +378,14 @@ void CmdLine::parseCmdLine(int aCnt, char **aVal)
case OPT_NUM_THREADS:
mNumThreads = static_cast<unsigned int>(atoi(args.OptionArg()));
if (mNumThreads == 1)
mForceSerial = true;
/* if (mNumThreads == 1)
mForceSerial = true;*/
if (mNumThreads <=0) throw FastCodeMLFatal("Invalid number of threads");
break;
case OPT_BRANCH_LENGTH:
mFixedBranchLength = true;
mBranchLengthsFromFile = true;
break;
/*case OPT_ALL_BRANCHES:
mAllBranchesFG = true;*/
break;
}
}
......
......@@ -22,7 +22,9 @@ static const unsigned int MAX_ITERATIONS=10000;
///
///
class CmdLine
{
{
public:
/// Constructor.
///
......@@ -60,9 +62,10 @@ public:
mInitFromParams(false),
mCleanData(false),
mStopIfNotLRT(true),
mCmdLineImpl(NULL),
mFixedBranchLength(false)//,
// mAllBranchesFG(false)
// mCmdLineImpl(NULL),
mFixedBranchLength(false),
mCmdLineImpl(NULL)
{}
/// Destructor.
......@@ -80,6 +83,8 @@ public:
void parseCmdLine(int aCnt, char **aVal);
public:
double mDeltaValueForGradient; ///< The variable increment to compute gradient (zero means use a hardcoded default value)
double mRelativeError; ///< Relative error to stop maximization
......@@ -101,16 +106,17 @@ public:
bool mBranchLengthsFromFile; ///< The initial value of the branch lengths is taken from the phylo tree file
bool mNoMaximization; ///< Only the first step of the likelihood maximization is taken
bool mTrace; ///< Trace the optimization steps
unsigned int mNumThreads; ///< Number of threads (if 1 the parallelization is disabled)
bool mForceSerial; ///< Disable all parallelism
bool mBranchFromFile; ///< Read the foreground branch to use from the phylo tree file (it is marked as #1)
bool mInitH0fromH1; ///< If set starts the H0 computation from the H1 results
bool mInitFromParams; ///< Initialize times from phylo tree and the other from values hardcoded or entered on the command line
bool mCleanData; ///< Remove ambiguous or missing sites from the MSA (genes)
bool mStopIfNotLRT; ///< Stop H0 maximization when LRT cannot be satisfied
unsigned int mNumThreads; ///< Number of threads (if 1 the parallelization is disabled)
bool mFixedBranchLength; ///<Fixed branch lengths
// bool mAllBranchesFG; ///<Only internal branches as FG barnches
bool mFixedBranchLength; ///<fixed branch lengths
private:
struct CmdLineImpl;
CmdLineImpl* mCmdLineImpl; ///< Implementation so this structure could be used without other modules be aware of its internals
......
......@@ -39,6 +39,15 @@
#define RESTRICT
//#define PURE
#elif defined(__xlC__)
#define ALIGN64
#define RESTRICT
#elif defined(__xlc__)
#define ALIGN64
#define RESTRICT
#else
#warning "Unknown compiler detected"
#define ALIGN64
......
......@@ -285,7 +285,7 @@ bool Forest::getBranchRange(const CmdLine& aCmdLine, size_t& aBranchStart, size_
else if(aCmdLine.mBranchStart < UINT_MAX && aCmdLine.mBranchStart >= num_branches)
{
// Invalid start value, ignoring, do all branches
if(aCmdLine.mVerboseLevel >= VERBOSE_INFO_OUTPUT) std::cout << std::endl << "Invalid branch requested. Ignoring" << std::endl;
if(aCmdLine.mVerboseLevel >= VERBOSE_INFO_OUTPUT) std::cout << std::endl << "Invalid branch requested. Ignoring" << std::endl;
aBranchStart = 0;
aBranchEnd = num_branches-1;
}
......@@ -302,7 +302,7 @@ bool Forest::getBranchRange(const CmdLine& aCmdLine, size_t& aBranchStart, size_
aBranchStart = static_cast<size_t>(aCmdLine.mBranchStart);
if(aCmdLine.mBranchEnd >= num_branches)
{
if(aCmdLine.mVerboseLevel >= VERBOSE_INFO_OUTPUT) std::cout << std::endl << "Invalid end branch requested. Ignoring" << std::endl;
if(aCmdLine.mVerboseLevel >= VERBOSE_INFO_OUTPUT) std::cout << std::endl << "Invalid end branch requested. Ignoring" << std::endl;
aBranchEnd = num_branches-1;
if(aBranchStart > 0) do_all = false;
}
......@@ -622,7 +622,7 @@ void Forest::addAggressiveReduction(ForestNode* aNode)
#ifdef NON_RECURSIVE_VISIT
void Forest::prepareNonRecursiveVisit(void)
{
// Clean the list for non-recursive visit to the trees. Clear also the list of respective parents
......@@ -673,7 +673,7 @@ void Forest::prepareNonRecursiveVisitWalker(ForestNode* aNode, ForestNode* aPare
// Store the nodes in the visit order except the root that should not be visited
// Store also the respective parent node
if(aParentNode)
{
{
aVisitList.push_back(aNode);
aParentList.push_back(aParentNode);
}
......
......@@ -34,12 +34,11 @@ class Forest
public:
/// Constructor
///
/// @param[in] aVerbose The verbosity level
/// @param[in] aVerbose The verbosity level
///
explicit Forest(unsigned int aVerbose=0/*,
bool aOnlyInternalBranchFG=false*/)
explicit Forest(unsigned int aVerbose=0)
: mNumSites(0), mCodonFreq(NULL), mInvCodonFreq(NULL), mInv2CodonFreq(NULL),
mNumBranches(0), mNumInternalBranches(0), mMarkedInternalBranch(UINT_MAX), mVerbose(aVerbose)/*, mOnlyInternalBranchFG(aOnlyInternalBranchFG)*/ {}
mNumBranches(0), mNumInternalBranches(0), mMarkedInternalBranch(UINT_MAX), mVerbose(aVerbose) {}
/// Destructor
///
......@@ -371,11 +370,6 @@ private:
#endif
unsigned int mVerbose; ///< If greater than zero prints more info
std::multimap<size_t, size_t> mSitesMappingToOriginal; ///< Map reduced site num. to list of corresponding original sites.
/*protected:
bool mAllBranchesFG; ///< Only internal branches to be processed*/
};
#endif
......
......@@ -285,6 +285,8 @@ void Genes::readFile(const char* aFilename, bool aCleanData)
std::cout << "Sites: " << std::setw(6) << mSiteMultiplicity.size() << "/" << ncodons << std::endl;
int multi_codons = static_cast<int>(std::count_if(codon_multiplicity.begin(), codon_multiplicity.end(), std::bind2nd(std::greater<unsigned int>(), 1)));
std::cout << "Multi codons: " << std::setw(6) << multi_codons << "/" << ncodons << std::endl;
std::cout << std::endl<<"------------------------------------"<<std::endl;
}
if(mVerboseLevel >= VERBOSE_MORE_DEBUG)
{
......
#!/bin/bash
#Environment variables for variety of example machines
#Please set these paths according to your system!
# 1) Local linux
export BLAS_LIB_DIR="/home/userid/lib" #Path to BLAS library
export LAPACK_LIB_DIR="/home/userid/lib" #Path to LAPACK library
export NLOPT_LIB_DIR="/home/userid/lib/nlopt/lib" #Path to NLopt
export NLOPT_INCLUDE_DIR="/home/userid/lib/nlopt/include"
export MATH_LIB_NAMES="blas;lapack;lapack;blas;gfortranbegin;gfortran" #Change if your BLAS library is not libblas.a or if your LAPACK library is not liblapack.a. gfortranbegin/gfortran needed for GCC gfortran.
export CXX="/usr/bin/mpicxx.mpich2" #Set this if using MPI
# 2) BG /Q
export BLAS_LIB_DIR="/bgsys/local/lib64;/opt/ibmcmp/xlf/bg/14.1/lib64"
export LAPACK_LIB_DIR="/bgsys/local/lib64;/opt/ibmcmp/xlf/bg/14.1/lib64"
export NLOPT_LIB_DIR="/home/kali/FastCodeML-1.2.0/FCM-10.06.2014/nlopt-release/lib"
export NLOPT_INCLUDE_DIR="/home/kali/FastCodeML-1.2.0/FCM-10.06.2014/nlopt-release/include"
export MATH_LIB_NAMES="esslbg;lapack;m;xlf90_r;xl;xlfmath;esslbg;dl"
export BOOST_ROOT="/home/kali/FastCodeML-1.2.0/FCM-10.06.2014/boost-release"
export INCLUDE_DIR_MKL="/bgsys/ibm_essl/prod/opt/ibmmath/essl/5.1/include"
export CXX="/bgsys/drivers/ppcfloor/comm/xl/bin/mpixlcxx"
export CXXFLAGS="-qstrict -qthreaded -qhalt=e -D_BGQ_COMPILER"
export LDFLAGS="-static"
# 3) Vital-IT
export BLAS_LIB_DIR="/software/Utility/OpenBLAS/0.2.5/lib"
export LAPACK_LIB_DIR="/software/Utility/OpenBLAS/0.2.5/include"
export NLOPT_LIB_DIR="/software/Utility/nlopt/2.3/lib"
export NLOPT_INCLUDE_DIR="/software/Utility/nlopt/2.3/include"
export MATH_LIB_NAMES="openblas;lapack;gfortranbegin;gfortran"
export BOOST_ROOT="/software/lib64/"
export CXX="/home/kali/lib/mpi/bin/mpicxx"
......@@ -4,7 +4,7 @@
#include <fstream>
#include <limits>
#include "WriteResults.h"
#include <string>
#include <string>
void WriteResults::outputResults(void)
{
......@@ -13,7 +13,7 @@ void WriteResults::outputResults(void)
// Range of branches to be output (for H0 and H1)
std::map<size_t, double>::const_iterator im;
std::map<size_t, std::string>::const_iterator ims;
std::map<size_t, std::string>::const_iterator ims;
size_t min_branch = std::numeric_limits<size_t>::max();
size_t max_branch = 0;
......@@ -42,6 +42,8 @@ void WriteResults::outputResults(void)
}
// Write the log-likelihood values (if a value is not present, write NA)
for(size_t branch = min_branch; branch <= max_branch; ++branch)
{
out << "Branch: " << std::setw(4) << branch<<std::endl<< std::endl<< " LnL0: ";
......@@ -55,9 +57,10 @@ void WriteResults::outputResults(void)
else
{
out << std::setw(22) << std::setprecision(15) << std::fixed << im->second;
ims = mParamStr[0].find(branch);
out << std::endl<< std::fixed <<"Branch lengths:" << ims->second << std::endl;
ims = mParamStr[0].find(branch);
// This output does not work on BG/Q.
//out << std::endl<< std::fixed <<"Branch lengths:" << ims->second << std::endl;
}
out << " LnL1: ";
......@@ -70,8 +73,8 @@ void WriteResults::outputResults(void)
else
{
out << std::setw(22) << std::setprecision(15) << std::fixed << im->second;
ims = mParamStr[1].find(branch);
ims = mParamStr[1].find(branch);
out << std::endl<< std::fixed <<"Branch lengths:" <<ims->second << std::endl;
}
out << std::endl;
......@@ -137,8 +140,8 @@ void WriteResults::savePositiveSelSites(size_t aFgBranch, const std::vector<unsi
// Save the positive selection sites and corresponding probabilities for later printing
mPositiveSelSites[aFgBranch] = std::make_pair(aPositiveSelSites, aPositiveSelSitesProb);
}
}
void WriteResults::saveParameters(size_t aFgBranch, std::string& aParamStr, unsigned int aHypothesis)
{
// If no file set, then do nothing
......
......@@ -29,11 +29,16 @@
#ifdef _BGQ_COMPILER
#define dsyevr_ dsyevr
#define ddot_ ddot
#define dnrm2_ dnrm2
#define dscal_ dscal
#define dsyrk_ dsyrk
#define dsymv_ dsymv
#endif
#ifdef __cplusplus
extern "C" {
extern "C" {
#endif
/// DSYRK performs one of the symmetric rank k operations
......@@ -292,15 +297,15 @@ double ddot_(const int *n,
/// Computes the Euclidean norm of a vector.
///
///
/// DNRM2 computes the Euclidean (L2) norm of a double precision real vector
///
/// @param[in] n Number of elements in the operand vector.
/// @param[in] dx Array of dimension (n-1) * |incx| + 1. Array x contains the operand vector.
/// @param[in] incx Increment between elements of x.
///
///
/// @return Resulting Euclidean norm.
///
///
double dnrm2_(const int *n,
const double *dx,
const int *incx);
......
......@@ -26,7 +26,7 @@
#include "BranchSiteModel.h"
#include "ParseParameters.h"
#include "VerbosityLevels.h"
#include "WriteResults.h"
#include "WriteResults.h"
#ifndef VTRACE
#ifdef _OPENMP
......@@ -49,14 +49,14 @@
///
/// @param[in] aRgc Number of command line parameters
/// @param[in] aRgv Command line parameters
///
const char* version="1.1.0";
///
const char* version="1.2.0";
int main(int aRgc, char **aRgv)
{
try
{
{
#ifdef USE_MKL_VML
// If used, intitialize the MKL VML library
......@@ -74,39 +74,51 @@ int main(int aRgc, char **aRgv)
// Adjust and report the number of threads that will be used
#ifdef _OPENMP
int num_threads = omp_get_max_threads();
//std::cout<<"max num of thr: "<< num_threads <<std::endl;
if(num_threads < 2 || cmd.mForceSerial || cmd.mNumThreads == 1)
{
int num_threads = omp_get_max_threads();
//std::cout<<"max num of thr: "<< num_threads <<std::endl;
if((cmd.mNumThreads >=1)&&(cmd.mNumThreads <= (unsigned int)num_threads))
num_threads = cmd.mNumThreads;
// std::cout<<"num of thr: "<< num_threads <<std::endl;
omp_set_num_threads(num_threads);
/*if (num_threads < 2)
cmd.mForceSerial = true;
num_threads = 1;
}
else if((cmd.mNumThreads >1)&&(cmd.mNumThreads <= num_threads))
{
num_threads = cmd.mNumThreads;
}
// std::cout<<"num of thr: "<< num_threads <<std::endl;
omp_set_num_threads(num_threads);
#else
else
cmd.mForceSerial = false;*/
#else
cmd.mNumThreads=1;
int num_threads = 1;
int num_threads = 1;
cmd.mForceSerial = true;
#endif
#endif
/*#ifdef _OPENMP
int num_threads = omp_get_max_threads();
if(num_threads < 2 || cmd.mForceSerial)
{
cmd.mForceSerial = true;
num_threads = 1;
omp_set_num_threads(1);
}
#else
cmd.mForceSerial = true;
int num_threads = 1;
#endif*/
#ifdef USE_MPI
// Shutdown messages from all MPI processes except the master
if(!hlc.isMaster()) cmd.mVerboseLevel = VERBOSE_NONE;
#endif
std::cout <<std::endl<<"------------------"<< std::endl<<"FastCodeML V"<<version<<std::endl<<"------------------"<<std::endl;
#endif
// std::cout <<std::endl<<"------------------"<< std::endl<<"FastCodeML V"<<version<<std::endl<<"------------------"<<std::endl;
// Write out command line parameters (if not quiet i.e. if verbose level > 0)
if(cmd.mVerboseLevel >= VERBOSE_INFO_OUTPUT)
{
std::cout << std::endl;
std::cout << "------------------------------------" << std::endl;
std::cout << "FastCodeML V"<<version << std::endl;
std::cout << "------------------------------------"<<std::endl;
std::cout << std::endl;
std::cout << "Tree file: " << cmd.mTreeFile << std::endl;
std::cout << "Gene file: " << cmd.mGeneFile << std::endl;
std::cout << "Verbose level: " << cmd.mVerboseLevel << " (" << decodeVerboseLevel(cmd.mVerboseLevel) << ')' << std::endl;
......@@ -139,7 +151,7 @@ int main(int aRgc, char **aRgv)
if(cmd.mDeltaValueForGradient > 0.0) std::cout << "Delta value: " << cmd.mDeltaValueForGradient << std::endl;
std::cout << "Relative error: " << cmd.mRelativeError << std::endl;
if(cmd.mResultsFile) std::cout << "Results file: " << cmd.mResultsFile << std::endl;
if(cmd.mNumThreads) std::cout << "Number of threads: " << cmd.mNumThreads << std::endl;
if(cmd.mNumThreads) std::cout << "Number of threads: " << cmd.mNumThreads << std::endl;
if(cmd.mFixedBranchLength) std::cerr << "Branch lengths are fixed" << std::endl;
#ifdef _OPENMP
if(num_threads > 1)
......@@ -210,7 +222,7 @@ int main(int aRgc, char **aRgv)
if(cmd.mVerboseLevel >= VERBOSE_INFO_OUTPUT) timer.start();
// Create the forest
Forest forest(cmd.mVerboseLevel/*, cmd.mOnlyInternalBranchFG*/);
Forest forest(cmd.mVerboseLevel);
// Enclose file loading into a block so temporary structures could be deleted when no more needed
{
......@@ -376,11 +388,11 @@ int main(int aRgc, char **aRgv)
std::cout << "(Doesn't pass LRT, skipping)";
std::cout << " Function calls: " << h0.getNumEvaluations() << " ";
std::cout << std::endl << std::endl;
if(lnl0 != std::numeric_limits<double>::infinity())
{
std::string s0 = h0.printFinalVars(std::cout);
//std::cout<<"EDW0: "<< s0 <<std::endl;
output_results.saveParameters(fg_branch, s0, 0);
if(lnl0 != std::numeric_limits<double>::infinity())
{
std::string s0 = h0.printFinalVars(std::cout);
//std::cout<<"EDW0: "<< s0 <<std::endl;
output_results.saveParameters(fg_branch, s0, 0);
}
std::cout << std::endl;
}
......@@ -393,11 +405,11 @@ int main(int aRgc, char **aRgv)
std::cout << std::setprecision(15) << std::fixed << lnl1;
std::cout << " Function calls: " << h1.getNumEvaluations();
std::cout << std::endl << std::endl;
if(lnl1 != std::numeric_limits<double>::infinity())
{
std::string s1= h1.printFinalVars(std::cout);
//std::cout<<"EDW1: "<< s1 <<std::endl;
output_results.saveParameters(fg_branch, s1, 1);
if(lnl1 != std::numeric_limits<double>::infinity())
{
std::string s1= h1.printFinalVars(std::cout);
//std::cout<<"EDW1: "<< s1 <<std::endl;
output_results.saveParameters(fg_branch, s1, 1);
}
std::cout << std::endl;
}
......@@ -593,11 +605,8 @@ Usage:
-r --trace (no argument)
Trace the maximization run
-nt --number-of-threads (required argument)
Number of threads (1 for non parallel execution)
-np --no-parallel (no argument)
Don't use parallel execution
-nt --number-of-threads (required argument)
Number of threads (1 for non parallel execution)
-bf --branch-from-file (no argument)
Do only the branch marked in the file as foreground branch
......@@ -636,9 +645,9 @@ Usage:
Don't stop H0 maximization even if it cannot satisfy LRT (default: stop)
-mi --max-iterations (required argument)
Maximum number of iterations for the maximizer (default: 10000)
-bl --branch-lengths-fixed (no argument)
Maximum number of iterations for the maximizer (default: 10000)
-bl --branch-lengths-fixed (no argument)
The length of the brances is fixed
@endverbatim
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment