Changes in BLOG 0.3 (14 August 2008) ------------------- * Added a module for exact inference using variable elimination (VE). This inference engine can be invoked by running the runblog script with the option -e ve.VarElimEngine. It works only on BLOG models without unknown objects, that is, without number statements. * Added an implementation of first-order variable elimination with counting formulas (C-FOVE) as presented by B. Milch, L. S. Zettlemoyer, M. Haimes, and L. P. Kaelbling at AAAI 2008. This is an exact inference algorithm that exploits symmetries between objects to run faster than the standard VE algorithm. Like VE, it is currently applicable only to BLOG models without unknown objects. It can be invoked with the flag -e fove.LiftedVarElim. * Added the ability to specify undirected dependencies in BLOG model files using parfactors [D. Poole (2003) "Lifted Probabilistic Inference", Proc. 18th IJCAI]. The syntax for parfactors is explained in the brief tutorial on the BLOG web site. The VE and C-FOVE algorithms operate on both these explicitly specified parfactors, and parfactors constructed automatically from BLOG dependency statements. The sampling-based inference algorithms (likelihood weighting, etc.) currently ignore any explicitly specified parfactors. * Added a built-in type Timestep for use in dynamic BLOG (DBLOG) models. This type has guaranteed objects in one-to-one correspondence with the natural numbers. Timestep literals are represented in BLOG files as natural numbers prefixed with an @-sign, such as @0, @1, @2, etc. By convention, functions that vary over time take a Timestep as their last argument; an example is State(Aircraft, Timestep). The built-in function Prev maps each timestep to the previous timestep (@0 is mapped to Model.NULL). Internally, objects of type Timestep are represented as instances of class blog.Timestep. * This release includes a prototype particle filtering engine for DBLOG models (developed by Rodrigo de Salvo Braz based on initial code by Keith Henderson). It can be invoked with -e blog.ParticleFilter. If the useDecayedMCMC property is set to true with -PuseDecayedMCMC=true, the particle filter will do an iteration of MCMC on each particle at each time step (the number of MCMC iterations can be changed by setting the numMoves property). This allows the filter to recover from poor initial guesses about atemporal variables. Specifically, the particle filter uses a decayed MCMC proposer [B. Marthi, H. Pasula, S. Russell, and Y. Peres (2002) "Decayed MCMC Filtering", Proc. 18th UAI]. * Several bug fixes and internal improvements. Changes in BLOG 0.2 (14 December 2007) ------------------- * The functions formerly called "generating functions" are now called "origin functions". The keyword "origin" is now preferred for declaring these functions (although "generating" is still supported). * BLOG now includes statements that are both random function declarations and dependency statements. That is, you can write something like: random Color ObsColor(Draw d) ~ TabularCPD[[0.8, 0.2], [0.2, 0.8]](TrueColor(BallDrawn(d))); This statement simultaneously declares ObsColor as a random function that takes a Draw and returns a Color, and specifies the dependency model for this function. * Functions can now be overloaded. That is, you can declare several functions with the same name, as long as they have different argument types. The mapping from identifiers to Function objects is now resolved in FuncAppTerm.checkTypesAndScope, after the types of any logical variables in the function application term have been determined. * New CPD classes in blog.distrib: BoundedGeometric, CharDistrib, ChooseFromArgs, Iota, MixtureDistrib, StringEditModel, StringEditModelWithJumps, UniformVectorDistrib. * The code for evaluating set expressions can now compactly represent sets that consist of all the objects of a given type except for a few excluded objects. For instance, suppose we are sampling authors for a paper p without replacement: NthAuthor(p, n) ~ UniformChoice({Researcher r : !exists NaturalNum m ((m < n) & (NthAuthor(p, m) = r))}); Previously, the set passed to UniformChoice would have been represented by explicitly listing all the Researcher objects that did not appear earlier in the author list. Thus, the time to compute acceptance probabilities for MCMC moves affecting NthAuthor grew linearly with the number of hypothesized researchers. The new representation does not depend on the number of hypothesized researchers: it grows only with the length of the author list. This capability is implemented by the POPAppBasedSet class and CompiledSetSpec.getExplicitVersion. * Lots of other changes "under the hood". Most notably, the MutablePartialWorld class no longer exists. Instead, the PartialWorld interface includes mutator methods, and there is a class PartialWorldDiff that can represent a set of changes relative to any underlying PartialWorld object. Also, ObjectIdentifiers are now handled in a different way. When you are iterating over the extension of a type that is represented using ObjectIdentifiers, and you get to an object for which no ObjectIdentifier has been created yet, the PartialWorld now creates a new ObjectIdentifier automatically (rather than returning an IdentifierHook object as it did before). The PartialWorld maintains a distinction between ObjectIdentifiers that have been asserted by the client to exist, and ObjectIdentifiers that have only been used as return values and thus can be removed if necessary. * Lots of bug fixes. Changes in BLOG 0.1.6 (16 March 2007) --------------------- * Fixed a bug in common/BipartiteMatcher.java that sometimes caused it to return incomplete or non-optimal matches. Thanks go to the users who reported this bug. Changes in BLOG 0.1.5 (13 January 2006) --------------------- * Changed the parser so it no longer checks for type and scope errors, but leaves this to a separate phase of checking in the main body of the code. This allows proper handling of tuple set specifications, which cannot be scope-checked in the parser because variables are not declared until after they are used. It also ensures that statements and formulas that are added programmatically are still checked thoroughly. * Fixed bug in common/AbstractTupleIterator.java that prevented tuple set specifications from working properly. Changes in BLOG 0.1.4 (21 December 2005) --------------------- * Restored parser's ability to read number statements in the old syntax, as well as the new syntax introduced in version 0.1.3. * Added built-in non-random function Concat that concatenates two strings. * Corrected bugs in blog.distrib.Geometric. * Changed name of blog.distrib.BernoulliDistrib to blog.distrib.Bernoulli, and added ability to specify the success probability as a CPD argument. * Corrected bug that caused TabularCPD to throw an exception when a list of explicitly specified probabilities did not sum to one. * Corrected bug that caused the Boolean values "true" and "false" to be swapped in the displayed query results. * Corrected error in blog/SymbolEvidenceStatement.java that prevented it from compiling under Java 1.4. Changes in BLOG 0.1.3 (6 November 2005) --------------------- * Changed the syntax for number statements in an effort to make them clearer. For example, the number statement for radar blips generated by a given aircraft at a given time step is now: #Blip(Source = a, Time = t) ~ DetectionDistrib(State(a, t)); We believe this is much clearer than the old syntax, which was: #Blip: (Source, Time) -> (a, t) ~ DetectionDistrib(State(a, t)); Note that the syntax for number statements with no generating objects (such as #Ball ~ Poisson[6]) is unchanged. * Non-random constant and function definitions can now contain other non-random constants and functions. The inference engine checks that these definitions are acyclic. * Matrices that are written out in brackets can now contain arbitrary number-valued terms, not just numbers. * The observed value of a term in an observation statement can now be any term, not just a constant symbol. * Added several new CPDs to the blog.distrib package: Binomial, NegativeBinomial, UniformReal, Exponential, Gamma, and Beta. * Replaced blog.distrib.MultinomialDistrib with a new blog.distrib.Categorical CPD, which allows the parameter vector to be given as an argument. * Added a new file, examples/aircraft-wandering.mblog, containing a simplified version of the aircraft tracking model from [Milch et al., IJCAI 2005]. * The command line options that direct query results to files work now. * Recursive number statements no longer cause stack overflow errors. Changes in BLOG 0.1.2 (27 September 2005) --------------------- * Fixed numerical inaccuracy in the getProb method in blog/distrib/Poisson.java. It now avoids overflow by calling getLogProb and exponentiating the result. This problem was hidden in BLOG 0.1, but in version 0.1.1 it caused Metropolis-Hastings sampling with the UrnBallsSplitMerge proposal distribution to yield extremely bad results. Changes in BLOG 0.1.1 (21 September 2005) --------------------- * Added three new examples: - a university example often used for explaining probabilistic relational models (examples/grades.{mblog,eblog,qblog}); - a hidden Markov model (examples/hmm.{mblog,eblog,qblog}); - a Gaussian mixture model (examples/mixture.{mblog,eblog,qblog}). * It is now possible to declare a nonrandom constant or function without specifying its interpretation, and then give its interpretation later. This allows a relational skeleton to be specified separately from the model. See examples/grades.mblog and examples/grades.eblog. * Added two implementations of the FunctionInterp inferface: ListInterp and TabularInterp. These allow you to specify the interpretation of a non-random function (on a finite set of argument tuples) explicitly in a BLOG file. This is useful for specifying relational skeletons. * You no longer need to use parentheses after a CPD name when it takes no arguments. * Added != operator, and infix operators <, >, <=, >= for the corresponding built-in functions * Added built-in Succ and Pred functions on natural numbers. * TabularCPD now allows integers and natural numbers as the child type, defining a distribution over a prefix of the natural numbers. * Added character literals (such as 'a'), improved handling of escape sequences in string and character literals (now same as Java), implemented concatenation of consecutive string literals (as in C). * Fixed bug whereby compiled versions of set specifications might be incorrect if additional number statements occurred after the set specification in an input file. * Fixed bug whereby RejectionSampler wouldn't instantiate basic RVs corresponding to random constants introduced in evidence statements. * Fixed bug in sorting of histogram in query outputs. * Built-in functions now handle null arguments properly. * Makefiles no longer require GNU make. BLOG 0.1 (10 September 2005) -------- Initial release