dither 0.1.5 → 0.2.0.rc3

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: 5cf3d06107ff71720bd301a055f17e297b1fc9dc
4
- data.tar.gz: 97aba2dba84f7df46c605bbe3d6a8cc42677ebdf
3
+ metadata.gz: 378d5b7748d2b3993ef979f2e0ecc1e7f2f1866a
4
+ data.tar.gz: 6c3159e8073600044df182be4bd6dc201c9f45a1
5
5
  SHA512:
6
- metadata.gz: acfe4787ee9c06fb27627cfb5af193c8e134433566a4dc336b384da8ff4275da0dea01134a204cb847e9172b674daaea8bed42dab1e0072b33bb284c28b545cb
7
- data.tar.gz: e46899b9ee779cb56e67579a75eedde2595d46eabe97a7c55f4fa6c9be549c7a35be4936b569c00846a4c4bc6aabd8c04b4f3c16b0b13beca6954eb32509cebe
6
+ metadata.gz: 8ac2ff8f4c0110f4a3b5d81e361bb52c568eccb7bc32cb28a7eed55f0f36ae7f7b2f1689804c4ed5a4c2cddec162c3946fa8bc995980e1f9968b606368e132b3
7
+ data.tar.gz: 6c4cc50f3da60255d6f1065506a8d1b2a2d0b601e96af11d3f664ee2374c08bd06c2bbc40006c2403308d021dd84d96d15f8cb83a11be9e51d4663c52ef88dab
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dither (0.1.4)
4
+ dither (0.1.5)
5
+ ffi (~> 1.0)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -14,10 +15,13 @@ GEM
14
15
  thor
15
16
  diff-lcs (1.2.5)
16
17
  docile (1.1.5)
18
+ ffi (1.9.6)
17
19
  mime-types (2.3)
18
20
  multi_json (1.10.1)
19
21
  netrc (0.7.7)
20
22
  rake (0.9.6)
23
+ rake-compiler (0.9.5)
24
+ rake
21
25
  rest-client (1.7.2)
22
26
  mime-types (>= 1.16, < 3.0)
23
27
  netrc (~> 0.7)
@@ -52,4 +56,5 @@ DEPENDENCIES
52
56
  coveralls
53
57
  dither!
54
58
  rake (~> 0.9.2)
59
+ rake-compiler
55
60
  rspec (~> 3.2)
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Dither
2
2
  Collection of combinatorial test generation strategies.
3
3
 
4
+ # Requirements
5
+ a c++ compiler is required when installing on mri.
6
+
4
7
  # Usage
5
8
 
6
9
  ## Pairwise Testing
data/Rakefile CHANGED
@@ -1,7 +1,11 @@
1
1
  require 'bundler'
2
+
2
3
  Bundler::GemHelper.install_tasks
3
4
 
4
5
  require 'rspec/core/rake_task'
5
6
  RSpec::Core::RakeTask.new
6
7
 
8
+ require 'rake/extensiontask'
9
+ Rake::ExtensionTask.new('dither')
10
+
7
11
  task :default => :spec
data/dither.gemspec CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_development_dependency "rspec", "~> 3.2"
18
18
  s.add_development_dependency "rake", "~> 0.9.2"
19
+ s.add_development_dependency "rake-compiler"
19
20
  s.add_development_dependency "coveralls"
20
21
 
21
22
  files = `git ls-files`.split("\n")
@@ -25,6 +26,9 @@ Gem::Specification.new do |s|
25
26
  # compile dither-java on jdk 8
26
27
  files << "lib/dither-0.1.3.jar"
27
28
  files << "lib/choco-solver-3.3.1-with-dependencies.jar"
29
+ else
30
+ s.add_dependency "ffi", "~> 1.0"
31
+ s.extensions = 'ext/dither/extconf.rb'
28
32
  end
29
33
  s.files = files
30
34
 
