From cb6715664b0fee07e16402c0fb24b12721cb8859 Mon Sep 17 00:00:00 2001 From: Tiago Gomes Date: Fri, 12 Apr 2013 23:49:12 +0100 Subject: [PATCH] Create a HTML version of the manual --- packages/CLPBN/html/index.html | 466 ++++++++++++++++++++++++++++++ packages/CLPBN/html/pfl.css | 111 +++++++ packages/CLPBN/html/sprinkler.png | Bin 0 -> 31485 bytes 3 files changed, 577 insertions(+) create mode 100644 packages/CLPBN/html/index.html create mode 100644 packages/CLPBN/html/pfl.css create mode 100644 packages/CLPBN/html/sprinkler.png diff --git a/packages/CLPBN/html/index.html b/packages/CLPBN/html/index.html new file mode 100644 index 000000000..d25008cc0 --- /dev/null +++ b/packages/CLPBN/html/index.html @@ -0,0 +1,466 @@ + + + + + + + + +The Prolog Factor Language + + + + +
+ +
+

Prolog Factor Language

+
+ + + +
vscat gmail.com
tiago.avvat gmail.com
+
+
+ +
+ + +
+ + + +

Introduction

+The Prolog Factor Language (PFL) is a language that extends Prolog for providing a syntax to describe first-order probabilistic graphical models. These models can be either directed (bayesian networks) or undirected (markov networks). This language replaces the old one known as CLP(BN). + +

The package also includes implementations for a set of well-known inference algorithms for solving probabilistic queries on these models. Both ground and lifted inference methods are support.

+ +

Back to the top

+ + + + + + +

Installation

+PFL is included with the YAP Prolog system. However, there isn't yet a stable release of YAP that includes PFL and you will need to install a development version. To do so, you must have installed the Git version control system. The commands to perform a default installation of YAP in your home directory in a Unix-based environment are shown next. +

+

+

$ cd $HOME

+

$ git clone git://yap.git.sourceforge.net/gitroot/yap/yap-6.3

+

$ cd yap-6.3/

+

$ ./configure --enable-clpbn-bp --prefix=$HOME

+

$ make depend & make install

+
+ +

In case you want to install YAP somewhere else or with different settings, please consult the YAP documentation. From now on, we will assume that the directory $HOME ▷ bin (where the binary is) is in your $PATH environment variable.

+ +

Once in a while, we will refer to the PFL examples directory. In a default installation, this directory will be located at $HOME ▷ share ▷ doc ▷ Yap ▷ packages ▷ examples ▷ CLPBN.

+ +

Back to the top

+ + + + + + +

Language

+A first-order probabilistic graphical model is described using parametric factors, commonly known as parfactors. The PFL syntax for a parfactor is + +
+
+Type   F   ;   Phi   ;   C. +
+
+
+ +Where, +
    +
  • + Type refers the type of network over which the parfactor is defined. It can be bayes for directed networks, or markov for undirected ones. +

    +

  • + +
  • + F is a comma-separated sequence of Prolog terms that will define sets of random variables under the constraint C. If Type is bayes, the first term defines the node while the remaining terms define its parents. +

    +

  • + +
  • + Phi is either a Prolog list of potential values or a Prolog goal that unifies with one. Notice that if Type is bayes, this will correspond to the conditional probability table. Domain combinations are implicitly assumed in ascending order, with the first term being the 'most significant' (e.g. + x0y0, + x0y1, + x0y2, + x1y0, + x1y1, + x1y2). +

    +

  • + +
  • + C is a (possibly empty) list of Prolog goals that will instantiate the logical variables that appear in F, that is, the successful substitutions for the goals in C will be the valid values for the logical variables. This allows the constraint to be defined as any relation (set of tuples) over the logical variables. +
  • +
+ +Sprinkler Network + +

Towards a better understanding of the language, next we show the PFL representation for the sprinkler network found in the above figure.

+ +
+
+:- use_module(library(pfl)).
+
+bayes cloudy ; cloudy_table ; [].
+
+bayes sprinkler, cloudy ; sprinkler_table ; [].
+
+bayes rain, cloudy ; rain_table ; [].
+
+bayes wet_grass, sprinkler, rain ; wet_grass_table ; [].
+
+cloudy_table(
+    [ 0.5,
+      0.5 ]).
+
+sprinkler_table(
+    [ 0.1, 0.5,
+      0.9, 0.5 ]).
+
+rain_table(
+    [ 0.8, 0.2,
+      0.2, 0.8 ]).
+
+wet_grass_table(
+    [ 0.99, 0.9, 0.9, 0.0,
+      0.01, 0.1, 0.1, 1.0 ]).
+
+
+ +

