/// <summary> /// Simulate the work on a specific task /// </summary> /// <param name="task"></param> public virtual float WorkOnTask(SymuTask task) { if (task is null) { throw new ArgumentNullException(nameof(task)); } float timeSpent; if (Schedule.Type == TimeStepType.Intraday) { timeSpent = Math.Min(Environment.MainOrganization.Models.Intraday, Capacity.Actual); } else { timeSpent = Cognitive.TasksAndPerformance.TasksLimit.LimitSimultaneousTasks // Mono tasking ? Math.Min(task.Weight, Capacity.Actual) // Multi tasking : Math.Min(task.Weight / 2, Capacity.Actual); } timeSpent = Math.Min(task.WorkToDo, timeSpent); task.WorkToDo -= timeSpent; if (task.WorkToDo < Tolerance) { SetTaskDone(task); } else { UpdateTask(task); } // As the agent work on task that requires knowledge, the agent can't forget the associate knowledge today ForgettingModel.UpdateForgettingProcess(task.KnowledgesBits); Capacity.Decrement(timeSpent); return(timeSpent); }