summaryrefslogtreecommitdiff
path: root/casa/annealing/Bounds.C
blob: 8e087e9a060e7e027b2ab00f0c786a0a73ee8637 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright 2008, 2009 Brady J. Garvin

// This file is part of Covering Arrays by Simulated Annealing (CASA).

// CASA is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// CASA is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with CASA.  If not, see <http://www.gnu.org/licenses/>.


#include <cmath>
#include <algorithm>
#include <functional>

#include "annealing/Bounds.H"

using namespace std;

#ifndef UPPER_BOUND_SCALING_FACTOR
#define UPPER_BOUND_SCALING_FACTOR 5
#endif

unsigned computeLowerBound(unsigned strength, const Options&options) {
  if (lowerBound) {
    return lowerBound;
  }
  static greater<unsigned>backwards;
  unsigned result = 1;
  Array<unsigned>symbolCounts(options.getSize());
  for (unsigned i = symbolCounts.getSize(); i--;) {
    symbolCounts[i] = options.getSymbolCount(i);
  }
  partial_sort
    (symbolCounts + 0,
     symbolCounts + strength,
     symbolCounts + symbolCounts.getSize(),
     backwards);
  for (unsigned i = strength; i--;) {
    result *= symbolCounts[i];
  }
  return result;
}

unsigned computeUpperBound(unsigned strength, const Options&options) {
  if (upperBound) {
    return upperBound;
  }
  unsigned max = 0;
  Array<unsigned>symbolCounts(options.getSize());
  for (unsigned i = symbolCounts.getSize(); i--;) {
    unsigned candidate = options.getSymbolCount(i);
    if (candidate > max) {
      max = candidate;
    }
  }
  return (unsigned)(UPPER_BOUND_SCALING_FACTOR *
		    pow((double)max, (double)strength));
}