package pikater;
import jade.content.ContentElement;
import jade.content.lang.Codec;
import jade.content.lang.Codec.CodecException;
import jade.content.lang.sl.SLCodec;
import jade.content.onto.Ontology;
import jade.content.onto.OntologyException;
import jade.content.onto.UngroundedException;
import jade.content.onto.basic.Action;
import jade.content.onto.basic.Result;
import jade.core.AID;
import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.NotUnderstoodException;
import jade.domain.FIPAAgentManagement.RefuseException;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.proto.AchieveREResponder;
import jade.proto.IteratedAchieveREInitiator;
import jade.util.leap.ArrayList;
import jade.util.leap.Iterator;
import jade.util.leap.List;
import java.util.Date;
import java.util.Vector;
import pikater.ontology.messages.Computation;
import pikater.ontology.messages.Compute;
import pikater.ontology.messages.Execute;
import pikater.ontology.messages.MessagesOntology;
import pikater.ontology.messages.Option;
import pikater.ontology.messages.Results;
import pikater.ontology.messages.Task;
public abstract class Agent_OptionsManager extends Agent {
/**
*
*/
private static final long serialVersionUID = -7210526529341802567L;
private Codec codec = new SLCodec();
private Ontology ontology = MessagesOntology.getInstance();
private String trainFileName;
private String testFileName;
private Computation receivedComputation;
private String receiver;
private String computation_id;
private String problem_id;
private String start;
protected float error_rate = (float) 0.3;
protected int maximum_tries = 10;
private int task_i = 0; // task number
private long timeout = -1;
boolean working = false;
boolean finished = false;
protected pikater.ontology.messages.Evaluation evaluation;
protected List Options;
protected pikater.ontology.messages.Agent Agent;
private ACLMessage msgPrev = new ACLMessage(ACLMessage.FAILURE);
private boolean sendAgain = false;
protected abstract String getAgentType();
protected abstract boolean finished();
protected abstract void generateNewOptions(
pikater.ontology.messages.Evaluation result);
private class ComputeComputation extends IteratedAchieveREInitiator {
/**
*
*/
private static final long serialVersionUID = -138067991593729776L;
private List results = new ArrayList();
public ComputeComputation(Agent a, ACLMessage request) {
super(a, request);
System.out.println(a.getLocalName()
+ ": ComputeComputation behavior created.");
}
// Since we don't know what message to send to the responder
// when we construct this AchieveREInitiator, we redefine this
// method to build the request on the fly
@Override
protected Vector prepareRequests(ACLMessage request) {
// Klara's note: this method is called just once at the beginning of
// the behaviour
// Retrieve the incoming request from the DataStore
String incomingRequestKey = ((AchieveREResponder) parent).REQUEST_KEY;
ACLMessage incomingRequest = (ACLMessage) getDataStore().get(
incomingRequestKey);
// System.out.println("Agent "+getLocalName()+": Received action: "+incomingRequest.getContent()+". Preparing response.");
try {
ContentElement content = getContentManager().extractContent(
incomingRequest);
if (((Action) content).getAction() instanceof Compute) {
Computation computation = ((Compute) ((Action) content)
.getAction()).getComputation();
receivedComputation = computation;
Agent = computation.getAgent();
Options = Agent.getOptions();
trainFileName = computation.getData().getTrain_file_name();
testFileName = computation.getData().getTest_file_name();
receiver = computation.getAgent().getName();
computation_id = computation.getId();
error_rate = computation.getMethod().getError_rate();
maximum_tries = computation.getMethod().getMaximum_tries();
problem_id = computation.getProblem_id();
start = computation.getStart();
if (timeout < 0) {
timeout = System.currentTimeMillis()
+ computation.getTimeout();
}
}
} catch (UngroundedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CodecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OntologyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AID responder = new AID(receiver, AID.ISLOCALNAME);
// Prepare the request to forward to the responder
System.out.println("Agent " + getLocalName()
+ ": Forward the request to " + responder.getName());
ACLMessage outgoingRequest;
if (sendAgain) {
outgoingRequest = msgPrev;
} else {
outgoingRequest = newMessage(request);
}
msgPrev = outgoingRequest;
/*
* ACLMessage outgoingRequest = new ACLMessage(ACLMessage.REQUEST);
*
* outgoingRequest.setProtocol(FIPANames.InteractionProtocol.
* FIPA_REQUEST); outgoingRequest.addReceiver(responder);
* outgoingRequest.setContent(incomingRequest.getContent());
* outgoingRequest.setReplyByDate(incomingRequest.getReplyByDate());
*/
// System.out.println("Agent "+getLocalName()+": outgoingRequest: "+outgoingRequest);
// if (outgoingRequest.getPerformative() == ACLMessage.CANCEL){
// System.out.println("cancel hned na zacatku");
// storeNotification(ACLMessage.CANCEL);
// return null;
// }
Vector v = new Vector(1);
v.addElement(outgoingRequest);
return v;
}
@Override
protected void handleInform(ACLMessage inform,
java.util.Vector nextRequests) {
sendAgain = false;
System.out.println(getLocalName() + ": Agent "
+ inform.getSender().getName() + " sent a reply.");
ACLMessage msgNew = newMessage(inform);
nextRequests.add(msgNew);
storeTask();
if (finished() || finished) {
storeNotification(ACLMessage.INFORM);
}
msgPrev = msgNew;
// prepare the result to be added to results List:
// set the Evaluation
// ontology.messages.Evaluation evaluation = new
// ontology.messages.Evaluation();
// evaluation.setError_rate((float)result.errorRate);
// evaluation.setPct_incorrect((float)result.pctIncorrect);
}
@Override
protected void handleRefuse(ACLMessage refuse) {
System.out.println(getLocalName() + ": Agent "
+ refuse.getSender().getName()
+ " refused to perform the requested action");
if (System.currentTimeMillis() < timeout) {
doWait(200);
this.reset();
sendAgain = true;
addBehaviour(this);
} else {
finished = true;
storeNotification(ACLMessage.FAILURE);
}
}
@Override
protected void handleFailure(ACLMessage failure) {
sendAgain = false;
if (failure.getSender().equals(myAgent.getAMS())) {
// FAILURE notification from the JADE runtime: the receiver
// does not exist
System.out.println("Responder does not exist");
finished = true;
storeNotification(ACLMessage.FAILURE);
} else {
System.out.println("Agent " + failure.getSender().getName()
+ " failed to perform the requested action");
ACLMessage msgNew = newMessage(failure);
Vector v = new Vector(1);
v.addElement(msgNew);
String requestsKey = (this).ALL_NEXT_REQUESTS_KEY;
getDataStore().put(requestsKey, v);
storeTask();
if (finished() || finished) {
storeNotification(ACLMessage.INFORM);
}
msgPrev = msgNew;
}
}
private void storeTask() {
// get the Task from the last message
try {
ContentElement content = getContentManager().extractContent(
msgPrev);
if (((Action) content).getAction() instanceof Execute) {
Task task = ((Execute) ((Action) content).getAction())
.getTask();
task.setResult(evaluation);
results.add(task);
}
} catch (UngroundedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CodecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OntologyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void storeNotification(int performative) {
if (performative == ACLMessage.INFORM) {
System.out.println("Agent " + getLocalName()
+ ": computation executed successfully");
} else {
if (performative == ACLMessage.CANCEL) {
// there were no tasks to compute => send inform message
System.out.println("Agent " + getLocalName()
+ ": there were no tasks to compute.");
} else {
System.out.println("Agent " + getLocalName()
+ ": computation failed");
}
performative = ACLMessage.FAILURE;
}
// Retrieve the incoming request from the DataStore
String incomingRequestkey = ((AchieveREResponder) parent).REQUEST_KEY;
ACLMessage incomingRequest = (ACLMessage) getDataStore().get(
incomingRequestkey);
// System.out.println("Agent "+getLocalName()+"incomingRequestkey: "+incomingRequestkey);
/*
* // Prepare the notification to the request originator and store
* it in the DataStore ACLMessage notification =
* incomingRequest.createReply();
* notification.setPerformative(performative); String
* notificationkey = (String) ((AchieveREResponder)
* parent).RESULT_NOTIFICATION_KEY;
* getDataStore().put(notificationkey, notification);
*/
ACLMessage msgOut = incomingRequest.createReply();
msgOut.setPerformative(performative);
if (finished() || finished) {
// String incomingReplykey = (String) this.REPLY_KEY;
// ACLMessage incomingReply = (ACLMessage)
// getDataStore().get(incomingReplykey);
System.out
.println("Agent "
+ getLocalName()
+ " finished the goal, sending the results to the manager.");
// prepare the outgoing message content:
Results _results = new Results();
_results.setResults(results);
_results.setComputation_id(computation_id);
_results.setProblem_id(problem_id);
ContentElement content;
try {
content = getContentManager().extractContent(
incomingRequest);
Result result = new Result((Action) content, _results);
getContentManager().fillContent(msgOut, result);
} catch (UngroundedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CodecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OntologyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end if (finished())
// save the outgoing message to the dataStore
String notificationkey = ((AchieveREResponder) parent).RESULT_NOTIFICATION_KEY;
getDataStore().put(notificationkey, msgOut);
} // end storeNotification
ACLMessage newMessage(ACLMessage _result) {
ACLMessage msg;
if (_result != null) {
if (_result.getPerformative() != ACLMessage.FAILURE) {
ContentElement content;
try {
content = getContentManager().extractContent(_result);
// System.out.println(getLocalName()+": Action: "+((Result)content).getAction());
if (content instanceof Result) {
Result result = (Result) content;
if (result.getValue() instanceof pikater.ontology.messages.Evaluation) {
evaluation = (pikater.ontology.messages.Evaluation) result
.getValue();
}
}
} catch (CodecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OntologyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getLocalName() + ": Agent "
+ _result.getSender().getLocalName()
+ "'s errorRate was " + evaluation.getError_rate());
}
}
// System.out.println(getLocalName()+": error_rate "+error_rate+" maximum tries "+maximum_tries);
if (!(finished || finished())) {
if (Options != null) {
generateNewOptions(evaluation);
}
Agent.setOptions(Options);
System.out.println(getLocalName() + ": new options for agent "
+ receiver + " are " + Agent.optionsToString());
msg = new ACLMessage(ACLMessage.REQUEST);
msg.setLanguage(codec.getName());
msg.setOntology(ontology.getName());
msg.addReceiver(new AID(receiver, AID.ISLOCALNAME));
msg.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
// We want to receive a reply in 30 secs
msg.setReplyByDate(new Date(
System.currentTimeMillis() + 30000));
Execute execute = new Execute();
Task task = new Task();
String id = computation_id + "_" + task_i;
task_i++;
task.setId(id);
task.setComputation_id(computation_id); // TODO vzit z
// receivedComputation
task.setProblem_id(problem_id);
// task.setOptions(opt);
// Data data = new Data();
// data.setTrain_file_name(trainFileName);
// data.setTest_file_name(testFileName);
// task.setData(data);
task.setData(receivedComputation.getData());
task.setAgent(Agent);
task.setStart(start);
execute.setTask(task);
Action a = new Action();
a.setAction(execute);
a.setActor(myAgent.getAID());
try {
getContentManager().fillContent(msg, a);
} catch (CodecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OntologyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (Options == null || noMutableOptions()) {
finished = true;
}
} else {
msg = new ACLMessage(ACLMessage.CANCEL);
}
return msg;
} // newMessage
} // end class ComputeComputation
protected boolean registerWithDF() {
// register with the DF
DFAgentDescription description = new DFAgentDescription();
// the description is the root description for each agent
// and how we prefer to communicate.
description.setName(getAID());
// the service description describes a particular service we
// provide.
ServiceDescription servicedesc = new ServiceDescription();
// the name of the service provided (we just re-use our agent name)
servicedesc.setName(getLocalName());
// The service type should be a unique string associated with
// the service.s
String typeDesc = getAgentType();
servicedesc.setType(typeDesc);
// the service has a list of supported languages, ontologies
// and protocols for this service.
// servicedesc.addLanguages(language.getName());
// servicedesc.addOntologies(ontology.getName());
// servicedesc.addProtocols(InteractionProtocol.FIPA_REQUEST);
description.addServices(servicedesc);
// add "OptionsManager agent service"
ServiceDescription servicedesc_g = new ServiceDescription();
servicedesc_g.setName(getLocalName());
servicedesc_g.setType("OptionsManager");
description.addServices(servicedesc_g);
// register synchronously registers us with the DF, we may
// prefer to do this asynchronously using a behaviour.
try {
DFService.register(this, description);
System.out.println(getLocalName()
+ ": successfully registered with DF; service type: "
+ typeDesc);
return true;
} catch (FIPAException e) {
System.err.println(getLocalName()
+ ": error registering with DF, exiting:" + e);
// doDelete();
return false;
}
} // end registerWithDF
@Override
protected void setup() {
System.out.println(getLocalName() + " is alive...");
getContentManager().registerLanguage(codec);
getContentManager().registerOntology(ontology);
registerWithDF();
MessageTemplate template_inform = MessageTemplate.and(MessageTemplate
.MatchProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST),
MessageTemplate.MatchPerformative(ACLMessage.REQUEST));
AchieveREResponder receive_computation = new AchieveREResponder(this,
template_inform) {
@Override
protected ACLMessage prepareResponse(ACLMessage request)
throws NotUnderstoodException, RefuseException {
System.out.println("Agent " + getLocalName()
+ ": REQUEST received from "
+ request.getSender().getName() + ".");
// We agree to perform the action. Note that in the FIPA-Request
// protocol the AGREE message is optional. Return null if you
// don't want to send it.
System.out.println("Agent " + getLocalName() + ": Agree");
ACLMessage agree = request.createReply();
agree.setPerformative(ACLMessage.AGREE);
return agree;
} // end prepareResponse
};
receive_computation
.registerPrepareResultNotification(new ComputeComputation(this,
null));
addBehaviour(receive_computation);
} // end setup
private boolean noMutableOptions() {
Iterator itr = Options.iterator();
while (itr.hasNext()) {
Option next_option = (Option) itr.next();
if (next_option.getMutable()) {
return false;
}
}
return true;
}
private String getImmutableOptions() {
String str = "";
Iterator itr = Options.iterator();
while (itr.hasNext()) {
Option next_option = (Option) itr.next();
if (!next_option.getMutable() && next_option.getValue() != null) {
if (next_option.getData_type().equals("BOOLEAN")
&& next_option.getValue().equals("True")) {
str += "-" + next_option.getName() + " ";
} else {
str += "-" + next_option.getName() + " "
+ next_option.getValue() + " ";
}
}
}
return str;
}
}