예제 #1
0
def build_codes(tree, ls=al.ArrayList([None] * 250), acc=""):
    if type(tree) == Leaf:
        al.set(ls, tree.char, acc)
    else:
        build_codes(tree.left, ls, acc + "0")
        build_codes(tree.right, ls, acc + "1")
    return ls
예제 #2
0
 def test_build_tree(self):
     self.assertEqual(build_tree(self.huff_list), self.huff_tree)
     self.assertEqual(
         build_tree(al.set(al.set(al.ArrayList([None] * 250), 32, 3), 98,
                           3)), self.tree0)
     self.assertEqual(
         build_tree(freq_counter("first.txt")),
         Node(97, 6, Leaf(97, 3), Node(98, 3, Leaf(99, 1), Leaf(98, 2))))
예제 #3
0
def build_codes(tree,alist,accl=""):
    if(tree==None):
        return tree
    if(type(tree)==Node):
        build_codes(tree.left,alist,accl+"0")
        build_codes(tree.right,alist,accl+"1")
    else:
        array_list.set(alist,tree.char,accl)
예제 #4
0
def chr_code(nd, x):
    new = array_list.empty_list()
    if type(nd) == Leaf:
        for i in range(x.capacity):
            if array_list.get(x, i) != None:
                new = array_list.set(new, i, '0')
        return new
    else:
        for i in range(x.capacity):
            if array_list.get(x, i) != None:
                new = array_list.set(new, i, indv_code(nd, chr(i)))
        return new
예제 #5
0
def huffman_decode(inf, outf):
    hb_reader = HuffmanBitsReader(inf)
    outFile = open(outf, 'w')
    new = array_list.empty_list()
    char_num = hb_reader.read_byte()
    if char_num == 0:
        hb_reader.close()
        outFile.close()
        return None
    for i in range(char_num):
        index = hb_reader.read_byte()
        occ = hb_reader.read_int()
        new = array_list.set(new, index, occ)
    x = build_leaf(new, comes_before)
    lst = build_nodes(x)
    string = ''
    if type(lst) == Node:
        temp = lst
        for i in range(check_size(new, chr_code(lst, new))):
            bit = hb_reader.read_bit()
            if bit == True:
                temp = temp.right
            else:
                temp = temp.left
            if type(temp) == Leaf:
                string += temp.character
                temp = lst
    if type(lst) == Leaf:
        for i in range(lst.occurrence):
            string += lst.character
    outFile.write(string)
    hb_reader.close()
    outFile.close()
    return None
예제 #6
0
def header_reader(bitreader):
    alist= array_list.List([0]*256,256,256)
    count=bitreader.read_byte()
    for i in range(count):
        char=bitreader.read_byte()
        num=bitreader.read_int()
        alist=array_list.set(alist,char,num)
    return alist
예제 #7
0
def count(inf):
    inFile = open(inf, 'r')
    if inFile.readline() == '':
        inFile.close()
        return array_list.empty_list()
    else:
        inFile.close()
        inFile = open(inf, 'r')
        new = array_list.empty_list()
        for temp in inFile:
            for char in range(len(temp)):
                index = ord(temp[char])
                val = array_list.get(new, index)
                if val == None:
                    new = array_list.set(new, index, 1)
                else:
                    new = array_list.set(new, index, val + 1)
    inFile.close()
    return new
예제 #8
0
def count_occurances(path):
    file=open_file(path)
    if(file==None):
        return None
    else:
        huffcount=array_list.List([0]*256,256,256)
        for line in file:
            for ch in line:
                val=ord(ch)
                huffcount=array_list.set(huffcount, val , array_list.get(huffcount,val)+1)
        file.close()
        return huffcount
예제 #9
0
 def test_length_of_decode(self):
     hb_reader = HuffmanBitsReader('test_encoded.bin')
     new = array_list.empty_list()
     char_num = hb_reader.read_byte()
     for i in range(char_num):
         index = hb_reader.read_byte()
         occ = hb_reader.read_int()
         new = array_list.set(new, index, occ)
     x = build_leaf(new, comes_before)
     lst = build_nodes(x)
     hb_reader.close()
     self.assertEqual(check_size(new, chr_code(lst, new)), 29)
예제 #10
0
 def test_freq_counter(self):
     self.assertRaises(FileNotFoundError, freq_counter, "fake_file.txt")
     al_first = al.ArrayList([None] * 250)
     al.set(al_first, 97, 3)
     al.set(al_first, 98, 2)
     al.set(al_first, 99, 1)
     self.assertEqual(freq_counter("first.txt"), al_first)
