BASIC AGENT
A primeira parte do tutorial foi um estudo de um agente simples, cuja tarefa era reconhecer um quadrado vermelho ou um circulo azul, quando desenhados numa área específica da tela; o reconhecimento deveria ser indicado com o pressionamento de um botão específico para cada elemento.
O estudo desse agente foi divido em 6 exercícios, cada um divido em algumas tarefas.
EXERCÍCIO 0
Tarefa 1: explorar o código fonte.
Simplesmente chama "AgentStarter.main(<argumentos de entrada>)"
- Classe "ColorFeatureDetector": extende "BasicDetectionAlgorithm"
- É o detector da característica cor, dentro do ambiente.
- Utiliza lista "smParams" para acessar os seus parâmetros definidos em "factoryData.xml".
- Sobrescreve o método "init()" para inicializar a cor procurada a partir dos seus parâmetros; usa o vermelho como valor default, caso não encontre uma definição.
- Sobrescreve o método "detect()" para buscar dentro do "sensoryMemory" - membro padrão de "BasicDetectionAlgorithm" - um elemento "visual", através do método "getSensoryContent()".
- Retorna ativação máxima (1.0) caso existe a cor procurada dentro do "sensoryMemory".
- Classe "ShapeFeatureDetector": também extende "BasicDetectionAlgorithm"
- É o detector das formas geométricas.
- Funcionamento similar ao do detector de cor.
- Sobrescreve o método "detect()" com seguinte algorítmo: recebe do "sensoryMap" tudo o que foi visto num bitmap e compara, ponto a ponto, cor do fundo - BRANCA - contabilizando quantos pontos viu de cor diferente. Faz a proporção de pontos não brancos que encontrou dentro de toda a área vista. Ativação máxima é indicada se essa proporção for equivalente à proporção esperada, configurada pelo parâmetro "area".
- Classe "ButtonEnvironmentPanel": define o painel gráfico do exercício:
- Classe "ButtonEnvironment": extende a "EnvironmentImpl", que é a implementação abstrada de "Environment" que, de acordo com a documentação LIDA, corresponde à:
"Especificação de domínios que o framework pode utilizar como um ambiente. Ambientes podem ser 'sentidos' e podem receber ações".
Assim, essa classe corresponde ao ambiente do agente.
- Possui um membro "BackgroundTask", que é uma extensão de "FrameworkTaskImpl" que é, por sua vez, a implementação padrão da interface "FrameworkTask" que, também pela documentação:
"This is the base interface for all task process in the LIDA framework. All parts of processes in the LIDA Framework have to implement this interface. A FrameworkTask is intended as a small fraction of a process."
Nesse caso sobrescreve o método "runThisFrameworkTask()" onde está a chamada de "driveEnvironment()", que corresponde ao ciclo do ambiente: gera randomicamente um circulo, quadrado ou deixa o espaço em branco.
- Acessa uma instância de "TaskSpawner" via membro de "FrameworkTaskImpl".
- Métodos "getState()" e "processAction()" são as interfaces para EXPORTAR o estado do ambiente e para REALIZAR as ações do agente.
- Classe "ButtonSensoryMemory": extende a classe "SensoryMemoryImpl", que é a implementação abstrata de "SensoryMemory" que, pela documentação:
"This is the interface to be implemented by sensory memory modules. Implementing modules sense the environment, store the sensed data and process it."
- Implementa o método "getSensoryContent()", utilizado pelos detectores; aqui fica claro o uso dos parâmetros "smParam" pelos detectores. "ColorFeatureDetector" busca a cor num ponto específico da imagem; "ShapeFeatureDetector" busca a imagem inteira.
- Método "runSensors()" chama "getState()" implementado por "ButtonEnvironment", também utilizando um hash "sensorParam" para definir o que está buscando.
EXERCÍCIO 1
As primeiras tarefas deste exercício explora a GUI do lida, com as seguintes operações:
- Tarefa 1: controle da execução via botão "Start/Pause";
- Tarefa 2: controle da execução via botões "Step mode" e "Run ticks";
- Tarefa 3: controle da velocidade de execução, via a definição de duração dos "ticks".
- Tarefa 4: controle do log: configuração de qual componente logar e de qual nível de log utilizar.
Já a Tarefa 5 lista os arquivos de configuração utilizados por uma simulação LIDA, na GUI listados na tab "Configuration Files".
EXERCÍCIO 2
Tarefa 1: uso da tab "PAM table" da GUI para checar as ativações que ocorrem em cada ciclo, e como elas vão decaindo durante os ciclos seguintes.
Tarefa 2: uso do painel "Perceptual Buffer" no GUI, onde está o grafo dos nós que fazem parte dele; é o processo de esquecimento (decay) dos nós no "Perceptual Buffer" que faz com que eles desapareçam
QUESTÃO 1.1: Em qual módulo do LIDA o "Perceptual Buffer" está? De onde os nós desse buffer vem? Como esses nós diferem dos nós em outros módulos?
O "Perceptual Buffer" está no Workspace; seus nós advém do PAM. Não está claro como eles diferem dos nós em outros módulos.
Tarefa 3: uso do painel "Global Workspace" da GUI
QUESTÃO 1.2: De onde vem as coalisões do "Global Workspace"? Para onde essas coalisões vão? Pense como a resposta para essas perguntas depende se estamos discutindo o modelo LIDA ou um agente específico utilizando o framework LIDA.
Do ponto de vista do modelo LIDA, as coalisões são ligações entre os nós que estão no "Perceptual Buffer", construídas pelos "attention codelets"; como resultado do processo de competição entre elas, a coalisão vencedora irá para o "Global Workspace", ou seja, atingirá a consciência. Uma vez no "Global Workspace", essas coalisões são difundidas por todos os demais módulos da arquitetura.
Analisando a implementação da arquitetura LIDA - essencialmente via a sua documentação - a geração das coalisões ocorre nas classes listadas no arquivo "basicAgent.xml", dentro da TAG "AttentionModule". Essas classes devem implementar a interface "AttentionCodelet"; no exemplo básico o agente utiliza a implementação default feita pela classe "BasicAttentionCodelet".
Durante o processo de difusão da consciência, as coalisões são repassadas para todas as classes que implementam a interface "BroadcastListener" e foram registradas no "Global Workspace" via método "GlobaWorkspace.addBroadcastListener()"; no caso do exemplo, nenhuma classe customizada recebe a difusão da consciência.
Task 4: Criação de um novo painel - "Current Situational Model"
QUESTÃO 1.3: Como que os conteúdos do "Current Situational Model" e "Perceptual Buffer" estão relacionados? E com os conteúdos da PAM? Pense como a resposta para essas perguntas depende se estamos discutindo o modelo LIDA ou um agente específico utilizando o framework LIDA.
O contéudo o "Perceptual Buffer" e do "Current Situational Model" são praticamente os mesmos; e ambos variam de acordo com o grau de ativação dos nós dentro da PAM. Pelas informações disponíveis não está clara qual a diferença entre eles.
EXERCÍCIO 3
Tarefa 1: análise inicial do arquivo "basicAgent_ex3.xml" - nele estão faltando algumas declarações que estavam presentes da versão anterior ("basicAgent.xml").
Tarefa 2: nesta tarefa é criado o módulo "Environment"; como não existe uma conexão - via "Listener" - entre a PAM e o "Workspace", nada é detectado.
Tarefa 3: nesta tarefa é criado o "Listener" para conectar a PAM e o "Workspace"; com o "Listener", os elementos "red" e "square" passam a serem detectados e copiados no "Workspace".
Tarefa 4: criação do "blueDetector" dentro da PAM; com a criação desse detector, o elemento "blue" passa a ser detectado.
Tarefa 5: criação do "circleDetector" dentro da PAM; neste ponto o elemento "circle" também passa a ser detectado; no entanto, não ocorre a ação de pressionar o botão 2.
Tarefa 6: criação do "AttentionModule"; é com esse "Attention codelet" que a combinação "blue + circle" é detectada e dispara o pressionamento do botão 2.
Outro ponto indicado neste exercício é o controle do log através do mecanismo padrão de "java.util.logging".
De acordo com essas descrições, ambas características controlam a velocidade global de atuação de um determinado elemento.
Neste exercício é feito o ciclo completo de criação de um detector de uma característica, de um attention codelet para essa característica, de um novo scheme de ações e da execução de uma nova ação.
Para este exemplo o objetivo é fazer com que o agente solte o último botão pressionado, no caso da tela estar vazia; o detector deve, então, reconhecer a tela vazia e criar um novo nó na PAM representando isso. O novo "attention codelet" deve reconhecer esse nó e levar esse fato à consciência. Deve haver na "Procedural Memory" um scheme que dispare a ação de soltar o botão e, por fim, na "Sensory-Motor memory" deve haver um nó que execute de fato essa ação.