public static void Assign4DPointer(double[,,,] input, ref double ****pointer) { var temptemptemp = new double ***[input.GetLength(0)]; fixed(double ****px = &temptemptemp[0]) { pointer = px; } for (int i = 0; i < input.GetLength(0); i++) { var temptemp = new double **[input.GetLength(1)]; fixed(double ***px = &temptemp[0]) { pointer[i] = px; } for (int j = 0; j < input.GetLength(1); j++) { var temp = new double *[input.GetLength(2)]; fixed(double **py = &temp[0]) { pointer[i][j] = py; } for (int k = 0; k < input.GetLength(3); k++) { fixed(double *pz = &input[i, j, k, 0]) { pointer[i][j][k] = pz; } } } } }
/// <summary> /// Adds additional data for specific conversions /// </summary> /// <param name="data">The data to add</param> /// <returns>The index of the added data</returns> public int AddAdditionalData(double[][] data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } AdditionalDataHandle.Add(new ArrayData(data)); if (AdditionalDataPointer != IntPtr.Zero) { Marshal.FreeHGlobal(AdditionalDataPointer); } AdditionalDataPointer = Marshal.AllocHGlobal(AdditionalDataHandle.Count * sizeof(double **)); AdditionalData = (double ***)AdditionalDataPointer; for (int i = 0; i < AdditionalDataHandle.Count; i++) { AdditionalData[i] = AdditionalDataHandle[i].Pointer; } return(AdditionalDataHandle.Count - 1); }
unsafe public static extern double *LinearFitClassificationMulti(double ***model, int nbCouches, int *nbNeurones, double *inputs, int inputsSize, int inputSize, double *outputs, int outputSize, int nbIter);
unsafe public static extern double MultiClassify(double ***model, double *inputs, int nbCouches, int *nbNeurones, int inputsSize);
public void ApplyMultiLayerPerceptor() { unsafe { double[] inputsRefCsharp = new double[_referenceObjects.Length * 2]; double[] outputsRefCsharp = new double[_referenceObjects.Length]; double[] inputsCsharp = new double[_fieldObjects.Length * 2]; for (int i = 0; i < _referenceObjects.Length; i++) { if (paramMode == ParameterMode.None) { inputsRefCsharp[i * 2] = _referenceObjects[i].position.x; inputsRefCsharp[i * 2 + 1] = _referenceObjects[i].position.z; } else if (paramMode == ParameterMode.Square) { inputsRefCsharp[i * 2] = Mathf.Pow(_referenceObjects[i].position.x, 2); inputsRefCsharp[i * 2 + 1] = Mathf.Pow(_referenceObjects[i].position.z, 2); } else if (paramMode == ParameterMode.Absolute) { inputsRefCsharp[i * 2] = Mathf.Abs(_referenceObjects[i].position.x); inputsRefCsharp[i * 2 + 1] = Mathf.Abs(_referenceObjects[i].position.z); } else if (paramMode == ParameterMode.Absolute) { inputsRefCsharp[i * 2] = Mathf.Abs(_referenceObjects[i].position.x); inputsRefCsharp[i * 2 + 1] = Mathf.Abs(_referenceObjects[i].position.z); } outputsRefCsharp[i] = _referenceObjects[i].position.y > 0 ? 1 : 0; } for (int i = 0; i < _fieldObjects.Length; i++) { if (paramMode == ParameterMode.None) { inputsCsharp[i * 2] = _fieldObjects[i].position.x; inputsCsharp[i * 2 + 1] = _fieldObjects[i].position.z; } else if (paramMode == ParameterMode.Square) { inputsCsharp[i * 2] = Mathf.Pow(_fieldObjects[i].position.x, 2); inputsCsharp[i * 2 + 1] = Mathf.Pow(_fieldObjects[i].position.z, 2); } else if (paramMode == ParameterMode.Absolute) { inputsCsharp[i * 2] = Mathf.Abs(_fieldObjects[i].position.x); inputsCsharp[i * 2 + 1] = Mathf.Abs(_fieldObjects[i].position.z); } else if (paramMode == ParameterMode.Test) { inputsCsharp[i * 2] = Mathf.Abs(_fieldObjects[i].position.x); inputsCsharp[i * 2 + 1] = Mathf.Abs(_fieldObjects[i].position.z); } } double *inputsRef = (double *)Marshal.UnsafeAddrOfPinnedArrayElement(inputsRefCsharp, 0); double *outputs = (double *)Marshal.UnsafeAddrOfPinnedArrayElement(outputsRefCsharp, 0); int * nbNeurones = (int *)Marshal.UnsafeAddrOfPinnedArrayElement(_nbNeuronesLayers, 0); double ***model = LinearCreateMLPModel(_nbNeuronesLayers.Length, nbNeurones, 2); LinearFitClassificationMulti(model, _nbNeuronesLayers.Length, nbNeurones, inputsRef, _referenceObjects.Length, 2, outputs, 1, _nbIteration); for (int i = 0; i < _fieldObjects.Length; i++) { double[] inputObject = new double[2]; inputObject[0] = inputsCsharp[i * 2]; inputObject[1] = inputsCsharp[i * 2 + 1]; double *inputs = (double *)Marshal.UnsafeAddrOfPinnedArrayElement(inputObject, 0); _fieldObjects[i].position = new Vector3(_fieldObjects[i].position.x, (float)MultiClassify(model, inputs, _nbNeuronesLayers.Length, nbNeurones, 2), _fieldObjects[i].position.z); } } }