Gecoder C0 Coverage Information - RCov

lib/gecoder/interface/constraints/int_enum/channel.rb

Name Total Lines Lines of Code Total Coverage Code Coverage
lib/gecoder/interface/constraints/int_enum/channel.rb 86 30
100.00%
100.00%

Key

Code reported as executed by Ruby looks like this...and this: this line is also marked as covered.Lines considered as run by rcov, but not reported by Ruby, look like this,and this: these lines were inferred by rcov (using simple heuristics).Finally, here's a line marked as not executed.

Coverage Details

1 module Gecode::IntEnum
2   class IntEnumConstraintReceiver
3     # Constrains this enumeration to "channel" +int_enum+.  Channel
4     # constraints are used to give access to multiple viewpoints when
5     # modelling. 
6     # 
7     # The channel constraint can be thought of as constraining the arrays to 
8     # be each other's inverses. I.e. if the i:th value in the first enumeration
9     # is j, then the j:th value in the second enumeration is constrained to be 
10     # i.
11     # 
12     # Neither reification nor negation is supported.
13     # 
14     # ==== Examples 
15     # 
16     # Lets say that we're modelling a sequence of numbers that must be distinct
17     # and that we want access to the following two view simultaneously.
18     # 
19     # === First view
20     # 
21     # The sequence is modelled as an array of integer variables where the first 
22     # variable holds the value of the first position in the sequence, the 
23     # second the value of the second position and so on.
24     # 
25     #   # n variables with values from 0 to n-1.
26     #   elements = int_var_array(n, 0...n)
27     #   elements.must_be.distinct
28     # 
29     # That way +elements+ will contain the actual sequence when the problem has 
30     # been solved.
31     # 
32     # === Second view
33     # 
34     # The sequence is modelled as the positions of each value in 0..(n-1) in 
35     # the sequence. That way the first variable would hold the positions of 0 
36     # in the sequence, the second variable would hold the positions of 1 in the 
37     # sequence and so on.
38     # 
39     #   positions = int_var_array(n, 0...n)
40     #   positions.must_be.distinct
41     # 
42     # === Connecting the views
43     #   
44     # In essence the relationship between the two arrays +elements+ and 
45     # +positions+ is that
46     # 
47     #   elements.map{ |e| e.val }[i] == positions.map{ |p| p.val }.index(i)
48     # 
49     # for all i in 0..(n-1). This relationship is enforced by the channel 
50     # constraint as follows. 
51     # 
52     #   elements.must.channel positions
53     # 
54     def channel(int_enum, options = {})
55       if @params[:negate]
56         raise Gecode::MissingConstraintError, 'A negated channel constraint ' + 
57           'is not implemented.'
58       end
59       unless int_enum.respond_to? :to_int_enum
60         raise TypeError, "Expected int enum, got #{int_enum.class}."
61       end
62       if options.has_key? :reify
63         raise ArgumentError, 'The channel constraints does not support the ' +
64           'reification option.'
65       end
66       
67       @params.update(Gecode::Util.decode_options(options))
68       @params.update(:rhs => int_enum)
69       @model.add_constraint Channel::ChannelConstraint.new(@model, @params)
70     end
71     
72     # Provides commutativity with SetEnumConstraintReceiver#channel .
73     provide_commutativity(:channel){ |rhs, _| rhs.respond_to? :to_set_enum }
74   end
75   
76   # A module that gathers the classes and modules used in channel constraints.
77   module Channel #:nodoc:
78     class ChannelConstraint < Gecode::Constraint #:nodoc:
79       def post
80         lhs, rhs = @params.values_at(:lhs, :rhs)
81         Gecode::Raw::channel(@model.active_space, lhs.to_int_enum.bind_array,
82           rhs.to_int_enum.bind_array, *propagation_options)
83       end
84     end
85   end
86 end

Generated on Thu Jan 08 13:27:03 +0100 2015 with rcov 1.0.0