internal void Dgeev(EigensystemJob jobLeft, EigensystemJob jobRight, int orderA,
                            double[] matrixA, int offsetA, int leadingDimA,
                            double[] eigvaluesReal, int offsetEigvaluesReal, double[] eigvaluesImaginary, int offsetEigvaluesImaginary,
                            double[] eigvectorsLeft, int offsetEigvectorsLeft, int leadingDimEigvectorsLeft,
                            double[] eigvectorsRight, int offsetEigvectorsRight, int leadingDimEigvectorsRight)
        {
            int info = DefaultInfo;

            QueryWorkspaceAndExecute((work, offsetWork, lWork) => Provider.Dgeev(jobLeft.Translate(), jobRight.Translate(),
                                                                                 orderA, ref matrixA, offsetA, leadingDimA,
                                                                                 ref eigvaluesReal, offsetEigvaluesReal, ref eigvaluesImaginary, offsetEigvaluesImaginary,
                                                                                 ref eigvectorsLeft, offsetEigvectorsLeft, leadingDimEigvectorsLeft,
                                                                                 ref eigvectorsRight, offsetEigvectorsRight, leadingDimEigvectorsRight,
                                                                                 ref work, offsetWork, lWork, ref info));

            if (info > 0)
            {
                throw new LapackException($"The QR algorithm failed to compute all the eigenvalues, and no eigenvectors have "
                                          + $"been computed. Elements {info+1:N} of the eigenvalues arrays (real and imaginary) contain eigenvalues which"
                                          + "have converged");
            }
            else if (info < 0)
            {
                ProcessNegativeInfo(info);
            }
        }
        internal void Dsyev(EigensystemJob job, StoredTriangle triangle, int orderA, double[] matrixA, int offsetA,
                            int leadingDimA, double[] eigenvalues, int offsetEigenvalues)
        {
            int info = DefaultInfo;

            QueryWorkspaceAndExecute((work, offsetWork, lWork) => Provider.Dsyev(
                                         job.Translate(), triangle.Translate(), orderA, ref matrixA, offsetA, leadingDimA, ref eigenvalues,
                                         offsetEigenvalues, ref work, offsetWork, lWork, ref info));

            if (info > 0)
            {
                throw new LapackException($"The algorithm failed to converge. There were {info} elements of an intermediate"
                                          + " tridiagonal form which did not converge to zero");
            }
            else if (info < 0)
            {
                ProcessNegativeInfo(info);
            }
        }