/// <summary>
        /// Serialization constructor
        /// </summary>
        public TrainedModel(SerializationInfo info, StreamingContext context)
        {
            Properties  = (ModelProperties)info.GetValue(nameof(Properties), typeof(ModelProperties));
            ItemIdIndex = (string[])info.GetValue(nameof(ItemIdIndex), typeof(string[]));

            byte[] sarModelBytes = (byte[])info.GetValue(nameof(RecommenderData), typeof(byte[]));
            using (var stream = new MemoryStream(sarModelBytes))
            {
                using (var environment = new TlcEnvironment(verbose: true))
                {
                    IPredictor predictor = ModelFileUtils.LoadPredictorOrNull(environment, stream);
                    RecommenderData = new ModelRecommenderData(predictor as IUserHistoryToItemsRecommender);
                }
            }
        }
        /// <summary>
        /// Creates a new instance of the <see cref="TrainedModel"/> class.
        /// </summary>
        /// <param name="predictorModel">The predictor model</param>
        /// <param name="properties">The model properties</param>
        /// <param name="itemIdIndex">The indexed item ids </param>
        internal TrainedModel(IPredictorModel predictorModel, ModelProperties properties, string[] itemIdIndex)
        {
            if (predictorModel == null)
            {
                throw new ArgumentNullException(nameof(predictorModel));
            }

            if (properties == null)
            {
                throw new ArgumentNullException(nameof(properties));
            }

            if (itemIdIndex == null)
            {
                throw new ArgumentNullException(nameof(itemIdIndex));
            }

            _predictorModel = predictorModel;
            RecommenderData = new ModelRecommenderData(_predictorModel.Predictor as IUserHistoryToItemsRecommender);
            Properties      = properties;
            ItemIdIndex     = itemIdIndex;
        }