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}