Example #1
0
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
Example #2
0
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}
Example #3
0
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