vstr.clu_1 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. vstream = cluster is create, addnum, output
  2. bigint = word
  3. ai = array[int]
  4. hi = heap[int]
  5. rep = record [
  6. name: string,
  7. vals: hi,
  8. remdup: bool
  9. ]
  10. bigunparse = bigint$dunparse
  11. int2big = bigint$extend
  12. create = proc (s: string, remdup: bool) returns (cvt)
  13. return (rep${
  14. name: s,
  15. vals: hi$create (int$lt),
  16. remdup: remdup})
  17. end create
  18. addnum = proc (s: cvt, v: int)
  19. hi$insert (s.vals, v)
  20. end addnum
  21. output = proc (x: cvt, s: stream)
  22. osize: int := hi$size (x.vals)
  23. a: ai := h2a (x.vals, x.remdup)
  24. sum: bigint := asum (a)
  25. stream$puts ("Statistics on ", s)
  26. stream$putl (x.name, s)
  27. stream$puts (" Count = ", s)
  28. stream$putl (int$unparse (ai$size(a)), s)
  29. stream$puts (" Nonzero Count = ", s)
  30. stream$putl (int$unparse (nzc (a)), s)
  31. if osize ~= ai$size (a) then
  32. stream$puts (" Number of Duplicates Ignored = ", s)
  33. stream$putl (int$unparse (osize-ai$size(a)), s)
  34. end
  35. stream$puts (" Total = ", s)
  36. stream$putl (bigunparse (sum), s)
  37. stream$puts (" Low Value = ", s)
  38. stream$putl (int$unparse (ai$bottom (a)), s)
  39. stream$puts (" High Value = ", s)
  40. stream$putl (int$unparse (ai$top (a)), s)
  41. stream$puts (" Average = ", s)
  42. stream$putl (bigunparse (sum/int2big(ai$size(a))), s)
  43. stream$puts (" Median = ", s)
  44. stream$putl (int$unparse (a[ai$size(a)/2]), s)
  45. stream$puts (" 90% value = ", s)
  46. stream$putl (int$unparse (a[ai$size(a)*9/10]), s)
  47. stream$puts (" 95% value = ", s)
  48. stream$putl (int$unparse (a[ai$size(a)*19/20]), s)
  49. stream$putl ("", s)
  50. end output
  51. asum = proc (a: ai) returns (bigint)
  52. sum: bigint := int2big (0)
  53. for e: int in ai$elements (a) do
  54. sum := sum + int2big (e)
  55. end
  56. return (sum)
  57. end asum
  58. h2a = proc (x: hi, remdup: bool) returns (ai)
  59. a: ai := ai$create (0)
  60. if hi$empty (x) then return (a) end
  61. last: int := hi$top (x) + 1
  62. while ~hi$empty (x) do
  63. v: int := hi$remove (x)
  64. if ~remdup cor v ~= last then
  65. ai$addh (a, v)
  66. end
  67. last := v
  68. end
  69. return (a)
  70. end h2a
  71. nzc = proc (a: ai) returns (int)
  72. c: int := 0
  73. for v: int in ai$elements (a) do
  74. if v ~= 0 then c := c + 1 end
  75. end
  76. return (c)
  77. end nzc
  78. end vstream