@@ -0,0 +1,2 @@
1
+
2
+ sources copied from [dither-cxx](https://github.com/jesg/dither-cxx)
@@ -0,0 +1,36 @@
1
+ /*
2
+ *
3
+ * Copyright (C) 2015 Jason Gowan
4
+ * All rights reserved.
5
+ *
6
+ * This software may be modified and distributed under the terms
7
+ * of the BSD license. See the LICENSE file for details.
8
+ */
9
+
10
+ #ifndef BASE_CONSTRAINT_HANDLER_H_
11
+ #define BASE_CONSTRAINT_HANDLER_H_
12
+
13
+ #include <vector>
14
+ #include "dither_types.h"
15
+
16
+ namespace dither {
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;
25
+ }
26
+ virtual bool ground(dtest_case &test_case) {
27
+ for (auto it = test_case.begin(); it != test_case.end(); ++it) {
28
+ if ((*it) == -1) {
29
+ *it = 0;
30
+ }
31
+ }
32
+ return true;
33
+ }
34
+ };
35
+ }
36
+ #endif // BASE_CONSTRAINT_HANDLER_H_
@@ -0,0 +1,127 @@
1
+ /*
2
+ *
3
+ * Copyright (C) 2015 Jason Gowan
4
+ * All rights reserved.
5
+ *
6
+ * This software may be modified and distributed under the terms
7
+ * of the BSD license. See the LICENSE file for details.
8
+ */
9
+
10
+ #ifndef COMBINATIONS_H_
11
+ #define COMBINATIONS_H_
12
+
13
+ #include <vector>
14
+ #include <forward_list>
15
+ #include "dither_types.h"
16
+
17
+ namespace dither {
18
+
19
+ inline void product(
20
+ std::forward_list<dtest_case>& rvvi, // final result
21
+ dtest_case& rvi, // current result
22
+ std::vector<dtest_case>::const_iterator me, // current input
23
+ std::vector<dtest_case>::const_iterator end); // final input
24
+
25
+ inline void product2(
26
+ std::forward_list<std::vector<param>>& rvvi, // final result
27
+ std::vector<param>& rvi, // current result
28
+ std::vector<std::vector<param>>::const_iterator me, // current input
29
+ std::vector<std::vector<param>>::const_iterator end); // final input
30
+
31
+ inline void gcombinations_(const std::vector<int>&, std::vector<int>&,
32
+ std::forward_list<std::vector<int>>&);
33
+
34
+ inline void combinations(const int, const std::vector<int>&,
35
+ std::forward_list<std::vector<int>>&);
36
+
37
+ inline void product2(
38
+ std::forward_list<std::vector<param>>& rvvi, // final result
39
+ std::vector<param>& rvi, // current result
40
+ std::vector<std::vector<param>>::const_iterator me, // current input
41
+ std::vector<std::vector<param>>::const_iterator end) // final input
42
+ {
43
+ if (me == end) {
44
+ // terminal condition of the recursion. We no longer have
45
+ // any input vectors to manipulate. Add the current result (rvi)
46
+ // to the total set of results (rvvvi).
47
+ rvvi.push_front(rvi);
48
+ return;
49
+ }
50
+
51
+ // need an easy name for my vector-of-ints
52
+ const std::vector<param>& mevi = *me;
53
+ for (std::vector<param>::const_iterator it = mevi.begin(); it != mevi.end();
54
+ it++) {
55
+ // final rvi will look like "a, b, c, ME, d, e, f"
56
+ // At the moment, rvi already has "a, b, c"
57
+ rvi.push_back(*it); // add ME
58
+ product2(rvvi, rvi, me + 1, end); // add "d, e, f"
59
+ rvi.pop_back(); // clean ME off for next round
60
+ }
61
+ }
62
+
63
+ void combinations(const int n, const std::vector<int>& input,
64
+ std::forward_list<std::vector<int>>& output) {
65
+ std::vector<int> scratch(n);
66
+
67
+ if (n <= input.size()) {
68
+ for (int i = 0; i < n; i++) {
69
+ scratch[i] = i;
70
+ }
71
+
72
+ gcombinations_(input, scratch, output);
73
+ while (1) {
74
+ int i;
75
+ for (i = n - 1; (i >= 0) && (scratch[i] == (input.size() - n + i)); i--)
76
+ ;
77
+
78
+ if (i < 0) {
79
+ break;
80
+ } else {
81
+ scratch[i]++;
82
+ for (++i; i < n; i++) {
83
+ scratch[i] = scratch[i - 1] + 1;
84
+ }
85
+ gcombinations_(input, scratch, output);
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ inline void gcombinations_(const std::vector<int>& input,
92
+ std::vector<int>& scratch,
93
+ std::forward_list<std::vector<int>>& output) {
94
+ std::vector<int> result(scratch.size());
95
+ for (std::size_t i = 0; i < result.size(); i++) {
96
+ result[i] = input[scratch[i]];
97
+ }
98
+ output.push_front(result);
99
+ }
100
+
101
+ inline void product(
102
+ std::forward_list<dtest_case>& rvvi, // final result
103
+ dtest_case& rvi, // current result
104
+ std::vector<dtest_case>::const_iterator me, // current input
105
+ std::vector<dtest_case>::const_iterator end) // final input
106
+ {
107
+ if (me == end) {
108
+ // terminal condition of the recursion. We no longer have
109
+ // any input vectors to manipulate. Add the current result (rvi)
110
+ // to the total set of results (rvvvi).
111
+ rvvi.push_front(rvi);
112
+ return;
113
+ }
114
+
115
+ // need an easy name for my vector-of-ints
116
+ const dtest_case& mevi = *me;
117
+ for (dtest_case::const_iterator it = mevi.begin(); it != mevi.end(); it++) {
118
+ // final rvi will look like "a, b, c, ME, d, e, f"
119
+ // At the moment, rvi already has "a, b, c"
120
+ rvi.push_back(*it); // add ME
121
+ product(rvvi, rvi, me + 1, end); // add "d, e, f"
122
+ rvi.pop_back(); // clean ME off for next round
123
+ }
124
+ }
125
+ }
126
+
127
+ #endif
@@ -0,0 +1,47 @@
1
+ /*
2
+ *
3
+ * Copyright (C) 2015 Jason Gowan
4
+ * All rights reserved.
5
+ *
6
+ * This software may be modified and distributed under the terms
7
+ * of the BSD license. See the LICENSE file for details.
8
+ */
9
+
10
+ #include "dither.h"
11
+
12
+ ipog_handle dither_ipog_new(const unsigned int t) { return new dither::Ipog(t); }
13
+
14
+ void dither_ipog_delete(ipog_handle self) {
15
+ delete static_cast<dither::Ipog *>(self);
16
+ }
17
+
18
+ void dither_ipog_add_parameter_int(ipog_handle self, const int index,
19
+ const int *values, const int values_length) {
20
+ const std::string name = std::to_string(index);
21
+ static_cast<dither::Ipog *>(self)->add_parameter(name, values, values_length);
22
+ }
23
+
24
+ void dither_ipog_run(ipog_handle self) {
25
+ static_cast<dither::Ipog *>(self)->init_param_cache();
26
+ static_cast<dither::Ipog *>(self)->run();
27
+ }
28
+
29
+ int dither_ipog_size(ipog_handle self) {
30
+ return static_cast<dither::Ipog *>(self)->size();
31
+ }
32
+
33
+ void dither_ipog_display_raw_solution(ipog_handle self) {
34
+ static_cast<dither::Ipog *>(self)->display_raw_solution();
35
+ }
36
+
37
+ void dither_ipog_fill(ipog_handle self, int *solution) {
38
+ static_cast<dither::Ipog *>(self)->fill(solution);
39
+ }
40
+
41
+ void dither_ipog_add_constraint(ipog_handle self, const int constraint[], const int length) {
42
+ static_cast<dither::Ipog *>(self)->add_constraint(constraint, length);
43
+ }
44
+
45
+ void dither_ipog_add_previously_tested(ipog_handle self, const int tested[], const int length) {
46
+ static_cast<dither::Ipog *>(self)->add_previously_tested(tested, length);
47
+ }
@@ -0,0 +1,31 @@
1
+ /*
2
+ *
3
+ * Copyright (C) 2015 Jason Gowan
4
+ * All rights reserved.
5
+ *
6
+ * This software may be modified and distributed under the terms
7
+ * of the BSD license. See the LICENSE file for details.
8
+ */
9
+
10
+ #ifndef DITHER_H_
11
+ #define DITHER_H_
12
+
13
+ #include <string>
14
+ #include "ipog.h"
15
+
16
+ extern "C" {
17
+
18
+ typedef void* ipog_handle;
19
+
20
+ ipog_handle dither_ipog_new(const unsigned int);
21
+ void dither_ipog_add_parameter_int(ipog_handle, const int, const int[],
22
+ const int);
23
+ void dither_ipog_run(ipog_handle);
24
+ int dither_ipog_size(ipog_handle);
25
+ void dither_ipog_display_raw_solution(ipog_handle);
26
+ void dither_ipog_fill(ipog_handle, int[]);
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 );
30
+ }
31
+ #endif // DITHER_H_
@@ -0,0 +1,32 @@
1
+ /*
2
+ *
3
+ * Copyright (C) 2015 Jason Gowan
4
+ * All rights reserved.
5
+ *
6
+ * This software may be modified and distributed under the terms
7
+ * of the BSD license. See the LICENSE file for details.
8
+ */
9
+
10
+ #ifndef DITHER_TYPES_H_
11
+ #define DITHER_TYPES_H_
12
+
13
+ #include <string>
14
+
15
+ namespace dither {
16
+
17
+ typedef signed char dval;
18
+
19
+ #define DITHER_BOOL_T 0
20
+ #define DITHER_INT_T 1
21
+ #define DITHER_STRING_T 2
22
+
23
+ struct param {
24
+ std::size_t first;
25
+ dval second;
26
+ std::string name;
27
+ unsigned char type;
28
+ };
29
+ typedef std::vector<dval> dtest_case;
30
+ }
31
+
32
+ #endif
@@ -0,0 +1,4 @@
1
+
2
+ require 'mkmf'
3
+ $CPPFLAGS += ' -std=c++11 -O3 '
4
+ create_makefile('dither')