Ising models

From Church Wiki
Jump to: navigation, search

The Ising model is an undirected model. As such, it must be expressed as part of the condition of a query. To do this we shift each coupling term to have max energy zero (or less than zero), then condition on a log-flip with this weight being true.

For instance, a simple undirected model on three binary variables:

(mh-query
 (define a (flip))
 (define b (flip))
 (define c (flip))
 (list a b c)
 (and (flip (if (equal? a b)) 1.0 0.3)
      (flip (if (equal? b c)) 1.0 0.3)))

A standard ferromagnetic Ising:

(define num-spins 4)
(define J '((0 1 0 0)
            (0 0 1 0)
            (0 0 0 1)
            (0 0 0 0)))

(mh-query
 (define spins (repeat num-spins (lambda () (if (flip) 1 -1))))
 spins
 (all
  (map (lambda (J-row x)
         (map (lambda (energy y)
                (log-flip (- (* energy x y) (abs energy))))
              J-row spins))
       J spins)))

Personal tools