Beispiel #1
0
        public static List <Course> Reduce(CreditDeterminer creditDeterminer, List <CourseInformation> courseInfoLst, int currentTermNumber)
        {
            int passedUnitsNumber = 0;

            //create a curriculum object with specific credit
            MainCurriculum curriculum = new MainCurriculum(MainCurriculum.CreateStudentCredit(creditDeterminer.Level1, creditDeterminer.Level2));

            //update curriculm's courses properties considering student history information
            for (int i = 0; i < courseInfoLst.Count; i++)
            {
                var currentCourseInfo = courseInfoLst[i];
                var currentCourse     = curriculum.Courses[i];

                if (currentCourseInfo.Id != currentCourse.Id)
                {
                    throw new ArgumentException();
                }

                currentCourse.CodeInDesUni = currentCourseInfo.CodeInDesUni;
                currentCourse.CorrespondingTitleInDesUni = currentCourseInfo.CorrespondingTitleInDesUni;

                if (currentCourseInfo.IsPassed)
                {
                    currentCourse.IsPassed = true;
                    passedUnitsNumber     += currentCourse.Units;
                }
                else if (currentCourseInfo.NumberOfFailed > 1)
                {
                    currentCourse.NumberOfFailed = 2;
                }
            }

            return(Reduce(curriculum, currentTermNumber, passedUnitsNumber));
        }
