From Church Wiki
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)))