Domino with internal coordinates
If done naively, enumerated solutions for intermediate subsets will include large number of solutions that are rigid transformations of one other. These configurations, even is eliminated in the final solutions by locking down a few of the particles, can greatly increase the time taken and memory usage. Straight forward, partial solutions, include:
- Choose a few of the particles and limit where they can go. For example, fix one particle at the origin, one to be on the x-axis and one to be on the x-y plane. This will restrict final solutions to be not include rigid transforms of one another.
- Ensure that a subset containing the three locked particles is enumerated first and use cross subset filtering to propagate the locking down of states from this subset. This eliminates translations in many cases, but since it doesn't take into account more than one particle at a time, probably doesn't get all.
A more thorough solution would be to use internal coordinates. One example for this is to solve for the distances between particles instead of their coordinates. To do this, our variables are entries in a distance matrix, sampled at the appropriate resolution. Various properties of this approach are:
- the number of degrees of freedom grows from 3*n-6 to n*(n-1)/2
- excluded volume is easy since one can remove colliding values from the discrete space of this variables
- it is easy to check if the distances taken from any subset of the particles forms a distance matrix and such can be added as a filter. Adding bounded noise (from the discrete sampling) results in bounded errors, so is ok.
- one can compute coordinates from a distance matrix and so can evaluate non-distance based restraints from those
- dealing with partial distance matrices is harder
- I think we can simply replace the junction tree on the particles with one where each subset contains the distance particle for each pair of particles in the original subset.
- an alternative would be to compute a junction tree directly where interactions come from restraints and the fact that all distances involving a particular particle are related
- there may be interval based approaches which allow us to nicely handle missing values. For example, if we could specify a value or an interval for each distance, then we could fill in any missing entries with some lower and upper bounds (from triangle inequality) and ask if the resulting matrix is a distance matrix
Rigid bodies can be handled in such a scheme by associating three marker particles with each one and using them to define a coordinate frame. Fixed restraints such as density maps can be handled by associating them with a rigid body reference frame. This would require minor modifications to the FitRestraint, but these probably should be done anyway to support density maps with unknown location.