update predicate pairs restraint

don't use sub-restraints, instead do everything internally.

This greatly reduces the number of objects created in some cases.

close #683