Пример #1
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('propNO', nargs='?', type=int, default=1)
    parser.add_argument('num_samp', nargs='?', type=int, default=10000)
    parser.add_argument('num_burnin', nargs='?', type=int, default=10000)
    parser.add_argument('step_sizes', nargs='?', type=float, default=[.1,.2]) # SNR10: [.5,1.]; SNR100: [.1,.2]
#     parser.add_argument('step_nums', nargs='?', type=int, default=[1])
    parser.add_argument('props', nargs='?', type=str, default=['LI_prior', 'LI_Langevin'])
    args = parser.parse_args()


    ## define the inverse elliptic problem ##
    # parameters for PDE model
    nx=40;ny=40;
    # parameters for prior model
    sigma=1.25;s=0.0625
    # parameters for misfit model
    SNR=100 # 100
    # define the inverse problem
    elliptic=Elliptic(nx=nx,ny=ny,SNR=SNR,sigma=sigma,s=s)
    
    # initialization
#     unknown=elliptic.prior.sample(whiten=True)
    unknown=elliptic.prior.gen_vector()
#     unknown=df.Function(elliptic.pde.V)
#     MAP_file=os.path.join(os.getcwd(),'result/MAP_SNR'+str(SNR)+'.h5')
#     if os.path.isfile(MAP_file):
#         f=df.HDF5File(elliptic.pde.mpi_comm,MAP_file,"r")
#         f.read(unknown,'parameter')
#         f.close()
#     else:
#         unknown=elliptic.get_MAP(SAVE=True)
#     unknown=elliptic.prior.u2v(unknown.vector())
    
    # run MCMC to generate samples
    print("Preparing DILI sampler using {} proposal with step sizes {} for LIS and CS resp....".format(args.props[args.propNO],args.step_sizes,))

    dili=DILI(unknown,elliptic,args.step_sizes,proposal=args.props[args.propNO],n_lag=100,n_max=100)
    dili.adaptive_MCMC(args.num_samp,args.num_burnin,threshold_l=1e-3,threshold_g=1e-3)

    # append PDE information including the count of solving
    filename_=os.path.join(dili.savepath,dili.filename+'.pckl')
    filename=os.path.join(dili.savepath,'Elliptic_'+dili.filename+'.pckl') # change filename
    os.rename(filename_, filename)
    f=open(filename,'ab')
    soln_count=elliptic.pde.soln_count
    pickle.dump([nx,ny,sigma,s,SNR,soln_count,args],f)
    f.close()
