/// <summary>
        /// Projects all term counts and word indexes from children to this instance or new instance
        /// </summary>
        /// <param name="newInstance">if set to <c>true</c> [new instance].</param>
        /// <returns></returns>
        public SpaceDocumentModel Flatten(Boolean newInstance = true)
        {
            SpaceDocumentModel output = null;

            List <SpaceDocumentModel> iteration = new List <SpaceDocumentModel>();


            if (!newInstance)
            {
                output = this;
            }
            else
            {
                output = new SpaceDocumentModel();
                iteration.Add(this);

                output.type   = type;
                output.name   = name;
                output.weight = weight;
            }


            List <List <String> > wordIndexes = new List <List <string> >();
            TokenDictionary       new_terms   = new TokenDictionary();

            iteration.AddRange(Children);

            while (iteration.Any())
            {
                List <SpaceDocumentModel> nextIteration = new List <SpaceDocumentModel>();

                for (int i = 0; i < iteration.Count; i++)
                {
                    if (SpaceModelConstructor.spaceSettings.DoMaintainWordIndex)
                    {
                        wordIndexes.Add(iteration[i].GetWordIndexed());
                    }
                    new_terms.MergeDictionary(iteration[i].terms);

                    if (iteration[i].terms.Count == 0)
                    {
                        nextIteration.AddRange(iteration[i].Children);
                    }
                }


                iteration = nextIteration;
            }

            List <Int32> wsum = new List <int>();

            for (int i2 = 0; i2 < wordIndexes.Count; i2++)
            {
                wsum.AddRange(new_terms.GetIDsByTokens(wordIndexes[i2]));
            }

            output.terms = new_terms;
            if (SpaceModelConstructor.spaceSettings.DoMaintainWordIndex)
            {
                output.Words = wsum.ToArray();
                length       = wsum.Count;
            }

            return(output);
            //output.terms.MergeDictionary(GetTerms(false, true));
        }