Reference Example

Consider the following blog file which models the example given on page 3 in the tech report. We assume at least four instances of Person and Disease, respectively.

type Disease;
guaranteed Disease d[4];
type Person;
guaranteed Person p[4];

random Boolean Epidemic(Disease);
random Boolean Sick(Disease, Person);

// phi_1
parfactor Disease D .
    MultiArrayPotential[[0.1, 0.9]]
    (Epidemic(D));

// phi_2
parfactor Disease D, Person P .
    MultiArrayPotential[[0.3, 0.1, 0.3, 0.2]]
    (Epidemic(D), Sick(D,P));

// some evidence
obs(Sick(d1, p1)) = true;
obs(Sick(d1, p2)) = true;
obs(Sick(d1, p3)) = true;
obs(Sick(d2, p1)) = true;
obs(Sick(d2, p2)) = true;

// queries
query Epidemic(d1);
query Epidemic(d2);
query Epidemic(d3);
query Sick(d3, p1);
 

The given model has observations for parameterised random variables with two logical variables. Only one variable will be handled lifted by the lifted absorption operator implemented by Taghipour.

Example Output

The result (parsing and jtree construction omitted) is the distribution for the query variables, followed by additional information about the inference procedure.

Trial 0:
======== Query Results =========
Distribution of values for Epidemic(d1)
    0.9183673469387755    false
    0.0816326530612245    true

Distribution of values for Epidemic(d2)
    0.9336099585062241    false
    0.06639004149377595    true

Distribution of values for Epidemic(d3)
    0.9564699880972624    false
    0.04353001190273764    true

Distribution of values for Sick(d3, p1)
    0.6065295017854107    true
    0.3934704982145894    false

Additional Information

During execution, some helpful statistics are printed out.

engine    fojt.LiftedJTEngine
name    website-example
|G|    2
|gr|    20
|Q|    4
|E|    5
size    1
width    2

The first part gives information about the inference procedure and the model, where

  • |G| is the number of (par)factors in the model
  • |gr| the number of factors in G grounded
  • |Q| the number of queries
  • |E| the number of observations introduced
  • size is the number of nodes in the (first-order) junction tree
  • width is the largest number of (parameterised) random variables in a node of the (FO) jtree

The example highlights how to write a model and what the output of the program means. But, the example is not a well-suited one for the lifted junction tree algorithm as the output shows that the constructed junction tree has only one node and thus query answering coincides with lifted variable elimination.

Split times
t_0    58571842 ns    58 ms
t_1    311526 ns    0 ms
t_2    12514156 ns    12 ms
t_3    6134797 ns    6 ms
t_4    4896715 ns    4 ms
t_5    5695728 ns    5 ms
t_6    4810088 ns    4 ms
t_total    109216890 ns    109 ms

The second part prints the time required for

  • t_0 tree construction
  • t_1 entering evidence
  • t_2 message passing in the tree
  • t_3 to t_k time for individual queries (up to k-2)
  • t_total overall running time

mem    1627368 B    1589 kB

This line lists the required memory as given by Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()

VE ops    tot=SO,CC,CE,Pr,Ab,Sp
VE ops    51=25,0,0,0,10,16

The variable elimination operations are counted, given by

  • tot = total number of VE operations
  • SO = splitting operations
  • CC = counting conversions
  • CE = counting expansion
  • Pr = Propositionalization
  • Ab = Absorption
  • Sp = Splitting