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.