fix a lot of subtle bugs
This commit is contained in:
parent
760c879fc4
commit
99dbd942f9
1 changed files with 47 additions and 49 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue