Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > df29c83ca401d91ec9c00bfcf7fea4ea > files > 251

shedskin-0.8-2mdv2010.2.i586.rpm

#!/usr/bin/python

import math
import sys

class histogram:
  def __init__(self,start,end,nbins=10):
    self.start = start
    self.end = end
    self.nbins = nbins
    self.inc = (end-start)/nbins
    self.bins = []
    self.norm = []
    self.npts = 0
    for i in range(0,nbins):
      self.bins.append(0.0)
      self.norm.append(0)

  def add_value(self,v):
    idx = -1
    if self.inc > 0.0:
      idx = int((v - self.start)/self.inc)
    if idx < 0 or idx >= self.nbins:
      return
    self.bins[idx] += 1
    self.npts += 1

#  def get_histogram(self):
#    hist = []
#    for i in range(0,self.nbins):
#      x = self.start + i*self.inc
#      if self.npts == 0:
#        val = 0
#      else:
#        val = self.bins[i]/(1.0*self.npts)
#      hist.append((x,val))
#    return hist

  def print_histogram(self,fname):
    out_hist = open(fname,"w")
    for i in range(0,self.nbins):
      x = self.start + i*self.inc
      val = self.bins[i]/(1.0*self.npts)
      print >>out_hist, x,val
    out_hist.close()


class auto_histogram:
  def __init__(self,nbins=10,nstart=100):
    self.nbins = nbins
    self.nstart = nstart
    self.start_pts = []
    self.hist = None

  def add_value(self,v):
    if len(self.start_pts) < self.nstart-1:
      self.start_pts.append(v)
    elif len(self.start_pts) == self.nstart-1:
      self.start_pts.append(v)
      self.init_hist()
    else:
      self.hist.add_value(v)

  def init_hist(self):
    if len(self.start_pts) == 0:
      max_v = 1.0
      min_v = 0.0
    else:
      max_v = self.start_pts[0]
      min_v = self.start_pts[0]
    for v in self.start_pts:
      if v > max_v:
        max_v = v
      if v < min_v:
        min_v = v
    dist = max_v - min_v
    min_v -= dist*.1
    max_v += dist*.1
    self.hist = histogram(min_v,max_v,self.nbins)
    for v in self.start_pts:
       self.hist.add_value(v)

#  def get_histogram(self):
#    if not(self.hist):
#       self.init_hist()
#    return self.hist.get_histogram()

  def print_histogram(self,fname):
    if not(self.hist):
       self.init_hist()
    self.hist.print_histogram(fname)


#class weighted_histogram:
#  def __init__(self,start,end,nbins=10):
#    self.start = start
#    self.end = end
#    self.nbins = nbins
#    self.inc = (end-start)/nbins
#    self.bins = []
#    self.npts = 0
#    self.total_weight = 0
#    for i in range(0,nbins):
#      self.bins.append(0.0)
#
#  def add_value(self,v,weight):
#    idx = int((v - self.start)/self.inc)
#    #print v,idx
#    if idx < 0 or idx >= self.nbins:
#      return
#    self.bins[idx] += weight
#    self.npts += 1
#    self.total_weight += weight
#
#  def print_histogram(self,fname):
#    out_hist = open(fname,"w")
#    for i in range(0,self.nbins):
#     x = self.start + i*self.inc
#     val = self.bins[i]/(1.0*self.total_weight)
#     print >>out_hist, x,val
#    out_hist.close()


#class auto_weighted_histogram:
#  def __init__(self,nbins=10,nstart=100):
#    self.nbins = nbins
#    self.nstart = nstart
#    self.start_pts = []
#    self.hist = None
#
#  def add_value(self,v,weight):
#    if len(self.start_pts) < self.nstart-1:
#      self.start_pts.append((v,weight))
#    elif len(self.start_pts) == self.nstart-1:
#      self.start_pts.append((v,weight))
#      self.init_hist()
#    else:
#      self.hist.add_value(v,weight)
#
#  def init_hist(self):
#    max_v = self.start_pts[0][0]
#    min_v = self.start_pts[0][0]
#    for (v,w) in self.start_pts:
#      if v > max_v:
#        max_v = v
#      if v < min_v:
#        min_v = v
#    dist = max_v - min_v
#    min_v -= dist*.1
#    max_v += dist*.1
#    self.hist = weighted_histogram(min_v,max_v,self.nbins)
#    for (v,w) in self.start_pts:
#       self.hist.add_value(v,w)
#
#  def print_histogram(self,fname):
#    if not(self.hist):
#       self.init_hist()
#    self.hist.print_histogram(fname)

