public void TestDefect2Dim()
        {
            var ambiantSpace  = Geometries.GetSpace(CurvatureType.NEGATIVE, 2);
            var randomSamples = Simplex.RandomSamples(NUMBER_SAMPLES, 2, ambiantSpace, true, MAX_NORM);
            var counter       = 0;

            foreach (var simplex in randomSamples)
            {
                foreach (var face in simplex.Faces)
                {
                    var normalVector = VariousHelpers.GetNormalVector(face);

                    foreach (var dirVector in face.DirectionalVectors)
                    {
                        var scalarProduct = dirVector.DotProduct(normalVector);

                        if (Math.Abs(scalarProduct) >= TOLERANCE)
                        {
                            throw new Exception($"Deviation to high for simplex number {counter}");
                        }
                    }
                    counter++;
                }
            }
        }
        public void TestAngleComputation2Dim()
        {
            var ambiantSpace  = Geometries.GetSpace(CurvatureType.FLAT, 2);
            var randomSamples = Simplex.RandomSamples(NUMBER_SAMPLES, 2, ambiantSpace, true, MAX_NORM);
            var counter       = 0;

            foreach (var simplex in randomSamples)
            {
                var faceA = simplex.Faces[0];
                var faceB = simplex.Faces[1];
                var faceC = simplex.Faces[2];

                var normVectorA = VariousHelpers.GetNormalVector(faceA);
                var normVectorB = VariousHelpers.GetNormalVector(faceB);
                var normVectorC = VariousHelpers.GetNormalVector(faceC);

                var alpha = Math.PI - VariousHelpers.Angle(normVectorB, normVectorC);
                var beta  = Math.PI - VariousHelpers.Angle(normVectorA, normVectorC);
                var gamma = Math.PI - VariousHelpers.Angle(normVectorA, normVectorB);

                if (Math.Abs(alpha + beta + gamma - Math.PI) >= TOLERANCE)
                {
                    throw new Exception($"Deviation to high for simplex number {counter}");
                }

                counter++;
            }
        }
Ejemplo n.º 3
0
        public static List <Simplex> RandomSamples(int nbSamples, int dim, RiemannianSpace ambiantSpace, bool zeroAmongEdges = true, double maxNorm = double.NaN)
        {
            var ret            = new List <Simplex>();
            var hyperbolicNorm = Math.Tanh(maxNorm);

            var nbEdgesPerSimplex = zeroAmongEdges ? dim : dim + 1;;
            var rndVectors        = VariousHelpers.RandomVectors(nbSamples * nbEdgesPerSimplex, dim, hyperbolicNorm);

            for (int i = 0; i < nbSamples; i++)
            {
                var edges = new Tuple <int, Vector <double> > [dim + 1];

                if (zeroAmongEdges)
                {
                    edges[0] = new Tuple <int, Vector <double> >(1, Vector <double> .Build.Dense(new double[dim]));
                    for (int j = 1; j <= dim; j++)
                    {
                        edges[j] = new Tuple <int, Vector <double> >(j + 1, rndVectors[i * (dim - 1) + j]);
                    }
                }
                else
                {
                    for (int j = 0; j <= dim; j++)
                    {
                        edges[j] = new Tuple <int, Vector <double> >(j + 1, rndVectors[i * dim + j]);
                    }
                }

                ret.Add(new Simplex(edges, ambiantSpace));
            }

            return(ret);
        }
        public void TestNormVectorComputation()
        {
            for (int iDim = 2; iDim < 10; iDim++)
            {
                var ambiantSpace  = Geometries.GetSpace(CurvatureType.FLAT, iDim);
                var randomSamples = Simplex.RandomSamples(NUMBER_SAMPLES, iDim, ambiantSpace, true, MAX_NORM);
                var counter       = 0;

                foreach (var simplex in randomSamples)
                {
                    var normalVectorSum = Vector <double> .Build.DenseOfArray(new double[iDim]);

                    foreach (var face in simplex.Faces)
                    {
                        var normalVector = VariousHelpers.GetNormalVector(face);
                        face.Integrate(0, true);
                        var volumeFace       = face.Volume;
                        var normNormalVector = normalVector.L2Norm();
                        normalVectorSum += volumeFace * normalVector;
                    }

                    if (Math.Abs(normalVectorSum.L2Norm()) >= TOLERANCE)
                    {
                        throw new Exception($"Deviation to high for simplex number {counter}");
                    }

                    counter++;
                }
            }
        }
