fix a lot of subtle bugs

This commit is contained in:
Ward Wouts 2005-03-09 14:22:52 +00:00
parent 760c879fc4
commit 99dbd942f9

View file

@ -1,4 +1,4 @@
# $Dwarf: intspan.rb,v 1.14 2003/07/20 20:32:24 ward Exp $ # $Dwarf: intspan.rb,v 1.15 2004/06/16 08:13:35 ward Exp $
# $Source$ # $Source$
# #
@ -21,11 +21,10 @@ module Set
class IntSpan class IntSpan
Empty_String = '-' Empty_String = ''
Debuglevel = 0 Debuglevel = 0
def initialize(setspec=nil) def initialize(setspec=nil)
@set = { "empty_string" => Empty_String }
print "initialize: Calling copy\n" if Debuglevel > 0 print "initialize: Calling copy\n" if Debuglevel > 0
copy(setspec) copy(setspec)
end end
@ -63,7 +62,7 @@ def copy(set_spec)
end end
end end
def _copy_empty # makes @set the empty set def _copy_empty # makes @set the empty se
@set = { "negInf" => false } @set = { "negInf" => false }
@set["posInf"] = false @set["posInf"] = false
@set["edges"] = [] @set["edges"] = []
@ -91,8 +90,8 @@ def _copy_array(array) # copies an array into @set
end end
def _copy_set(src) # copies one set to another def _copy_set(src) # copies one set to another
@set["negInf"] = src.neg_inf @set["negInf"] = src.neg_inf?
@set["posInf"] = src.pos_inf @set["posInf"] = src.pos_inf?
@set["edges"] = src.edges @set["edges"] = src.edges
@set["run"] = [] @set["run"] = []
end end
@ -104,7 +103,6 @@ def _copy_run_list(runlist)
runlist.gsub!(/\s|_/, '') runlist.gsub!(/\s|_/, '')
return true if runlist == "" return true if runlist == ""
print "copy run list...\n" if Debuglevel > 0 print "copy run list...\n" if Debuglevel > 0
first = true first = true
@ -137,15 +135,15 @@ def _copy_run_list(runlist)
print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n" print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n"
exit exit
end end
@set = {"negInf" => true} set_neg_inf(true)
edges.push($1.to_i) edges.push($1.to_i)
next next
end end
if i =~ /^(-?\d+)-\)$/x if i =~ /^(-?\d+)-\)$/x
print "match rule 3\n" # print "match rule 3\n"
edges.push(($1.to_i-1)) edges.push(($1.to_i-1))
@set = {"posInf" => true} set_pos_inf(true)
last = true last = true
next next
end end
@ -156,8 +154,8 @@ def _copy_run_list(runlist)
print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n" print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n"
exit exit
end end
@set = {"negInf" => true} set_neg_inf(true)
@set = {"posInf" => true} set_pos_inf(true)
last = true last = true
next next
end end
@ -216,9 +214,13 @@ end
# return array # return array
#end #end
def to_s
return run_list
end
def run_list def run_list
if empty if empty?
return @set["empty_string"] return Empty_String
end end
print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0 print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0
@ -227,8 +229,8 @@ def run_list
runs = [] runs = []
if edges.length > 0 if edges.length > 0
edges = ['(', edges] if @set["negInf"] edges.unshift('(') if neg_inf?
edges.push(')') if @set["posInf"] edges.push(')') if pos_inf?
print edges.join("/"),"\n" if Debuglevel > 0 print edges.join("/"),"\n" if Debuglevel > 0
@ -237,10 +239,7 @@ def run_list
lower = edges.delete_at(0) lower = edges.delete_at(0)
upper = edges.delete_at(0) upper = edges.delete_at(0)
print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0 print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0
if !(lower.to_s == '(') and !(upper.to_s == ')') and ((lower+1) == upper)
if ((lower.to_s <=> '(')!=0 and
(upper.to_s <=> ')')!=0 and
((lower+1) == upper))
print "#{upper}\n" if Debuglevel > 0 print "#{upper}\n" if Debuglevel > 0
runs.push("#{upper}") runs.push("#{upper}")
else else
@ -282,14 +281,14 @@ def union(set_spec)
b = _real_set(set_spec) b = _real_set(set_spec)
s = IntSpan.new s = IntSpan.new
s.set_neg_inf(@set["negInf"] || b.neg_inf) s.set_neg_inf(@set["negInf"] || b.neg_inf?)
eA = @set["edges"] eA = @set["edges"]
eB = b.edges eB = b.edges
eS = s.edges eS = s.edges
inA = @set["negInf"] inA = @set["negInf"]
inB = b.neg_inf inB = b.neg_inf?
iA = 0 iA = 0
iB = 0 iB = 0
@ -318,7 +317,7 @@ def union(set_spec)
iA < eA.length and (! inB) and eS.concat(eA[iA..eA.length]) iA < eA.length and (! inB) and eS.concat(eA[iA..eA.length])
iB < eB.length and (! inA) and eS.concat(eB[iB..eB.length]) iB < eB.length and (! inA) and eS.concat(eB[iB..eB.length])
s.set_pos_inf(@set["posInf"] || b.pos_inf) s.set_pos_inf(@set["posInf"] || b.pos_inf?)
s.set_edges(eS) s.set_edges(eS)
return s return s
@ -328,14 +327,14 @@ def intersect(set_spec)
b = _real_set(set_spec) b = _real_set(set_spec)
s = IntSpan.new s = IntSpan.new
s.set_neg_inf(@set["negInf"] && b.neg_inf) s.set_neg_inf(@set["negInf"] && b.neg_inf?)
eA = @set["edges"] eA = @set["edges"]
eB = b.edges eB = b.edges
eS = s.edges eS = s.edges
inA = @set["negInf"] inA = @set["negInf"]
inB = b.neg_inf inB = b.neg_inf?
iA = 0 iA = 0
iB = 0 iB = 0
@ -364,7 +363,7 @@ def intersect(set_spec)
iA < eA.length and inB and eS.concat(eA[iA..eA.length]) iA < eA.length and inB and eS.concat(eA[iA..eA.length])
iB < eB.length and inA and eS.concat(eB[iB..eB.length]) iB < eB.length and inA and eS.concat(eB[iB..eB.length])
s.set_neg_inf(@set["posInf"] && b.pos_inf) s.set_neg_inf(@set["posInf"] && b.pos_inf?)
s.set_edges(eS) s.set_edges(eS)
return s return s
end end
@ -373,14 +372,14 @@ def diff (set_spec)
b = _real_set(set_spec) b = _real_set(set_spec)
s = IntSpan.new s = IntSpan.new
s.set_neg_inf(@set["negInf"] && ! b.neg_inf) s.set_neg_inf(@set["negInf"] && ! b.neg_inf?)
eA = @set["edges"] eA = @set["edges"]
eB = b.edges eB = b.edges
eS = s.edges eS = s.edges
inA = @set["negInf"] inA = @set["negInf"]
inB = b.neg_inf inB = b.neg_inf?
iA = 0 iA = 0
iB = 0 iB = 0
@ -411,7 +410,7 @@ def diff (set_spec)
s.set_edges(eS) s.set_edges(eS)
s.set_pos_inf(@set["posInf"] && ! b.pos_inf) s.set_pos_inf(@set["posInf"] && ! b.pos_inf?)
return s return s
end end
@ -419,7 +418,7 @@ def xor(set_spec)
b = _real_set(set_spec) b = _real_set(set_spec)
s = IntSpan.new s = IntSpan.new
s.set_neg_inf(@set["negInf"] ^ b.neg_inf) s.set_neg_inf(@set["negInf"] ^ b.neg_inf?)
eA = @set["edges"] eA = @set["edges"]
eB = b.edges eB = b.edges
@ -447,7 +446,7 @@ def xor(set_spec)
iA < eA.length and eS.concat(eA[iA..eA.length]) iA < eA.length and eS.concat(eA[iA..eA.length])
iB < eB.length and eS.concat(eB[iB..eB.length]) iB < eB.length and eS.concat(eB[iB..eB.length])
s.set_pos_inf(@set["posInf"] ^ b.pos_inf) s.set_pos_inf(@set["posInf"] ^ b.pos_inf?)
s.set_edges(eS) s.set_edges(eS)
return s return s
end end
@ -471,8 +470,8 @@ def complement
end end
end end
comp.set_neg_inf(! comp.neg_inf) comp.set_neg_inf(! comp.neg_inf?)
comp.set_pos_inf(! comp.pos_inf) comp.set_pos_inf(! comp.pos_inf?)
return comp return comp
end end
@ -482,7 +481,7 @@ def superset(set_spec)
# $b->diff($a)->empty # $b->diff($a)->empty
s = b.diff(self) s = b.diff(self)
return s.empty return s.empty?
end end
@ -491,7 +490,7 @@ def subset(set_spec)
# $a->diff($b)->empty # $a->diff($b)->empty
s = diff(b) s = diff(b)
return s.empty return s.empty?
end end
@ -499,9 +498,9 @@ def equal(set_spec)
b = _real_set(set_spec) b = _real_set(set_spec)
print "a\n" print "a\n"
@set["negInf"] == b.neg_inf or return false @set["negInf"] == b.neg_inf? or return false
print "b\n" print "b\n"
@set["posInf"] == b.pos_inf or return false @set["posInf"] == b.pos_inf? or return false
aEdge = @set["edges"] aEdge = @set["edges"]
bEdge = b.edges bEdge = b.edges
@ -539,9 +538,8 @@ def cardinality
return car return car
end end
def empty def empty?
if @set["negInf"] == false and @set["edges"].length > 0 and if neg_inf? || pos_inf? || @set["edges"].length > 0
@set["posInf"] == false
return false return false
end end
return true return true
@ -562,7 +560,7 @@ def set_edges(edges)
@set["edges"] = edges @set["edges"] = edges
end end
def neg_inf def neg_inf?
return @set["negInf"] return @set["negInf"]
end end
@ -570,7 +568,7 @@ def set_neg_inf(negInf)
@set["negInf"] = negInf @set["negInf"] = negInf
end end
def pos_inf def pos_inf?
return @set["posInf"] return @set["posInf"]
end end
@ -702,15 +700,15 @@ def remove(n)
end end
def min def min
empty and return nil empty? and return nil
neg_inf and return nil neg_inf? and return nil
@set["edges"][0]+1 @set["edges"][0]+1
end end
def max def max
empty and return nil empty? and return nil
pos_inf and return nil pos_inf? and return nil
@set["edges"][-1] @set["edges"][-1]
end end
@ -907,10 +905,10 @@ end # module
# [x] equal # [x] equal
# [x] equivalent # [x] equivalent
# [x] cardinality # [x] cardinality
# [x] empty # [x] empty?
# [x] finite # [x] finite
# [x] neg_inf { shift->{negInf} } # [x] neg_inf? { shift->{negInf} }
# [x] pos_inf { shift->{posInf} } # [x] pos_inf? { shift->{posInf} }
# [x] infinite # [x] infinite
# [ ] universal # [ ] universal
# [x] member # [x] member