#class two_histogram:
#  def __init__(self,start,end,nbins=[10,10]):
#    self.start = start
#    self.end = end
#    self.nbins = nbins
#    self.inc = []
#    self.inc.append((end[0]-start[0])/nbins[0])
#    self.inc.append((end[1]-start[1])/nbins[1])
#    self.bins = []
#    self.norm = []
#    self.npts = 0
#    for i in range(0,self.nbins[0]):
#      self.bins.append([])
#      for j in range(0,self.nbins[1]):
#        self.bins[i].append(0.0)
#
#  def add_value(self,v):
#    idx1 = int((v[0] - self.start[0])/self.inc[0])
#    idx2 = int((v[1] - self.start[1])/self.inc[1])
#    idx = idx1*self.nbins[0] + idx2
#    if idx1 < 0 or idx1 >= self.nbins[0] or idx2 < 0 or idx2 > self.nbins[1]:
#      return
#    self.bins[idx1][idx2] += 1
#    self.npts += 1
#
#  def print_histogram(self,fname):
#    out_hist = open(fname,"w")
#    for i in range(0,self.nbins[0]):
#      for j in range(0,self.nbins[1]):
#        x = self.start[0] + i*self.inc[0]
#        y = self.start[1] + j*self.inc[1]
#	idx = i*self.nbins[0] + j
#        val = self.bins[i][j]/(1.0*self.npts)
#        print >>out_hist, x,y,val
#      print >>out_hist," "
#    out_hist.close()

#class auto_two_histogram:
#  def __init__(self,nbins=[10,10],nstart=100):
#    self.nbins = nbins
#    self.nstart = nstart
#    self.start_pts = []
#    self.hist = None
#
#  def add_value(self,v):
#    if len(self.start_pts) < self.nstart-1:
#      self.start_pts.append(v)
#    elif len(self.start_pts) == self.nstart-1:
#      self.start_pts.append(v)
#      self.init_hist()
#    else:
#      self.hist.add_value(v)
#
#  def init_hist(self):
#    max_v_x = self.start_pts[0][0]
#    min_v_x = self.start_pts[0][0]
#    max_v_y = self.start_pts[0][1]
#    min_v_y = self.start_pts[0][1]
#    for v in self.start_pts:
#      if v[0] > max_v_x:
#        max_v_x = v[0]
#      if v[0] < min_v_x:
#        min_v_x = v[0]
#      if v[1] > max_v_y:
#        max_v_y = v[1]
#      if v[1] < min_v_y:
#        min_v_y = v[1]
#    dist_x = max_v_x - min_v_x
#    min_v_x -= dist_x*.1
#    max_v_x += dist_x*.1
#    dist_y = max_v_y - min_v_y
#    min_v_y -= dist_y*.1
#    max_v_y += dist_y*.1
#    self.hist = two_histogram([min_v_x,min_v_y],[max_v_x,max_v_y],self.nbins)
#    for v in self.start_pts:
#       self.hist.add_value(v)
#
#  def print_histogram(self,fname):
#    if not(self.hist):
#       self.init_hist()
#    self.hist.print_histogram(fname)

def compute_hist(in_file,col):
  data = open(in_file,"r")
  hist = auto_histogram(40,5000)
  for line in data.readlines():
    s = line.split()
    val = float(s[col])
    hist.add_value(val)
  hist.print_histogram("hist.dat")



if __name__ == '__main__':
  if len(sys.argv) > 1:
    in_file = sys.argv[1]
    col = 0
    if len(sys.argv) > 2:
      col = int(sys.argv[2])
    compute_hist(in_file,col)