SimProcedure GenerateSimGraph(StartSimulationViewModel model) { SimProcedures = GetSimProcedures(model.Procedures); SimResources = GetSimResources(model.Resources); CreateProceduresLinks(model.ProcLinks); CreateResourcesLinks(model.ProcResLinks); UpdateProceduresResParams(); var startProcedure = SimProcedures.SingleOrDefault(x => x.ProcedureKey == model.StartProcKey); return(startProcedure); }
void Simulate() { var isFinished = false; while (!isFinished) { StartProcedure.UpdateState(CurrentTime, Step); isFinished = SimProcedures.All(x => x.Status == ProcedureStatus.Finished); if (!isFinished) { CurrentTime += Step; } } }
SimulationHistory GetSimHistory() { var history = new SimulationHistory { Duration = CurrentTime, WaitingTime = SimProcedures.Sum(x => x.WaitingTime), TotalCost = SimResources.Sum(x => x.Resource.Price), Complexity = Complexity, Step = Step, DateTime = DateTime.Now, Resources = SimResources.Select(x => new ResourceHistory { ResourceName = x.Resource.ResourceName, ResourceId = x.Resource.ResourceId, Cost = x.Resource.Price, UseTime = x.ActiveTime.Sum(t => t.Item2 - t.Item1), Downtime = CurrentTime - x.ActiveTime.Sum(t => t.Item2 - t.Item1), UseHistory = x.ActiveTime.Select(t => new ResourceUseHistory { StartTime = t.Item1, EndTime = t.Item2 }).ToList(), }).ToList(), Procedures = SimProcedures.Select(x => new ProcedureHistory { ProcedureName = x.Procedure.Name, ProcedureAlias = x.Procedure.Alias, StartTime = x.StartTime, EndTime = x.EndTime, WaitingTime = x.WaitingTime, RandomEvents = x.SimRandomEvents.Where(e => e.IsHappened).Select(e => new RandomEventHistory { EventName = e.Event.EventName, EventAlias = e.Event.EventAlias, StartTime = e.TimeStart, EndTime = e.TimeEnd }).ToList() }).ToList() }; return(history); }