From c9b98cc7c01642436f37d92ce4d9306ff19d01c7 Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Wed, 4 Dec 2013 14:12:37 -0800 Subject: [PATCH] Recursive printing to view the inversion. --- .travis.yml | 2 +- SimPEG/utils/Save.py | 126 ++++++++++++++++++++++++++++--------------- 2 files changed, 84 insertions(+), 44 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8ef7869a..1918d175 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: virtualenv: system_site_packages: true before_install: - - sudo apt-get install -qq python-numpy python-scipy python-matplotlib libhdf5-dev + - sudo apt-get install -qq python-numpy python-scipy python-matplotlib - python SimPEG/setup.py # command to install dependencies install: "pip install -r requirements.txt --use-mirrors" diff --git a/SimPEG/utils/Save.py b/SimPEG/utils/Save.py index 9f661b0d..45cc48c8 100644 --- a/SimPEG/utils/Save.py +++ b/SimPEG/utils/Save.py @@ -1,8 +1,12 @@ import numpy as np import time -import h5py import re +try: + import h5py +except Exception, e: + print 'Warning: SimPEG table needs h5py to be installed.' + def natural_keys(text): ''' alist.sort(key=natural_keys) sorts in human order @@ -25,6 +29,52 @@ class SimPEGTable: self.inversions = hdf5InversionGroup(self,self.root.addGroup('inversions',soft=True)) + + def saveInversion(self, invObj, dataPath): + + invObj._invNode = self.inversions.addGroup('%d'%self.numChildren) + + # At the start of every iteration we will create a inversion iteration node. + def _doStartIteration_hdf5_inv(invObj): + invNodeIt = invObj._invNode.addGroup('%d'%(invObj._iter+1)) + invNodeIt.attrs['complete'] = False + invNodeIt.attrs['time'] = time.time() + invObj._invNodeIt = invNodeIt + invObj.hook(_doStartIteration_hdf5_inv, overwrite=True) + + def _doEndIteration_hdf5_inv(invObj): + invNodeIt = invObj._invNodeIt + invNodeIt.attrs['time'] = time.time() - invNodeIt.attrs['time'] + invNodeIt.attrs['ctime'] = time.ctime() + invNodeIt.attrs['phi_d'] = invObj.phi_d + invNodeIt.attrs['phi_m'] = invObj.phi_m + invNodeIt.setArray('m', invObj.m) + invNodeIt.setArray('dpred', invObj.dpred) + invNodeIt.attrs['complete'] = True + invObj.hook(_doEndIteration_hdf5_inv, overwrite=True) + + def _doStartIteration_hdf5_opt(optObj): + optNodeIt = optObj.parent._invNode.addGroup('%d.%d'%(optObj.parent._iter, optObj._iter)) + optNodeIt.attrs['complete'] = False + optNodeIt.attrs['time'] = time.time() + optObj._optNodeIt = optNodeIt + + invObj.opt.hook(_doStartIteration_hdf5_opt, overwrite=True) + + def _doEndIteration_hdf5_opt(optObj, xt): + optNodeIt = optObj._optNodeIt + optNodeIt.attrs['time'] = time.time() - optNodeIt.attrs['time'] + optNodeIt.attrs['ctime'] = time.ctime() + optNodeIt.setArray('m', xt) + optNodeIt.setArray('dpred', optObj.parent.dpred) + optNodeIt.setArray('searchDirection', optObj.searchDirection) + optNodeIt.attrs['complete'] = True + invObj.opt.hook(_doEndIteration_hdf5_opt, overwrite=True) + + return invObj._invNode + + + class hdf5Group(object): """Has some low level support for wrapping the native HDF5-Group class""" @@ -93,54 +143,44 @@ class hdf5Group(object): child = self.childClass(self.T, child) return child + def show(self, pad='', maxDepth=1, depth=0): + """ + Recursively show the structure of the database. + + For example:: + + + - + - + - + - + - + """ + s = self.__str__() + pad += ' '*4 + if maxDepth <= 0: print s + if depth >= maxDepth: return s + + for c in self.children: + if issubclass(self[c].__class__, hdf5Group): + s += '\n%s- %s' % (pad, self[c].show(pad=pad,depth=depth+1,maxDepth=maxDepth)) + else: + s += '\n%s- %s' % (pad, self[c].__str__()) + if depth is 0: + print s + else: + return s + + def __str__(self): + return '<%s "%s" (%d member%s)>' % (self.__class__.__name__, self.path, self.numChildren, '' if self.numChildren == 1 else 's') + + class hdf5InversionGroup(hdf5Group): def __init__(self, T, groupNode): hdf5Group.__init__(self, T, groupNode) self.childClass = hdf5Inversion - def saveInversion(self, invObj, dataPath): - invObj._invNode = self.addGroup('%d'%self.numChildren) - - # At the start of every iteration we will create a inversion iteration node. - def _doStartIteration_hdf5_inv(invObj): - invNodeIt = invObj._invNode.addGroup('%d'%(invObj._iter+1)) - invNodeIt.attrs['complete'] = False - invNodeIt.attrs['time'] = time.time() - invObj._invNodeIt = invNodeIt - invObj.hook(_doStartIteration_hdf5_inv, overwrite=True) - - def _doEndIteration_hdf5_inv(invObj): - invNodeIt = invObj._invNodeIt - invNodeIt.attrs['time'] = time.time() - invNodeIt.attrs['time'] - invNodeIt.attrs['ctime'] = time.ctime() - invNodeIt.attrs['phi_d'] = invObj.phi_d - invNodeIt.attrs['phi_m'] = invObj.phi_m - invNodeIt.setArray('m', invObj.m) - invNodeIt.setArray('dpred', invObj.dpred) - invNodeIt.attrs['complete'] = True - invObj.hook(_doEndIteration_hdf5_inv, overwrite=True) - - def _doStartIteration_hdf5_opt(optObj): - optNodeIt = optObj.parent._invNode.addGroup('%d.%d'%(optObj.parent._iter, optObj._iter)) - optNodeIt.attrs['complete'] = False - optNodeIt.attrs['time'] = time.time() - optObj._optNodeIt = optNodeIt - - invObj.opt.hook(_doStartIteration_hdf5_opt, overwrite=True) - - def _doEndIteration_hdf5_opt(optObj, xt): - optNodeIt = optObj._optNodeIt - optNodeIt.attrs['time'] = time.time() - optNodeIt.attrs['time'] - optNodeIt.attrs['ctime'] = time.ctime() - optNodeIt.setArray('m', xt) - optNodeIt.setArray('dpred', optObj.parent.dpred) - optNodeIt.setArray('searchDirection', optObj.searchDirection) - optNodeIt.attrs['complete'] = True - invObj.opt.hook(_doEndIteration_hdf5_opt, overwrite=True) - - return invObj._invNode - class hdf5Inversion(hdf5Group): def __init__(self, T, groupNode):