*
* @see #breakMatrixSymmetries(Map,boolean)
*/
private final Formula breakTotalOrder(RelationPredicate.TotalOrdering total, boolean aggressive) {
final Relation first = total.first(), last = total.last(), ordered = total.ordered(), relation = total.relation();
final IntSet domain = bounds.upperBound(ordered).indexView();
if (symmetricColumnPartitions(ordered)!=null &&
bounds.upperBound(first).indexView().contains(domain.min()) &&
bounds.upperBound(last).indexView().contains(domain.max())) {
// construct the natural ordering that corresponds to the ordering of the atoms in the universe
final IntSet ordering = Ints.bestSet(usize*usize);
int prev = domain.min();
for(IntIterator atoms = domain.iterator(prev+1, usize); atoms.hasNext(); ) {
int next = atoms.next();
ordering.add(prev*usize + next);
prev = next;
}
if (ordering.containsAll(bounds.lowerBound(relation).indexView()) &&
bounds.upperBound(relation).indexView().containsAll(ordering)) {
// remove the ordered partition from the set of symmetric partitions
removePartition(domain.min());