def test_diagonalize_returns_orbital_energy_eigenvalues_and_orbital_coefficients(self):
     LinearAlgebra.create_transformation_matrix = Mock(return_value=np.matrix([[-0.9541, 0.5871], [0.9541, 0.5871]]))
     mock_orbital_overlap = MagicMock()
     linear_algebra = LinearAlgebra(mock_orbital_overlap)
     core_hamiltonian = np.matrix([[-2.6527, -1.3472], [-1.3472, -1.7318]])
     orbital_energies, orbital_coefficients = linear_algebra.diagonalize(core_hamiltonian)
     testing.assert_array_almost_equal(orbital_coefficients, np.matrix([[0.9291, 0.6259], [0.1398, -1.1115]]), decimal=3)
     testing.assert_array_almost_equal(orbital_energies, np.array([-2.6742, -1.3043]), decimal=4)
class HartreeFock:

    def __init__(self, nuclei_array, basis_set_array, electrons, symmetry, processes):
        self.scf_method = None
        self.nuclei_array = nuclei_array
        self.basis_set_array = basis_set_array
        self.electrons = electrons
        self.symmetry = symmetry
        self.orbital_overlap = OrbitalOverlapMatrix(basis_set_array).create()
        self.kinetic_energy = KineticEnergyMatrix(basis_set_array).create()
        self.nuclear_attraction = NuclearAttractionMatrix(basis_set_array, nuclei_array).create()
        self.core_hamiltonian = self.kinetic_energy + self.nuclear_attraction
        self.linear_algebra = LinearAlgebra(self.orbital_overlap)
        print('\n*************************************************************************************************')
        print('\nMATRICES\n')
        print('\nORBITAL OVERLAP MATRIX\n{}'.format(self.orbital_overlap))
        print('\nKINETIC ENERGY MATRIX\n{}'.format(self.kinetic_energy))
        print('\nNUCLEAR POTENTIAL ENERGY MATRIX\n{}'.format(self.nuclear_attraction))
        print('\nCORE HAMILTONIAN MATRIX\n{}'.format(self.core_hamiltonian))
        print('\nBEGIN TWO ELECTRON REPULSION CALCULATION')
        start_repulsion = time.clock()
        self.repulsion = TwoElectronRepulsionMatrixOS(self.basis_set_array, self.symmetry, processes).create()
        print('TIME TAKEN: ' + str(time.clock() - start_repulsion) + 's\n')
        print('\n*************************************************************************************************')

    def initial_guess(self):
        initial_orbital_energies, initial_orbital_coefficients = self.linear_algebra.diagonalize(self.core_hamiltonian)
        return initial_orbital_coefficients