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); }
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); }