package AgentProvider.Implementation; import AgentProvider.Implementation.Agents.*; import AgentProvider.Implementation.Database.AgentSettingsAccessor; import AgentProvider.Implementation.Database.PersistenceFactory; import AgentProvider.Interface.IAgentProvider; import AgentSystemPluginAPI.Contract.IStateActionGenerator; import AgentSystemPluginAPI.Services.IAgent; import AgentSystemPluginAPI.Services.LearningAlgorithm; import EnvironmentPluginAPI.Exceptions.TechnicalException; import ZeroTypes.Settings.SettingException; import java.io.File; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.UUID; class AgentProviderUseCase implements IAgentProvider, IAgentSettingUpdatedListener { private PersistenceFactory persistenceFactory; private Map<String, AgentSettingsAccessor> settings; private String agentSystemPath; public AgentProviderUseCase() { settings = new Hashtable<String, AgentSettingsAccessor>(); } @Override public void loadAgentSystem(String pathToAgentSystem) throws TechnicalException, SettingException { this.agentSystemPath = pathToAgentSystem; // rip off /<nameOfPlugin>.jar String path = pathToAgentSystem.substring(0,pathToAgentSystem.lastIndexOf(File.separator)); UUID randomPathExtension = UUID.randomUUID(); this.persistenceFactory = new PersistenceFactory(path + File.separator + randomPathExtension.toString()); } @Override public List<String> getAgents() throws TechnicalException { return persistenceFactory.getAgents(); } @Override public List<String> getAgentParameters(String agentName) throws TechnicalException { if(!settings.containsKey(agentName)) { settings.put(agentName, persistenceFactory.getAgentSettingsAccessor(agentName)); } return settings.get(agentName).getAgentParameterKeys(); } @Override public IAgent getTableAgent(String agentName, LearningAlgorithm learningAlgorithm, IStateActionGenerator stateActionGenerator) throws TechnicalException { IAgent agent = null; switch(learningAlgorithm) { case QLearning: agent = new QLearningAgent(agentName, persistenceFactory.getDictionary(agentName, "QValues", PersistenceType.Table), stateActionGenerator, this); break; case SARSA: agent = new SarsaAgent(agentName, persistenceFactory.getDictionary(agentName, "QValues", PersistenceType.Table), stateActionGenerator, this); break; case SARSALambda: agent = new SarsaLambdaAgent(agentName, persistenceFactory.getDictionary(agentName, "QValues", PersistenceType.Table), persistenceFactory.getDictionary(agentName, "EValues", PersistenceType.Table), stateActionGenerator, this); break; } return agent; } @Override public void setAgentParameter(String agentName, String key, float value) throws TechnicalException { if(!settings.containsKey(agentName)) { settings.put(agentName, persistenceFactory.getAgentSettingsAccessor(agentName)); } settings.get(agentName).setValue(key, value); } @Override public void onAgentSettingUpdated(IAgent agent, AgentSettingName agentSettingName, float value) { } }