Beispiel #1
0
        AlgorithmFactory factory = new AlgorithmFactory();//vytvor factory

        /// <summary>
        /// Metoda vrací informace o implementovaných algoritmech rozdělování případů na straně serveru.
        /// </summary>
        /// <param name="id">Identifikátor uživatele.</param>
        /// <returns></returns>
        public List <AlgorithmInfo> GetImplementedAlgorithmInfo(UserIdentity id)
        {
            bool   fault        = false;//predpokladej ze chyba neni
            string faultmessage = "UNKNOWN";

            try
            {
                if (UserIdentity.CheckUserIdentity(id))//over parametry, pokud selze nastava vyjimka
                {
                    Debug.WriteLine("Server:GetImplementedAlgorithmInfo:UserIdentity " + id.ID);
                    return((from x in factory.Descriptions select new AlgorithmInfo(x.ID.ToString(), x.Name, x.Description)).ToList <AlgorithmInfo>());
                }
            }
            catch (FaultException <GeneratorServiceFault> ex)                                                                                       //nastane pri vnitrnich problem s validovanim uzivatele
            {
                fault        = true;                                                                                                                //nastala chyba pri validovani
                faultmessage = ex.Reason.ToString();                                                                                                //uloz si spravu
                throw;                                                                                                                              //vyhod vyjimku znovu
            }
            catch (Exception e)                                                                                                                     //nemelo by nikdy nastat
            {
                faultmessage = e.Message;                                                                                                           //nejaka neocekavana chyba
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Unknown reason."), new FaultReason("Unknown reason.")); //vyhod vyjimku
            }
            finally
            {
                if (ConfigurationManager.AppSettings["LoggingSimulationService"].ToUpper() == "TRUE")//kdyz je logovani zapnuto
                {
                    Debug.WriteLine("LOGING:");
                    if (fault)                                                                            //kdyz byla chyba
                    {
                        string user = (id != null && id.ID != null) ? id.ID : "UNKNOWN";                  //nemusel byt zadan uzivatel
                        Debug.WriteLine("Fault " + user + " : " + faultmessage);
                        MSPGeneratorServicesLog.WriteActionFault(user, "GetAlgorithmInfo", faultmessage); //loguj akci a chybu
                    }
                    else
                    {
                        Debug.WriteLine("Succes");
                        MSPGeneratorServicesLog.WriteActionSuccess(id.ID, "GetAlgorithmInfo");//loguj akci
                    }
                }
            }
            return(null);
        }
        AlgorithmFactory factory = new AlgorithmFactory();//vytvor si factory
        /// <summary>
        /// Metoda z dané množiny senátů na vstupu vybere pomocí specifikovaného algoritmu jeden. Jedná se pouze o fasádu nad vnitřním přidělováním.
        /// </summary>
        /// <param name="gparams">Vstupní parametry obsahující kdo operaci volal, seznam senátů k přidělení, identifikátor případu a algoritmus pro výběr.</param>
        /// <returns>Metoda vrací identifikátor senátu.</returns>
        /// <remarks> Metoda se chová bezstavově, tj. nedochází ke změně vstupních údajů.
        /// Všechny parametry přidělení jako jsou senáty, jejich zatížení, identifikátor případu k rozdělení je nutné zadat na vstupu. Metoda nepoužívá žádnou databázi pro čtení těchto informací. Co se jí předá, to použije. Pokud je některý ze senátů použitý pro simulaci zakázaný, tak si je automaticky vyjmut ze simulace.
        /// Předávané informace o uživateli jsou použité pro logování.
        /// </remarks>
        /// <remarks>
        /// Identifikátor algoritmu musí odpovídat vnitřnímu seznamu použitelných algoritmů, jinak dochází k výjimce. Předpokládá se úprava před nasazením, tak aby algoritmus byl pevně daný.
        /// </remarks>
        /// <remarks>
        /// Použijí se pouze povolené senáty, nepovolené senáty se dále v simulaci nepoužijí. Pokud není žádný senát povolený, je volána výjimka.
        /// </remarks>
        /// <exception cref="GeneratorServiceFault">V případě neplatných parametrů dochází k vyvolání výjimky.</exception>
        public string AssignCase(AssignCaseParams gparams)
        {
            bool               fault        = false;//predpokladej ze chyba neni
            string             faultmessage = "UNKNOWN";
            string             result       = "UNKNOWN";
            SelectionAlgorithm algorithm    = null;

            try
            {
                Debug.WriteLine("ASSIGNCASE");
                if (AssignCaseParams.CheckAssignCaseParams(gparams))                   //kontroluj parametry
                {
                    algorithm = factory.GetSelectionAlgorithm(gparams.AlgorithmToUse); //vem algoritmus
                    result    = Assign(algorithm, gparams);
                    return(result);
                }
            }
            catch (FaultException <GeneratorServiceFault> ex)                                          //nastane pri vnitrnich problem s validovanim parametru
            {
                fault        = true;                                                                   //nastala chyba pri validovani
                faultmessage = ex.Reason.ToString() + ((ex.Detail != null) ? ex.Detail.Message : " "); //uloz si zpravu i sp pripadnym detailem
                throw;                                                                                 //vyhod vyjimku znovu
            }
            catch (ArgumentException e)                                                                //spatne parametry vstupu
            {
                faultmessage = e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Wrong generating parameters: " + e.Message), new FaultReason("Wrong generating parameters."));
            }
            catch (KeyNotFoundException e) //nastava v pripade pouziti neexistujiciho algoritmu-identifikatoru
            {
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Invalid algorithm ID in AlgorithmToUse."), new FaultReason("Generation algorithm  invalid ID."));
            }
            catch (Exception e)//nemelo by nastavat
            {
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Unknown problem: " + e.Message), new FaultReason("Generation algorithm unknown problem."));
            }
            finally
            {
                if (ConfigurationManager.AppSettings["LoggingGeneratingService"].ToUpper() == "TRUE")//kdyz je logovani zapnuto
                {
                    Debug.WriteLine("LOGING:");
                    if (fault)//kdyz byla chyba
                    {
                        //osetreni situace kdy neni ani zadan uzivatel
                        string user = (gparams != null && gparams.User != null && gparams.User.ID != null) ? gparams.User.ID : "UNKNOWN"; //nemusel byt zadan uzivatel
                        Debug.WriteLine("Fault " + user + " : " + faultmessage);
                        MSPGeneratorServicesLog.WriteActionFault(user, "AssignCase", faultmessage);                                       //loguj akci a chybu
                    }
                    else//kdyz chyba nebyla
                    {
                        Debug.WriteLine("Succes");
                        double   p = algorithm.LastGeneratedValue;                                                                       //jaka byla posledni losovana hodnota
                        int      activesenates_count = (from s in gparams.Senates where s.Enabled select s).Count();
                        double[] parray = algorithm.GetProbabilityArray(activesenates_count);                                            //kopiruj pravdepodobnosti pro aktivni senaty
                        MSPGeneratorServicesLog.WriteGeneratingActionSuccess(gparams.User.ID, "AssignCase", gparams, p, parray, result); //loguj akci
                    }
                }
            }
            return(null);//sem by se kod vubec nemel dostat, bud vse OK, nebo vyjimka
        }
