mirror of
https://github.com/guilhermewerner/site-pi
synced 2025-06-16 22:04:22 +00:00
280 lines
9.6 KiB
Java
Vendored
280 lines
9.6 KiB
Java
Vendored
|
|
package com.mycompany.mavenproject1;
|
|
|
|
/*
|
|
* AffectEngine.java
|
|
*
|
|
* Copyright (c) 2005, 2006, 2007, 2008, Patrick Gebhard, DFKI GmbH
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* - Neither the name of the DFKI GmbH nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
import de.affect.emotion.Emotion;
|
|
import de.affect.emotion.EmotionType;
|
|
import de.affect.manage.AffectManager;
|
|
import de.affect.manage.event.AffectUpdateEvent;
|
|
import de.affect.manage.event.AffectUpdateListener;
|
|
import de.affect.mood.Mood;
|
|
import de.affect.xml.AffectOutputDocument;
|
|
|
|
import de.affect.xml.AffectInputDocument.AffectInput;
|
|
import de.affect.xml.AffectInputDocument.AffectInput.Character;
|
|
import de.affect.xml.AffectInputDocument.AffectInput.BasicEEC;
|
|
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
/**
|
|
* Provides the basic interface between Pogamut and ALMA.
|
|
*
|
|
* This code is based on the AffectEngine.java class provided with ALMA as an example
|
|
* implementation.
|
|
*
|
|
* @author Patrick Gebhard, Michal Bida
|
|
*/
|
|
public class ALMA implements AffectUpdateListener {
|
|
|
|
/** The agent this PogamutALMA instance is for. */
|
|
public EmotionalBot myAgent;
|
|
/** The ALMA Java implementation */
|
|
public static AffectManager fAM = null;
|
|
|
|
/** ALMA affect computation definition file */
|
|
private static String sALMACOMP = "./conf/AffectComputation.aml";
|
|
|
|
/** ALMA character definition file */
|
|
private static String sALMADEF = "./conf/CharacterDefinition.aml";
|
|
|
|
/** Current level time in seconds (contains also milliseconds after dot) */
|
|
public double currentTime;
|
|
|
|
/* ALMA mode:
|
|
false - output on console
|
|
true - graphical user interface CharacterBuilder
|
|
NOTE: No runtime windows (defined in AffectComputation or
|
|
AffectDefinition will be displayed!) */
|
|
private static final boolean sGUIMode = false;
|
|
/** Console logging */
|
|
public static Logger log = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
|
|
|
|
/**
|
|
* The constructor that sets up ALMA engine.
|
|
*
|
|
* @param agent
|
|
*/
|
|
public ALMA(EmotionalBot agent) {
|
|
// Starting the ALMA affect engine
|
|
myAgent = agent;
|
|
|
|
try {
|
|
|
|
//fAM = new AffectManager(sALMACOMP, sALMADEF, sGUIMode);
|
|
fAM = new AffectManager(ALMA.class.getClassLoader().getResourceAsStream(sALMACOMP), ALMA.class.getClassLoader().getResourceAsStream(sALMADEF), sGUIMode);
|
|
//disable alma logging
|
|
fAM.log.setLevel(Level.OFF);
|
|
fAM.addAffectUpdateListener(this);
|
|
|
|
} catch (IOException io) {
|
|
log.info("Error during ALMA initialisation");
|
|
io.printStackTrace();
|
|
System.exit(-1);
|
|
} catch (Exception xmle) {
|
|
log.info("Error in ALMA configuration");
|
|
xmle.printStackTrace();
|
|
System.exit(-1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Listens to affect updates computed by ALMA. This implements the AffectUpdateListener.
|
|
*
|
|
* Called each time something in ALMA is changed. In ALMA the affects are changing
|
|
* very often resulting in this method getting called very often as well.
|
|
*
|
|
* @param event
|
|
*/
|
|
public synchronized void update(AffectUpdateEvent event) {
|
|
AffectOutputDocument aod = event.getUpdate();
|
|
//nothing for now, logging?
|
|
}
|
|
|
|
/**
|
|
* Returns current mood for target agent.
|
|
*
|
|
* @param agentName
|
|
* @return
|
|
*/
|
|
public Mood getCurrentMood(String agentName) {
|
|
return fAM.getCharacterByName(agentName).getCurrentMood();
|
|
}
|
|
|
|
/**
|
|
* Gets all emotions for target agent, that are felt toward the elicitor provided.
|
|
*
|
|
* @param agentName
|
|
* @param elicitor
|
|
* @return
|
|
*/
|
|
public List<Emotion> getAllEmotionsForElicitor(String agentName, String elicitor) {
|
|
|
|
ArrayList<Emotion> emotionList = new ArrayList<Emotion>();
|
|
Emotion tempEm = null;
|
|
|
|
for (int j = 0; j < EmotionType.values().length; j++) {
|
|
|
|
//we get emotions one by one from ALMA history
|
|
tempEm = fAM.getCharacterByName(agentName).getEmotionHistory().getEmotionByElicitor(EmotionType.values()[j], elicitor);
|
|
if (tempEm != null) {
|
|
emotionList.add(tempEm);
|
|
}
|
|
}
|
|
|
|
return emotionList;
|
|
}
|
|
|
|
/**
|
|
* Gets emotion for target agent name of input type and for input elicitor.
|
|
*
|
|
* @param agentName
|
|
* @param elicitor
|
|
* @param type
|
|
* @return
|
|
*/
|
|
public Emotion getEmotionForElicitor(String agentName, String elicitor, EmotionType type) {
|
|
return fAM.getCharacterByName(agentName).getEmotionHistory().getEmotionByElicitor(type, elicitor);
|
|
}
|
|
|
|
/**
|
|
* Gets dominant emotion for the input agent.
|
|
*
|
|
* @param agentName
|
|
* @return
|
|
*/
|
|
public Emotion getDominantEmotion(String agentName){
|
|
return fAM.getCharacterByName(agentName).getCurrentEmotions().getDominantEmotion();
|
|
}
|
|
|
|
/**
|
|
* Gets the ALMA current emotions (in characters focus) for target agent.
|
|
*
|
|
* @param agentName
|
|
* @return
|
|
*/
|
|
public List<Emotion> getCurrentEmotions(String agentName) {
|
|
if (fAM.getCharacterByName(agentName) != null) {
|
|
return fAM.getCharacterByName(agentName).getCurrentEmotions().getEmotions();
|
|
} else {
|
|
return new ArrayList<Emotion>();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates an AffectInput document containing an BasicEEC Element and returns a AffectInput object
|
|
*
|
|
* @param actor
|
|
* @param desirability
|
|
* @param agency
|
|
* @param praiseworthiness
|
|
* @param appealingness
|
|
* @param liking
|
|
* @param likelihood
|
|
* @param elicitor
|
|
* @param realization
|
|
* @return
|
|
*/
|
|
public AffectInput createAffectInputBasicEEC(String actor,
|
|
double desirability, double praiseworthiness, double appealingness, double likelihood,
|
|
double liking, double realization, String elicitor, String agency) {
|
|
|
|
AffectInput aiInput = AffectInput.Factory.newInstance();
|
|
// Building the Character element
|
|
Character perfCharacter = Character.Factory.newInstance();
|
|
perfCharacter.setName(actor);
|
|
|
|
BasicEEC eec = BasicEEC.Factory.newInstance();
|
|
|
|
eec.setDesirability(desirability);
|
|
eec.setPraiseworthiness(praiseworthiness);
|
|
eec.setAppealingness(appealingness);
|
|
eec.setLikelihood(likelihood);
|
|
eec.setLiking(liking);
|
|
eec.setRealization(realization);
|
|
eec.setAgency((agency.toLowerCase() == "self") ? BasicEEC.Agency.SELF : BasicEEC.Agency.OTHER);
|
|
eec.setElicitor(elicitor);
|
|
|
|
aiInput.setCharacter(perfCharacter);
|
|
aiInput.setBasicEEC(eec);
|
|
|
|
return aiInput;
|
|
}
|
|
|
|
/**
|
|
* Creates an AffectInput document containing an BasicEEC Element and returns a AffectInput object
|
|
* This type eec element is constructed elsewhere
|
|
* @param actor
|
|
* @param eec
|
|
* @return
|
|
*/
|
|
public AffectInput createAffectInput(String actor, BasicEEC eec) {
|
|
|
|
AffectInput aiInput = AffectInput.Factory.newInstance();
|
|
// Building the Character element
|
|
Character perfCharacter = Character.Factory.newInstance();
|
|
perfCharacter.setName(actor);
|
|
|
|
aiInput.setCharacter(perfCharacter);
|
|
aiInput.setBasicEEC(eec);
|
|
|
|
return aiInput;
|
|
}
|
|
|
|
/**
|
|
* The <code>processAffectInput</code> passes instance of AffectInput to AffectManager
|
|
* event string is here just for logging
|
|
* @param ai
|
|
* @param event
|
|
*/
|
|
public void processAffectInput(AffectInput ai, String event) {
|
|
|
|
myAgent.getLog().warning("Name: " + ai.getCharacter().getName() + " Event: " + event + " ${symbol_escape}n" + myAgent.currentTime +
|
|
" Vars: D: " + ai.getBasicEEC().getDesirability() + "; P: " + ai.getBasicEEC().getPraiseworthiness() +
|
|
"; A: " + ai.getBasicEEC().getAppealingness() + "; Lh: " + ai.getBasicEEC().getLikelihood() +
|
|
"; Li: " + ai.getBasicEEC().getLiking() + "; R: " + ai.getBasicEEC().getRealization() +
|
|
"; Ag: " + ai.getBasicEEC().getAgency() + "; El.: " + ai.getBasicEEC().getElicitor());
|
|
|
|
fAM.processSignal(ai);
|
|
}
|
|
}
|
|
|
|
|