def energyANDforceLC():
    np.random.seed(455)
    Ndata = 1500
    Natoms = 7

    # parameters for potential
    eps, r0, sigma = 1.8, 1.1, np.sqrt(0.02)
    params = (eps, r0, sigma)

    # parameters for kernel and regression
    reg = 1e-5
    sig = 10

    X = np.array([makeConstrainedStructure(Natoms) for i in range(Ndata)])
    featureCalculator = bob_features()
    G, I = featureCalculator.get_featureMat(X)

    comparator = gaussComparator(sigma=sig)
    krr = krr_class(comparator=comparator, featureCalculator=featureCalculator)

    E = np.zeros(Ndata)
    F = np.zeros((Ndata, 2 * Natoms))
    for i in range(Ndata):
        E[i], grad = doubleLJ(X[i], eps, r0, sigma)
        F[i] = -grad

    NpointsLC = 10
    Ndata_array = np.logspace(1, 3, NpointsLC).astype(int)
    FVU_energy_array = np.zeros(NpointsLC)
    FVU_force_array = np.zeros((NpointsLC, 2 * Natoms))
    for i in range(NpointsLC):
        N = int(3 / 2 * Ndata_array[i])
        Esub = E[:N]
        Fsub = F[:N]
        Xsub = X[:N]
        Gsub = G[:N]
        Isub = I[:N]
        t0 = time.time()
        FVU_energy_array[i], FVU_force_array[
            i, :] = krr.cross_validation_EandF(Esub,
                                               Fsub,
                                               Gsub,
                                               Isub,
                                               Xsub,
                                               reg=reg)
        print('dt:', time.time() - t0)
        print(FVU_energy_array[i])

    np.savetxt('LC_bob_gauss_N7.txt',
               np.c_[Ndata_array, FVU_energy_array, FVU_force_array],
               delimiter='\t')
    plt.figure(1)
    plt.loglog(Ndata_array, FVU_energy_array)
    plt.figure(2)
    plt.loglog(Ndata_array, FVU_force_array)
    plt.show()