Ejemplo n.º 5
0
        public void TestRelations(string relation)
        {
            var ambiantSpace   = Geometries.GetSpace(CurvatureType.FLAT, 2);
            var randomSamples  = Simplex.RandomSamples(NUMBER_SAMPLES, 2, ambiantSpace, true, MAX_NORM);
            var counter        = 0;
            var anlgeRelations = GetAnlgeRelations();

            foreach (var simplex in randomSamples)
            {
                foreach (var angleRelation in anlgeRelations)
                {
                    var faceA = simplex.Faces[0];
                    var faceB = simplex.Faces[1];
                    var faceC = simplex.Faces[2];

                    var normVectorA = VariousHelpers.GetNormalVector(faceA);
                    var normVectorB = VariousHelpers.GetNormalVector(faceB);
                    var normVectorC = VariousHelpers.GetNormalVector(faceC);

                    var alpha = Math.PI - VariousHelpers.Angle(normVectorB, normVectorC);
                    var beta  = Math.PI - VariousHelpers.Angle(normVectorA, normVectorC);
                    var gamma = Math.PI - VariousHelpers.Angle(normVectorA, normVectorB);

                    var value = angleRelation.Value(alpha, beta, gamma);

                    if (Math.Abs(value) >= TOLERANCE)
                    {
                        throw new Exception($"Deviation to high for simplex number {counter}");
                    }
                }

                counter++;
            }
        }
Ejemplo n.º 6
0
        protected double Vol(int meshSteps = 2500)
        {
            var _P = m_A; 
            var _V = m_B.Subtract(m_A);
            var _W = m_C.Subtract(m_A);
            var _U = m_D.Subtract(m_A);
            var span = Matrix<double>.Build.DenseOfColumnArrays(new List<double[]>() { _V, _W, _U});
            var detSpan = span.Determinant();            
            var dt = 1.0 / (double)meshSteps;
            var aSixth = 1.0 / 6.0;
            var fiveSixth = 5.0 / 6.0;


#if MULTITHREADS
            var nbThreads = 4;
            var vols = new double[nbThreads];

            var partition = VariousHelpers.GetPartition(meshSteps, nbThreads, 1.0 / 3.0);

            Parallel.For(0, nbThreads, ell =>
            {
#else
            var partition = new int[1][]{ new int[2] { 0, meshSteps } };
                var vols = new double[1];
                var ell = 0; 
#endif
                var volume = .0;
                double weight;
                var _Y = new double[3];

                for (int _v = partition[ell][0]; _v < partition[ell][1]; _v++)
                {
                    for (int _w = 0; _w < meshSteps - _v; _w++)
                    {
                        for (int _u = 0; _u < meshSteps - _w - _v; _u++)
                        {
                            weight = 1.0;

                            if (_u == meshSteps - _w - _v - 1)
                                weight = aSixth;
                            else if (_u == meshSteps - _w - _v - 2)
                                weight = fiveSixth;

                            for (int ekk = 0; ekk < 3; ekk++)
                                _Y[ekk] = _P[ekk] + (_v * _V[ekk] + _w * _W[ekk] + _u * _U[ekk]) * dt;

                            var yNormSq = _Y.Dot(_Y);
                            volume += weight * (1.0 / ((1.0 - yNormSq) * (1.0 - yNormSq) * (1.0 - yNormSq)));
                        }
                    }
                }

                vols[ell] = volume;
#if MULTITHREADS
            });
#endif

            return vols.Sum() * Math.Sqrt(detSpan * detSpan) * dt * dt * dt;
        }
Ejemplo n.º 7
0
        private static void Execute(Options options)
        {
            var path = "C:\\Users\\bergerd\\simplices.csv";

            var samples = ShearTriangle2D.RandomSamples(50000);

            //foreach(var sample in samples)
            //    VariousHelpers.SampleToFile(path, sample);


            Console.WriteLine(MessageAtStart(options));

            var randomSimplices = Simplex3D.RandomSamples(options.NumberSamples);
            var counter         = 0;
            var progressBar     = new ProgressBar();
            var nbThreads       = 7;
            var vols            = new double[nbThreads];

            if (File.Exists(path))
            {
                File.Delete(path);
            }

            var partition = VariousHelpers.GetPartition(options.NumberSamples, nbThreads);

            Parallel.For(0, nbThreads, ell =>
            {
                for (int i = partition[ell][0]; i < partition[ell][1]; i++)
                {
                    var stopWatch = new Stopwatch();
                    stopWatch.Start();
                    randomSimplices[i].Compute(3000);
                    stopWatch.Stop();
                    counter += 1;
                    Debug.WriteLine($"Successfully generated {counter} random samples.");

                    lock (_simplexLock)
                    {
                        progressBar.Report(counter, options.NumberSamples, stopWatch.Elapsed.TotalSeconds);
                        VariousHelpers.SampleToFile(path, randomSimplices[i]);
                    }
                }
            });


            /*
             * var sampleFactory = new SampleFactory(options.NumberSamples, options.Dimension, options.Integrate,
             *  options.MeshSteps, options.MaxNorm, options.ZeroAmongEdges, options.ComputeAngles, options.ComputeAnalytical);
             *
             * var progressBar = new ProgressBar();
             * sampleFactory.RaiseSampleCreatorEvent += progressBar.HandleSampleCreationEvent;
             *
             * Console.WriteLine(_computing);
             * (var randomSimplices, var hyperRandomComplexes) = sampleFactory.RandomSamples();
             */
        }
Ejemplo n.º 8
0
 public List <double[]> GetMesh(MeshKey meshKey)
 {
     if (_meshs.ContainsKey(meshKey))
     {
         return(_meshs[meshKey]);
     }
     else
     {
         _meshs[meshKey] = VariousHelpers.CreateMesh(meshKey.MeshSteps, meshKey.Dim);
         return(_meshs[meshKey]);
     }
 }
Ejemplo n.º 9
0
        public static List<Simplex3D> RandomSamples(int nbSamples, double maxNorm = 1.0)
        {
            var maxHyperbolicNorm = Math.Tanh(maxNorm);
            var rndVectors = VariousHelpers.RandomVectors(nbSamples * 4, 3, maxHyperbolicNorm);
            var ret = new List<Simplex3D>();

            for (int i = 0; i < nbSamples; i++)
            {
                ret.Add(new Simplex3D(rndVectors[4 * i].ToArray(), rndVectors[4 * i + 1].ToArray(), 
                    rndVectors[4 * i + 2].ToArray(), rndVectors[4 * i + 3].ToArray()));
            }

            return ret;
        }
        public void ComputeAngle()
        {
            var ind1 = Simplex1.Indices;
            var ind2 = Simplex2.Indices;

            var ind1_ext = ind2.Except(ind1).ToArray()[0];
            var vec1     = Simplex2.GetEdgeByIndex(ind1_ext);

            var ind2_ext = ind1.Except(ind2).ToArray()[0];
            var vec2     = Simplex1.GetEdgeByIndex(ind2_ext);

            var normal1 = VariousHelpers.GetNormalVector(Simplex1, vec1 - Simplex1.BasePoint);
            var normal2 = VariousHelpers.GetNormalVector(Simplex2, vec2 - Simplex2.BasePoint);

            var commonBasePoint = CommonBase.BasePoint;

            Angle = Math.PI - CommonBase.AmbiantSpace.Angle(commonBasePoint, normal1, normal2);
        }
        public void TestTriangles()
        {
            var randomSamples = ShearTriangle2D.RandomSamples(NUMBER_SAMPLES);
            var counter       = 0;
            var path          = "C:\\Users\\bergerd\\simplices.csv";

            foreach (var triangle in randomSamples)
            {
                var trigonometricRelations = TestFastSimplex3D.Relations();

                foreach (var trigonometricRelation in trigonometricRelations)
                {
                    var deviation = Math.Abs(trigonometricRelation(triangle) - .0);

                    if (deviation >= TOLERANCE)
                    {
                        throw new Exception($"Deviation too high for triangle number {counter}!");
                    }
                }

                VariousHelpers.SampleToFile(path, triangle);
            }
        }