Acceptance Functions
Acceptance functions are user-defined functions passed to recom_chain/flip_chain that are used to evaluate a proposal for the next state in a chain and generate a probability for "accepting" the new plan. If the plan is rejected, then the step in the Markov chain is considered to be a "self-loop." Note that acceptance functions are conceptually different from constraints, which are hard, deterministic requirements on every plan in a chain. If a plan is generated that does not satisfy a constraint, then new plans are generated until the constraint is satisfied, at which point the chain makes a step to the constraint-satisfying plan. Contrast this to acceptance functions, which generate probabilities for accepting a plan, and when a plan is not accepted, produce a self-loop in the chain.
Practically, acceptance functions are expected to accept a Partition object and return a probability between 0 and 1. The reason for this is that acceptance functions are really most useful in cases like the Metropolis-Hasting algorithm and "burning in". If, for some reason, you need a deterministic acceptance function, you can simply have it return 0 or 1.
The following is a sample acceptance function included in the GerryChain library:
GerryChain.always_accept — Functionalways_accept(partition::Partition)Accepts partition with probability 1.
API
GerryChain.satisfies_acceptance_fn — Methodsatisfies_acceptance_fn(partition::Partition,
acceptance_fn::Function)::BoolDetermines whether a partition should be accepted, according to the user-specified acceptance function. Acceptance function must return a valid probability in [0, 1], and satisfies_acceptance_fn will use this probability to determine whether the partition should be accepted.
Arguments:
- partition:
Partition. Should have a valid "parent" field so the acceptance function can compare the new partition to the previous partition, if necessary. - acceptance_fn: A user-specified function that should take partition as an argument and return a probability in the range [0, 1].