# IAGOの使い方
# 環境構築編
ここを参照しました
https://myiago.com/IAGO/installation.html
## 必要なもの
* Ant
* Tomcat
* IAGOのソースコード
* JDK
## 開発環境
この中のどれかが良いと思われる
* Eclipse
* IntelliJ
* VirtualBox(中でEclipseを動かすことになります)
## インストールなど
### Ant
brew install antで終了
ant -versionでバージョン確認できればOK
### Tomcat
Tomcatをインストール(tarファイルをダウンロード)
http://tomcat.apache.org/download-90.cgi
解凍したファイルを/usr/localに移動
* /usr/local/apache-tomcat-version/bin/start.shで開始
* /usr/local/apache-tomcat-version/bin/shutdown.shで終了
* /usr/local/apache-tomcat-version/bin/version.shでバージョン確認
homwbrewで入れる場合はbrew install tomcat
この場合は/usr/local/Cellar/tomcat以下にインストールされる
### IAGOのソースコード
ここのフォームから入手可能
https://myiago.com/IAGO/
1日後くらいにメールが届くのでリンクからダウンロードしましょう
解凍したら以下を行いましょう
* WebContent/WEB-INF/libにIAGO_Core.jarを追加する
* build.xmlの11行目をTomcatのlibまでのパスに修正する
homebrewで入れたなら/usr/local/Cellar/tomcat/バージョン/libexec/lib
### JDK
ここからOSにあったものをダウンロードして手順に従ってインストール
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
java -versionでバージョン確認できればOK
### Eclipse
Webで動作するアプリケーションを作成するのでJava EE Depeloperを選択する(普通のでもいいのかも)
http://www.eclipse.org/downloads/
日本語化のプラグインはこちら
ちなみにInelliJの日本語化も可能
http://mergedoc.osdn.jp/
ここでダウンロードしたzipファイルを解凍してsetup.appを実行すればOK
### IntelliJ
Webで動作するアプリケーションを作成するのでUltimate版をダウンロードしましょう
https://www.jetbrains.com/idea/download/#section=mac
Ultimate版は有償ですが学生は無料なので安心しましょう
ここから登録しましょう(ac.jpのアドレスで)
https://www.jetbrains.com/student/
### VirtualBox
ここからダウンロードできます
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp
## Eclipseでやる場合
### プロジェクトの作成
新規Java EE Webプロジェクトの作成
設定は特にいじらなくてOK!

EclipseのworkspaceにIAGO_Game_Edition内のsrc,WebContentのフォルダとbuild.xmlをコピー(上書きでOK)
コピーしたらプロジェクト名を右クリックしてリフレッシュ(F5でも可)
プロジェクトを右クリックしてビルドパスの構成を選択
外部JARの追加から以下のjarファイルを追加(これらのファイルはtomcat/バージョン/libexec/libの中にある)
* jsp-api.jar
* servlet-api.jar
* websocket-api.jar
設定(青い歯車)からサーバー→サーバー・ランタイム環境を選択し追加をクリック
自分がインストールしたTomcatのバージョンと合うものを選択し次へをクリック
インストールディレクトリは自分がインストールしたところ(binとかlibとかの親フォルダ)を参照して完了
homebrewで入れたなら/usr/local/Cellar/tomcat/バージョン/libexec

サーバのタブから使用可能なサーバがありません〜をクリック

特に変更しなくてもOKなので次へ
構成済みに追加して完了

### 実行
まずはサーバを起動する(サーバタブのボタンを押すかサーバ名を右クリックして選択)
こんな感じで始動済みになればOK

WebContent/start.jspを右クリックし実行→サーバで実行
既存のサーバを選択して完了

こんな感じで英文がつらつらでできたら成功!

英文を読んだら画面下部のContinueを押して質問に回答
MTurkIDを聞かれますが**DEMO**でOK(本当はなんでもいい)
またはWEBブラウザで
http://localhost:8080/プロジェクト名/start
と入力することでもこんな感じで同じ画面が出ます

## IntelliJでやる場合
### プロジェクトの作成
Javaエンタープライズを選択しWeb Applicationにチェックを入れる
アプリケーションサーバの新規からTomcatサーバを選択
Tomcatホームに自分がインストールしたところ(binとかlibとかの親フォルダ)を参照しOK
homebrewで入れたなら/usr/local/Cellar/tomcat/バージョン/libexec

プロジェクト名を適当に決めて完了
IntelliJのプロジェクトにIAGO_Game_Edition内のsrc,WebContentのフォルダとbuild.xmlをコピー(上書きでOK)
**WebContentのフォルダ名をwebに変更する必要あり**
ファイル→オブジェクト構造をクリック(command+;でも可)
ライブラリータブの追加(+のボタン)をクリックし以下のjarファイルを追加(これらのファイルはtomcat/バージョン/libexec/libの中にある)
* jsp-api.jar
* servlet-api.jar
* websocket-api.jar
**さらにweb/WEB-INF/lib/IAGO_Core.jarもライブラリーに追加**
ライブラリがこんな感じになればOK

### 実行
実行ボタン押してしばらくしてWEBブラウザにページが表示されたらOK

英文を読んだら画面下部のContinueを押して質問に回答
MTurkIDを聞かれますが**DEMO**でOK(本当はなんでもいい)
## VirtualBoxでやる場合
この場合はIAGO_Distrib_VMの中のファイルを使います
Linux Ubuntu(64bit)のOSを新規作成します(名前は適当でOK)

メモリーサイズは適当
仮想ハードディスクを追加しないを選択

設定のストレージタブのIDEコントローラを選択
ハードディスクを追加→既存ディスクを選択でIAGO_Distrib.vmdkを選択
こうなればOK

作成したOSを起動してEclipseを起動します
ここからはEclipseの実行方法で述べた方法と同じなので割愛します
もしpasswordを聞かれたら**iago**と入力すればOK
# エージェントの作り方編
エージェントの作り方はここを参照
https://myiago.com/IAGO/designTutorial.html
config.txtに各種設定が記載されている
このファイルはGameBridgeクラスで読み出される
agentに用いるエージェント,gamespecに用いるルールを記載
gamespecに複数指定すると左から順番に適用される
IAGOCoreVHのfirstgameとかの変数で初回かどうかを判断しているという感じ
IAGOCoreVHでは発生したイベントごとに処理を記述
## キャラクターの追加方法
web/img/配下にフォルダーを作成
各画像はフォルダー名_感情名にする必要あり
web/js/iago.jsのrequestAsyncInfoメソッド(主にSEND_EXPRESSION)のブロックにキャラクターの処理を記述する必要あり
## その他
## Offer
offer[問題の数][3]という構造
offer[][0]:Agentに割り当てられた個数
offer[][1]:割り当てられてない個数
offer[][2]:プレイヤーに割り当てられた個数
すなわちoffer[][1]が全て0ならfull offer
## IAGONiceExpression
getExpressionでは送信された感情に応じて文字列をreturn
getExpressionはIAGOCoreExpressionのサブクラスで実装されている
## IAGOBuildingBehavior
getFinalOfferではgetNextOfferを繰り返し呼ぶことで全てのアイテムを割り当てる
getNextOfferでは送信するOfferを作成する
割り当てられていない項目の中で両者にとって1番価値のあるアイテムはどれか調べる
プレイヤーの選好はgetMinimaxOrderingによって決定される
1番価値のあるアイテムが同じ場合は両者に1つずつ割り当てられる
残りが1つだった場合は相手に譲る
1番価値のあるアイテムが異なる場合は1番価値のあるアイテムがそれぞれに1つずつ割り当てられる
## AgentUtilsExtension
orderingsには予想されるプレイヤーの選好順序のリストが格納
preferenceにはプレイヤーの選好情報(a > b, a = bなど)が順に格納
getVHOrderingは設定された問題に対するAgentの選好の優先順位の配列を返す
例:鉄,バナナ,金,スパイスがそれぞれ1,3,2,4番目に好きな場合,[1, 3, 2, 4]が返される
reconcilContradictionsはプレイヤーの選好順序に矛盾がないか調べる
getMinimaxOrderingはAgentの選好を基にして推測値が最も大きくなる順位が返される
推測値=順位の差の総和とする
例:Agentの選好が[1, 3, 2, 4]の場合[4, 3, 2, 1]との推測値は(4 - 1)+(3 - 3)+(2 - 2)+(4 - 1)=6となる
**ループの中でvalueHeuristicを0にする処理を追加している(おそらくバグ?)**
## IAGOCoreVH
### GAME_START
ゲームが始まるときに何か処理を行う必要がある場合はここに記述(各変数の初期化など)
### SEND_EXPRESSION
相手から感情が送られてきたときの処理を記述
### FORMAL_ACCEPT
FORMAL_ACCEPTが行割れたときの処理を記述
### TIME
相手から何もアクションがないときに行われる処理を記述
時間がたつとOfferが送られるように見えるがgetTimingOfferはNULLを返すので何もOfferは行われない
残り30秒切るとgetFinalOfferが実行される
### SEND_OFFER
相手からOfferが送られたときの処理を記述
localFairの計算方法
現在のofferの効用>以前のacceptによってわりあてられた効用でかつ自分が新たに得られる効用(+マージン)>人間が新たに得られる効用であればlocalFairはtrue
自分の効用>人間の効用であればtotalFairはtrue
localFairもしくはtotalFairの条件式の右辺に正の値を足すことで徐々に妥協ラインを上げることができる(多分)
### SEND_MESSAGE
メッセージ(選好情報,会話文,Offerのaccept/reject)が送られたときの処理を記述
* 選好が表出された時の処理
矛盾があった場合はreconcilContradictionsが繰り返し呼ばれ矛盾がなくなるまで1番古い選好情報から順番に削除していく(dequeueによる操作のため)
例:スパイスがbest,鉄がworstという情報を与えたのち,金<鉄という情報を与えると今までの選好情報が削除され金<鉄という情報だけが保持される
* Why dont you~でOfferを作成するように依頼した時の処理
Offerを送信する
* AgentのOfferがaccept/rejectされた時
それぞれのブロックの中に処理が記述されているがgetAccept(Reject)OfferFollowupはNULLを返すためこのブロックの中ではほとんど処理は行われない
メッセージや感情が送信されるのはブロックの直前にあるEventによるものである
各感情と画像の対応はこちら
happy -- smile.png
angry -- angry.png
surprised -- surprise.png
disgusted -- disgust.png
afraid -- fear.png
sad -- sad.png
insincereSmile -- smallsmile.png
neutral -- neutral.png