in Chemistry/src/DataModel/Fermion/Wavefunction/WavefunctionExtensions.cs [22:75]
public static UnitaryCCWavefunction<SpinOrbital> CreateAllUCCSDSingletExcitations(this IEnumerable<SpinOrbital> occupiedSpinOrbitals, int nOrbitals)
{
// Create list of unoccupied spin-orbitals
var virtualOrbitals = Enumerable.Range(0, nOrbitals).Select(x => new SpinOrbital(x, Spin.u))
.Concat(Enumerable.Range(0, nOrbitals).Select(x => new SpinOrbital(x, Spin.d)))
.Except(occupiedSpinOrbitals);
var outputState = new UnitaryCCWavefunction<SpinOrbital>()
{
Reference = new SingleCFWavefunction<SpinOrbital>(occupiedSpinOrbitals)
};
// Populate singles excitations.
foreach (var occupiedIdx in occupiedSpinOrbitals)
{
foreach (var virtualIdx in virtualOrbitals)
{
if (occupiedIdx.Spin == virtualIdx.Spin)
{
var term = new IndexOrderedSequence<SpinOrbital>(new[] { virtualIdx, occupiedIdx }.ToLadderSequence());
outputState.Set(term, new Complex());
}
}
}
// Populate doubles excitations.
foreach (var occupiedIdx0 in occupiedSpinOrbitals)
{
foreach (var occupiedIdx1 in occupiedSpinOrbitals)
{
// Only loop over distinct pairs of occupied spin orbitals
if (occupiedIdx0.ToInt() < occupiedIdx1.ToInt())
{
foreach (var virtualIdx0 in virtualOrbitals)
{
foreach (var virtualIdx1 in virtualOrbitals)
{
// Only loop over distinct pairs of occupied spin orbitals
if (virtualIdx0.ToInt() < virtualIdx1.ToInt())
{
if (virtualIdx0.Spin + virtualIdx1.Spin == occupiedIdx0.Spin + occupiedIdx1.Spin)
{
var term = new IndexOrderedSequence<SpinOrbital>(new[] { virtualIdx1, virtualIdx0, occupiedIdx1, occupiedIdx0 }.ToLadderSequence());
outputState.Set(term, new Complex());
}
}
}
}
}
}
}
return outputState;
}