ruby-cbc 0.3.9 → 0.3.10
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 +4 -4
- data/lib/ruby-cbc/conflict_solver.rb +5 -8
- data/lib/ruby-cbc/problem.rb +2 -2
- data/lib/ruby-cbc/utils/compressed_row_storage.rb +40 -1
- data/lib/ruby-cbc/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb4564011e69a1bd69b32e0717f34ade1b74ba08
|
4
|
+
data.tar.gz: 27e6c72d7a52f68782a4419565f654c6008ad8dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b831fe254cfbcbb95360b09c779a2b952a9d1c64fc6b37ac23268eb2975fbbbe7c81e8d25f35c81e81a795a70d135b5f8e32d63956c472e4d86628dd57317798
|
7
|
+
data.tar.gz: ce4e9693f8448a70c2ad498bb6a0cac2af42a492ad328668830a8be1c58e54dce3d4305feb41e56b97de46e54925efd914be3b2cfdf7430a94b083aeb94269bd
|
@@ -23,7 +23,6 @@ module Cbc
|
|
23
23
|
loop do
|
24
24
|
range_idxs = first_failing(conflict_set_size, crs, continuous: continuous, max_iterations: max_iter)
|
25
25
|
break if range_idxs.nil?
|
26
|
-
puts "RANGE #{range_idxs}"
|
27
26
|
crs = crs.restrict_to_n_constraints(range_idxs.max + 1)
|
28
27
|
crs.move_constraint_to_start(range_idxs)
|
29
28
|
clusters.insert(0, range_idxs.size)
|
@@ -34,7 +33,6 @@ module Cbc
|
|
34
33
|
crs2 = crs.restrict_to_n_constraints(conflict_set_size)
|
35
34
|
problem = Problem.from_compressed_row_storage(crs2, continuous: continuous)
|
36
35
|
if infeasible?(problem)
|
37
|
-
puts "CONFLICT"
|
38
36
|
clusters.delete_at(-1)
|
39
37
|
break if clusters.size == conflict_set_size
|
40
38
|
|
@@ -54,8 +52,7 @@ module Cbc
|
|
54
52
|
end
|
55
53
|
|
56
54
|
conflict_set_size = crs.nb_constraints - clusters[-1]
|
57
|
-
puts "CLUSTERS #{clusters.inspect}"
|
58
|
-
puts "VARS #{crs.col_idx.uniq.size}"
|
55
|
+
# puts "CLUSTERS #{clusters.inspect}"
|
59
56
|
end
|
60
57
|
crs.model.constraints[0, conflict_set_size]
|
61
58
|
end
|
@@ -77,18 +74,18 @@ module Cbc
|
|
77
74
|
max_iterations -= 1
|
78
75
|
end
|
79
76
|
half_constraint_idx = (max_idx + min_idx) / 2
|
80
|
-
puts "Refining: [#{min_idx}:#{max_idx}] -> #{half_constraint_idx}"
|
77
|
+
# puts "Refining: [#{min_idx}:#{max_idx}] -> #{half_constraint_idx}"
|
81
78
|
crs2 = crs.restrict_to_n_constraints(half_constraint_idx + 1)
|
82
79
|
problem = Problem.from_compressed_row_storage(crs2, continuous: continuous)
|
83
80
|
if infeasible?(problem)
|
84
81
|
max_idx = half_constraint_idx
|
85
|
-
puts " INFEAS"
|
82
|
+
# puts " INFEAS"
|
86
83
|
else
|
87
84
|
min_idx = half_constraint_idx + 1
|
88
|
-
puts " FEAS"
|
85
|
+
# puts " FEAS"
|
89
86
|
end
|
90
87
|
if max_idx == min_idx
|
91
|
-
puts "found: max = #{max_idx} min = #{min_idx} nb = #{crs.nb_constraints}"
|
88
|
+
# puts "found: max = #{max_idx} min = #{min_idx} nb = #{crs.nb_constraints}"
|
92
89
|
return nil if max_idx > crs.nb_constraints
|
93
90
|
return min_idx..max_idx
|
94
91
|
end
|
data/lib/ruby-cbc/problem.rb
CHANGED
@@ -86,13 +86,13 @@ module Cbc
|
|
86
86
|
|
87
87
|
idx = 0
|
88
88
|
while idx < @crs.nb_constraints do
|
89
|
-
c = model.constraints[idx]
|
89
|
+
c = @crs.model.constraints[idx]
|
90
90
|
set_constraint_bounds(c, idx)
|
91
91
|
idx += 1
|
92
92
|
end
|
93
93
|
idx = 0
|
94
94
|
while idx < ccs.nb_vars do
|
95
|
-
v = model.vars[idx]
|
95
|
+
v = @crs.model.vars[idx]
|
96
96
|
if continuous
|
97
97
|
Cbc_wrapper.Cbc_setContinuous(@cbc_model, idx)
|
98
98
|
else
|
@@ -44,11 +44,50 @@ module Util
|
|
44
44
|
def restrict_to_n_constraints(nb_constraints)
|
45
45
|
length_of_values = @row_ptr[nb_constraints]
|
46
46
|
CompressedRowStorage.new.tap do |crs|
|
47
|
-
crs.model = @model
|
47
|
+
crs.model = @model.clone
|
48
48
|
crs.variable_index = @variable_index
|
49
49
|
crs.row_ptr = @row_ptr[0, nb_constraints + 1]
|
50
50
|
crs.col_idx = @col_idx[0, length_of_values]
|
51
51
|
crs.values = @values[0, length_of_values]
|
52
|
+
crs.delete_missing_vars
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def present_var_indices
|
57
|
+
is_present = Array.new(@variable_index.count, false)
|
58
|
+
@col_idx.each do |col_idx|
|
59
|
+
is_present[col_idx] = true
|
60
|
+
end
|
61
|
+
is_present
|
62
|
+
end
|
63
|
+
|
64
|
+
def delete_missing_vars
|
65
|
+
at_least_one_missing = false
|
66
|
+
here = present_var_indices
|
67
|
+
new_idx = Array.new(@variable_index.count, -1)
|
68
|
+
idx = 0
|
69
|
+
current_index = 0
|
70
|
+
while idx < new_idx.size do
|
71
|
+
if here[idx]
|
72
|
+
new_idx[idx] = current_index
|
73
|
+
current_index += 1
|
74
|
+
else
|
75
|
+
at_least_one_missing = true
|
76
|
+
end
|
77
|
+
idx += 1
|
78
|
+
end
|
79
|
+
|
80
|
+
return unless at_least_one_missing
|
81
|
+
|
82
|
+
new_variable_index = {}
|
83
|
+
@variable_index.each do |v, i|
|
84
|
+
new_variable_index[v] = new_idx[i] if new_idx[i] != -1
|
85
|
+
end
|
86
|
+
@variable_index = new_variable_index
|
87
|
+
@col_idx.map! { |idx| new_idx[idx] }
|
88
|
+
@model.vars = Array.new(@variable_index.size)
|
89
|
+
@variable_index.each do |var, idx|
|
90
|
+
@model.vars[idx] = var
|
52
91
|
end
|
53
92
|
end
|
54
93
|
|
data/lib/ruby-cbc/version.rb
CHANGED