static void Main(string[] args) { //test funkcnosti iteratoru pres algoritmy foreach (var item in AlgorithmFactory.Algorithms) { item.AssignCase(); } //test funkcnosti iteratoru pres popisy algoritmu foreach (var item in AlgorithmFactory.Descriptions) { Console.WriteLine(item); } try { AlgorithmFactory.GetSelectionAlgorithm(1).AssignCase(); AlgorithmFactory.GetSelectionAlgorithm(10).AssignCase(); } catch (KeyNotFoundException e) { Console.WriteLine("Exception OK: {0}", e.Message); } Console.ReadKey(); }
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 }
/// <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); }