====== HaQuNa ======
HeaRTDroid Query Notation is a simple language that can be used in an interactive commandline shell to load, modify, run HMR+ models.
Source code can be downloaded from [[https://bitbucket.org/sbobek/heartdroid/downloads|HeaRTDroid repository]]
Most recent release can be downloaded from here {{:pub:software:heartdroid:tutorials:haquna-1.0.7.jar|HaQuNa}} v. 1.0.7.
You should have at least Java 7 to run HaQuNa.
===== Interactive mode =====
To run HaQuNa in interactive mode go to the directory where you saved ''haquna.jar'' and type in console
java -cp haquna.jar:. haquna.HaqunaMain
===== Non-interactive mode=====
====Running scripts====
You can run a script, which is a set of commands in HQN notation in non-interactive mode.
To run a script that will printout the result to standard output run:
java -cp haquna.jar:. haquna.HaqunaMain script.hqn
If you wish to run a script, but after that open a console, run
java -cp haquna.jar:. haquna.HaqunaMain --console (or -c) script.hqn
====Running inference mode====
HaQuNa allows you to run inference for selected models from bash.
The result of the reasoning will be printed to standard output.
The command-line options of HaQuNa are presented below
java -cp haquna.jar:. haquna.HaqunaMain --model model.hmr \
--tables ['Table1','Table2'] \ # mandatory only for foi
--inference [ddi|gdi|foi] \ # optional, default = ddi
--initial-state [att-name=value, att-name=value] \ # optional
--conflict-resolution [all|last|first] \ # optional, default first
--tokens [on|off] \ # optional, default off
--uncertainty [on|off] # optional, default on
===== Language specification =====
====Loading model from file====
myModel = new Model('model.hmr')
====Loading model from URL====
myModel = new Model('http://example.com/model.hmr')
====Saving model to file====
myModel.save('/path/to/file/')
====Running inference====
* With WorkingMemory object that stores initial state passed as a parameter:myModel.run(wm, //optional parameters//)
* Without WorkingMemory (initial state has to be loaded by attributes' callbacks): workinMemory = myModel.run(//optional parameters//)
* Optional parameters may be arbitrary permutation of the following
* Inference strategy: inference=gdi|ddi|foi // default ddi
* Token passing: tokens=on|off // default on
* Uncertainty handling with CF algebra: uncertainty=on|off // default on
* Conflict resolution strategy: conflict_resolution=first|last|all // default first
* List of tables to process: tables=['tableName1','tableName2', ...] // mandatory only for foi mode
* Examples:
* myModel.run(wm, inference=gdi, tables=['Table3'])
* wm = myModel.run(inference=foi, tables=['Table1','Table2','Table3'])
====Running scripts====
For details on running scripts see [[#non-interactive_mode|Non-interactive mode]]
load('script.hqn')
====Getters for model objects====
* List all the tables in XTT2 model: myModel.showTablesList()
* List all attributes names form XTT2 mdoel: myModel.showAttributesList()
* List all types from XTT2 model: myModel.showTypesList()
* Getting XTT2 table from a model: myTab = myModel.getTableByName('name')
myTab = myModel.getTableById('id')
* Getting attribute from a model: myAttr = myModel.getAttributeByName('name')
myAttr = myModel.getAttributeById('id')
* Getting type from a model:myType = myModel.getTypeByName('name')
myType = myModel.getTypeById('id')
====Getters for particular elements of XTT2 model====
* For Attribute objects:
* myAttr.show()
* myType = myAttr.getType()
* myCallback = myAttr.getCallback()
* For Type objects: myType.show()
* For Table objects:myTab.show()
myRule = myTab.getRuleByName('name')
myRule = myTab.getRuleById('id')
* For Rule objects:myRule.show()
* For Callback objects: myCallback.show()
====Creating components====
* Types: newType = new Type('hmrCode')
* Attributes: newAttr = new Attribute('hmrCode')
* Tables: newTab = new Table('hmrCode');
* Rules: newRule= new Rule(<'hmrCode');
====Modifying XTT2 model====
Original model stays intact
* Adding components:
* Types: newModel = oldModel.add(myType)
* Attributes: newModel = oldModel.add(myAttr)
* Tables: newModel = oldModel.add(myTable)
* Rules: newModel = oldModel.add(myRule)
* Removing components:
* Types: newModel = oldModel.remove('typeName')
* Attribtues: newModel = oldModel.remove('attrName')
* Tables: newModel = oldModel.remove('tabName')
* Rules: newModel = oldModel.remove('ruleName')
====State management via Working Memory object====
* Creating Working Memory object: wm = new WorkingMemory(myModel)
* Getting all values of attributes stored by WM: wm.showValueOf('attrName')
* Setting values of attributes stored in WM (the value after **#** represents a certainty factor assigned to the value): wm.setValueOf('attrName','attrValue')
wm.setValueOf('attrName','attrValue#cf')
* Getting attribute value from a given point in history: WM.showValueOf('attrName', -1h)
* Printing current state (current values of all attributes): wm.showCurrentState()