public void GenerateSolution(SolutionSerializationMode serializationMode = SolutionSerializationMode.Bare)
        {
            if (DataSource == null)
            {
                DataSource = new StreamReader(SourcePath);
            }
            InstanceLoader.Reader = DataSource;
            Instance instance = InstanceLoader.LoadInstanceFile();

            InstanceConverter.Instance = instance;
            InstanceConverter.ConvertToProblem();
            Solution solution = new Solution()
            {
                Instance = instance,
            };

            solution.GenerateSolutionFromRealData();
            InstanceJsonSerializer serializer = new InstanceJsonSerializer();

            if (OutputFilename == null)
            {
                OutputFilename = Path.GetFileNameWithoutExtension(SourcePath) + ".json";
            }
            serializer.Path = OutputFilename;
            FileInfo file = new FileInfo(OutputFilename);

            file.Directory.Create();
            serializer.SerializeSolution(solution, serializationMode);
        }
        public void SerializeSolution(Solution solution, SolutionSerializationMode solutionSerializationMode = SolutionSerializationMode.Basic)
        {
            solution.PrepareForSerialization();
            if (Writer == null)
            {
                FileInfo file = new FileInfo(Path);
                if (!file.Directory.Exists)
                {
                    file.Directory.Create();
                }
                Writer = new StreamWriter(Path);
            }
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.None,
                Formatting = (int)solutionSerializationMode > 2 ? Formatting.Indented : Formatting.None,
            };

            var jsonResolver = new PropertyRenameAndIgnoreSerializerContractResolver();

            if (solutionSerializationMode == SolutionSerializationMode.DebugTaskData)
            {
                jsonResolver.IgnoreProperty(typeof(TaskScore), nameof(TaskScore.BreaksPositions));
            }
            if (solutionSerializationMode == SolutionSerializationMode.Basic)
            {
                jsonResolver.IgnoreProperty(typeof(Solution), nameof(Solution.AdOrdersScores));
            }
            if (solutionSerializationMode == SolutionSerializationMode.Bare)
            {
                jsonResolver.IgnoreProperty(typeof(Solution),
                                            nameof(Solution.AdOrdersScores),
                                            nameof(Solution.Completion),
                                            nameof(Solution.CompletionScore),
                                            nameof(Solution.MaxCompletion),
                                            nameof(Solution.MildIncompatibilityLoss),
                                            nameof(Solution.OverdueAdsLoss),
                                            nameof(Solution.ExtendedBreakLoss),
                                            nameof(Solution.WeightedLoss),
                                            nameof(Solution.IntegrityLossScore),
                                            nameof(Solution.TotalStats),
                                            nameof(Solution.GradingFunctionDescription));
            }

            JsonSerializer ser = JsonSerializer.Create(settings);

            ser.ContractResolver = jsonResolver;
            ser.Serialize(Writer, solution);
            Writer.Flush();
            Writer.Close();
            Writer = null;
        }