using AIMA.Agent.Action; using AIMA.Agent.Percept; using System; using System.Collections.Generic; namespace AIMA.Agent.Environment { public abstract class EnvironmentBase : IEnvironmentViewNotifier, IEnvironment where T1 : IAction where T2 : IPercept { //protected LinkedHashSet envObjects = new LinkedHashSet(); //protected LinkedHashSet agents = new LinkedHashSet(); //protected LinkedHashSet views = new LinkedHashSet(); protected Dictionary, double> _performanceMeasures { get; init; } = new(); public IReadOnlyDictionary, double> ReadOnlyPerformanceMeasures => _performanceMeasures; public abstract IEnvironmentState GetCurrentState(); public abstract IEnvironmentState ExecuteAction(IAgent agent, T1 action); public abstract T2 GetPerceptSeenBy(IAgent agent); public virtual IList> GetAgents() { // Return as a List but also ensures the caller cannot modify //return new List>(agents); return null; } public virtual void AddAgent(IAgent agent) => AddEnvironmentObject(agent); public virtual void RemoveAgent(IAgent agent) => RemoveEnvironmentObject(agent); public virtual IList GetEnvironmentObjects() { //// Return as a List but also ensures the caller cannot modify //return new List(envObjects); return null; } public virtual void AddEnvironmentObject(IEnvironmentObject environmentObject) { //envObjects.Add(eo); if (environmentObject is IAgent) { //if (!agents.Contains(environmentObject as IAgent)) //{ // agents.Add(a); // this.updateEnvironmentViewsAgentAdded(a); //} } } public virtual void RemoveEnvironmentObject(IEnvironmentObject environmentObject) { //envObjects.Remove(eo); //agents.Remove(eo); } public virtual void Step() { //foreach (IAgent agent in agents) //{ // if (agent.isAlive()) // { // Action anAction = agent.execute(getPerceptSeenBy(agent)); // EnvironmentState es = executeAction(agent, anAction); // updateEnvironmentViewsAgentActed(agent, anAction, es); // } //} CreateExogenousChange(); } public virtual void Step(int n) { for (int i = 0; i < n; i++) { Step(); } } public virtual void StepUntilDone() { while (!IsDone()) { Step(); } } public virtual bool IsDone() { //foreach (Agent agent in agents) //{ // if (agent.isAlive()) // { // return false; // } //} return true; } public virtual double GetPerformanceMeasure(IAgent agent) { double? performanceMeasures = _performanceMeasures[agent]; if (!performanceMeasures.HasValue) { performanceMeasures = 0.0; _performanceMeasures[agent] = performanceMeasures.Value; } return performanceMeasures.Value; } public virtual void AddEnvironmentView(IEnvironmentView environmentView) { //views.Add(environmentView); } public virtual void RemoveEnvironmentView(IEnvironmentView environmentView) { //views.Remove(ev); } public virtual void NotifyViews(string msg) { throw new NotImplementedException(); } void CreateExogenousChange() { } void UpdatePerformanceMeasure(IAgent forAgent, double addTo) { } void UdateEnvironmentViewsAgentAdded(IAgent agent) { } protected virtual void UpdateEnvironmentViewsAgentActed(IAgent agent, T1 action, IEnvironmentState state) { } } }