dither 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d71e5bd41e308d0224d6902f1c0698739e1ea399
4
- data.tar.gz: adef3f1c923b2611da8ed6cf47f3d7dec5ffb8d3
3
+ metadata.gz: b006159a1b729a73db618c798df025d7ac71584f
4
+ data.tar.gz: d53268fc1aaa144bedd5e216d887235cc573af4d
5
5
  SHA512:
6
- metadata.gz: d1ca534cc0dfe49379470dfda625d115ae6af9a0e7bf1ed9ca9a4dca784b095a55e5dfcc7d290f45aeea3723797426df6a69da1ffafa43877c9a7cb010e29c7a
7
- data.tar.gz: 4333165dad0c5a001e58acea7b3c421e691e5c90c52ae10baaf3c4a67b43acf6ef43d1ae2f20805c29b086a71a179a3137e1d12b74ec08f06c07f0fa054cbd8e
6
+ metadata.gz: e06c1afdd9e517e00c70a8dcf8984425059d4024ec86cc0fafc1a0a8a1049c7de825dd0daf5bcafeacc5f8ea04b2f441c29b6ddf679b394787a4f89e83a096bc
7
+ data.tar.gz: af4aa4e4434de024b19b50552aa63ed3cf29a50aaf8646a2278f8418e3fbffa95271af6bf1bc6497fc69c4124e2d3d0822edaa9e8c49d13acdbb1f5bd16da7fd
data/ext/dither/Ipog.java CHANGED
@@ -231,37 +231,31 @@ iter:
231
231
  // remove constraint violation
232
232
  boolean isCaseCovered = violateConstraints(testCase);
