Source code for xxzchain.lib.functions

import h5py
import os
import numpy as np
from ..core import *


__all__ = ['preset','load_system','to_operator']

[docs]def to_operator(system): '''decorator for make operator given function. System will hold given function below this decorator.''' if not isinstance(system, System): raise SyntaxError("use @to_operator(system).") class setter: def __init__(self, system): self.system = system def __call__(self, func): ufunc = inspect.getsource(func).split('\n')[1:] ufunc_name = ufunc[0][ufunc[0].find('def')+3:ufunc[0].find('(')].split()[0] if ufunc_name in self.system._function: raise NameError("already same name exist!") code = '' for line in ufunc: code += line+'\n' vect = 'import numpy as np\n@np.vectorize\n'+code saver = self.system.saver.require_group('function') function=saver.create_group(ufunc_name) function.attrs['code'] = code.encode() function.attrs['fid'] = self.system._fid self.system._fid+=1 compiled = compile(vect, 'userfunction','exec') exec(compiled, self.system._function) del self.system._function['np'],self.system._function['__builtins__'] temp = Operator(self.system, ufunc_name, prefix= self.system._function[ufunc_name]) return temp wrapper = setter(system) return wrapper
[docs]def preset(system, globalscope): '''define 4 operators on given system and given scope''' globalscope['n_i'] = Operator(system, prefix=Operator.n_i) globalscope['b_i'] = Operator(system, prefix=Operator.annihilation) globalscope['b_i_dag'] = Operator(system, prefix= Operator.creation) globalscope['hopping'] = Operator(system, prefix= Operator.hopping)
[docs]def load_system(path, print_tree=True): '''Please indicate system saved folder. return is system object. Recommended way is use of 'load_system(path)' ''' if not path[0] =='/': path = os.path.abspath(path) if os.path.isfile(path+'.hdf5'): path = path + '.hdf5' if os.path.isfile(path): file = h5py.File(path) temp = System(file.attrs['size'], name = file.attrs['name'].decode()) file.close() temp.load(path, print_tree) return temp else: raise FileExistsError("'{}' doesn't exist".format(path))