001package org.clafer.compiler;
002
003/**
004 * Defines the options for the Clafer compiler. Start with the default options
005 * and configure it to your needs. For example,
006 * {@code ClaferOptions.Default.preferSmallerInstances()} will prefer smaller
007 * instances and use default settings for all the other option.
008 *
009 * @author jimmy
010 */
011public class ClaferOptions {
012
013    /*
014     * true: prefer larger instances
015     * false: prefer smaller instances
016     */
017    private final boolean preferSmallerInstances;
018    /*
019     * true: basic symmetry breaking
020     * false: full symmetry breaking
021     */
022    private final boolean basicSymmetryBreaking;
023    /*
024     * true: basic optimizations
025     * false: full optimizations
026     */
027    private final boolean basicOptimizations;
028    /**
029     * Use the default options.
030     */
031    public static ClaferOptions Optimized = new ClaferOptions(false, false, false);
032    public static ClaferOptions Basic = new ClaferOptions(false, true, true);
033    public static ClaferOptions Default = Optimized;
034
035    private ClaferOptions(boolean preferSmallerInstances, boolean basicSymmetryBreaking, boolean basicOptimizations) {
036        this.preferSmallerInstances = preferSmallerInstances;
037        this.basicSymmetryBreaking = basicSymmetryBreaking;
038        this.basicOptimizations = basicOptimizations;
039    }
040
041    public boolean isPreferSmallerInstances() {
042        return preferSmallerInstances;
043    }
044
045    public boolean isPreferLargerInstances() {
046        return !preferSmallerInstances;
047    }
048
049    public ClaferOptions preferSmallerInstances() {
050        return new ClaferOptions(true, basicSymmetryBreaking, basicOptimizations);
051    }
052
053    public ClaferOptions preferLargerInstances() {
054        return new ClaferOptions(false, basicSymmetryBreaking, basicOptimizations);
055    }
056
057    public boolean isBasicSymmetryBreaking() {
058        return basicSymmetryBreaking;
059    }
060
061    public boolean isFullSymmetryBreaking() {
062        return !basicSymmetryBreaking;
063    }
064
065    public ClaferOptions basicSymmetryBreaking() {
066        return new ClaferOptions(preferSmallerInstances, true, basicOptimizations);
067    }
068
069    public ClaferOptions fullSymmetryBreaking() {
070        return new ClaferOptions(preferSmallerInstances, false, basicOptimizations);
071    }
072
073    public boolean isBasicOptimizations() {
074        return basicOptimizations;
075    }
076
077    public boolean isFullOptimizations() {
078        return !basicOptimizations;
079    }
080
081    public ClaferOptions basicOptimizations() {
082        return new ClaferOptions(preferSmallerInstances, basicSymmetryBreaking, true);
083    }
084
085    public ClaferOptions fullOptimizations() {
086        return new ClaferOptions(preferSmallerInstances, basicSymmetryBreaking, false);
087    }
088
089    public String toString() {
090        return (preferSmallerInstances ? "prefer smaller instances\n" : "prefer larger instances\n")
091                + (basicSymmetryBreaking ? "perform only basic symmetry breaking\n" : "perform full symmetry breaking\n")
092                + (basicOptimizations ? "perform only basic optimizations\n" : "perform full optimizations\n");
093    }
094}