Este tutorial se inicia com uma definição rápida a respeito do modelo LIDA:
"O modelo LIDA é ao mesmo tempo uma modelagem conceitual do funcionamento de mentes e também um modelo computacional que possibilita o criação de arquiteturas de agentes autônomos" (p.2)
É frisado que o framework LIDA é atualmente apenas uma implementação parcial do modelo LIDA.
Na sequência o tutorial elabora mais a definição do modelo LIDA e faz a sua associação ao framework; nessa sequência, apresenta um resumo do ciclo cognitivo:
"Durante cada ciclo cognitivo, um agente LIDA primeiramente percebe a sua situação atual da melhor maneira possível, atualizando suas informações a respeito tanto do cenário EXTERNO quanto INTERNO. Através de um processo de competição, tal como especificado pela teoria da memória de trabalho global, o agente decide qual parcela da situação reconhecida precisa de maior atenção. A difusão dessa parcela da informação - que é reconhecida como sua consciência - habilita o agente a escolher e executar a ação mais apropriada, completando assim o ciclo, durante o qual ocorre o processo de aprendizagem." (pp 2-3)
Como justificativa da criação de um framework está o fato de que agentes de SW inteligentes podem ser extremamente complexos e um framework facilita esse processo, ao constituir um esqueleto de uma aplicação, o qual captura de uma forma genérica as principais funcionalidades. Um framework também promove a reusabilidade.
Algumas terminologias do LIDA Framework:
- Módulo: uma coleção coesa de dados e seus processos específicos de operação.
- Tarefa: pequeno algoritmo que executa repetitivamente, implementando um pequeno processo.
- Representações internas comuns: estruturas de dados internas.
- Gerenciador de tarefas: implementa a executa simultânea de tarefas.
- GUI configurável: utilizada para apresentar o estado interno dos processos de dados de um sistema.
- Fábrica (factory): onde são criados as estruturas de dados comuns.
- Estratégias (strategies): representam o encapsulamento de algoritmos comuns.
- Parser XML: para ler e criar um agente a partir de um arquivo XML que declara suas características.
Relação entre o modelo e o framework LIDA
São apresentados seguintes pontos relacionando o mdelo ao framework LIDA:
- O conceito de módulo é implementado pela interface FrameworkModule.
- Módulos particulares no modelo são normalmente representados por uma interface específica no framework.
- Processos relativos a módulos específicos são implementados como tarefas, as quais são implementações da interface FrameworkTask.
- O conceito de tempo é representado pela unidade tick do framework.
- A execução assíncrona do modelo é implementada pelo gerenciador de tarefas - TaskManager.
- Comunicação entre módulos é implementada através do uso de listeners - uso do design pattern observer - com o uso da interface ModuleListener.
- Nós e Links são implementados através de NodeStructures.
- O processo de ativação de nós, links e outros elementos do modelo LIDA é implementado através do uso da interface Activable.
Assim:
"O framework LIDA disponibiliza uma estrutura genérica pra criação de agentes, utilizando a arquitetura definida pelo modelo LIDA." (p.5)
Funcionalidades básicas do framework
. MODULES e LISTENERS
Dos muitos módulos que fazem parte do modelo Lida, o framework provê uma implementação default apenas para os módulos que são independentes do domínio do problema; para os módulos que tem uma dependência maior - como por exemplo o Environment e também a Sensory Memory - são fornecidos apenas interfaces.
Como mencionado anteriormente, Listeners são utilizados para implementar a comunicação entre módulos; um exemplo é a interface BroadcastListener, que deve ser implementada por módulos que desejam receber o broadcast das informações que chegam à consciência; esses módulos devem se adicionar ao GlobalWorkspace através do seu método "addBroadcastListener()".
Existe o conceito de módulos associados, que representam uma ligação ainda mais intensa entre módulos, permitindo que haja - por exemplo - a troca direta de informações. Módulos associam-se através do método "addAssociatedModule()" da interface FrameworkModule.
. TASK, TASKSPAWNERS e TASKMANAGER
As tarefas - tasks - são os processos do modelo LIDA; cada uma delas executa um algoritmo contido no seu método "runThisFrameworkTask()" e podem ser executadas uma única vez o repetidamente.
O gerenciador de tarefas - task manager - é o coração da engine de simulação do framework LIDA e cada agente possui o seu. Ele recebe as tarefas para executar enviadas pelos TaskSpawners associados a cada módulo, que são responsáveis pela geração das tarefas, registrando-as no gerenciador.
O ciclo de execução do TaskManager é o seguinte:
- "Envelhece" (Decay) todos os módulos
- Executa todas as tasks escalonadas/definidas para o TICK corrente e espera pelo fim da sua execução
A execução pode ser concorrente, dependendo to tamanho do POOL de threads e da quantidade de tasks escalonadas para o mesmo TICK.
- Atualiza a GUI
- Incrementa o TICK corrente
. NODES, LINKS and NODE STRUCTURES
Nós e links são as principais estruturas de dados do framework LIDA. Ambos possuem uma ATIVAÇÃO que representa o nível de excitação do elemento.
Um nó pode representar funcionalidades, objetos, eventos, conceitos, sensações, ações; todo nó é derivado do PamNode.
Um link associa nós a outros nós - no caso de um link simples - ou associam um nó a outro link - nesse caso, é chamado de link complexo.
Tanto nós quanto links podem ser especializados, permitindo sua customização.
Uma estrutura de nós - node structure - é uma representação em forma de grafo de conhecimento, capturado a partir de nós e links.
Quando um nó ou link é adicionado a um estrutura, é na verdade feita uma cópia - facilidade e flexibilidade para manipulação.
. ACTIVATION and STRATEGIES (design pattern)
Vários elementos do framework LIDA possuiem parâmetro de ativação: NODE(s), LINK(s), COALITION(s), CODELET(s), SCHEME(s), BEHAVIOR(s), entre outros. A ativação varia de [0.0 a 1.0].
Alguns elementos possuem também "base-level activation", utilizada para aprendizagem, representando a utilidade passada do elemento.
São definidas 2 interfaces - "Activatible" e "Learnable" - para implementar ambas ações - ativação e aprendizagem.
Elementos são normalmente removidos caso sua ativação caia abaixo de um limite ("removal threshold").
Ações de "excite()" e "decay()" - métodos da interface Activable - são facilmente configuráveis a partir de STRATEGIES correspondentes.
A versão corrente do framework não implementa algoritmos de aprendizado; métodos próprios podem ser feitos e devem manipular o "base-level activation".
. FRAMEWORK TOOLS
Algumas ferramentas adicionais do framework LIDA:
- "ElementFactory" - Implementa "Singleton" e "Factory" design patterns e deve ser utilizado para criar instâncias de muitos dos elementos do LIDA - NODES, LINKS, TASKS, STRATEGIES, etc.
- "Graphical User Interface (GUI)": Pode ser considerada a versão LIDA do "SOAR Debugger", mas com facilidades de configuração, manipuláveis dentro do próprio programa do agente.
INICIALIZAÇÃO DO FRAMEWORK
A inicialização do run-time do framework LIDA está num pacote específico - "initialization". A classe "AgentStarter": disponibiliza métodos para executar uma simulação; seu método "start()" executa os seguintes passos:
- Carrega arquivo com definições dos itpos de elementos dentro do "factory data file" - especificada pela propriedade "lida.elementfactory.data" do arquivo de configuração "lidaConfig.properties".
- Cria uma instância da classe "Agent", baseada nos conteúdos do "agent declaration file", especificada pela propriedade "lida.agentdata", também do arquivo de configuração "lidaConfig.properties".
- Cria a interface gráfica do framework, caso a propriedade "lida.gui.enable" seja "true", utilizando a configuração especificada nos arquivos "lida.gui.panel" e "lida.gui.commands".
- Carrega o agente.
- Carrega e apresenta a GUI.
ARQUIVO DE DECLARAÇÃO DO AGENTE
Classe "AgentXMLFactory" carrega o arquivo de declaração do agente; esse arquivo possui as seguintes TAGs de nível mais alto:
- <globalparams>: opcional, contém parâmetros utilizados durante o processo de inicialização do módulo.
- <taskmanager>: contém parâmetros de configuração do TaskManager.
- <taskspawners>: contém subtags do tipo <taskspawner> que declara os tipos de TaskSpawner disponíveis para uso do agente.
- <submodules>: definem classes e parâmetros necessários para criar os módulos do agente, através de subtags <modules>; opcionalmente, podem haver subtags <associatedmodule>, <initialtasks>, <initializerclass> ou mesmo <submodules>, definidos para uma tag <modules>.
- <listeners>: declaram os listeners que realizam conexões entre os módulos do agente.
ARQUIVO DE DEFINIÇÃO dos FACTORY DATA
Define os elementos Strategy, Node, Link e Task que serão adicionados ao ElementFactory; possui as seguintes TAGs de primeiro nível:
- <strategies>: define os tipos de Strategy - através de subtags <strategy> - que serão adiconados ao ElementFactory.
- <node>: define os tipos de Nodes (subtags <node>) que serão adicionados ao ElementFactory.
- <links>: define os tipos de Links (subtags <link>) que serão adicionados ao ElementFactory.
- <tasks>: define os tipos de Tasks (subtags <task>) que serão adicionados ao ElementFactory.