package org.biojava.nbio.structure.symmetry.utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.biojava.nbio.structure.symmetry.core.QuatSymmetryDetector;
/**
* In mathematics, the power set (or powerset) of any set S, written P(S), is
* the set of all subsets of S, including the empty set and S itself.
* <p>
* Code taken from StackOverflow best answer in:
* http://stackoverflow.com/questions/4640034/calculating-all-of-the-subsets
* -of-a-set-of-numbers.
* <p>
* Currently used to calculate the possible LOCAL symmetries in
* {@link QuatSymmetryDetector}.
*
* @author Aleix Lafita
* @since 5.0.0
*
*/
public class PowerSet<T> {
public PowerSet() {
}
/**
* @return the set of power Sets of the original Set
*/
public Set<Set<T>> powerSet(Set<T> originalSet) {
Set<Set<T>> sets = new HashSet<Set<T>>();
if (originalSet.isEmpty()) {
sets.add(new HashSet<T>());
return sets;
}
List<T> list = new ArrayList<T>(originalSet);
T head = list.get(0);
Set<T> rest = new HashSet<T>(list.subList(1, list.size()));
for (Set<T> set : powerSet(rest)) {
Set<T> newSet = new HashSet<T>();
newSet.add(head);
newSet.addAll(set);
sets.add(newSet);
sets.add(set);
}
return sets;
}
}