Shiwei Lan @ CalTech, 2017
"""

import os,pickle
import dolfin as df
import numpy as np
import matplotlib.pyplot as plt
# import pandas as pd
from itertools import cycle
from Elliptic_dili import Elliptic


# define the inverse problem
np.random.seed(2017)
SNR=100
elliptic = Elliptic(nx=40,ny=40,SNR=SNR)

# algorithms
algs=('pCN','infMALA','infHMC','DRinfmMALA','DRinfmHMC','DILI','aDRinfmMALA','aDRinfmHMC')
alg_names=('pCN','$\infty$-MALA','$\infty$-HMC','DR-$\infty$-mMALA','DR-$\infty$-mHMC','DILI','aDR-$\infty$-mMALA','aDR-$\infty$-mHMC')
num_algs=len(algs)
found = np.zeros(num_algs,dtype=np.bool)
# preparation for estimates
folder = './analysis_f_SNR'+str(SNR)
h5_names=[f for f in os.listdir(folder) if f.endswith('.h5')]
num_samp=2000
pckl_names=[f for f in os.listdir(folder) if f.endswith('.pckl')]

max_iter=1000
max_time=1500
Пример #3
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('algNO', nargs='?', type=int, default=0)
    parser.add_argument('propNO', nargs='?', type=int, default=1)
    parser.add_argument('num_samp', nargs='?', type=int, default=10000)
    parser.add_argument('num_burnin', nargs='?', type=int, default=10000)
    parser.add_argument('step_sizes', nargs='?', type=float,
                        default=[.25,
                                 .1])  # SNR10: [3.,1.5]; SNR100: [.22,.06]
    parser.add_argument('step_nums', nargs='?', type=int, default=[1, 4])
    parser.add_argument('algs',
                        nargs='?',
                        type=str,
                        default=('aDRinfmMALA', 'aDRinfmHMC'))
    parser.add_argument('props',
                        nargs='?',
                        type=str,
                        default=('LI_prior', 'LI_Langevin'))
    args = parser.parse_args()

    ## define the inverse elliptic problem ##
    # parameters for PDE model
    nx = 40
    ny = 40
    # parameters for prior model
    sigma = 1.25
    s = 0.0625
    # parameters for misfit model
    SNR = 100  # 100
    # define the inverse problem
    elliptic = Elliptic(nx=nx, ny=ny, SNR=SNR, sigma=sigma, s=s)

    # initialization
    #     unknown=elliptic.prior.sample(whiten=True)
    unknown = elliptic.prior.gen_vector()
    #     unknown=df.Function(elliptic.pde.V)
    #     MAP_file=os.path.join(os.getcwd(),'result/MAP_SNR'+str(SNR)+'.h5')
    #     if os.path.isfile(MAP_file):
    #         f=df.HDF5File(elliptic.pde.mpi_comm,MAP_file,"r")
    #         f.read(unknown,'parameter')
    #         f.close()
    #     else:
    #         unknown=elliptic.get_MAP(SAVE=True)
    #     unknown=elliptic.prior.u2v(unknown.vector())

    # run MCMC to generate samples
    print(
        "Preparing %s sampler using %s proposal with step size %g for %d step(s)..."
        % (args.algs[args.algNO], args.props[args.propNO],
           args.step_sizes[args.algNO], args.step_nums[args.algNO]))

    #     if args.algs[args.algNO] is 'aDRinfmMALA':
    #         adrinfmGMC=aDRinfmMALA(unknown,elliptic,args.step_size,proposal=args.props[args.propNO])
    #     elif args.algs[args.algNO] is 'aDRinfmHMC':
    #         adrinfmGMC=aDRinfmHMC(unknown,elliptic,args.step_size,args.step_nums[args.algNO],proposal=args.props[args.propNO])
    #     else:
    #         print('Algorithm not available!')
    #         raise
    adrinfmGMC = aDRinfGMC(unknown,
                           elliptic,
                           args.step_sizes[args.algNO],
                           args.step_nums[args.algNO],
                           args.algs[args.algNO],
                           args.props[args.propNO],
                           n_lag=100,
                           n_max=100)
    adrinfmGMC.adaptive_MCMC(args.num_samp,
                             args.num_burnin,
                             threshold_l=1e-3,
                             threshold_g=1e-3)

    # append PDE information including the count of solving
    filename_ = os.path.join(adrinfmGMC.savepath,
                             adrinfmGMC.filename + '.pckl')
    filename = os.path.join(adrinfmGMC.savepath, 'Elliptic_' +
                            adrinfmGMC.filename + '.pckl')  # change filename
    os.rename(filename_, filename)
    f = open(filename, 'ab')
    soln_count = elliptic.pde.soln_count
    pickle.dump([nx, ny, sigma, s, SNR, soln_count, args], f)
    f.close()
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('algNO', nargs='?', type=int, default=0)
    parser.add_argument('num_samp', nargs='?', type=int, default=2000)
    parser.add_argument('num_burnin', nargs='?', type=int, default=500)
    parser.add_argument(
        'step_sizes', nargs='?', type=float,
        default=[.5, 2., 1.3, 6.,
                 4.])  # SNR10: [.5,2,1.3,6.,4.];SNR100: [.01,.04,0.04,.52,.25]
    parser.add_argument('step_nums',
                        nargs='?',
                        type=int,
                        default=[1, 1, 4, 1, 4, 1, 4])
    parser.add_argument('algs',
                        nargs='?',
                        type=str,
                        default=('pCN', 'infMALA', 'infHMC', 'DRinfmMALA',
                                 'DRinfmHMC'))
    args = parser.parse_args()

    ## define the inverse elliptic problem ##
    # parameters for PDE model
    nx = 40
    ny = 40
    # parameters for prior model
    sigma = 1.25
    s = 0.0625
    # parameters for misfit model
    SNR = 10  # 100
    # define the inverse problem
    elliptic = Elliptic(nx=nx, ny=ny, SNR=SNR, sigma=sigma, s=s)

    # initialization
    #     unknown=elliptic.prior.sample(whiten=False)
    unknown = elliptic.prior.gen_vector()
    #     unknown=df.Function(elliptic.pde.V)
    #     MAP_file=os.path.join(os.getcwd(),'result/MAP.h5')
    #     if os.path.isfile(MAP_file):
    #         f=df.HDF5File(elliptic.pde.mpi_comm,MAP_file,"r")
    #         f.read(unknown,'parameter')
    #         f.close()
    #     else:
    #         unknown=elliptic.get_MAP(SAVE=True)

    # run MCMC to generate samples
    print("Preparing %s sampler with step size %g for %d step(s)..." %
          (args.algs[args.algNO], args.step_sizes[args.algNO],
           args.step_nums[args.algNO]))

    inf_GMC = geoinfMC(unknown,
                       elliptic,
                       args.step_sizes[args.algNO],
                       args.step_nums[args.algNO],
                       args.algs[args.algNO],
                       k=5)
    mc_fun = inf_GMC.sample
    mc_args = (args.num_samp, args.num_burnin)
    mc_fun(*mc_args)

    # append PDE information including the count of solving
    filename_ = os.path.join(inf_GMC.savepath, inf_GMC.filename + '.pckl')
    filename = os.path.join(inf_GMC.savepath, 'Elliptic_' + inf_GMC.filename +
                            '.pckl')  # change filename
    os.rename(filename_, filename)
    f = open(filename, 'ab')
    #     soln_count=[elliptic.soln_count,elliptic.pde.soln_count]
    soln_count = elliptic.pde.soln_count
    pickle.dump([nx, ny, sigma, s, SNR, soln_count, args], f)
    f.close()
Пример #5
0
    """
    eigs=kwargs.pop('eigs',None)
    if eigs:# is not None:
        return _GA_posterior_lr(prior,eigs,**kwargs)
    metact=kwargs.pop('metact',None)
    rtmetact=kwargs.pop('rtmetact',None)
    if metact and rtmetact:
        return _GA_posterior_exct(prior,metact,rtmetact,**kwargs)
    else:
        df.error('Definition not specified!')
        
if __name__ == '__main__':
#     np.random.seed(2017)
    from Elliptic_dili import Elliptic
    # define the inverse problem
    elliptic=Elliptic(nx=40,ny=40,SNR=10)
    # get MAP
    unknown=df.Function(elliptic.pde.V)
    MAP_file=os.path.join(os.getcwd(),'MAP.h5')
    if os.path.isfile(MAP_file):
        f=df.HDF5File(elliptic.pde.mpi_comm,MAP_file,"r")
        f.read(unknown,'parameter')
        f.close()
    else:
        unknown=elliptic.get_MAP(SAVE=True)
    
    import time
    start = time.time()
    # get eigen-decomposition of posterior Hessian at MAP
    _,_,_,eigs=elliptic.get_geom(unknown.vector(),geom_ord=[1.5],whitened=False,k=100)#threshold=1e-2)
    # define approximate Gaussian posterior