View Javadoc

1   /*******************************************************************************
2    * SAT4J: a SATisfiability library for Java Copyright (C) 2004, 2012 Artois University and CNRS
3    *
4    * All rights reserved. This program and the accompanying materials
5    * are made available under the terms of the Eclipse Public License v1.0
6    * which accompanies this distribution, and is available at
7    *  http://www.eclipse.org/legal/epl-v10.html
8    *
9    * Alternatively, the contents of this file may be used under the terms of
10   * either the GNU Lesser General Public License Version 2.1 or later (the
11   * "LGPL"), in which case the provisions of the LGPL are applicable instead
12   * of those above. If you wish to allow use of your version of this file only
13   * under the terms of the LGPL, and not to allow others to use your version of
14   * this file under the terms of the EPL, indicate your decision by deleting
15   * the provisions above and replace them with the notice and other provisions
16   * required by the LGPL. If you do not delete the provisions above, a recipient
17   * may use your version of this file under the terms of the EPL or the LGPL.
18   *
19   * Based on the original MiniSat specification from:
20   *
21   * An extensible SAT solver. Niklas Een and Niklas Sorensson. Proceedings of the
22   * Sixth International Conference on Theory and Applications of Satisfiability
23   * Testing, LNCS 2919, pp 502-518, 2003.
24   *
25   * See www.minisat.se for the original solver in C++.
26   *
27   * Contributors:
28   *   CRIL - initial API and implementation
29   *******************************************************************************/
30  package org.sat4j.minisat.restarts;
31  
32  import org.sat4j.minisat.core.Constr;
33  import org.sat4j.minisat.core.RestartStrategy;
34  import org.sat4j.minisat.core.SearchParams;
35  
36  /**
37   * Luby series
38   */
39  public final class LubyRestarts implements RestartStrategy {
40  
41      public static final int DEFAULT_LUBY_FACTOR = 32;
42  
43      /**
44       * 
45       */
46      private static final long serialVersionUID = 1L;
47  
48      // 21-06-2012 back from SAT 2012
49      // computing luby values the way presented by Donald Knuth in his invited
50      // talk at the SAT 2012 conference
51      // u1
52      private int un = 1;
53      // v1
54      private int vn = 1;
55  
56      /**
57       * returns the current value of the luby sequence.
58       * 
59       * @return the current value of the luby sequence.
60       */
61      public int luby() {
62          return this.vn;
63      }
64  
65      /**
66       * Computes and return the next value of the luby sequence. That method has
67       * a side effect of the value returned by luby(). luby()!=nextLuby() but
68       * nextLuby()==luby().
69       * 
70       * @return the new current value of the luby sequence.
71       * @see #luby()
72       */
73      public int nextLuby() {
74          if ((this.un & -this.un) == this.vn) {
75              this.un = this.un + 1;
76              this.vn = 1;
77          } else {
78              this.vn = this.vn << 1;
79          }
80          return this.vn;
81      }
82  
83      private int factor;
84  
85      private int bound;
86      private int conflictcount;
87  
88      public LubyRestarts() {
89          this(DEFAULT_LUBY_FACTOR); // uses TiniSAT default
90      }
91  
92      /**
93       * @param factor
94       *            the factor used for the Luby series.
95       * @since 2.1
96       */
97      public LubyRestarts(int factor) {
98          setFactor(factor);
99      }
100 
101     public final void setFactor(int factor) {
102         this.factor = factor;
103     }
104 
105     public int getFactor() {
106         return this.factor;
107     }
108 
109     public void init(SearchParams params) {
110         this.un = 1;
111         this.vn = 1;
112         this.bound = luby() * this.factor;
113     }
114 
115     public long nextRestartNumberOfConflict() {
116         return this.bound;
117     }
118 
119     public void onRestart() {
120         this.bound = nextLuby() * this.factor;
121         this.conflictcount = 0;
122     }
123 
124     @Override
125     public String toString() {
126         return "luby style (SATZ_rand, TiniSAT) restarts strategy with factor "
127                 + this.factor;
128     }
129 
130     public boolean shouldRestart() {
131         return this.conflictcount >= this.bound;
132     }
133 
134     public void onBackjumpToRootLevel() {
135         this.conflictcount = 0;
136     }
137 
138     public void reset() {
139         this.conflictcount = 0;
140     }
141 
142     public void newConflict() {
143         this.conflictcount++;
144     }
145 
146     public SearchParams getSearchParams() {
147         return new SearchParams();
148     }
149 
150     public void newLearnedClause(Constr learned, int trailLevel) {
151     }
152 }