0.98.0 INTERNAL CHANGES * The private copy of libRmath in JAGS is now installed as a shared library libjrmath. 0.97.1 Various bug fixes from 0.97 0.97 USER VISIBLE CHANGES * When a model is dumped to jags.dump, all named nodes in the model are written. INTERNAL CHANGES * Major code reorganization with the functions, distributions and samplers now in loadable modules. This has implications for ownership of dynamically allocated objects, as objects created in a loadable module must also delete them. The FuncTab and DistTab classes no longer take ownership of functions/distributions they contain. * The Compiler class uses static tables of distributions and functions (as these must be accessible to loadable modules). The Model class uses a static vector of sampler factories (for the same reason). * When reading values from NodeArray or SymTab, a boolean function is used to select the required nodes. The functions to read all values are redundant - since you can supply a trival function that always returns true - and have been removed. The Console::dumpState function takes three different flags: DUMP_PARAMETERS, DUMP_DATA, and DUMP_ALL. The last flag is used after an error. * The function Node::isStochastic has been renamed Node::isVariable. CONFIGURATION CHANGES * The lex/flex library is no longer linked. This was unnecessary, and caused problems on IRIX building a shared library. 0.90 BUG FIXES * All aspects of the log normal distribution (density, distribution function, quantile function, random samples) were incorrect due to a mis-specification of the standard deviation, which was calculated as the *square* of 1/tau (where tau is the scale parameter) instead of the *square root* . * The Chi-squared distribution is referred to as "dchisqr" in the BUGS language and not "dchisq" as I previously assumed. * The quantile function for the negative binomial function was incorrect. USER-VISIBLE CHANGES * The following distributions have new restrictions on valid parameters dbin(p,n) n must be discrete-valued. CONFIGURATION CHANGES * Removed redundant test for lm in configure.ac, which was causing warnings on IRIX and failures on Solaris. * Fixed test for sunperf in acx_blas.m4 to use -xlic_lib=sunperf. INTERNAL CHANGES * LeftRangeIterator and RightRangeIterator have been replaced with a single class (RangeIterator) with member functions nextLeft and nextRight. Counter is now a scalar RangeIterator. * SubSetIndex is now obsolete and has been removed. * Fixed bugs revealed by the SGI CC compiler. Unfortunately, the MipsPro compiler refuses to do dynamic casting to an incomplete type, a technique which was used a lot in the JAGS source. In fact this not covered by the C++ standard (although it is supported by the GNU compiler) so I have been forced to rewrite some of the Distribution and Sampler code. 0.81 BUG FIXES * Fixed out-of-range error when dumping CODA output from a subset of a multivariate node. INTERNAL CHANGES * New member functions Range::(left/right)Index which invert Range::(left/right)Offset. * Samplers are now created in the context of a given graph. So many of the functions now take an extra Graph argument. * Model::initialize is now much more efficient. It calculates a sampling graph that excludes all uninformative nodes (i.e. nodes with no observed descendants), so the Sampler constructors do not have to repeatedly do the same calculation. (Thanks to Geoff Evans, who supplied an example where JAGS was extremely inefficient) * Node::hasDescendant has been removed as it is no longer used and there are no bounds on its complexity. * MixtureNode has been remodelled so that it no longer requires a separate OffsetNode. Hence the OffsetNode and OffsetFactory classes have been removed. SubSetIndex has been moved from the graph directory to the compiler directory. * SymTab now calculates the names of MixtureNodes dynamically instead of storing them at compile time. This was very inefficient in models with a large number of mixture nodes. * A new sampler - Censored - samples interval-censored observations. It is created by the ConjugateFactory. 0.80 BUG FIXES * The log likelihood was not correctly calculated for unobserved stochastic nodes with a binomial distribution. This affected the PIGS example. * The default method for checking the parameter dimensions for real-valued distributions (DistReal::checkParameterDim) only checked that the _first_ parameter was scalar, e.g. in the expression "x ~ dnorm(mu, tau)", tau could have been a vector. USER VISIBLE CHANGES * New distribution "dsum" - the sum of two discrete-valued stochastic nodes. This is another observable function, like dinterval. * New function "rank" for calculating the ranks of the elements of a vector. This behaves like the R function rank, rather than the BUGS version, returning a vector of ranks. * A deviance node is now created automatically, unless the user has already defined a variable called "deviance". * Unbounded discrete-valued distributions (e.g. Poisson) can be sampled with the new Discrete Slice Sampler. INTERNAL CHANGES * Nodes no longer store their name. Names are generated dynamically when needed. * Identical Range objects now share their memory. Range is now a wrapper class around a new class RangeImp which implements the member functions. * The NodeArray class is more memory efficient as it no longer uses an internal map between Ranges and Nodes. * Changed names of NodeArray::get and NodeArray::set to "insert" and "find", following STL conventions more closely. * Unused class SubSetNode removed. * UnaryMinus function renamed to NEG * The BUGSModel class is now used by the Compiler. It has overloaded methods for setting and clearing monitors based on name and range. * The parameters of a LogicalNode are set in the constructor. * OffsetNodes are no longer constructed for 1-dimensional mixture models, since they are redundant. * A new Sampler class Slicer implements both the the "doubling" method and "stepping" method for slice sampling. The previous class SliceSampler is replaced with RealSliceSampler, which is a subclass of Slicer. DiscreteSliceSampler and DSumSampler are both subclasses. * Improved performance of BUGSModel::coda by avoiding unneccesary buffer flushing from the std::endl manipulater: using '\n' instead. * Improved performance of ConjugateNormalSampler and ConjugateGammaSampler by reducing the number of calls to Sampler::setValue from 3 to 2. 0.75 BUG FIXES * Constant nodes can no longer be initialized. * The command PARAMETERS IN no longer ignores initial values for nodes that have been declared but not defined. It will give an error message instead. * MixtureNodes were sometimes being unnecessarily created when fixed subsets were being taken. USER VISIBLE CHANGES * Variable declaration is now optional. If you omit a variable declaration, then JAGS will attempt to determine its dimension from the data table, and failing this from the LHS of the relations. * Data transformations can now be defined inside a separate data block. See the manual for details * In data and parameter files, attributes of R structures are now correctly parsed. You can now dump, for example, matrices with dimnames and use them as data or initial values. * A new function "sort" for sorting the elements of a vector (untested). * C-style block quotes are now allowed in model files. * The progress bar printed during updating is longer (40 stars), and a guide bar shows you how long it will be. The UPDATE command has a BY option so that you can alter the refresh rate during updates. INTERNAL CHANGES * Compiler changes - The compiler classes have been split off into a new directory. - All deterministic node subclasses, along with Constant Nodes, have their own factory object, which is used to maximize reuse of existing nodes when compiling the model. These changes have led to modest speed increases, but there is a dramatic improvement for the LEUK example which now runs 2.5 times faster. * More file input/output moved from the JAGS library into the terminal program * Compiler::fillConstants is now gone. This role is taken over by Symtab::setValue. * The above change means that there is no need for a default constructor for ConstantNodes, so this is now gone. All ConstantNodes have their value set when they are constructed. * A new BUGSModel class, which is currently unused. * The Fortran linking fix for MacOs X has been improved. We no longer redifine the official autoconf macros. Thanks to Bill Northcott. 0.65 * Modified parser and scanner in the terminal front-end to use C++ strings instead of C character arrays. This solves a problem on SuSE with variable and file names being mangled. * Attempting to initialize the model before compiling it no longer leads to a crash. * Parse errors occuring in data and parameter files are now more clearly indicated. * Sampling order has been changed so that a node is always sampled before its parents. This appears to help in problems where there is a large transient after initialization (birats, kidney). * Three configuration fixes for Mac Os X: We now have a modified version of AC_F77_LIBRARY_LDFLAGS that strips lcrt1.o and lcrt2.o. We link to -lcc_dynamic on Mac Os X. We check for BLAS and LAPACK in vecLib using a modified version of acx_blas.m4 from Octave. Thanks to Chris Jackson. * The class ScalarArgScalarFunc was not necessary and has been removed. * Samplers may now have a "burnin" mode to adapt their behaviour at the beginning of the chain. Burnin mode is turned off when the first monitor is set. * The distribution of a StochasticNode is now set in the constructor. The setDistribution member function is removed. * The function of a LogicalNode is set in the constructor. The setFunction member function is removed. * The compiler has been changed so that expressions "a <- b" are handled more efficiently. The identity function is no longer required and has been removed. The _fast flag is no longer required in conjugate samplers. * The algorithm in classifyNode (Sampler.cc) is more efficient as it avoids repeat testing of the same node. * Rmath.h is now systematically included last. This prevents problems with symbols being redefined using the C preprocessor. * R-style comments can now be embedded in data files. 0.25 -> 0.50 * Fixed a bug in DMNorm::randomsample that affected multivariate normal variables of length 3 or more, and another bug that gave a length mismatch error when forward sampling multivariate normal nodes. * Fixed a bug in ConjugateMNormal sampler that affected nodes with multivariate normal children. * The SCHOOLS example now runs correctly. * Created a new class SamplerFactory for creating samplers. The process of choosing samplers is now more general and this paves the way for samplers that update several nodes at once. * Version number bumped up to 0.50 to celebrate beta status. 0.24 * Replaced the ARM sampler with a slice sampler. * Fixed a bug in the Conjugate Normal sampler which prevented it from recognizing cases where it could sample. This bug had also been copied to the multivariate normal sampler. * The two changes above give some important speed improvements. * LICENCE CHANGE. The license is now pure GPL, with no exception for linking with the arms software by Wally Gilks. * ConstantNodes are now a distinct class from DeterministicNodes. * There are now restrictions on Data and Parameter (initial value) files. It is illegal to set the value of a logical node, as doing so may leave the graph in an inconsistent state (which, incidentally, may put the slice sampler in an infinite loop). The values of deterministic nodes are now calculated internally, but you may set the values of constant nodes in the data file, and stochastic nodes in either file. * Distribution::checkParameterDim now checks the value as well as the parameters, like Function::checkParameterDim. * The abstract class DistScalar has been removed. It was not necessary. * Fixed a bug in DMulti that only allowed the parameter p to be scalar. DInterval should also now work with vector cutpoints. * Fixed the ConjugateMNormal sampler, which now runs the BIRATS example correctly 0.23 * The matrix exponential is now calculated by the standard method of Pade approximation with scaling and squaring. * The ConjugateGamma sampler now works with mixture models. Thanks to Bettina Gruen <gruen@ci.tuwien.ac.at> for the patch. * The "Inits" statement is deprecated, and is replaced by the "parameters in" statement, which can be used at any time to set the value of unobserved nodes. New statements "data to" and "parameters to" can be used to write the data values, or current parameter values, to file. * Fixed a bug in Model::checkGraph which prevented forward sampling of non-informative Poisson. Thanks to Greg Ridgeway <gregr@rand.org>. * The ParseTree class has been rewritten, with consequent changes to the parser and compiler. * Some minor optimizations, e.g. SArray::value is inlined. * Functions with a variable number of arguments are now possible. The functions min and max, and the inline functions '*' and '+' now have variable arguments. This leads to a reduction in the number of nodes in the graph and a consequent increase in speed (along with the optimizations). The EPIL example now runs about 25% faster. * Min and Max now act like the equivalent functions in R: they take a variable number of array arguments, and will return the maximum of all the values present in those arguments. This means that the incompatibility with BUGS introduced in version 0.21 is gone. * Fixed a bug in forward sampling of truncated discrete distributions and truncated binomial distributions, in which the lower limit was never sampled. Thanks to Greg Ridgeway <gregr@rand.org> 0.22 * Fixed the ConjugateMNormal sampler so that it now handles more cases. 0.21 * max() and min() functions now take a single vector argument, like mean() * Seed setting fixed in the JAGS terminal. Previously the seed command did nothing. Thanks to Bettina Gruen <gruen@ci.tuwien.ac.at> * JAGS can now be built in a separate directory from the source directory. In particular, "make distcheck" now works. * Fixed error introduced in 0.20 when calculating upper bounds. * Responsibility for updating noninformative nodes has shifted from the Sampler to the Model. This means that these nodes are updated only once per iteration, with consequent gains in efficiency. * The ForwardSampler class is no longer necessary. * Graph::getSortedNodes has more built-in checks, and will throw an exception if they fail. * There was a serious bug in DistDiscrete::randomSample leading to incorrect samples being drawn. This has been fixed. * Conjugate samplers now work correctly with truncated variables. * The dump format has changed. It now uses the same R dump format as initial value and data files. * MATHLIB_STANDALONE is now defined in the header file config.h * ARMSampler now sticks at the current value if the loglikelihood is infinite. This occurs in the LITTERS example. * Model::initialize no longer enters an infinite loop if an uninitialized constant node is used in the model. * The inverse link functions ILogit and Phi could return a value of exactly 1 due to rounding error, which would lead to some nodes being apparently inconsistent with the data. These functions now return 1 - DBL_EPSILON instead. Similarly they return DBL_EPSILON instead of 0. 0.20 * Changes required to build JAGS with gcc 2.95-4 and 3.0.4 Thanks to Chris Jackson <chris.jackson@imperial.ac.uk>. * Installation of the shared library has been disabled by default. You can re-enable it with ./configure --enable-shared. * Rearranged headers to minimize dependencies in the JAGS library. * DMulti is no longer (and should never have been) a subclass of DistScalar. * Try to speed up calculation of binomial likelihood when size parameter is constant. * Corrected random samplers for Dirichlet and Discrete distributions. * ForwardSampler now updates all deterministic children of sampled node. * Fixed constructor for Model (_cansample is now initialized to false). 0.19 * Bugfix release. Scalar nodes were causing a compiler error. 0.18 * Separate installation of terminal and library. 0.17 * Corrected CODA output with thinning interval != 1 * Added Bernoulli distribution to DistTab (It had been forgotten) * Allow negative numbers as parameters to distributions and the truncation construct T(,). * Added separate initialize command to scripting language (this is required to handle multiple chains, which we can't do yet, but it is better to put this in place now) * Fixed bug in CODA output which claimed that whole nodes were not being monitored 0.16 * Allow C-style block comments in script files * Use config.h * Use T(,) syntax for truncation to avoid confusion with I(,) in WinBUGS. 0.15 * Changes to the console, now renamed the terminal. Now uses a Stata style scripting language. * Distribution class names and file names have been changed to correspond with the names in the BUGS language * DistTab is a proper class. You can now add new distributions to the DistTab. * FuncTab is a proper class, like DistTab * More extensive use of Standard Template Library * Lots of documentation * Lots of cruft removal 0.14 * SubSetNodes with variable indices have been removed completely (were deprecated in release 0.12) * NodeArray has been taken out of the graph directory and put in the compiler directory 0.13 No major changes in functionality. Some architecture changes instead * GraphNode is renamed to Node * Parameter is renamed to SArray (a more sensible name, given that it is based on arrays in S) * Node is no longer a subclass of SArray. Instead, Node contains an SArray as a public data member. * Major changes in the directory structure. Source for the console is now in a separate directory from the JAGS library, which is in turn divided into several subdirectories. Currently, the JAGS library is a "convenience library" created with libtool, so is not installed. This will change when the class interfaces are nailed down. 0.12 * ConjugateGamma sampler now works with Weibull children and Double exponential children. * GraphNode::hasDescendant fixed (would incorrectly return false under certain circumstances). * FiniteSampler fixed (would always sample from the prior). * Conjugate Normal sampler now works correctly with bounded nodes. * New distribution "dinterval" (class DistInterval) for handling interval censored observations. * Conjugate Normal sampler now works correctly with mixture models. * Added matrix functions inverse and logdet. * Added Wishart and Multivariate Normal distributions. * Added Conjugate samplers for Wishart and Multivariate Normal * SubSetNodes with variable indices are now deprecated: Mixture models are now represented with a new class "MixtureNode", and related class "OffsetNode". 0.11 * Added conjugate samplers for normal, gamma (including exponential and chi square) and beta distributions. * Fixed important bug that led to likelihood being evaluated twice (!) * ATTENTION: The dump format has changed for Trace Monitors. 0.10 * New experimental distribution dmstate for transitions in multi-state Markov models. * BLAS and LAPACK libraries now required (for the above, but they will be needed for multivariate normal and Wishart distributions later) * Parameter class is no longer a virtual class. Takes some functionality from GraphNode and avoids a lot of code repetition. However, there may be a performance hit. * Parameter checking added for functions and distributions. * addParent and removeParent are no longer virtual functions (a preliminary for removing graphical computations to a separate library) 0.9 * Further speed improvements. The parser tries to interpret index expressions on the right hand side of a relation in order to avoid creating unnecessary nodes and - in particular - SubSet nodes, which are computationally very expensive. There is a corresponding increase in speed for the BONES example. 0.8 * The ArrayNode class is abolished and is replaced with two different classes: NodeArray: A container for nodes. Also a factory object that will create aggregate nodes or subset nodes to represent fixed/stochastic subsets respectively. AggNode: Aggregate nodes. Simply copies its values from other nodes. Several different nodes can be aggregated together to create an AggNode. This leads to an enormous improvement in speed for the LSAT example. * Runs the KIDNEY example 0.7 * Updating of deterministic nodes no longer takes place automatically, but is the responsibility of the sampler. This was done in response to profiling of the LSAT example. 0.6 * Nested indexing now works 0.5 * Fixed segfault when quitting before defining a model. * User may now choose the thinning interval for monitors * Runs the LITTERS example * funclib remodelled to use the new Parameter base class. FuncTrees are now obsolete. The compiler creates additional logical nodes for complex expressions. NOTE: This change creates an enormous performance hit in the EPIL example, which has a rather complex linear expression. This suggests that a special function for bi-linear expressions may be useful in a future version. * Added regression test suite based on the classic BUGS examples, vol1. Since this is based on copyright material, it is not included in the distribution. 0.4 * Major rewrite of libdist with corresponding changes to Stochastic nodes * Introduced a new base class Parameter * Some examples broken: - epil2.bug crashes with a hard-to-trace bug that is overwriting memory - blockert.bug crashes with error from arms sampler Remember this is still alpha software 0.3 * License conditions on ARMS software clarified in file AUTHORS * Runs the PUMP example * Bug in logDensity for the Gamma distribution fixed * Monitoring of whole multivariate nodes now works correctly * Names of nodes in dumped output from TraceMonitor are now correct (when monitoring the whole node) * Runs the SEEDS example (seeds.bug, seedssig.bug seedsuni.bug, seedspar.bug) * Fixed updating of array nodes by adding the contents as parents * Runs the SURGICAL example (surgical.bug, surgfix.bug, surgrnk.bug) * Changed ARMSsampler so that it starts with extremely conservative bounds around the current value. * Runs the SALM example (with gamma and pareto prior) * Runs the DYES example * Runs the STACKS example (with normal, logistic, double exponential, and t_4 errors) * Runs the EPIL example (epil2.bug, epil3.bug) * Runs the BLOCKER example (blocker.bug, blockert.bug, but NOT blockht.bug) * Runs the OXFORD example (but with poor agreement for sigma due to poor mixing of this parameter) * Runs the LITTERS example 0.2 * Fixed bugs in TraceMonitor - Last monitored value correctly recorded - mcpar attributes now correct * Added initialize method for Model * Nodes now sampled in forward-sampling order (but is this efficient?) * Initialize includes check that graph is complete * Can now monitor (some) multivariate nodes * Dump format changed. It is no longer compatible with the mcmc class used in the coda library, so the class attribute is now "mcarray". This is a provisional name * Runs the first real example: RATS, including the version with missing values (data in "ratsmiss.dat"), but - very slow because there is no conjugate sampler, and - higher autocorrelation than BUGS. This may be due to the choice of sampling order. 0.1 First public release (18/12/2002). Runs the "line" example, but does little else.