Advertisement
Norbi930523

LZWpython.py

Nov 26th, 2013
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.30 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import sys
  4. import math
  5. import time
  6. import os
  7.  
  8. class LZWBinFa():
  9.     def __init__(self):
  10.         self.fa = self.gyoker;
  11.  
  12.     def betesz(self, b):
  13.         if b == '0':
  14.             if self.fa.nullasGyermek() == None:
  15.                 uj = self.Csomopont('0');
  16.                 self.fa.ujNullasGyermek(uj);
  17.                 self.fa = self.gyoker;
  18.             else:
  19.                 self.fa = self.fa.nullasGyermek();
  20.         else:
  21.             if self.fa.egyesGyermek() == None:
  22.                 uj = self.Csomopont('1');
  23.                 self.fa.ujEgyesGyermek(uj);
  24.                 self.fa = self.gyoker;
  25.             else:
  26.                 self.fa = self.fa.egyesGyermek();
  27.  
  28.    
  29.     class Csomopont(object):
  30.         def __init__(self, b):
  31.             self.betu = b;
  32.             self.balNulla = self.jobbEgy = None;
  33.  
  34.         def nullasGyermek(self):
  35.             return self.balNulla;
  36.  
  37.         def egyesGyermek(self):
  38.             return self.jobbEgy;
  39.  
  40.         def ujNullasGyermek(self, gy):
  41.             self.balNulla = gy;
  42.  
  43.         def ujEgyesGyermek(self, gy):
  44.             self.jobbEgy = gy;
  45.  
  46.         def getBetu(self):
  47.             return self.betu;
  48.  
  49.         betu = "";
  50.         balNulla = None;
  51.         jobbEgy = None;
  52.  
  53.     def out(self, kiFile):
  54.         self.melyseg = 0;
  55.         self.kiir(self.gyoker, kiFile);
  56.  
  57.     def getMelyseg(self):
  58.         self.melyseg = self.maxMelyseg = 0;
  59.         self.rmelyseg(self.gyoker);
  60.         return self.maxMelyseg - 1;
  61.  
  62.     def getAtlag(self):
  63.         self.melyseg = self.atlagosszeg = self.atlagdb = 0;
  64.         self.ratlag(self.gyoker);
  65.         self.atlag = self.atlagosszeg / self.atlagdb;
  66.         return self.atlag;
  67.  
  68.     def getSzoras(self):
  69.         self.atlag = self.getAtlag();
  70.         self.szorasosszeg = 0.0;
  71.         self.melyseg = self.atlagdb = 0;
  72.  
  73.         self.rszoras(self.gyoker);
  74.  
  75.         if (self.atlagdb - 1) > 0:
  76.             self.szoras = math.sqrt(self.szorasosszeg/(self.atlagdb-1));
  77.         else:
  78.             self.szoras = math.sqrt(self.szorasosszeg);
  79.  
  80.         return self.szoras;
  81.  
  82.     fa = None;
  83.     melyseg = 0;
  84.     atlagosszeg = 0;
  85.     atlagdb = 0;
  86.     szorasosszeg = 0;
  87.  
  88.     def kiir(self, elem, kiFile):
  89.         if elem != None:
  90.             self.melyseg+=1;
  91.             self.kiir(elem.egyesGyermek(), kiFile);
  92.             for i in range(0, self.melyseg):
  93.                 kiFile.write("---");
  94.  
  95.             kiFile.write(elem.getBetu() + "(" + str(self.melyseg-1) + ")\n");
  96.             self.kiir(elem.nullasGyermek(), kiFile);
  97.             self.melyseg-=1;
  98.  
  99.     gyoker = Csomopont('/');
  100.     maxMelyseg = 0;
  101.     atlag = 0;
  102.     szoras = 0;
  103.  
  104.     def rmelyseg(self, elem):
  105.         if elem != None:
  106.             self.melyseg+=1;
  107.  
  108.             if self.melyseg > self.maxMelyseg:
  109.                 self.maxMelyseg = self.melyseg;
  110.  
  111.             self.rmelyseg(elem.egyesGyermek());
  112.             self.rmelyseg(elem.nullasGyermek());
  113.             self.melyseg-=1;
  114.    
  115.     def ratlag(self, elem):
  116.         if elem != None:
  117.             self.melyseg+=1;
  118.             self.ratlag(elem.egyesGyermek());
  119.             self.ratlag(elem.nullasGyermek());
  120.             self.melyseg-=1;
  121.  
  122.             if (elem.egyesGyermek() == None) and (elem.nullasGyermek() == None):
  123.                 self.atlagdb+=1;
  124.                 self.atlagosszeg+=self.melyseg;
  125.  
  126.     def rszoras(self, elem):
  127.         if elem != None:
  128.             self.melyseg+=1;
  129.             self.rszoras(elem.egyesGyermek());
  130.             self.rszoras(elem.nullasGyermek());
  131.             self.melyseg-=1;
  132.             if (elem.egyesGyermek() == None) and (elem.nullasGyermek() == None):
  133.                 self.atlagdb+=1;
  134.                 self.szorasosszeg+= ((self.melyseg-self.atlag)*(self.melyseg-self.atlag));
  135.        
  136. def checkArgs(argv):
  137.     if len(argv) != 4:
  138.         print("usage: lzwtree in_file -o out_file");
  139.         sys.exit(-1);
  140.  
  141.     if argv[2] != "-o":
  142.         print("usage: lzwtree in_file -o out_file");
  143.         sys.exit(-2);
  144.  
  145. checkArgs(sys.argv);
  146.  
  147. try:
  148.     beFile = open(sys.argv[1],"r");
  149. except:
  150.     print("Input file not found!");
  151.     sys.exit(-3);
  152.  
  153. try:
  154.     kiFile = open(sys.argv[3], "w");
  155. except:
  156.     print("Could not open output file!");
  157.     sys.exit(-4);
  158.  
  159. b = "";
  160. binFa = LZWBinFa();
  161. counter = os.fstat(beFile.fileno()).st_size;
  162. delta = time.time();
  163.  
  164. while True:
  165.     b = beFile.read(1);
  166.     counter-=1;
  167.     if b == "\n":
  168.         break;
  169.  
  170. kommentben = False;
  171.  
  172. while True:
  173.     b = beFile.read(1);
  174.    
  175.     if b == "":
  176.         break;
  177.  
  178.     counter-=1;
  179.  
  180.     if b == ">":
  181.         kommentben = True;
  182.         continue;
  183.  
  184.     if b == "\n":
  185.         kommentben = False;
  186.         continue;
  187.  
  188.     if kommentben:
  189.         continue;
  190.  
  191.     if b == "N":
  192.         continue;
  193.        
  194.     b = ord(b);
  195.     for i in range(0,8):
  196.         if (b & 0x80) != 0:
  197.             binFa.betesz("1");
  198.         else:
  199.             binFa.betesz("0");
  200.         b<<=1;
  201.  
  202. binFa.out(kiFile);
  203. kiFile.write("depth = " + str(binFa.getMelyseg()) + '\n');
  204. kiFile.write("mean = " + str(binFa.getAtlag()) + '\n');
  205. kiFile.write("var = " + str(binFa.getSzoras()) + '\n');
  206.  
  207. beFile.close();
  208. kiFile.close();
  209.  
  210. delta = time.time() - delta;
  211. print(str(delta) + " secs");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement