public override void Initialize()
        {
            LibLinearClassifier.Solver solver = (LibLinearClassifier.Solver)Enum.Parse(typeof(LibLinearClassifier.Solver), Configuration.ClassifierTypeOptions[GetType()]["solver"]);
            string trainPath   = Configuration.ClassifierTypeOptions[GetType()]["train"];
            string predictPath = Configuration.ClassifierTypeOptions[GetType()]["predict"];

            _libLinear = new LibLinearClassifier(solver, NumericFeatureNameTransform.AccessMethod.Memory, FeatureSpace.AccessMethod.Memory, true, Model.ModelDirectory, trainPath, predictPath, null, float.MinValue);
            _libLinear.OutputProbabilities = true;
        }
        internal override string GetDetails(Prediction prediction, Dictionary <string, string> attFeatureIdInformation)
        {
            StringBuilder report = new StringBuilder("Details for model created by prediction \"" + prediction.Name + "\"" + Environment.NewLine);
            Dictionary <int, Dictionary <int, double> > classFeatureWeight = LibLinearClassifier.GetFeatureWeights(Path.Combine(Model.ModelDirectory, LibLinearClassifier.ModelFileName));
            LabelMap labelMap = new LabelMap(Path.Combine(Model.ModelDirectory, LibLinearClassifier.LabelMapFileName));
            MemoryNumericFeatureNameTransform featureNameTransform = new MemoryNumericFeatureNameTransform(Path.Combine(Model.ModelDirectory, LibLinearClassifier.FeatureNameTransformFileName));

            Dictionary <int, string> liblinearFeatureNumberAttFeatureId = new Dictionary <int, string>();

            foreach (string attFeatureId in featureNameTransform)
            {
                // nominal features in the ATT have IDs in the transform that include the nominal feature value - trim this off to recover the original ID
                int dashIndex = attFeatureId.IndexOf('-');
                if (dashIndex >= 0)
                {
                    liblinearFeatureNumberAttFeatureId.Add(featureNameTransform.GetFeatureNumber(attFeatureId), attFeatureId.Substring(0, dashIndex));
                }
                else
                {
                    liblinearFeatureNumberAttFeatureId.Add(featureNameTransform.GetFeatureNumber(attFeatureId), attFeatureId);
                }
            }

            Dictionary <string, string> attFeatureIdDesc = new Dictionary <string, string>();

            foreach (PTL.ATT.Models.Feature f in Model.Features)
            {
                attFeatureIdDesc.Add(f.Id, "Feature \"" + f.Description + "\"");
            }

            foreach (int classNumber in classFeatureWeight.Keys.OrderBy(i => i))
            {
                report.AppendLine("\tClass \"" + labelMap.GetUnmappedLabel(classNumber.ToString()) + "\"");

                int maxFeatureNameWidth = classFeatureWeight[classNumber].Keys.Max(f => attFeatureIdDesc[liblinearFeatureNumberAttFeatureId[f]].Length);
                foreach (int liblinearFeatureNumber in classFeatureWeight[classNumber].Keys.OrderBy(f => - Math.Abs(classFeatureWeight[classNumber][f])))
                {
                    string desc         = attFeatureIdDesc[liblinearFeatureNumberAttFeatureId[liblinearFeatureNumber]];
                    double weight       = classFeatureWeight[classNumber][liblinearFeatureNumber];
                    string attFeatureId = liblinearFeatureNumberAttFeatureId[liblinearFeatureNumber];
                    string information  = (attFeatureIdInformation == null || !attFeatureIdInformation.ContainsKey(attFeatureId) ? "" : Environment.NewLine +
                                           "\t\t\tInformation:  " + attFeatureIdInformation[attFeatureId]);

                    report.AppendLine(string.Format("\t\t{0,-" + maxFeatureNameWidth + "}: weight = {1:0.00}", desc, weight) + information + Environment.NewLine);
                }

                report.AppendLine();
            }

            return(report.ToString());
        }
        public override void Initialize()
        {
            LibLinearClassifier.Solver solver = (LibLinearClassifier.Solver)Enum.Parse(typeof(LibLinearClassifier.Solver), Configuration.ClassifierTypeOptions[GetType()]["solver"]);
            string trainPath = Configuration.ClassifierTypeOptions[GetType()]["train"];
            string predictPath = Configuration.ClassifierTypeOptions[GetType()]["predict"];

            _libLinear = new LibLinearClassifier(solver, NumericFeatureNameTransform.AccessMethod.Memory, FeatureSpace.AccessMethod.Memory, true, Model.ModelDirectory, trainPath, predictPath, null, float.MinValue);
            _libLinear.OutputProbabilities = true;
        }