rANS_encoding.sf 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/ruby
  2. # Basic implementation of rANS encoding.
  3. # Reference:
  4. # ‎Stanford EE274: Data Compression I 2023 I Lecture 7 - ANS
  5. # https://youtube.com/watch?v=5Hp4bnvSjng
  6. class rANS(input) {
  7. has M = 0
  8. has freq = Hash()
  9. has cumul = Hash()
  10. has alphabet = []
  11. method init {
  12. freq = input.freq
  13. var t = 0
  14. alphabet = input.uniq.sort
  15. alphabet.each {|s|
  16. cumul{s} = t
  17. t += freq{s}
  18. }
  19. M = t
  20. }
  21. method rans_base_enc(x_prev, s) {
  22. var block_id = idiv(x_prev, freq{s})
  23. var slot = cumul{s}+(x_prev % freq{s})
  24. var x = (block_id*M + slot)
  25. return x
  26. }
  27. method encode() {
  28. var x = 0
  29. input.each{|s|
  30. x = self.rans_base_enc(x,s)
  31. }
  32. return x
  33. }
  34. method rans_base_dec(x) {
  35. var(block_id, slot) = divmod(x,M)
  36. var s = alphabet.bsearch_le{|v| cumul{v} <=> slot }
  37. var x_prev = (block_id*freq{s} + slot - cumul{s})
  38. return (s,x_prev)
  39. }
  40. method decode(x, n) {
  41. var dec = []
  42. var s = nil
  43. n.times {
  44. (s,x) = self.rans_base_dec(x)
  45. dec << s
  46. }
  47. return dec.reverse
  48. }
  49. }
  50. var seq = [1,2,1,7,8,2,2,1,3,3,1,1,1,2]
  51. var obj = rANS(seq)
  52. var enc = obj.encode
  53. var dec = obj.decode(enc, seq.len)
  54. say enc
  55. say dec
  56. assert_eq(dec, seq)