Beispiel #2
0
        //1
        //Layers.ReductionSteps.ReductionStep1.TryReduce(DirectoryManager.EssentialInforamtion1Directory + DirectoryManager.CreditDeterminerSavedName, DirectoryManager.EssentialInforamtion1Directory + DirectoryManager.CourseInformationSavedName, termNumberNow,out lst)

        /// <summary>
        ///
        /// </summary>
        /// <param name="curriculum">باید خصوصیات آن با توجه به credit و CourseInfo ذخیره شده ست شده باشد </param>
        /// <param name="currentTermNumber"></param>
        /// <returns></returns>
        public static List <Course> Reduce(MainCurriculum curriculum, int currentTermNumber, int cntPassedUnits)
        {
            List <SatelliteInformation> satList = curriculum.CreateNewSatelliteInformationList();

            PopulateSatelliteInformation(curriculum, satList);
            return(ReduceStep1Helper(curriculum, satList, cntPassedUnits, currentTermNumber));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="takenCoursesArray"></param>
        /// <param name="curriculum">!important :=> updated or not</param>
        /// <returns></returns>
        public static bool IsValidState(MainCurriculum curriculum, List <int> takenCoursesId)
        {
            //اگر در یک ترم بیش از یک معارف خواست بگیرد مجاز نیست
            //اگر در ترم کارآموزی خواست بردارد حداکثر تا 6 واحد مجاز است

            bool hasKarAmoozi = false;

            int numberOfUnits = 0;

            int numberOfMaaref = 0;

            for (int i = 0; i < takenCoursesId.Count; i++)
            {
                numberOfUnits += curriculum.Courses[takenCoursesId[i]].Units;
                if (takenCoursesId[i] <= 15)//assume :=> i >=0
                {
                    numberOfMaaref++;
                    if (numberOfMaaref > 1)
                    {
                        return(false);
                    }
                }
                if (takenCoursesId[i] == 59 || takenCoursesId[i] == 66 || takenCoursesId[i] == 75 || takenCoursesId[i] == 83)
                {
                    hasKarAmoozi = true;
                }
                if (hasKarAmoozi && numberOfUnits > 6)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #4
0
 private void CreateCourseInformationArrayAndFillItWithAppropriateData(out CourseInformation[] cfs)
 {
     try
     {
         MainCurriculum curriculum = new MainCurriculum();
         cfs = new CourseInformation[curriculum.Courses.Count];
         for (int i = 0; i < cfs.Length; i++)
         {
             var item             = curriculum.Courses[i];
             CourseInformation cf = new CourseInformation
             {
                 Id    = item.Id,
                 Title = item.Title,
                 CorrespondingTitleInDesUni = item.CorrespondingTitleInDesUni,
                 CodeInDesUni   = item.CodeInDesUni,
                 IsPassed       = item.IsPassed,
                 NumberOfFailed = item.NumberOfFailed,
             };
             cfs[i] = cf;
         }
     }
     catch
     {
         cfs = null;
     }
 }
Beispiel #5
0
        /// <summary>
        /// all rules
        /// </summary>
        /// <param name="curriculum">updated curriculm provided by StudentHistoryServiceProvider.CreateNewCurriculmWithSpecificCreditAndFilledBySpecificCourseInforamtion() must be passed</param>
        /// <param name="takenCoursesId">id's of courses which you want to take and after it you want to know :=> curriculum is in valid state or not?</param>
        /// <returns></returns>
        public static bool IsValidState(MainCurriculum curriculum, List <int> takenCoursesId)
        {
            //secondary rules
            bool o = SecondaryRulesStateValidator.IsValidState(curriculum, takenCoursesId);

            if (!o)
            {
                return(false);
            }

            //basic rules
            return(BasicRulesStateValidator.IsValidState(curriculum, takenCoursesId));
        }
        private static bool PrerequisitesAndRequisitesRegarded(MainCurriculum curriculum, bool[] takenCoursesArray, List <int> takenCoursesId)
        {
            bool succ = true;

            for (int i = 0; i < takenCoursesId.Count; i++)
            {
                succ = PrerequisitesAndRequisitesRegardedHelper(curriculum.Courses[takenCoursesId[i]], curriculum, takenCoursesArray);
                if (!succ)
                {
                    break;
                }
            }
            return(succ);
        }
        private static bool PrerequisitesAndRequisitesRegardedHelper(Course course, MainCurriculum curriculum, bool[] takenCoursesArray)
        {
            bool succ = true;

            succ = PrerequisitesAndRequisitesRegardedRequisitesHelper(course, curriculum, takenCoursesArray);

            if (!succ)
            {
                return(false);
            }

            succ = PrerequisitesAndRequisitesRegardedPreRequisitesHelper(course, curriculum, takenCoursesArray);

            return(succ);
        }
Beispiel #8
0
        private static List <Course> ReduceStep1Helper(MainCurriculum curriculum, List <SatelliteInformation> satList, int cntPassedUnits, int currentTermNumber)
        {
            bool[] visited   = new bool[curriculum.Courses.Count];
            bool[] achivable = new bool[visited.Length];

            List <Course> lst = new List <Course>();

            curriculum.Courses.ForEach(c =>
            {
                if (Acheivable(visited, achivable, curriculum, satList, c, cntPassedUnits, currentTermNumber))
                {
                    lst.Add(c);
                }
            });
            return(lst);
        }
Beispiel #9
0
        private static bool RecursiveCourseAcheivableCheck(MainCurriculum curriculum, List <SatelliteInformation> satList, Course c)
        {
            var  ccLst = c.CourseCategories;
            bool succ  = false;

            for (int i = 0; i < ccLst.Count; i++)
            {
                var cc = ccLst[i];
                if (RecursiveCourseAcheivableCheckHelper(curriculum, satList, c, cc))
                {
                    succ = true;
                    break;
                }
            }

            return(succ);
        }
        public static MainCurriculum CreateNewCurriculmWithSpecificCreditAndFilledBySpecificCourseInforamtion(string creditFileName, string courseInforamtionFileName)
        {
            CreditDeterminer creditDeterminer;

            FileServiceProvider.DeserializeFromXmlFile(creditFileName, out creditDeterminer);

            List <CourseInformation> courseInfoLst = null;

            FileServiceProvider.DeserializeFromXmlFile(courseInforamtionFileName, out courseInfoLst);

            //create a curriculum object with specific credit
            MainCurriculum curriculum = new MainCurriculum(MainCurriculum.CreateStudentCredit(creditDeterminer.Level1, creditDeterminer.Level2));

            //update curriculm's courses properties considering student history information
            for (int i = 0; i < courseInfoLst.Count; i++)
            {
                var currentCourseInfo = courseInfoLst[i];
                var currentCourse     = curriculum.Courses[i];

                if (currentCourseInfo.Id != currentCourse.Id)
                {
                    throw new ArgumentException();
                }

                currentCourse.CodeInDesUni = currentCourseInfo.CodeInDesUni;
                currentCourse.CorrespondingTitleInDesUni = currentCourseInfo.CorrespondingTitleInDesUni;

                if (currentCourseInfo.IsPassed)
                {
                    currentCourse.IsPassed = true;
                }
                else if (currentCourseInfo.NumberOfFailed > 1)
                {
                    currentCourse.NumberOfFailed = 2;
                }
            }

            return(curriculum);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="curriculum">updated curriculm provided by StudentHistoryServiceProvider.CreateNewCurriculmWithSpecificCreditAndFilledBySpecificCourseInforamtion() must be passed</param>
        /// <param name="takenCoursesId">id's of courses which you want to take and after it you want to know :=> curriculum is in valid state or not ? </param>
        /// <returns></returns>
        public static bool IsValidState(MainCurriculum curriculum, List <int> takenCoursesId)
        {
            bool[] takenCoursesArray = new bool[curriculum.Courses.Count];
            takenCoursesId.ForEach(t => takenCoursesArray[t] = true);

            //------------------------------------------------------------------


            bool o = PrerequisitesAndRequisitesRegarded(curriculum, takenCoursesArray, takenCoursesId);

            if (o == false)
            {
                return(false);
            }

            //------------------------------------------------------------------

            var satList = curriculum.CreateNewSatelliteInformationList();

            PopulateSatelliteInformationHelper(curriculum.Root, satList, curriculum, takenCoursesArray);

            return(IsValidState(curriculum, satList));
        }
Beispiel #12
0
        public void Run(double[] courseScore, List <OfferedCourse> whiteCourses, List <OfferedCourse> greenCourses, int minUnits, int maxUnits, int greenCoursesUnits, double whiteCoursesTotalScore, MainCurriculum mainCurriculum, List <Box> GreenCoursesBoxes, bool examCollideCheck, AlgorithmTopWeeklyProgramManager ChoosedWeeklyProgram, int timeout)
        {
            bool x = false;

            Task.Run(() =>
            {
                Thread.Sleep(timeout);
                x = true;
            });
            List <int> takenCoursesId = new List <int>();

            while (true)
            {
                if (x)
                {
                    return;
                }
                while (true)
                {
                    if (x)
                    {
                        return;
                    }
                    do
                    {
                        if (x)
                        {
                            return;
                        }

                        Selected             = new bool[whiteCourses.Count];
                        Score                = 0;
                        CurrentSelectedUnits = 0;

                        takenCoursesId.Clear();

                        //init and assigning values to Selected array
                        for (int i = 0; i < Selected.Length; i++)
                        {
                            var offeredCourse = whiteCourses[i];
                            var course        = whiteCourses[i].Course;

                            var pc = random.Next(100);

                            if (CurrentSelectedUnits + course.Units + greenCoursesUnits > maxUnits)
                            {
                                continue;
                            }

                            if (pc <= courseScore[course.Id] * 100.0 / whiteCoursesTotalScore)
                            {
                                Selected[i]           = true;
                                CurrentSelectedUnits += course.Units;
                                takenCoursesId.Add(course.Id);
                            }
                        }

                        if (minUnits > CurrentSelectedUnits + greenCoursesUnits)
                        {
                            //no valid
                        }
                    }while (minUnits > CurrentSelectedUnits + greenCoursesUnits);
                    greenCourses.ForEach(gc => takenCoursesId.Insert(0, gc.Course.Id));
                    //two step validation
                    bool o = MainCurriculumSateValidator.IsValidState(mainCurriculum, takenCoursesId);
                    if (o)
                    {
                        break;
                    }
                }

                List <Box> boxes = new List <Box>();
                GreenCoursesBoxes.ForEach(b => boxes.Add(b));
                for (int i = 0; i < Selected.Length; i++)
                {
                    if (Selected[i])
                    {
                        Box b = ReductionStep2ServiceProvider.CreateBoxForOfferedCourse(whiteCourses[i]);
                        boxes.Add(b);
                    }
                }

                List <Box> res = ReductionStep2ServiceProvider.Validate(boxes, examCollideCheck);

                if (res != null)
                {
                    //break;
                    ChoosedWeeklyProgram.AddUpdateRangeData(res[0].Rows);
                }
            }
        }//end method Run
        public static bool TryCreateNewCurriculmWithSpecificCreditAndFilledBySpecificCourseInforamtion(string creditFileName, string courseInforamtionFileName, out MainCurriculum curriculum)
        {
            bool succ;

            try
            {
                curriculum = CreateNewCurriculmWithSpecificCreditAndFilledBySpecificCourseInforamtion(creditFileName, courseInforamtionFileName);
                succ       = true;
            }
            catch
            {
                curriculum = null;
                succ       = false;
            }

            return(succ);
        }
        public async Task RunAfterCreatedAsync()
        {
            try
            {

                await Task.Run(async () =>
                {
                    await Dispatcher.InvokeAsync(() =>
                    {
                        InitializeComponent();
                    });

                    //settings
                    if (Properties.Settings.Default.CurrentTermNumber > 0)
                        termNumber = Properties.Settings.Default.CurrentTermNumber;

                    gender = Properties.Settings.Default.Gender == 'm' ? Tataiee.Harif.Infrastructures.GeneralEnums.Gender.MALE : Tataiee.Harif.Infrastructures.GeneralEnums.Gender.FEMALE;

                    if (Properties.Settings.Default.MinUnits > 0)
                        minUnits = Properties.Settings.Default.MinUnits;

                    if (Properties.Settings.Default.MinUnits <= Properties.Settings.Default.MaxUnits && Properties.Settings.Default.MaxUnits > 0)
                        maxUnits = Properties.Settings.Default.MaxUnits;

                    if (Properties.Settings.Default.TimeoutForReductionStep2ms >= 120)
                        timeoutMs = Properties.Settings.Default.TimeoutForReductionStep2ms;

                    if (Properties.Settings.Default.MaxNumberOfSuggestedWeeklyProgram >= 1 && Properties.Settings.Default.MaxNumberOfSuggestedWeeklyProgram <= 50)
                        maxCntSuggestion = Properties.Settings.Default.MaxNumberOfSuggestedWeeklyProgram;

                    capacityFiltering = Properties.Settings.Default.CapacityFiltering;

                    exampCollideChecking = Properties.Settings.Default.ExamCollideChecking;

                    //end settings

                    mainCurriculum = StudentHistoryServiceProvider.CreateNewCurriculmWithSpecificCreditAndFilledBySpecificCourseInforamtion(DirectoryManager.EssentialInforamtion1Directory + DirectoryManager.CreditDeterminerSavedName, DirectoryManager.EssentialInforamtion1Directory + DirectoryManager.CourseInformationSavedName);


                    int CODE_LEN = 7;


                    //load offered course row in memory
                    FileServiceProvider.DeserializeFromXmlFile(DirectoryManager.GoalVersionOfferedCoursesRowDirectory + DirectoryManager.GoalVersionOfferedCoursesRowSavedName, out List<GoalVersionOfferedCoursesRow> goalVersionOfferedCourseRows);

                    //perform reduction step 1 and get courses list after reduced
                    var coursesListAfterReductionStep1 = ReductionStep1.Reduce(DirectoryManager.EssentialInforamtion1Directory + DirectoryManager.CreditDeterminerSavedName, DirectoryManager.EssentialInforamtion1Directory + DirectoryManager.CourseInformationSavedName
                        , termNumber);


                    //assign offeredCourseRows to the output of ReductionStep2 courses List                     
                    if (capacityFiltering)
                    {
                        goalVersionOfferedCourseRows = ReductionStep2.Reduce(coursesListAfterReductionStep1, goalVersionOfferedCourseRows, gender)
                        .Where(r => r.Capacity - r.Registered > 0).ToList();
                    }
                    else
                    {
                        goalVersionOfferedCourseRows = ReductionStep2.Reduce(coursesListAfterReductionStep1, goalVersionOfferedCourseRows, gender);
                    }

                    CODE_LEN = coursesListAfterReductionStep1[0].CodeInDesUni.Length;

                    //again group reduced offered course rows 
                    var coursesGroups = (from c in goalVersionOfferedCourseRows
                                         group c by c.Id.Substring(0, CODE_LEN)).ToList();

                    //--------

                    //we can add another reduction step to reduce more if possible but not now.
                    //---------



                    //fill main offeredCourses and offeredCourseRows lists
                    int i = 0;
                    int j = 0;
                    foreach (var course in coursesGroups)
                    {
                        var c = coursesListAfterReductionStep1.FirstOrDefault(c1 => c1.CodeInDesUni == course.Key);
                        if (c != null)
                        {
                            OfferedCourse oc = new OfferedCourse(c, i++, ReductionStep2ColorStatus.WHITE);
                            foreach (var row in course)
                            {
                                OfferedCourseRow ocr = new OfferedCourseRow(row, ReductionStep2ColorStatus.WHITE, j++, oc);
                                oc.OfferedCourseRows.Add(ocr);

                                cards.Add(null);
                                offeredCourseRows.Add(ocr);
                            }

                            offeredCourses.Add(oc);

                        }
                    }

                    if (Properties.Settings.Default.ReductionStep2MustBeLoad)
                    {

                        FileServiceProvider.DeserializeFromXmlFile(DirectoryManager.ReductionStep2SavedStatus + DirectoryManager.SaveColorOfferedCourses, out List<SaveColorObjectModel> saveColorOfferedCourses);
                        FileServiceProvider.DeserializeFromXmlFile(DirectoryManager.ReductionStep2SavedStatus + DirectoryManager.SaveColorOfferedCourseRows, out List<SaveColorObjectModel> saveColorOfferedCourseRows);


                        saveColorOfferedCourses.ForEach(scoc =>
                        {
                            offeredCourses[scoc.CorrespondingIdInSourceList].Color = scoc.Color;
                        });

                        saveColorOfferedCourseRows.ForEach(scocr =>
                        {
                            offeredCourseRows[scocr.CorrespondingIdInSourceList].Color = scocr.Color;
                        });

                    }


                    //create and fill courses navigation buttons in the right side
                    await Dispatcher.InvokeAsync(() =>
                    {

                        stackPanelRightSide.Children.Clear();
                        Button button1 = null;
                        for (int m = 0; m < offeredCourses.Count; m++)
                        {

                            Badged badged = new Badged
                            {
                                Badge = offeredCourses[m].OfferedCourseCode,
                                Margin = new Thickness(5),
                                Name = "bdg" + offeredCourses[m].CourseId
                            };

                            Button button = new Button
                            {
                                Content = new TextBlock()
                                {
                                    Text = offeredCourses[m].OfferedCourseName,
                                    TextAlignment = TextAlignment.Center,
                                    TextWrapping = TextWrapping.Wrap
                                },
                                Name = "btn" + m.ToString(),
                                Width = 250,
                                Height = Double.NaN,
                                Padding = new Thickness(5),

                                Background = Brushes.Transparent
                            };

                            button.Click += btnCourseNavigation_Click;
                            badged.Content = button;

                            if (m == 0)
                            {
                                button1 = button;
                            }
                            stackPanelRightSide.Children.Add(badged);
                        }
                        selectedButton = button1;

                        allowUserInteraction = true;
                        btnCourseNavigation_Click(button1, null);
                    });


                });

            }
            catch
            {

            }
        }
Beispiel #15
0
        // <param name="mainCurriculum">updated curriculum</param>
        public void Run(List <OfferedCourse> inputs, MainCurriculum mainCurriculum, int minUnitsRequired, int maxUnitsRequired, bool examCollideCheck, int timeout, AnimateStatusObjectModel model)
        {
            ChoosedWeeklyProgram.Clear();

            double[] courseScore = new double[mainCurriculum.Courses.Count];


            double numberOfGreenUnits = 0;

            List <OfferedCourse> greenCourses = new List <OfferedCourse>();
            List <OfferedCourse> whiteCourses = new List <OfferedCourse>();//white courses that have at least one white row

            int greenUnits = 0;

            for (int i = 0; i < inputs.Count; i++)
            {
                var offeredCourse = inputs[i];

                if (offeredCourse.Color == ReductionStep2ColorStatus.Green)
                {
                    greenCourses.Add(offeredCourse);
                    greenUnits += offeredCourse.Course.Units;
                }
                else if (offeredCourse.Color == ReductionStep2ColorStatus.WHITE)
                {
                    for (int r = 0; r < offeredCourse.OfferedCourseRows.Count; r++)
                    {
                        var offeredCourseRow = offeredCourse.OfferedCourseRows[r];
                        if (offeredCourseRow.Color == ReductionStep2ColorStatus.WHITE)
                        {
                            whiteCourses.Add(offeredCourse);
                            break;
                        }
                    }
                }

                var course = offeredCourse.Course;

                courseScore[course.Id] += (course.Units * 2 - 1) * 1;

                for (int c = 0; c < course.PrerequisiteCourses.Count; c++)
                {
                    var preCourse = course.PrerequisiteCourses[c];

                    if (!preCourse.IsPassed && preCourse.IsAvailable())
                    {
                        if (preCourse.NumberOfFailed > 1)
                        {
                            courseScore[preCourse.Id] += (course.Units * 2 - 1) * 0.20;
                        }
                        else
                        {
                            courseScore[preCourse.Id] += (course.Units * 2 - 1) * 0.25;
                        }
                    }
                }
                for (int c = 0; c < course.RequisiteCourses.Count; c++)
                {
                    var reqCourse = course.RequisiteCourses[c];

                    if (!reqCourse.IsPassed && reqCourse.IsAvailable())
                    {
                        courseScore[reqCourse.Id] += (course.Units * 2 - 1) * 0.20;
                    }
                }
            }

            double totalScore = 0;

            whiteCourses.ForEach(i =>
            {
                totalScore += courseScore[i.Course.Id];
            });

            List <Box> greenCoursesBoxes = new List <Box>();

            greenCourses.ForEach(gc =>
            {
                numberOfGreenUnits += gc.Course.Units;
                Box b = ReductionStep2ServiceProvider.CreateBoxForOfferedCourse(gc);
                greenCoursesBoxes.Add(b);
            });

            if (greenCoursesBoxes.Count > 0)
            {
                List <Box> res = ReductionStep2ServiceProvider.Validate(greenCoursesBoxes, examCollideCheck);
                if (res != null)
                {
                    greenCoursesBoxes.Clear();
                    greenCoursesBoxes.Add(res[0]);
                }
            }

            new AlgorithmLogicProvider().Run(courseScore, whiteCourses, greenCourses, minUnitsRequired, maxUnitsRequired, greenUnits, totalScore, mainCurriculum, greenCoursesBoxes, examCollideCheck, ChoosedWeeklyProgram, timeout);

            if (ChoosedWeeklyProgram.Count > 0)
            {
                model.Succ = true;
            }
            else
            {
                model.Succ = false;
            }
        }//end method Run
Beispiel #16
0
 private static void PopulateSatelliteInformation(MainCurriculum curriculum, List <SatelliteInformation> satList)
 {
     BasicRulesStateValidator.PopulateSatelliteInformation(curriculum, satList, new List <int>());
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="curriculum"></param>
 /// <param name="satList">pass empty satLst that created by MainCurriculum.CreateNewSatelliteInformationList() to fill it</param>
 /// <param name="takenCoursesId"></param>
 public static void PopulateSatelliteInformation(MainCurriculum curriculum, List <SatelliteInformation> satList, List <int> takenCoursesId)
 {
     bool[] takenCoursesArray = new bool[curriculum.Courses.Count];
     takenCoursesId.ForEach(t => takenCoursesArray[t] = true);
     PopulateSatelliteInformationHelper(curriculum.Root, satList, curriculum, takenCoursesArray);
 }
Beispiel #18
0
        private static bool RecursiveCourseAcheivableCheckHelper(MainCurriculum curriculum, List <SatelliteInformation> satList, Course c, CourseCategory courseCategory)
        {
            if (courseCategory == curriculum.Root)
            {
                return(true);
            }
            else
            {
                List <CourseCategory> allowedCourseCategories = new List <CourseCategory>();

                for (int i = 0; i < courseCategory.InputGates.Count; i++)
                {
                    var graphEdge = courseCategory.InputGates[i];

                    if (!graphEdge.IsAllowedAllCredits(curriculum.StudentCredit))
                    {
                        continue;
                    }

                    bool graphEdgeCon = true;

                    for (int j = 0; j < graphEdge.CertificateList.Count; j++)
                    {
                        var crt = graphEdge.CertificateList[j];

                        for (int m = 0; m < crt.ConstraintList.Count; m++)
                        {
                            var constraint = crt.ConstraintList[m];

                            if (constraint is MinNumberMaxNumberOfCoursesConstraint)
                            {
                                graphEdgeCon = constraint.IsOk(satList[courseCategory.Id].NumberOfCoursesPassed + 1);
                            }
                            else if (constraint is MinUnitsMaxUnitsOfCoursesConstraint)
                            {
                                graphEdgeCon = constraint.IsOk(satList[courseCategory.Id].UnitsOfCoursesPassed + c.Units);
                            }
                            else if (constraint is NumberOfCoursesMustBeLabOrWorkshopConstraint)
                            {
                                graphEdgeCon = constraint.IsOk(satList[courseCategory.Id].NumberOfWorkshopOrLabPassed + (c.IsLabOrWorkshop() ? 1 : 0));
                            }
                            else if (constraint is UnitOfCoursesMustBeLabOrWorkshopConstraint)
                            {
                                graphEdgeCon = constraint.IsOk(satList[courseCategory.Id].UnitsOfWorkshopOrLabPassed + (c.IsLabOrWorkshop() ? c.Units : 0));
                            }
                            else
                            {
                                throw new ArgumentException();
                            }

                            if (!graphEdgeCon)
                            {
                                break;
                            }
                        }
                        if (!graphEdgeCon)
                        {
                            break;
                        }
                    }

                    if (graphEdgeCon)
                    {
                        allowedCourseCategories.Add(graphEdge.SrcCourseCategory);
                    }
                }

                bool suuc = false;
                for (int i = 0; i < allowedCourseCategories.Count; i++)
                {
                    var accc = allowedCourseCategories[i];
                    if (RecursiveCourseAcheivableCheckHelper(curriculum, satList, c, accc))
                    {
                        suuc = true;
                        break;
                    }
                }
                return(suuc);
            }
        }
        private static void PopulateSatelliteInformationHelper(CourseCategory courseCategory, List <SatelliteInformation> satList, MainCurriculum curriculum, bool[] takenCoursesArray)
        {
            if (courseCategory.IsEdge())
            {
                courseCategory.Courses.ForEach(c =>
                {
                    if (c.IsPassed || takenCoursesArray[c.Id])//*v.i
                    {
                        satList[courseCategory.Id].NumberOfCoursesPassed += 1;
                        satList[courseCategory.Id].UnitsOfCoursesPassed  += c.Units;
                        if (c.IsLabOrWorkshop())
                        {
                            satList[courseCategory.Id].NumberOfWorkshopOrLabPassed += 1;
                            satList[courseCategory.Id].UnitsOfWorkshopOrLabPassed  += c.Units;
                        }
                    }
                });
            }
            else
            {
                courseCategory.OutputGates.ForEach(og =>
                {
                    var courseCategoryChild = og.DesCourseCategory;
                    var courseCategorySrc   = og.SrcCourseCategory;

                    if (og.IsAllowedAllCredits(curriculum.StudentCredit))
                    {
                        //first calc
                        PopulateSatelliteInformationHelper(courseCategoryChild, satList, curriculum, takenCoursesArray);

                        //then set values
                        satList[courseCategorySrc.Id].NumberOfCoursesPassed       += satList[courseCategoryChild.Id].NumberOfCoursesPassed;
                        satList[courseCategorySrc.Id].UnitsOfCoursesPassed        += satList[courseCategoryChild.Id].UnitsOfCoursesPassed;
                        satList[courseCategorySrc.Id].NumberOfWorkshopOrLabPassed += satList[courseCategoryChild.Id].NumberOfWorkshopOrLabPassed;
                        satList[courseCategorySrc.Id].UnitsOfWorkshopOrLabPassed  += satList[courseCategoryChild.Id].UnitsOfWorkshopOrLabPassed;
                    }
                });
            }
        }
Beispiel #20
0
        private static bool Acheivable(bool[] visited, bool[] achivable, MainCurriculum curriculum, List <SatelliteInformation> satList, Course c, int cntPassedUnits, int currentTermNumber)
        {
            //memoization :=> dynamic programming
            if (visited[c.Id])
            {
                return(achivable[c.Id]);
            }


            if (!c.IsAvailable())
            {
                return(false);
            }
            else if (c.IsPassed)
            {
                return(false);
            }
            else if (c.MinRequireTerm > currentTermNumber)
            {
                return(false);
            }
            else if (c.MinReuireUnits > cntPassedUnits)
            {
                return(false);
            }

            for (int i = 0; i < c.PrerequisiteCourses.Count; i++)
            {
                var pr = c.PrerequisiteCourses[i];
                if (!pr.IsPassed)
                {
                    if (pr.NumberOfFailed > 1)
                    {
                        if (!Acheivable(visited, achivable, curriculum, satList, pr, cntPassedUnits, currentTermNumber))
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }
            }

            for (int i = 0; i < c.RequisiteCourses.Count; i++)
            {
                var r = c.RequisiteCourses[i];

                if (!r.IsAvailable())
                {
                    return(false);
                }
                if (r.IsPassed == false && !Acheivable(visited, achivable, curriculum, satList, r, cntPassedUnits, currentTermNumber))
                {
                    return(false);
                }
            }



            var res = RecursiveCourseAcheivableCheck(curriculum, satList, c);

            //memoization
            visited[c.Id]   = true;
            achivable[c.Id] = res;

            return(res);
        }
        private static bool PrerequisitesAndRequisitesRegardedPreRequisitesHelper(Course course, MainCurriculum curriculum, bool[] takenCoursesArray)
        {
            bool succ = true;

            for (int i = 0; i < course.PrerequisiteCourses.Count; i++)
            {
                var curr = course.PrerequisiteCourses[i];

                if (!curr.IsPassed)
                {
                    if (curr.NumberOfFailed > 1)
                    {
                        if (!takenCoursesArray[curr.Id])
                        {
                            succ = false;
                            break;
                        }
                    }
                    else
                    {
                        succ = false;
                        break;
                    }
                }
            }
            return(succ);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="curriculum"></param>
 /// <param name="satList">pass satList that filled by MainCurriculumSateValidator.PopulateSatelliteInformation()</param>
 /// <returns></returns>
 public static bool IsValidState(MainCurriculum curriculum, List <SatelliteInformation> satList)
 {
     return(IsValidStateHelper(curriculum, satList, curriculum.Root));
 }
        private static bool IsValidStateHelper(MainCurriculum curriculum, List <SatelliteInformation> satList, CourseCategory courseCategory)
        {
            if (courseCategory.IsEdge())
            {
                return(true);
            }

            var graphEdges = courseCategory.OutputGates;

            for (int i = 0; i < graphEdges.Count; i++)
            {
                var graphEdge = graphEdges[i];

                if (graphEdge.IsAllowedAllCredits(curriculum.StudentCredit))
                {
                    var crtLst = graphEdge.CertificateList;

                    bool isOk = true;

                    for (int j = 0; j < crtLst.Count; j++)
                    {
                        var crt = crtLst[j];
                        for (int m = 0; m < crt.ConstraintList.Count; m++)
                        {
                            var constraint = crt.ConstraintList[m];

                            if (constraint is MinNumberMaxNumberOfCoursesConstraint)
                            {
                                isOk = constraint.IsOk(satList[graphEdge.DesCourseCategory.Id].NumberOfCoursesPassed);
                            }
                            else if (constraint is MinUnitsMaxUnitsOfCoursesConstraint)
                            {
                                isOk = constraint.IsOk(satList[graphEdge.DesCourseCategory.Id].UnitsOfCoursesPassed);
                            }
                            else if (constraint is NumberOfCoursesMustBeLabOrWorkshopConstraint)
                            {
                                isOk = constraint.IsOk(satList[graphEdge.DesCourseCategory.Id].NumberOfWorkshopOrLabPassed);
                            }
                            else if (constraint is UnitOfCoursesMustBeLabOrWorkshopConstraint)
                            {
                                isOk = constraint.IsOk(satList[graphEdge.DesCourseCategory.Id].UnitsOfWorkshopOrLabPassed);
                            }
                            else
                            {
                                throw new Exception();
                            }
                            if (!isOk)
                            {
                                break;
                            }
                        }

                        if (!isOk)
                        {
                            break;
                        }
                    }

                    if (!isOk)
                    {
                        return(false);
                    }

                    if (IsValidStateHelper(curriculum, satList, graphEdge.DesCourseCategory) == false)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }