/*public Timetable ShallowCopy()
         * {
         *  Timetable t = new Timetable();
         *  t.SubjectList.AddRange(this.SubjectList);
         *  t.TypeList.AddRange(this.TypeList);
         *  t.StreamList.AddRange(this.StreamList);
         *  t.ClassList.AddRange(this.ClassList);
         * }*/

        // construct a new timetable object with enough information to render a preview
        public Timetable PreviewSolution(Solver.Solver.Solution solution)
        {
            var t = new Timetable();

            for (var i = 0; i < StreamList.Count; i++)
            {
                var stream = new Stream(StreamList[i]);
                if (solution.Streams.Contains(StreamList[i]))
                {
                    stream.Selected = true;
                }
                t.StreamList.Add(stream);

                stream.Classes.Clear();
                stream.Incompatible.Clear();
                stream.Equivalent.Clear();

                for (var j = 0; j < StreamList[i].Classes.Count; j++)
                {
                    var session = new Session(StreamList[i].Classes[j])
                    {
                        Stream = stream
                    };
                    stream.Classes.Add(session);
                    t.ClassList.Add(session);
                }
            }
            t.UnavailableList = UnavailableList;

            return(t);
        }
        public bool LoadSolution(Solver.Solver.Solution solution)
        {
            var result = true;

            foreach (var stream in solution.Streams)
            {
                // attempt to add it, return false if failed
                if (!SelectStream(stream))
                {
                    result = false;
                }
            }
            Update();
            return(result);
        }