Beispiel #3
0
        /// <summary>
        /// Metoda poskytující rozhraní pro provádění simulací.
        /// </summary>
        /// <param name="sparams">Parametry simulace.</param>
        /// <returns>Výsledky simulace</returns>
        /// <remarks> Metoda provádí bezstavovou simulaci, tj. nedochází ke změně vstupních údajů. Přidělené případy během simulace ovlivňují pouze aktuální simulaci.
        /// Všechny parametry simulace jako jsou senáty, jejich zatížení, počet případů k rozdělení je nutné zadat na vstupu. Metoda nepoužívá žádnou databázi pro čtení těchto informací. Co se jí předá, to použije. Pokud je některý ze senátů použitý pro simulaci zakázaný, tak si je automaticky vyjmut ze simulace.
        /// Předávané informace o uživateli jsou použité pro logování.
        /// </remarks>
        /// <remarks>
        /// Použijí se pouze povolené senáty, pokud není žádný povolený, je volána výjimka.
        /// </remarks>
        /// <remarks>
        /// Identifikátor algoritmu musí odpovídat vnitřnímu seznamu použitelných algoritmů, jinak dochází k výjimce.
        /// </remarks>
        /// <exception cref="GeneratorServiceFault">V případě neplatných parametrů dochází k vyvolání výjimky.</exception>
        public List <SimulationResult> DoSimulation(SimulationParams sparams)
        {
            bool   fault        = false;//predpokladej ze chyba neni
            string faultmessage = "UNKNOWN";

            try
            {
                Debug.WriteLine("DOSIMULATION");
                List <SimulationResult> results = null;                        //pro ulozeni vysledku simulace
                if (SimulationParams.CheckSimulationParams(sparams))           //pokud by bylo nesplneno, dochazi na volani vyjimky
                {
                    results = new List <SimulationResult>();                   //seznam s vysledky simulace pro kazdou iteraci a kazdy algoritmus
                    foreach (var algorithm_id in sparams.AlgorithmsToSimulate) //pro kazdy algoritmus k simulaci
                    {
                        Debug.WriteLine("Simulate: " + algorithm_id.ToString());
                        var algorithm = factory.GetSelectionAlgorithm(algorithm_id);                       //vem algoritmus
                        var simresult = Simulate(algorithm, sparams);                                      //volej simulaci danym algoritmem, mam jak data, tak diference
                        results.Add(new SimulationResult(simresult.Item1, simresult.Item2, algorithm_id)); //pridej vysledky do celkovych vysledku
                    }
                    return(results);                                                                       //vrat vysledky
                }
            }
            catch (FaultException <GeneratorServiceFault> ex)                                       //nastane pri vnitrnich problem s validovanim parametru
            {
                fault        = true;                                                                //nastala chyba pri validovani
                faultmessage = ex.Reason.ToString() + ((ex.Detail != null)? ex.Detail.Message:" "); //uloz si zpravu i sp pripadnym detailem
                throw;                                                                              //vyhod vyjimku znovu
            }
            catch (ArgumentException e)                                                             //nejaka chyba v parametrech
            {
                faultmessage = e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Wrong simulation parameters: " + e.Message), new FaultReason("Wrong simulation parameters."));
            }
            catch (KeyNotFoundException e) //nastava v pripade pouziti neexistujiciho algoritmu-identifikatoru
            {
                faultmessage = "Simulation algorithm  invalid ID " + e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Invalid algorithm ID in AlgorithmsToSimulate list."), new FaultReason("Simulation algorithm  invalid ID."));
            }
            catch (Exception e)//nemelo by nastavat
            {
                faultmessage = e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Unknown problem: " + e.Message), new FaultReason("Simulation algorithm unknown problem."));
            }
            finally
            {
                if (ConfigurationManager.AppSettings["LoggingSimulationService"].ToUpper() == "TRUE")//kdyz je logovani zapnuto
                {
                    Debug.WriteLine("LOGING:");
                    if (fault)//kdyz byla chyba
                    {
                        //osetreni situace kdy neni ani zadan uzivatel
                        string user = (sparams != null && sparams.User != null && sparams.User.ID != null) ? sparams.User.ID : "UNKNOWN"; //nemusel byt zadan uzivatel
                        Debug.WriteLine("Fault " + user + " : " + faultmessage);
                        MSPGeneratorServicesLog.WriteActionFault(user, "DoSimulation", faultmessage);                                     //loguj akci a chybu
                    }
                    else//kdyz chyba nebyla
                    {
                        Debug.WriteLine("Succes");
                        MSPGeneratorServicesLog.WriteSimulationActionSuccess(sparams.User.ID, "DoSimulation", sparams);//loguj akci
                    }
                }
            }
            return(null);
        }