You are here

Parte 09 - Advanced Customization Tutorial

DEFINIÇÕES INICIAIS

 
Nesta parte dos tutoriais, primeiramente são apresentadas algumas terminologias básicas do Clarion, importantes para as customizações que serão discutidas:
 
  • Componente: objetos funcionais (internos) que definem como os níveis superior e inferior de cada subsistema opera. Todos derivam da classe "Clarion.Framework.Templates.ClarionComponent".
  • Componente implícito: componentes dos níveis inferiores. Todos derivam da classe "Clarion.Framework.Templates.ImplicitComponent".
  • Regra: componentes dos níveis superiores, sendo que todos derivam da classe "Clarion.Framework.Templates.Rule".
  • Impulso (Drives): Todos componentes do nível inferior do MS derivam da classe "Clarion.Framework.Templates.Drive".
  • Módulo: contidos pelo MCS, o qual não é exatamente um subsistema, uma vez que não possui diretamente níveis superior e inferior sendo, ao contrário, um container para os módulos. Estes, por sua vez, contém níveis superior e inferior, agindo como "mini" ACSs, como já comentado. Todos eles derivam da classe "Clarion.Framework.Templates.MetaCognitiveModule".
 
 
Na sequência, o tutorial descreve os requisitos específicos de cada subsistema. Toda essa informação cria a base para o que foi chamado de customização avançada, onde é possível criar novos elementos de cada um dos tipos descritos acima, desde que respeitados os requisitos descritos a seguir:
 
ACS
 
. Definido pela classe "ActionCenteredSubsystem";
. Todos componentes do nível inferior tem que derivar da classe "ImplicitComponent".
. Componentes do nível superior podem derivar das classes "RefineableActionRule", "IRLRule" ou "FixedRule".
 
NACS
 
. Definido pela classe "NonActionCenteredSubsystem";
. Todos componentes do nível inferior também devem derivar da classe "ImplicitComponent".
. Os componentes do nível superior devem derivar da classe "AssociativeRule".
 
MS
 
. Definido pela classe "MotivationalSubsystem";
. O nível inferior espera componentes derivados da classe "Drive" a qual, por sua vez, é "wrapper" de um objeto "ImplicitComponent".
. Seu nível superior não contém componentes, armazenado as METAS, dentro da "Goal Structure".
 
 
MCS
 
. Definido pela classe "MetaCognitiveSubsystem";
. Todos os componentes do seu nível inferior devem derivar da classe "ImplicitComponent".
. Os componentes do seu nível superior devem derivar da classe "RefineableActionRule".
 
 

INTERFACES E TEMPLATES PARA CUSTOMIZAÇÃO

 
Já focando atividades de customização, existem uma série de interfaces no Clarion que determinam funcionalidades que os componentes executam e, por sua vez, podem compor novos componentes customizados; o tutorial lista algumas dessas interfaces, indicando através de uma QUESTÃO, quais funcionalidades elas definem:
 
  • Seu componente é treinável? Se for, devem implementar a interface "ITrainable";
  • Seu componente pode ser treinado através de "reinforcement learning"? Se sim, deve implementar a interface "IReinforcementTrainable";
  • Seu componente utiliza "Q-learning"? Se sim, deve implementar "IUsesQLearning";
  • Seu componente mantém estatísticas de correspondências positivas/negativas? Se sim, implemente "ITracksMatchStatistics";
  • Seu componente pode ser apagado pelo sistema? Se sim, deve implementar "IDeletable";
 
Vale também ressaltar que no Clarion existem muitos componentes que implementam várias das interfaces e podem ser utilizados como uma versão padrão das mesmas. Um exemplo é a classe "TrainableImplicitComponent", que implementa a interface "ITrainable".
 
 
 

REQUISITOS PARA IMPLEMENTAÇÃO DE UMA CLASSE CUSTOMIZADA

 
Para a implementação de componentes customizados, existem 3 requisitos essenciais que devem ser cumpridos por todos:
 
  1. Deve existir uma classe "Factory", a ser utilizada pelo "AgentInitializer" para gerar uma instância do componente.
  2. Deve existir uma classe "Parameters", que deverá armazenar itens que possibilitem um ajuste fino do funcionamento do componente.
  3. O componente deve possuir um método "Commit()" - para associar o componente às estruturas de seu subsistema - e um método "Retract()" - para desativar o componente, permitindo que seja alterado.
 
 
Um ponto interessante de observar é que, a partir desses 3 requisitos, o funcionamento dos componentes JÁ EXISTENTES é também detalhado.
 
 

Implementando uma classe "Factory"

 
 
Uma nova classe "Factory" deve implementar uma das seguintes interfaces, onde "<T>" é a classe sendo criada:
  • IimplicitComponentFactory<T> - para objetos "ImplicitComponent"
  • IActionRuleFactory<T> - para objetos "ActionRule"
  • IAssociativeRuleFactory<T> - para objetos "AssociativeRule"
  • IDriveFactory<T> - para objetos "Drive"
 
É indicado que as classes "Factory" sejam um sigleton, criado como uma classe estática interna, dentro da classe do novo componente.
 
 
 
 
Para receber os parâmetros de criação do componente, via "AgentInitializer", a implementação da "Factory" deve fazer uso da funcionalidade de parâmetros dinâmicos do C# no método "Generate()" onde, internamente, deverá ser feito o "parsing" dos parâmetros, reconhecidos pelo seu tipo:
 
 
 
 
Um detalhe importante é, através desse método, não é possível passar 2 parâmetros de mesmo tipo.
 
A indicação fornecida é que o método "Generate()" deve lançar exceções sempre que houver problemas com os parâmetros fornecidos.
 
É possível considerar parâmetros OPCIONAIS, como por exemplo a especificação de um delegate "EligibilityChecker", conforme discutido na parte anterior do tutorial.
 
Por fim, durante o método "Generate()", é importante listar todos os parâmetros de inicialização recebidos dentro do elemento "ClarionComponent.FactoryParameters"; com isso o sistema torna-se capaz de gerar "clones" a partir dessa classe - por exemplo durante o processo de refinamento de uma regra - passando todos os parâmetros necessários.
 
 

Implementação da classe "Parameters"

 
Essa classe deve armazenar todos os parâmetros de ajuste de funcionamento de um componente - diferentes dos parâmetros de inicialização - permitindo o seu controle externo, conforme visto na parte 4 do tutorial.
 
Todo componente padrão do Clarion possui uma instância global (estática) da sua classe "Parameters" correspondente, além de uma instância local, correspondente a cada objeto criado; também conforme já visto, os valores da instância global são utilizados para inicializar a instância local de cada novo objeto do componente.
 
A instância global da classe "Parameters" é opcional; já a instância local é obrigatória.
 
De forma semelhante à classe "Factory", existe a recomendação que uma classe "Parameters" seja interna à classe do novo componente.
 
 
 
A classe "Parameters" de um novo componente deve SEMPRE derivar da classe "Parameters" do componente base, uma vez que é necessário que todos os parâmetros da classe "pai" sejam incluídos.
 
 
A instância local da classe "Parameters" deve ser criada ao mesmo tempo que uma nova instância do componente; isso pode ser feito em 2 momentos:
 
1. No construtor do componente:
 
 
 
2. No método "Generate()" da "Factory":
 
 
 
A segunda opção é preferida por possibilitar que uma instância da classe "Parameters" seja fornecida como parâmetro de entrada para a geração de um novo objeto, permitindo assim que parâmetros já ajustados sejam utilizados para criar novos objetos. Nesse caso, é importante que seja realizada uma CÓPIA dos valores armazenados na instância da classe "Parameters" fornecida como entrada, para evitar que duas instâncias do componente compartilhem uma mesma instância.
 
Uma última modificação para utilização da instância local da classe "Parameters" é a especialização da propriedade "Parameters" - herdada da classe "pai" - para que seja feita a conversão para a nova classe "Parameters", evitando assim a necessidade de "casting" explícito sempre que for ser utilizada para ajustes:
 
 
 

Implementando os métodos "Commit()" e "Retract()"

 
Ao ser criado um componente Clarion fica no estado "initializing", no qual ele ainda não está funcionalmente ativo para o agente. É preciso colocar o componente num estado "read-only" para que ele possa ser utilizado com segurança.
 
Os métodos "Commit()" e "Retract()" são os responsáveis por transicionar para e do estado "read-only"; ambos são herdados da classe template do componente, mas precisam ser especializados para incorporar todas as extensões do novo componente.
 
Em linhas gerais, o método "Commit()" tem o seguinte formato:
 
 
 
Já o método "Retract()" tem o seguinte formato:
 

 

 
 

SERIALIZAÇÃO

 
Embora não seja obrigatório, a implementação da serialização em componentes customizados permite que eles sejam armazenados e carregados; de fato, todos os componentes padrão do Clarion implementam essas funcionalidades.
 
 
 
 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer