예제 #1
0
        public Simplex(Tuple <int, Vector <double> >[] edges, RiemannianSpace ambiantSpace) : base(edges)
        {
            var directionalVectors = new List <Vector <double> >();

            foreach (var item in edges.Skip(1))
            {
                directionalVectors.Add(item.Item2 - BasePoint);
            }

            DirectionalVectors = directionalVectors.ToArray();

            DimAmbiantSpace = BasePoint.Count();

            Parametrization chart = x => {
                var dir = Matrix <double> .Build.DenseOfColumnVectors(DirectionalVectors);

                return(dir * x + BasePoint);
            };

            PushForward pushForward = x => {
                return(Matrix <double> .Build.DenseOfColumnVectors(DirectionalVectors));
            };

            AmbiantSpace   = ambiantSpace;
            Trivialization = new LocalTrivialization(chart, pushForward, ambiantSpace);
        }
예제 #2
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);
        }