def chi_list(chi_max, dchi=20, nsweeps=20, verbose=0): warnings.warn("Deprecated: moved `chi_list` to `tenpy.algorithms.dmrg.chi_list`.", category=FutureWarning, stacklevel=2) from tenpy.algorithms import dmrg chi_list = dmrg.chi_list(chi_max, dchi, nsweeps) if verbose: import pprint print("chi_list = ") pprint.pprint(chi_list) return chi_list
def test_chi_list(): assert dmrg.chi_list(3) == {0: 3} assert dmrg.chi_list(12, 12, 5) == {0: 12} assert dmrg.chi_list(24, 12, 5) == {0: 12, 5: 24} assert dmrg.chi_list(27, 12, 5) == {0: 12, 5: 24, 10: 27}
def setup_executable(mod, run_defaults, identifier_list=None, only_list_supplied=False): """Read command line arguments and turn into useable dicts. Uses default values defined at: - model class for model_par - here for sim_par - executable file for run_par Alternatively, a model_defaults dictionary and identifier_list can be supplied without the model NB: for setup_executable to work with a model class, the model class needs to define two things: - defaults, a static (class level) dictionary with (key, value) pairs that have the name of the parameter (as string) as key, and the default value as value. - identifier, a static (class level) list or other iterable with the names of the parameters to be used in filename identifiers. Args: mod (model | dict): Model class (or instance) OR a dictionary containing model defaults run_defaults (dict): default values for executable file parameters identifier_list (iterable, optional) | Used only if mod is a dict. Contains the identifier variables Returns: model_par, sim_par, run_par (dicts) : containing all parameters. args | namespace with raw arguments for some backwards compatibility with executables. """ warnings.warn( "Attention: `setup_executable` was developed for a previous version of tenpy and not all options may be operational.", category=FutureWarning, stacklevel=2) parser = argparse.ArgumentParser() # These deal with backwards compatibility (supplying a model) if type( mod ) != dict and identifier_list == None: # Assume we've been given a model class try: model_defaults = mod.defaults identifier_list = mod.identifier except AttributeError as err: print( "Cannot get model defaults and identifer list from mod. Is mod a class/instance?" ) print(err) raise AttributeError elif type(mod) == dict and hasattr(identifier_list, '__iter__'): model_defaults = mod else: raise ValueError( "If model_par are supplied as dict, identifier_list should be provided." ) # The model_par bit (for all model parameters) for label, value in model_defaults.items(): if type(value ) == bool: # For boolean defaults, we want a true/false flag if value: parser.add_argument('-' + label, action='store_false') else: parser.add_argument('-' + label, action='store_true') else: # For non-boolean defaults, take the type of the default as type for the cmdline var parser.add_argument('-' + label, type=type(value), default=value) # The run_par bit (for executable-level parameters). These are defined in the executable file # but need to be included for argparse to work correctly. for label, value in run_defaults.items(): if type(value ) == bool: # For boolean defaults, we want a true/false flag if value: parser.add_argument('-' + label, action='store_false') else: parser.add_argument('-' + label, action='store_true') else: # For non-boolean defaults, take the type of the default as type for the cmdline var print('Adding argument', label) parser.add_argument('-' + label, type=type(value), default=value) # The following parameters are run-time but so general they're defined here parser.add_argument('-ncores', type=int, default=1) parser.add_argument('-dir', type=str, default=None) parser.add_argument( '-plots', action='store_true') # Generic flag to activate plotting parser.add_argument('-seed', default=None) # For anything random # The sim_par bit (for DMRG-related parameters). These don't vary, so we'll just define here. if not 'active_sites' in run_defaults: parser.add_argument('-active_sites', type=int, default=2) parser.add_argument('-chi', type=int, default=100) parser.add_argument('-dchi', type=int, default=20) # Step size for chi ramp parser.add_argument('-dsweeps', type=int, default=20) # Number of sweeps for chi step parser.add_argument('-nqramp', type=int, default=0) # Number of insertions of qramp operator parser.add_argument( '-last_qramp', type=int, default=50) # Last sweep at which an operator is inserted parser.add_argument('-qramp_op', type=str, default=None) # Operator to insert during ramp events parser.add_argument( '-qramp_site', type=str, default='0', help= 'The site index where ramp operators should be inserted, or "R" for random sites' ) # Site on which to insert the ramp operator parser.add_argument( '-qramp_move_left', action='store_true' ) # flag indicating the operators should be inserted while moving left if run_defaults.get('min_sweeps') is None: parser.add_argument('-min_sweeps', type=int, default=30) if run_defaults.get('max_sweeps') is None: parser.add_argument('-max_sweeps', type=int, default=1000) if run_defaults.get('N_sweeps_check') is None: parser.add_argument('-N_sweeps_check', type=int, default=10) # inputs for mixer parameters, as per https://tenpy.readthedocs.io/en/latest/reference/tenpy.algorithms.dmrg.Mixer.html#cfg-config-Mixer parser.add_argument('-mixer', action='store_true') # To activate mixer parser.add_argument('-mix_str', type=float, default=1.e-3) parser.add_argument('-mix_dec', type=float, default=1.5) parser.add_argument('-mix_len', type=int, default=80) # control of tolerances: if run_defaults.get('max_E_err') is None: parser.add_argument('-max_E_err', type=float, default=1e-8) # DMRG Error tolerance if run_defaults.get('max_S_err') is None: parser.add_argument('-max_S_err', type=float, default=1e-5) # DMRG Entanglement tolerance # DMRG norm tolerance: https://tenpy.readthedocs.io/en/latest/reference/tenpy.algorithms.dmrg.DMRGEngine.html#cfg-option-DMRGEngine.norm_tol if not 'norm_tol' in run_defaults: parser.add_argument( '-norm_tol', type=float, default=1e-5 ) # After the DMRG run, update the environment with at most `norm_tol_iter` sweeps until ``np.linalg.norm(psi.norm_err()) < norm_tol``. if not 'norm_tol_iter' in run_defaults: parser.add_argument('-norm_tol_iter', type=float, default=5.0) #Perform at most `norm_tol_iter`*`update_env` sweeps to converge the norm error below `norm_tol` # parameters controlling sweeps to reconstruct the environment if run_defaults.get('start_env') is None: parser.add_argument('-start_env', type=int, default=0) if run_defaults.get('update_env') is None: parser.add_argument('-update_env', type=int) # Now parse and turn into manageable dicts. args = parser.parse_args() par_dict = vars(args) # Turns args (='Namespace' object) into dict. model_par = {} for label in model_defaults.keys( ): # Select the model-relevant parts of par_dict model_par[label] = par_dict[label] run_par = {} for label in run_defaults.keys( ): # Select the executable-relevant parts of par_dict run_par[label] = par_dict[label] try: from ..algorithms import dmrg sim_par = { 'active_sites': args.active_sites, 'chi_list': dmrg.chi_list(args.chi, args.dchi, args.dsweeps), 'qramp_op': args.qramp_op, 'qramp_list': qramp_list(args.nqramp, args.last_qramp, args.qramp_op, args.qramp_site, not args.qramp_move_left), 'min_sweeps': args.min_sweeps, 'max_sweeps': args.max_sweeps, 'N_sweeps_check': args.N_sweeps_check, 'start_env': args.start_env, 'max_E_err': args.max_E_err, 'max_S_err': args.max_S_err, 'norm_tol': args.norm_tol, 'norm_tol_iter': args.norm_tol_iter, 'verbose': args.verbose, # Take this from the model 'lanczos_params': { 'N_min': 2, 'N_max': 40, 'E_tol': 10**(-12) } } if (args.update_env is None): sim_par['update_env'] = args.N_sweeps_check // 2 else: sim_par['update_env'] = args.update_env except AttributeError as err: print( 'sim_par parsing has failed, most likely because model does not define verbose parameter.' ) print(err) raise AttributeError if args.mixer: sim_par['mixer'] = True sim_par['mixer_params'] = { 'amplitude': args.mix_str, 'decay': args.mix_dec, 'disable_after': args.mix_len } # Having set up all dictionaries, we can now do some other setting up omp_set_nthreads(args.ncores) if not args.dir == None: os.chdir(args.dir) import matplotlib matplotlib.rcParams["savefig.directory"] = os.chdir(os.getcwd()) # Build the identifier based on model-defined and general parameters identifier = "chi_{}_seed_{}_".format( args.chi, args.seed) # Only use seed if supplied? for varname in identifier_list: if 'conserve' in varname: shortened = varname.replace('conserve', 'cons').replace( 'number', 'num').replace('charge', 'ch').replace('spin', 'S') identifier += shortened + "_" else: if (only_list_supplied): if model_par[varname] != model_defaults[varname]: identifier += varname + "_" + str(model_par[varname]) + "_" else: if model_par[ varname] != 0: # Parameters that are 0 are ignored. Only want supplied? identifier += varname + "_" + str(model_par[varname]) + "_" if args.mixer: identifier += 'mix_({},{},{})'.format(args.mix_str, args.mix_dec, args.mix_len) if identifier[-1] == "_": identifier = identifier[:-1] # Attempt to shorten the identifier identifier = identifier.replace('periodic', 'inf').replace('finite', 'fin').replace('.0_', '_') identifier = identifier.replace('flux_p', 'p').replace('flux_q', 'q').replace( 'phi_ext_mode', 'pe-mode') if len(identifier) >= 144: print( "Warning: identifier has a length longer than max filename on encrypted Ubuntu! Try argument 'only_list_supplied'" ) run_par.update({ 'ncores': args.ncores, 'dir': args.dir, 'plots': args.plots, 'identifier': identifier, 'seed': args.seed, }) return model_par, sim_par, run_par, args