# EZFIO is an automatic generator of I/O libraries # Copyright (C) 2009 Anthony SCEMAMA, CNRS # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Anthony Scemama # LCPQ - IRSAMC - CNRS # Universite Paul Sabatier # 118, route de Narbonne # 31062 Toulouse Cedex 4 # scemama@irsamc.ups-tlse.fr import os, sys import time import cStringIO as StringIO from gzip import GzipFile import tempfile import threading def version(x): b = [int(i) for i in x.split('.')] return b[2] + b[1]*100 + b[0]*10000 def size(x): return len(x) def flatten(l): res = [] for i in l: if hasattr(i, "__iter__") and not isinstance(i, basestring): res.extend(flatten(i)) else: res.append(i) return res def maxval(l): return reduce(max, l, l[0]) def minval(l): return reduce(min, l, l[0]) def reshape(l,shape): l = flatten(l) for d in shape[:-1]: buffer = [] buffer2 = [] i=0 while i>file,self.version file.close() def error(self,where,txt): print '------------------------------------------------------------' print 'EZFIO File : '+self.filename print 'EZFIO Error in : '+where.strip() print '------------------------------------------------------------' print '' print txt.strip() print '' print '------------------------------------------------------------' raise IOError def get_filename(self): if not self.exists(self._filename): self.mkdir(self._filename) return self._filename def set_filename(self,filename): self._filename = filename filename = property(fset=set_filename,fget=get_filename) def set_file(self,filename): self.filename = filename if not self.exists(filename): self.mkdir(filename) self.mkdir(filename+"/ezfio") os.system(""" LANG= date > %s/ezfio/creation echo $USER > %s/ezfio/user echo %s > %s/ezfio/library"""%(filename,filename,self.LIBRARY,filename)) def open_write_buffer(self,dir,fil,rank): if self.read_only: self.error('Read-only file.') l_filename=dir.strip()+'/'+fil+'.gz' if self.buffer_rank != -1: self.error('open_write_buffer','Another buffered file is already open.') self.buffer_rank = rank assert (self.buffer_rank > 0) try: self.file = GzipFile(filename=l_filename,mode='wb7') except IOError: self.error('open_write_buffer','Unable to open buffered file.') self.file.write("%2d\n"%(rank,)) def open_read_buffer(self,dir,fil,rank): l_filename=dir.strip()+'/'+fil+'.gz' if self.buffer_rank != -1: self.error('open_read_buffer','Another buffered file is already open.') try: self.file = GzipFile(filename=l_filename,mode='rb') except IOError: self.error('open_read_buffer','Unable to open buffered file.') try: rank = eval(self.file.readline()) except IOError: self.error('open_read_buffer','Unable to read buffered file.') self.buffer_rank = rank assert (self.buffer_rank > 0) return rank def close_buffer(self): assert (self.buffer_rank > 0) self.buffer_rank = -1 self.file.close() def read_buffer(self,isize): if self.buffer_rank == -1: self.error('read_buffer','No buffered file is open.') indices = [] values = [] for i in xrange(isize): try: line = self.file.readline().split() except: return indices, values if len(line) == 0: return indices, values indices.append ( [ int(i) for i in line[:-1] ] ) values.append (eval(line[-1])) return indices, values def write_buffer(self,indices,values,isize): if self.read_only: self.error('Read-only file.') if self.buffer_rank == -1: self.error('write_buffer','No buffered file is open.') for i in xrange(isize): for j in indices[i]: self.file.write("%4d "%(j,)) self.file.write("%24.15e\n"%(values[i],))