This is an automated email from the git hooks/post-receive script. tille pushed a commit to branch master in repository beast2-mcmc.
commit 0110375702f870fe075b1f2ccfb8465b9aeab5e7 Author: Andreas Tille <[email protected]> Date: Wed May 4 09:43:54 2016 +0200 Imported Upstream version 2.4.1pre+dfsg --- build.xml | 23 +++-- examples/testUCLNclock.json | 2 +- release/Linux/bin/beast | 19 +++- release/Mac/install.png | Bin 17518 -> 17128 bytes release/Windows/AppStore_launch4j.xml | 2 +- release/Windows/BEAST_launch4j.xml | 2 +- release/Windows/BEAUti_launch4j.xml | 2 +- release/Windows/LogCombiner_launch4j.xml | 2 +- release/Windows/TreeAnnotator_launch4j.xml | 2 +- release/common/README.txt | 6 +- release/common/VERSION HISTORY.txt | 29 +++++- src/beast/app/BEASTVersion.java | 4 +- src/beast/app/beastapp/BeastLauncher.java | 56 ++++++++--- src/beast/app/beastapp/BeastMain.java | 10 +- src/beast/app/beauti/AlignmentListInputEditor.java | 52 +++++----- src/beast/app/beauti/Beauti.java | 47 ++++++--- src/beast/app/beauti/BeautiAlignmentProvider.java | 12 ++- src/beast/app/beauti/BeautiDoc.java | 101 +++++++++---------- src/beast/app/beauti/BeautiLauncher.java | 2 + src/beast/app/beauti/BeautiPanelConfig.java | 2 +- src/beast/app/beauti/GuessPatternDialog.java | 12 ++- src/beast/app/beauti/JPackageDialog.java | 6 +- src/beast/app/beauti/TaxonSetInputEditor.java | 36 ++++--- src/beast/app/beauti/TipDatesInputEditor.java | 2 +- src/beast/app/draw/InputEditorFactory.java | 2 +- src/beast/app/draw/ListInputEditor.java | 5 +- .../treeannotator/KernelDensityEstimator2D.java | 2 +- src/beast/app/treeannotator/RealNumberField.java | 2 +- src/beast/app/util/Utils.java | 107 +++++++++++++++++++++ src/beast/app/util/Utils6.java | 12 +++ src/beast/core/Input.java | 4 + src/beast/core/Logger.java | 7 +- src/beast/core/OperatorSchedule.java | 2 - .../evolution/likelihood/BeagleTreeLikelihood.java | 80 ++++++++++++--- .../likelihood/ThreadedTreeLikelihood.java | 4 +- src/beast/evolution/likelihood/TreeLikelihood.java | 2 +- .../evolution/operators/DeltaExchangeOperator.java | 72 ++++++++------ src/beast/evolution/operators/SubtreeSlide.java | 2 +- .../evolution/sitemodel/SiteModelInterface.java | 2 +- .../substitutionmodel/DefaultEigenSystem.java | 6 +- .../evolution/substitutionmodel/Frequencies.java | 9 +- src/beast/evolution/tree/RandomTree.java | 6 +- src/beast/util/AddOnManager.java | 78 ++++++++++----- src/beast/util/ClusterTree.java | 3 +- src/beast/util/JSONProducer.java | 25 +++-- src/beast/util/MersenneTwisterFast.java | 4 +- src/beast/util/NexusParser.java | 2 +- src/beast/util/Package.java | 2 +- src/beast/util/PackageDependency.java | 2 +- src/beast/util/Randomizer.java | 2 +- src/beast/util/TreeParser.java | 3 +- src/beast/util/XMLProducer.java | 4 + .../operator/DeltaExchangeOperatorTest.java | 64 ++++++++++++ .../beast/evolution/operator/TestOperator.java | 52 ++++++++++ src/test/beast/util/JSONTest.java | 6 +- templates/ClockModels.xml | 14 +-- templates/Standard.xml | 2 +- templates/StarBeast.xml | 4 +- version.xml | 2 +- 59 files changed, 750 insertions(+), 276 deletions(-) diff --git a/build.xml b/build.xml index 821d599..ee8e6f8 100644 --- a/build.xml +++ b/build.xml @@ -90,6 +90,7 @@ <delete file="${build}/beast/app/treeannotator/TreeAnnotatorLauncher.class" /> <delete file="${build}/beast/app/util/Utils6.class" /> <delete file="${build}/beast/app/BEASTVersion.class" /> + <delete file="${build}/beast/app/util/Version.class" /> <javac source="1.6" target="1.6" bootclasspath='/opt/jdk1.6.0_45/jre/lib/rt.jar' @@ -103,6 +104,7 @@ <include name="beast/**/*Launcher.java" /> <include name="beast/**/Utils6.java" /> <include name="beast/**/BEASTVersion.java" /> + <include name="beast/**/Version.java" /> </javac> <copy todir="${build}"> <fileset dir="${src}" includes="**/*.properties" /> @@ -111,7 +113,7 @@ <echo message="Successfully compiled." /> </target> - <!-- make the beast.jar and beauti.jar --> + <!-- make the beast.jar --> <target name="dist_all_BEAST" depends="compile-all" description="create BEAST jar"> <!-- Create the distribution directory --> <mkdir dir="${dist}" /> @@ -140,6 +142,7 @@ <include name="beast/**/*Launcher.class" /> <include name="beast/**/Utils6*.class" /> <include name="beast/**/BEASTVersion.class" /> + <include name="beast/**/Version.class" /> <include name="beast/app/draw/icons/beauti.png"/> </fileset> </jar> @@ -160,7 +163,7 @@ <copy file="${dist}/beast.jar" todir="${release_dir}/package/lib/"/> <copy file="../beast2/version.xml" todir="${release_dir}/package/"/> - <jar jarfile="${release_dir}/package/beast.package.${version}.jar"> + <jar jarfile="${release_dir}/package/beast.package.${version}.zip"> <fileset dir="${release_dir}/package"> <include name="version.xml" /> <include name="lib/beast.jar" /> @@ -237,7 +240,7 @@ <property name="version" value="2.4.0" /> <property name="version_number" value="2.4.0" /> <property name="release_dir" value="release" /> - <property name="copyright" value="Beast 2 development team 2011-2015" /> + <property name="copyright" value="Beast 2 development team 2011-2016" /> <property name="BEAST_name" value="BEAST" /> <property name="beast_name" value="beast" /> @@ -379,6 +382,7 @@ <zip destfile="${Windows_dir}/${BEAST_name}.v${version}.zip"> <zipfileset dir="${Windows_package_dir}" prefix="${BEAST_name}" /> </zip> + <copy file="${Windows_dir}/${BEAST_name}.v${version}.zip" todir="../../tmp/" /> <echo message="Windows version release is finished." /> </target> @@ -441,10 +445,14 @@ </tar>--> <!-- [ANT Bug 550] the tar task change the mode of the executables files, have to tar manaully --> <echo message="Have to tar manaully, because [ANT Bug 550] the tar task change the mode of the executables files." /> - <!-- tar -cvzf BEASTv1.x.x.tgz BEASTv1.x.x/ --> - <!-- cksum BEASTv1.x.x.tgz --> - <!-- tar -xvzf BEASTv1.x.x.tgz --> + <!-- tar -cvzf BEASTv1.x.x.tgz BEASTv2.x.x/ --> + <!-- cksum BEASTv2.x.x.tgz --> + <!-- tar -xvzf BEASTv2.x.x.tgz --> <echo message="Linux/Unix version release is finished." /> + + <echo message="cd release/Linux"/> + <echo message="tar fcz BEAST.v${version}.tgz beast"/> + <echo message="cp BEAST.v${version}.tgz ~/tmp"/> </target> <!-- Define the appbundler task --> @@ -661,6 +669,9 @@ </exec> <delete file="${Mac_dir}/pack.temp.dmg"/> + + <copy file="${Mac_dir}/${BEAST_name} v${version}.dmg" tofile="../../tmp/${Mac_dir}/${BEAST_name}.v${version}.dmg" /> + <echo message="Mac version release is finished." /> </target> diff --git a/examples/testUCLNclock.json b/examples/testUCLNclock.json index 7f90251..5bfbeb6 100644 --- a/examples/testUCLNclock.json +++ b/examples/testUCLNclock.json @@ -1,4 +1,4 @@ -{version: "2.3", +{version: "2.4", namespace: "beast.core:beast.evolution.alignment:beast.evolution.tree.coalescent:beast.core.util:beast.evolution.nuc:beast.evolution.operators:beast.evolution.sitemodel:beast.evolution.substitutionmodel:beast.evolution.likelihood", beast: [ diff --git a/release/Linux/bin/beast b/release/Linux/bin/beast index c6ee8c9..c947df4 100755 --- a/release/Linux/bin/beast +++ b/release/Linux/bin/beast @@ -29,4 +29,21 @@ if [ -z "$JAVA_HOME" ]; then else JAVA=$JAVA_HOME/bin/java fi -$JAVA -Xms64m -Xmx4g -cp "$BEAST_LIB/launcher.jar" beast.app.beastapp.BeastLauncher $* + + +# use BEAGL_LIB if the BEAGLE library is not in a standard location +if [ -n "$BEAGLE_LIB" ]; then + if [ -n "$BEAST_EXTRA_LIBS" ]; then + BEAST_EXTRA_LIBS=$BEAST_EXTRA_LIBS:$BEAGLE_LIB + else + BEAST_EXTRA_LIBS=$BEAGLE_LIB + fi +fi + +# use BEAST_EXTRA_LIBS variable to load BEAGLE and other libraries from non-default locations +# this assumes that the library path contains all these libraries (or are set through LD_LIBRARY_PATH) +if [ -n "$BEAST_EXTRA_LIBS" ]; then + $JAVA -Xms64m -Xmx4g -Djava.library.path=$BEAST_EXTRA_LIBS -cp "$BEAST_LIB/launcher.jar" beast.app.beastapp.BeastLauncher $* +else + $JAVA -Xms64m -Xmx4g -cp "$BEAST_LIB/launcher.jar" beast.app.beastapp.BeastLauncher $* +fi diff --git a/release/Mac/install.png b/release/Mac/install.png index a409bf5..5649f43 100755 Binary files a/release/Mac/install.png and b/release/Mac/install.png differ diff --git a/release/Windows/AppStore_launch4j.xml b/release/Windows/AppStore_launch4j.xml index 0861c65..7426414 100644 --- a/release/Windows/AppStore_launch4j.xml +++ b/release/Windows/AppStore_launch4j.xml @@ -13,7 +13,7 @@ </jre> <versionInfo> <fileDescription>AppStore</fileDescription> - <copyright>Beast 2 development team 2002-2015</copyright> + <copyright>Beast 2 development team 2002-2016</copyright> <productName>AppStore</productName> <internalName>AppStore</internalName> <originalFilename>AppStore.exe</originalFilename> diff --git a/release/Windows/BEAST_launch4j.xml b/release/Windows/BEAST_launch4j.xml index 5e7d5ca..ae6145c 100644 --- a/release/Windows/BEAST_launch4j.xml +++ b/release/Windows/BEAST_launch4j.xml @@ -13,7 +13,7 @@ </jre> <versionInfo> <fileDescription>BEAST2</fileDescription> - <copyright>Beast 2 development team 2002-2015</copyright> + <copyright>Beast 2 development team 2002-2016</copyright> <productName>BEAST2</productName> <internalName>BEAST2</internalName> <originalFilename>BEAST2.exe</originalFilename> diff --git a/release/Windows/BEAUti_launch4j.xml b/release/Windows/BEAUti_launch4j.xml index e7b1f5d..c806677 100644 --- a/release/Windows/BEAUti_launch4j.xml +++ b/release/Windows/BEAUti_launch4j.xml @@ -13,7 +13,7 @@ </jre> <versionInfo> <fileDescription>BEAUti2</fileDescription> - <copyright>Beast 2 development team 2002-2015</copyright> + <copyright>Beast 2 development team 2002-2016</copyright> <productName>BEAUti2</productName> <internalName>BEAUti2</internalName> <originalFilename>BEAUti2.exe</originalFilename> diff --git a/release/Windows/LogCombiner_launch4j.xml b/release/Windows/LogCombiner_launch4j.xml index 40e6fff..acf9b92 100644 --- a/release/Windows/LogCombiner_launch4j.xml +++ b/release/Windows/LogCombiner_launch4j.xml @@ -13,7 +13,7 @@ </jre> <versionInfo> <fileDescription>LogCombiner</fileDescription> - <copyright>Beast 2 development team 2002-2015</copyright> + <copyright>Beast 2 development team 2002-2016</copyright> <productName>LogCombiner</productName> <internalName>LogCombiner</internalName> <originalFilename>LogCombiner.exe</originalFilename> diff --git a/release/Windows/TreeAnnotator_launch4j.xml b/release/Windows/TreeAnnotator_launch4j.xml index 02982d1..be58c4f 100644 --- a/release/Windows/TreeAnnotator_launch4j.xml +++ b/release/Windows/TreeAnnotator_launch4j.xml @@ -12,7 +12,7 @@ </jre> <versionInfo> <fileDescription>TreeAnnotator</fileDescription> - <copyright>Beast 2 development team 2002-2015</copyright> + <copyright>Beast 2 development team 2002-2016</copyright> <productName>TreeAnnotator</productName> <internalName>TreeAnnotator</internalName> <originalFilename>TreeAnnotator.exe</originalFilename> diff --git a/release/common/README.txt b/release/common/README.txt index a19fbfb..bf68ffb 100644 --- a/release/common/README.txt +++ b/release/common/README.txt @@ -1,7 +1,7 @@ - BEAST v2.3.2 2015 - Beast 2 development team 2011-2015 + BEAST v2.4.0 2016 + Beast 2 development team 2011-2016 -Last updated: December 2015 +Last updated: March 2016 Contents: 1) INTRODUCTION diff --git a/release/common/VERSION HISTORY.txt b/release/common/VERSION HISTORY.txt index d5399e0..77610f2 100644 --- a/release/common/VERSION HISTORY.txt +++ b/release/common/VERSION HISTORY.txt @@ -1,10 +1,33 @@ - BEAST v2.3.2 2015 - Beast 2 development team 2011-2015 + BEAST v2.4.0 2016 + Beast 2 development team 2011-2016 Version History -Last updated: December 2015 +Last updated: March 2016 All issues can be viewed at https://github.com/CompEvol/beast2/issues ================================================================================ +Version 2.4.0 February 2016 + BEAST improved performance + up to 2x faster when using proportion invariant sites + improved threading support + "instances" flag replaces beagle_instances + faster MRCAPrior handling + StartBeastStartState works with calibrations with other than CalibratedYule + + BEAUti + show mean of parametric distributions in priors panel + better taxon management preventing adding numbers to taxon names + improved layout tip dates panel + improved package list errors + *BEAST clock cloning fix + Allow setting branch length as substitution option on tree logger + Improved JSON support + + Package manager + Allow BEAST to be upgraded as a package + Improved GUI + + For developers: http://beast2.org/2016/02/04/what-will-change-in-v2-4-0-for-developers/ + Version 2.3.2 December 2015 BEAUti path corrected so Standard and StarBeast templates are visible under templates menu diff --git a/src/beast/app/BEASTVersion.java b/src/beast/app/BEASTVersion.java index 239cefa..999d551 100644 --- a/src/beast/app/BEASTVersion.java +++ b/src/beast/app/BEASTVersion.java @@ -19,9 +19,9 @@ public class BEASTVersion extends Version { /** * Version string: assumed to be in format x.x.x */ - private static final String VERSION = "2.3.2"; + private static final String VERSION = "2.4.0"; - private static final String DATE_STRING = "2002-2015"; + private static final String DATE_STRING = "2002-2016"; private static final boolean IS_PRERELEASE = true; diff --git a/src/beast/app/beastapp/BeastLauncher.java b/src/beast/app/beastapp/BeastLauncher.java index 84b9515..c162ab0 100644 --- a/src/beast/app/beastapp/BeastLauncher.java +++ b/src/beast/app/beastapp/BeastLauncher.java @@ -1,34 +1,39 @@ package beast.app.beastapp; + import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.net.URLDecoder; -import java.nio.file.Files; import javax.swing.JOptionPane; import beast.app.BEASTVersion; import beast.app.util.Utils; -import beast.core.util.Log; +import beast.app.util.Utils6; /** * Loads beast.jar and launches BEAST through the BEASTMain class * * This class should be compiled against 1.6 and packaged by itself. The - * remained of BEAST can be compiled against Java 1.8 + * remainder of BEAST can be compiled against Java 1.8 * **/ public class BeastLauncher { public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException { if (javaVersionCheck("BEAST")) { loadBEASTJars(); + Utils.testCudaStatusOnMac(); BeastMain.main(args); } } @@ -51,7 +56,7 @@ public class BeastLauncher { String launcherJar = clu.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); // deal with special characters and spaces in path launcherJar = URLDecoder.decode(launcherJar, "UTF-8"); - Log.warning.println("jardir = " + launcherJar); + System.err.println("jardir = " + launcherJar); File jarDir0 = new File(launcherJar).getParentFile(); while ((!foundOne) && (jarDir0 != null)) { // && jarDir0.exists() && // jarDir0.isDirectory()) { @@ -67,7 +72,7 @@ public class BeastLauncher { } if (!foundOne) { - Log.warning.println("WARNING: could not find beast.jar"); + System.err.println("WARNING: could not find beast.jar"); // if beast.jar or its classes are not already in the class path (as is when launched e.g. as developer) // the next line will fail } @@ -80,6 +85,10 @@ public class BeastLauncher { private static void createBeastPackage(File jarDir0, String pathDelimiter) { try { + if (jarDir0.toString().toLowerCase().endsWith("lib")) { + jarDir0 = jarDir0.getParentFile(); + } + // create package user dir, if it not already exists File dir = new File(getPackageUserDir() + pathDelimiter + "BEAST" + pathDelimiter + "lib"); if (!dir.exists()) { @@ -91,17 +100,17 @@ public class BeastLauncher { File beastJar = new File(jarDir0 + pathDelimiter + "lib" + pathDelimiter + "beast.jar"); File target = new File(dir + pathDelimiter + "beast.jar"); - Files.copy(beastJar.toPath(), target.toPath()); + copyFileUsingStream(beastJar, target); String version = "<addon name='BEAST' version='" + (new BEASTVersion()).getVersion() + "'>\n" + "</addon>"; - FileWriter outfile = new FileWriter(getPackageUserDir() + pathDelimiter + "beast" + pathDelimiter + "version.xml"); + FileWriter outfile = new FileWriter(getPackageUserDir() + pathDelimiter + "BEAST" + pathDelimiter + "version.xml"); outfile.write(version); outfile.close(); File beastSrcJar = new File(jarDir0 + pathDelimiter + "lib" + pathDelimiter + "beast.src.jar"); File srcTarget = new File(dir + pathDelimiter + "beast.src.jar"); - Files.copy(beastSrcJar.toPath(), srcTarget.toPath()); + copyFileUsingStream(beastSrcJar, srcTarget); // TODO: include templates? // if so, how to prevent clashes with templates in package and in installation dir? @@ -112,9 +121,27 @@ public class BeastLauncher { } } - + + // copy files using Java 6 code + private static void copyFileUsingStream(File source, File dest) throws IOException { + + InputStream is = null; + OutputStream os = null; + try { + is = new FileInputStream(source); + os = new FileOutputStream(dest); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } finally { + is.close(); + os.close(); + } + } private static boolean checkForBEAST(File jarDir, Object clu) throws IOException { - Log.warning.println("Checking out " + jarDir.getAbsolutePath()); + System.err.println("Checking out " + jarDir.getAbsolutePath()); boolean foundOne = false; if (jarDir.exists()) { URL url = new URL("file://" + (isWindows() ? "/" : "") + jarDir.getAbsolutePath() + "/beast.jar"); @@ -127,7 +154,7 @@ public class BeastLauncher { Method method = sysclass.getDeclaredMethod("addURL", parameters); method.setAccessible(true); method.invoke(sysLoader, new Object[] { url }); - Log.warning.println("Loaded URL " + url); + System.err.println("Loaded URL " + url); foundOne = true; } catch (Throwable t) { t.printStackTrace(); @@ -171,7 +198,7 @@ public class BeastLauncher { } else { JAVA_VERSION_MSG = JAVA_VERSION_MSG.replaceAll("<br>", "\n"); JAVA_VERSION_MSG = JAVA_VERSION_MSG.replaceAll("<[^<]*>", ""); - Log.warning.println(JAVA_VERSION_MSG); + System.err.println(JAVA_VERSION_MSG); } return true; } @@ -189,14 +216,13 @@ public class BeastLauncher { } public static String getPackageUserDir() { - if (System.getProperty("beast.user.package.dir") != null) return System.getProperty("beast.user.package.dir"); - if (Utils.isWindows()) { + if (Utils6.isWindows()) { return System.getProperty("user.home") + "\\BEAST\\" + (new BEASTVersion()).getMajorVersion(); } - if (Utils.isMac()) { + if (Utils6.isMac()) { return System.getProperty("user.home") + "/Library/Application Support/BEAST/" + (new BEASTVersion()).getMajorVersion(); } // Linux and unices diff --git a/src/beast/app/beastapp/BeastMain.java b/src/beast/app/beastapp/BeastMain.java index 51ba2b6..b7f1807 100644 --- a/src/beast/app/beastapp/BeastMain.java +++ b/src/beast/app/beastapp/BeastMain.java @@ -257,7 +257,7 @@ public class BeastMain { new Arguments.Option("validate", "Parse the XML, but do not run -- useful for debugging XML"), // RRB: not sure what effect this option has new Arguments.IntegerOption("errors", "Specify maximum number of numerical errors before stopping"), - new Arguments.IntegerOption("threads", "The number of computational threads to use (default auto)"), + new Arguments.IntegerOption("threads", "The number of computational threads to use (default 1), -1 for number of cores"), new Arguments.Option("java", "Use Java only, no native implementations"), new Arguments.Option("noerr", "Suppress all output to standard error"), new Arguments.StringOption("loglevel", "LEVEL", "error,warning,info,debug,trace"), @@ -273,6 +273,7 @@ public class BeastMain { new Arguments.StringOption("beagle_scaling", new String[]{"default", "none", "dynamic", "always"}, false, "BEAGLE: specify scaling scheme to use"), new Arguments.Option("help", "Print this information and stop"), + new Arguments.Option("version", "Print version and stop"), }); try { @@ -285,6 +286,11 @@ public class BeastMain { System.exit(1); } + if (arguments.hasOption("version")) { + Log.info.println((new BEASTVersion()).getVersionString()); + System.exit(0); + } + if (arguments.hasOption("help")) { printUsage(arguments); System.exit(0); @@ -304,7 +310,7 @@ public class BeastMain { long seed = Randomizer.getSeed(); boolean useJava = false; - int threadCount = 0; + int threadCount = 1; if (arguments.hasOption("java")) { useJava = true; diff --git a/src/beast/app/beauti/AlignmentListInputEditor.java b/src/beast/app/beauti/AlignmentListInputEditor.java index 24cc766..41997cc 100644 --- a/src/beast/app/beauti/AlignmentListInputEditor.java +++ b/src/beast/app/beauti/AlignmentListInputEditor.java @@ -711,33 +711,31 @@ public class AlignmentListInputEditor extends ListInputEditor { } else { comp.setBackground(Color.white); } - JComponent jcomp = (JComponent)comp; - if (comp == jcomp) { - switch (Index_col) { - case NAME_COLUMN: - case CLOCKMODEL_COLUMN: - case TREE_COLUMN: - case SITEMODEL_COLUMN: - jcomp.setToolTipText("Set " + table.getColumnName(Index_col).toLowerCase() + " for this partition"); - break; - case FILE_COLUMN: - case TAXA_COLUMN: - case SITES_COLUMN: - case TYPE_COLUMN: - jcomp.setToolTipText("Report " + table.getColumnName(Index_col).toLowerCase() + " for this partition"); - break; - case USE_AMBIGUITIES_COLUMN: - jcomp.setToolTipText("<html>Flag whether to use ambiguities.<br>" + - "If not set, the treelikelihood will treat ambiguities in the<br>" + - "data as unknowns<br>" + - "If set, the treelikelihood will use ambiguities as equally<br>" + - "likely values for the tips.<br>" + - "This will make the computation twice as slow.</html>"); - break; - default: - jcomp.setToolTipText(null); - } - } + JComponent jcomp = (JComponent) comp; + switch (Index_col) { + case NAME_COLUMN: + case CLOCKMODEL_COLUMN: + case TREE_COLUMN: + case SITEMODEL_COLUMN: + jcomp.setToolTipText("Set " + table.getColumnName(Index_col).toLowerCase() + " for this partition"); + break; + case FILE_COLUMN: + case TAXA_COLUMN: + case SITES_COLUMN: + case TYPE_COLUMN: + jcomp.setToolTipText("Report " + table.getColumnName(Index_col).toLowerCase() + " for this partition"); + break; + case USE_AMBIGUITIES_COLUMN: + jcomp.setToolTipText("<html>Flag whether to use ambiguities.<br>" + + "If not set, the treelikelihood will treat ambiguities in the<br>" + + "data as unknowns<br>" + + "If set, the treelikelihood will use ambiguities as equally<br>" + + "likely values for the tips.<br>" + + "This will make the computation twice as slow.</html>"); + break; + default: + jcomp.setToolTipText(null); + } updateStatus(); return comp; } diff --git a/src/beast/app/beauti/Beauti.java b/src/beast/app/beauti/Beauti.java index 5137330..3842a55 100644 --- a/src/beast/app/beauti/Beauti.java +++ b/src/beast/app/beauti/Beauti.java @@ -81,7 +81,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { static public final String FILE_EXT = ".xml"; static public final String FILE_EXT2 = ".json"; static final String fileSep = System.getProperty("file.separator"); - + /** * document in document-view pattern. BTW this class is the view */ @@ -318,7 +318,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { @Override public void actionPerformed(ActionEvent ae) { File file = beast.app.util.Utils.getLoadFile("Load Beast XML File", - new File(g_sDir), "Beast XML files", "xml"); + new File(g_sDir), "Beast XML files", "xml");//, "BEAST json file", "json"); // JFileChooser fileChooser = new JFileChooser(g_sDir); // fileChooser.addChoosableFileFilter(ef1); // fileChooser.setDialogTitle("Load Beast XML File"); @@ -338,6 +338,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { doc.getFileName().lastIndexOf(fileSep)); } try { + // TODO: deal with json files doc.loadXML(new File(doc.getFileName())); a_save.setEnabled(true); a_saveas.setEnabled(true); @@ -607,7 +608,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } // class ActionHelp - + class ActionMsgs extends MyAction { private static final long serialVersionUID = -1; @@ -629,7 +630,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { JScrollPane scroller = new JScrollPane(textArea); JOptionPane.showMessageDialog(frame, scroller); } - } + } } class ActionCitation extends MyAction implements ClipboardOwner { @@ -964,7 +965,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { fileName = fileName.substring(0, fileName.length() - 4); boolean duplicate = false; for (AbstractAction action : actions) { - String name = action.getValue(Action.NAME).toString(); + String name = action.getValue(Action.NAME).toString(); if (name.equals(fileName)) { duplicate = true; } @@ -990,12 +991,12 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { if (new File(exampledir).exists()) { AbstractAction action = new AbstractAction() { private static final long serialVersionUID = 1L; - + @Override public void actionPerformed(ActionEvent e) { g_sDir = dir; } - + }; String workDirInfo = "Set working directory to " + dir; String name = dir; @@ -1085,10 +1086,32 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { return BEAUtiIntances > 0; } + private static String usage() { + return "java Beauti [options]\n" + "where options can be one of the following:\n" + + "-template [template file] : BEAUti template to be used. Default templates/Standard.xml\n" + + "-nex [nexus data file] : nexus file to be read using template, multiple -nex arguments are allowed\n" + + "-xmldat [beast xml file] : as -nex but with BEAST 1 or 2 xml file instead of nexus file\n" + + "-xml [beast file] : BEAST 2 XML file to be loaded\n" + + "-exitaction [writexml|usetemplate|usexml] : what to do after processing arguments\n" + + "-out [output file name] : file to be written\n" + + "-capture : captures stdout and stderr and make them available under Help/Messages menu\n" + + "-v, -version : print version\n" + + "-h, -help : print this help message\n"; + } + + public static Beauti main2(String[] args) { try { ByteArrayOutputStream baos = null; for (String arg : args) { + if (arg.equals("-v") || arg.equals("-version")) { + System.out.println((new BEASTVersion()).getVersionString()); + System.exit(0); + } + if (arg.equals("-h") || arg.equals("-help")) { + System.out.println(usage()); + System.exit(0); + } if (arg.equals("-capture")) { final PrintStream beautiLog = System.err; baos = new ByteArrayOutputStream() { @@ -1103,26 +1126,26 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { super.write(b); beautiLog.write(b); }; - + @Override public void write(byte[] b) throws java.io.IOException { super.write(b); beautiLog.write(b); }; - + @Override public void flush() throws java.io.IOException { super.flush(); beautiLog.flush(); }; - + @Override public void close() throws IOException { super.close(); beautiLog.close(); } }; - + PrintStream p = new PrintStream(baos); System.setOut(p); System.setErr(p); @@ -1133,7 +1156,7 @@ public class Beauti extends JTabbedPane implements BeautiDocListener { Log.trace = p; } } - + AddOnManager.loadExternalJars(); if (!Utils.isMac()) { Utils.loadUIManager(); diff --git a/src/beast/app/beauti/BeautiAlignmentProvider.java b/src/beast/app/beauti/BeautiAlignmentProvider.java index 94a03cb..66e4fac 100644 --- a/src/beast/app/beauti/BeautiAlignmentProvider.java +++ b/src/beast/app/beauti/BeautiAlignmentProvider.java @@ -54,7 +54,7 @@ public class BeautiAlignmentProvider extends BEASTObject { * return amount to which the provided matches an alignment * The provider with the highest match will be used to edit the alignment * */ - int matches(Alignment alignment) { + protected int matches(Alignment alignment) { return 1; } @@ -161,6 +161,11 @@ public class BeautiAlignmentProvider extends BEASTObject { break; } } + addAlignments(doc, selectedBEASTObjects); + return selectedBEASTObjects; + } + + protected void addAlignments(BeautiDoc doc, List<BEASTInterface> selectedBEASTObjects) { for (BEASTInterface beastObject : selectedBEASTObjects) { // ensure ID of alignment is unique int k = 0; @@ -173,7 +178,6 @@ public class BeautiAlignmentProvider extends BEASTObject { sortByTaxonName(((Alignment) beastObject).sequenceInput.get()); doc.addAlignmentWithSubnet((Alignment) beastObject, getStartTemplate()); } - return selectedBEASTObjects; } /** provide GUI for manipulating the alignment **/ @@ -196,11 +200,11 @@ public class BeautiAlignmentProvider extends BEASTObject { /** return template to apply to this new alignment. * By default, the partition template of the current beauti template is returned **/ - BeautiSubTemplate getStartTemplate() { + protected BeautiSubTemplate getStartTemplate() { return template.get(); } - private void sortByTaxonName(List<Sequence> seqs) { + protected void sortByTaxonName(List<Sequence> seqs) { Collections.sort(seqs, (Sequence o1, Sequence o2) -> { return o1.taxonInput.get().compareTo(o2.taxonInput.get()); } diff --git a/src/beast/app/beauti/BeautiDoc.java b/src/beast/app/beauti/BeautiDoc.java index 0574181..b58f7bf 100644 --- a/src/beast/app/beauti/BeautiDoc.java +++ b/src/beast/app/beauti/BeautiDoc.java @@ -101,7 +101,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { */ public boolean autoSetClockRate = true; - + public boolean autoUpdateOperatorWeights = true; public boolean autoUpdateFixMeanSubstRate = true; @@ -159,7 +159,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { public Set<Input<?>> linked; InputEditorFactory inputEditorFactory; - + /** used to capture Stdout and Stderr **/ static ByteArrayOutputStream baos = null; @@ -186,7 +186,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { public String getTemplateName() { return templateName; } - + public ActionOnExit parseArgs(String[] args) throws XMLParserException, SAXException, IOException, ParserConfigurationException { ActionOnExit endState = ActionOnExit.UNKNOWN; String outputFileName = "beast.xml"; @@ -200,8 +200,6 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { int old = i; if (args[i].equals("")) { i += 1; - } else if (args[i].equals("-h") || args[i].equals("-help")) { - showUsageAndExit(); } else if (args[i].equals("-capture")) { // capture stderr and stdout // already done in beast.app.beauti.Beauti @@ -289,16 +287,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { return fileName.substring(0, fileName.length() - 4); } - void showUsageAndExit() { - System.out.println(usage()); - System.exit(0); - } - String usage() { - return "java Beauti [options]\n" + "where options can be one of the following:\n" - + "-template [template file]\n" + "-nex [nexus data file]\n" + "-xmldat [beast xml file]\n" - + "-xml [beast file]\n" + "-out [output file name]\n" + "-exitaction [writexml|usetemplate|usexml]\n"; - } private Set<BeautiDocListener> listeners = new HashSet<>(); @@ -346,14 +335,14 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { taxaset.remove(beastObject.getID()); // directly remove beast object from HashMap // relies on hashes of String being unique (which they should be). - // is much more efficient (O(1)) than lookup in keySet (O(n)), - // which matter when a lot of partitions are loaded + // is much more efficient (O(1)) than lookup in keySet (O(n)), + // which matter when a lot of partitions are loaded // but less reliable since ID may have changed. String id = reversePluginmap.get(beastObject); if (id != null && pluginmap.containsKey(id)) { pluginmap.remove(id); } - + // String oldID = null; // for (String id : pluginmap.keySet()) { // if (pluginmap.get(id).equals(beastObject)) { @@ -464,12 +453,12 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { // // XMLProducer producer = new XMLProducer(); // producer.toRawXML(alignments.get(0)); -// +// // Pplugin beastObject = parser.parseFragment(xml, false); // int i = xml.indexOf("<data"); // for (BEASTObject beastObject : pluginmap.values()) { // if (beastObject instanceof Alignment) { -// +// // } // } // save(fileName); @@ -485,7 +474,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } /** - * public to allow access for unit test + * public to allow access for unit test * @throws IOException * */ public String processTemplate(String fileName) throws IOException { @@ -714,7 +703,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } // validateModel /** - * save specification in file + * save specification in file * @throws IOException * */ public void save(String fileName) throws IOException { @@ -722,7 +711,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } // save /** - * save specification in file + * save specification in file * @throws IOException * */ public void save(File file) throws IOException { @@ -815,7 +804,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { beauti.allowLinking.setSelected(allowLinking); autoUpdateOperatorWeights = !beautiStatus.contains("noAutoUpdateOperatorWeights"); beauti.autoUpdateOperatorWeights.setSelected(autoUpdateOperatorWeights); - autoUpdateFixMeanSubstRate = !beautiStatus.contains("noAutoUpdateFixMeanSubstRate"); + autoUpdateFixMeanSubstRate = !beautiStatus.contains("noAutoUpdateFixMeanSubstRate"); beauti.autoUpdateFixMeanSubstRate.setSelected(autoUpdateFixMeanSubstRate); // parse file @@ -875,10 +864,10 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { /** * Merge sequence data with xml specification. - * @throws ParserConfigurationException - * @throws IOException - * @throws SAXException - * @throws XMLParserException + * @throws ParserConfigurationException + * @throws IOException + * @throws SAXException + * @throws XMLParserException */ void mergeSequences(String xml) throws XMLParserException, SAXException, IOException, ParserConfigurationException { if (xml == null) { @@ -1110,17 +1099,17 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } // set estimate flag on tree, only if tree occurs in a partition - for (BEASTInterface beastObject : pluginmap.values()) { - if (beastObject instanceof Tree) { - Tree tree = (Tree) beastObject; - tree.isEstimatedInput.setValue(false, tree); - } - } - for (BEASTInterface beastObject : pPartition[2]) { - // TODO: this might not be a valid type conversion from TreeInterface to Tree - Tree tree = (Tree) ((GenericTreeLikelihood) beastObject).treeInput.get(); - tree.isEstimatedInput.setValue(true, tree); - } +// for (BEASTInterface beastObject : pluginmap.values()) { +// if (beastObject instanceof Tree) { +// Tree tree = (Tree) beastObject; +// tree.isEstimatedInput.setValue(false, tree); +// } +// } +// for (BEASTInterface beastObject : pPartition[2]) { +// // TODO: this might not be a valid type conversion from TreeInterface to Tree +// Tree tree = (Tree) ((GenericTreeLikelihood) beastObject).treeInput.get(); +// tree.isEstimatedInput.setValue(true, tree); +// } if (pluginmap.containsKey("Tree.t:Species")) { Tree tree = (Tree) pluginmap.get("Tree.t:Species"); tree.isEstimatedInput.setValue(true, tree); @@ -1200,7 +1189,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } catch (Exception e) { Log.err.println(e.getMessage()); } - + if (autoUpdateOperatorWeights) { reweightSpeciesPartitionOperators(); } @@ -1213,17 +1202,17 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { if (pluginmap.containsKey("likelihood")) { collectPredecessors(pluginmap.get("likelihood"), likelihoodPredecessors); } - - - Log.warning.print("InPosterior="); + + + Log.trace.print("InPosterior="); for (BEASTInterface o : posteriorPredecessors) { pluginmap.put(o.getID(), o); - Log.warning.print(o.getID() + " "); + Log.trace.print(o.getID() + " "); //if (!pluginmap.containsKey(o)) { // System.err.println("MISSING: " + o.getID()); //} } - Log.warning.println(); + Log.trace.println(); } public static String translatePartitionNames(String str, PartitionContext partition) { @@ -1237,18 +1226,18 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { for (int i = 0; i < len; i++) { char c = str.charAt(i); if (c == '.' && i < len - 6) { - if (str.charAt(i + 2) == ':' && str.charAt(i + 3) == '$' && + if (str.charAt(i + 2) == ':' && str.charAt(i + 3) == '$' && str.charAt(i + 4) == '(' && str.charAt(i + 5) == 'n' && str.charAt(i + 6) == ')') { switch (str.charAt(i+1)) { case 's': // .s:$(n) sb.append(".s:").append(partition.siteModel); i += 6; break; - case 'c': + case 'c': sb.append(".c:").append(partition.clockModel); i += 6; break; - case 't': + case 't': sb.append(".t:").append(partition.tree); i += 6; break; @@ -1323,7 +1312,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } } } - + BEASTInterface likelihood = pluginmap.get("likelihood"); if (likelihood instanceof CompoundDistribution) { int i = 0; @@ -1494,15 +1483,15 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } /** - * Reweight total weight of operators that work on the Species partition to 20% + * Reweight total weight of operators that work on the Species partition to 20% * of total operator weights. This helps *BEAST analyses in convergence. For non - * *BEAST analyses, this bit of code has no effect. + * *BEAST analyses, this bit of code has no effect. */ private void reweightSpeciesPartitionOperators() { if (!(mcmc.get() instanceof MCMC)) { return; } - List<Operator> speciesOperators = new ArrayList<>(); + List<Operator> speciesOperators = new ArrayList<>(); double totalWeight = 0; double speciesWeight = 0; for (Operator operator : ((MCMC)mcmc.get()).operatorsInput.get()) { @@ -1512,7 +1501,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } totalWeight += operator.getWeight(); } - + if (speciesWeight > 0 && speciesWeight < totalWeight) { // we have a Species-related operator AND an alignment // rescale weights so that 20% of operator weights is dedicated to Species operators @@ -1523,7 +1512,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { operator.m_pWeight.setValue(scale * operator.getWeight(), operator); } } - + } public BEASTInterface addAlignmentWithSubnet(PartitionContext context, BeautiSubTemplate template) { @@ -1910,7 +1899,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { Object o2 = copy.getInput(input.getName()).get(); boolean alreadyInList = false; if (o2 instanceof List) { - List<?> currentList = (List<?>) o2; + List<?> currentList = (List<?>) o2; for (Object v : currentList) { if (v == value) { alreadyInList = true; @@ -2419,7 +2408,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { } /** create taxonset, one taxon for each sequence in the alignment - * and assign taxonset to the alignment + * and assign taxonset to the alignment * **/ static void createTaxonSet(Alignment a, BeautiDoc doc) { List<String> taxaNames = a.getTaxaNames(); @@ -2436,7 +2425,7 @@ public class BeautiDoc extends BEASTObject implements RequiredInputProvider { doc.registerPlugin(taxonset); } - /** create Taxon with given name, reuse if a taxon + /** create Taxon with given name, reuse if a taxon * with this name already exists **/ public Taxon getTaxon(String taxaName) { diff --git a/src/beast/app/beauti/BeautiLauncher.java b/src/beast/app/beauti/BeautiLauncher.java index ad06a68..f326e8c 100644 --- a/src/beast/app/beauti/BeautiLauncher.java +++ b/src/beast/app/beauti/BeautiLauncher.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import beast.app.beastapp.BeastLauncher; +import beast.app.util.Utils; import beast.app.util.Utils6; /** @@ -19,6 +20,7 @@ public class BeautiLauncher extends BeastLauncher { Utils6.startSplashScreen(); if (javaVersionCheck("BEAUti")) { loadBEASTJars(); + Utils.testCudaStatusOnMac(); Beauti.main(args); } Utils6.endSplashScreen(); diff --git a/src/beast/app/beauti/BeautiPanelConfig.java b/src/beast/app/beauti/BeautiPanelConfig.java index 3e7efde..5b52baa 100644 --- a/src/beast/app/beauti/BeautiPanelConfig.java +++ b/src/beast/app/beauti/BeautiPanelConfig.java @@ -32,7 +32,7 @@ public class BeautiPanelConfig extends BEASTObject { "distribution/distribution[id='posterior']/traitset all posterior inputs with name traitset", Validate.REQUIRED); final public Input<Partition> hasPartitionsInput = new Input<>("hasPartitions", "flag to indicate the panel has" + - "a partition context (and hence a partition list), deafult none. Possible values: " + Partition.values(), Partition.none, Partition.values()); + "a partition context (and hence a partition list), deafult none. Possible values: " + Arrays.toString(Partition.values()), Partition.none, Partition.values()); final public Input<Boolean> addButtonsInput = new Input<>("addButtons", "flag to indicate buttons should be added, default true", true); final public Input<Boolean> isVisibleInput = new Input<>("isVisible", "flag to indicate panel is visible on startup, default true", true); diff --git a/src/beast/app/beauti/GuessPatternDialog.java b/src/beast/app/beauti/GuessPatternDialog.java index 48a54dc..88b61ac 100644 --- a/src/beast/app/beauti/GuessPatternDialog.java +++ b/src/beast/app/beauti/GuessPatternDialog.java @@ -540,14 +540,15 @@ public class GuessPatternDialog extends JDialog { try { BufferedReader fin = new BufferedReader(new FileReader(txtFile.getText())); StringBuffer buf = new StringBuffer(); - // eat up header - fin.readLine(); + // do not eat up header -- it might contain a useful entry, + // but if not, it will not hurt + // fin.readLine(); // process data while (fin.ready()) { String str = fin.readLine(); str = str.replaceFirst("\t", "=") + ","; // only add entries that are non-empty - if (!str.matches("^\\s+=.*$")) { + if (str.indexOf("=") > 0 && !str.matches("^\\s+=.*$")) { buf.append(str); } } @@ -556,6 +557,11 @@ public class GuessPatternDialog extends JDialog { while (trait.endsWith(",")) { trait = trait.substring(0, trait.length() - 1).trim(); } + + if (trait.trim().length() == 0) { + JOptionPane.showMessageDialog(m_parent, "Could not find traint information in the file. " + + "Perhaps this is not a tab-delimited but space file?"); + } } catch (Exception e) { JOptionPane.showMessageDialog(m_parent, "Loading trait from file failed:" + e.getMessage()); return Status.canceled; diff --git a/src/beast/app/beauti/JPackageDialog.java b/src/beast/app/beauti/JPackageDialog.java index 61467c2..ebcae34 100644 --- a/src/beast/app/beauti/JPackageDialog.java +++ b/src/beast/app/beauti/JPackageDialog.java @@ -37,13 +37,13 @@ public class JPackageDialog extends JPanel { PackageTable dataTable = null; TreeMap<String, Package> packageMap = new TreeMap<>((s1,s2)->{ - if (s1.equals(AddOnManager.BEAST_PACKAGE)) { - if (s2.equals(AddOnManager.BEAST_PACKAGE)) { + if (s1.equals(AddOnManager.BEAST_PACKAGE_NAME)) { + if (s2.equals(AddOnManager.BEAST_PACKAGE_NAME)) { return 0; } return -1; } - if (s2.equals(AddOnManager.BEAST_PACKAGE)) { + if (s2.equals(AddOnManager.BEAST_PACKAGE_NAME)) { return 1; } return s1.compareToIgnoreCase(s2); diff --git a/src/beast/app/beauti/TaxonSetInputEditor.java b/src/beast/app/beauti/TaxonSetInputEditor.java index baf4dbe..4eda6c9 100644 --- a/src/beast/app/beauti/TaxonSetInputEditor.java +++ b/src/beast/app/beauti/TaxonSetInputEditor.java @@ -316,8 +316,7 @@ public class TaxonSetInputEditor extends InputEditor.Base { for (Alignment alignment : getDoc().alignments) { for (String id : alignment.getTaxaNames()) { if (!taxonIDs.contains(id)) { - Taxon taxon = new Taxon(); - taxon.setID(id); + Taxon taxon = getDoc().getTaxon(id); taxa.add(taxon); taxonIDs.add(id); } @@ -325,12 +324,11 @@ public class TaxonSetInputEditor extends InputEditor.Base { for (Sequence sequence : alignment.sequenceInput.get()) { String id = sequence.taxonInput.get(); if (!taxonIDs.contains(id)) { - Taxon taxon = new Taxon(); + Taxon taxon = getDoc().getTaxon(sequence.taxonInput.get()); // ensure sequence and taxon do not get same ID if (sequence.getID().equals(sequence.taxonInput.get())) { sequence.setID("_" + sequence.getID()); } - taxon.setID(sequence.taxonInput.get()); taxa.add(taxon); taxonIDs.add(id); } @@ -347,8 +345,7 @@ public class TaxonSetInputEditor extends InputEditor.Base { TaxonSet set = map.get(match); set.taxonsetInput.setValue(taxon, set); } else { - TaxonSet set = new TaxonSet(); - set.setID(match); + TaxonSet set = newTaxonSet(match); set.taxonsetInput.setValue(taxon, set); map.put(match, set); } @@ -370,7 +367,23 @@ public class TaxonSetInputEditor extends InputEditor.Base { return ignored; } - void parseTrait(String trait) { + private TaxonSet newTaxonSet(String match) { + if (getDoc().taxaset.containsKey(match)) { + Taxon t = doc.taxaset.get(match); + if (t instanceof TaxonSet) { + TaxonSet set = (TaxonSet) t; + set.taxonsetInput.get().clear(); + return set; + } else { + // TODO handle situation where taxon and set have same name (issue #135) + } + } + TaxonSet set = new TaxonSet(); + set.setID(match); + return set; + } + + void parseTrait(String trait) { Map<String,String> traitmap = new HashMap<>(); for (String line : trait.split(",")) { String [] strs = line.split("="); @@ -390,12 +403,11 @@ public class TaxonSetInputEditor extends InputEditor.Base { for (Sequence sequence : alignment.sequenceInput.get()) { String id = sequence.taxonInput.get(); if (!taxonIDs.contains(id)) { - Taxon taxon = new Taxon(); + Taxon taxon = getDoc().getTaxon(sequence.taxonInput.get()); // ensure sequence and taxon do not get same ID if (sequence.getID().equals(sequence.taxonInput.get())) { sequence.setID("_" + sequence.getID()); } - taxon.setID(sequence.taxonInput.get()); taxa.add(taxon); taxonIDs.add(id); } @@ -412,8 +424,7 @@ public class TaxonSetInputEditor extends InputEditor.Base { TaxonSet set = map.get(match); set.taxonsetInput.setValue(taxon, set); } else { - TaxonSet set = new TaxonSet(); - set.setID(match); + TaxonSet set = newTaxonSet(match); set.taxonsetInput.setValue(taxon, set); map.put(match, set); } @@ -530,8 +541,7 @@ public class TaxonSetInputEditor extends InputEditor.Base { // new taxon set? if (!m_taxonMap.containsValue(taxonSetID)) { // create new taxon set - TaxonSet taxonset = new TaxonSet(); - taxonset.setID(taxonSetID); + TaxonSet taxonset = newTaxonSet(taxonSetID); m_taxonset.add(taxonset); } m_taxonMap.put(lineageID, taxonSetID); diff --git a/src/beast/app/beauti/TipDatesInputEditor.java b/src/beast/app/beauti/TipDatesInputEditor.java index 6e611ee..bd656f7 100644 --- a/src/beast/app/beauti/TipDatesInputEditor.java +++ b/src/beast/app/beauti/TipDatesInputEditor.java @@ -141,7 +141,7 @@ public class TipDatesInputEditor extends BEASTObjectInputEditor { samplingBox.add(comboBox); taxonsets = new ArrayList<>(); - Taxon allTaxa = new Taxon(); + Taxon allTaxa = getDoc().getTaxon(ALL_TAXA); allTaxa.setID(ALL_TAXA); taxonsets.add(allTaxa); List<String> taxonSetIDs = new ArrayList<>(); diff --git a/src/beast/app/draw/InputEditorFactory.java b/src/beast/app/draw/InputEditorFactory.java index 711ea6c..10ff44d 100644 --- a/src/beast/app/draw/InputEditorFactory.java +++ b/src/beast/app/draw/InputEditorFactory.java @@ -152,7 +152,7 @@ public class InputEditorFactory { } else { if (input.get() != null && !input.get().getClass().equals(inputClass) && !(input.get() instanceof ArrayList)) { - Log.err.println(input.get().getClass() + " != " + inputClass); + Log.trace.println(input.get().getClass() + " != " + inputClass); inputClass = input.get().getClass(); } } diff --git a/src/beast/app/draw/ListInputEditor.java b/src/beast/app/draw/ListInputEditor.java index 0e1b93a..803c550 100644 --- a/src/beast/app/draw/ListInputEditor.java +++ b/src/beast/app/draw/ListInputEditor.java @@ -462,7 +462,10 @@ public class ListInputEditor extends InputEditor.Base { BEASTInterface beastObject = (BEASTInterface) ((List<?>) m_input.get()).get(i); beastObject.validateInputs(); m_validateLabels.get(i).setVisible(false); - } catch (IllegalArgumentException e) { + } catch (IndexOutOfBoundsException e) { + // happens when m_validateLabels is not large enough, so there is nothing to show + } catch (Exception e) { + // something went wrong, so show label if available if (m_validateLabels.size() > i) { m_validateLabels.get(i).setToolTipText(e.getMessage()); m_validateLabels.get(i).setVisible(true); diff --git a/src/beast/app/treeannotator/KernelDensityEstimator2D.java b/src/beast/app/treeannotator/KernelDensityEstimator2D.java index 76a680c..dccb14f 100644 --- a/src/beast/app/treeannotator/KernelDensityEstimator2D.java +++ b/src/beast/app/treeannotator/KernelDensityEstimator2D.java @@ -257,7 +257,7 @@ public class KernelDensityEstimator2D implements ContourMaker { KernelDensityEstimator2D kde = new KernelDensityEstimator2D(x, y, 4); - System.out.println(kde.getXGrid()); + System.out.println(Arrays.toString(kde.getXGrid())); // System.out.println(new Vector(kde.getYGrid())); // System.out.println(new Matrix(kde.getKDE())); System.exit(-1); diff --git a/src/beast/app/treeannotator/RealNumberField.java b/src/beast/app/treeannotator/RealNumberField.java index 72c65c9..506767c 100644 --- a/src/beast/app/treeannotator/RealNumberField.java +++ b/src/beast/app/treeannotator/RealNumberField.java @@ -128,7 +128,7 @@ public class RealNumberField extends JTextField implements FocusListener, Docume if (value == null && allowEmpty) { setText(""); } - if (value == Double.NaN) { + if (Double.isNaN(value)) { setText(NaN); } else if (value == Double.POSITIVE_INFINITY) { setText(POSITIVE_INFINITY); diff --git a/src/beast/app/util/Utils.java b/src/beast/app/util/Utils.java index e63b6ee..16e571d 100644 --- a/src/beast/app/util/Utils.java +++ b/src/beast/app/util/Utils.java @@ -3,6 +3,7 @@ package beast.app.util; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; +import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.Toolkit; import java.io.BufferedReader; @@ -18,6 +19,7 @@ import java.util.Set; import javax.swing.ImageIcon; import javax.swing.JFileChooser; +import javax.swing.JOptionPane; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; @@ -26,6 +28,13 @@ import javax.swing.filechooser.FileNameExtensionFilter; import beast.app.beauti.BeautiPanel; import beast.app.beauti.BeautiPanelConfig; import beast.core.util.Log; +import beast.evolution.alignment.Alignment; +import beast.evolution.alignment.Sequence; +import beast.evolution.likelihood.BeagleTreeLikelihood; +import beast.evolution.sitemodel.SiteModel; +import beast.evolution.substitutionmodel.JukesCantor; +import beast.util.AddOnManager; +import beast.util.TreeParser; /** * @author Andrew Rambaut @@ -320,4 +329,102 @@ public class Utils { } } + + + public static boolean testCudaStatusOnMac() { + String cudaStatusOnMac = "<html>It appears you have CUDA installed, but your computer hardware does not support it.<br>" + + "You need to remove CUDA before BEAST/BEAUti can start.<br>" + + "To remove CUDA, delete the following folders by typing in a terminal:<br>" + + "rm -r /Library/Frameworks/CUDA.framework<br>" + + "rm -r /Developer/NVIDIA<br>" + + "rm -r /usr/local/cuda<br>" + + "You may need 'sudo rm' instead of 'rm'</html>"; + + if (isMac()) { + // check any of these directories exist + // /Library/Frameworks/CUDA.framework + // /Developer/NVIDIA + // /usr/local/cuda + if (new File("/Library/Frameworks/CUDA.framework").exists() || + new File("/Developer/NVIDIA").exists() || + new File("/usr/local/cuda").exists()) { + // there is evidence of CUDA being installed on this computer + // try to create a BeagleTreeLikelihood using a separate process + try { + String java = System.getenv("java.home"); + if (java == null) { + java ="/usr/bin/java"; + } else { + java += "/bin/java"; + } + String beastJar = AddOnManager.getPackageUserDir(); + beastJar += "/" + "BEAST" + "/" + "lib" + "/" + "beast.jar"; + if (!new File(beastJar).exists()) { + Log.debug.println("Could not find beast.jar, giving up testCudaStatusOnMac"); + return true; + } + //beastJar = "\"" + beastJar + "\""; + //beastJar = "/Users/remco/workspace/beast2/build/dist/beast.jar"; + Process p = Runtime.getRuntime().exec(new String[]{java , "-cp" , beastJar , "beast.app.util.Utils"}); + BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = input.readLine()) != null) { + Log.debug.println(line); + } + input.close(); + if (p.exitValue() != 0) { + if (GraphicsEnvironment.isHeadless()) { + cudaStatusOnMac = cudaStatusOnMac.replaceAll("<br>", "\n"); + cudaStatusOnMac = cudaStatusOnMac.replaceAll("<.?html>","\n"); + Log.warning.println("WARNING: " + cudaStatusOnMac); + } else { + JOptionPane.showMessageDialog(null, cudaStatusOnMac); + } + return false; + } + } + catch (Exception err) { + err.printStackTrace(); + } + } + + } + return true; + } + + + public static void main(String[] args) { + try { + Sequence a = new Sequence("A", "A"); + Sequence b = new Sequence("B", "A"); + Sequence c = new Sequence("C", "A"); + Sequence d = new Sequence("D", "A"); + + Alignment data = new Alignment(); + data.initByName("sequence", a, "sequence", b, "sequence", c, "sequence", d, "dataType", "nucleotide"); + + TreeParser tree = new TreeParser(); + tree.initByName("taxa", data, + "newick", "(((A:1,B:1):1,C:2):1,D:3)", + "IsLabelledNewick", true); + + JukesCantor JC = new JukesCantor(); + JC.initAndValidate(); + + SiteModel siteModel = new SiteModel(); + siteModel.initByName("mutationRate", "1.0", "gammaCategoryCount", 1, "substModel", JC); + + BeagleTreeLikelihood likelihood = new BeagleTreeLikelihood(); + likelihood.initByName("data", data, "tree", tree, "siteModel", siteModel); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + System.out.println("Success"); + // if we got this far, exit with status 0 + System.exit(0); + } + } diff --git a/src/beast/app/util/Utils6.java b/src/beast/app/util/Utils6.java index 8cf4ba5..0f67209 100644 --- a/src/beast/app/util/Utils6.java +++ b/src/beast/app/util/Utils6.java @@ -98,4 +98,16 @@ public class Utils6 { return null; } } + + public static boolean isMac() { + return System.getProperty("os.name").toLowerCase().startsWith("mac"); + } + + public static boolean isWindows() { + return System.getProperty("os.name").toLowerCase().startsWith("windows"); + } + + public static boolean isLinux() { + return System.getProperty("os.name").toLowerCase().startsWith("linux"); + } } diff --git a/src/beast/core/Input.java b/src/beast/core/Input.java index 44b4715..bde8d06 100644 --- a/src/beast/core/Input.java +++ b/src/beast/core/Input.java @@ -748,5 +748,9 @@ public class Input<T> { break; } } // validate + + public String toString() { + return String.format("Input(\"%s\")", name); + } } // class Input diff --git a/src/beast/core/Logger.java b/src/beast/core/Logger.java index c652f67..7f04e48 100644 --- a/src/beast/core/Logger.java +++ b/src/beast/core/Logger.java @@ -38,6 +38,7 @@ import java.io.UnsupportedEncodingException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -66,8 +67,8 @@ public class Logger extends BEASTObject { final public Input<BEASTObject> modelInput = new Input<>("model", "Model to log at the top of the log. " + "If specified, XML will be produced for the model, commented out by # at the start of a line. " + "Alignments are suppressed. This way, the log file documents itself. "); - final public Input<LOGMODE> modeInput = new Input<>("mode", "logging mode, one of " + LOGMODE.values(), LOGMODE.autodetect, LOGMODE.values()); - final public Input<SORTMODE> sortModeInput = new Input<>("sort", "sort items to be logged, one of " + SORTMODE.values(), SORTMODE.none, SORTMODE.values()); + final public Input<LOGMODE> modeInput = new Input<>("mode", "logging mode, one of " + Arrays.toString(LOGMODE.values()), LOGMODE.autodetect, LOGMODE.values()); + final public Input<SORTMODE> sortModeInput = new Input<>("sort", "sort items to be logged, one of " + Arrays.toString(SORTMODE.values()), SORTMODE.none, SORTMODE.values()); final public Input<Boolean> sanitiseHeadersInput = new Input<>("sanitiseHeaders", "whether to remove any clutter introduced by Beauti" , false); final public Input<List<BEASTObject>> loggersInput = new Input<>("log", @@ -141,7 +142,7 @@ public class Logger extends BEASTObject { } else if (mode.equals(LOGMODE.compound)) { this.mode = LOGMODE.compound; } else { - throw new IllegalArgumentException("Mode '" + mode + "' is not supported. Choose one of " + LOGMODE.values()); + throw new IllegalArgumentException("Mode '" + mode + "' is not supported. Choose one of " + Arrays.toString(LOGMODE.values())); } if (everyInput.get() != null) { diff --git a/src/beast/core/OperatorSchedule.java b/src/beast/core/OperatorSchedule.java index a2e191c..20ff8ee 100644 --- a/src/beast/core/OperatorSchedule.java +++ b/src/beast/core/OperatorSchedule.java @@ -154,8 +154,6 @@ public class OperatorSchedule extends BEASTObject { formatter.format(headerFormat, PR_ACCEPT); out.println(": The acceptance probability (" + NUM_ACCEPT + " as a fraction of the total proposals for this operator)."); out.println(); - - formatter.close(); } protected static String prettyPrintOperator( diff --git a/src/beast/evolution/likelihood/BeagleTreeLikelihood.java b/src/beast/evolution/likelihood/BeagleTreeLikelihood.java index 8fd9a67..abd4fc6 100644 --- a/src/beast/evolution/likelihood/BeagleTreeLikelihood.java +++ b/src/beast/evolution/likelihood/BeagleTreeLikelihood.java @@ -34,6 +34,7 @@ import beagle.BeagleFlag; import beagle.BeagleInfo; import beagle.InstanceDetails; import beagle.ResourceDetails; +import beast.core.CalculationNode; import beast.core.Description; import beast.core.util.Log; import beast.evolution.alignment.Alignment; @@ -82,6 +83,9 @@ public class BeagleTreeLikelihood extends TreeLikelihood { int m_nStateCount; int m_nNodeCount; + private double [] currentCategoryRates; + private double [] storedCurrentCategoryRates; + private int invariantCategory = -1; @Override @@ -139,6 +143,16 @@ public class BeagleTreeLikelihood extends TreeLikelihood { break; } } + if (constantPattern.size() > dataInput.get().getPatternCount()) { + // if there are many more constant patterns than patterns (each pattern can + // have a number of constant patters, one for each state) it is less efficient + // to just calculate the TreeLikelihood for constant sites than optimising + Log.debug("switch off constant sites optimisiation: calculating through separate TreeLikelihood category (as in the olden days)"); + invariantCategory = -1; + proportionInvariant = 0; + constantPattern = null; + categoryRates = m_siteModel.getCategoryRates(null); + } } this.categoryCount = m_siteModel.getCategoryCount() - (invariantCategory >= 0 ? 1 : 0); @@ -349,7 +363,9 @@ public class BeagleTreeLikelihood extends TreeLikelihood { // set up sitemodel beagle.setCategoryRates(categoryRates); - + currentCategoryRates = categoryRates; + storedCurrentCategoryRates = categoryRates.clone(); + return true; } @@ -499,10 +515,30 @@ public class BeagleTreeLikelihood extends TreeLikelihood { @Override protected boolean requiresRecalculation() { hasDirt = Tree.IS_CLEAN; + + double[] categoryRates = m_siteModel.getCategoryRates(null); + if (constantPattern != null) { + double [] tmp = new double [categoryRates.length - 1]; + for (int k = 0; k < invariantCategory; k++) { + tmp[k] = categoryRates[k]; + } + for (int k = invariantCategory + 1; k < categoryRates.length; k++) { + tmp[k-1] = categoryRates[k]; + } + categoryRates = tmp; + } + for (int i = 0; i < categoryRates.length; i++) { + if (categoryRates[i] != currentCategoryRates[i]) { + updateSiteModel = true; + break; + } + } + //updateSiteModel |= m_siteModel.isDirtyCalculation(); - updateSiteModel |= m_siteModel.isDirtyCalculation(); - updateSubstitutionModel |= substitutionModel.isDirtyCalculation(); - + if (substitutionModel instanceof CalculationNode) { + updateSubstitutionModel |= ((CalculationNode) substitutionModel).isDirtyCalculation(); + } + if (dataInput.get().isDirtyCalculation()) { hasDirt = Tree.IS_FILTHY; return true; @@ -535,12 +571,21 @@ public class BeagleTreeLikelihood extends TreeLikelihood { } super.store(); System.arraycopy(m_branchLengths, 0, storedBranchLengths, 0, m_branchLengths.length); + System.arraycopy(currentCategoryRates, 0, storedCurrentCategoryRates, 0, currentCategoryRates.length); } @Override public void restore() { - updateSiteModel = true; // this is required to upload the categoryRates to BEAGLE after the restore - + for (int i = 0; i < currentCategoryRates.length; i++) { + if (currentCategoryRates[i] != storedCurrentCategoryRates[i]) { + updateSiteModel = true; // this is required to upload the categoryRates to BEAGLE after the restore + break; + } + } + double [] tmp = storedCurrentCategoryRates; + storedCurrentCategoryRates = currentCategoryRates; + currentCategoryRates = tmp; + partialBufferHelper.restoreState(); eigenBufferHelper.restoreState(); matrixBufferHelper.restoreState(); @@ -642,6 +687,7 @@ public class BeagleTreeLikelihood extends TreeLikelihood { categoryRates = tmp; } beagle.setCategoryRates(categoryRates); + currentCategoryRates = categoryRates; } for (int i = 0; i < eigenCount; i++) { @@ -724,11 +770,18 @@ public class BeagleTreeLikelihood extends TreeLikelihood { beagle.getSiteLogLikelihoods(patternLogLikelihoods); int [] patternWeights = dataInput.get().getWeights(); proportionInvariant = m_siteModel.getProportionInvariant(); - for (int k : constantPattern) { - int i = k / m_nStateCount; - int j = k % m_nStateCount; - logL += patternWeights[i] * (Math.log(Math.exp(patternLogLikelihoods[i]) + proportionInvariant * frequencies[j]) - patternLogLikelihoods[i]); - } + + + for (int k : constantPattern) { + int i = k / m_nStateCount; + int j = k % m_nStateCount; + patternLogLikelihoods[i] = (Math.log(Math.exp(patternLogLikelihoods[i]) + proportionInvariant * frequencies[j])); + } + + logL = 0.0; + for (int i = 0; i < patternCount; i++) { + logL += patternLogLikelihoods[i] * patternWeights[i]; + } } if (Double.isNaN(logL) || Double.isInfinite(logL)) { @@ -971,11 +1024,6 @@ public class BeagleTreeLikelihood extends TreeLikelihood { /** - * the pattern likelihoods - */ - protected double[] patternLogLikelihoods = null; - - /** * the number of rate categories */ protected int categoryCount; diff --git a/src/beast/evolution/likelihood/ThreadedTreeLikelihood.java b/src/beast/evolution/likelihood/ThreadedTreeLikelihood.java index f584f82..f485262 100644 --- a/src/beast/evolution/likelihood/ThreadedTreeLikelihood.java +++ b/src/beast/evolution/likelihood/ThreadedTreeLikelihood.java @@ -73,7 +73,7 @@ public class ThreadedTreeLikelihood extends GenericTreeLikelihood { final public Input<Scaling> scalingInput = new Input<>("scaling", "type of scaling to use, one of " + Arrays.toString(Scaling.values()) + ". If not specified, the -beagle_scaling flag is used.", Scaling._default, Scaling.values()); /** private list of likelihoods, to notify framework of TreeLikelihoods being created in initAndValidate() **/ - final private Input<List<TreeLikelihood>> likelihoodsInput = new Input<>("xxx","",new ArrayList<>()); + final private Input<List<TreeLikelihood>> likelihoodsInput = new Input<>("*","",new ArrayList<>()); @Override public List<Input<?>> listInputs() { @@ -283,7 +283,7 @@ public class ThreadedTreeLikelihood extends GenericTreeLikelihood { try { logPByThread[threadNr] = likelihood.calculateLogP(); } catch (Exception e) { - System.err.println("Something went wrong ith thread " + threadNr); + System.err.println("Something went wrong in thread " + threadNr); e.printStackTrace(); System.exit(0); } diff --git a/src/beast/evolution/likelihood/TreeLikelihood.java b/src/beast/evolution/likelihood/TreeLikelihood.java index c30afbc..fafb5fe 100644 --- a/src/beast/evolution/likelihood/TreeLikelihood.java +++ b/src/beast/evolution/likelihood/TreeLikelihood.java @@ -68,7 +68,7 @@ public class TreeLikelihood extends GenericTreeLikelihood { * BEASTObject associated with inputs. Since none of the inputs are StateNodes, it * is safe to link to them only once, during initAndValidate. */ - SubstitutionModel.Base substitutionModel; + SubstitutionModel substitutionModel; protected SiteModel.Base m_siteModel; protected BranchRateModel.Base branchRateModel; diff --git a/src/beast/evolution/operators/DeltaExchangeOperator.java b/src/beast/evolution/operators/DeltaExchangeOperator.java index df55d25..add9f7a 100644 --- a/src/beast/evolution/operators/DeltaExchangeOperator.java +++ b/src/beast/evolution/operators/DeltaExchangeOperator.java @@ -137,6 +137,47 @@ public class DeltaExchangeOperator extends Operator { @Override public final double proposal() { int[] parameterWeights = weights(); + final int dim = parameterWeights.length; + + // Find the number of weights that are nonzero + int nonZeroWeights = 0; + for (int i: parameterWeights) { + if (i != 0) { + ++nonZeroWeights; + } + } + + if (nonZeroWeights <= 1) { + // it is impossible to select two distinct entries in this case, so there is nothing to propose + return 0.0; + } + + // Generate indices for the values to be modified + int dim1 = Randomizer.nextInt(nonZeroWeights); + int dim2 = Randomizer.nextInt(nonZeroWeights-1); + if (dim2 >= dim1) { + ++dim2; + } + if (nonZeroWeights<dim) { + // There are zero weights, so we need to increase dim1 and dim2 accordingly. + int nonZerosBeforeDim1 = dim1; + int nonZerosBeforeDim2 = dim2; + dim1 = 0; + dim2 = 0; + while (nonZerosBeforeDim1 > 0 | parameterWeights[dim1] == 0 ) { + if (parameterWeights[dim1] != 0) { + --nonZerosBeforeDim1; + } + ++dim1; + } + while (nonZerosBeforeDim2 > 0 | parameterWeights[dim2] == 0 ) { + if (parameterWeights[dim2] != 0) { + --nonZerosBeforeDim2; + } + ++dim2; + } + } + double logq = 0.0; if (compoundParameter == null) { // one parameter case @@ -150,18 +191,6 @@ public class DeltaExchangeOperator extends Operator { realparameter = parameterInput.get().get(0); } - final int dim = (realparameter != null ? realparameter.getDimension() : intparameter.getDimension()); - if (dim <= 1) { - // it is impossible to select two distinct entries in this case, so there is nothing to propose - return 0.0; - } - - final int dim1 = Randomizer.nextInt(dim); - int dim2 = dim1; - while (dim1 == dim2) { - dim2 = Randomizer.nextInt(dim); - } - if (intparameter == null) { // operate on real parameter double scalar1 = realparameter.getValue(dim1); @@ -217,19 +246,6 @@ public class DeltaExchangeOperator extends Operator { } else { // compound parameter case - // get two dimensions - final int dim = compoundParameter.getDimension(); - if (dim <= 1) { - // it is impossible to select two distinct entries in this case, so there is nothing to propose - return 0.0; - } - - final int dim1 = Randomizer.nextInt(dim); - int dim2 = dim1; - while (dim1 == dim2) { - dim2 = Randomizer.nextInt(dim); - } - if (intparameterInput.get().isEmpty()) { // operate on real parameter double scalar1 = (Double) compoundParameter.getValue(dim1); @@ -315,9 +331,9 @@ public class DeltaExchangeOperator extends Operator { public void optimize(final double logAlpha) { // must be overridden by operator implementation to have an effect if (autoOptimize) { - double delta = calcDelta(logAlpha); - delta += Math.log(delta); - delta = Math.exp(delta); + double _delta = calcDelta(logAlpha); + _delta += Math.log(delta); + delta = Math.exp(_delta); if (isIntegerOperator) { // when delta < 0.5 // Randomizer.nextInt((int) Math.round(delta)) becomes diff --git a/src/beast/evolution/operators/SubtreeSlide.java b/src/beast/evolution/operators/SubtreeSlide.java index 2bb72bc..61e84ce 100644 --- a/src/beast/evolution/operators/SubtreeSlide.java +++ b/src/beast/evolution/operators/SubtreeSlide.java @@ -250,7 +250,7 @@ public class SubtreeSlide extends TreeOperator { */ @Override public void optimize(final double logAlpha) { - if (optimiseInput.get() && ! Double.isInfinite(logAlpha) ) { + if (optimiseInput.get()) { double delta = calcDelta(logAlpha); delta += Math.log(size); final double f = Math.exp(delta); diff --git a/src/beast/evolution/sitemodel/SiteModelInterface.java b/src/beast/evolution/sitemodel/SiteModelInterface.java index a7877c6..16a83b7 100644 --- a/src/beast/evolution/sitemodel/SiteModelInterface.java +++ b/src/beast/evolution/sitemodel/SiteModelInterface.java @@ -35,7 +35,7 @@ public interface SiteModelInterface { @Description(value = "Base implementation of a site model with substitution model and rate categories.", isInheritable = false) public abstract class Base extends CalculationNode implements SiteModelInterface { - final public Input<SubstitutionModel.Base> substModelInput = + final public Input<SubstitutionModel> substModelInput = new Input<>("substModel", "substitution model along branches in the beast.tree", null, Validate.REQUIRED); /** diff --git a/src/beast/evolution/substitutionmodel/DefaultEigenSystem.java b/src/beast/evolution/substitutionmodel/DefaultEigenSystem.java index 142405f..f733ba3 100644 --- a/src/beast/evolution/substitutionmodel/DefaultEigenSystem.java +++ b/src/beast/evolution/substitutionmodel/DefaultEigenSystem.java @@ -2,6 +2,7 @@ package beast.evolution.substitutionmodel; import beast.core.util.Log; import beast.math.MachineAccuracy; +import java.util.Arrays; /** * A default Eigen decomposition system @@ -178,7 +179,10 @@ public class DefaultEigenSystem implements EigenSystem { } if (itn == 0) { /* eigenvalues have not converged */ - Log.warning.println("Eigenvalues not converged"); + Log.warning.println("Eigenvalues not converged for Q-matrix"); + for (i = 0; i < n; i++) { + Log.warning.println(Arrays.toString(h[i])); + } throw new ArithmeticException(); } y = h[na - 1][na - 1]; diff --git a/src/beast/evolution/substitutionmodel/Frequencies.java b/src/beast/evolution/substitutionmodel/Frequencies.java index 4f06b46..d49221d 100644 --- a/src/beast/evolution/substitutionmodel/Frequencies.java +++ b/src/beast/evolution/substitutionmodel/Frequencies.java @@ -73,10 +73,11 @@ public class Frequencies extends CalculationNode { * return up to date frequencies * */ public double[] getFreqs() { - if (needsUpdate) { - - update(); - } + synchronized (this) { + if (needsUpdate) { + update(); + } + } return freqs; } diff --git a/src/beast/evolution/tree/RandomTree.java b/src/beast/evolution/tree/RandomTree.java index c5158c1..351f82d 100644 --- a/src/beast/evolution/tree/RandomTree.java +++ b/src/beast/evolution/tree/RandomTree.java @@ -420,7 +420,7 @@ public class RandomTree extends Tree implements StateNodeInitialiser { final Set<Node> candidates = new HashSet<>(); int i = 0; for (String taxon : taxa) { - final Node node = new Node(); + final Node node = newNode(); node.setNr(i); node.setID(taxon); node.setHeight(0.0); @@ -560,7 +560,7 @@ public class RandomTree extends Tree implements StateNodeInitialiser { int k = nodeList.size() - 1; final Node left = nodeList.remove(k); final Node right = nodeList.get(k-1); - final Node newNode = new Node(); + final Node newNode = newNode(); newNode.setNr(nextNodeNr++); // multiple tries may generate an excess of nodes assert(nextNodeNr <= nrOfTaxa*2-1); newNode.setHeight(h + dt); newNode.setLeft(left); @@ -691,7 +691,7 @@ public class RandomTree extends Tree implements StateNodeInitialiser { final Node left = nodeList.get(node1); final Node right = nodeList.get(node2); - final Node newNode = new Node(); + final Node newNode = newNode(); // System.err.println(2 * m_taxa.get().getNrTaxa() - nodeList.size()); newNode.setNr(nextNodeNr++); // multiple tries may generate an excess of nodes assert(nextNodeNr <= nrOfTaxa*2-1); newNode.setHeight(height); diff --git a/src/beast/util/AddOnManager.java b/src/beast/util/AddOnManager.java index 3132022..9f1ab5e 100644 --- a/src/beast/util/AddOnManager.java +++ b/src/beast/util/AddOnManager.java @@ -82,10 +82,10 @@ public class AddOnManager { public final static String[] IMPLEMENTATION_DIR = {"beast", "snap"}; public final static String TO_DELETE_LIST_FILE = "toDeleteList"; public final static String TO_INSTALL_LIST_FILE = "toInstallList"; - public final static String BEAST_PACKAGE = "BEAST"; + public final static String BEAST_PACKAGE_NAME = "BEAST"; -// public final static String PACKAGES_XML = "https://raw.githubusercontent.com/CompEvol/CBAN/master/packages.xml"; - public final static String PACKAGES_XML = "file:///Users/remco/workspace/beast2/packages.xml"; + public final static String PACKAGES_XML = "https://raw.githubusercontent.com/CompEvol/CBAN/master/packages.xml"; +// public final static String PACKAGES_XML = "file:///Users/remco/workspace/beast2/packages.xml"; public static final String INSTALLED = "installed"; public static final String NOT_INSTALLED = "not installed"; @@ -282,19 +282,23 @@ public class AddOnManager { } } - // Manually set currently-installed BEAST 2 version (won't have to do this soon!) - -// Package beastPkg; -// if (packageMap.containsKey(BEAST_PACKAGE)) -// beastPkg = packageMap.get(BEAST_PACKAGE); -// else { -// beastPkg = new Package(BEAST_PACKAGE); -// packageMap.put(BEAST_PACKAGE, beastPkg); -// } -// -// PackageVersion beastPkgVersion = new PackageVersion(beastVersion.getVersion()); -// Set<PackageDependency> beastPkgDeps = new TreeSet<>(); -// beastPkg.setInstalled(beastPkgVersion, beastPkgDeps); + // Manually set currently-installed BEAST 2 version if not already set + // This can happen when the BEAST package is not installed (perhaps due to + // file access issues) + Package beastPkg; + if (packageMap.containsKey(BEAST_PACKAGE_NAME)) { + beastPkg = packageMap.get(BEAST_PACKAGE_NAME); + } else { + beastPkg = new Package(BEAST_PACKAGE_NAME); + packageMap.put(BEAST_PACKAGE_NAME, beastPkg); + } + + if (!beastPkg.isInstalled()) { + PackageVersion beastPkgVersion = new PackageVersion(beastVersion.getVersion()); + Set<PackageDependency> beastPkgDeps = new TreeSet<>(); + beastPkg.setInstalled(beastPkgVersion, beastPkgDeps); + } + } /** @@ -437,6 +441,8 @@ public class AddOnManager { * @throws IOException if URL cannot be accessed for some reason */ public static Map<String, String> installPackages(Map<Package, PackageVersion> packagesToInstall, boolean useAppDir, String customDir) throws IOException { + closeClassLoader(); + Map<String, String> dirList = new HashMap<>(); for (Map.Entry<Package, PackageVersion> entry : packagesToInstall.entrySet()) { @@ -512,6 +518,7 @@ public class AddOnManager { * @throws IOException thrown if packages cannot be deleted and delete list file cannot be written */ public static String uninstallPackage(Package pkg, boolean useAppDir, String customDir) throws IOException { + closeClassLoader(); String dirName = (useAppDir ? getPackageSystemDir() : getPackageUserDir()) + "/" + pkg.getName(); if (customDir != null) { @@ -534,7 +541,32 @@ public class AddOnManager { } - private static void deleteRecursively(File file, List<File> deleteFailed) { + /** + * Close class loader so that locks on jar files are released, which may prevent + * files being replaced on Windows. + * http://docs.oracle.com/javase/7/docs/api/java/net/URLClassLoader.html#close%28%29 + * + * This allows smooth upgrading of BEAST versions using the package manager. Without + * this, there is no way to upgrade BEAST since the AddOnManager is part of the + * BEAST.jar file that is loaded and needs to be replaced. + * + * Side effect is that after installing a package, opening a new BEAUti instance + * will fail (Windows only). + * + */ + private static void closeClassLoader() { + try { + if (Utils.isWindows()) { + URLClassLoader sysLoader = (URLClassLoader) AddOnManager.class.getClassLoader(); + sysLoader.close(); + } + } catch (IOException e) { + Log.warning.println("Could not close ClassLoader: " + e.getMessage()); + } + + } + + private static void deleteRecursively(File file, List<File> deleteFailed) { if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { @@ -1294,10 +1326,10 @@ public class AddOnManager { // sort result result.addAll(names); Collections.sort(result, (s1, s2) -> { - if (s1.equals(BEAST_PACKAGE)) { + if (s1.equals(BEAST_PACKAGE_NAME)) { return -1; } - if (s2.equals(BEAST_PACKAGE)) { + if (s2.equals(BEAST_PACKAGE_NAME)) { return 1; } return s1.compareTo(s2); @@ -1349,10 +1381,10 @@ public class AddOnManager { // sort result Collections.sort(result, (s1, s2) -> { - if (s1.equals(BEAST_PACKAGE)) { + if (s1.equals(BEAST_PACKAGE_NAME)) { return -1; } - if (s2.equals(BEAST_PACKAGE)) { + if (s2.equals(BEAST_PACKAGE_NAME)) { return 1; } return s1.compareTo(s2); @@ -1433,7 +1465,7 @@ public class AddOnManager { // Print formatted package information for (Package pkg : packageList) { - if (pkg.getName().equals(BEAST_PACKAGE)) { + if (pkg.getName().equals(BEAST_PACKAGE_NAME)) { ps.printf(nameFormat, pkg.getName()); ps.print(sep); ps.printf(statusFormat, pkg.getStatusString()); ps.print(sep); ps.printf(latestFormat, pkg.isAvailable() ? pkg.getLatestVersion() : "NA"); ps.print(sep); @@ -1447,7 +1479,7 @@ public class AddOnManager { // Print formatted package information for (Package pkg : packageList) { - if (!pkg.getName().equals(BEAST_PACKAGE)) { + if (!pkg.getName().equals(BEAST_PACKAGE_NAME)) { ps.printf(nameFormat, pkg.getName()); ps.print(sep); ps.printf(statusFormat, pkg.getStatusString()); ps.print(sep); ps.printf(latestFormat, pkg.isAvailable() ? pkg.getLatestVersion() : "NA"); ps.print(sep); diff --git a/src/beast/util/ClusterTree.java b/src/beast/util/ClusterTree.java index a02ac4c..72257c0 100644 --- a/src/beast/util/ClusterTree.java +++ b/src/beast/util/ClusterTree.java @@ -28,6 +28,7 @@ package beast.util; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; +import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Locale; @@ -70,7 +71,7 @@ public class ClusterTree extends Tree implements StateNodeInitialiser { double EPSILON = 1e-10; final public Input<Type> clusterTypeInput = new Input<>("clusterType", "type of clustering algorithm used for generating initial beast.tree. " + - "Should be one of " + Type.values() + " (default " + Type.average + ")", Type.average, Type.values()); + "Should be one of " + Arrays.toString(Type.values()) + " (default " + Type.average + ")", Type.average, Type.values()); final public Input<Alignment> dataInput = new Input<>("taxa", "alignment data used for calculating distances for clustering"); final public Input<Distance> distanceInput = new Input<>("distance", "method for calculating distance between two sequences (default Jukes Cantor)"); diff --git a/src/beast/util/JSONProducer.java b/src/beast/util/JSONProducer.java index 22464f6..8309a6f 100644 --- a/src/beast/util/JSONProducer.java +++ b/src/beast/util/JSONProducer.java @@ -20,7 +20,10 @@ import beast.app.BEASTVersion; import beast.core.BEASTInterface; import beast.core.Input; import beast.core.State; +import beast.core.parameter.BooleanParameter; +import beast.core.parameter.IntegerParameter; import beast.core.parameter.Parameter; +import beast.core.parameter.RealParameter; import beast.evolution.alignment.Alignment; import beast.evolution.tree.TraitSet; @@ -307,6 +310,10 @@ public class JSONProducer { buf.append(buf2); } return; + } else if (input.getName().startsWith("*")) { + // this can happen with private inputs, like in ThreadedTreeLikelihood + // and * is not a valid XML attribute name + return; } else if (value instanceof List) { if (!isShort) { StringBuffer buf2 = new StringBuffer(); @@ -338,7 +345,7 @@ public class JSONProducer { // Parameters can use short hand notation if they are not in the state // Note this means lower and upper bounds are lost -- no problem for BEAST, but maybe for BEAUti - if (value instanceof Parameter.Base) { + if (value instanceof BooleanParameter || value instanceof IntegerParameter || value instanceof RealParameter) { Parameter.Base parameter = (Parameter.Base) value; boolean isInState = false; for (Object o : parameter.getOutputs()) { @@ -347,12 +354,16 @@ public class JSONProducer { break; } } - if (!isInState) { - if (isShort) { - buf.append(" " + input.getName() + ": \"" + parameter.getValue() + "\""); - } else { - return; - } + if (!isInState && parameter.getDimension() == 1 && parameter.getMinorDimension1() == 1) { + // if not in state, bounds do not matter + //if ((parameter instanceof RealParameter && parameter.getLower().equals(Double.NEGATIVE_INFINITY) && parameter.getUpper().equals(Double.POSITIVE_INFINITY)) || + // (parameter instanceof IntegerParameter && parameter.getLower().equals(Integer.MIN_VALUE + 1) && parameter.getUpper().equals(Integer.MAX_VALUE - 1))) { + if (isShort) { + buf.append(" " + input.getName() + ": \"" + parameter.getValue() + "\""); + } else { + return; + } + //} } } diff --git a/src/beast/util/MersenneTwisterFast.java b/src/beast/util/MersenneTwisterFast.java index 5071480..6a73d84 100644 --- a/src/beast/util/MersenneTwisterFast.java +++ b/src/beast/util/MersenneTwisterFast.java @@ -585,7 +585,7 @@ public class MersenneTwisterFast implements Serializable { // Check for invalid input values if (a <= 0.0) throw new IllegalArgumentException(); - if (lambda <= 0.0) new IllegalArgumentException(); + if (lambda <= 0.0) throw new IllegalArgumentException(); if (a < 1.0) { // CASE A: Acceptance rejection algorithm gs b = 1.0 + 0.36788794412 * a; // Step 1 @@ -750,7 +750,7 @@ public class MersenneTwisterFast implements Serializable { * @param lambda mean of Poissonian distribution * @return Draw from Pois(lambda). Note: returns a double for historical reasons. */ - public double nextPoisson(double lambda) { + public long nextPoisson(double lambda) { if (lambda<12) return poissonian_icdf(lambda); diff --git a/src/beast/util/NexusParser.java b/src/beast/util/NexusParser.java index bf88ce9..290574e 100644 --- a/src/beast/util/NexusParser.java +++ b/src/beast/util/NexusParser.java @@ -435,7 +435,7 @@ public class NexusParser { //reading CHARSTATELABELS block if (str.toLowerCase().contains("charstatelabels")) { if (!alignment.dataTypeInput.get().equals("standard")) { - new Exception("If CHARSTATELABELS block is specified then DATATYPE has to be Standard"); + throw new IllegalArgumentException("If CHARSTATELABELS block is specified then DATATYPE has to be Standard"); } StandardData standardDataType = (StandardData)alignment.userDataTypeInput.get(); int[] maxNumberOfStates = new int[] {0}; diff --git a/src/beast/util/Package.java b/src/beast/util/Package.java index d0e6ac8..3c95e0c 100644 --- a/src/beast/util/Package.java +++ b/src/beast/util/Package.java @@ -175,7 +175,7 @@ public class Package { String depString = ""; for (PackageDependency packageDependency : availableVersionDeps.lastEntry().getValue()) { String s = packageDependency.dependencyName; - if (!s.equalsIgnoreCase(AddOnManager.BEAST_PACKAGE)) { + if (!s.equalsIgnoreCase(AddOnManager.BEAST_PACKAGE_NAME)) { depString += s + ", "; } } diff --git a/src/beast/util/PackageDependency.java b/src/beast/util/PackageDependency.java index e5c6208..9797843 100644 --- a/src/beast/util/PackageDependency.java +++ b/src/beast/util/PackageDependency.java @@ -45,7 +45,7 @@ public class PackageDependency { PackageVersion minimumVersion, PackageVersion maximumVersion) { if (dependencyName.equals("beast2")) { - dependencyName = AddOnManager.BEAST_PACKAGE; + dependencyName = AddOnManager.BEAST_PACKAGE_NAME; } this.dependencyName = dependencyName; diff --git a/src/beast/util/Randomizer.java b/src/beast/util/Randomizer.java index 5b83172..522148f 100644 --- a/src/beast/util/Randomizer.java +++ b/src/beast/util/Randomizer.java @@ -251,7 +251,7 @@ public class Randomizer { * @param lambda mean of Poissonian distribution * @return sample (as double for historical reasons) */ - public static double nextPoisson(double lambda) { + public static long nextPoisson(double lambda) { synchronized (random) { return random.nextPoisson(lambda); } diff --git a/src/beast/util/TreeParser.java b/src/beast/util/TreeParser.java index 4e65d22..daa7cea 100644 --- a/src/beast/util/TreeParser.java +++ b/src/beast/util/TreeParser.java @@ -463,8 +463,9 @@ public class TreeParser extends Tree implements StateNodeInitialiser { attribctx.attribValue().number().getText())); } else if (attribctx.attribValue().STRING() != null) { String stringValue = attribctx.attribValue().STRING().getText(); - if (stringValue.startsWith("\"") || stringValue.startsWith("\'")); + if (stringValue.startsWith("\"") || stringValue.startsWith("\'")) { stringValue = stringValue.substring(1, stringValue.length()-1); + } node.setMetaData(key, stringValue); } else { // BEAST doesn't do anything with vectors yet. diff --git a/src/beast/util/XMLProducer.java b/src/beast/util/XMLProducer.java index 4d77783..0429ba9 100644 --- a/src/beast/util/XMLProducer.java +++ b/src/beast/util/XMLProducer.java @@ -946,6 +946,10 @@ public class XMLProducer extends XMLParser { } } return; + } else if (input.getName().startsWith("*")) { + // this can happen with private inputs, like in ThreadedTreeLikelihood + // and * is not a valid XML attribute name + return; } else if (value instanceof List) { if (!isShort) { int k = 0; diff --git a/src/test/beast/evolution/operator/DeltaExchangeOperatorTest.java b/src/test/beast/evolution/operator/DeltaExchangeOperatorTest.java new file mode 100644 index 0000000..0801d65 --- /dev/null +++ b/src/test/beast/evolution/operator/DeltaExchangeOperatorTest.java @@ -0,0 +1,64 @@ +/** + * + */ +package test.beast.evolution.operator; + +import org.junit.Test; + +import beast.core.State; +import beast.core.parameter.IntegerParameter; +import beast.core.parameter.RealParameter; +import beast.evolution.operators.DeltaExchangeOperator; + +/** + * @author gereon + * + */ +public class DeltaExchangeOperatorTest extends TestOperator { + + @Test + public void testKeepsSum() { + DeltaExchangeOperator operator = new DeltaExchangeOperator(); + RealParameter parameter = new RealParameter(new Double[] {1., 1., 1., 1.}); + register(operator, + "parameter", parameter); + for (int i=0; i<100; ++i) { + operator.proposal(); + } + double i = 0; + for (Double p : parameter.getValues()) { + i += p; + } + assertEquals("The DeltaExchangeOperator should not change the sum of a parameter", i, 4, 0.00001); + } + + @Test + public void testKeepsWeightedSum() { + RealParameter parameter = new RealParameter(new Double[] {1., 1., 1., 1.}); + register(new DeltaExchangeOperator(), + "weightvector", new IntegerParameter(new Integer[] {0, 1, 2, 1}), + "parameter", parameter); + Double[] p = parameter.getValues(); + assertEquals("The DeltaExchangeOperator should not change the sum of a parameter", + 0*p[1]+1*p[1]+2*p[2]+1*p[3], 4, 0.00001); + } + + @Test + public void testCanOperate() { + // Test whether a validly initialised operator may make proposals + State state = new State(); + RealParameter parameter = new RealParameter(new Double[] { 1., 1., 1., 1. }); + state.initByName("stateNode", parameter); + state.initialise(); + DeltaExchangeOperator d = new DeltaExchangeOperator(); + // An invalid operator should either fail in initByName or make valid + // proposals + try { + d.initByName("parameter", parameter); + } catch (RuntimeException e) { + return; + } + d.proposal(); + } + +} diff --git a/src/test/beast/evolution/operator/TestOperator.java b/src/test/beast/evolution/operator/TestOperator.java new file mode 100644 index 0000000..b7352d7 --- /dev/null +++ b/src/test/beast/evolution/operator/TestOperator.java @@ -0,0 +1,52 @@ +/** + * + */ +package test.beast.evolution.operator; + +import java.util.ArrayList; +import java.util.HashMap; + + +import beast.core.Operator; +import beast.core.State; +import beast.core.StateNode; +import junit.framework.TestCase; + +/** + * @author gereon + * + */ +public abstract class TestOperator extends TestCase { + + static public void register(Operator operator, final Object... operands) { + HashMap<String, StateNode> operandsMap; + operandsMap = new HashMap<String, StateNode>(); + if (operands.length % 2 == 1) { + throw new RuntimeException("Expected even number of arguments, name-value pairs"); + } + for (int i = 0; i < operands.length; i += 2) { + if (operands[i] instanceof String) { + final String name = (String) operands[i]; + if (operands[i + 1] instanceof StateNode) { + final StateNode node = (StateNode) operands[i + 1]; + operandsMap.put(name, node); + } else { + throw new IllegalArgumentException("Expected a StateNode in " + (i + 1) + "th argument "); + } + } else { + throw new IllegalArgumentException("Expected a String in " + i + "th argument "); + } + } + State state = new State(); + state.initByName("stateNode", new ArrayList<StateNode>(operandsMap.values())); + state.initialise(); + Object[] operandsAndWeight = new Object[operands.length + 2]; + for (int i = 0; i < operands.length; ++i) { + operandsAndWeight[i] = operands[i]; + } + operandsAndWeight[operands.length] = "weight"; + operandsAndWeight[operands.length + 1] = "1"; + operator.initByName(operandsAndWeight); + operator.validateInputs(); + } +} diff --git a/src/test/beast/util/JSONTest.java b/src/test/beast/util/JSONTest.java index 2257ea1..09ffdd8 100644 --- a/src/test/beast/util/JSONTest.java +++ b/src/test/beast/util/JSONTest.java @@ -35,7 +35,7 @@ public class JSONTest extends TestCase { @Test public void testJSONFragmentParsing() throws Exception { JSONParser parser = new JSONParser(); - String json = "{version: \"2.3\",\n" + + String json = "{version: \"2.4\",\n" + "\n" + "beast: [\n" + "{spec:\"beast.core.parameter.RealParameter\",\n" + @@ -76,7 +76,7 @@ public class JSONTest extends TestCase { // test that default value for param1 comes through - String json2 = "{version: \"2.3\",\n" + + String json2 = "{version: \"2.4\",\n" + "namespace: \"beast.core:beast.evolution.alignment:beast.evolution.tree.coalescent:beast.core.util:beast.evolution.nuc:beast.evolution.operators:beast.evolution.sitemodel:beast.evolution.substitutionmodel:beast.evolution.likelihood\",\n" + "\n" + "beast: [\n" + @@ -103,7 +103,7 @@ public class JSONTest extends TestCase { // test that array of doubles comes through in second constructor - String json3 = "{version: \"2.3\",\n" + + String json3 = "{version: \"2.4\",\n" + "namespace: \"beast.core:beast.evolution.alignment:beast.evolution.tree.coalescent:beast.core.util:beast.evolution.nuc:beast.evolution.operators:beast.evolution.sitemodel:beast.evolution.substitutionmodel:beast.evolution.likelihood\",\n" + "\n" + "beast: [\n" + diff --git a/templates/ClockModels.xml b/templates/ClockModels.xml index 7de69b4..80d1860 100644 --- a/templates/ClockModels.xml +++ b/templates/ClockModels.xml @@ -83,13 +83,13 @@ c:$(n) </connect> <connect srcID='ExpCategoriesRandomWalk.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(expRateCategories.c:$(n))'>Randomly change categories of partition c:$(n) + if='inlikelihood(expRateCategories.c:$(n)) and expRateCategories.c:$(n)/estimate=true'>Randomly change categories of partition c:$(n) </connect> <connect srcID='ExpCategoriesSwapOperator.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(expRateCategories.c:$(n))'>Swap categories of partition c:$(n) + if='inlikelihood(expRateCategories.c:$(n)) and expRateCategories.c:$(n)/estimate=true'>Swap categories of partition c:$(n) </connect> <connect srcID='ExpCategoriesUniform.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(expRateCategories.c:$(n))'>Uniformly draw categories of partition c:$(n) + if='inlikelihood(expRateCategories.c:$(n)) and expRateCategories.c:$(n)/estimate=true'>Uniformly draw categories of partition c:$(n) </connect> <connect srcID='relaxedUpDownOperatorExp.c:$(n)' targetID='mcmc' inputName='operator' if='nooperator(FixMeanRatesOperator) and inlikelihood(ucedMean.c:$(n)) and inlikelihood(Tree.t:$(n)) and ucedMean.c:$(n)/estimate=true and Tree.t:$(n)/estimate=true'> @@ -161,16 +161,16 @@ c:$(n) </connect> <connect srcID='ucldStdevScaler.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(ucldStdev.c:$(n))'>Scale stdev of rate of partition c:$(n) + if='inlikelihood(ucldStdev.c:$(n)) and ucldStdev.c:$(n)/estimate=true'>Scale stdev of rate of partition c:$(n) </connect> <connect srcID='CategoriesRandomWalk.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(rateCategories.c:$(n))'>Randomly change categories of partition c:$(n) + if='inlikelihood(rateCategories.c:$(n)) and rateCategories.c:$(n)/estimate=true'>Randomly change categories of partition c:$(n) </connect> <connect srcID='CategoriesSwapOperator.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(rateCategories.c:$(n))'>Swap categories of partition c:$(n) + if='inlikelihood(rateCategories.c:$(n)) and rateCategories.c:$(n)/estimate=true'>Swap categories of partition c:$(n) </connect> <connect srcID='CategoriesUniform.c:$(n)' targetID='mcmc' inputName='operator' - if='inlikelihood(rateCategories.c:$(n))'>Uniformly draw categories of partition c:$(n) + if='inlikelihood(rateCategories.c:$(n)) and rateCategories.c:$(n)/estimate=true'>Uniformly draw categories of partition c:$(n) </connect> <connect srcID='relaxedUpDownOperator.c:$(n)' targetID='mcmc' inputName='operator' if='nooperator(FixMeanRatesOperator) and inlikelihood(ucldMean.c:$(n)) and ucldMean.c:$(n)/estimate=true and Tree.t:$(n)/estimate=true'> diff --git a/templates/Standard.xml b/templates/Standard.xml index 4ee839b..e8e79f2 100644 --- a/templates/Standard.xml +++ b/templates/Standard.xml @@ -331,7 +331,7 @@ <distribution spec="CompoundDistribution" id="prior"> <mergepoint id='aux-priors'/> </distribution> - <distribution spec="CompoundDistribution" id="likelihood"> + <distribution spec="CompoundDistribution" id="likelihood" useThreads="true"> <mergepoint id='aux-likelihoods'/> </distribution> </distribution> diff --git a/templates/StarBeast.xml b/templates/StarBeast.xml index a32718f..9929c92 100644 --- a/templates/StarBeast.xml +++ b/templates/StarBeast.xml @@ -161,7 +161,7 @@ <alignmentProvider id="Import Alignment" spec='BeautiAlignmentProvider' template='@StarBEASTPartitionTemplate'/> - <partitiontemplate id='StarBEASTPartitionTemplate' spec='BeautiSubTemplate' class='beast.evolution.likelihood.TreeLikelihood' mainid='mcmc'> + <partitiontemplate id='StarBEASTPartitionTemplate' spec='BeautiSubTemplate' class='beast.evolution.likelihood.ThreadedTreeLikelihood' mainid='mcmc'> <![CDATA[ <distribution id='treePrior.t:$(n)' spec='GeneTreeForSpeciesTreeDistribution' tree='@Tree.t:$(n)' speciesTree='@Tree.t:Species' speciesTreePrior='@SpeciesTreePopSize.Species'/> @@ -369,7 +369,7 @@ <distr spec="beast.math.distributions.OneOnX"/> </distribution> </distribution> - <distribution spec="CompoundDistribution" id="likelihood"> + <distribution spec="CompoundDistribution" id="likelihood" useThreads="true"> <mergepoint id='aux-likelihoods'/> </distribution> </distribution> diff --git a/version.xml b/version.xml index cc9b99b..9af90d5 100644 --- a/version.xml +++ b/version.xml @@ -1 +1 @@ -<addon name='BEAST' version='2.4.0' url="file:///Users/remco/tmp/BEAST.package.2.4.0.zip"/> +<addon name='BEAST' version='2.4.0' url="https://github.com/CompEvol/beast2/releases/download/2.4.0pre/BEAST.v2.4.0.addon.zip"/> -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/beast2-mcmc.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
