this.sol = sol;
// Figure out the sig bounds
final Universe universe = factory.universe();
final int atomN = universe.size();
final List<Tuple> atoms = new ArrayList<Tuple>(atomN);
for(int i=atomN-1; i>=0; i--) atoms.add(factory.tuple(universe.atom(i)));
for(Sig s:sigs) if (!s.builtin && s.isTopLevel()) computeLowerBound(atoms, (PrimSig)s);
for(Sig s:sigs) if (!s.builtin && s.isTopLevel()) computeUpperBound((PrimSig)s);
// Bound the sigs
for(Sig s:sigs) if (!s.builtin && s.isTopLevel()) allocatePrimSig((PrimSig)s);
for(Sig s:sigs) if (s instanceof SubsetSig) allocateSubsetSig((SubsetSig)s);