1 | using System;
|
---|
2 | using System.IO;
|
---|
3 | using System.IO.Compression;
|
---|
4 | using System.Runtime.InteropServices;
|
---|
5 |
|
---|
6 | namespace 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 | }
|
---|