18#include "./base/base_uses.f90"
22 REAL(kind=
dp),
PARAMETER :: tolerance = 1.0e-12_dp
23 REAL(kind=
dp),
DIMENSION(4) :: candidate_eigenvalues, reference_eigenvalues
24 REAL(kind=
dp),
DIMENSION(4, 4) :: orbital_overlap
27 reference_eigenvalues = [-1.0_dp, -0.5_dp, 0.1_dp, 0.2_dp]
28 candidate_eigenvalues = reference_eigenvalues
32 orbital_overlap = 0.0_dp
33 orbital_overlap(1, 1) = 1.0_dp
34 orbital_overlap(2, 2) = 1.0_dp
35 orbital_overlap(3, 3) = 1.0_dp
36 orbital_overlap(4, 4) = 1.0_dp
38 orbital_overlap, reference_eigenvalues, candidate_eigenvalues, 2, &
39 10.0_dp, 0.1_dp, 0.2_dp, result)
40 CALL assert_close(result%loss_occupied_subspace, 0.0_dp,
"identical occupied subspace")
41 CALL assert_close(result%loss_virtual_subspace, 0.0_dp,
"identical virtual subspace")
42 CALL assert_close(result%empty_subspace_overlap, 1.0_dp,
"identical empty subspace")
43 CALL assert_close(result%loss_empty_subspace, 0.0_dp,
"identical empty-space loss")
44 CALL assert_close(result%virtual_subspace_similarity, 1.0_dp, &
45 "identical virtual-space similarity")
47 orbital_overlap = 0.0_dp
48 orbital_overlap(1, 2) = -1.0_dp
49 orbital_overlap(2, 1) = 1.0_dp
50 orbital_overlap(3, 4) = -1.0_dp
51 orbital_overlap(4, 3) = 1.0_dp
53 orbital_overlap, reference_eigenvalues, candidate_eigenvalues, 2, &
54 10.0_dp, 0.1_dp, 0.2_dp, result_rotated)
55 CALL assert_close(result_rotated%loss_occupied_subspace, result%loss_occupied_subspace, &
56 "occupied permutation/sign invariance")
57 CALL assert_close(result_rotated%loss_virtual_subspace, result%loss_virtual_subspace, &
58 "virtual permutation/sign invariance")
61 orbital_overlap = 0.0_dp
62 candidate_eigenvalues = reference_eigenvalues
64 orbital_overlap, reference_eigenvalues, candidate_eigenvalues, 2, &
65 10.0_dp, 0.1_dp, 0.2_dp, result)
66 CALL assert_close(result%loss_occupied_subspace, 1.0_dp,
"orthogonal occupied normalization")
67 CALL assert_close(result%loss_virtual_subspace, 1.0_dp,
"orthogonal virtual normalization")
68 CALL assert_close(result%empty_subspace_overlap, 0.0_dp,
"orthogonal empty subspace")
69 CALL assert_close(result%loss_empty_subspace, 1.0_dp,
"orthogonal empty-space loss")
70 CALL assert_close(result%virtual_subspace_similarity, 0.0_dp, &
71 "orthogonal virtual-space similarity")
74 candidate_eigenvalues(3:4) = candidate_eigenvalues(3:4) + 0.2_dp
76 orbital_overlap, reference_eigenvalues, candidate_eigenvalues, 2, &
77 10.0_dp, 0.1_dp, 0.2_dp, result)
78 CALL assert_close(result%loss_gap, 1.0_dp,
"gap normalization")
83 error stop
"virtual-orbital weight is not monotonic"
86 0.5_dp,
"cutoff midpoint")
97 REAL(kind=
dp),
INTENT(IN) :: actual, expected
98 CHARACTER(LEN=*),
INTENT(IN) :: description
100 IF (abs(actual - expected) > tolerance)
THEN
101 cpabort(trim(description))
Defines the basic variable types.
integer, parameter, public dp
Utilities for frontier-orbital basis optimization.
pure real(kind=dp) function, public smooth_frontier_orbital_weight(energy_from_lumo, cutoff, smoothing)
Return the smooth energy-window weight for a virtual orbital.
pure subroutine, public compute_frontier_orbital_loss_function(orbital_overlap, eigenvalues_reference, eigenvalues_candidate, number_occupied_orbitals, virtual_cutoff, virtual_smoothing, gap_scale, objective_result)
Compute the frontier-orbital loss function.
program optbas_frontier_orbitals_utils_unittest
Unit tests for the frontier-orbital objective.
subroutine assert_close(actual, expected, description)
...