233
233
  if(!isCaseCovered) {
234
- for (final int[] innerTestCase : testSet) {
235
- boolean match = true;
234
+
235
+ match_unbound_label:
236
+ for (final int[] innerTestCase : unbound) {
236
237
  for(final Pair pair : testCase) {
237
238
  if(innerTestCase[pair.i] != pair.j) {
238
- match = false;
239
- break;
239
+ continue match_unbound_label;
240
240
  }
241
241
  }
242
- if(match) {
243
- isCaseCovered = true;
244
- break;
245
- }
242
+ isCaseCovered = true;
243
+ break;
246
244
  }
247
245
  }
248
246
 
249
247
  if (!isCaseCovered) {
250
- final ListIterator<int[]> unboundIter = unbound.listIterator();
251
248
  boolean isMerged = false;
252
- int[] innerTestCase = null;
253
- while(unboundIter.hasNext()) {
254
- innerTestCase = unboundIter.next();
249
+ for(final int[] innerTestCase : unbound) {
255
250
  // -1 => no merge, 0 perfect merge (no unbound), 1 partial merge
256
251
  final int mergeResult = merge(k, testCase, innerTestCase);
257
- if(mergeResult == 0) {
258
- unboundIter.remove();
259
- testSet.add(innerTestCase);
260
- isMerged = true;
261
- break;
262
- } else if(mergeResult == 1) {
252
+ if(mergeResult > 0){
253
+ for(final Pair localComb : testCase) {
254
+ innerTestCase[localComb.i] = localComb.j;
255
+ }
263
256
  isMerged = true;
264
257
  break;
258
+
265
259
  }
266
260
  }
267
261
 
@@ -304,14 +298,9 @@ iter:
304
298
  return -1;
305
299
  }
306
300
 
307
- // merge
308
- for(final Pair pair : pairs) {
309
- testCase[pair.i] = pair.j;
310
- }
311
-
312
301
  // find unbound
313
302
  for(int i = 0; i < k; i++) {
314
- if(testCase[i] == -1) { return 1; }
303
+ if(mergeScratch[i] == -1) { return 1; }
315
304
  }
316
305
  return 0;
317
306
  }
@@ -15,25 +15,28 @@
15
15
 
16
16
  namespace dither {
17
17
 
18
- class BaseConstraintHandler {
19
- public:
20
- BaseConstraintHandler(){};
21
- virtual ~BaseConstraintHandler(){};
22
- virtual bool violate_constraints(const dtest_case &test_case) { return false; }
23
- virtual bool violate_constraints(const std::vector<param*> &test_case) {
24
- return false;
18
+ class BaseConstraintHandler {
19
+ public:
20
+ BaseConstraintHandler(){};
21
+ virtual ~BaseConstraintHandler(){};
22
+ virtual bool violate_constraints(const dtest_case &test_case) {
23
+ return false;
24
+ }
25
+ virtual bool violate_constraints(const std::vector<param *> &test_case) {
26
+ return false;
27
+ }
28
+ virtual bool violate_constraints(param **test_case,
29
+ const std::size_t length) {
30
+ return false;
31
+ }
32
+ virtual bool ground(dtest_case &test_case) {
33
+ for (auto it = test_case.begin(); it != test_case.end(); ++it) {
34
+ if ((*it) == -1) {
35
+ *it = 0;
25
36
  }
26
- virtual bool violate_constraints(param** test_case, const std::size_t length) {
27
- return false;
28
- }
29
- virtual bool ground(dtest_case &test_case) {
30
- for (auto it = test_case.begin(); it != test_case.end(); ++it) {
31
- if ((*it) == -1) {
32
- *it = 0;
33
- }
34
- }
35
- return true;
36
- }
37
- };
37
+ }
38
+ return true;
39
+ }
40
+ };
38
41
  }
39
42
  #endif // BASE_CONSTRAINT_HANDLER_H_
@@ -125,12 +125,11 @@ inline void product(
125
125
  }
126
126
  }
127
127
 
128
- inline void product3(
129
- std::forward_list<dtest_case>& results,
130
- std::vector<dtest_case>::const_iterator begin,
131
- std::vector<dtest_case>::const_iterator end) {
128
+ inline void product3(std::forward_list<dtest_case>& results,
129
+ std::vector<dtest_case>::const_iterator begin,
130
+ std::vector<dtest_case>::const_iterator end) {
132
131
  dtest_case ranges;
133
- for(auto it = begin; it != end; ++it) {
132
+ for (auto it = begin; it != end; ++it) {
134
133
  const dval tmp = (*it).size() - 1;
135
134
  ranges.push_back(tmp);
136
135
  }
@@ -138,18 +137,17 @@ inline void product3(
138
137
  dtest_case scratch(ranges.size(), 0);
139
138
 
140
139
  const std::size_t max = ranges.size() - 1;
141
- for(std::size_t i = max;;) {
142
-
143
- if(i == max) {
144
- for(dval val = 0; val <= ranges[i]; val++) {
140
+ for (std::size_t i = max;;) {
141
+ if (i == max) {
142
+ for (dval val = 0; val <= ranges[i]; val++) {
145
143
  results.push_front(scratch);
146
144
  scratch[i]++;
147
145
  }
148
146
  scratch[i] = 0;
149
147
  i--;
150
- } else if(i == 0 && scratch[i] >= ranges[i]) {
148
+ } else if (i == 0 && scratch[i] >= ranges[i]) {
151
149
  return;
152
- } else if(scratch[i] < ranges[i]) {
150
+ } else if (scratch[i] < ranges[i]) {
153
151
  scratch[i]++;
154
152
  i++;
155
153
  } else {
@@ -159,14 +157,13 @@ inline void product3(
159
157
  }
160
158
  }
161
159
 
162
- inline std::size_t product4(
163
- std::forward_list<param**>& results,
164
- param** param_cache,
165
- std::vector<std::vector<param>*>& param_matrix) {
160
+ inline std::size_t product4(std::forward_list<param**>& results,
161
+ param** param_cache,
162
+ std::vector<std::vector<param>*>& param_matrix) {
166
163
  std::vector<int> ranges;
167
- std::unique_ptr<param*[]> scratch_ptr(new param*[param_matrix.size()]);
164
+ std::unique_ptr<param* []> scratch_ptr(new param*[param_matrix.size()]);
168
165
  auto scratch = scratch_ptr.get();
169
- for(std::size_t j = 0; j < param_matrix.size(); j++) {
166
+ for (std::size_t j = 0; j < param_matrix.size(); j++) {
170
167
  ranges.push_back(param_matrix[j]->size() - 1);
171
168
  scratch[j] = &(*param_matrix[j])[0];
172
169
  }
@@ -174,23 +171,22 @@ inline std::size_t product4(
174
171
 
175
172
  const std::size_t max = ranges.size() - 1;
176
173
  const std::size_t length = ranges.size();
177
- std::size_t j = 0;
178
- for(std::size_t i = max;;) {
179
-
180
- if(i == max) {
181
- for(std::size_t val = 0; val <= ranges[i]; val++) {
174
+ std::size_t j = 0;
175
+ for (std::size_t i = max;;) {
176
+ if (i == max) {
177
+ for (std::size_t val = 0; val <= ranges[i]; val++) {
182
178
  scratch[i] = &(*param_matrix[i])[indexes[i]];
183
- std::copy(scratch, scratch+length, param_cache);
179
+ std::copy(scratch, scratch + length, param_cache);
184
180
  results.push_front(param_cache);
185
181
  param_cache += length;
186
182
  indexes[i]++;
187
- j++;
183
+ j++;
188
184
  }
189
185
  indexes[i] = 0;
190
186
  i--;
191
- } else if(i == 0 && indexes[i] >= ranges[i]) {
187
+ } else if (i == 0 && indexes[i] >= ranges[i]) {
192
188
  return j;
193
- } else if(indexes[i] < ranges[i]) {
189
+ } else if (indexes[i] < ranges[i]) {
194
190
  indexes[i]++;
195
191
  scratch[i] = &(*param_matrix[i])[indexes[i]];
196
192
  i++;
data/ext/dither/dither.cc CHANGED
@@ -9,7 +9,9 @@
9
9
 
10
10
  #include "dither.h"
11
11
 
12
- ipog_handle dither_ipog_new(const unsigned int t) { return new dither::Ipog(t); }
12
+ ipog_handle dither_ipog_new(const unsigned int t) {
13
+ return new dither::Ipog(t);
14
+ }
13
15
 
14
16
  void dither_ipog_delete(ipog_handle self) {
15
17
  delete static_cast<dither::Ipog *>(self);
@@ -38,10 +40,12 @@ void dither_ipog_fill(ipog_handle self, int *solution) {
38
40
  static_cast<dither::Ipog *>(self)->fill(solution);
39
41
  }
40
42
 
41
- void dither_ipog_add_constraint(ipog_handle self, const int constraint[], const int length) {
43
+ void dither_ipog_add_constraint(ipog_handle self, const int constraint[],
44
+ const int length) {
42
45
  static_cast<dither::Ipog *>(self)->add_constraint(constraint, length);
43
46
  }
44
47
 
45
- void dither_ipog_add_previously_tested(ipog_handle self, const int tested[], const int length) {
48
+ void dither_ipog_add_previously_tested(ipog_handle self, const int tested[],
49
+ const int length) {
46
50
  static_cast<dither::Ipog *>(self)->add_previously_tested(tested, length);
47
51
  }
data/ext/dither/dither.h CHANGED
@@ -25,7 +25,8 @@ int dither_ipog_size(ipog_handle);
25
25
  void dither_ipog_display_raw_solution(ipog_handle);
26
26
  void dither_ipog_fill(ipog_handle, int[]);
27
27
  void dither_ipog_delete(ipog_handle self);
28
- void dither_ipog_add_constraint(ipog_handle self, const int[], const int );
29
- void dither_ipog_add_previously_tested(ipog_handle self, const int[], const int );
28
+ void dither_ipog_add_constraint(ipog_handle self, const int[], const int);
29
+ void dither_ipog_add_previously_tested(ipog_handle self, const int[],
30
+ const int);
30
31
  }
31
32
  #endif // DITHER_H_
@@ -1,4 +1,4 @@
1
1
 
2
2
  require 'mkmf'
3
- $CPPFLAGS += ' -std=c++11 -O3 '
3
+ $CPPFLAGS += ' -std=c++0x -O3 '
4
4
  create_makefile('dither')
data/ext/dither/ipog.cc CHANGED
@@ -19,14 +19,12 @@
19
19
  namespace dither {
20
20
 
21
21
  Ipog::~Ipog() {
22
- if(constraint_handler != NULL) {
22
+ if (constraint_handler != NULL) {
23
23
  delete constraint_handler;
24
24
  }
25
25
  }
26
26
 
27
- Ipog::Ipog() {
28
- t_ = 2;
29
- }
27
+ Ipog::Ipog() { t_ = 2; }
30
28
 
31
29
  Ipog::Ipog(const unsigned int t) : t_(t) {}
32
30
 
@@ -40,12 +38,12 @@ void Ipog::init_bound() {
40
38
  (*it).resize(size, -1);
41
39
  (*it).shrink_to_fit();
42
40
  }
43
- bound_.remove_if([this](dtest_case& a) { return has_previously_tested(a); });
41
+ bound_.remove_if([this](dtest_case &a) { return has_previously_tested(a); });
44
42
 
45
43
  merge_scratch_.resize(param_cache_.size(), -1);
46
44
 
47
- if(constraints.size() > 0) {
48
- for(auto it = param_cache_.cbegin(); it != param_cache_.cend(); ++it) {
45
+ if (constraints.size() > 0) {
46
+ for (auto it = param_cache_.cbegin(); it != param_cache_.cend(); ++it) {
49
47
  const dval tmp = (*it).size() - 1;
50
48
  ranges.push_back(tmp);
51
49
  }
@@ -55,7 +53,7 @@ void Ipog::init_bound() {
55
53
  }
56
54
  }
57
55
 
58
- inline param** Ipog::cover(const int k, std::forward_list<param**> &coverage) {
56
+ inline param **Ipog::cover(const int k, std::forward_list<param **> &coverage) {
59
57
  std::vector<int> input(k);
60
58
  for (std::size_t i = 0; i < k; i++) {
61
59
  input[i] = i;
@@ -63,10 +61,10 @@ inline param** Ipog::cover(const int k, std::forward_list<param**> &coverage) {
63
61
 
64
62
  std::forward_list<std::vector<int>> output;
65
63
  combinations(t_ - 1, input, output);
66
- std::forward_list<std::vector<std::vector<param>*>> product_input;
64
+ std::forward_list<std::vector<std::vector<param> *>> product_input;
67
65
  int count = 0;
68
66
  for (auto it = output.begin(); it != output.end(); ++it) {
69
- std::vector<std::vector<param>*> param_tuple;
67
+ std::vector<std::vector<param> *> param_tuple;
70
68
  (*it).push_back(k);
71
69
  int inner_count = 1;
72
70
  for (auto iit = (*it).begin(); iit != (*it).end(); ++iit) {
@@ -77,10 +75,10 @@ inline param** Ipog::cover(const int k, std::forward_list<param**> &coverage) {
77
75
  product_input.push_front(param_tuple);
78
76
  }
79
77
 
80
- param **local_param_cache = new param*[count*t_];
78
+ param **local_param_cache = new param *[count * t_];
81
79
  std::size_t j = 0;
82
80
  for (auto it = product_input.begin(); it != product_input.end(); ++it) {
83
- j += t_*product4(coverage, local_param_cache+j, *it);
81
+ j += t_ * product4(coverage, local_param_cache + j, *it);
84
82
  }
85
83
  coverage.remove_if([this](param **a) { return has_previously_tested(a); });
86
84
  return local_param_cache;
@@ -89,9 +87,9 @@ inline param** Ipog::cover(const int k, std::forward_list<param**> &coverage) {
89
87
  void Ipog::run() {
90
88
  init_bound();
91
89
  for (auto k = t_; k < input_params_.size(); k++) {
92
- std::forward_list<param**> pi;
90
+ std::forward_list<param **> pi;
93
91
  param **params = cover(k, pi);
94
- std::unique_ptr<param*[]> params_ptr(params);
92
+ std::unique_ptr<param *[]> params_ptr(params);
95
93
 
96
94
  {
97
95
  auto prev = bound_.cbefore_begin();
@@ -110,11 +108,12 @@ void Ipog::run() {
110
108
  /* vertical extension */
111
109
  for (auto pairs = pi.cbegin(); pairs != pi.cend(); ++pairs) {
112
110
  param **test_case = *pairs;
113
- bool case_covered = constraint_handler->violate_constraints(test_case, t_);
111
+ bool case_covered =
112
+ constraint_handler->violate_constraints(test_case, t_);
114
113
 
115
- if(!case_covered) {
114
+ if (!case_covered) {
116
115
  for (auto it = unbound_.cbegin(); it != unbound_.cend(); ++it) {
117
- if(is_covered(*it, test_case)) {
116
+ if (is_covered(*it, test_case)) {
118
117
  case_covered = true;
119
118
  break;
120
119
  }
@@ -124,12 +123,12 @@ void Ipog::run() {
124
123
  if (!case_covered) {
125
124
  bool is_merged = false;
126
125
 
127
- for(auto next = unbound_.begin(); next != unbound_.end(); ++next) {
126
+ for (auto next = unbound_.begin(); next != unbound_.end(); ++next) {
128
127
  const int merge_result = merge(k, *next, test_case);
129
128
 
130
129
  if (merge_result > 0) {
131
130
  dtest_case tmp = *next;
132
- for(std::size_t i = 0; i < t_; i++) {
131
+ for (std::size_t i = 0; i < t_; i++) {
133
132
  const param *it = test_case[i];
134
133
  tmp[it->first] = it->second;
135
134
  }
@@ -140,7 +139,7 @@ void Ipog::run() {
140
139
 
141
140
  if (!is_merged) {
142
141
  dtest_case unbound_test_case(param_cache_.size(), -1);
143
- for(std::size_t i = 0; i < t_; i++) {
142
+ for (std::size_t i = 0; i < t_; i++) {
144
143
  const param *it = test_case[i];
145
144
  unbound_test_case[it->first] = it->second;
146
145
  }
@@ -156,8 +155,8 @@ void Ipog::run() {
156
155
 
157
156
  /* -1 no merge, 0 perfect merge (no unbound), 1 partial merge */
158
157
  inline const int Ipog::merge(const int k, dtest_case &test_case,
159
- param** pairs) {
160
- for(std::size_t i = 0; i < t_; i++) {
158
+ param **pairs) {
159
+ for (std::size_t i = 0; i < t_; i++) {
161
160
  const param *it = pairs[i];
162
161
  auto value = test_case[it->first];
163
162
  if (!(value == -1 || value == it->second)) {
@@ -167,7 +166,7 @@ inline const int Ipog::merge(const int k, dtest_case &test_case,
167
166
 
168
167
  std::copy(test_case.cbegin(), test_case.cend(), merge_scratch_.begin());
169
168
 
170
- for(std::size_t i = 0; i < t_; i++) {
169
+ for (std::size_t i = 0; i < t_; i++) {
171
170
  const param *it = pairs[i];
172
171
  merge_scratch_[it->first] = it->second;
173
172
  }
@@ -185,9 +184,8 @@ inline const int Ipog::merge(const int k, dtest_case &test_case,
185
184
  return 0;
186
185
  }
187
186
 
188
- inline bool Ipog::is_covered(const dtest_case &test_case,
189
- param** params) {
190
- for(std::size_t i = 0; i < t_; i++) {
187
+ inline bool Ipog::is_covered(const dtest_case &test_case, param **params) {
188
+ for (std::size_t i = 0; i < t_; i++) {
191
189
  const param *my_param = params[i];
192
190
  if (test_case[my_param->first] != my_param->second) {
193
191
  return false;
@@ -196,7 +194,7 @@ inline bool Ipog::is_covered(const dtest_case &test_case,
196
194
  return true;
197
195
  }
198
196
  inline bool Ipog::is_covered(const dtest_case &test_case,
199
- const std::vector<param*> &params) {
197
+ const std::vector<param *> &params) {
200
198
  for (auto param = params.cbegin(); param != params.cend(); ++param) {
201
199
  if (test_case[(*param)->first] != (*param)->second) {
202
200
  return false;
@@ -206,15 +204,14 @@ inline bool Ipog::is_covered(const dtest_case &test_case,
206
204
  }
207
205
 
208
206
  inline const int Ipog::maximize_coverage(const int k, dtest_case &test_case,
209
- std::forward_list<param**> &pi) {
207
+ std::forward_list<param **> &pi) {
210
208
  const std::vector<param> &param_range = param_cache_[k];
211
209
  int current_max = -1;
212
210
  param max_param = param_range[0];
213
- std::forward_list<std::forward_list<param**>::iterator> covered;
211
+ std::forward_list<std::forward_list<param **>::iterator> covered;
214
212
 
215
213
  for (auto it = param_range.cbegin(); it != param_range.cend(); ++it) {
216
- std::forward_list<std::forward_list<param**>::iterator>
217
- tmp_covered;
214
+ std::forward_list<std::forward_list<param **>::iterator> tmp_covered;
218
215
  const param current_param = *it;
219
216
 
220
217
  test_case[current_param.first] = current_param.second;
@@ -258,7 +255,7 @@ void Ipog::display_raw_solution() {
258
255
  }
259
256
 
260
257
  void Ipog::add_parameter(const std::string name, const int *terms,
261
- const unsigned int terms_length) {
258
+ const unsigned int terms_length) {
262
259
  std::vector<int> tmp(terms, terms + terms_length);
263
260
  std::pair<std::string, std::vector<int>> key_value(name, tmp);
264
261
  int_params_.insert(key_value);
@@ -266,7 +263,7 @@ void Ipog::add_parameter(const std::string name, const int *terms,
266
263
  }
267
264
 
268
265
  void Ipog::add_parameter(const std::string name, const std::string *terms,
269
- const unsigned int terms_length) {
266
+ const unsigned int terms_length) {
270
267
  std::vector<std::string> tmp(terms, terms + terms_length);
271
268
  std::pair<std::string, std::vector<std::string>> key_value(name, tmp);
272
269
  str_params_.insert(key_value);
@@ -288,7 +285,7 @@ void Ipog::init_param_cache() {
288
285
  continue;
289
286
  }
290
287
  tmp.push_back(
291
- std::make_tuple((*it).first, DITHER_INT_T, (*it).second.size()));
288
+ std::make_tuple((*it).first, DITHER_INT_T, (*it).second.size()));
292
289
  }
293
290
 
294
291
  for (auto it = str_params_.cbegin(); it != str_params_.cend(); ++it) {
@@ -296,7 +293,7 @@ void Ipog::init_param_cache() {
296
293
  continue;
297
294
  }
298
295
  tmp.push_back(
299
- std::make_tuple((*it).first, DITHER_STRING_T, (*it).second.size()));
296
+ std::make_tuple((*it).first, DITHER_STRING_T, (*it).second.size()));
300
297
  }
301
298
 
302
299
  for (auto it = bool_params_.cbegin(); it != bool_params_.cend(); ++it) {
@@ -304,17 +301,18 @@ void Ipog::init_param_cache() {
304
301
  continue;
305
302
  }
306
303
  tmp.push_back(
307
- std::make_tuple((*it).first, DITHER_BOOL_T, (*it).second.size()));
304
+ std::make_tuple((*it).first, DITHER_BOOL_T, (*it).second.size()));
308
305
  }
309
306
 
310
307
  std::sort(tmp.begin(), tmp.end(), [](std::tuple<std::string, int, int> a,
311
- std::tuple<std::string, int, int> b) {
308
+ std::tuple<std::string, int, int> b) {
312
309
  return std::get<2>(a) > std::get<2>(b);
313
310
  });
314
311
 
315
312
  std::unordered_map<std::string, int> original_name_to_index;
316
313
  int count = 0;
317
- for(auto it = ordered_param_names_.cbegin(); it != ordered_param_names_.cend(); ++it, count++) {
314
+ for (auto it = ordered_param_names_.cbegin();
315
+ it != ordered_param_names_.cend(); ++it, count++) {
318
316
  original_name_to_index.insert({{*it, count}});
319
317
  }
320
318
  ordered_param_index_.resize(tmp.size());
@@ -328,7 +326,8 @@ void Ipog::init_param_cache() {
328
326
  auto type = std::get<1>(*it);
329
327
  reverse_param_index_.insert({{count, name}});
330
328
  ordered_param_index_[count] = original_name_to_index.find(name)->second;
331
- reverse_ordered_param_index_[original_name_to_index.find(name)->second] = count;
329
+ reverse_ordered_param_index_[original_name_to_index.find(name)->second] =
330
+ count;
332
331
 
333
332
  for (dval i = 0; i < SCHAR_MAX && i < std::get<2>(*it); i++) {
334
333
  param my_param;
@@ -344,26 +343,25 @@ void Ipog::init_param_cache() {
344
343
  input_params_.push_back(dvals);
345
344
  }
346
345
 
347
- std::vector<dval> scratch(param_cache_.size());
348
- for(auto it = original_previously_tested_.cbegin(); it != original_previously_tested_.cend(); ++it) {
349
- for(std::size_t i = 0; i < scratch.size(); i++) {
350
- scratch[reverse_ordered_param_index_[i]] = (*it)[i];
351
- }
352
- previously_tested_.push_back(scratch);
353
- }
346
+ std::vector<dval> scratch(param_cache_.size());
347
+ for (auto it = original_previously_tested_.cbegin();
348
+ it != original_previously_tested_.cend(); ++it) {
349
+ for (std::size_t i = 0; i < scratch.size(); i++) {
350
+ scratch[reverse_ordered_param_index_[i]] = (*it)[i];
351
+ }
352
+ previously_tested_.push_back(scratch);
353
+ }
354
354
 
355
355
  // transform constraints
356
- for(std::size_t j = 0; j < constraints.size(); j++) {
357
- for(std::size_t i = 0; i < scratch.size(); i++) {
356
+ for (std::size_t j = 0; j < constraints.size(); j++) {
357
+ for (std::size_t i = 0; i < scratch.size(); i++) {
358
358
  scratch[reverse_ordered_param_index_[i]] = constraints[j][i];
359
359
  }
360
360
  std::copy(scratch.begin(), scratch.end(), constraints[j].begin());
361
361
  }
362
362
  }
363
363
 
364
- int Ipog::size() {
365
- return solution_size;
366
- }
364
+ int Ipog::size() { return solution_size; }
367
365
 
368
366
  std::string *Ipog::header() {
369
367
  std::string *result = new std::string[param_cache_.size()];
@@ -373,39 +371,41 @@ std::string *Ipog::header() {
373
371
  return result;
374
372
  }
375
373
 
376
- void Ipog::add_constraint(const int* constraint, const unsigned int length) {
377
- std::vector<dval> tmp(length);
378
- std::copy(constraint, constraint+length, tmp.begin());
379
- for(auto it = tmp.cbegin(); it != tmp.cend(); ++it) {
380
- if((*it) > SCHAR_MAX) {
381
- std::cerr << "WARNING: constraint value > " << SCHAR_MAX << " behavior undefined" << std::endl;
382
- }
374
+ void Ipog::add_constraint(const int *constraint, const unsigned int length) {
375
+ std::vector<dval> tmp(length);
376
+ std::copy(constraint, constraint + length, tmp.begin());
377
+ for (auto it = tmp.cbegin(); it != tmp.cend(); ++it) {
378
+ if ((*it) > SCHAR_MAX) {
379
+ std::cerr << "WARNING: constraint value > " << SCHAR_MAX
380
+ << " behavior undefined" << std::endl;
383
381
  }
384
- constraints.push_back(tmp);
385
382
  }
383
+ constraints.push_back(tmp);
384
+ }
386
385
 
387
386
  inline void Ipog::ground_solutions() {
388
- std::size_t solution_count = 0;
387
+ std::size_t solution_count = 0;
389
388
  std::vector<dval> transform_scratch(param_cache_.size(), 0);
390
389
 
391
390
  auto prev = bound_.cbefore_begin();
392
391
  auto next = bound_.begin();
393
392
  auto end = bound_.cend();
394
393
  while (next != end) {
395
- if (constraint_handler->violate_constraints(*next) || has_previously_tested(*next)) {
394
+ if (constraint_handler->violate_constraints(*next) ||
395
+ has_previously_tested(*next)) {
396
396
  next = bound_.erase_after(prev);
397
397
  } else {
398
398
  transform(transform_scratch, *next);
399
- solution_count++;
399
+ solution_count++;
400
400
  ++prev;
401
401
  ++next;
402
402
  }
403
403
  }
404
404
 
405
- while(!unbound_.empty()) {
405
+ while (!unbound_.empty()) {
406
406
  dtest_case first = unbound_.front();
407
- if(constraint_handler->ground(first)) {
408
- if(!has_previously_tested(first)) {
407
+ if (constraint_handler->ground(first)) {
408
+ if (!has_previously_tested(first)) {
409
409
  transform(transform_scratch, first);
410
410
  solution_count++;
411
411
  bound_.push_front(first);
@@ -413,72 +413,77 @@ inline void Ipog::ground_solutions() {
413
413
  }
414
414
  unbound_.pop_front();
415
415
  }
416
- solution_size = solution_count;
417
- }
416
+ solution_size = solution_count;
417
+ }
418
418
 
419
419
  void Ipog::fill(int *solution) {
420
420
  std::size_t i = 0;
421
- for(auto it = bound_.cbegin(); it != bound_.cend(); ++it) {
422
- for(auto iit = (*it).cbegin(); iit != (*it).cend(); ++iit, i++) {
421
+ for (auto it = bound_.cbegin(); it != bound_.cend(); ++it) {
422
+ for (auto iit = (*it).cbegin(); iit != (*it).cend(); ++iit, i++) {
423
423
  solution[i] = *iit;
424
424
  }
425
425
  }
426
426
  }
427
427
 
428
428
  void Ipog::add_previously_tested(const int values[], const std::size_t length) {
429
- std::vector<dval> tmp(length);
430
- std::copy(values, values+length, tmp.begin());
431
- original_previously_tested_.push_back(tmp);
429
+ std::vector<dval> tmp(length);
430
+ std::copy(values, values + length, tmp.begin());
431
+ original_previously_tested_.push_back(tmp);
432
432
  }
433
433
 
434
- inline bool Ipog::has_previously_tested(std::vector<param*>& test_case) {
435
- for(auto it = previously_tested_.cbegin(); it != previously_tested_.cend(); ++it) {
436
- bool flag = true;
437
- for(auto iit = test_case.cbegin(); iit != test_case.cend(); ++iit) {
438
- if((*it)[(*iit)->first] != (*iit)->second) {
439
- flag = false;
440
- break;
441
- }
442
- }
443
- if(flag) {
444
- return true;
434
+ inline bool Ipog::has_previously_tested(std::vector<param *> &test_case) {
435
+ for (auto it = previously_tested_.cbegin(); it != previously_tested_.cend();
436
+ ++it) {
437
+ bool flag = true;
438
+ for (auto iit = test_case.cbegin(); iit != test_case.cend(); ++iit) {
439
+ if ((*it)[(*iit)->first] != (*iit)->second) {
440
+ flag = false;
441
+ break;
445
442
  }
446
443
  }
447
- return false;
444
+ if (flag) {
445
+ return true;
446
+ }
448
447
  }
448
+ return false;
449
+ }
449
450
 
450
- inline bool Ipog::has_previously_tested(param **params) {
451
- for(auto it = previously_tested_.cbegin(); it != previously_tested_.cend(); ++it) {
452
- bool flag = true;
453
- for(std::size_t i = 0; i < t_; i++) {
454
- const param *iit = params[i];
455
- if((*it)[iit->first] != iit->second) {
456
- flag = false;
457
- break;
458
- }
459
- }
460
- if(flag) {
461
- return true;
451
+ inline bool Ipog::has_previously_tested(param **params) {
452
+ for (auto it = previously_tested_.cbegin(); it != previously_tested_.cend();
453
+ ++it) {
454
+ bool flag = true;
455
+ for (std::size_t i = 0; i < t_; i++) {
456
+ const param *iit = params[i];
457
+ if ((*it)[iit->first] != iit->second) {
458
+ flag = false;
459
+ break;
462
460
  }
463
461
  }
464
- return false;
462
+ if (flag) {
463
+ return true;
464
+ }
465
465
  }
466
+ return false;
467
+ }
466
468
 
467
- inline bool Ipog::has_previously_tested(dtest_case& test_case) {
468
- for(auto it = previously_tested_.cbegin(); it != previously_tested_.cend(); ++it) {
469
- if(std::equal(test_case.cbegin(), test_case.cend(), (*it).cbegin())) {
470
- return true;
471
- }
469
+ inline bool Ipog::has_previously_tested(dtest_case &test_case) {
470
+ for (auto it = previously_tested_.cbegin(); it != previously_tested_.cend();
471
+ ++it) {
472
+ if (std::equal(test_case.cbegin(), test_case.cend(), (*it).cbegin())) {
473
+ return true;
472
474
  }
473
- return false;
474
475
  }
476
+ return false;
477
+ }
475
478
 
476
- inline bool Ipog::has_previously_tested(const int k, dtest_case& test_case) {
477
- for(auto it = previously_tested_.cbegin(); it != previously_tested_.cend(); ++it) {
478
- if(std::equal(test_case.cbegin(), test_case.cbegin()+k, (*it).cbegin())) {
479
- return true;
480
- }
479
+ inline bool Ipog::has_previously_tested(const int k, dtest_case &test_case) {
480
+ for (auto it = previously_tested_.cbegin(); it != previously_tested_.cend();
481
+ ++it) {
482
+ if (std::equal(test_case.cbegin(), test_case.cbegin() + k,
483
+ (*it).cbegin())) {
484
+ return true;
481
485
  }
482
- return false;
483
486
  }
487
+ return false;
488
+ }
484
489
  }
data/ext/dither/ipog.h CHANGED
@@ -39,23 +39,24 @@ class Ipog {
39
39
  std::unordered_map<std::string, int> param_index_;
40
40
  std::unordered_map<int, std::string> reverse_param_index_;
41
41
  dtest_case merge_scratch_;
42
- BaseConstraintHandler* constraint_handler;
42
+ BaseConstraintHandler *constraint_handler;
43
43
  std::vector<std::vector<dval>> constraints;
44
44
  std::vector<dval> ranges;
45
- std::size_t solution_size;
46
- std::vector<std::vector<dval>> original_previously_tested_;
47
- std::vector<std::vector<dval>> previously_tested_;
45
+ std::size_t solution_size;
46
+ std::vector<std::vector<dval>> original_previously_tested_;
47
+ std::vector<std::vector<dval>> previously_tested_;
48
48
 
49
- inline void transform(std::vector<dval>& scratch, std::vector<dval>& test_case) {
50
- for(std::size_t i = 0; i < test_case.size(); i++) {
49
+ inline void transform(std::vector<dval> &scratch,
50
+ std::vector<dval> &test_case) {
51
+ for (std::size_t i = 0; i < test_case.size(); i++) {
51
52
  scratch[ordered_param_index_[i]] = test_case[i];
52
53
  }
53
54
  std::copy(scratch.cbegin(), scratch.cend(), test_case.begin());
54
55
  }
55
56
 
56
- inline bool has_previously_tested(std::vector<param*>& test_case);
57
- inline bool has_previously_tested(dtest_case& test_case);
58
- inline bool has_previously_tested(const int, dtest_case& test_case);
57
+ inline bool has_previously_tested(std::vector<param *> &test_case);
58
+ inline bool has_previously_tested(dtest_case &test_case);
59
+ inline bool has_previously_tested(const int, dtest_case &test_case);
59
60
  inline bool has_previously_tested(param **params);
60
61
 
61
62
  public:
@@ -64,7 +65,8 @@ class Ipog {
64
65
  Ipog(const unsigned int);
65
66
  void set_t(const unsigned int t) { t_ = t; }
66
67
  void add_parameter(const std::string, const int[], const unsigned int);
67
- void add_parameter(const std::string, const std::string[], const unsigned int);
68
+ void add_parameter(const std::string, const std::string[],
69
+ const unsigned int);
68
70
  void add_parameter(const std::string);
69
71
  void init_bound();
70
72
  void init_param_cache();
@@ -73,18 +75,17 @@ class Ipog {
73
75
  std::string *header();
74
76
  inline void ground_solutions();
75
77
  inline bool is_valid() { return t_ <= param_cache_.size(); }
76
- inline param** cover(int,std::forward_list<param**>&);
78
+ inline param **cover(int, std::forward_list<param **> &);
77
79
  inline const int maximize_coverage(const int, dtest_case &,
78
- std::forward_list<param**> &);
80
+ std::forward_list<param **> &);
79
81
  void add_constraint(const int[], const unsigned int);
80
- void add_previously_tested(const int[], const std::size_t);
82
+ void add_previously_tested(const int[], const std::size_t);
83
+ inline bool is_covered(const dtest_case &test_case, param **params);
84
+ inline bool is_covered(const param **params);
81
85
  inline bool is_covered(const dtest_case &test_case,
82
- param** params);
83
- inline bool is_covered(const param** params);
84
- inline bool is_covered(const dtest_case &test_case,
85
- const std::vector<param*> &params);
86
+ const std::vector<param *> &params);
86
87
  inline bool is_covered(const std::vector<param> &params);
87
- inline const int merge(const int, dtest_case &, param**);
88
+ inline const int merge(const int, dtest_case &, param **);
88
89
  void display_raw_solution();
89
90
  void fill(int[]);
90
91
  inline void display_header() {
@@ -107,7 +108,8 @@ class Ipog {
107
108
  }
108
109
  continue;
109
110
  }
110
- const param my_param = param_cache_[reverse_ordered_param_index_[i]][value];
111
+ const param my_param =
112
+ param_cache_[reverse_ordered_param_index_[i]][value];
111
113
  switch (my_param.type) {
112
114
  case DITHER_INT_T:
113
115
  std::cout << int_params_[my_param.name][my_param.second];
@@ -127,7 +129,6 @@ class Ipog {
127
129
  std::cout << std::endl;
128
130
  }
129
131
  };
130
-
131
132
  }
132
133
 
133
134
  #endif
@@ -12,106 +12,118 @@
12
12
 
13
13
  namespace dither {
14
14
 
15
- SimpleConstraintHandler::SimpleConstraintHandler(std::vector<dval>& ranges, std::vector<std::vector<dval>>& pconstraints) : params(ranges), scratch(ranges.size(), -1) {
16
- for(auto it = pconstraints.cbegin(); it != pconstraints.cend(); ++it) {
17
- std::vector<std::pair<std::size_t, dval>> constraint;
18
- std::size_t i = 0;
19
- for(auto iit = (*it).cbegin(); iit != (*it).cend(); ++iit, i++) {
20
- if((*iit) != -1) {
21
- constraint.push_back(std::make_pair(i, *iit));
22
- }
15
+ SimpleConstraintHandler::SimpleConstraintHandler(
16
+ std::vector<dval>& ranges, std::vector<std::vector<dval>>& pconstraints)
17
+ : params(ranges), scratch(ranges.size(), -1) {
18
+ for (auto it = pconstraints.cbegin(); it != pconstraints.cend(); ++it) {
19
+ std::vector<std::pair<std::size_t, dval>> constraint;
20
+ std::size_t i = 0;
21
+ for (auto iit = (*it).cbegin(); iit != (*it).cend(); ++iit, i++) {
22
+ if ((*iit) != -1) {
23
+ constraint.push_back(std::make_pair(i, *iit));
23
24
  }
24
- constraints.push_back(constraint);
25
25
  }
26
- std::sort(constraints.begin(), constraints.end(), [](std::vector<std::pair<std::size_t, dval>>& a, std::vector<std::pair<std::size_t, dval>>& b) { return a.size() < b.size(); });
26
+ constraints.push_back(constraint);
27
+ }
28
+ std::sort(constraints.begin(), constraints.end(),
29
+ [](const std::vector<std::pair<std::size_t, dval>>& a,
30
+ const std::vector<std::pair<std::size_t, dval>>& b) {
31
+ return a.size() < b.size();
32
+ });
33
+ }
34
+
35
+ bool SimpleConstraintHandler::violate_constraints(const dtest_case& test_case) {
36
+ if (violate_constraints_(test_case)) {
37
+ return true;
27
38
  }
39
+ std::copy(test_case.cbegin(), test_case.cend(), scratch.begin());
40
+ return !ground(scratch);
41
+ }
28
42
 
29
- bool SimpleConstraintHandler::violate_constraints(const dtest_case &test_case) {
30
- if(violate_constraints_(test_case)) {
43
+ inline bool SimpleConstraintHandler::violate_constraints_(
44
+ const dtest_case& test_case) {
45
+ for (auto constraint = constraints.cbegin(); constraint != constraints.cend();
46
+ ++constraint) {
47
+ if (violate_constraint(test_case, *constraint)) {
31
48
  return true;
32
49
  }
33
- std::copy(test_case.cbegin(), test_case.cend(), scratch.begin());
34
- return !ground(scratch);
35
50
  }
51
+ return false;
52
+ }
36
53
 
37
- inline bool SimpleConstraintHandler::violate_constraints_(const dtest_case &test_case) {
38
- for(auto constraint = constraints.cbegin(); constraint != constraints.cend(); ++constraint) {
39
- if(violate_constraint(test_case, *constraint)) {
40
- return true;
41
- }
54
+ inline bool SimpleConstraintHandler::violate_constraint(
55
+ const dtest_case& test_case,
56
+ const std::vector<std::pair<std::size_t, dval>>& constraint) {
57
+ for (auto it = constraint.cbegin(); it != constraint.cend(); ++it) {
58
+ auto value = test_case[(*it).first];
59
+ if (value == -1 || value != (*it).second) {
60
+ return false;
42
61
  }
43
- return false;
44
62
  }
63
+ return true;
64
+ }
45
65
 
46
- inline bool SimpleConstraintHandler::violate_constraint(const dtest_case& test_case, const std::vector<std::pair<std::size_t, dval>>& constraint) {
47
- for(auto it = constraint.cbegin(); it != constraint.cend(); ++it) {
48
- auto value = test_case[(*it).first];
49
- if(value == -1 || value != (*it).second) {
50
- return false;
51
- }
52
- }
66
+ bool SimpleConstraintHandler::violate_constraints(param** test_case,
67
+ const std::size_t length) {
68
+ std::fill(scratch.begin(), scratch.end(), -1);
69
+ for (std::size_t i = 0; i < length; i++) {
70
+ const param* p = test_case[i];
71
+ scratch[p->first] = p->second;
72
+ }
73
+ if (violate_constraints_(scratch)) {
53
74
  return true;
54
75
  }
76
+ return !ground(scratch);
77
+ }
55
78
 
56
- bool SimpleConstraintHandler::violate_constraints(param** test_case, const std::size_t length) {
57
- std::fill(scratch.begin(), scratch.end(), -1);
58
- for(std::size_t i = 0; i < length; i++) {
59
- const param *p = test_case[i];
60
- scratch[p->first] = p->second;
61
- }
62
- if(violate_constraints_(scratch)) {
63
- return true;
64
- }
65
- return !ground(scratch);
79
+ bool SimpleConstraintHandler::violate_constraints(
80
+ const std::vector<param*>& test_case) {
81
+ std::fill(scratch.begin(), scratch.end(), -1);
82
+ for (auto p : test_case) {
83
+ scratch[p->first] = p->second;
84
+ }
85
+ if (violate_constraints_(scratch)) {
86
+ return true;
66
87
  }
88
+ return !ground(scratch);
89
+ }
67
90
 
68
- bool SimpleConstraintHandler::violate_constraints(const std::vector<param*> &test_case) {
69
- std::fill(scratch.begin(), scratch.end(), -1);
70
- for(auto p : test_case) {
71
- scratch[p->first] = p->second;
72
- }
73
- if(violate_constraints_(scratch)) {
74
- return true;
91
+ bool SimpleConstraintHandler::ground(dtest_case& test_case) {
92
+ std::vector<std::size_t> indexes;
93
+
94
+ // find unbound indexes
95
+ std::size_t i = 0;
96
+ for (auto it = test_case.begin(); it != test_case.end(); ++it, i++) {
97
+ if ((*it) == -1) {
98
+ indexes.push_back(i);
75
99
  }
76
- return !ground(scratch);
77
100
  }
101
+ std::vector<dval> bound_values(indexes.size(), -1);
102
+ i = 0;
78
103
 
79
- bool SimpleConstraintHandler::ground(dtest_case &test_case) {
80
- std::vector<std::size_t> indexes;
81
-
82
- // find unbound indexes
83
- std::size_t i = 0;
84
- for (auto it = test_case.begin(); it != test_case.end(); ++it, i++) {
85
- if ((*it) == -1) {
86
- indexes.push_back(i);
104
+ LOOP:
105
+ while (i < indexes.size()) {
106
+ const dval max = params[indexes[i]];
107
+ for (dval value = bound_values[i] + 1; value <= max; value++) {
108
+ test_case[indexes[i]] = value;
109
+ if (violate_constraints_(test_case)) {
110
+ continue;
87
111
  }
112
+ bound_values[i] = value;
113
+ i++;
114
+ goto LOOP;
88
115
  }
89
- std::vector<dval> bound_values(indexes.size(), -1);
90
- i = 0;
91
-
92
- LOOP:while(i < indexes.size()) {
93
-
94
- const dval max = params[indexes[i]];
95
- for(dval value = bound_values[i] + 1; value <= max; value++) {
96
- test_case[indexes[i]] = value;
97
- if(violate_constraints_(test_case)) {
98
- continue;
99
- }
100
- bound_values[i] = value;
101
- i++;
102
- goto LOOP;
103
- }
104
-
105
- if(i == 0) {
106
- return false;
107
- }
108
116
 
109
- // unwind
110
- bound_values[i] = -1;
111
- test_case[indexes[i]] = -1;
112
- i--;
113
- }
117
+ if (i == 0) {
118
+ return false;
119
+ }
114
120
 
115
- return true;
121
+ // unwind
122
+ bound_values[i] = -1;
123
+ test_case[indexes[i]] = -1;
124
+ i--;
116
125
  }
126
+
127
+ return true;
128
+ }
117
129
  }
@@ -18,23 +18,25 @@
18
18
 
19
19
  namespace dither {
20
20
 
21
- class SimpleConstraintHandler : public BaseConstraintHandler {
22
- protected:
23
- std::vector<std::vector<std::pair<std::size_t, dval>>> constraints;
24
- std::vector<dval> params;
25
- std::vector<dval> scratch;
26
-
27
- inline bool violate_constraint(const dtest_case& test_case, const std::vector<std::pair<std::size_t, dval>>& constraint);
28
- inline bool violate_constraints_(const dtest_case &test_case);
29
-
30
- public:
31
- SimpleConstraintHandler(std::vector<dval>& ranges, std::vector<std::vector<dval>>& pconstraints);
32
- bool violate_constraints(const dtest_case &test_case);
33
- bool violate_constraints(const std::vector<param*> &test_case);
34
- bool violate_constraints(param** test_case, const std::size_t length);
35
- bool ground(dtest_case &test_case);
36
- };
21
+ class SimpleConstraintHandler : public BaseConstraintHandler {
22
+ protected:
23
+ std::vector<std::vector<std::pair<std::size_t, dval>>> constraints;
24
+ std::vector<dval> params;
25
+ std::vector<dval> scratch;
26
+
27
+ inline bool violate_constraint(
28
+ const dtest_case& test_case,
29
+ const std::vector<std::pair<std::size_t, dval>>& constraint);
30
+ inline bool violate_constraints_(const dtest_case& test_case);
31
+
32
+ public:
33
+ SimpleConstraintHandler(std::vector<dval>& ranges,
34
+ std::vector<std::vector<dval>>& pconstraints);
35
+ bool violate_constraints(const dtest_case& test_case);
36
+ bool violate_constraints(const std::vector<param*>& test_case);
37
+ bool violate_constraints(param** test_case, const std::size_t length);
38
+ bool ground(dtest_case& test_case);
39
+ };
37
40
  }
38
41
 
39
42
  #endif // SIMPLE_CONSTRAINT_HANDLER_H_
40
-
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Dither
3
- VERSION = '0.2.5'
3
+ VERSION = '0.2.6'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dither
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Gowan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-28 00:00:00.000000000 Z
11
+ date: 2016-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec