VHToolkit : PlistFileForCakeExample

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist>
<dict>
<key>question_format</key>
<string>edu.usc.ict.npc.editor.model.processor.text.TextProcessorProvider</string>
<key>recordingQuestions</key>
<false/>
<key>answer_format</key>
<string>edu.usc.ict.npc.editor.model.processor.text.TextProcessorProvider</string>
<key>answers</key>
<array>
<dict>
<key>text</key>
<string>I'm sorry but i didn't understand what you said. try rephrasing it.</string>
<key>ID</key>
<string>Anybody-1</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>23</integer>
</array>
<key>modified</key>
<date>2010-01-15T11:16:39Z</date>
</dict>
<dict>
<key>text</key>
<string>hello, how may i help you today?</string>
<key>speaker</key>
<integer>0</integer>
<key>ID</key>
<string>Anybody-2</string>
<key>tokens</key>
<array>
<integer>32</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:26:46Z</date>
</dict>
<dict>
<key>text</key>
<string>no problem</string>
<key>speaker</key>
<integer>0</integer>
<key>ID</key>
<string>Anybody-3</string>
<key>tokens</key>
<array>
<integer>32</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:34:59Z</date>
</dict>
<dict>
<key>text</key>
<string>bye</string>
<key>speaker</key>
<integer>0</integer>
<key>ID</key>
<string>Anybody-4</string>
<key>tokens</key>
<array>
<integer>32</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:35:28Z</date>
</dict>
<dict>
<key>text</key>
<string>Ok. Do you have cavities?</string>
<key>speaker</key>
<integer>0</integer>
<key>ID</key>
<string>Anybody-5</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>12</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:35:51Z</date>
</dict>
<dict>
<key>text</key>
<string>are you diabetic?</string>
<key>speaker</key>
<integer>1</integer>
<key>ID</key>
<string>Anybody-6</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>14</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:50:35Z</date>
</dict>
<dict>
<key>text</key>
<string>for you we will make only xylitol sweetened cakes. Is it ok?</string>
<key>speaker</key>
<integer>1</integer>
<key>ID</key>
<string>Anybody-7</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>13</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:50:43Z</date>
</dict>
<dict>
<key>text</key>
<string>for you we will make only xylitol sweetened cakes. Is it ok?</string>
<key>speaker</key>
<integer>3</integer>
<key>ID</key>
<string>Anybody-16</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>13</integer>
</array>
<key>modified</key>
<date>2010-01-15T14:40:27Z</date>
</dict>
<dict>
<key>text</key>
<string>sorry about that, thanks you for visiting us. Come back anytime.</string>
<key>speaker</key>
<integer>2</integer>
<key>ID</key>
<string>Anybody-8</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>11</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:51:06Z</date>
</dict>
<dict>
<key>text</key>
<string>what cake would you like? we can make sponge cakes and cheese cakes.</string>
<key>speaker</key>
<integer>2</integer>
<key>ID</key>
<string>Anybody-9</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>15</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:51:25Z</date>
</dict>
<dict>
<key>text</key>
<string>what cake would you like? we can make sponge cakes and cheese cakes.</string>
<key>speaker</key>
<integer>3</integer>
<key>ID</key>
<string>Anybody-17</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>15</integer>
</array>
<key>modified</key>
<date>2010-01-15T14:43:24Z</date>
</dict>
<dict>
<key>text</key>
<string>What flavor? for sponge cakes we have chocolate and amaretto.</string>
<key>speaker</key>
<integer>4</integer>
<key>ID</key>
<string>Anybody-10</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>16</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:52:13Z</date>
</dict>
<dict>
<key>text</key>
<string>what flavor? for cheese cakes we have chocolate and lemon.</string>
<key>speaker</key>
<integer>4</integer>
<key>ID</key>
<string>Anybody-11</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>17</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:52:53Z</date>
</dict>
<dict>
<key>text</key>
<string>Your chocolate sponge cake will be ready in 2 hours</string>
<key>speaker</key>
<integer>5</integer>
<key>ID</key>
<string>Anybody-12</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>11</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:53:22Z</date>
</dict>
<dict>
<key>text</key>
<string>Your amaretto sponge cake will be ready in 2 hours</string>
<key>speaker</key>
<integer>5</integer>
<key>ID</key>
<string>Anybody-13</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>11</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:53:46Z</date>
</dict>
<dict>
<key>text</key>
<string>Your lemon cheese cake will be ready in 1 hour</string>
<key>speaker</key>
<integer>6</integer>
<key>ID</key>
<string>Anybody-14</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>11</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:54:02Z</date>
</dict>
<dict>
<key>text</key>
<string>Your chocolate cheesecake will be ready in 1 hour</string>
<key>speaker</key>
<integer>6</integer>
<key>ID</key>
<string>Anybody-15</string>
<key>tokens</key>
<array>
<integer>32</integer>
<integer>11</integer>
</array>
<key>modified</key>
<date>2010-01-15T13:54:16Z</date>
</dict>
</array>
<key>questions</key>
<array>
<dict>
<key>text</key>
<string>Hi</string>
<key>ID</key>
<string>Anybody-1</string>
<key>modified</key>
<date>2010-01-15T13:26:30Z</date>
</dict>
<dict>
<key>text</key>
<string>thank you</string>
<key>ID</key>
<string>Anybody-2</string>
<key>modified</key>
<date>2010-01-15T13:34:52Z</date>
</dict>
<dict>
<key>text</key>
<string>bye</string>
<key>ID</key>
<string>Anybody-3</string>
<key>modified</key>
<date>2010-01-15T13:35:22Z</date>
</dict>
<dict>
<key>text</key>
<string>I want a cake</string>
<key>ID</key>
<string>Anybody-4</string>
<key>modified</key>
<date>2010-01-15T13:35:44Z</date>
</dict>
<dict>
<key>text</key>
<string>sponge</string>
<key>ID</key>
<string>Anybody-7</string>
<key>modified</key>
<date>2010-01-15T14:45:28Z</date>
</dict>
<dict>
<key>text</key>
<string>sponge cake</string>
<key>ID</key>
<string>Anybody-8</string>
<key>modified</key>
<date>2010-01-15T14:45:37Z</date>
</dict>
<dict>
<key>text</key>
<string>cheese</string>
<key>ID</key>
<string>Anybody-9</string>
<key>modified</key>
<date>2010-01-15T14:45:43Z</date>
</dict>
<dict>
<key>text</key>
<string>cheese cake</string>
<key>ID</key>
<string>Anybody-10</string>
<key>modified</key>
<date>2010-01-15T14:45:49Z</date>
</dict>
<dict>
<key>text</key>
<string>chocolate</string>
<key>ID</key>
<string>Anybody-11</string>
<key>modified</key>
<date>2010-01-15T14:47:35Z</date>
</dict>
<dict>
<key>text</key>
<string>lemon</string>
<key>ID</key>
<string>Anybody-12</string>
<key>modified</key>
<date>2010-01-15T14:47:41Z</date>
</dict>
<dict>
<key>text</key>
<string>amaretto</string>
<key>ID</key>
<string>Anybody-13</string>
<key>modified</key>
<date>2010-01-15T14:47:45Z</date>
</dict>
<dict>
<key>text</key>
<string>yes</string>
<key>ID</key>
<string>Anybody-5</string>
<key>modified</key>
<date>2010-01-15T14:32:46Z</date>
</dict>
<dict>
<key>text</key>
<string>no</string>
<key>ID</key>
<string>Anybody-6</string>
<key>modified</key>
<date>2010-01-15T14:35:10Z</date>
</dict>
</array>
<key>speakers</key>
<array>
<dict>
<key>lastName</key>
<string>vendor</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string>cake</string>
</dict>
<dict>
<key>lastName</key>
<string>cavities</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string> </string>
</dict>
<dict>
<key>lastName</key>
<string>xylitol</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string> </string>
</dict>
<dict>
<key>lastName</key>
<string>diabetes</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string> </string>
</dict>
<dict>
<key>lastName</key>
<string>type</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string>cake</string>
</dict>
<dict>
<key>lastName</key>
<string>cake flavor</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string>sponge</string>
</dict>
<dict>
<key>lastName</key>
<string>cake flavor</string>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.Person</string>
<key>firstName</key>
<string>cheese</string>
</dict>
</array>
<key>searcherSessions</key>
<array>
<dict>
<key>param</key>
<string>0.49709331642481164 0.8808003061324292 0.0010 0.29699850649249976 -1.8058107495307922</string>
<key>aid</key>
<integer>0</integer>
</dict>
<dict>
<key>param</key>
<string>0.8999999741398543 0.999999997563973 0.8999999741398543 0.8999999741398543 -1.3085108697414398</string>
<key>aid</key>
<integer>1</integer>
</dict>
<dict>
<key>param</key>
<string>0.8999999742585771 0.9999999977072687 0.8999999742585771 0.8999999742585771 -1.8693622946739197</string>
<key>aid</key>
<integer>2</integer>
</dict>
<dict>
<key>param</key>
<string>0.8999999744960228 0.9999999979938601 0.8999999744960228 0.25626726307281056 -2.20221483707428</string>
<key>aid</key>
<integer>3</integer>
</dict>
<dict>
<key>param</key>
<string>0.8620503530637958 0.9868696224315091 0.8997486643292193 0.8999999744960228 -2.254442572593689</string>
<key>aid</key>
<integer>4</integer>
</dict>
<dict>
<key>param</key>
<string>0.8302989202626794 0.9999900475280482 0.9390583245956934 0.07150816877095045 -1.7507293820381165</string>
<key>aid</key>
<integer>6</integer>
</dict>
<dict>
<key>param</key>
<string>0.5524046787378987 0.9999653615962392 0.0023938026832204563 0.00903824405943711 -2.0552018880844116</string>
<key>aid</key>
<integer>5</integer>
</dict>
<dict>
<key>param</key>
<string>0.8999999761581421 1.0 0.8999999761581421 0.8999999761581421 0.0</string>
</dict>
</array>
<key>trainingOnTestQuestions</key>
<false/>
<key>version</key>
<integer>4</integer>
<key>keepingLinkEstimatesUpdated</key>
<false/>
<key>map</key>
<array>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>0</integer>
<key>aid</key>
<integer>1</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>1</integer>
<key>aid</key>
<integer>2</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>2</integer>
<key>aid</key>
<integer>3</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>3</integer>
<key>aid</key>
<integer>4</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>4</integer>
<key>aid</key>
<integer>11</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>5</integer>
<key>aid</key>
<integer>11</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>6</integer>
<key>aid</key>
<integer>12</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>7</integer>
<key>aid</key>
<integer>12</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>8</integer>
<key>aid</key>
<integer>16</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>8</integer>
<key>aid</key>
<integer>13</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>9</integer>
<key>aid</key>
<integer>15</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>10</integer>
<key>aid</key>
<integer>14</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>11</integer>
<key>aid</key>
<integer>7</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>11</integer>
<key>aid</key>
<integer>6</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>11</integer>
<key>aid</key>
<integer>9</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>12</integer>
<key>aid</key>
<integer>8</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>12</integer>
<key>aid</key>
<integer>5</integer>
</dict>
<dict>
<key>value</key>
<integer>6</integer>
<key>qid</key>
<integer>12</integer>
<key>aid</key>
<integer>10</integer>
</dict>
</array>
<key>categories</key>
<array>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<false/>
<key>classifierCategory</key>
<false/>
<key>readOnly</key>
<true/>
<key>name</key>
<string>Train/Test</string>
<key>ID</key>
<string>train_test</string>
<key>tokens</key>
<array>
<dict>
<key>name</key>
<string>Training</string>
<key>ID</key>
<string>train</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>name</key>
<string>Test</string>
<key>ID</key>
<string>test</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<false/>
<key>questionCategory</key>
<true/>
<key>questionEditingAllowed</key>
<false/>
<key>answerColumnVisible</key>
<false/>
<key>questionColumnVisible</key>
<false/>
</dict>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<true/>
<key>classifierCategory</key>
<false/>
<key>readOnly</key>
<true/>
<key>name</key>
<string>Dialog State</string>
<key>ID</key>
<string>dialogState</string>
<key>tokens</key>
<array>
<dict>
<key>description</key>
<string>Do not change dialog state</string>
<key>name</key>
<string>none</string>
<key>ID</key>
<string>none</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>Add tokens for undefined categories to the state, do not change the existing categories</string>
<key>name</key>
<string>add</string>
<key>ID</key>
<string>add</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>Add tokens replacing existing category values</string>
<key>name</key>
<string>set</string>
<key>ID</key>
<string>set</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>Clear dialog state and then set it to given tokens</string>
<key>name</key>
<string>reset</string>
<key>ID</key>
<string>reset</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<false/>
<key>questionCategory</key>
<false/>
<key>questionEditingAllowed</key>
<false/>
<key>answerColumnVisible</key>
<false/>
<key>questionColumnVisible</key>
<false/>
</dict>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<false/>
<key>classifierCategory</key>
<false/>
<key>readOnly</key>
<true/>
<key>name</key>
<string>Tone</string>
<key>ID</key>
<string>tone</string>
<key>tokens</key>
<array>
<dict>
<key>name</key>
<string>Down</string>
<key>ID</key>
<string>down</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>name</key>
<string>Flat</string>
<key>ID</key>
<string>flat</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>name</key>
<string>Up</string>
<key>ID</key>
<string>up</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<false/>
<key>questionCategory</key>
<true/>
<key>questionEditingAllowed</key>
<false/>
<key>answerColumnVisible</key>
<false/>
<key>questionColumnVisible</key>
<false/>
</dict>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<false/>
<key>classifierCategory</key>
<false/>
<key>readOnly</key>
<true/>
<key>name</key>
<string>Emotion</string>
<key>ID</key>
<string>emotion</string>
<key>tokens</key>
<array>
<dict>
<key>name</key>
<string>Neutral</string>
<key>ID</key>
<string>neutral</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>name</key>
<string>Negative</string>
<key>ID</key>
<string>negative</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<false/>
<key>questionCategory</key>
<true/>
<key>questionEditingAllowed</key>
<false/>
<key>answerColumnVisible</key>
<false/>
<key>questionColumnVisible</key>
<false/>
</dict>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<true/>
<key>classifierCategory</key>
<true/>
<key>readOnly</key>
<true/>
<key>name</key>
<string>Toss</string>
<key>ID</key>
<string>toss</string>
<key>tokens</key>
<array>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>cake vendor</string>
<key>ID</key>
<string>cake vendor</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>  cavities</string>
<key>ID</key>
<string>  cavities</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>  xylitol</string>
<key>ID</key>
<string>  xylitol</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>  diabetes</string>
<key>ID</key>
<string>  diabetes</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>cake type</string>
<key>ID</key>
<string>cake type</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>sponge cake flavor</string>
<key>ID</key>
<string>sponge cake flavor</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>cheese cake flavor</string>
<key>ID</key>
<string>cheese cake flavor</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<true/>
<key>questionCategory</key>
<false/>
<key>questionEditingAllowed</key>
<false/>
<key>answerColumnVisible</key>
<true/>
<key>questionColumnVisible</key>
<false/>
</dict>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<true/>
<key>classifierCategory</key>
<false/>
<key>readOnly</key>
<false/>
<key>name</key>
<string>Type</string>
<key>ID</key>
<string>type</string>
<key>tokens</key>
<array>
<dict>
<key>description</key>
<string>alternative</string>
<key>name</key>
<string>alternative</string>
<key>ID</key>
<string>alternative</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>brushoff</string>
<key>name</key>
<string>brushoff</string>
<key>ID</key>
<string>brushoff</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>conceal</string>
<key>name</key>
<string>conceal</string>
<key>ID</key>
<string>conceal</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>content</string>
<key>name</key>
<string>content</string>
<key>ID</key>
<string>content</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>delayed</string>
<key>name</key>
<string>delayed</string>
<key>ID</key>
<string>delayed</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string></string>
<key>name</key>
<string>opaque</string>
<key>ID</key>
<string>opaque</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>pre repeat</string>
<key>name</key>
<string>pre repeat</string>
<key>ID</key>
<string>pre repeat</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>repeat</string>
<key>name</key>
<string>repeat</string>
<key>ID</key>
<string>repeat</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>toss</string>
<key>name</key>
<string>toss</string>
<key>ID</key>
<string>toss</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>unknown</string>
<key>name</key>
<string>unknown</string>
<key>ID</key>
<string>unknown</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>unrelated</string>
<key>name</key>
<string>unrelated</string>
<key>ID</key>
<string>unrelated</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>opening</string>
<key>name</key>
<string>opening</string>
<key>ID</key>
<string>opening</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>closing</string>
<key>name</key>
<string>closing</string>
<key>ID</key>
<string>closing</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
<dict>
<key>description</key>
<string>once</string>
<key>name</key>
<string>once</string>
<key>ID</key>
<string>once</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<true/>
<key>questionCategory</key>
<false/>
<key>questionEditingAllowed</key>
<true/>
<key>answerColumnVisible</key>
<true/>
<key>questionColumnVisible</key>
<true/>
</dict>
<dict>
<key>chatEditingAllowed</key>
<false/>
<key>answerCategory</key>
<true/>
<key>classifierCategory</key>
<false/>
<key>readOnly</key>
<false/>
<key>name</key>
<string>Speaker</string>
<key>ID</key>
<string>speaker</string>
<key>tokens</key>
<array>
<dict>
<key>name</key>
<string>brad</string>
<key>ID</key>
<string>brad</string>
<key>colorAsInt</key>
<integer>0</integer>
</dict>
</array>
<key>answerEditingAllowed</key>
<true/>
<key>questionCategory</key>
<false/>
<key>questionEditingAllowed</key>
<true/>
<key>answerColumnVisible</key>
<true/>
<key>questionColumnVisible</key>
<true/>
</dict>
</array>
<key>dialog_manager</key>
<dict>
<key>param</key>
<dict>
<key>useScriptFile</key>
<false/>
<key>storedScriptFileName</key>
<string>0</string>
<key>scriptText</key>
<string>// ============================================================================
// dm.java
// ============================================================================
//
//  Created by leuski on Aug 22, 2009.
//  Copyright (c) 2009 Anton Leuski. All rights reserved.
//
// ============================================================================


package edu.usc.ict.npc.editor.dialog.script.dm;

import edu.usc.ict.npc.editor.dialog.script.*
import java.awt.event.ActionListener
import java.awt.event.ActionEvent;
import javax.swing.Timer;
import com.leuski.af.Application;

class Global implements ActionListener {

	final static String	kConceal		= "conceal";
	final static String	kUnknown		= "unknown";
	final static String	kOpaque			= "opaque";
	final static String	kAlternative	= "alternative";
	final static String	kRepeat			= "repeat";
	final static String	kPrompt			= "prompt";

	final static String kCharacterIgnore		= 'ignore';
	final static Event	kInitiativeTimerEvent	= new Event(Event.kDispatchHint, "dm_prompt");
	final static int	kHistoryWindow			= 10;
	final static double	kWaitBeforePrompt		= 5; // seconds

	Engine	engine;
	String	domainName = null;

	Regular		regularState;
	State		currentState;

	Map&amp;lt;String,Object&amp;gt;		lastUtterance;
	Event 					lastSpeechEvent;
	boolean					microphoneEnabled;
	long					lastUserStartedSpeaking;
	long					lastUserStoppedSpeaking;
	long					lastCharacterStoppedSpeaking;
	long					lastCharacterStartedSpeaking;

	Global(Engine inEngine) {
		engine = inEngine;
	}

	public Set getPresentCharacters() {
		return (Set)engine.context.presentCharacters;
	}

	public void reset() {
		engine.reset();

		// initialize global variables here

		clear();

		regularState	= new Regular(this);

		enterState(regularState);
	}

	public void actionPerformed(ActionEvent e) {
		Timer	thisTimer	= (Timer)e.getSource();
		if (engine.context.initiativeTimer != thisTimer) {
			thisTimer.stop();
			return;
		}
		engine?.postEvent(kInitiativeTimerEvent);
	}

	public void clear() {
		engine.context.presentCharacters	= new HashSet();
		lastUtterance	= null;
		lastSpeechEvent	= null;

		Timer	timer	= new Timer(1000, this);	// This timer will periodically trigger executor events 
		timer.setRepeats(true);
		timer.start();
		engine.context.initiativeTimer = timer;
	}

	public void setMicrophoneEnabled(boolean inEnabled) {
		if (microphoneEnabled == inEnabled) return;
		microphoneEnabled	= inEnabled;
		engine.send(inEnabled ? "TO_ASR &amp;lt;start id=\"temp\"&amp;gt;" : "TO_ASR &amp;lt;stop id=\"temp\"&amp;gt;");
	}

	public void exitState(State inTarget) {
		inTarget?.onexit();
		engine.removeTrigger(inTarget);
	}

	public void enterState(State inTarget) {
		currentState	= inTarget;
		engine.addTrigger(inTarget);
		inTarget?.onentry();
	}

	public void transitionTo(State inTarget) {
		exitState(currentState);
		enterState(inTarget);
	}
}

Global	global			= new Global(engine);

public class State implements Trigger {

	Global 		global;

	Engine		getEngine() 				{ return global.engine; }

	State(Global inGlobal) {
		global	= inGlobal;
		global.setMicrophoneEnabled(true);
		global.setMicrophoneEnabled(false);
	}

	public boolean handle(Event event) {

		//Application.getLogger().warning(event.toString());
		//System.out.println(event);

		return false;
	}

	public boolean npcBehavior_done(Event event) {
		global.lastCharacterStoppedSpeaking	= System.currentTimeMillis();
		return false;
	}

	public boolean handleToss(Event event) {
		global.domainName 	= event.utterance.toss;
		global.lastSpeechEvent	= null;
		//Application.getLogger().warning("Toss to " + global.domainName);
		//System.out.println("Toss to " + global.domainName);
		return false;
	}

	public boolean npcBehavior_begin(Event event) {
		global.lastCharacterStartedSpeaking	= System.currentTimeMillis();
		if (event?.utterance?.toss)
			return handleToss(event);
		return false;
	}

	public boolean vrSpeech_start(Event event) {
		global.lastUserStartedSpeaking	= System.currentTimeMillis();
		return false;
	}

	public boolean vrSpeech_finished_speaking(Event event) {
		global.lastUserStoppedSpeaking	= System.currentTimeMillis();
		return false;
	}

	public boolean dm_prompt(Event event) {
//		long currentTime	= System.currentTimeMillis();
//
//		if (global.lastCharacterStartedSpeaking &amp;lt; global.lastCharacterStoppedSpeaking
//			&amp;amp;&amp;amp; global.lastUserStartedSpeaking &amp;lt; global.lastUserStoppedSpeaking
//			&amp;amp;&amp;amp; (currentTime - global.lastCharacterStoppedSpeaking) &amp;gt;= (Global.kWaitBeforePrompt * 1000)) {
//
//			List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; answers = engine.answersForCharacter(global.domainName).findAll( { Map&amp;lt;String,Object&amp;gt; utterance -&amp;gt;
//				utterance.type == Global.kPrompt }).toList();
//			if (!answers.isEmpty()) {
//				Collections.shuffle(answers);
//				send(leastRecent(answers, Global.kHistoryWindow));
//			}
//		}

		return false;
	}

	public Behavior send(Map&amp;lt;String,Object&amp;gt; inUtterance) {
		if (inUtterance != null) {
			if (inUtterance.script) {
				global.lastUtterance	= null;
				return engine.schedule(inUtterance);
			} else {
				global.lastUtterance	= inUtterance;
				Behavior	b	= engine.schedule(inUtterance);
				b.setLock(Behavior.kDefaultLock);
				return b;
			}
		}

		return engine.schedule(inUtterance);
	}

	protected Behavior sendRegular(Map&amp;lt;String,Object&amp;gt; inUtterance) {
		//Map&amp;lt;String,Object&amp;gt; b=inUtterance.clone();
		//Application.getLogger().warning(b.toString());
		//b.put("ID","Anybody-1");
		//Application.getLogger().warning(b.toString());
		return send(inUtterance);
	}

	public Map&amp;lt;String,Object&amp;gt; utteranceWithID(String inUtterance) {
		return (Map&amp;lt;String,Object&amp;gt;)engine.answers().find({Map&amp;lt;String,Object&amp;gt; utterance -&amp;gt; utterance.ID == inUtterance});
	}

	protected Map&amp;lt;String,Object&amp;gt; leastRecent(List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; inAnswers, int inDepth) {
		def selectedUtterance	= null;
		def	depth				= -1;
		for(a in inAnswers) {
			def d	= engine.seenRecently(a, inDepth);
			if (d &amp;gt; depth) {
				depth				= d;
				selectedUtterance	= a;
				if (depth &amp;gt;= inDepth) break;
			}
		}
		return selectedUtterance;
	}

	protected void onexit() { }
	protected void onentry() { }

}

public class Regular extends State {

	int offTopicCount	= 0;

	Regular(Global inGlobal) {
		super(inGlobal);
	}

	public boolean handle(Event event) {
		if (event.event == Event.kLockEventType &amp;amp;&amp;amp; event?.id == Behavior.kDefaultLock) {
			global.setMicrophoneEnabled(engine.executor.canAcquireLock(Behavior.kDefaultLock));
			return false;
		} else if (event.text) {
			return vrSpeech_asr_complete(event);
		} else {
			return super.handle(event);
		}
	}

	protected Behavior sendOfftopic() {
		++offTopicCount;
		return send(randomOfftopic());
	}

	protected Behavior sendRegular(Map&amp;lt;String, Object&amp;gt; inUtterance) {
		offTopicCount	= 0;
		return super.sendRegular(inUtterance);
	}

	private Map&amp;lt;String,Object&amp;gt; randomOfftopic(String inOfftopicType) {
		List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; answers = engine.answersForCharacter(global.domainName).findAll( { Map&amp;lt;String,Object&amp;gt; utterance -&amp;gt;
			utterance.type == inOfftopicType }).toList();
		if (answers.isEmpty())
			answers = engine.answersForCharacter(global.domainName).findAll( { Map&amp;lt;String,Object&amp;gt; utterance -&amp;gt;
				utterance.type == Global.kOpaque || utterance.type == Global.kUnknown || utterance.type == Global.kConceal }).toList();
		Collections.shuffle(answers);
		return leastRecent(answers, Global.kHistoryWindow);
	}

	private Map&amp;lt;String,Object&amp;gt; randomOfftopic() {
		String							offTopicType	= Global.kConceal;
		if (offTopicCount == 1) 		offTopicType	= Global.kOpaque;
		else if (offTopicCount == 2) 	offTopicType	= Global.kUnknown;
		return randomOfftopic(offTopicType);
	}

	public boolean vrSpeech_asr_complete(Event event) {
		if (!event.text || ((String)event.text).trim().length() == 0) return false;

		if (global.domainName == null)
			global.domainName	= (String)event.speaker;
		Application.getLogger().warning(global.domainName);

//		if (!global.isMicrophoneEnabled()) return false;

		try {
			List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; 	answersCl				= engine.search(global.domainName, event);
			//List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; 	answersDm				= engine.answersForCharacter(global.domainName);
			//List&amp;lt;String&amp;gt; answerDnFilter=answersDm.collect( { Map&amp;lt;String,Object&amp;gt; u -&amp;gt; u.ID}).toList();
			//Application.getLogger().warning(answerDnFilter.toString());
			//List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; 	answers=answersCl.findAll({Map&amp;lt;String,Object&amp;gt; u -&amp;gt; answerDnFilter.contains(u.ID)}).toList();
			List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; 	answers=answersCl;

			//Application.getLogger().warning(answers.toString());

			if (answers.isEmpty()) {
				sendOfftopic();
			} else {
				Map&amp;lt;String,Object&amp;gt;			selectedUtterance = (Map)answers[0];

				if (selectedUtterance.type == Global.kAlternative) {
					if (!global.lastSpeechEvent) {
						sendOfftopic();
					} else {
						offTopicCount	= 0;
						return vrSpeech_asr_complete(global.lastSpeechEvent);
					}
					return false;
				}

				if (selectedUtterance.type == Global.kRepeat) {
					if (!global.lastUtterance) {
						sendOfftopic();
					} else {
						sendRegular(global.lastUtterance);
					}
					return false;
				}

				global.lastSpeechEvent	= event;

				Map&amp;lt;String,Object&amp;gt; a=leastRecent(answers,Global.kHistoryWindow);
				//Application.getLogger().warning(a.get("domain"));
				//Application.getLogger().warning(a.toString());
				sendRegular(a);
			}

		} catch (Throwable t) {
			t.printStackTrace();
		}

		return false;
	}

}


global.reset();
</string>
<key>scriptEngineName</key>
<string>groovy</string>
</dict>
<key>class</key>
<string>edu.usc.ict.npc.editor.dialog.script.ScriptableDialogManager</string>
</dict>
<key>evaluationFrameworkProvider</key>
<dict>
<key>class</key>
<string>edu.usc.ict.npc.editor.model.EvaluationFrameworkProvider$MeanFScoreEvaluationFramework</string>
</dict>
<key>loggingConversations</key>
<false/>
</dict>
</plist>