Ejemplo n.º 1
0
def amp_jobs(fdata, job, nsets, HL, E_conv, Lgraph, ival_set):
    total_images = ase.io.read(fdata, index=':')
    images_sets = Images(total_images, nsets)
    if re.search("pr", job):
        y = []
        for mol in total_images:
            y.append(mol.get_potential_energy())
        mplot_nvector([], y, fdata.split(".")[0], 'sample', 'E(eV)')
    ### job == training
    elif re.search("tr", job):
        images = images_sets.get_training_images()
        print("data training:total sets %d/%d" %
              (len(images), len(total_images)))
        exe_train_images(images, HL, E_conv)
        ### job == training & test - test can be done at once by commenting one line below
        amp_pes = "amp.amp"
        images = images_sets.get_test_images()
        title, suptitle = get_title(job, fdata, HL, E_conv, len(total_images),
                                    len(images))
        print("data test:total sets %d/%d" % (len(images), len(total_images)))
        exe_test_images(job, images, amp_pes, title, suptitle, Lgraph)
    ### only test
    elif re.search("te", job):
        amp_pes = "amp.amp"
        images = images_sets.get_test_images()
        title, suptitle = get_title(job, fdata, HL, E_conv, len(total_images),
                                    len(images))
        print("data test:total sets %d/%d" % (len(images), len(total_images)))
        exe_test_images(job, images, amp_pes, title, suptitle, Lgraph)
    ### job == validation
    elif re.search("va", job):
        print("validation test")
        print("data images are diveded into %d sets" % nsets)
        ### training set scan for valicaiotn
        #for i in [0,1,2,3]:   #range(nsets-1):    # last one [4] is kept for test
        # ival_set should be lower than nsets-1

        if ival_set is None:
            print(
                "index for validation set is reguired with '-i num' between 0 ~ {}"
                .format(nsets - 2))
            sys.exit(0)
        else:
            if ival_set >= nsets - 1:
                print("validation set index should be lower than {}".format(
                    nsets - 1))
                print("refer to py_ai_ini.py -j amp")
                sys.exit(3)
        fname = fdata.split(".")[0]
        hl = ''.join(str(x) for x in HL)
        fname += hl + str(E_conv) + ".val"
        #for i in range(nsets-1): # last one is kept for test, this is not working at the moment
        for i in [ival_set]:
            ### training
            images, img_valid = images_sets.get_val_train_images(i)
            print("num images: training {} validation {}".format(
                len(images), len(img_valid)))
            exe_train_images(images, HL, E_conv)
            ### validating
            amp_pes = "amp.amp"
            title, suptitle = get_title(job, fdata, HL, E_conv,
                                        len(total_images), len(images))
            rmserr = exe_test_images(job,
                                     img_valid,
                                     amp_pes,
                                     title,
                                     suptitle,
                                     Lgraph,
                                     val_id=i)
            with open(fname, "a") as f:
                f.write("{}: {:5.3f}\n".format(ival_set, rmserr))
            # check divided image sets: plot 2d here
            if False:
                x_draw = []
                y_draw = []
                for n, atoms in enumerate(images):
                    pot = atoms.get_potential_energy()
                    x_draw.append(n)
                    y_draw.append(pot)
                mplot_vector_two(x_draw,
                                 y_draw,
                                 Title="Extracted Training Set %d" % i,
                                 Xtitle="serial number",
                                 Ytitle="Epot")

    elif re.search('md', job):
        #print("nsets is used for start geometry")
        if not nsets:
            atoms = ase.io.read(fdata, index='0')
        else:
            atoms = ase.io.read(fdata, index=nsets)
        run_md(atoms)
    return
Ejemplo n.º 2
0
def amp_jobs(fdata, job, ndata, HL, E_conv):
    total_images = ase.io.read(fdata, index=':')
    images_c = Images(total_images)
    ### job == training
    if re.search("tr", job):
        if not ndata:
            images = images_c.total_images
            print("Start training using all the data %d" % len(images))
        else:
            images = images_c.get_training_images(ndata)
            print("data training:total sets %d/%d" %
                  (len(images), len(total_images)))
        exe_train_images(images, HL, E_conv)
    ### job == test
    elif re.search("te", job):
        amp_pes = "amp.amp"
        images = images_c.get_test_images(ndata)
        title, suptitle = get_title(job, fdata, HL, E_conv, len(total_images),
                                    len(images))
        print("data test:total sets %d/%d" % (len(images), len(total_images)))
        exe_test_images(job, images, amp_pes, title, suptitle)
    ### job == validation
    elif re.search("va", job):
        print("validation test")
        if not ndata:
            ndata = 5
            print("data images are diveded into %d sets" % ndata)
        ### training set scan for valicaiotn
        for i in range(ndata - 1):  # last one is kept for test
            ### training
            images, img_valid = images_c.get_val_train_images(ndata, i)
            print("num images: training {} validation {}".format(
                len(images), len(img_valid)))
            exe_train_images(images, HL, E_conv)
            ### validating
            amp_pes = "amp.amp"
            title, suptitle = get_title(job, fdata, HL, E_conv,
                                        len(total_images), len(images))
            #exe_test_images(job, img_valid, amp_pes, title, suptitle, val_id=i)
            ### Alternative Ways
            calc = Amp.load(amp_pes)
            y = []
            y_bar = []
            for mol in img_valid:
                y.append(mol.get_potential_energy())
                mol.set_calculator(calc)
                y_bar.append(mol.get_potential_energy())
            '''
            err = rmse(y, y_bar)
            print("in job {}-{}: validation error is {}".format(job,i,err)) 
            '''
            # check divided image sets: plot 2d here
            if False:
                x_draw = []
                y_draw = []
                for n, atoms in enumerate(images):
                    pot = atoms.get_potential_energy()
                    x_draw.append(n)
                    y_draw.append(pot)
                mplot_vector_two(x_draw,
                                 y_draw,
                                 Title="Extracted Training Set %d" % i,
                                 Xtitle="serial number",
                                 Ytitle="Epot")

    elif re.search('md', job):
        print("ndata is used for start geometry")
        if not ndata:
            atoms = ase.io.read(fdata, index='0')
        else:
            atoms = ase.io.read(fdata, index=ndata)
        run_md(atoms)
    return