From 2c312cfc579690f4a17ab2a27571a770e446e99a Mon Sep 17 00:00:00 2001 From: Abdallah Ammar Date: Fri, 30 Aug 2024 20:15:39 +0200 Subject: [PATCH] v0 of FeatherBench --- src/LR/ppLR.f90 | 61 +++++++++--------- test/export_tobench.py | 26 ++++++++ tests/create_database.py | 35 +++++++++-- tests/feather_bench.py | 130 ++++++++++++++++++++++----------------- tests/inp/methods.RHF | 6 +- tests/lunch_bench.py | 2 +- tests/molecule.py | 63 ++++++++++++++++--- 7 files changed, 223 insertions(+), 100 deletions(-) create mode 100644 test/export_tobench.py diff --git a/src/LR/ppLR.f90 b/src/LR/ppLR.f90 index 64d533c..582e28f 100644 --- a/src/LR/ppLR.f90 +++ b/src/LR/ppLR.f90 @@ -72,38 +72,43 @@ subroutine ppLR(TDA, nOO, nVV, Bpp, Cpp, Dpp, Om1, X1, Y1, Om2, X2, Y2, EcRPA) M( 1:nVV ,nVV+1:nOO+nVV) = - Bpp(1:nVV,1:nOO) M(nVV+1:nOO+nVV, 1:nVV) = + transpose(Bpp(1:nVV,1:nOO)) - !! Diagonalize the p-p matrix - !if(nOO+nVV > 0) call diagonalize_general_matrix(nOO+nVV, M, Om, Z) - !! Split the various quantities in p-p and h-h parts - !call sort_ppRPA(nOO, nVV, Om, Z, Om1, X1, Y1, Om2, X2, Y2) + if((nOO .eq. 0) .or. (nVV .eq. 0)) then + ! Diagonalize the p-p matrix + if(nOO+nVV > 0) call diagonalize_general_matrix(nOO+nVV, M, Om, Z) + ! Split the various quantities in p-p and h-h parts + call sort_ppRPA(nOO, nVV, Om, Z, Om1, X1, Y1, Om2, X2, Y2) - thr_d = 1d-6 ! to determine if diagonal elements of L.T x R are close enouph to 1 - thr_nd = 1d-6 ! to determine if non-diagonal elements of L.T x R are close enouph to 1 - thr_deg = 1d-8 ! to determine if two eigenvectors are degenerate or not - imp_bio = .True. ! impose bi-orthogonality - verbose = .False. - call diagonalize_nonsym_matrix(N, M, Z, Om, thr_d, thr_nd, thr_deg, imp_bio, verbose) + else - do i = 1, nOO - Om2(i) = Om(i) - do j = 1, nVV - X2(j,i) = Z(j,i) - enddo - do j = 1, nOO - Y2(j,i) = Z(nVV+j,i) - enddo - enddo + thr_d = 1d-6 ! to determine if diagonal elements of L.T x R are close enouph to 1 + thr_nd = 1d-6 ! to determine if non-diagonal elements of L.T x R are close enouph to 1 + thr_deg = 1d-8 ! to determine if two eigenvectors are degenerate or not + imp_bio = .True. ! impose bi-orthogonality + verbose = .False. + call diagonalize_nonsym_matrix(N, M, Z, Om, thr_d, thr_nd, thr_deg, imp_bio, verbose) + + do i = 1, nOO + Om2(i) = Om(i) + do j = 1, nVV + X2(j,i) = Z(j,i) + enddo + do j = 1, nOO + Y2(j,i) = Z(nVV+j,i) + enddo + enddo + + do i = 1, nVV + Om1(i) = Om(nOO+i) + do j = 1, nVV + X1(j,i) = M(j,nOO+i) + enddo + do j = 1, nOO + Y1(j,i) = M(nVV+j,nOO+i) + enddo + enddo - do i = 1, nVV - Om1(i) = Om(nOO+i) - do j = 1, nVV - X1(j,i) = M(j,nOO+i) - enddo - do j = 1, nOO - Y1(j,i) = M(nVV+j,nOO+i) - enddo - enddo + endif end if diff --git a/test/export_tobench.py b/test/export_tobench.py new file mode 100644 index 0000000..526716b --- /dev/null +++ b/test/export_tobench.py @@ -0,0 +1,26 @@ + +import sys + + +def read_quantities_from_file(filename): + quantities = {} + + with open(filename, 'r') as file: + lines = file.readlines() + for i in range(0, len(lines), 2): + # Remove any leading or trailing whitespace/newline characters + quantity_name = lines[i].strip() + quantity_value = float(lines[i+1].strip()) + quantities[quantity_name] = quantity_value + + return quantities + +def print_quantities(quantities): + for key, value in quantities.items(): + print(f'"{key}": {value},') + +filename = sys.argv[1] + +quantities = read_quantities_from_file(filename) +print_quantities(quantities) + diff --git a/tests/create_database.py b/tests/create_database.py index 59cdee2..14ed3f6 100644 --- a/tests/create_database.py +++ b/tests/create_database.py @@ -1,12 +1,39 @@ -import sqlite3 +import argparse from molecule import save_molecules_to_json, load_molecules_from_json -from molecule import create_database, add_molecule_to_db +from molecule import create_database, add_molecule_to_db, remove_database from feather_bench import FeatherBench +parser = argparse.ArgumentParser(description="Benchmark Data Sets") + +parser.add_argument( + '-s', '--set_type', + choices=['light', 'medium', 'heavy'], + default='light', + help="Specify the type of data set: light (default), medium, or heavy." +) + + +args = parser.parse_args() + +if args.set_type == 'light': + bench = 'FeatherBench' + bench_title = "\n\nSelected Light Benchmark: {}\n\n".format(bench) +elif args.set_type == 'medium': + bench = 'BalanceBench' + bench_title = "\n\nSelected Medium Benchmark: {}\n\n".format(bench) +elif args.set_type == 'heavy': + bench = 'TitanBench' + bench_title = "\n\nSelected Heavy Benchmark: {}\n\n".format(bench) +else: + bench_title = "\n\nSelected Light Benchmark: {}\n\n".format(bench) + + +db_name = '{}.db'.format(bench) + # Save molecules to JSON #save_molecules_to_json(FeatherBench, 'FeatherBench.json') @@ -15,8 +42,8 @@ from feather_bench import FeatherBench #loaded_molecules = load_molecules_from_json('FeatherBench.json') #print(loaded_molecules) -# Create a database and add molecules -db_name = 'FeatherBench.db' +#remove_database(db_name) + create_database(db_name) for molecule in FeatherBench: add_molecule_to_db(db_name, molecule) diff --git a/tests/feather_bench.py b/tests/feather_bench.py index 1cfd07e..b6d8f26 100644 --- a/tests/feather_bench.py +++ b/tests/feather_bench.py @@ -11,43 +11,35 @@ He = Molecule( properties={ "properties_rhf":{ "6-31g": { - "RHF energy": -2.855160426884076, - "RHF HOMO energy": -0.914126628614305, - "RHF LUMO energy": 1.399859335225087, - "RHF dipole moment": 0.000000000000000, - "RMP2 correlation energy": -0.011200122910187, - "CCD correlation energy": -0.014985063408247, - "DCD correlation energy": -0.014985062907429, - "CCSD correlation energy": -0.015001711549550, - "drCCD correlation energy": -0.018845374502248, - "rCCD correlation energy": -0.016836324636164, - "crCCD correlation energy": 0.008524677369855, - "lCCD correlation energy": -0.008082420815100, - "pCCD correlation energy": -0.014985062519068, - "RCIS singlet excitation energy": 1.911193619935257, - "RCIS triplet excitation energy": 1.455852629402236, - "phRRPA correlation energy": -0.018845374129105, - "phRRPAx correlation energy": -0.015760565121283, - "crRRPA correlation energy": -0.008868581132405, - "ppRRPA correlation energy": -0.008082420815100, - "RG0F2 correlation energy": -0.011438430540374, - "RG0F2 HOMO energy": -0.882696116247871, - "RG0F2 LUMO energy": 1.383080391811630, - "evRGF2 correlation energy": -0.011448483158486, - "evRGF2 HOMO energy": -0.881327878713477, - "evRGF2 LUMO energy": 1.382458968133448, - "RG0W0 correlation energy": -0.019314094399756, - "RG0W0 HOMO energy": -0.870533880190454, - "RG0W0 LUMO energy": 1.377171287010956, - "evRGW correlation energy": -0.019335511771724, - "evRGW HOMO energy": -0.868460640957913, - "evRGW LUMO energy": 1.376287581471769, - "RG0T0pp correlation energy": -0.008082420815100, - "RG0T0pp HOMO energy": -0.914126628614305, - "RG0T0pp LUMO energy": 1.399859335225087, - "evRGTpp correlation energy": -0.008082420815100, - "evRGTpp HOMO energy": -0.914126628614305, - "evRGTpp LUMO energy": 1.399859335225087 + "RHF energy": -2.855160426154444, + "RHF HOMO energy": -0.914126628640145, + "RHF LUMO energy": 1.399859335255765, + "RHF dipole moment": 0.0, + "MP2 correlation energy": -0.011200122909934, + "CCD correlation energy": -0.014985063116, + "CCSD correlation energy": -0.015001711549092, + "drCCD correlation energy": -0.01884537385338, + "rCCD correlation energy": -0.016836322809386, + "crCCD correlation energy": 0.008524676641474, + "lCCD correlation energy": -0.00808242082105, + "CIS singlet excitation energy": 1.911193619991987, + "CIS triplet excitation energy": 1.455852629458543, + "phRPA correlation energy": -0.018845374128748, + "phRPAx correlation energy": -0.015760565120758, + "crRPA correlation energy": -0.008868581132249, + "ppRPA correlation energy": -0.008082420814972, + "G0F2 correlation energy": -0.011438430540104, + "G0F2 HOMO energy": -0.882696116274599, + "G0F2 LUMO energy": 1.383080391842522, + "G0W0 correlation energy": -0.019314094399372, + "G0W0 HOMO energy": -0.87053388021722, + "G0W0 LUMO energy": 1.377171287041735, + "evGW correlation energy": -0.019335511771337, + "evGW HOMO energy": -0.868460640984803, + "evGW LUMO energy": 1.376287581502582, + "G0T0pp correlation energy": -0.008161908540634, + "G0T0pp HOMO energy": -0.898869172597701, + "G0T0pp LUMO energy": 1.383928087417952, } }, "properties_uhf":{ @@ -58,8 +50,51 @@ He = Molecule( "6-31g": { } }, - "properties_rohf":{ - "6-31g": { + } +) + +# --- + +H2O = Molecule( + name="H2O", + multiplicity=1, + geometry=[ + {"element": "O", "x": 0.0000, "y": 0.0000, "z": 0.0000}, + {"element": "H", "x": 0.7571, "y": 0.0000, "z": 0.5861}, + {"element": "H", "x": -0.7571, "y": 0.0000, "z": 0.5861} + ], + properties={ + "properties_rhf":{ + "cc-pvdz": { + "RHF energy": -85.21935817501823, + "RHF HOMO energy": -0.493132793449897, + "RHF LUMO energy": 0.185534869842355, + "RHF dipole moment": 0.233813698748474, + "MP2 correlation energy": -0.203978216774657, + "CCD correlation energy": -0.212571260121257, + "CCSD correlation energy": -0.213302190845899, + "drCCD correlation energy": -0.231281853419338, + "rCCD correlation energy": -0.277238348710547, + "crCCD correlation energy": 0.18014617422324, + "lCCD correlation energy": -0.15128653432796, + "CIS singlet excitation energy": 0.338828950934568, + "CIS triplet excitation energy": 0.304873339484139, + "phRPA correlation energy": -0.231281866582435, + "phRPAx correlation energy": -0.310796738307943, + "crRPA correlation energy": -0.246289801609294, + "ppRPA correlation energy": -0.151286536255888, + "G0F2 correlation energy": -0.217807591229668, + "G0F2 HOMO energy": -0.404541451101377, + "G0F2 LUMO energy": 0.16650398400197, + "G0W0 correlation energy": -0.23853664665404, + "G0W0 HOMO energy": -0.446828623007469, + "G0W0 LUMO energy": 0.173026609033024, + "evGW correlation energy": -0.239414217281308, + "evGW HOMO energy": -0.443076613314424, + "evGW LUMO energy": 0.172691758111392, + "G0T0pp correlation energy": -0.156214864467344, + "G0T0pp HOMO energy": -0.452117482732615, + "G0T0pp LUMO energy": 0.16679206983464, } } } @@ -67,24 +102,9 @@ He = Molecule( # --- -#H2O = Molecule( -# name="H2O", -# multiplicity=1, -# geometry=[ -# {"element": "O", "x": 0.0000, "y": 0.0000, "z": 0.0000}, -# {"element": "H", "x": 0.7571, "y": 0.0000, "z": 0.5861}, -# {"element": "H", "x": -0.7571, "y": 0.0000, "z": 0.5861} -# ], -# properties={ -# "cc-pvdz": { -# } -#) - -# --- - FeatherBench = [ He, - #H2O + H2O ] diff --git a/tests/inp/methods.RHF b/tests/inp/methods.RHF index e315154..2ddb2bb 100644 --- a/tests/inp/methods.RHF +++ b/tests/inp/methods.RHF @@ -3,7 +3,7 @@ # MP2 MP3 T T # CCD pCCD DCD CCSD CCSD(T) - T T T T F + T F F T F # drCCD rCCD crCCD lCCD T T T T # CIS CIS(D) CID CISD FCI @@ -11,11 +11,11 @@ # phRPA phRPAx crRPA ppRPA T T T T # G0F2 evGF2 qsGF2 ufGF2 G0F3 evGF3 - T T F F F F + T F F F F F # G0W0 evGW qsGW SRG-qsGW ufG0W0 ufGW T T F F F F # G0T0pp evGTpp qsGTpp ufG0T0pp - T T F F + T F F F # G0T0eh evGTeh qsGTeh F F F # Rtest Utest Gtest diff --git a/tests/lunch_bench.py b/tests/lunch_bench.py index 69a6093..f9e52d7 100644 --- a/tests/lunch_bench.py +++ b/tests/lunch_bench.py @@ -181,7 +181,7 @@ class Quack_Job: if(diff <= THRESH): print_col(f" 🙂 {key}: ✔ī¸ ", "green") else: - print_col(f" ☚ī¸ {key}: ❌ {data_ref[key]} ≠ {data_new[key]}", "red") + print_col(f" ☚ī¸ {key}: ❌ {data_ref[key]} ≠ {data_new[key]}", "red") except FileNotFoundError: print_col(f"Error: The file '{filepath}' does not exist.", "red") sys.exist(1) diff --git a/tests/molecule.py b/tests/molecule.py index 147c53e..b5f33eb 100644 --- a/tests/molecule.py +++ b/tests/molecule.py @@ -1,7 +1,11 @@ +import os import json import sqlite3 +from utils import print_col + + class Molecule: def __init__(self, name, multiplicity, geometry, properties): self.name = name @@ -38,23 +42,64 @@ def load_molecules_from_json(filename): def create_database(db_name): - conn = sqlite3.connect(db_name) - cursor = conn.cursor() - cursor.execute('''CREATE TABLE IF NOT EXISTS molecules - (name TEXT, multiplicity INTEGER, geometry TEXT, properties TEXT)''') - conn.commit() - conn.close() + if os.path.exists(db_name): + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + # Check if the table already exists + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='molecules';") + table_exists = cursor.fetchone() + + if table_exists: + print_col(f"Database '{db_name}' already exists and table 'molecules' is already created.", "yellow") + else: + # Create the table if it does not exist + cursor.execute('''CREATE TABLE molecules + (name TEXT, multiplicity INTEGER, geometry TEXT, properties TEXT)''') + conn.commit() + print_col(f"Table 'molecules' created in existing database '{db_name}' successfully.", "green") + conn.close() + else: + # Create the database and table + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + cursor.execute('''CREATE TABLE molecules + (name TEXT, multiplicity INTEGER, geometry TEXT, properties TEXT)''') + conn.commit() + conn.close() + print_col(f"Database '{db_name}' created and table 'molecules' added successfully.", "green") def add_molecule_to_db(db_name, molecule): + conn = sqlite3.connect(db_name) cursor = conn.cursor() + + # Convert geometry and properties to JSON strings geometry_str = json.dumps(molecule.geometry) energies_str = json.dumps(molecule.properties) - cursor.execute("INSERT INTO molecules VALUES (?, ?, ?, ?)", - (molecule.name, molecule.multiplicity, geometry_str, energies_str)) - conn.commit() + + # Check if the molecule already exists + cursor.execute("SELECT COUNT(*) FROM molecules WHERE name = ?", (molecule.name,)) + count = cursor.fetchone()[0] + + if count > 0: + print_col(f"Molecule '{molecule.name}' already exists in {db_name}.", "yellow") + else: + # Insert the molecule if it does not exist + cursor.execute("INSERT INTO molecules (name, multiplicity, geometry, properties) VALUES (?, ?, ?, ?)", + (molecule.name, molecule.multiplicity, geometry_str, energies_str)) + conn.commit() + print_col(f"'{molecule.name}' added to {db_name} successfully.", "green") + conn.close() + +def remove_database(db_name): + if os.path.exists(db_name): + os.remove(db_name) + print_col(f"Database '{db_name}' removed successfully.", "red") + else: + print_col(f"Database '{db_name}' does not exist.", "red") + def get_molecules_from_db(db_name): conn = sqlite3.connect(db_name) cursor = conn.cursor()