In the example, we started by loading the PFL library, then we have defined one factor for each node, and finally we have specified the probabilities for each conditional probability table.

+ +

Notice that this network is fully grounded, as all constraints are empty. Next we present the PFL representation for a well-known markov logic network - the social network model. For convenience, the two main weighted formulas of this model are shown below.

+ +
+
+1.5 : Smokes(x) => Cancer(x)
+1.1 : Smokes(x) ^ Friends(x,y) => Smokes(y)
+
+
+ +

Next, we show the PFL representation for this model.

+ +
+
+:- use_module(library(pfl)).
+
+person(anna).
+person(bob).
+
+markov smokes(X), cancer(X) ;
+    [4.482, 4.482, 1.0, 4.482] ;
+    [person(X)].
+
+markov friends(X,Y), smokes(X), smokes(Y) ;
+    [3.004, 3.004, 3.004, 3.004, 3.004, 1.0, 1.0, 3.004] ;
+    [person(X), person(Y)].
+
+
+ +

Notice that we have defined the world to be consisted of only two persons, anna and bob. We can easily add as many persons as we want by inserting in the program a fact like person @ 10. . This would automatically create ten persons named p1, p2, ..., p10.

+ +

Unlike other fist-order probabilistic languages, in PFL the logical variables that appear in the terms are not directly typed, and they will be only constrained by the goals that appears in the constraint of the parfactor. This allows the logical variables to be constrained to any relation (set of tuples), and not only pairwise (in)equalities. For instance, the next example defines a network with three ground factors, each defined respectively over the random variables p(a,b), p(b,d) and p(d,e).

+ +
+
+constraint(a,b).
+constraint(b,d).
+constraint(d,e).
+
+markov p(A,B); some_table; [constraint(A,B)].
+
+
+ +

We can easily add static evidence to PFL programs by inserting a fact with the same functor and arguments as the random variable, plus one extra argument with the observed state or value. For instance, suppose that we know that anna and bob are friends. We can add this knowledge to the program with the following fact: friends(anna,bob,t). .

+ +

One last note for the domain of the random variables. By default, all terms instantiate boolean (t/f) random variables. It is possible to choose a different domain for a term by appending a list of its possible values or states. Next we present a self-explanatory example of how this can be done.

+ +
+
+bayes professor_ability::[high, medium, low] ; [0.5, 0.4, 0.1].
+
+
+ +

More probabilistic models defined using PFL can be found in the examples directory.

+ +

Back to the top

+ + + + + + +

Querying

+In this section we demonstrate how to use PFL to solve probabilistic queries. We will use the sprinkler network as example. + +

Assuming that the current directory is the one where the examples are located, first we load the model with the following command.

+ +

$ yap -l sprinkler.pfl

+ +

Let's suppose that we want to estimate the marginal probability for the WetGrass random variable. To do so, we call the following goal.

+ +

?- wet_grass(X).

+ +

The output of this goal will show the marginal probability for each WetGrass possible state or value, that is, t and f. Notice that in PFL a random variable is identified by a term with the same functor and arguments plus one extra argument.

+ +

Now let's suppose that we want to estimate the probability for the same random variable, but this time we have evidence that it had rained in the day before. We can estimate this probability without resorting to static evidence with:

+ +

?- wet_grass(X), rain(t).

+ +

PFL also supports calculating joint probability distributions. For instance, we can obtain the joint probability for Sprinkler and Rain with:

+ +

?- sprinkler(X), rain(Y).

+ +

Back to the top

+ + + + + + +

Inference Options

+PFL supports both ground and lifted inference methods. The inference algorithm can be chosen by calling set_solver/1. The following are supported: + +
    +
  • ve, variable elimination (written in Prolog)
  • +
  • hve, variable elimination (written in C++)
  • +
  • jt, junction tree
  • +
  • bdd, binary decision diagrams
  • +
  • bp, belief propagation
  • +
  • cbp, counting belief propagation
  • +
  • gibbs, gibbs sampling
  • +
  • lve, generalized counting first-order variable elimination (GC-FOVE)
  • +
  • lkc, lifted first-order knowledge compilation
  • +
  • lbp, lifted first-order belief propagation
  • +
+ +

For instance, if we want to use belief propagation to solve some probabilistic query, we need to call first:

+ +

?- set_solver(bp).

+ +

It is possible to tweak some parameters of PFL through set_pfl_flag/2 predicate. The first argument is a option name that identifies the parameter that we want to tweak. The second argument is some possible value for this option. Next we explain the available options in detail.

+ +

verbosity

