in Chemistry/src/DataModel/Serialization/LegacyFormats/LiQuiD.cs [32:159]
internal static ElectronicStructureProblem DeserializeSingleProblem(string line)
{
var problem = new ElectronicStructureProblem()
{
Metadata = new Dictionary<string, object>()
};
var regexMiscellaneous = new Regex(@"((info=(?<info>[^\s]*)))");
var regexnuc = new Regex(@"nuc=(?<nuc>-?\s*\d*.\d*)");
var regexPQ = new Regex(@"(^|\s+)(?<p>\d+),(?<q>\d+)\D*=\s*(?<coeff>-?\s*\d*.\d*)e?(?<exponent>-?\d*)");
var regexPQRS = new Regex(@"(^|\s+)(?<p>\d+)\D+(?<q>\d+)\D+(?<r>\d+)\D+(?<s>\d+)\D*=\s*(?<coeff>-?\s*\d*.\d*)e?(?<exponent>-?\d*)");
double coulombRepulsion = 0.0;
var fileHIJTerms = new Dictionary<int[], double>(new Extensions.ArrayEqualityComparer<int>());
var fileHIJKLTerms = new Dictionary<int[], double>(new Extensions.ArrayEqualityComparer<int>());
var hamiltonian = new OrbitalIntegralHamiltonian();
var nOrbitals = 0L;
Match stringMisc = regexMiscellaneous.Match(line);
if (stringMisc.Success)
{
problem.Metadata["misc_info"] = stringMisc.Groups["info"].ToString();
}
Match stringnuc = regexnuc.Match(line);
if (stringnuc.Success)
{
coulombRepulsion = double.Parse(stringnuc.Groups["nuc"].ToString()).ToDoubleCoeff();
hamiltonian.Add(TermType.OrbitalIntegral.Identity, new OrbitalIntegral(), coulombRepulsion);
}
foreach (Match stringPQ in regexPQ.Matches(line))
{
if (stringPQ.Success)
{
var p = int.Parse(stringPQ.Groups["p"].ToString());
var q = int.Parse(stringPQ.Groups["q"].ToString());
var coeff = double.Parse(stringPQ.Groups["coeff"].ToString());
var exponentString = stringPQ.Groups["exponent"].ToString();
var exponent = 0.0;
if (exponentString != "")
{
exponent = double.Parse(stringPQ.Groups["exponent"].ToString());
}
nOrbitals = new long[] { nOrbitals, p + 1, q + 1 }.Max();
var orbitalIntegral = new OrbitalIntegral(new int[] { p, q }, coeff * (10.0).Pow(exponent));
var orbitalIntegralCanonical = orbitalIntegral.ToCanonicalForm();
if (fileHIJTerms.ContainsKey(orbitalIntegralCanonical.OrbitalIndices))
{
// Check consistency
if (fileHIJTerms[orbitalIntegralCanonical.OrbitalIndices] != orbitalIntegral.Coefficient)
{
// Consistency check failed.
throw new System.NotSupportedException(
$"fileHPQTerm Consistency check fail. " +
$"Orbital integral {orbitalIntegral} coefficient {orbitalIntegral.Coefficient}" +
$"does not match recorded {orbitalIntegralCanonical} coefficient {fileHIJTerms[orbitalIntegral.OrbitalIndices]}.");
}
else
{
// Consistency check passed.
}
}
else
{
fileHIJTerms.Add(orbitalIntegralCanonical.OrbitalIndices, orbitalIntegralCanonical.Coefficient);
}
}
}
foreach (Match stringPQRS in regexPQRS.Matches(line))
{
if (stringPQRS.Success)
{
var p = int.Parse(stringPQRS.Groups["p"].ToString());
var q = int.Parse(stringPQRS.Groups["q"].ToString());
var r = int.Parse(stringPQRS.Groups["r"].ToString());
var s = int.Parse(stringPQRS.Groups["s"].ToString());
var coeff = double.Parse(stringPQRS.Groups["coeff"].ToString());
var exponentString = stringPQRS.Groups["exponent"].ToString();
var exponent = 0.0;
if (exponentString != "")
{
exponent = double.Parse(stringPQRS.Groups["exponent"].ToString());
}
nOrbitals = new long[] { nOrbitals, p + 1, q + 1, r + 1, s + 1 }.Max();
var orbitalIntegral = new OrbitalIntegral(new int[] { p, q, r, s }, coeff * (10.0).Pow(exponent));
var orbitalIntegralCanonical = orbitalIntegral.ToCanonicalForm();
if (fileHIJKLTerms.ContainsKey(orbitalIntegralCanonical.OrbitalIndices))
{
// Check consistency
if (fileHIJKLTerms[orbitalIntegralCanonical.OrbitalIndices] != orbitalIntegral.Coefficient)
{
// Consistency check failed.
throw new System.NotSupportedException(
$"fileHPQRSTerm Consistency check fail. " +
$"Orbital integral {orbitalIntegral.OrbitalIndices} coefficient {orbitalIntegral.Coefficient}" +
$"does not match recorded {orbitalIntegralCanonical.OrbitalIndices} coefficient {fileHIJKLTerms[orbitalIntegral.OrbitalIndices]}.");
}
else
{
// Consistency check passed.
}
}
else
{
fileHIJKLTerms.Add(orbitalIntegralCanonical.OrbitalIndices, orbitalIntegralCanonical.Coefficient);
}
}
}
hamiltonian.Add(fileHIJTerms.Select(o => new OrbitalIntegral(o.Key, o.Value)).ToList());
hamiltonian.Add(fileHIJKLTerms.Select(o => new OrbitalIntegral(o.Key, o.Value)).ToList());
problem.OrbitalIntegralHamiltonian = hamiltonian;
problem.NOrbitals = System.Convert.ToInt32 ( nOrbitals);
problem.CoulombRepulsion = coulombRepulsion.WithUnits("hartree");
return problem;
}