/// <summary>
        /// Makes a subset of input dataset, containing only documents matching assigned IDS
        /// </summary>
        /// <param name="input">The input.</param>
        /// <param name="assignedIDs">The assigned i ds.</param>
        /// <param name="inverse">if set to <c>true</c> if will keep only given assigned IDS</param>
        public void FilterSpaceModel(List <String> assignedIDs, ILogBuilder log, Boolean applyToUnknownCategory = false)
        {
            foreach (KeyValuePair <string, List <string> > pair in LabelToDocumentLinks.GetAllRelationShipByName())
            {
                List <SpaceDocumentModel> toRemoveDocuments = new List <SpaceDocumentModel>();
                List <SpaceDocumentModel> toScanDocuments   = new List <SpaceDocumentModel>();
                Boolean doScan = true;
                if (pair.Key == SpaceLabel.UNKNOWN)
                {
                    doScan = applyToUnknownCategory;
                }

                if (doScan)
                {
                    toScanDocuments = LabelToDocumentLinks.GetAllLinkedB(pair.Key);

                    foreach (var vec in toScanDocuments)
                    {
                        if (!assignedIDs.Contains(vec.name))
                        {
                            toRemoveDocuments.Add(vec);
                        }
                    }

                    foreach (var vec in toRemoveDocuments)
                    {
                        documents.Remove(vec);
                        LabelToDocumentLinks.Remove(vec);
                    }

                    Double removal = toRemoveDocuments.Count.GetRatio(toScanDocuments.Count);
                    log.log("Vector count of [" + pair.Key + "] reduced to [" + removal.ToString("P2") + "] by document selection list");
                }
            }
        }
        public SpaceModel Clone()
        {
            SpaceModel output = new SpaceModel();

            output.terms               = terms.Clone();
            output.terms_known_label   = terms_known_label.Clone();
            output.terms_unknown_label = terms_unknown_label.Clone();
            output.documents           = documents.Clone <SpaceDocumentModel>(false);
            output.categories          = categories.Clone <SpaceCategoryModel>(false);
            output.topics              = topics.CloneTerm <SpaceTopic>();
            output.labels              = labels.CloneTerm <SpaceLabel>();

            foreach (var label in labels)
            {
                var linked = LabelToDocumentLinks.GetAllLinked(label);
                var label2 = output.labels.First(x => x.name == label.name);
                foreach (var l in linked)
                {
                    SpaceDocumentModel doc2 = output.documents.First(x => x.name == l.name);

                    output.LabelToDocumentLinks.Add(label2, doc2, l.weight);
                }
            }

            foreach (var label in labels)
            {
                var linked = LabelToCategoryLinks.GetAllLinked(label);
                var label2 = output.labels.First(x => x.name == label.name);
                foreach (var l in linked)
                {
                    SpaceCategoryModel doc2 = output.categories.First(x => x.name == l.name);

                    output.LabelToCategoryLinks.Add(label2, doc2, l.weight);
                }
            }



            return(output);
            //output.categories
        }