Problem beim Portieren eines Quelltexts mit CompactQuasiNewtonSolver



  • Hallo,

    ich habe bei Microsoft eine Bibliothek für numerische Optimierung gefunden. Dabei benötige ich den CompactQuasiNewtonSolver. Habe bei Microsoft einen Beispielcode in C# gefunden (der Code demonstriert die Minimierung einer 1D Sinus-Funktion):

    using System;
    using Microsoft.SolverFoundation.Solvers;
    
    namespace Microsoft.SolverFoundation.Samples
    {
        public class SineX
        {
    
            public static void Main(string[] args)
            {
    
                int NumberofVariables = 1;
                double[] StartingPoint = new double[] { -1 };
    
                CompactQuasiNewtonSolver solver = new CompactQuasiNewtonSolver(NumberofVariables);
                CompactQuasiNewtonSolverParams param = new CompactQuasiNewtonSolverParams();
                CompactQuasiNewtonSolutionQuality solutionQuality;
    
                solver.SetStartingPoint(StartingPoint);
                solver.GradientAndValueAtPoint = (GetGradientAndValueAtPoint)Sinx;
                solver.Minimize = true;
    
                param.Tolerance = 1e-8;
                solutionQuality = solver.Solve(param);
    
                Console.WriteLine("The minimium value for Sin(x) is " + solver.SolutionValue + ".");
            }
    
            private static double Sinx(double[] x, double[] gradient)
            {
                Sinx_gradient(gradient, x);
    
                return Sinx_value(x);
            }
    
            private static double Sinx_value(double[] x)
            {
                return (Math.Sin(x[0]));
            }
    
            private static void Sinx_gradient(double[] gradient, double[] x)
            {
                gradient[0] = Math.Cos(x[0]);
            }
    
        }
    }
    

    Diesen Code wollte ich jetzt nach C++/CLI portieren, da die Funktion, die zu optimieren ist, auch in C++ geschrieben ist und eine Portierung davon nach C# bestimmt aufwändiger wäre.

    Bisher habe ich den Code wiefolgt portiert:

    #include "stdafx.h"
    #include <math.h>
    
    using namespace System;
    using namespace Microsoft::SolverFoundation::Solvers;
    
    	void Sinx_gradient(cli::array<double>^ gradient, cli::array<double>^ x) {
          gradient[0] = cos(x[0]);
        }
    
    	double Sinx_value(cli::array<double>^ x) {
          return (sin(x[0]));
        }
    
    	double Sinx(cli::array<double>^ x, cli::array<double>^ gradient) {
          Sinx_gradient(gradient, x);
          return Sinx_value(x);
        }
    
    int main(array<System::String ^> ^args)
    {
    	int NumberofVariables = 1;
        cli::array<double>^ StartingPoint = gcnew cli::array<double>(NumberofVariables);
    	StartingPoint[0] =   -1;
    
        CompactQuasiNewtonSolver^ solver = gcnew CompactQuasiNewtonSolver(NumberofVariables);
        CompactQuasiNewtonSolverParams^ param = gcnew CompactQuasiNewtonSolverParams();
        CompactQuasiNewtonSolutionQuality solutionQuality;
    
        solver->SetStartingPoint(StartingPoint);
        solver->GradientAndValueAtPoint = (GetGradientAndValueAtPoint^)Sinx;
        solver->Minimize = true;
    
        param->Tolerance = 1e-8;
        solutionQuality = solver->Solve(param);
    
    	Console::WriteLine("The minimium value for Sin(x) is " + solver->SolutionValue + "." );
    
    }
    

    Der wird vom Compiler auch ohne zu meckern übersetzt, allerdings kommt es dann beim Aufruf von solutionQuality = solver->Solve(param); zu einer Exception:

    "Unbehandelte Ausnahme: System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."

    Ich kenne mich mit CLI-Code noch nicht so aus - wisst ihr vielleicht was ich falsch gemacht habe?

    Schonmal vielen Dank für eine Antwort im Vorraus,

    viele Grüße

    Andreas

    PS: Gibts einen besonderen Grund warum "V o r r a u s" durch V****** ersetzt wird?



  • Weil Voraus nicht "V o r r a u s" heißt.


Anmelden zum Antworten