View Javadoc

1   /*
2    * SAT4J: a SATisfiability library for Java Copyright (C) 2004-2006 Daniel Le Berre
3    * 
4    * Based on the original minisat specification from:
5    * 
6    * An extensible SAT solver. Niklas E?n and Niklas S?rensson. Proceedings of the
7    * Sixth International Conference on Theory and Applications of Satisfiability
8    * Testing, LNCS 2919, pp 502-518, 2003.
9    * 
10   * This library is free software; you can redistribute it and/or modify it under
11   * the terms of the GNU Lesser General Public License as published by the Free
12   * Software Foundation; either version 2.1 of the License, or (at your option)
13   * any later version.
14   * 
15   * This library is distributed in the hope that it will be useful, but WITHOUT
16   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
18   * details.
19   * 
20   * You should have received a copy of the GNU Lesser General Public License
21   * along with this library; if not, write to the Free Software Foundation, Inc.,
22   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23   * 
24   */
25  package org.sat4j.opt;
26  
27  import java.io.Serializable;
28  import java.math.BigInteger;
29  
30  import org.sat4j.core.Vec;
31  import org.sat4j.core.VecInt;
32  import org.sat4j.specs.IVec;
33  import org.sat4j.specs.IVecInt;
34  
35  /**
36   * Abstraction for an Objective Function for Pseudo Boolean Optimization.
37   * 
38   * May be generalized in the future to deal with other optimization functions.
39   * 
40   * @author leberre
41   * 
42   */
43  public class ObjectiveFunction implements Serializable {
44  
45      /**
46       * 
47       */
48      private static final long serialVersionUID = 1L;
49  
50      // contains the coeffs of the objective function for each variable
51      private final IVec<BigInteger> coeffs;
52  
53      private final IVecInt vars;
54  
55      public ObjectiveFunction(IVecInt vars, IVec<BigInteger> coeffs) {
56          this.vars = new VecInt(vars.size());
57          vars.copyTo(this.vars);
58          this.coeffs = new Vec<BigInteger>(coeffs.size());
59          coeffs.copyTo(this.coeffs);
60      }
61  
62      // calculate the degree of the objectif function
63      public BigInteger calculateDegree(int[] model) {
64          BigInteger tempDegree = BigInteger.ZERO;
65  
66          for (int i = 0; i < vars.size(); i++) {
67              if (varInModel(vars.get(i), model))
68                  tempDegree = tempDegree.add(coeffs.get(i));
69          }
70          return tempDegree;
71      }
72  
73      private boolean varInModel(int var, int[] model) {
74          for (int i = 0; i < model.length; i++)
75              if (var == model[i])
76                  return true;
77          return false;
78      }
79  
80      public IVec<BigInteger> getCoeffs() {
81          IVec<BigInteger> coefbis = new Vec<BigInteger>(coeffs.size());
82          coeffs.copyTo(coefbis);
83          return coefbis;
84      }
85  
86      public IVecInt getVars() {
87          IVecInt varbis = new VecInt(vars.size());
88          vars.copyTo(varbis);
89          return varbis;
90      }
91  
92  }