예제 #11
0
파일: huffman.py 프로젝트: smjaques/Python
def huffman_decode(input, output):
    read_from = HuffmanBitsReader(input)
    write_to = open(output, 'w')
    number_of_codes = read_from.read_byte()
    times = 0
    occur_list = array_list.empty_list()
    occur_list = ([None] * 256)
    total_characters = 0
    while times < number_of_codes:
        char = read_from.read_byte()
        freq = read_from.read_int()
        total_characters += freq
        times += 1
        occur_list = array_list.set(occur_list, char, freq)
    if total_characters == 0:
        write_to.write('')
        write_to.close()
        read_from.close()
        return
    sorted_list = make_sorted_list(occur_list)
    pairtree = join_leaves(sorted_list)
    tree = pairtree.first
    temp_tree = tree
    #print(total_characters)
    #read bit by bit and get the code
    bit = True
    code = ''
    chars = 0
    #write_to.write('\n')
    while bit == True or bit == False and chars < total_characters:
        bit = read_from.read_bit()

        if type(tree) != type(Leaf(1, 2)):
            if bit == True:
                tree = tree.right
                code += '1'
            elif bit == False:
                tree = tree.left
                code += '0'

        if type(tree) == type(Leaf('a', 2)):
            char = chr(tree.character)
            write_to.write(char)
            tree = temp_tree
            chars += 1
    #print(code)
    #write_to.write('\n')
    write_to.close()
    read_from.close()
예제 #12
0
 def test_build_codes(self):
     self.assertEqual(
         build_codes(self.huff_tree),
         al.set(
             al.set(
                 al.set(
                     al.set(al.set(al.ArrayList([None] * 250), 32, "00"),
                            98, "01"), 100, "100"), 99, "101"), 97, "11"))
     self.assertEqual(
         build_codes(build_tree(self.huff_list)),
         al.set(
             al.set(
                 al.set(
                     al.set(al.set(al.ArrayList([None] * 250), 32, "00"),
                            98, "01"), 100, "100"), 99, "101"), 97, "11"))
     self.assertEqual(
         build_codes(build_tree(freq_counter("huff_ex.txt"))),
         al.set(
             al.set(
                 al.set(
                     al.set(al.set(al.ArrayList([None] * 250), 32, "00"),
                            98, "01"), 100, "100"), 99, "101"), 97, "11"))
예제 #13
0
class TestList(unittest.TestCase):

    huff_list = al.set(
        al.set(
            al.set(al.set(al.set(al.ArrayList([None] * 250), 97, 4), 98, 3),
                   99, 2), 100, 1), 32, 3)
    huff_tree = Node(
        32, 13, Node(32, 6, Leaf(32, 3), Leaf(98, 3)),
        Node(97, 7, Node(99, 3, Leaf(100, 1), Leaf(99, 2)), Leaf(97, 4)))
    tree0 = Node(32, 6, Leaf(32, 3), Leaf(98, 3))
    tree1 = Node(97, 7, Node(99, 3, Leaf(100, 1), Leaf(99, 2)), Leaf(97, 4))

    print(tree0)

    def test_freq_counter(self):
        self.assertRaises(FileNotFoundError, freq_counter, "fake_file.txt")
        al_first = al.ArrayList([None] * 250)
        al.set(al_first, 97, 3)
        al.set(al_first, 98, 2)
        al.set(al_first, 99, 1)
        self.assertEqual(freq_counter("first.txt"), al_first)

    def test_tree_traversal(self):
        self.assertEqual(tree_traversal(self.tree0), " b")
        self.assertEqual(tree_traversal(self.tree1), "dca")
        self.assertEqual(tree_traversal(self.huff_tree), " bdca")

    def test_comes_before(self):
        self.assertEqual(comes_before(self.tree0, self.tree1), True)
        self.assertEqual(comes_before(self.huff_tree, self.tree0), False)
        self.assertEqual(comes_before(Leaf(32, 3), Leaf(98, 3)), True)

    def test_build_sorted_leaves(self):
        self.assertEqual(
            build_sorted_leaves(self.huff_list),
            ll.Pair(
                Leaf(100, 1),
                ll.Pair(
                    Leaf(99, 2),
                    ll.Pair(Leaf(32, 3),
                            ll.Pair(Leaf(98, 3), ll.Pair(Leaf(97, 4)))))))

    def test_build_tree(self):
        self.assertEqual(build_tree(self.huff_list), self.huff_tree)
        self.assertEqual(
            build_tree(al.set(al.set(al.ArrayList([None] * 250), 32, 3), 98,
                              3)), self.tree0)
        self.assertEqual(
            build_tree(freq_counter("first.txt")),
            Node(97, 6, Leaf(97, 3), Node(98, 3, Leaf(99, 1), Leaf(98, 2))))

    def test_build_codes(self):
        self.assertEqual(
            build_codes(self.huff_tree),
            al.set(
                al.set(
                    al.set(
                        al.set(al.set(al.ArrayList([None] * 250), 32, "00"),
                               98, "01"), 100, "100"), 99, "101"), 97, "11"))
        self.assertEqual(
            build_codes(build_tree(self.huff_list)),
            al.set(
                al.set(
                    al.set(
                        al.set(al.set(al.ArrayList([None] * 250), 32, "00"),
                               98, "01"), 100, "100"), 99, "101"), 97, "11"))
        self.assertEqual(
            build_codes(build_tree(freq_counter("huff_ex.txt"))),
            al.set(
                al.set(
                    al.set(
                        al.set(al.set(al.ArrayList([None] * 250), 32, "00"),
                               98, "01"), 100, "100"), 99, "101"), 97, "11"))