internal static ElectronicStructureProblem DeserializeSingleProblem()

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;
        }