def main():
    np.random.seed(455)
    Ndata = 100
    Natoms = 4

    # parameters for potential
    eps, r0, sigma = 1.8, 1.1, np.sqrt(0.02)
    params = (eps, r0, sigma)

    # parameters for kernel and regression
    lamb = 1e-5
    sig = 10
    
    # X = np.array([makePerturbedGridStructure(Natoms) for i in range(Ndata)])
    X = np.array([makeConstrainedStructure(Natoms) for i in range(Ndata)])
    featureCalculator = bob_features()
    G, I = featureCalculator.get_featureMat(X)
    
    E = np.zeros(Ndata)
    F = np.zeros((Ndata, 2*Natoms))
    for i in range(Ndata):
        E[i], F[i] = doubleLJ(X[i], eps, r0, sigma)

    Gtrain = G[:-20]
    Etrain = E[:-20]

    # Train model
    comparator = eksponentialComparator(sigma=sig)
    krr = krr_class(comparator=comparator, featureCalculator=featureCalculator)
    # GSkwargs = {'reg': [lamb], 'sigma': [sig]}
    GSkwargs = {'reg': np.logspace(-6, -3, 5), 'sigma': np.logspace(-1, 1, 5)}
    print(Etrain.shape, Gtrain.shape)
    MAE, params = krr.gridSearch(Etrain, Gtrain, **GSkwargs)
    print('sigma', params['sigma'])
    print('reg', params['reg'])

    print('MAE=', MAE)
    print('MAE using mean:', np.mean(np.fabs(E-np.mean(E))))
    print('Mean absolute energy:', np.mean(np.fabs(E)))

    forceCurve(X[-1], krr, 6)
    
    # print('E_unrelaxed\n', E[-20:])
    # Xtest = X[-20:]
    # relaxTest(Xtest, krr, params)
    
    """
def energyLC():
    np.random.seed(455)
    Ndata = 1000
    Natoms = 7

    # parameters for potential
    eps, r0, sigma = 1.8, 1.1, np.sqrt(0.02)
    params = (eps, r0, sigma)

    # parameters for kernel and regression
    reg = 1e-5
    sig = 10

    X = np.array([makeConstrainedStructure(Natoms) for i in range(Ndata)])
    featureCalculator = bob_features()
    G, I = featureCalculator.get_featureMat(X)

    comparator = eksponentialComparator(sigma=sig)
    krr = krr_class(comparator=comparator, featureCalculator=featureCalculator)

    E = np.zeros(Ndata)
    F = np.zeros((Ndata, 2 * Natoms))
    for i in range(Ndata):
        E[i], F[i] = doubleLJ(X[i], eps, r0, sigma)

    NpointsLC = 10
    Ndata_array = np.logspace(1, 2, NpointsLC).astype(int)
    MAE_array = np.zeros(NpointsLC)
    for i in range(NpointsLC):
        N = Ndata_array[i]
        Esub = E[:N]
        Gsub = G[:N]
        t0 = time.time()
        MAE_array[i] = krr.cross_validation(Esub, Gsub, reg=reg)
        print('dt:', time.time() - t0)
        print(MAE_array[i])

    np.savetxt('LC_bob_N7_3.txt',
               np.c_[Ndata_array, MAE_array],
               delimiter='\t')
    plt.loglog(Ndata_array, MAE_array)
    plt.show()
示例#4
0
Ndata = args.Ndata
Ntest = args.Ntest
Natoms = args.Natoms
hlr = args.hlr
savefile = args.savefile
m = args.m
q = args.q

# Parameters for double well LJ potential
eps, r0, sigma = 1.8, 1.1, np.sqrt(0.02)
params = (eps, r0, sigma)


# Initialize KRR class instance
krr = krr_class(featureCalculator=bob_features,
                comparator=gaussComparator(sigma=1), # Initialize with sigma = 1. It is changed after gridsearch/optimization
                Ntrain=Ndata)

# Generate coordinates for atoms
X = getConstrainedStructureDataset(Ndata,Natoms)
Xtest = getConstrainedStructureDataset(Ntest,Natoms)

# Generate corresponding features
G, I = bob_features().get_featureMat(X)
Gtest, Itest = bob_features().get_featureMat(Xtest)


# Get energies and forecs
E,F = getEnergyAndForces(doubleLJ,X,Natoms,params)
Etest,Ftest = getEnergyAndForces(doubleLJ,Xtest,Natoms,params)
示例#5
0
def mainML():
    def Efun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_energy(X, params[0], params[1], params[2])

    def gradfun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_gradient(X, params[0], params[1], params[2])

    sig = 3
    reg = 1e-5
    comparator = gaussComparator(sigma=sig)
    featureCalculator = bob_features()
    krr = krr_class(comparator=comparator,
                    featureCalculator=featureCalculator,
                    reg=reg)
    optim = globalOptim(Efun,
                        gradfun,
                        krr,
                        Natoms=7,
                        dmax=2.5,
                        Niter=200,
                        Nstag=400,
                        sigma=1,
                        maxIterLocal=3)
    optim.runOptimizer()

    GSkwargs = {'reg': [reg], 'sigma': [sig]}
    MAE, params = krr.gridSearch(optim.Esaved[:optim.ksaved],
                                 positionMat=optim.Xsaved[:optim.ksaved],
                                 **GSkwargs)
    print('MAE:', MAE)
    print(optim.Esaved.T[:optim.ksaved])
    print('best E:', optim.Ebest)
    # Make into numpy arrays
    ktrain = np.array(optim.ktrain)
    EunrelML = np.array(optim.EunrelML)
    Eunrel = np.array(optim.Eunrel)
    FunrelML = np.array(optim.FunrelML)
    FunrelTrue = np.array(optim.FunrelTrue)

    dErel = np.fabs(np.array(optim.ErelML) - np.array(optim.ErelTrue))
    dErelTrue = np.fabs(np.array(optim.ErelML) - np.array(optim.ErelMLTrue))
    dE2rel = np.fabs(np.array(optim.ErelML) - np.array(optim.E2rel))
    dEunrel = np.fabs(EunrelML - Eunrel)
    dFunrel = np.fabs(FunrelML=FunrelTrue)

    np.savetxt('dErel_vs_ktrain2.txt',
               np.c_[ktrain, dErel, dErelTrue, EunrelML, Eunrel],
               delimiter='\t')

    print(FunrelTrue)
    print(FunrelTrue.shape)

    plt.figure(1)
    plt.title('Structure Example')
    plotStructure(optim.Xbest)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.figure(2)
    plt.title('Energies of relaxed struxtures')
    plt.loglog(ktrain, dErel, color='r')
    plt.loglog(ktrain, dErelTrue, color='b')
    plt.loglog(ktrain, dE2rel, color='g')
    plt.xlabel('NData')
    plt.ylabel('Energy')
    # plt.legend()
    plt.figure(3)
    plt.title('Energies of unrelaxed structures')
    plt.loglog(ktrain, dEunrel)
    plt.xlabel('NData')
    plt.ylabel('Energy')
    plt.figure(4)
    plt.title('Difference between ML and True force of unrelaxed structures')
    plt.loglog(ktrain, dFunrel)
    plt.xlabel('NData')
    plt.ylabel('Force')
    plt.show()
示例#6
0
def mainEnergyAndForceCurve():
    #np.random.seed(455)
    Ndata = 1000
    Natoms = 7

    # parameters for potential
    eps, r0, sigma = 1.8, 1.1, np.sqrt(0.02)
    params = (eps, r0, sigma)

    # parameters for kernel and regression
    reg = 1e-5
    sig = 3

    def Efun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_energy(X, params[0], params[1], params[2])

    def gradfun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_gradient(X, params[0], params[1], params[2])

    featureCalculator = bob_features()
    comparator = gaussComparator(sigma=sig)
    krr = krr_class(comparator=comparator,
                    featureCalculator=featureCalculator,
                    reg=reg)

    optim = globalOptim(Efun,
                        gradfun,
                        krr,
                        Natoms=Natoms,
                        dmax=2.5,
                        Niter=200,
                        Nstag=400,
                        sigma=1,
                        maxIterLocal=3)
    optim.runOptimizer()
    X = optim.Xsaved[:Ndata]

    # Calculate energy and forces
    E = np.zeros(Ndata)
    F = np.zeros((Ndata, 2 * Natoms))
    for i in range(Ndata):
        E[i], grad = doubleLJ(X[i], eps, r0, sigma)
        F[i] = -grad

    Xtrain = X[:-1]
    Xtest = X[-1]
    Etrain = E[:-1]
    Etest = E[-1]
    krr.fit(Etrain, positionMat=Xtrain)

    Npoints = 1000
    dx_array = np.linspace(-0.05, 0.05, Npoints)
    dx_diff = dx_array[1] - dx_array[0]
    # choose coordinate to perturb
    i_perturb = 0
    ei = np.zeros(2 * Natoms)
    ei[i_perturb] = 1

    # Calculate energy and forces of perturbed structures
    Etrue = np.zeros(Npoints)
    Ftrue = np.zeros((Npoints, 2 * Natoms))
    for i in range(Npoints):
        Etrue[i], grad = doubleLJ(Xtest + dx_array[i] * ei, eps, r0, sigma)
        Ftrue[i] = -grad
    Ftrue0 = Ftrue[:, i_perturb]

    Epred = np.array(
        [krr.predict_energy(pos=Xtest + dx * ei) for dx in dx_array])
    Fpred = np.array(
        [krr.predict_force(pos=Xtest + dx * ei) for dx in dx_array])
    Fpred0 = Fpred[:, i_perturb]
    Ffinite0 = -(Epred[1:] - Epred[:-1]) / dx_diff

    plt.figure(1)
    plt.title('Energy with one coordinate varied')
    plt.plot(dx_array, Etrue, label='True energy')
    plt.plot(dx_array, Epred, label='Predicted energy')
    plt.xlabel('dx (perturbation of single coordinate)')
    plt.ylabel('Energy')
    plt.legend()

    plt.figure(2)
    plt.title('Force with one coordinate varied')
    plt.plot(dx_array, Ftrue0, label='True force')
    plt.plot(dx_array, Fpred0, label='Predicted force')
    plt.plot(dx_array[:-1] + dx_diff / 2,
             Ffinite0,
             linestyle=':',
             label='finite difference force')
    plt.xlabel('dx (perturbation of single coordinate)')
    plt.ylabel('Energy')
    plt.legend()

    boxsize = 1.5 * np.sqrt(Natoms)

    xbox = np.array([0, boxsize, boxsize, 0, 0])
    ybox = np.array([0, 0, boxsize, boxsize, 0])
    x = Xtest[0::2]
    y = Xtest[1::2]
    # Perturbation line
    xline = np.array([x[0] - 0.05 * ei, x[0] + 0.05 * ei])
    yline = y[0] * np.ones(2)

    plt.figure(3)
    #plt.plot(xbox, ybox, color='k')
    plt.scatter(x, y, color='r', s=8)
    plt.plot(xline, yline)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.gca().set_aspect('equal', adjustable='box')

    plt.show()
示例#7
0
def energyANDforceLC_searchData():
    # np.random.seed(455)
    Ndata = 1500
    Natoms = 7

    # parameters for potential
    eps, r0, sigma = 1.8, 1.1, np.sqrt(0.02)

    # parameters for kernel and regression
    reg = 1e-5
    sig = 3

    def Efun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_energy(X, params[0], params[1], params[2])

    def gradfun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_gradient(X, params[0], params[1], params[2])

    featureCalculator = bob_features()
    comparator = gaussComparator(sigma=sig)
    krr = krr_class(comparator=comparator, featureCalculator=featureCalculator)

    optim = globalOptim(Efun,
                        gradfun,
                        krr,
                        Natoms=Natoms,
                        dmax=2.5,
                        Niter=200,
                        Nstag=400,
                        sigma=1,
                        maxIterLocal=3)
    optim.runOptimizer()
    X = optim.Xsaved[:Ndata]

    G, I = featureCalculator.get_featureMat(X)

    E = np.zeros(Ndata)
    F = np.zeros((Ndata, 2 * Natoms))
    for i in range(Ndata):
        E[i], grad = doubleLJ(X[i], eps, r0, sigma)
        F[i] = -grad

    NpointsLC = 10
    Ndata_array = np.logspace(1, 3, NpointsLC).astype(int)
    FVU_energy_array = np.zeros(NpointsLC)
    FVU_force_array = np.zeros((NpointsLC, 2 * Natoms))
    for i in range(NpointsLC):
        N = int(3 / 2 * Ndata_array[i])
        Esub = E[:N]
        Fsub = F[:N]
        Xsub = X[:N]
        Gsub = G[:N]
        Isub = I[:N]
        FVU_energy_array[i], FVU_force_array[
            i, :] = krr.cross_validation_EandF(Esub,
                                               Fsub,
                                               Gsub,
                                               Isub,
                                               Xsub,
                                               reg=reg)
        print(FVU_energy_array[i])
        #print(FVU_force_array[i])

    np.savetxt('LC_bob_N7_search2.txt',
               np.c_[Ndata_array, FVU_energy_array, FVU_force_array],
               delimiter='\t')
    plt.figure(1)
    plt.loglog(Ndata_array, FVU_energy_array)
    plt.figure(2)
    plt.loglog(Ndata_array, FVU_force_array)
    plt.show()
示例#8
0
def mainTestLearning():
    def Efun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_energy(X, params[0], params[1], params[2])

    def gradfun(X):
        params = (1.8, 1.1, np.sqrt(0.02))
        return doubleLJ_gradient(X, params[0], params[1], params[2])

    sig = 3
    reg = 1e-5
    Natoms = 7
    comparator = gaussComparator(sigma=sig)
    featureCalculator = bob_features()
    krr = krr_class(comparator=comparator,
                    featureCalculator=featureCalculator,
                    reg=reg)

    Nruns = 5
    Nstructs = 1200
    optimData = np.zeros((Nruns, Nstructs, 2 * Natoms))
    for i in range(Nruns):
        print('Data creation: {}/{}'.format(i, Nruns))
        optim = globalOptim(Efun,
                            gradfun,
                            krr,
                            Natoms=Natoms,
                            dmax=2.5,
                            Niter=200,
                            Nstag=400,
                            sigma=1,
                            maxIterLocal=3)
        optim.runOptimizer()
        optimData[i, :] = optim.Xsaved[:Nstructs]
    print('optimData created with shape:', optimData.shape)
    optimData = np.array(optimData)

    Npoints = 1
    FVU_energy = np.zeros(Npoints)
    FVU_force = np.zeros((Npoints, 2 * Natoms))
    FVU_force_finite = np.zeros((Npoints, 2 * Natoms))
    Ntrain_array = np.logspace(3, 3, Npoints).astype(int)
    for i in range(Nruns):
        # Calculate all energies and forces for this run
        E = np.zeros(Nstructs)
        F = np.zeros((Nstructs, 2 * Natoms))
        for s in range(Nstructs):
            E[s], grad = doubleLJ(optimData[i, s], 1.8, 1.1, np.sqrt(0.02))
            F[s, :] = -grad
        # Calculate LC
        for n in range(Npoints):
            print('i:{}/{} , n:{}/{}'.format(i, Nruns, n, Npoints))
            Ntrain = Ntrain_array[n]
            Ntest = 10  # int(max(10, np.round(Ntrain/5)))
            posTrain = optimData[i, :Ntrain]
            posTest = optimData[i, Ntrain:Ntrain + Ntest]
            krr.fit(E[:Ntrain], positionMat=posTrain)
            Etest = E[Ntrain:Ntrain + Ntest]
            Ftest = F[Ntrain:Ntrain + Ntest]
            FVU_energy[n] += krr.get_MAE_energy(Etest, positionMat=posTest)
            FVU_force[n, :] += krr.get_MAE_force(Ftest, positionMat=posTest)

            Ffinite = np.array([finiteDiff(krr, pos) for pos in posTest])
            FVU_force_finite[n, :] += calcFVU_force(Ftest, Ffinite)
            if n == 9:
                print(np.c_[Ftest[0].T, Ffinite[0].T])
    FVU_energy /= Nruns
    FVU_force /= Nruns
    FVU_force_finite /= Nruns

    np.savetxt('LC_search_bob_N7.txt',
               np.c_[Ntrain_array, FVU_energy, FVU_force],
               delimiter='\t')
    plt.figure(1)
    plt.title('Energy FVU vs training size (from search)')
    plt.loglog(Ntrain_array, FVU_energy)
    plt.xlabel('# training data')
    plt.ylabel('FVU')
    plt.figure(2)
    plt.title('Force FVU vs training size (from search)')
    plt.loglog(Ntrain_array, FVU_force)
    plt.xlabel('# training data')
    plt.ylabel('FVU')
    plt.figure(3)
    plt.title('finite difference Force FVU vs training size (from search)')
    plt.loglog(Ntrain_array, FVU_force_finite)
    plt.xlabel('# training data')
    plt.ylabel('FVU')
    plt.show()
# parameters for kernel and regression
reg = 1e-7
sig = 1

X = getConstrainedStructureDataset(Ndata, Natoms)
Xtest = getConstrainedStructureDataset(Ntest, Natoms)

G, I = featureCalculator.get_featureMat(X)
Gtest, Itest = featureCalculator.get_featureMat(Xtest)

E, F = getEnergyAndForces(doubleLJ, X, Natoms, params)
Etest, Ftest = getEnergyAndForces(doubleLJ, Xtest, Natoms, params)

# Initialize KRR class
krr = krr_class(featureCalculator=bob_features,
                comparator=gaussComparator(sigma=sig),
                Ntrain=Ndata)

# Get distance matrix
distmat = np.sqrt(krr.comparator.getDistMat(G, G))

# Set entries larger than threshold to zero
distmatflat = np.matrix.flatten(distmat)
distmatflat = distmatflat[np.nonzero(distmatflat)]
nonzerodistmat = np.reshape(distmatflat, (Ndata, Ndata - 1))
distsort = np.sort(nonzerodistmat, axis=1)

bw = np.mean(np.mean(np.power(distsort[:, 0:10], 1 / 2), axis=1))
dens = sm.nonparametric.KDEMultivariate(data=G,
                                        var_type='c' * G.shape[1],
                                        bw=[bw] * G.shape[1])