source: branches/3087_Ceres_Integration/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs @ 17844

Last change on this file since 17844 was 17844, checked in by bburlacu, 18 months ago

#3087: Implement NativeInterpreter and ParameterOptimizer classes. The ParameterOptimizer offers an interface to Ceres and its options and to the variable projection optimization method. Added unit tests.

File size: 5.6 KB
Line 
1using System;
2using System.IO;
3using System.IO.Compression;
4using System.Runtime.InteropServices;
5
6namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
7  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
8  public struct NativeInstruction {
9    public byte OpCode;
10    public ushort Arity;
11    public ushort Length;
12    public double Value;
13    public IntPtr Data;
14    public bool Optimize;
15  }
16
17  // proxy structure to pass information from Ceres back to the caller
18  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
19  public struct OptimizationSummary {
20    public double InitialCost; // value of the objective function before the optimization
21    public double FinalCost; // value of the objective function after the optimization
22    public int SuccessfulSteps; // number of minimizer iterations in which the step was accepted
23    public int UnsuccessfulSteps; // number of minimizer iterations in which the step was rejected
24    public int InnerIterationSteps; // number of times inner iterations were performed
25    public int ResidualEvaluations; // number of residual only evaluations
26    public int JacobianEvaluations; // number of Jacobian (and residual) evaluations
27  };
28
29  public enum MinimizerType : int {
30    LINE_SEARCH = 0,
31    TRUST_REGION = 1
32  }
33
34  public enum LinearSolverType : int {
35    DENSE_NORMAL_CHOLESKY = 0,
36    DENSE_QR = 1,
37    SPARSE_NORMAL_CHOLESKY = 2,
38    DENSE_SCHUR = 3,
39    SPARSE_SCHUR = 4,
40    ITERATIVE_SCHUR = 5,
41    CGNR = 6
42  }
43
44  public enum TrustRegionStrategyType : int {
45    LEVENBERG_MARQUARDT = 0,
46    DOGLEG = 1
47  }
48
49  public enum DoglegType : int {
50    TRADITIONAL_DOGLEG = 0,
51    SUBSPACE_DOGLEG = 1
52  }
53
54  public enum LineSearchDirectionType : int {
55    STEEPEST_DESCENT = 0,
56    NONLINEAR_CONJUGATE_GRADIENT = 1,
57    LBFGS = 2,
58    BFSG = 3
59  }
60
61  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
62  public struct SolverOptions {
63    public int Iterations;
64    public int UseNonmonotonicSteps;
65    public int Minimizer; // type of minimizer (trust region or line search)
66    public int LinearSolver; // type of linear solver
67    public int TrustRegionStrategy; // levenberg-marquardt or dogleg
68    public int Dogleg; // type of dogleg (traditional or subspace)
69    public int LineSearchDirection; // line search direction type (BFGS, LBFGS, etc)
70    public int Algorithm;
71  };
72
73  public static class NativeWrapper {
74    private const string x86zip = "hl-native-interpreter-x86.zip";
75    private const string x64zip = "hl-native-interpreter-x64.zip";
76
77    private const string x86dll = "hl-native-interpreter-x86.dll";
78    private const string x64dll = "hl-native-interpreter-x64.dll";
79
80    private readonly static bool is64;
81
82    static NativeWrapper() {
83      is64 = Environment.Is64BitProcess;
84
85      //using (var zip = new FileStream(is64 ? x64zip : x86zip, FileMode.Open)) {
86      //  using (var archive = new ZipArchive(zip, ZipArchiveMode.Read)) {
87      //    foreach (var entry in archive.Entries) {
88      //      if (File.Exists(entry.Name)) {
89      //        File.Delete(entry.Name);
90      //      }
91      //    }
92      //    ZipFileExtensions.ExtractToDirectory(archive, Environment.CurrentDirectory);
93      //  }
94      //}
95    }
96
97    public static void GetValues(NativeInstruction[] code, int[] rows, double[] result, double[] target, SolverOptions options, ref OptimizationSummary summary) {
98      if (is64)
99        GetValues64(code, code.Length, rows, rows.Length, options, result, target, ref summary);
100      else
101        GetValues32(code, code.Length, rows, rows.Length, options, result, target, ref summary);
102    }
103
104    public static void GetValuesVarPro(NativeInstruction[] code, int[] termIndices, int[] rows, double[] coefficients,
105      double[] result, double[] target, SolverOptions options, ref OptimizationSummary summary) {
106      if (is64)
107        GetValuesVarPro64(code, code.Length, termIndices, termIndices.Length, rows, rows.Length, coefficients, options, result, target, ref summary);
108      else
109        GetValuesVarPro32(code, code.Length, termIndices, termIndices.Length, rows, rows.Length, coefficients, options, result, target, ref summary);
110    }
111
112    // x86
113    [DllImport(x86dll, EntryPoint = "GetValues", CallingConvention = CallingConvention.Cdecl)]
114    internal static extern void GetValues32([In, Out] NativeInstruction[] code, int len, int[] rows, int nRows, SolverOptions options, [In, Out] double[] result, double[] target, ref OptimizationSummary summary);
115
116    // x64
117    [DllImport(x64dll, EntryPoint = "GetValues", CallingConvention = CallingConvention.Cdecl)]
118    internal static extern void GetValues64([In, Out] NativeInstruction[] code, int len, int[] rows, int nRows, SolverOptions options, [In, Out] double[] result, double[] target, ref OptimizationSummary summary);
119
120    [DllImport(x86dll, EntryPoint = "GetValuesVarPro", CallingConvention = CallingConvention.Cdecl)]
121    internal static extern void GetValuesVarPro32([In, Out] NativeInstruction[] code, int len, int[] termIndices, int nTerms, int[] rows, int nRows, [In, Out] double[] coefficients, SolverOptions options, [In, Out] double[] result, double[] target, ref OptimizationSummary summary);
122
123    [DllImport(x64dll, EntryPoint = "GetValuesVarPro", CallingConvention = CallingConvention.Cdecl)]
124    internal static extern void GetValuesVarPro64([In, Out] NativeInstruction[] code, int len, int[] termIndices, int nTerms, int[] rows, int nRows, [In, Out] double[] coefficients, SolverOptions options, [In, Out] double[] result, double[] target, ref OptimizationSummary summary);
125  }
126}
Note: See TracBrowser for help on using the repository browser.