File: diff-cover.rb

package info (click to toggle)
genometools 1.6.6%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 50,576 kB
  • sloc: ansic: 271,876; ruby: 29,930; python: 5,106; sh: 3,083; makefile: 1,213; perl: 219; pascal: 159; haskell: 37; sed: 5
file content (112 lines) | stat: -rwxr-xr-x 2,109 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env ruby

def copy(v,r)
  return Array.new(r) {v}
end

def partialsums(bseq)
  sum = 0
  l = [0]
  bseq.each do |b|
    sum += b
    l = l.push(sum)
  end
  return l
end

def checkcover(v,psum,i)
  psum.each do |j|
    psum.each do |k|
      if (k-j) % v == i
        return true
      end
    end
  end
  return false
end

def checkallcover(v,psum)
  0.upto(v-1) do |i|
    if not checkcover(v,psum,i)
      STDERR.puts "cannot find difference elements for #{i} in #{v}-cover"
      exit(1)
    end
  end
end

def diff_cover(check,logmod)
  dc = case logmod 
    when 0 then [0]
    when 1 then [0,1]
    when 2 then [0,1,2]
    when 3 then [0,1,2,4]
    when 4 then [0,1,2,5,8]
    when 5 then [0,1,2,3,7,11,19]
    when 6 then [0,1,2,5,14,16,34,42,59]
    when 7 then [0,1,3,7,17,40,55,64,75,85,104,109,117]
    when 8 then [0,1,3,7,12,20,30,44,65,80,89,96,114,
                122,128,150,196,197,201,219]
    else
      v = 2**logmod
      r = 0
      while 24*r*r+36*r+13 < v
        r += 1
      end
      bseq = copy(1,r) + 
             copy(r+1,1) + 
             copy(2*r+1,r) + 
             copy(4*r+3,2*r+1) + 
             copy(2*r+2,r+1) + 
             copy(1,r)
      psum = partialsums(bseq)
      if check
        checkallcover(v,psum)
      end
      partialsums(bseq)
  end
  return dc
end

def usage()
  STDERR.puts "Usage: #{$0} [check] <maxcover>"
  exit(1)
end

check=false
if ARGV.length == 1
  maxcover=ARGV[0].to_i
else
  if ARGV.length == 2
    if ARGV[0] == 'check'
      check=true
      maxcover=ARGV[0].to_i
    else
      usage()
    end
  else
    usage()
  end
end

def formtype(dc,cflag)
  dc.collect {|a| "#{cflag}(" + a.to_s + ")"}
end
  
puts "static Diffvalue differencecovertab[] ="
puts "{"
lentab = []
0.upto(maxcover) do |logmod|
  dc = diff_cover(check,logmod)
  lentab = lentab.push(dc.length)
  print "  /* #{2**logmod} */ " + formtype(dc,"UScast").join(",")
  if logmod == maxcover
    puts ""
  else
    puts ", "
  end
end
puts "};"
puts ""

puts "static Diffrank differencecoversizes[]"
puts "  = {" + formtype(lentab,"UCcast").join(",") + "};"