+This option controls the level of debugging information that will be shown. +
    +
  • Values: a positive integer (default is 0 - no debugging). The higher the number, the more information that will be shown.
  • +
  • Affects: hve, bp, cbp, lve, lkc and lbp.
  • +
+

+For instance, we can view some basic debugging information by calling the following goal. +

?- set_pfl_flag(verbosity, 1).

+ +

use_logarithms

+This option controls whether the calculations performed during inference should be done in a logarithm domain or not. +
    +
  • Values: true (default) or false.
  • +
  • Affects: hve, bp, cbp, lve, lkc and lbp.
  • +
+ +

hve_elim_heuristic

+This option allows to choose which elimination heuristic will be used by the hve. +
    +
  • Values: sequential, min_neighbors, min_weight, min_fill and +
    weighted_min_fill (default).
  • +
  • Affects: hve.
  • +
+

An explanation for each of these heuristics can be found in Daphne Koller's book Probabilistic Graphical Models.

+ +

bp_max_iter

+This option establishes a maximum number of iterations. One iteration consists in sending all possible messages. +
    +
  • Values: a positive integer (default is 1000).
  • +
  • Affects: bp, cbp and lbp.
  • +
+ + + +

bp_accuracy

+This option allows to control when the message passing should cease. Be the residual of one message the difference (according some metric) between the one sent in the current iteration and the one sent in the previous. If the highest residual is lesser than the given value, the message passing is stopped and the probabilities are calculated using the last messages that were sent. +
    +
  • Values: a float-point number (default is 0.0001).
  • +
  • Affects: bp, cbp and lbp.
  • +
+ +

bp_msg_schedule

+This option allows to control the message sending order. +
    +
  • Values: +
      +
    • seq_fixed (default), at each iteration, all messages are sent with the same order.

    • +
    • seq_random, at each iteration, all messages are sent with a random order.

    • +
    • parallel, at each iteration, all messages are calculated using only the values of the previous iteration.

    • +
    • max_residual, the next message to be sent is the one with maximum residual (as explained in the paper Residual Belief Propagation: Informed Scheduling for Asynchronous Message Passing).
    • +
    +
  • +
  • Affects: bp, cbp and lbp. +
  • +
+ +

export_libdai

+This option allows exporting the current model to the http://cs.ru.nl/ jorism/libDAI/doc/fileformats.htmllibDAI file format. +
    +
  • Values: true or false (default).
  • +
  • Affects: hve, bp, and cbp.
  • +
+ +

export_uai

+This option allows exporting the current model to the UAI file format. +
    +
  • Values: true or false (default).
  • +
  • Affects: hve, bp, and cbp.
  • +
+ +

export_graphviz

+This option allows exporting the factor graph's structure into a format that can be parsed by Graphviz. +
    +
  • Values: true or false (default).
  • +
  • Affects: hve, bp, and cbp.
  • +
+ +

print_fg

+This option allows to print a textual representation of the factor graph. +
    +
  • Values: true or false (default).
  • +
  • Affects: hve, bp, and cbp.
  • +
+ +

Back to the top

+ + + + + + +

Parameter Learning

+PFL is capable to learn the parameters for bayesian networks, through an implementation of the expectation-maximization algorithm. + +

Next we show an example of parameter learning for the sprinkler network.

+ +
+
+:- [sprinkler.pfl].
+
+:- use_module(library(clpbn/learning/em)).
+
+data(t, t, t, t).
+data(_, t, _, t).
+data(t, t, f, f).
+data(t, t, f, t).
+data(t, _, _, t).
+data(t, f, t, t).
+data(t, t, f, t).
+data(t, _, f, f).
+data(t, t, f, f).
+data(f, f, t, t).
+
+main :-
+    findall(X, scan_data(X), L),
+    em(L, 0.01, 10, CPTs, LogLik),
+    writeln(LogLik:CPTs).
+
+scan_data([cloudy(C), sprinkler(S), rain(R), wet_grass(W)]) :-
+    data(C, S, R, W).
+
+
+ +

Parameter learning is done by calling the em/5 predicate. Its arguments are the following.

+ +
+
+em(+Data, +MaxError, +MaxIters, -CPTs, -LogLik) +
+
+
+ +Where, +
    +
  • Data is a list of samples for the distribution that we want to estimate. Each sample is a list of either observed random variables or unobserved random variables (denoted when its state or value is not instantiated).
  • +
  • MaxError is the maximum error allowed before stopping the EM loop.
  • +
  • MaxIters is the maximum number of iterations for the EM loop.
  • +
  • CPTs is a list with the estimated conditional probability tables.
  • +
  • LogLik is the log-likelihood.
  • +
+ +

It is possible to choose the solver that will be used for the inference part during parameter learning with the set_em_solver/1 predicate (defaults to hve). At the moment, only the following solvers support parameter learning: ve, hve, bdd, bp and cbp.

+ +

Inside the learning directory from the examples directory, one can find more examples of parameter learning.

+ +

Back to the top

+ + + + + + +

External Interface

+This package also includes an external command for perform inference over probabilistic graphical models described in formats other than PFL. Currently two are support, the http://cs.ru.nl/ jorism/libDAI/doc/fileformats.htmllibDAI file format, and the http://graphmod.ics.uci.edu/uai08/FileFormatUAI08 file format. + +

This command's name is hcli and its usage is as follows.

+ +

$ ./hcli [solver=hve|bp|cbp] [<OPTION>=<VALUE>]... <FILE>[<VAR>|<VAR>=<EVIDENCE>]...

+ +

Let's assume that the current directory is the one where the examples are located. We can perform inference in any supported model by passing the file name where the model is defined as argument. Next, we show how to load a model with hcli.

+ +

$ ./hcli burglary-alarm.uai

+ +

With the above command, the program will load the model and print the marginal probabilities for all defined random variables. We can view only the marginal probability for some variable with a identifier X, if we pass X as an extra argument following the file name. For instance, the following command will output only the marginal probability for the variable with identifier 0.

+ +

$ ./hcli burglary-alarm.uai 0

+ +

If we give more than one variable identifier as argument, the program will output the joint probability for all the passed variables.

+ +

Evidence can be given as a pair containing a variable identifier and its observed state (index), separated by a '=`. For instance, we can introduce knowledge that some variable with identifier 0 has evidence on its second state as follows.

+ +

$ ./hcli burglary-alarm.uai 0=1

+ +

By default, all probability tasks are resolved using the hve solver. It is possible to choose another solver using the solver option as follows.

+ +

$ ./hcli solver=bp burglary-alarm.uai

+ +

Notice that only the hve, bp and cbp solvers can be used with hcli.

+ +

The options that are available with the set_pfl_flag/2 predicate can be used in hcli too. The syntax is a pair <Option>=<Value> before the model's file name.

+ +

Back to the top

+ + + + + + +

Papers

+
    +
  • Evaluating Inference Algorithms for the Prolog Factor Language.
  • +
+ +

Back to the top

+ +
+ + + +
+ + + diff --git a/packages/CLPBN/html/pfl.css b/packages/CLPBN/html/pfl.css new file mode 100644 index 000000000..3c115b512 --- /dev/null +++ b/packages/CLPBN/html/pfl.css @@ -0,0 +1,111 @@ +html { + background: gray +} + +body { + margin: 10px; +} + +.container { + width: 900px; + margin: auto; + padding: 10px 60px; + background-color: #ffffff; + box-shadow: 0px 2px 7px #292929; + border-radius: 10px; +} + +.header, +.mainbody, +.footer { + padding: 0px; +} + +.header { + height: 120px; + border-bottom: 1px solid #EEE; + background-color: #ffffff; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +#leftcolumn { + width: 550px; + float: left +} + +#rightcolumn { + float: right; + text-align:right; + font-family: sans-serif; + font-size:15px; + line-height:15px; + padding-top:15px; + padding-right:0px; + margin-right:0px; + color:#2798CA; +} + +.mainbody { + padding-top:10px; +} + +.footer { + height: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +#menu ul { + padding:0px; + margin:0px; + background-color:#EDEDED; + list-style:none; + text-align: center; +} + +#menu ul li { + display: inline; +} + +#menu ul li a { + padding: 2px 10px; + display: inline-block; + color: #333; + text-decoration: none; + border-bottom:3px solid #EDEDED; +} + +#menu ul li a:hover { + text-decoration: underline; +} + +h2 { + padding-top: 20px; + padding-bottom: 0px; +} + +.pflcode { + border-radius: 15px; + max-width:550px; + padding:5px 20px; + margin:auto; + margin-top:35px; + margin-bottom:35px; + background-color: #FAFAD3; + font: normal 14px verdana; + border: solid 1px #ddd; +} + +.console { + font-family: monospace; + color:white; + background-color:black; + padding: 5px; + border-radius: 8px; +} + +.texttt { + font-family: monospace +} + diff --git a/packages/CLPBN/html/sprinkler.png b/packages/CLPBN/html/sprinkler.png new file mode 100644 index 0000000000000000000000000000000000000000..150855729c9fdf792dd5fa1e85d668a4ca8b8f49 GIT binary patch literal 31485 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 cqPp%4!%1ViOPeU!|hd(Lnki#FOv$%VE_OC literal 0 HcmV?d00001