Ejemplo n.º 1
0
        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;
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
 unsafe public static extern double *LinearFitClassificationMulti(double ***model, int nbCouches, int *nbNeurones, double *inputs, int inputsSize, int inputSize, double *outputs, int outputSize, int nbIter);
Ejemplo n.º 4
0
 unsafe public static extern double MultiClassify(double ***model, double *inputs, int nbCouches, int *nbNeurones, int inputsSize);
Ejemplo n.º 5
0
    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);
            }
        }
    }