void RegressionPredict(IntPtr model)
    {
        Debug.Log("Predict Model");

        foreach (var testSpheresTransform in testSpheresTransforms)
        {
            double [] inputs = new double[2];
            inputs[0] = testSpheresTransform.position.x;
            inputs[1] = testSpheresTransform.position.z;

            double result = VisualStudioLibWrapper.linear_model_predict_regression(model, inputs, inputs.Length);

            testSpheresTransform.position = new Vector3(
                testSpheresTransform.position.x,
                (float)result,
                testSpheresTransform.position.z
                );

            Debug.Log("Result Predict Model =  " + result);
        }

        //double[] inputs = input_array.ToArray();

        // Debug.Log("Taille tableau d'inputs  " + inputs.Length);
        //double result = VisualStudioLibWrapper.linear_model_predict_regression(model, inputs, inputs.Length);
        //Debug.Log("Result Predict Model =  " + result);
    }
    IntPtr CreateModel(int size)
    {
        Debug.Log("Create Model");
        var modelPtr = VisualStudioLibWrapper.linear_model_create(size);

        /*double[] model = new double[size+1];
         * Marshal.Copy(modelPtr, model, 0, size + 1);
         * Debug.Log(model[size]);*/

        return(modelPtr);
    }
Пример #3
0
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("With CLion DLL : ");
        Debug.Log(CLionLibWrapper.my_add(42, 51));
        Debug.Log(CLionLibWrapper.my_mul(2, 3));
        Debug.Log(CLionLibWrapper.my_test(10, 100, 100));


        Debug.Log("With Visual Studio DLL : ");
        Debug.Log(VisualStudioLibWrapper.my_add(42, 51));
        Debug.Log(VisualStudioLibWrapper.my_mul(2, 3));
    }
Пример #4
0
    public unsafe void TrainAndTest()
    {
        Debug.Log("Training and Testing");

        var    Y = new double[trainSpheresTransforms.Length];
        IntPtr model;

        var linear_inputs = new double[trainSpheresTransforms.Length * 2];

        for (int i = 0; i < trainSpheresTransforms.Length; i++)
        {
            var position = new Vector3();
            if (transfo != -1)
            {
                position = AppliTransfo(trainSpheresTransforms[i].position);
            }
            else
            {
                position = trainSpheresTransforms[i].position;
            }
            Y[i] = position.y;
            linear_inputs[i * 2]       = position.x;
            linear_inputs[(i * 2) + 1] = position.z;
        }

        // Create Model
        model = VisualStudioLibWrapper.linear_model_create(2);
        // Train Model
        VisualStudioLibWrapper.linear_model_train_regression(model, linear_inputs, trainSpheresTransforms.Length, 2, Y, Y.Length, 1000000, 0.01f);

        // For each testSphere : Predict
        foreach (var testSpheres in testSpheresTransforms)
        {
            var position = new Vector3();
            if (transfo != -1)
            {
                position = AppliTransfo(testSpheres.position);
            }
            else
            {
                position = testSpheres.position;
            }
            double[] input = { position.x, position.z };
            float    y     = (float)VisualStudioLibWrapper.linear_model_predict_regression(model, input, 2);
            testSpheres.position = new Vector3(
                position.x,
                y,
                position.z
                );
        }
    }
