From 16d72d28730fec83cf5133a0e6ad8877a5a3a638 Mon Sep 17 00:00:00 2001 From: Lingyue Yu Date: Fri, 10 Jul 2026 01:04:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20occupation=20in=20r2u=20(RHF/ROKS?= =?UTF-8?q?=E2=86=92UKS=20initial=20guess)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/initial_guess/mod.rs | 18 +++++++++++++++--- src/scf_io/mod.rs | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/initial_guess/mod.rs b/src/initial_guess/mod.rs index 042c7b093..953b4145d 100644 --- a/src/initial_guess/mod.rs +++ b/src/initial_guess/mod.rs @@ -452,9 +452,21 @@ pub fn initial_guess_from_raw( tmp_eigenvalues[i]=loaded_eigenvalues[ 0..num_state].to_vec(); }); - (0..spin_channel).into_iter().for_each(|i_spin| { - tmp_occupation[i_spin]=loaded_occupation[ 0..num_state].to_vec(); - }); + if loaded_occupation.len() == 2 * num_state { + // ROHF source: alpha and beta occupation stored separately + tmp_occupation[0] = loaded_occupation[0..num_state].to_vec(); + tmp_occupation[1] = loaded_occupation[num_state..2*num_state].to_vec(); + } else { + // RHF/RKS source: occupation is total (e.g. [2,2,0]), divide by 2 for per-spin + assert!(loaded_occupation.len() == num_state, + "r2u: unexpected occupation length {} (expected {} or {})", + loaded_occupation.len(), num_state, 2*num_state); + (0..spin_channel).into_iter().for_each(|i_spin| { + tmp_occupation[i_spin] = loaded_occupation[0..num_state].iter() + .map(|x| x * 0.5) + .collect(); + }); + } }, "u2r" => {}, _ => { diff --git a/src/scf_io/mod.rs b/src/scf_io/mod.rs index 5b97d7f41..e65ee2925 100644 --- a/src/scf_io/mod.rs +++ b/src/scf_io/mod.rs @@ -26,6 +26,7 @@ use pyo3::{pyclass}; use tensors::matrix_blas_lapack::{_dgemm, _dgemm_full, _dgemv, _dspgvx, _dsymm, _dsyrk, _hamiltonian_fast_solver, _power_rayon_for_symmetric_matrix, _dsyevd}; use tensors::{map_upper_to_full, BasicMatrix, ERIFold4, MathMatrix, MatrixFull, MatrixFullSlice, MatrixUpper, MatrixUpperSlice, RIFull, TensorSliceMut}; use tensors::{TensorOpt,TensorSlice}; +use tensors::BasicMatUp; use itertools::{Itertools}; use rayon::prelude::*; use std::collections::HashMap; -- Gitee From d4708b68da37f83ac0c9d8676d6443cec9448b80 Mon Sep 17 00:00:00 2001 From: Lingyue Yu Date: Fri, 10 Jul 2026 23:41:37 +0800 Subject: [PATCH 2/2] Remove duplicate import of BasicMatUp (already fixed in PR 177) --- src/scf_io/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scf_io/mod.rs b/src/scf_io/mod.rs index f54f9ef01..faeeeba76 100644 --- a/src/scf_io/mod.rs +++ b/src/scf_io/mod.rs @@ -26,7 +26,6 @@ use pyo3::{pyclass}; use tensors::matrix_blas_lapack::{_dgemm, _dgemm_full, _dgemv, _dspgvx, _dsymm, _dsyrk, _hamiltonian_fast_solver, _power_rayon_for_symmetric_matrix, _dsyevd}; use tensors::{map_upper_to_full, BasicMatrix, ERIFold4, MathMatrix, MatrixFull, MatrixFullSlice, MatrixUpper, MatrixUpperSlice, RIFull, TensorSliceMut}; use tensors::{TensorOpt,TensorSlice}; -use tensors::BasicMatUp; use itertools::{Itertools}; use rayon::prelude::*; use std::collections::HashMap; -- Gitee