Пример #5
0
    public unsafe void TrainAndTest()
    {
        Debug.Log("Training and Testing");

        int count      = 0;
        int blue_count = 0;
        int red_count  = 0;

        // Créer dataset_inputs
        // Créer dataest_expected_outputs

        var    Y = new double[trainSpheresTransforms.Length];
        IntPtr model;

        var linear_inputs = new double[trainSpheresTransforms.Length * 2];

        for (int i = 0; i < trainSpheresTransforms.Length; i++)
        {
            Y[i] = trainSpheresTransforms[i].position.y > 0 ? 1 : -1;
            linear_inputs[i * 2]       = trainSpheresTransforms[i].position.x;
            linear_inputs[(i * 2) + 1] = trainSpheresTransforms[i].position.z;
        }

        var matrix_inputs = RBFEntriesD(0.5, Y);

        // Create Model
        model = VisualStudioLibWrapper.linear_model_create(trainSpheresTransforms.Length);
        // Train Model
        VisualStudioLibWrapper.linear_model_train_classification(model, matrix_inputs, trainSpheresTransforms.Length, 2, Y, Y.Length, 1000000, 0.01f);
        //double* model = {-0.4, 0.4, 0.2};
        //double[] model = new double [] {-0.4, 0.4, 0.2};

        // For each testSphere : Predict
        foreach (var testSpheres in testSpheresTransforms)
        {
            double[] input = { testSpheres.position.x, testSpheres.position.z };
            //double y = (float)(-model[1] / model[2] * testSpheresTransform.position.x - model[0] / model[2]);
            float y = (float)VisualStudioLibWrapper.linear_model_predict_classification(model, input, 2);
            testSpheres.position = new Vector3(
                testSpheres.position.x,
                y,
                testSpheres.position.z
                );
        }

        // Delete Model
        //VisualStudioLibWrapper.clearArray(model);
    }
    void RegressionTrain(IntPtr model)
    {
        Debug.Log("Train Model");
        List <double> inputs    = new List <double>();
        List <double> expecteds = new List <double>();

        foreach (var trainSpheresTransform in trainSpheresTransforms)
        {
            inputs.Add(trainSpheresTransform.position.x);
            inputs.Add(trainSpheresTransform.position.z);

            expecteds.Add(trainSpheresTransform.position.y);
        }

        VisualStudioLibWrapper.linear_model_train_regression(model, inputs.ToArray(), inputs.Count() / 2, 2, expecteds.ToArray());
    }
    void ClassificationTrainForXOR(IntPtr model)
    {
        Debug.Log("Train Model");
        List <double> inputs    = new List <double>();
        List <double> expecteds = new List <double>();

        foreach (var trainSpheresTransform in trainSpheresTransforms)
        {
            inputs.Add(trainSpheresTransform.position.x * trainSpheresTransform.position.z);
            inputs.Add(trainSpheresTransform.position.z * trainSpheresTransform.position.x);

            expecteds.Add(trainSpheresTransform.position.y >= 0 ? 1.0 : -1.0);
        }

        VisualStudioLibWrapper.linear_model_train_classification(model, inputs.ToArray(), inputs.Count() / 2, 2, expecteds.ToArray(), iterationCount, alpha);
    }
    void ClassificationPredict(IntPtr model)
    {
        Debug.Log("Predict Model");

        foreach (var testSpheresTransform in testSpheresTransforms)
        {
            double[] inputs = new double[2];
            inputs[0] = testSpheresTransform.position.x;
            inputs[1] = testSpheresTransform.position.z;

            double result = VisualStudioLibWrapper.linear_model_predict_classification(model, inputs, inputs.Length);

            testSpheresTransform.position = new Vector3(
                testSpheresTransform.position.x,
                (float)result,
                testSpheresTransform.position.z
                );

            Debug.Log("Result Predict Model =  " + result);
        }
    }
Пример #9
0
    public unsafe void RBFEntries()
    {
        double epsilon = 0.8;

        int count      = 0;
        int blue_count = 0;
        int red_count  = 0;

        // Créer dataset_inputs
        // Créer dataest_expected_outputs

        var    Y = new double[trainSpheresTransforms.Length];
        IntPtr model;

        var linear_inputs = new double[trainSpheresTransforms.Length * 2];

        for (int i = 0; i < trainSpheresTransforms.Length; i++)
        {
            Y[i] = trainSpheresTransforms[i].position.y > 0 ? 1 : -1;
            linear_inputs[i * 2]       = trainSpheresTransforms[i].position.x;
            linear_inputs[(i * 2) + 1] = trainSpheresTransforms[i].position.z;
        }

        var Ox = new double[trainSpheresTransforms.Length, trainSpheresTransforms.Length];
        //var Oz = new double[trainSpheresTransforms.Length,trainSpheresTransforms.Length];
        var multiY = new double[Y.Length, 1];

        for (int i = 0; i < trainSpheresTransforms.Length; i++)
        {
            for (int j = 0; j < trainSpheresTransforms.Length; j++)
            {
                Ox[i, j] = getRBFValue(epsilon, trainSpheresTransforms[i].position, trainSpheresTransforms[j].position);
                //Oz[i,j] = getRBFValue(epsilon, trainSpheresTransforms[i].position.z, trainSpheresTransforms[j].position.z);
            }
            multiY[i, 0] = Y[i];
        }

        var             l        = trainSpheresTransforms.Length;
        Matrix <double> OxMatrix = DenseMatrix.OfArray(Ox);

        for (int i = 0; i < l; i++)
        {
            string str = "";
            for (int j = 0; j < l; j++)
            {
                // Debug.Log(i + " " + j + ": " + Ox[i, j]);
                str += OxMatrix[i, j] + "/ ";
            }

            Debug.Log(str);
        }
        //Matrix<double> OzMatrix = DenseMatrix.OfArray(Oz);
        //Matrix<double> YMatrix = DenseMatrix.OfArray(Y);
        // Debug.Log(OxMatrix.RowCount);
        // Debug.Log(OxMatrix.ColumnCount);

        Matrix <double> OxInv = OxMatrix.Inverse();
        Matrix <double> mY    = DenseMatrix.OfArray(multiY);

        Matrix <double> resMatrix = OxInv.Multiply(mY);

        Debug.Log("row = " + resMatrix.RowCount);
        Debug.Log("col = " + resMatrix.ColumnCount);
        var inputs = new double[resMatrix.RowCount];

        for (int i = 0; i < resMatrix.RowCount; i++)
        {
            inputs[i] = resMatrix[i, 0];
        }

        model = VisualStudioLibWrapper.linear_model_create(2);
        // Train Model
        VisualStudioLibWrapper.linear_model_train_classification(model, inputs, 3, 1, Y, 3, 100000, 0.01f);

        double *mdl = (double *)model.ToPointer();

        for (int i = 0; i < 3; i++)
        {
            Debug.Log("model = " + mdl[i]);
        }

        var c1 = new Color(1, 2, 3);
        var c2 = new Color(3, 2, 1);

        foreach (var testSpheres in testSpheresTransforms)
        {
            double[] input = { testSpheres.position.x, testSpheres.position.z };
            //double y = (float)(-model[1] / model[2] * testSpheresTransform.position.x - model[0] / model[2]);
            float y = (float)VisualStudioLibWrapper.linear_model_predict_classification(model, input, 2);
            // testSpheres.position = new Vector3(
            //     testSpheres.position.x,
            //     y,
            //     testSpheres.position.z
            // );*
            testSpheres.GetComponent <MeshRenderer>().material.color = y >= 0 ? c1 : c2;
        }

        // IntPtr model = VisualStudioLibWrapper.linear_model_create(2);

        // VisualStudioLibWrapper.linear_model_train_classification(model, inputs, 3, 1, Y, 3, 100000, 0.01);
    }
Пример #10
0
    public unsafe void TrainAndTest()
    {
        Debug.Log("Training and Testing");

        var Y = new double[trainSpheresTransforms.Length];

        var inputs = new double[trainSpheresTransforms.Length * 2];

        for (int i = 0; i < trainSpheresTransforms.Length; i++)
        {
            /*if(trainSpheresTransforms[i].position.y == classSphere[2]) {
             *  Y[i] = classSphere[2];
             * } else if (trainSpheresTransforms[i].position.y == classSphere[1] ) {
             *  Y[i] = classSphere[1];
             * } else if (trainSpheresTransforms[i].position.y == classSphere[0] ) {
             *  Y[i] = classSphere[0];
             * }*/
            Y[i]                = trainSpheresTransforms[i].position.y >= 0 ? 1 : -1;
            inputs[i * 2]       = trainSpheresTransforms[i].position.x;
            inputs[(i * 2) + 1] = trainSpheresTransforms[i].position.z;
        }

        //int[] npl = {2, 1};
        IntPtr model = VisualStudioLibWrapper.create_mlp_model(npl, npl.Length);

        VisualStudioLibWrapper.mlp_model_train_classification(model, inputs, trainSpheresTransforms.Length, 2, Y, Y.Length, 1000000, 0.001f);

        // For each testSphere : Predict
        double max   = -2;
        int    idmax = 1;

        foreach (var testSpheres in testSpheresTransforms)
        {
            double[] input = { testSpheres.position.x, testSpheres.position.z };
            IntPtr   y     = VisualStudioLibWrapper.mlp_model_predict_classification(model, input, false);

            /*double[] res = new double[npl[npl.Length - 1]];
             * Marshal.Copy(res, 0, y, res.Length);*/
            double *r = (double *)y.ToPointer();

            // Debug.Log("size = " + npl[npl.Length - 1]);
            //Debug.Log(.GetLength(0));
            max = r[1];
            for (int i = 1; i < classSphere.Length + 1; i++)
            {
                //Debug.Log("r =" + r[i]);
                if (r[i] > max)
                {
                    max   = r[i];
                    idmax = i;
                }
            }
            if (classSphere.Length == 2)
            {
                testSpheres.position = new Vector3(
                    testSpheres.position.x,
                    (float)r[1],
                    testSpheres.position.z
                    );
            }
            else
            {
                testSpheres.position = new Vector3(
                    testSpheres.position.x,
                    (float)classSphere[idmax - 1],
                    testSpheres.position.z
                    );
            }
        }

        VisualStudioLibWrapper.clearArray(model);
    }
 void Delete(IntPtr model)
 {
     Debug.Log("Delete Model");
     VisualStudioLibWrapper.linear_model_delete(model);
 }