Autómatas y comportamiento inteligente. Las principales disposiciones del concepto (enfoque) Amosova N.M.





Continuando con uno de los temas planteados en la publicación de Alexander Ershov ( Ustas ) "Búsqueda visual de redes neuronales" , sugiero que los lectores de Habr se sumerjan en el mundo de N.M. Amosova, sui -modelos, redes M y autómatas. Espero que sean los candidatos más probables para el papel de la "bala de plata", que permitirá a los entusiastas de la "inteligencia fuerte" o, en otra terminología, la "inteligencia artificial", acercarse a la comprensión de las formas de su implementación.



() . « . », .. : A.M. , .. .. . , , « », , , , , , , — ( ) — « », .



, , « », .. — ...





, , , . – .

, (1973), , : , , . . — . , .. — , ( , , ). [3] (. , .. .. ). , , .. , , 1990-. , , , , , , « » . , . , , .. . , , .. , , , .



:



1. , . , , . , .. .



2. .. «M- ». , .



3. «» «» [3]. «» — [3].



4. . , .. . , , — .



5. - . :



– .

- ( ), – ( ).

, -.



5. ( ) , .



6. :



– .. ;

– .. ( ), ;

– «» «» — , «» .



1.





:



1. .



2. : , , .



3. , — , , .



4. — , , .



5. , , .



6. () , , .



1
, , , . .


7. , , . , «» «» , .



8. , ( , ), . , . - , .



9. .



10. ( ) .



11. , — « ».



12. ( ) - . .



13. .



14. . . , — . . , .



15. — (arousal, ). . , , , .



2
, , — .


16. , - , .



17. , — . , .



18. . , ( ) .



19. , , .



20. , .



21. — , .



22. , .



23. , - (). — .



24. ( ) . . , (), . , , , .



25. :



– ,

– (),

– , (),

– — , ().



« , , , » [3, . 57].



26. , , . ( ), . , «» .



27. , , , , .



28. , . , . , , , () .



29. , , , . () . , .



30. , - -. , , .. , . , , , , .



31. , :



– – ;

– ;

– .



32. , , , . , , .



, , — .



-



, .



— , . . . , , .





1. , , , -.



2. - , , i-.



3. i- .



4. i- , . - , .



5. - , , .



.



6. i- , , , .



6.1. i- , .



6.2. i- . i- , .



6.2.1. i- .



6.2.2. i- , Π, . j- i- t Πtj.



6.2.3. i- , i- .



7. i- , , . :



7.1. i - i- j i-.



7.2. i- , .



7.3. i- .



7.4. R, , , , .



, i- j i- i, t Rtij.



8. i- : -, , i- , , - — , i- .



9. Rtij Rtij=rij,˜rij,r(0)ij~,r(0)ij, rij,˜rij — , r(0)ij,˜r(0)ij — .



10. , Rtij, , , , i- i. rij,˜rij. , rij˜rij Rtij, — .



r(0)ijrij(1)





˜r(0)ij˜rij.(1)



.



10.1. Rtij=0 Rtij, .. 0.0,0.0,0.0,0.0.



10.2. , i-:



Rtij=R(Πti,Πtj,Rt1ij,Δt)(2)



Δt — -. i- . , - — -, . Δt. Δt .



10.3. t , Rtij=0. Rt1ij=0 Rtij>0, , t Rtij. , . (2) , ,



Rtij=R1(Πti,Πtj,Δt)(3)



(3) .



10.4. , . Rtij , t0 Rtij0 Πi=0 Πj=0.



rtij=r1(rt1ij,rt(0)ij)(4)



˜rtij=r2(˜rt1ij,˜rt(0)ij)(4)



(4) (4) , rtij ˜rtij, , .



rt(0)ij=r3(rt1(0)ij)(5)



˜rt(0)ij=r4(˜rt1(0)ij)(5)



, rt(0)ij ˜rt(0)ij . , . , t0, Rtij (« »). rtij ˜rtij rt(0)ij ˜rt(0)ij, , (1) , Rtij (5) (5), .. (« »).



10.5. Ei (˜Ei) i- i rtij (˜rtij) i- j- i- Πj. i- i- (Ei) (˜Ei) :



Ei=E(Πt1,Πt2,,rti1,rti2,...)(6a)



˜Ei=˜E(Πt1,Πt2,,˜rti1,˜rti2,...)(6)



11. i-.



11.1. i- , i- . i-, . i- .



11.2. i- i- . — i- θti, Eti i- i- t. — . (Kti), ˜Eti, (Kti). Kti θti , Kti.



11.3. , i- , :



Kti=Φ(Kti,˜Eti)(7)



11.4. , i- :



Πti=T(Pit1i,Kti)(8)



(8) i- « » i-.



11.4. , i- i- :



Πti=Π(Kti,θti,Eti)(9)



11.5. Kti θti i-:



θti=θ(θt1i,Πti)(10a)



Kti=K(Kti,Πti)(10)



(10) (10) , . , i-, , , («»). i- . i- , (10) (10) («»).



12. - i- .



12.1. - , , , , .



12.2. - :



i- ;

i- ;

C ;

i- ;

J i-.



— - .



12.3. - , . i- . , i- «» .



12.4. - i-, , i-. -. , i-, . , .. i-, .



-





- , , - i- - .



, -, , . , - i-, . - i-, , . (.. ) i- . i- .



t1 i- . (6), i- . , (7) i- , (8) — , «», t1 t. , , (9) i- t, . , i- t , (6-9) :



Πti=Φ(Eti,˜Eti,Πt1i,Kt1i,θt1i)(11)



i- -, i-, -. - .



i- , t. , i- (). , t+1, t+2, ... , -.



i- . ( , ) i- -. i-, , — - .



, - i-. . .. , .



- i-, - . i- , . : i- «» () «» (). - i- , , Δt=ΠtΠt.



3
, Δt, .



.. .. [5, 6]. , . . .


, - . Δ -, .





- :



1. «» i- (10) θ K. , i-.



2. «» i- (2) (4) (5) -.



3. - (2) , .. , i-. , .



4. - i-, , i- . i- . , , i-. . .



. i- -. i- (2) . , , «», .. i- i-, , i-, .



i- , i- . - . i- . - , (. ).



Según los autores, los procesos de autoaprendizaje y autoorganización pueden conducir a la educación yo- modelos de "segunda capa", es decir conjuntos del originalyo-modelos, que, a su vez, pueden formar conjuntos de la "tercera capa", etc. Los conjuntos de este tipo pueden verse como nuevos elementos funcionales de la red M, y el proceso de su formación, como el proceso de formación de nuevos conceptos complejos sobre la base de los previamente disponibles.





Figura 1. Un objeto y su reflejo en modelos de diferentes niveles de generalización. "Entradas" y "Salidas": En - energía; B - sustancia. Fig. Reproducida. 12 de [4].

Los procesos descritos en cl. 1 y 2, los autores denominan procesos de autoaprendizaje , y los procesos descritos en la p. 3 y 4, denominados procesos de autoorganización de la red M.



Definición formal de una red M



Las características previamente introducidas de los elementos de la red M (yo- ) :



– ;

– ;

– .



, (11). (6)-(9).



(3)-(5), i-.



(2) -.



-. - μ :



μ=P,S,R,L,F,C,I,(12)



Pi-; Si-; R — ; L — ; F — ; C — ; Ii-.



– ()





- i- . i- . i- , – . i-, ( ), , - i- -. , i-, -, - . . - « », « » i-: - «» «» «» i- (- i- ).





, i-modelos: en este caso, la probabilidad de una retroalimentación positiva en el autómata M es alta: esto conducirá a una situación de crecimiento ilimitado (exponencial) de la excitación de dicho grupo yo-modelos. Comentarios positivos entreyo-los modelos también son posibles con su "cierre de conexiones" a través del entorno externo: un análogo natural de esto puede ser la aparición de los llamados " círculos de la muerte de hormigas " o movimiento circular en las orugas de un gusano de seda en marcha (una situación similar puede ocurrir no solo en el mundo de los insectos; ver, por ejemplo, círculos en carneros , desafortunadamente, en situaciones más complejas, tal "caminar en círculos" se encuentra en la población humana).



Círculo de hormigas de la muerte

Movimiento circular de las orugas del gusano de seda que marchan

Observación 4
i- ( ).


, i- ( -). .





:



1. – ˜ri-, ;



2. i- ( ) – θ;



3. i- ( ) – .. , (. . 11.4 – (9));



4. () – K (. . 11.3 – (8)).



… ( ), () .

, « » i- ( « ») – -





, , .



« »! - . i- ( ).



5
« » , .


- .. ( , .. - « ») , , . « »:



. , «» «» (), , «», – . , . – .

… . - , – – . , . , . . , , ( ), . , , . , , , () . – – , – .

.. ([2], . 49-51)

, .. (i-) – - (), ( -) i- i-.



- ( [9]):



- ( 6() [9])


( 6() [9]: ). () « »


( ) :

1. () i- ;

2. i-;

3. , ;

4. « » ;

5. « » i-.






[9, . 379]:



, [109, 110], . «» , . , , «», , .

(. 6) « », . ( ), , . . – , . , – [111-114].

[62, 89, 115] , – , .

(. [9, . 381]):



(., . [127]) . , .

9 . , , , , , . - , , . , , [128] .

Figura 2. “Árbol heteroclínico” en el espacio de fase multidimensional de un sistema dinámico que describe la actividad paralela y secuencial de un gran número de modos de interacción involucrados en el desempeño de una determinada función cognitiva (un estado que representa una decisión final o una estrategia de comportamiento desarrollada se marca con un disco de luz). Figura: 9 de la revisión [9]

Un mecanismo de tan alto nivel no solo permite contener el crecimiento descontrolado de la excitación de ciertos grupos. yo-modelos, pero también, si es necesario, romper los "círculos viciosos" de transmisión de la actividad dentro de un determinado conjunto de conjuntos yo-modelos.



Propiedades básicas



1. En el concepto, el papel del SDT es organizar la retroalimentación local positiva y negativa en los procesos de procesamiento de información que ocurren en la red M. Esto asegura en cada intervalo de tiempo el predominio del programa de procesamiento de información, que es el más importante en el plan adaptativo, sobre otros programas que se desarrollan en paralelo en la red M.



2. El SDT funciona de la siguiente manera:



2.1. Deje que se dé algo de M-net.



2.2. En el proceso de procesamiento de la información, la emoción.yo- los modelos de red están cambiando. La cantidad de excitación de cadayo-Modelo indica indirectamente la "importancia", o valor de la información registrada en él.



El esquema de interacción de la SDS con otros elementos de la red M se muestra en la siguiente figura.





Figura 3. Esquema de SDS. S - IVU; F - fortalecimiento del modelo principal; segundo - frenado del resto; yo1 y yo2 - modelos de pisos del significado del mundo circundante; UNA1, UNA2 - modelos de pisos de acciones dirigidas hacia afuera; C1,C2 - modelos de programas de conciencia; mi, F- modelos de sentimientos y emociones. Fig. Reproducida. 19 de [2].

2.3. Se supone que la asignación en cada momento de los más emocionadosyo-Modelo y fortalecimiento de su influencia en el curso general del procesamiento de información aumentará la eficiencia de la red. Esto es exactamente lo que resuelve el SDT.



2.4. Trabajo SUT:



2.4.1. SDT en cada momento elige al más emocionadoyo-modelo, además aumenta su excitación y reduce la excitabilidad del resto yo-modelos (los ralentiza). Si en algún momento la misma emoción máxima hanorte yo-modelos, entonces la emoción adicional del SDT para cada uno de ellos estará en norte tiempos reducidos.



2.4.2. Para cada "activo"yo-el modelo requiere un freno "twin" (complementario yo-), i-. . , ().



2.4.3. i-. i- , -.



2.4.4. i- . , i- . , , , i-, , , , . , «» , i-. , -, « » i- .



2.4.5. i-. . i-. , - ( i- ). , , -.



2.4.6. «» , ( , i- ).



2.4.7. , i- . i- : i-, , i-. , , , () . .



3. , , , -. , i- . i-, .



, , :





Figura 4. Diagrama de organización de una SDS jerárquica. Se muestran tres campos de modelos "de trabajo", así como las neuronas del primero (yo) y el segundo (II) pisos del SDT con su amplificación (Tener) y freno (T) elementos. Fig. Reproducida. 20 del trabajo [2].

3.1. Deja todoyo- Los modelos de red se combinan convencionalmente en varios grupos que no se superponen por alguna razón. Estos son grupos del primer nivel (más bajo). Estos grupos pueden, a su vez, combinarse en grupos de segundo nivel más grandes, estos últimos en grupos de tercer nivel, etc. El grupo de nivel superior incluye todos los grupos del anterior y, por lo tanto, todosyo- modelos de red. El número total de niveles de tal "pirámide" en cada caso específico se puede determinar dependiendo de la complejidad de la red M y la complejidad de las tareas para las que se está construyendo el autómata.



Las siguientes figuras muestran los diagramas de organización de un SDT jerárquico y el principio de su interacción con los niveles. yo-modelos de la red M.



3.2. A cada uno de esos gruposyo-modelos, uno de los subsistemas SDT está asociado: en la red M, funcionan simultáneamente tantos subsistemas SDT como grupos de diferentes niveles hay en ella.





Figura 5. Esquema de interacción de un SDT jerárquico con niveles yo-modelos de la red M. UNA, segundo - zonas de "trabajo" de la corteza con modelos a - a - a,b - b - b,c - c - c,d - d - d...

Modelo más emocionado a - a - a en la zona UNA, en la zona segundo modelo c - c - c menos inhibido que d - d - d...



Elemento norte DESDETenerT-yo reforzado, elemento METRO inhibido de DESDETenerT-yoyo; T - frenado; Tener - ganancia.



Fig. Reproducida. 21 del trabajo [2].



3.3. Como una de las posibles opciones de implementación puede proporcionar un rastro. algoritmo de trabajo:



3.3.1. subsistemas del SDT de un nivel (los niveles de los subsistemas serán asignados de acuerdo con los niveles de los grupos sobre los que trabajan) comparar las excitaciones, amplificar lo aislado e inhibir el restoyo-modelos solo dentro de sus grupos. Los subsistemas del SDT del siguiente nivel, cada uno dentro de su propio grupo, comparan las excitaciones ya promedio de los grupos.yo-modelos del nivel inferior.





Figura 6. Ejemplo de relación yo-modelos de la red M. UNA - modelo de piso superior; a B C - modelos de planta baja; 1,2,......... - modelos adyacentes; re - modelo-antagonista; T - frenado; K - modelos de calidad; H1,H2- modelos de sentimientos. Las líneas punteadas muestran trayectorias de frenado. Fig. Reproducida. 22 del trabajo [2].

3.3.2. La ganancia no se aplica a un soloyo-modelos, pero a todos yo-modelos del grupo asignado actualmente; yo- Los modelos de otros grupos del mismo nivel se frenan proporcionalmente.



3.4. i-, , i- .



3.5. , -.



i-



, , : « - i- , i-, «», , . , , , . i-, . , «» i- . i-, «» » [3].



, , i- , . — i-.



1. , i-, i-, « » : i-, , . : i-.



2. , i-, : «». — « ». «» : , «» , , — « », .



- . : « , , ( ), - «-» , ..» [3].



3. i- , - , «» . « ».



4. i-, , — , , — , . . , , « » . i- , - «» , «», .



5. i- :



i-, .

i-. -, , «» «» .

– () , , , .



-



1. i-, . -. , i- «» i-, , . , , i- . i-.



2. -:



2.1. i- , .. , i- , i- — . — , i- . , i-, , «» i-. , , .



2.2. i- . i-. «» () , . , , , , .



2.3. i- — , . i- - i-. «» .



2.4. - : i- — «» . i- i- . «» , .. , «» , - .



2.5. Al establecer vínculos entreyo-modelos de varios conjuntos, cuya fuerza (permeabilidad) depende de la frecuencia de las excitaciones articulares incluidas en el conjunto yo-modelos, el estado de los centros integrales para la evaluación de Pr y NPr y algunos otros factores, fuertemente relacionados yo-los modelos tienen una mayor probabilidad de una selección consistente por parte del sistema de frenado reforzado en comparación con el resto yo- modelos de red. En consecuencia, al seleccionar SDTyo-modelo perteneciente a uno de los dos conjuntos fuertemente conectados, existe una alta probabilidad de que después de unos momentos el SDT cambie a uno de los yo-modelos del segundo conjunto.





Figura 7. Versión posible (y no final) del diagrama de clases para elementos individuales y sus relaciones en el concepto de N.. Amosov.

3. Cambios en la excitación yo- , — . , .



4. - , . i-. , , «» , i- .



-



-



, (12), - μ. (12) -. - t t+1.



:



1) , (11); i- - t+1;



2) , i-;



3) , «», -; i- «» ;



4) , , -;



5) ; (., , , , .).



- . . , , -. , , - . , A -.



- μ,A: - μ e incluye un algoritmo para su funcionamiento UNA... En general, el trabajo del M-autómata se puede representar de la siguiente manera:





Figura 8. Diagrama de bloques del algoritmo de funcionamiento del autómata M. Fig. Reproducida. 5 del trabajo [3].

Si M-net μse da en la forma (12), tal M-autómata está completo .



Es posible construir M-autómatas en los que no se realizan todas las funciones de la M-network.



Los autómatas M de autoaprendizaje se distinguen según la integridad de la tarea de la red M:



μ=PAG,S,R,L,,C,yo,(13)



y M-autómatas que no aprenden;



μ=PAG,S,R,,,C,yo,(catorce)



firmar indica que no se está ingresando el elemento correspondiente.



Algoritmo Y en el caso de un autómata M de autoaprendizaje no contiene un bloque F o un grupo de características de autoorganización, y en el caso de un no aprendiz - bloques F y L - grupos de características del autoaprendizaje.



Si es necesario (esto puede ser causado por dificultades significativas en la implementación), las funciones o programas individuales (de todo el conjunto de modelos modelados) pueden implementarse como un modelo funcional (procedimental, heurístico) separado. Esto se aplica en particular a cualquier componente del M-autómata. Cuando se implementa en un M-autómata, se pueden combinar modelos funcionales y estructurales.



Los autores del concepto llamaron el autómata M degenerado el autómata M, el algoritmo Y que no contiene un bloque SDT.



:



1. - (-) i-.



2. i- i- , . i- i- () -.



-



, . - :



1. , (: ) .



2. . 1 -. -, .



3. , .



4. « » -, .. .



5. «» .



6. . 3 , . i-.



7. . 3 i-.



8. , i- . . , , .



9. ( ) . .. 6-8 , , .. . 3.



, .. 7 8 . , , , .



10. -.



11. A.



12. - .



2.



Start by doing what's necessary then do what's possible and suddenly you are doing the impossible.

, . , . , .

.

, .. . - - - . . .



, 6.





:



//------------------------------------------------------------------------------
  type
//------------------------------------------------------------------------------
{$REGION ' '}
//------------------------------------------------------------------------------
// 
    TConnection    = class;
//  
    TConnections   = class;
//------------------------------------------------------------------------------
// 
    TRelation      = class;
//  
    TRelations     = class;
//   i-
    TOutputs       = class;
//   i-
    TInputs        = class;
//------------------------------------------------------------------------------
// i-
    TModel         = class;
//  i-
    TModels        = class;
//------------------------------------------------------------------------------
//   i–:
//   
    TQualia        = class;
// 
    TPercept       = class;
//   - 
    TEffector      = class;
//------------------------------------------------------------------------------
// -,  i- ()
    TModelGroup    = class;
//  -
    TActivateInhibiteSystem = class;
//------------------------------------------------------------------------------
// -
    TAutomate      = class;
//------------------------------------------------------------------------------
// 
    TPlatform      = class;
//------------------------------------------------------------------------------
{$ENDREGION ' '}
//------------------------------------------------------------------------------


, , . .







.. – TRelation

– :



      property CurrActivateCoeff: double read GetCurrActivateCoeff write SetCurrActivateCoeff;


– :



      property ResidualActivateCoeff: double read GetResidualActivateCoeff write SetResidualActivateCoeff;


– :



      property CurrInhibitCoeff: double read GetCurrInhibitCoeff write SetCurrInhibitCoeff;


– :



      property ResidualInhibitCoeff: double read GetResidualInhibitCoeff write SetResidualInhibitCoeff;


.



i- :



  TRelation = class(..............)
  private
      FModelSource: TModel;              //   -    
      FModelTarget: TModel;              //    
      FConnection: TConnection;          // , .  
  private
      FSourceId: int64;                  //  - 
      FTargetId: int64;                  //   
  private
      FCurrActivateCoeff: double;
      FResidualActivateCoeff: double;
      FCurrInhibitCoeff: double;
      FResidualInhibitCoeff: double;
  protected
//................................................    
//................................................    
//................................................    
  public
//................................................    
//................................................    
//................................................    
  end;    


, (), , : .



, , , i-. , , , TRelation , , i- . , i-.



6
, CRUD-, .




, .

.. , :

1. (2):



    procedure Defrosting(ACoModel: TModel; const AQuality: double); overload; virtual;


2. (3):



    procedure Setting(ACoModel: TModel; const AQuality: double); overload; virtual;


3. (4):



    procedure AttenuationCurrActivation(); overload; virtual;


4. (4):



    procedure DampingCurrentInhibit(); overload; virtual;


5. (5):



    procedure AttenuationResidualActivation(); overload; virtual;


6. (5):



    procedure AttenuationResidualInhibit(); overload; virtual;


7. (6):



    function Activation(): double; overload; virtual;


8. (6):



    function Inhibition(): double; overload; virtual;


7
, .


TRelation



  TRelation = class(..............)
  private
//................
  protected
//   (2):
    procedure Defrosting(ACoModel: TModel; const AQuality: double); overload; virtual;
//   (3):
    procedure Setting(ACoModel: TModel; const AQuality: double); overload; virtual;
//      (4):
    procedure AttenuationCurrActivation(); overload; virtual;
//      (4):
    procedure DampingCurrentInhibit(); overload; virtual;
//      (5):
    procedure AttenuationResidualActivation(); overload; virtual;
//      (5):
    procedure AttenuationResidualInhibit(); overload; virtual;
//    (6):
    function Activation(): double; overload; virtual;
//    (6):
    function Inhibition(): double; overload; virtual;
//................
  end;    


, .

:

– (6) – Activation(…),

– (6) – Inhibition(…)



TModel, TRelation.



:



1. . TRelation , . , .

2. -, .

3. Activation(…) Inhibition(…) .

4. 7 8:



//................
    function TRelation.Activation(): double;
    begin
      Result := ResidualActivateCoeff + (System.Math.Max(CurrActivateCoeff, 0.0) * FModelSource.Arousal);
    end;
    function TRelation.Inhibition(): double;
    begin
      Result := ResidualInhibitCoeff + (System.Math.Max(CurrInhibitCoeff, 0.0) * FModelSource.Arousal);
    end;
//................


: () () -.



- -.





1. / ( XML) TConnection – :



  TConnection = class
  private
      FOwner: TConnections;
  private
      FSourceId: int64;
      FTargetId: int64;
  private
      FCurrActivateCoeff: double;
      FResidualActivateCoeff: double;
      FCurrInhibitCoeff: double;
      FResidualInhibitCoeff: double;
  protected
  ....
  public
    function Equals(AObject: TObject): boolean; overload; override;
  public
    function IsDefrosting(): boolean; overload; virtual;
  published
  [XMLAttribute('Source')]
      property SourceId: int64 read GetSourceId write SetSourceId;
  [XMLAttribute('Target')]
      property TargetId: int64 read GetTargetId write SetTargetId;
  published
  //   .
  [XMLAttribute('CurrActivate')]
      property CurrActivateCoeff: double read GetCurrActivateCoeff write SetCurrActivateCoeff;
  //   .
  [XMLAttribute('ResidualActivate')]
      property ResidualActivateCoeff: double read GetResidualActivateCoeff write SetResidualActivateCoeff;
  //   .
  [XMLAttribute('CurrInhibitCoeff')]
      property CurrInhibitCoeff: double read GetCurrInhibitCoeff write SetCurrInhibitCoeff;
  //   .
  [XMLAttribute('ResidualInhibitCoeff')]
      property ResidualInhibitCoeff: double read GetResidualInhibitCoeff write SetResidualInhibitCoeff;
  end;


2. , TConnection , - (-) – - /.

3. TConnection TRelation: . , TRelation. , Owner – . TRelation TConnection : , , TRelation - , TConnection. : TConnection, TRelation . , - : - / i-. , – .

4. Equals ( , ):



    function TConnection.Equals(AObject: TObject): boolean;
    begin
      if (SourceId <> TConnection(AObject).SourceId) then exit(false);
      Result := (TargetId = TConnection(AObject).TargetId);
    end;


5. , TConnection



    constructor Create(); overload; virtual;
    constructor Create(const ASourceId, ATargetId: int64;
      const AResidualActivateCoeff: double = 0.0;
      const AResidualInhibitCoeff: double = 0.0;
      const ACurrActivateCoeff: double = 0.0;
      const ACurrInhibitCoeff: double = 0.0); overload; virtual;
    //  .
    constructor Create(const ASourceConnection: TConnection); overload; virtual;


6. - IsDefrosting(): boolean – , :



//................
function TConnection.IsDefrosting(): boolean;
begin
  if (FCurrActivateCoeff <> 0.0) then exit(true);
  if (FResidualActivateCoeff <> 0.0) then exit(true);
  if (FCurrInhibitCoeff <> 0.0) then exit(true);
  if (FResidualInhibitCoeff <> 0.0) then exit(true);
  exit(false);
end;


TRelation



TRelation .

, , :

1. i- TModel : ;

2. - -;

3. TRelation TConnection.

4. , TRelation , -, -, :



  TRelation = class(..............)
  private
      FModelSource: TModel;
      FModelTarget: TModel;
      FConnection: TConnection;
  //................................................    
  protected
  //................................................    
      property Connection: TConnection read GetConnection write SetConnection;
  //................................................    
  public
  //................................................    
  published
      property ModelSource: TModel read GetModelSource write SetModelSource;
      property ModelTarget: TModel read GetModelTarget write SetModelTarget;
  published
      property SourceId: int64 read GetSourceId write SetSourceId;
      property TargetId: int64 read GetTargetId write SetTargetId;
      property SourceName: string read GetSourceName write SetSourceName;
      property TargetName: string read GetTargetName write SetTargetName;
  //................................................    
  end;


5. TRelation :

– — ;

i-;

– ;

– -;

– () .

,



//................................................    
  public
//   .
    constructor Create(); overload; virtual;
//        i-.
    constructor Create(const ASourceId, ATargetId: int64); overload; virtual;
//      - (    ).
    constructor Create(const ASourceId: int64; ATarget: TModel); overload; virtual;
//        (   -).
    constructor Create(ASource: TModel; const ATargetId: int64); overload; virtual;
//      -  .
    constructor Create(ASource, ATarget: TModel; AConnection: TConnection); overload; virtual;
//................................................    
  end;


6. TRelation :



    destructor TRelation.Destroy();
    begin
//  ""   . 
      FResidualInhibitCoeff := -1.0;
      FCurrInhibitCoeff := -1.0;
      FResidualActivateCoeff := -1.0;
      FCurrActivateCoeff := -1.0;
// ""   .
      FTargetId := -1;
      FSourceId := -1;
//    .
      if (Assigned(FModelSource.Outputs)) then
        FModelSource.Outputs.Extract(Self);
//    .
      if (Assigned(FModelTarget.Inputs)) then
        FModelTarget.Inputs.Extract(Self);
//  . .
      if (Assigned(FConnection.Owner)) then
        FConnection.Owner.Remove(FConnection);
      System.SysUtils.FreeAndNil(FConnection);
      inherited Destroy();
    end;


, i-.







[XMLROOT('Connections')]
  TConnections = class(TVector<TConnection>)
  private
      FOwner: TAutomate;
  public
    constructor Create(); overload; override;
    constructor Create(AOwner: TAutomate); overload; virtual;
    destructor Destroy(); override;
  public
    function Add(const AValue: TConnection): int64; overload; override;
    function Insert(const AIndex: longint; const AValue: TConnection): int64; overload; override;
  end;
  TConnectionsClass = class of TConnections;


8
, TVector<T> TList<T>.


:

1. -. , , i- -, -. / -.

2. – .

3. -:



  TConnectionComparer = class(TComparer<TConnection>)
  protected
    function Equal(const ALeft, ARight: TConnection): boolean; overload; override;
    function LessThan(const ALeft, ARight: TConnection): boolean; overload; override;
    function GreaterThan(const ALeft, ARight: TConnection): boolean; overload; override;
  public
    constructor Create(); overload; override;
    destructor Destroy(); override;
  end;
  TConnectionComparerClass = class of TConnectionComparer;


TConnectionComparer ,



    function TConnectionComparer.Equal(const ALeft, ARight: TConnection): boolean;
    begin
      if (ALeft.SourceId <> ARight.SourceId) then exit(false);
      Result := (ALeft.TargetId = ARight.TargetId);
    end;
    function TConnectionComparer.LessThan(const ALeft, ARight: TConnection): boolean;
    begin
      if (ALeft.SourceId < ARight.SourceId) then exit(true);
      if (ALeft.SourceId > ARight.SourceId) then exit(false);
      Result := (ALeft.TargetId < ARight.TargetId);
    end;
    function TConnectionComparer.GreaterThan(const ALeft, ARight: TConnection): boolean;
    begin
      if (ALeft.SourceId > ARight.SourceId) then exit(true);
      if (ALeft.SourceId < ARight.SourceId) then exit(false);
      Result := (ALeft.TargetId > ARight.TargetId);
    end;


4. Add .

5. Insert , Owner : .

6. :



    constructor TConnections.Create();
    begin
      inherited Create(TConnectionComparer.Create()); //   -.
      FreeObjects := true;
      Sorted := true;
      Unique := true;
      ClassUnique := dupError;
      FOwner := nil;
    end;






, — TRelations – (TInputs) (TOutputs).

— TRelations:

TRelations:



  TRelations = class(TVector<TRelation>)
  private
      FOwner: TModel;
  protected
    function GetOwner(): TModel; overload; virtual;
    procedure SetOwner(const AValue: TModel); overload; virtual;
  protected
    function TryInnerInsert(const AIndex: longint; const AValue: TRelation; out AOutIndex: int64): boolean; overload; virtual;
    function Add(const AValue: int64): int64; overload; virtual;
  public
    constructor Create(); overload; override;
    constructor Create(AOwner: TModel); overload; virtual;
    destructor Destroy(); override;
  public
    function Add(const AValue: TRelation): int64; overload; override;
    function Insert(const AIndex: longint; const AValue: TRelation): int64; overload; override;
  public
      property Owner: TModel read GetOwner write SetOwner;
  end;




1. :

– ;

– ;

– CRUD-.

2. TRelations :

2.1. i- ( )



      function Add(const AValue: int64): int64; overload; virtual;


( ) (-). TOutputs TInputs.

2.2. ( ) i-



      function Add(const AValue: TRelation): int64; overload; override;


, .

2.3.



      function Insert(const AIndex: longint; const AValue: TRelation): int64; overload; override;


, , , .



      function TRelations.Insert(const AIndex: longint; const AValue: TRelation): int64;
      var
        AConnection: TConnection;
      begin
        try
//  TryInnerInsert     !
          if (TryInnerInsert(AIndex, AValue, Result)) then exit;
          Result := inherited Insert(AIndex, AValue);
          if (Result < 0) then exit;
          if (not Assigned(AValue.Connection)) then
            begin
              Owner.Automate.Connections.Add(AValue.CreateConnect());
            end;
        except
          Result := -1;
        end;
      end;


TryInnerInsert.

2.4. TryInnerInsert



//.......................................................
    protected
      function TryInnerInsert(const AIndex: longint; const AValue: TRelation; out AOutIndex: int64): boolean; overload; virtual;
//.......................................................
    end; 


:

– , – ;

– ,

– ;

– .

TryInnerInsert . , . , .



TryInnerInsert
      function TRelations.TryInnerInsert(const AIndex: longint; const AValue: TRelation; out AOutIndex: int64): boolean;
      var
        AIndexOf: integer;
      begin
        AOutIndex := AIndex;
        Result := false;
        if (Assigned(AValue.ModelSource) and Assigned(AValue.ModelTarget)) then exit;
// -   !
        if (Self is TInputs) then
          begin
            if ((AValue.TargetId >= 0) and (AValue.TargetId <> Owner.ObjectID)) then
              begin
//     ! !
                raise Exception.CreateFmt(RSErrorUnknowIds,[AValue.SourceId,AValue.TargetId, Owner.ObjectID, Self.ClassName]);
              end;
//    !
            if (AValue.SourceId < 0) then
              begin
//  !
                raise Exception.CreateFmt(RSErrorUnknowIds,[AValue.SourceId,AValue.TargetId, Owner.ObjectID, Self.ClassName]);
              end;
//  SourceId  TargetId!
//    !
            for AIndexOf := 0 to Self.Count - 1 do
              begin
                if (this[AIndex].SourceId <> AValue.SourceId) then continue;
                raise Exception.CreateFmt(RSErrorNotUniqueRelation,[AValue.SourceId,AValue.TargetId, Owner.ObjectID, Self.ClassName]);
              end;
            if (AValue.TargetId < 0) then
              begin
                AValue.TargetId := Owner.ObjectID;
              end;
//  -  -.
            if (not Assigned(AValue.ModelSource)) then
              AValue.ModelSource := Owner.Automate.FindById(AValue.SourceId);
            if (not Assigned(AValue.ModelTarget)) then
              AValue.ModelTarget := Owner;
          end;
        if (Self is TOutputs) then
          begin
            if ((AValue.SourceId >= 0) and (AValue.SourceId <> Owner.ObjectID)) then
              begin
//     ! !
                raise Exception.CreateFmt(RSErrorUnknowIds,[AValue.SourceId,AValue.TargetId, Owner.ObjectID, Self.ClassName]);
              end;
//    !
            if (AValue.TargetId < 0) then
              begin
// ...   !
                raise Exception.CreateFmt(RSErrorUnknowIds,[AValue.SourceId,AValue.TargetId, Owner.ObjectID, Self.ClassName]);
              end;
//  SourceId  TargetId!
//    !
            for AIndexOf := 0 to Self.Count - 1 do
              begin
                if (this[AIndex].TargetId <> AValue.TargetId) then continue;
                raise Exception.CreateFmt(RSErrorNotUniqueRelation,[AValue.SourceId,AValue.TargetId]);
              end;
            if (AValue.SourceId < 0) then
              begin
                AValue.SourceId := Owner.ObjectID;
              end;
//  -  -.
            if (not Assigned(AValue.ModelSource)) then
              AValue.ModelSource := Owner;
            if (not Assigned(AValue.ModelTarget)) then
              AValue.ModelTarget := Owner.Automate.FindById(AValue.TargetId);
          end;
        AOutIndex := AValue.ModelSource.Outputs.Insert(AIndex, AValue);
        AOutIndex := AValue.ModelTarget.Inputs.Insert(AIndex, AValue);
        Result := true;
      end;




TRelations – : TRelation.





:



    TInputs = class(TRelations)
    protected
      function Add(const AValue: int64): int64; overload; override;
    public
      constructor Create(); overload; override;
      destructor Destroy(); override;
    public
      function Insert(const AIndex: longint; const AValue: TRelation): int64; overload; override;
    end;
    TInputsClass = class of TInputs;
//..............................................................................
    TOutputs = class(TRelations)
    protected
      function Add(const AValue: int64): int64; overload; override;
    public
      constructor Create(); overload; override;
      destructor Destroy(); override;
    public
      function Insert(const AIndex: longint; const AValue: TRelation): int64; overload; override;
    end;
    TOutputsClass = class of TOutputs;


, Add, i-:



      function TInputs.Add(const AValue: int64): int64;
      begin
        Result := Add(TRelation.Create(AValue, Owner));
      end;
//..............................................................................
      function TOutputs.Add(const AValue: int64): int64;
      begin
        Result := Add(TRelation.Create(Owner, AValue));
      end;


AValue i-.



i-







i-, .. , :

– (Arousal),

– (Threshold),

– (ResidualActivateCoeff),

– (ActivateCoeff),

– (Inputs).

– (Outputs),



:

– , , ObjectId (int64).



, TNamedObject. :

– (ObjectId: int64);

– (Name: string);

– (NameShort: string);

– (Code: string).





i- i-:

– – Ativation(…) (9);

– – Inhibit(…) (7);

– – Attenuation(…) (8);

– – Overgrowth(…) (10);

– – Adaptation(…) (10).

, i-



    TModel = class(TNamedObject)
    private
//................................................    
    protected
//  : R (4.2).
      function Winding(AR: TRelation): TRelation; overload; virtual;
//  : R_1 (4.3).
      function Setting(AR: TRelation): TRelation; overload; virtual;
//  : (4.4, 4.4, 4.5  4.5).
      function Attenuation(AR: TRelation): TRelation; overload; virtual;
    protected
//    (9).
      function Ativation(): double; overload; virtual;
//  : (7).
      function Inhibit(): double; overload; virtual;
//     (8).
      function Attenuation(): double; overload; virtual;
//    (10).
      function Overgrowth(): double; overload; virtual;
//    (10).
      function Adaptation(): double; overload; virtual;
    protected
//     -  .
        property Arousal: double read GetArousal write SetArousal;
//  : (4.6).
        property ActivateEffect: double read GetActivateEffect write SetActivateEffect;
//  : (4.6).
        property InhibitEffect: double read GetInhibitEffect write SetInhibitEffect;
//   .
        property Threshold: double read GetThreshold write SetThreshold;
//   .
        property ActivateCoeff: double read GetActivateCoeff write SetActivateCoeff;
//  ()   .
        property ResidualActivateCoeff: double read GetResidualActivateCoeff write SetResidualActivateCoeff;
   protected
//     -  .
        property Arousal: double read GetArousal write SetArousal;
//  : (4.6).
        property ActivateEffect: double read GetActivateEffect write SetActivateEffect;
//  : (4.6).
        property InhibitEffect: double read GetInhibitEffect write SetInhibitEffect;
//   .
        property Threshold: double read GetThreshold write SetThreshold;
//   .
        property ActivateCoeff: double read GetActivateCoeff write SetActivateCoeff;
//  ()   .
        property ResidualActivateCoeff: double read GetResidualActivateCoeff write SetResidualActivateCoeff;
    protected
//................................................    
    end;


- , . «» , : 0.0.





i- TModel Exec(…) InternalExec(…). true, i- - .



    TModel = class(TNamedObject)
    private
//................................................    
    protected
      function InternalExec(): boolean; overload; virtual;
//................................................    
    public
      function Exec(): boolean; overload; virtual;
//................................................    
    end;


InternalExec(…) i- -. false.



i-



i-:



    TModel = class(TNamedObject)
    private
        FAutomate: TAutomate;
        FModels: TModels;
        FOwner: TModel;
    private
        FArousal: double;
        FActivateEffect: double;
        FInhibitEffect: double;
    private
        FThreshold: double;
        FActivateCoeff: double;
        FResidualActivateCoeff: double;
    private
        FOutputs: TOutputs;
        FInputs: TInputs;
    protected
      function GetThis(): TObject; overload; virtual;
    protected
      procedure SetObjectName(const AValue: TNameObject); overload; override;
      procedure SetObjectNameShort(const AValue: TNameShort); overload; override;
      procedure SetObjectCode(const AValue: TObjectName); overload; override;
    protected
      function GetOwner(): TModel; overload; virtual;
      procedure SetOwner(const AValue: TModel); overload; virtual;
    protected
      function GetThreshold(): double; overload; virtual;
      procedure SetThreshold(const AValue: double); overload; virtual;
      function GetArousal(): double; overload; virtual;
      procedure SetArousal(const AValue: double); overload; virtual;
      function GetActivateEffect(): double; overload; virtual;
      procedure SetActivateEffect(const AValue: double); overload; virtual;
      function GetInhibitEffect(): double; overload; virtual;
      procedure SetInhibitEffect(const AValue: double); overload; virtual;
      function GetActivateCoeff(): double; overload; virtual;
      procedure SetActivateCoeff(const AValue: double); overload; virtual;
      function GetResidualActivateCoeff(): double; overload; virtual;
      procedure SetResidualActivateCoeff(const AValue: double); overload; virtual;
    protected
      function GetOutputs(): TOutputs; overload; virtual;
      procedure SetOutputs(const AValue: TOutputs); overload; virtual;
      function GetInputs(): TInputs; overload; virtual;
      procedure SetInputs(const AValue: TInputs); overload; virtual;
    protected
      function GetAutomate(): TAutomate; overload; virtual;
      procedure SetAutomate(const AValue: TAutomate); overload; virtual;
      function GetPlatform(): TPlatform; overload; virtual;
      procedure SetPlatform(AValue: TPlatform); overload; virtual;
    protected
      procedure InternalExtract(); overload; virtual;
    protected
        property Models: TModels read FModels;
    protected
//................................................    
    protected
//     -  .
        property Arousal: double read GetArousal write SetArousal;
//  : (4.6).
        property ActivateEffect: double read GetActivateEffect write SetActivateEffect;
//  : (4.6).
        property InhibitEffect: double read GetInhibitEffect write SetInhibitEffect;
//   .
        property Threshold: double read GetThreshold write SetThreshold;
//   .
        property ActivateCoeff: double read GetActivateCoeff write SetActivateCoeff;
//  ()   .
        property ResidualActivateCoeff: double read GetResidualActivateCoeff write SetResidualActivateCoeff;
    protected
      class function GetClassInputs(): TInputsClass; overload; virtual;
      class function GetClassOutputs(): TOutputsClass; overload; virtual;
    protected
      function InternalExec(): boolean; overload; virtual;
      procedure ChangeArousal(AActivateInhibiteSystem: TActivateInhibiteSystem); overload; virtual;
    public
      constructor Create(); overload; override;
      constructor Create(const AObjectId: int64; const AName: string; const ANameShort: string = ''; const ACode: string = ''); overload; virtual;
      destructor Destroy(); override;
    public
      function Exec(): boolean; overload; virtual;
      function Perform(): boolean; overload; virtual;
    public
      procedure Reset(); overload; virtual;
    public
//................................................    
    public
        property Owner: TModel read GetOwner write SetOwner;
    published
        property Outputs: TOutputs read GetOutputs write SetOutputs;
        property Inputs: TInputs read GetInputs write SetInputs;
    published
        property Automate: TAutomate read GetAutomate write SetAutomate;
        property Platform: TPlatform read GetPlatform write SetPlatform;
    end;
    TModelClass = class of TModel;
            -:
    TModel = class(TNamedObject)
//................................................    
    public
//................................................    
      function Connect(ATarget: TModel; AConnection: TConnection): TModel; overload; virtual;
//................................................    
    end;


i-



.. i-. i-.

, i-:



[XMLROOT('Models')]
    TModels = class(TVector<TModel>)
    private
        FOwner: TAutomate;
    private
        FMapById: TMap<int64, int64>;
        FMapByName: TMap<string, int64>;
    private
        FIsTerminated: boolean;
    protected
      function GetOwner(): TAutomate; overload; virtual;
      procedure SetOwner(const AValue: TAutomate); overload; virtual;
      procedure InnerSetAutomate(const AModel: TModel); overload; virtual;
    protected
        property Owner: TAutomate read GetOwner;
    public
      constructor Create(); overload; override;
      constructor Create(const AComparer: JOBLIB.Core.Comparers.IComparer<TModel>); overload; override;
      constructor Create(AOwner: TAutomate); overload; virtual;
      destructor Destroy(); override;
    public
      function GetObjectId(): int64; overload; virtual;
    public
      function Add(const AValue: TModel): int64; overload; override;
      function Insert(const AIndex: longint; const AModel: TModel): int64; overload; override;
      function Extract(const AModel: TModel): TModel; overload; override;
      procedure Delete(const AIndex: longint); overload; override;
    public
      function FindById(const AModelId: int64): TModel; overload; virtual;
      function FindByName(const AModelName: string): TModel; overload; virtual;
    public
      procedure Reorder(const AStartIndex: integer); overload; override;
    end;
    TModelsClass = class of TModels;


  1. TModels TVector
    <TModel>
    .
  2. TModels ( : FreeObjects := true false).


  3.   procedure TModels.InnerSetAutomate(const AModel: TModel);
      begin
        AModel.Automate := Owner;
      end;


    , , .



    ( Insert):

      function TModels.Insert(const AIndex: longint; const AModel: TModel): int64;
      begin
        if (AModel.Name.Trim().IsEmpty()) then exit(-1);
        Result := inherited Insert(AIndex, AModel);
        if (AModel.ObjectID < 0) then
          begin
            AModel.ObjectID := GetObjectId();
          end;
        try
          if (AModel.ObjectID < 0) then
            raise Exception.Create(RSErrorIncorrectAutomate);
          FMapById.Add(AModel.ObjectID, Result);
          FMapByName.Add(AModel.Name, Result);
          InnerSetAutomate(AModel);
          Reorder(AIndex);
        except
          Result := -1;
        end;
      end;




      function FindById(const AModelId: int64): TModel; overload; virtual;
      function FindByName(const AModelName: string): TModel; overload; virtual;


    . :

    FMapById: TMap<int64, int64>;
    FMapByName: TMap<string, int64>;


    GUID i-.





      function TModels.Extract(const AModel: TModel): TModel;
      var
        AIndexOf: int64;
        AModelGroup: TModelGroup;
        ASubmodel: TSubmodel;
        AIndexSubmodelOf: integer;
      begin
        Result := inherited Extract(AModel);
        if (FIsTerminated) then exit;
        if (Assigned(AModel)) then
          begin
            if (FMapById.TryGetValue(AModel.ObjectID, AIndexOf)) then
              begin
                FMapById.Remove(AModel.ObjectID);
                FMapByName.Remove(AModel.Name);
                Reorder(AIndexOf);
              end;
          end;
      end;
      procedure TModels.Delete(const AIndex: longint);
      begin
        FMapById.Remove(this[AIndex].ObjectID);
        FMapByName.Remove(this[AIndex].Name);
        inherited Delete(AIndex);
        Reorder(AIndex);
      end;


    ObjectId :

      function GetObjectId(): int64; overload; virtual;




        property Owner: TAutomate read GetOwner;


    , - ( ), , - ( – -):

      function TModels.GetObjectId(): int64;
      begin
        Result := Owner.GetSequence().NextVal();
      end;


    , - - .





      procedure Reorder(const AStartIndex: integer); overload; override;


    , i-, i- .





    i-



    i-.

    - , i-:

    i-, – TPercept,

    (qualia)i-, i- – TQualia,

    i-, – TEffector.



    (qualia)



    TModel . TModel , Threshold Arousal ( ):



        TQualia = class(TModel)
        public
          constructor Create(); overload; override;
          destructor Destroy(); override;
        published
    [XMLAttribute('Threshold')]
            property Threshold;
    [XMLAttribute('Arousal')]
            property Arousal;
        end;




    (TPercept) (TEffector) TQualia:



        TPercept = class(TQualia)
        private
            FPlatform: TPlatform;
        protected
          function GetPlatform(): TPlatform; overload; override;
          procedure SetPlatform(AValue: TPlatform); overload; override;
        protected
          function InternalExec(): boolean; overload; override;
        public
          constructor Create(); overload; override;
          destructor Destroy(); override;
        public
          function Exec(): boolean; overload; override;
        published
            property Platform;
        end;




        TEffector = class(TQualia)
        private
            FPlatform: TPlatform;
        protected
          function GetPlatform(): TPlatform; overload; override;
          procedure SetPlatform(AValue: TPlatform); overload; override;
        protected
          function InternalExec(): boolean; overload; override;
        public
          constructor Create(); overload; override;
          destructor Destroy(); override;
        public
          function Exec(): boolean; overload; override;
        published
            property Platform;
        end;


    , Platform, () «» ( ):



        private
            FPlatform: TPlatform;
        protected
          function GetPlatform(): TPlatform; overload; override;
          procedure SetPlatform(AValue: TPlatform); overload; override;
        protected
    ..................................
        public
    ..................................
        public
    ..................................
        published
            property Platform;
        end;




          function Exec(): boolean; overload; override;


    «» «» , TPercept:



          function TPercept.Exec(): boolean;
          begin
            try
              if (not Assigned(Platform)) then
                raise Exception.Create('      !');
              Result := InternalExec();
            except
              Result := false;
            end;
          end;


    TEffector:



          function TEffector.Exec(): boolean;
          begin
            try
              if (not Assigned(Platform)) then
                raise Exception.Create('   !');
              Result := InternalExec();
            except
              Result := false;
            end;
          end;


    i- InternalExec(). , , TPercept TEffector.



    9
    « » , i-, .


    i-



    , i- :

    ()i-, i-

    i-, - () i-, («» i-), i- (, , - ..). .. , ( [3] : . , ). , (.. i-). . , . .

    i-

    (, )i- i-. , -, , -;

    (, , , , -, , , - .)i-, () ( ) .



    () i-



    ,



    , .. i-, i- (), i-, i-, i-. i-: .. , i- , «» ( , ).

    «» / :

    – TModel;

    – TGroupModel;

    – TSubmodel, TSubmodels.

    TSubmodel :

    1. TSubmodel () TModel ();

    2. TModel TSubmodel ( : () TModel);

    3. -;

    4. ;

    5. ;

    5.1. - ,

    5.2. i- () / ,

    6. / i- ();

    7. .



    , :



    :

    1. . , ; . 1, 2, 4, 5.1, 5.2 ( ). : 3, 6 7; TModel TInterfacedObject .

    2. . .

    3. - ( ). . : .

    4. - . :

    1. TSubmodel, :

    – , – Prototype: TModel;

    – – Refer: int64;

    i-; i- – Prev: TSubmodel Next: TSubmodel;

    i- ;

    – . OrderId: int64, .

    2. TModel:

    – (HeadSubmodel: TSubmodel) i-. , i-;

    – -, ;

    FreeSubmodel(…) ;

    OnAfterDisposeSubmodel, . CheckFreeModel(ASubmodel: TSubmodel): boolean.

    3. TSubmodels :

    3.1. TSubmodel -;

    3.2. Insert TSubmodels:

    BindSubmodel -; :



          procedure TAutomate.BindSubmodel(ASubmodel: TSubmodel);
          begin
            if (not Ready) then exit;
            if (not Assigned(ASubmodel.Prototype)) then
              ASubmodel.Prototype := FindById(ASubmodel.Refer);
            if (not Assigned(ASubmodel.Owner)) then
              raise Exception.CreateFmt(' .    : %d',[ASubmodel.Refer]);
            ASubmodel.Prototype.HeadSubmodel := ASubmodel;
          end;


    – ( . 8). , ;

    – .

    3.2. BindSubmodel -:

    Prototype , Refer;

    HeadSubmodel ( – ) .

    4. () - ( - ):

    4.1. -.

    4.2. : -: Ready = false.

    4.3. -; BindSubmodel.

    4.4.

    – -

    – - (. ).

    5. :

    5.1. Delete(…) :

    – ( );

    – - ( FreeSubmodel).

    – ( inherited Delete(…));

    – - ( FreeSubmodel) – FreePrototype -.

    5.2. - ( FreeSubmodel TModel):

    HeadSubmodel -;

    – ;

    – -

    – .

    6. -?

    6.1. - . :

    6.1.1. HeadSubmodel;

    6.1.2. (Extract) ;

    6.1.3. (Prev) ;

    6.1.4. Prev nil: «» Prev.Next;

    6.1.5. ACurrSubmodel;

    6.1.6. .

    6.2. .

    7. -, , () FreeSubmodel ( - ) . .

    8. () - ( – ) . «» . , , :



    10
    , - , .. .


    8.1. ;

    8.2. (not Submodels.IsEmpty()). « » , ;

    8.3. ;

    8.4. « »: « ». , – . , , «» , .



    11
    « …! …! …!». ? ? – …


    8.5. : - , – , !

    ? : , «» « » . «» , / . :

    8.5.1. « » « (DAG, directed acyclic graph)» «» ;

    8.5.2. «» ;

    8.5.3. – — :

    – «» ;

    – «» .

    «» . , , – .

    8.5.4. : – «» ? : , , , . .

    8.6. , . 8.1-8.5 / .

    8.7. . 8.5. , . 8.3. 8.4.

    :



    //.......................................................................
          function TSubmodel.IsEqualsChild(AModel: TModel): boolean;
          begin
            // 8.3.
            if (Prototype.Equals(AModel)) then exit(false);
            // 8.4.
            if ((Prototype as TModelGroup).Contains(AModel.ObjectID)) then exit(false);
            Result := true;
          end;
    //.......................................................................
          function TSubmodels.CyclicDependencyCheck(ASubmodel: TSubmodel): boolean;
          var
            AParent: TModel;
            ACurrSubmodel: TSubmodel;
            AMapUnique: TMapUnique;
            AModelQueue: Queue<TModel>;
          begin
            if (not Assigned(Owner.Automate)) then exit(true);
            if (not Owner.Automate.Ready) then exit(true); //    !
          // 8.1.
            if (not (ASubmodel.Prototype is TModelGroup)) then exit(true);
          // 8.2.    ,          !
            if ((ASubmodel.Prototype as TModelGroup).Submodels.IsEmpty()) then exit(true);
          // 8.5.     !
            AMapUnique := TMapUnique.Create();
            try
              AModelQueue.Enqueue(Owner);
              Result := true;
              while (not AModelQueue.IsEmpty()) do
                begin
                  AParent := AModelQueue.Dequeue();
                  Result := ASubmodel.IsEqualsChild(AParent);
                  if (not Result) then break;
                  ACurrSubmodel := AParent.HeadSubmodel;
    // Assigned(ACurrSubmodel) = false -   AParent -  !
                  while (Assigned(ACurrSubmodel)) do
                    begin //    !    !
                      if (ACurrSubmodel.Owner is TModelGroup) then
                        begin
                          if (not AMapUnique.ContainsKey(ACurrSubmodel.Refer)) then
                            begin
                              AMapUnique.Add(ACurrSubmodel.Refer,0);
                              AModelQueue.Enqueue(ACurrSubmodel.Owner);
                            end;
                        end;
                      ACurrSubmodel := ACurrSubmodel.Prev;
                    end;
                end;
              while (not AModelQueue.IsEmpty()) do
                AModelQueue.Dequeue();
            finally
              System.SysUtils.FreeAndNil(AMapUnique);
            end;
          end;


    12
    « » « » ( , ).


    9. i-; : ( ) , , .

    : , – , – . , . .







    . 1 TSubmodel :



    [XMLROOT('Submodel')]
        TSubmodel = class(TReference<TModel>)
        private
            FOwner: TModel;
            FOrderId: int64;
            FSubmodelName: string;
        private
            FPrevSubmodel: TSubmodel;
            FNextSubmodel: TSubmodel;
        protected
          function GetRefer(): int64; overload; override;
        protected
          function GetOrderId(): int64; overload; virtual;
          procedure SetOrderId(const AValue: int64); overload; virtual;
          function GetName(): string; overload; virtual;
          procedure SetName(const AValue: string); overload; virtual;
        protected
          function GetOwner(): TModel; overload; virtual;
          procedure SetOwner(const AValue: TModel); overload; virtual;
        protected
          function GetPrevSubmodel(): TSubmodel;
          procedure SetPrevSubmodel(const AValue: TSubmodel);
          function GetNextSubmodel(): TSubmodel;
          procedure SetNextSubmodel(const AValue: TSubmodel);
        public
          constructor Create(); overload; override;
          constructor Create(APrototype: TModel); overload; virtual;
          destructor Destroy(); override;
        public
          function IsEqualsChild(AModel: TModel): boolean; overload; virtual;
        public
            property Prototype;
        public
            property Prev: TSubmodel read GetPrevSubmodel write SetPrevSubmodel;
            property Next: TSubmodel read GetNextSubmodel write SetNextSubmodel;
        published
            property Owner: TModel read GetOwner write SetOwner;
        published
    [XMLAttribute('Refer')]
            property Refer;
    [XMLAttribute('OrderId')]
            property OrderId: int64 read GetOrderId write SetOrderId;
    [XMLAttribute('Name')]
            property Name: string read GetName write SetName;
        end;
        TSubmodelClass = class of TSubmodel;


    TSubmodel TReference<T: class, constructor>. , :



        TReference<T: class, constructor> = class
        private
            FRefer: int64;
            FPrototype: T;
        protected
          function GetPrototype(): T; overload; virtual;
          procedure SetPrototype(const AValue: T); overload; virtual;
          function GetRefer(): int64; overload; virtual;
          procedure SetRefer(const AValue: int64); overload; virtual;
        protected
            property Prototype: T read GetPrototype write SetPrototype;
            property Refer: int64 read GetRefer write SetRefer;
        public
          constructor Create(); overload; virtual;
          destructor Destroy(); override;
        end;


    , TSubmodel.



    TModel



    4, . 2 (. ), TModel.

    1. , . :

    – ,

    – ,

    – .

    , FreePrototype() -.

    , :



       TModeFreePrototype =
         (
             mdpFreePrototype              // 1- .
           , mdpUseRequestFreePrototype    // 2- .
           , mdpUseDefaultMode             // 3- .
         );
       TModesFreePrototype = set of TModeFreePrototype;


    2. :



       TOnAfterDisposeSubmodel = function (APrototypeModel: TModel; ASubmodel: TSubmodel): boolean of object;


    , , TModel (. ):



    TModel
    [XMLROOT('Model')]
        TModel = class(TNamedObject)
        private
            FAutomate: TAutomate;
            FOwner: TModel;
            FModesFreePrototype: TModesFreePrototype;
            FHeadSubmodel: TSubmodel;
            FOnAfterDisposeSubmodel: TOnAfterDisposeSubmodel;
        private
            FArousal: double;
            FActivateEffect: double;
            FInhibitEffect: double;
        private
            FThreshold: double;
            FActivateCoeff: double;
            FResidualActivateCoeff: double;
        private
            FOutputs: TOutputs;
            FInputs: TInputs;
        protected
          function GetThis(): TObject; overload; virtual;
        protected
          procedure SetObjectName(const AValue: TNameObject); overload; override;
          procedure SetObjectNameShort(const AValue: TNameShort); overload; override;
          procedure SetObjectCode(const AValue: TObjectName); overload; override;
        protected
          function GetOwner(): TModel; overload; virtual;
          procedure SetOwner(const AValue: TModel); overload; virtual;
        protected
          function GetThreshold(): double; overload; virtual;
          procedure SetThreshold(const AValue: double); overload; virtual;
          function GetArousal(): double; overload; virtual;
          procedure SetArousal(const AValue: double); overload; virtual;
          function GetActivateEffect(): double; overload; virtual;
          procedure SetActivateEffect(const AValue: double); overload; virtual;
          function GetInhibitEffect(): double; overload; virtual;
          procedure SetInhibitEffect(const AValue: double); overload; virtual;
          function GetActivateCoeff(): double; overload; virtual;
          procedure SetActivateCoeff(const AValue: double); overload; virtual;
          function GetResidualActivateCoeff(): double; overload; virtual;
          procedure SetResidualActivateCoeff(const AValue: double); overload; virtual;
        protected
          function GetOutputs(): TOutputs; overload; virtual;
          procedure SetOutputs(const AValue: TOutputs); overload; virtual;
          function GetInputs(): TInputs; overload; virtual;
          procedure SetInputs(const AValue: TInputs); overload; virtual;
        protected
          function GetAutomate(): TAutomate; overload; virtual;
          procedure SetAutomate(const AValue: TAutomate); overload; virtual;
          function GetPlatform(): TPlatform; overload; virtual;
          procedure SetPlatform(AValue: TPlatform); overload; virtual;
        protected
          procedure InternalExtract(); overload; virtual;
          procedure FreeHeadSubmodels(); overload; virtual;
        protected
          function CheckFreeModel(ASubmodel: TSubmodel): boolean;
          function FreeSubmodel(ASubmodel: TSubmodel): boolean; overload; virtual;
        protected
          function GetHeadSubmodel(): TSubmodel; overload; virtual;
          procedure SetHeadSubmodel(const AValue: TSubmodel); overload; virtual;
          function GetModesFreePrototype(): TModesFreePrototype; overload; virtual;
          procedure SetModesFreePrototype(const AValue: TModesFreePrototype); overload; virtual;
        protected
          function GetOnAfterDisposeSubmodel: TOnAfterDisposeSubmodel;
          procedure SetOnAfterDisposeSubmodel(const AValue: TOnAfterDisposeSubmodel); overload; virtual;
        protected
    //  : R (4.2).
          function Winding(AR: TRelation): TRelation; overload; virtual;
    //  : R_1 (4.3).
          function Setting(AR: TRelation): TRelation; overload; virtual;
    //  : (4.4, 4.4, 4.5  4.5).
          function Attenuation(AR: TRelation): TRelation; overload; virtual;
        protected
    //    (9).
          function Ativation(): double; overload; virtual;
    //  : (7).
          function Inhibit(): double; overload; virtual;
    //     (8).
          function Attenuation(): double; overload; virtual;
    //    (10).
          function Overgrowth(): double; overload; virtual;
    //    (10).
          function Adaptation(): double; overload; virtual;
        protected
    //     -  .
            property Arousal: double read GetArousal write SetArousal;
    //  : (4.6).
            property ActivateEffect: double read GetActivateEffect write SetActivateEffect;
    //  : (4.6).
            property InhibitEffect: double read GetInhibitEffect write SetInhibitEffect;
    //   .
            property Threshold: double read GetThreshold write SetThreshold;
    //   .
            property ActivateCoeff: double read GetActivateCoeff write SetActivateCoeff;
    //  ()   .
            property ResidualActivateCoeff: double read GetResidualActivateCoeff write SetResidualActivateCoeff;
        protected
            property HeadSubmodel: TSubmodel read GetHeadSubmodel write SetHeadSubmodel;
        protected
          class function GetClassInputs(): TInputsClass; overload; virtual;
          class function GetClassOutputs(): TOutputsClass; overload; virtual;
        protected
          function InternalExec(): boolean; overload; virtual;
          procedure ChangeArousal(AActivateInhibiteSystem: TActivateInhibiteSystem); overload; virtual;
        public
          constructor Create(); overload; override;
          constructor Create(const AObjectId: int64; const AName: string; const ANameShort: string = ''; const ACode: string = ''); overload; virtual;
          destructor Destroy(); override;
        public
          function Exec(): boolean; overload; virtual;
          function Perform(): boolean; overload; virtual;
        public
          procedure Reset(); overload; virtual;
        public
          function Connect(ATarget: TModel; AConnection: TConnection): TModel; overload; virtual;
        public
            property Owner: TModel read GetOwner write SetOwner;
        published
            property Outputs: TOutputs read GetOutputs write SetOutputs;
            property Inputs: TInputs read GetInputs write SetInputs;
        published
            property Automate: TAutomate read GetAutomate write SetAutomate;
            property Platform: TPlatform read GetPlatform write SetPlatform;
        published
            property ModesFreePrototype: TModesFreePrototype read GetModesFreePrototype write SetModesFreePrototype;
        published
            property OnAfterDisposeSubmodel: TOnAfterDisposeSubmodel read GetOnAfterDisposeSubmodel write SetOnAfterDisposeSubmodel;
        end;
        TModelClass = class of TModel;


    , :

    CheckFreeModel – , :



          function TModel.CheckFreeModel(ASubmodel: TSubmodel): boolean;
          begin
            Result := false;
            if (TModeFreePrototype.mfpUseRequestFreePrototype in ModesFreePrototype) then
              begin
                if (Assigned(OnAfterDisposeSubmodel)) then
                  begin
                    Result := OnAfterDisposeSubmodel(Self, ASubmodel);
                  end
                else if (TModeFreePrototype.mfpUseDefaultMode in ModesFreePrototype) then
                  begin
                    Result := (TModeFreePrototype.mfpFreePrototype in FModesFreePrototype);
                  end;
              end
            else
              begin
                Result := (TModeFreePrototype.mfpFreePrototype in ModesFreePrototype);
              end;
          end;


    FreeSubmodel – :



          function TModel.FreeSubmodel(ASubmodel: TSubmodel): boolean;
          var
            APrevSubmodel: TSubmodel;
            ANextSubmodel: TSubmodel;
          begin
            Result := false;
            if (ASubmodel.Equals(FHeadSubmodel)) then
              begin
                FHeadSubmodel := ASubmodel.Prev;
                ASubmodel.Prev := nil;
                if (Assigned(FHeadSubmodel)) then
                  begin
                    FHeadSubmodel.FNextSubmodel := nil;
                  end
                else
                  begin //     -!
    //     !
                    Result := ASubmodel.Owner.CheckFreeModel(ASubmodel);
                    exit;
                  end;
              end
            else
              begin
                Result := false;
    //     !
                if (Assigned(ASubmodel.Prev)) then
                  begin
                    ASubmodel.Prev.Next := ASubmodel.Next;
                    if (Assigned(ASubmodel.Next)) then
                      begin
                        ASubmodel.Next.Prev := ASubmodel.Prev;
                      end;
                  end
                else
                  begin
                    if (Assigned(ASubmodel.Next)) then
                      begin
                        ASubmodel.Next.Prev := nil;
                      end;
    //   not Assigned(ASubmodel.Next) -   
    //    (ASubmodel = FHeadSubmodel),     
    //  !
                  end;
    //  !
                ASubmodel.Prev := nil;
                ASubmodel.Next := nil;
              end;
          end;


    SetHeadSubmodel – :



          procedure TModel.SetHeadSubmodel(const AValue: TSubmodel);
          begin
            if (not Assigned(FHeadSubmodel)) then
              begin //      !
                FHeadSubmodel := AValue;
    //   !
                FHeadSubmodel.Prev := nil;
              end
            else
              begin
                if (FHeadSubmodel.Equals(AValue)) then exit;
                FHeadSubmodel.Next := AValue;
                AValue.Prev := FHeadSubmodel;
                FHeadSubmodel := AValue;
              end;
      //   !
              FHeadSubmodel.Next := nil;
          end;


    , Destroy() – , :



          destructor TModel.Destroy();
          begin
            InternalExtract();
            FResidualActivateCoeff := 0.0;
            FActivateCoeff := 0.0;
            FInhibitEffect := 0.0;
            FActivateEffect := 0.0;
            FArousal := 0.0;
            FThreshold := 0.0;
            System.SysUtils.FreeAndNil(FOutputs);
            System.SysUtils.FreeAndNil(FInputs);
            FHeadSubmodel := nil;
            FModesFreePrototype := [TModeFreePrototype.mfpFreePrototype];
            FOwner := nil;
            FOnAfterDisposeSubmodel := nil;
            inherited Destroy();
          end;






    , TModelGroup:



    [XMLROOT('Group')][CINC(10,'')][ClassVarInherited()]
        TModelGroup = class(TQualia)
        private
            FSubmodels: TSubmodels;
        protected
          function GetSubmodels(): TSubmodels; overload; virtual;
          procedure SetSubmodels(const AValue: TSubmodels); overload; virtual;
        protected
          class function GetClassSubmodels(): TSubmodelsClass; overload; virtual;
        protected
          function InternalExec(): boolean; overload; override;
        public
          constructor Create(); overload; override;
          destructor Destroy(); override;
        public
          procedure Prepare(); overload; virtual;
        public
          function Exec(): boolean; overload; override;
          procedure Reset(); overload; override;
        public
          function Add(AModel: TModel): TModel; overload; virtual;
          procedure Clear(); overload; virtual;
        public
          function FindById(const AModelId: int64): TSubmodel; overload; virtual;
          function FindByName(const AModelName: string): TSubmodel; overload; virtual;
          function Contains(const ASubmodel: int64): boolean; overload; virtual;
        published
    [XMLARRAY('Submodels','Submodel')]
            property Submodels: TSubmodels read GetSubmodels write SetSubmodels;
        end;
        TModelGroupClass = class of TModelGroup;


    TModelGroup:

    1. TModelGroupTQualia.

    2. , , .

    3. :



    //.......................................................
        public
          function Add(AModel: TModel): TModel; overload; virtual;
          procedure Clear(); overload; virtual;
        public
          function FindById(const AModelId: int64): TModel; overload; override;
          function FindByName(const AModelName: string): TModel; overload; override;
    //.......................................................
        end;


    4. Prepare():



    //......................................................
        public
    //......................................................
          procedure Prepare(); overload; virtual;
    //......................................................
        end;


    . – , , .



    1. InternalExec(…) Exec(…):

      ..............................
      protected
        function InternalExec(): boolean; overload; virtual;
      ..............................
      ..............................
      ..............................
      public
      ..............................
      ..............................
      public
        function Exec(): boolean; overload; override;
      ..............................
      ..............................
      end;


      :

        function TModelGroup.InternalExec(): boolean;
        var
          AModel: TModel;
        begin
          for AModel in Models do
            begin
              Result := AModel.Exec();
              if (not Result) then break;
            end;
        end;
        function TModelGroup.Exec(): boolean;
        begin
          Result := InternalExec();
        end;


      , InternalExec(): i- , . i- - «» – false. , i-, , InternalExec().

      ( InternalExec(…)) :

      2.

        function TModelGroup.InternalExec(): boolean;
        var
          AModel: TModel;
        begin
          for AModel in Models do
            begin
              Result := AModel.Exec();
              Result := AIS.Exec(Result, AModel);
              if (not Result) then break;
            end;
        end;


      3.

        function TModelGroup.InternalExec(): boolean;
        var
          AModel: TModel;
        begin
          for AModel in Models do
            begin
              Result := AModel.Exec();
              if (not Result) then break;
            end;
          Result := AIS.Exec(Result);
        end;


      4.

        function TModelGroup.Exec(): boolean;
        begin
          Result := InternalExec();
          Result := AIS.Exec(Result);
        end;


      - , InternalExec(…) Exec(…).





      -



      i- – -.





      - :



          TActivateInhibiteSystem = class(TModelGroup)
          private
              FClamping: double;
              FQueuePerformModels: TQueuePerformModels;
          protected
            function GetClamping(): double; overload; virtual;
            procedure SetClamping(const AValue: double); overload; virtual;
          protected
            function InternalExec(const AStatus: boolean): boolean; overload; virtual;
            function InternalExec(const AStatus: boolean; AModel: TModel): boolean; overload; virtual;
          protected
            class function GetClassSubmodels(): TSubmodelsClass; overload; override;
          protected
            function Check(ASubmodel: TSubmodel): boolean; overload; virtual;
            procedure BeforePerform(); overload; virtual;
            function EnqueuePerformModels(): TQueuePerformModels; overload; virtual;
            function Accept(ASubmodel: TSubmodel): boolean; overload; virtual;
            function InternalExec(): boolean; overload; override;
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          public
            procedure OrderBy(AIndexStart: longint = 0; AIndexFinish: longint = -1); overload; virtual;
            procedure OrderBy(AComparer: JOBLIB.Core.Comparers.IComparer<TSubmodel>; AIndexStart: longint = 0; AIndexFinish: longint = -1); overload; virtual;
          public
            function Perform(): boolean; overload; override;
          public
            function Exec(const AStatus: boolean): boolean; overload; virtual;
            function Exec(const AStatus: boolean; AModel: TModel): boolean; overload; virtual;
          published
              property Clamping: double read GetClamping write SetClamping;
          end;


      , :

      1. ( TModelGroup).

      2. Clamping – , i-. .. (Arousal), i-: i- ( ) , . , Clamping . - Clamping .

      3. QueuePerformModels: TQueuePerformModels. .

      4. 4- () :



          TActivateInhibiteSystem = class(TModelGroup)
      ..............................
      ..............................
          protected
            function InternalExec(const AStatus: boolean): boolean; overload; virtual;
            function InternalExec(const AStatus: boolean; AModel: TModel): boolean; overload; virtual;
      ..............................
      ..............................
          public
      ..............................
      ..............................
          public
            function Exec(const AStatus: boolean): boolean; overload; virtual;
            function Exec(const AStatus: boolean; AModel: TModel): boolean; overload; ..............................
      ..............................
      virtual;
          published
      ..............................
      ..............................
          end;


      5. , , :

      5.1. i-, , «». i- «» i-, - «» . i-, « » .

      5.2. , . , ModesFreePrototype, [] ( «- »). , TActivateInhibiteSystem :



            constructor TActivateInhibiteSystem.Create();
            begin
              inherited Create();
      // -       !
              FModesFreePrototype := [];
              FClamping := 0.0;
              FQueuePerformModels := TQueuePerformModels.Create();
            end;


      SetModesFreePrototype :



            procedure TActivateInhibiteSystem.SetModesFreePrototype(const AValue: TModesFreePrototype);
            begin
            end;


      , « ».



      13
      «» . i-.


      6. . :



      procedure OrderBy(AIndexStart: longint = 0; AIndexFinish: longint = -1); overload; virtual;
      procedure OrderBy(AComparer: JOBLIB.Core.Comparers.IComparer<TModel>; AIndexStart: longint = 0; AIndexFinish: longint = -1); overload; virtual;


      6.1. (, (Arousal) i-). i- -. , -.

      6.2. - i- . :



          TDefaultAISModelComparer = class(TComparer<TSubmodel>)
          protected
            function Equal(const ALeft, ARight: TSubmodel): boolean; overload; override;
            function LessThan(const ALeft, ARight: TSubmodel): boolean; overload; override;
            function GreaterThan(const ALeft, ARight: TSubmodel): boolean; overload; override;
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          end;
          TDefaultAISModelComparerClass = class of TDefaultAISModelComparer;


      - TComparer<TSubmodel> : Equal, LessThan GreaterThan. System.Generics.Defaults.

      :



            function TDefaultAISModelComparer.Equal(const ALeft, ARight: TSubmodel): boolean;
            begin
      //  ,       !
      //       .
              Result := (Abs(ALeft.Prototype.Arousal - ARight.Prototype.Arousal) < 1.0e-5);
            end;
            function TDefaultAISModelComparer.LessThan(const ALeft, ARight: TSubmodel): boolean;
            begin
              Result := (ALeft.Prototype.Arousal < ARight.Prototype.Arousal);
            end;
            function TDefaultAISModelComparer.GreaterThan(const ALeft, ARight: TSubmodel): boolean;
            begin
              Result := (ALeft.Prototype.Arousal > ARight.Prototype.Arousal);
            end;


      7. - - i-, i- ! , :



            constructor TAISSubmodels.Create();
            begin
              inherited Create(TDefaultAISModelComparer.Create());
            end;
            constructor TAISSubmodels.Create(AOwner: TModel);
            begin
              Create();
              FOwner := AOwner;
            end;


      :

      7.1. TActivateInhibiteSystem



            class function GetClassSubmodels(): TSubmodelsClass; overload; override;




            class function TActivateInhibiteSystem.GetClassSubmodels(): TSubmodelsClass;
            begin
              Result := TAISSubmodels; // inherited GetClassSubmodels();
            end;


      7.2. i- ObjectId : .

      7.3. :

      – ;



            procedure TAISModels.InnerSetOwner(const AModel: TSubmodel);
            begin
            end;


      ObjectId



            function TAISModels.FindById(const AModelId: int64): TSubmodel;
            var
              AIndexOf: int64;
            begin
              if (not FMapById.TryGetValue(AModelId, AIndexOf)) then exit(nil);
              Result := this[AIndexOf];
            end;
            function TAISModels.FindByName(const AModelName: string): TSubmodel;
            var
              AIndexOf: int64;
            begin
              if (not FMapByName.TryGetValue(AModelName, AIndexOf)) then exit(nil);
              Result := this[AIndexOf];
            end;




            procedure TAISModels.Reorder(const AStartIndex: integer);
            var
              AIndexOf: integer;
            begin
              for AIndexOf := AStartIndex to Count - 1 do
                begin
                  FMapById.AddOrSetValue(this[AIndexOf].ObjectID, AIndexOf);
                  FMapByName.AddOrSetValue(this[AIndexOf].Name, AIndexOf);
                end;
              end;
            end;


      AStartIndex, 0!

      7.3. , - :



          TAISSubmodels = class(TSubmodels)
          protected
            procedure InnerSetOwner(const AModel: TSubmodel); overload; override;
          protected
              property Owner: TModel read GetOwner;
          public
            constructor Create(); overload; override;
            constructor Create(AOwner: TModel); overload; override;
            destructor Destroy(); override;
          public
            function FindById(const AModelId: int64): TSubmodel; overload; override;
            function FindByName(const AModelName: string): TSubmodel; overload; override;
          public
            procedure Reorder(const AStartIndex: integer); overload; override;
         end;
         TAISSubmodelsClass = class of TAISSubmodels;




      1. .

      .. i-



            function TModelGroup.InternalExec(): boolean;
            var
              AModel: TModel;
            begin
              for AModel in Models do
                begin
                  Result := AModel.Exec();
                  if (not Result) then break;
                end;
            end;


      :

      i-;

      i- (arousal) / Clamping - ( ),

      – ( );

      – ( ) () i- ( – );

      – ( ) - ;

      – -.

      2. ,

      2.1. TModel Perform(…)



            TModel = class(................)
      //.......................................................
            public
      //.......................................................
              function Perform(): boolean; overload; virtual;
      //.......................................................
            end;


      i- . - . , true, – false. – true.



      14
      : Exec(…) i-, Perform() «» – i- .


      2.2. i- TQueuePerformModels ( - )



          TQueuePerformModels = class(TQueue<TModel>)
          public
      //.......................................................
            constructor Create(); overload; override;
            destructor Destroy(); override;
      //.......................................................
          end;
      //.......................................................
            constructor TQueuePerformModels.Create();
            begin
              inherited Create();
              FreeObjects := false;
            end;
            destructor TQueuePerformModels.Destroy();
            begin
              inherited Destroy();
            end;
      //.......................................................


      TActivateInhibiteSystem FQueuePerformModels, , EnqueuePerformModels(…), , , :



          TActivateInhibiteSystem = class(TModelGroup)
          private
      //.......................................................
              FQueuePerformModels: TQueuePerformModels;
          protected
      //.......................................................
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          public
      //.......................................................
          public
            function Perform(): boolean; overload; override;
      //.......................................................
          end;
      //.......................................................
          TActivateInhibiteSystem = class(TModelGroup)
          private
      //.......................................................
              FQueuePerformModels: TQueuePerformModels;
          protected
      //.......................................................
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          public
            function Perform(): boolean; overload; override;
      //.......................................................
          end;
      //.......................................................
            constructor TActivateInhibiteSystem.Create();
            begin
              inherited Create();
              Models.FreeObjects := false;
              FClamping := 0.0;
              FQueuePerformModels := TQueuePerformModels.Create();
            end;
            destructor TActivateInhibiteSystem.Destroy();
            begin
              System.SysUtils.FreeAndNil(FQueuePerformModels);
              FClamping := 0.0;
              Models.FreeObjects := false;
              inherited Destroy();
            end;
      //.......................................................
            function TActivateInhibiteSystem.EnqueuePerformModels(): TQueuePerformModels;
            var
              ASubmodel: TSubmodel;
            begin
              Result := FQueuePerformModels;
      //   .
              OrderBy();
      //  .
              Submodels.Reorder();
      //  
              for ASubmodel in Submodels do
                begin
      //    ,    
      //       .
                  if (not Check(ASubmodel)) then break;
                  Result.Enqueue(ASubmodel);
                end;
            end;
      //.......................................................


      Perform() :



      //.......................................................
            procedure TActivateInhibiteSystem.BeforePerform();
            var
              ASubmodel: TSubmodel;
            begin
              for ASubmodel in Submodels do
                begin
                  ASubmodel.Prototype.ChangeArousal(Self);
                end;
            end;
      //.......................................................
            function TActivateInhibiteSystem.Perform(): boolean;
            var
              AModel: TModel;
            begin
              Result := true;
              BeforePerform();
      //  
              EnqueuePerformModels();
      //     .
              while (not FQueuePerformModels.IsEmpty()) do
                begin
                  if (Accept(FQueuePerformModels.Dequeue())) then continue;
                  Result := false;
                  break;
                end;
      //    ,    .
              while (not FQueuePerformModels.IsEmpty()) do
                FQueuePerformModels.Dequeue();
            end;
      //.......................................................


      2.3. Check(…), BeforePerform(…) Accept(…). Check – . :



      //.......................................................
            function TActivateInhibiteSystem.Check(ASubmodel: TSubmodel): boolean;
            begin
      //   !
              Result := (ASubmodel.Prototype.Arousal >= Clamping);
            end;
      //.......................................................


      Accept ,



      //.......................................................
      Result := AModel.Perform();
      //.......................................................


      , i- , . true, , – false . .

      TActivateInhibiteSystem.Perform i- .

      BeforePerform(…) i-



            procedure TActivateInhibiteSystem.BeforePerform();
            var
              ASubmodel: TSubmodel;
            begin
              for ASubmodel in Submodels do
                begin
                  ASubmodel.Prototype.ChangeArousal(Self);
                end;
            end;


      , TModel ChangeArousal(…)



            procedure TModel.ChangeArousal(AActivateInhibiteSystem: TActivateInhibiteSystem);
            begin
            end;


      - i-. , , .



      -



      -.

      - :



          TModelsNet = class(TModelGroup)
          private
              FPlatform: TPlatform;
          private
      // 
              Fontentment: double;
              FAIS: TActivateInhibiteSystem;
          protected
            function Getontentment(): double; overload; virtual;
            procedure Setontentment(const AValue: double); overload; virtual;
            function GetPlatform(): TPlatform; overload; override;
            procedure SetPlatform(AValue: TPlatform); overload; override;
          protected
              property Contentment: double read Getontentment write Setontentment;
          protected
              property AIS: TActivateInhibiteSystem read FAIS;
              property Platform: TPlatform read GetPlatform write SetPlatform;
          protected
            class function GetClassSubmodels(): TSubmodelsClass; overload; virtual;
            class function GetClassAIS(): TActivationInhibitionSystemClass; overload; virtual;
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          public
            function Exec(): boolean; overload; override;
          end;
          TModelsNetClass = class of TModelsNet;


      :



            constructor TModelsNet.Create();
            begin
              inherited Create();
              Fontentment := 0.0;
              FAIS := GetClassAIS().Create(Self);
              FAIS.Owner := Self;
              FPlatform := nil;
              AIS.Prepare();
            end;
            destructor TModelsNet.Destroy();
            begin
              FPlatform := nil;
              System.SysUtils.FreeAndNil(FAIS);
              Fontentment := 0.0;
              inherited Destroy();
            end;
            class function TModelsNet.GetClassSubmodels(): TSubmodelsClass;
            begin
              Result := TSubmodels;
            end;
            class function TModelsNet.GetClassAIS(): TActivationInhibitionSystemClass;
            begin
              Result := TActivateInhibiteSystem;
            end;
            function TModelsNet.Exec(): boolean;
            begin
              Result := InternalExec();
      //     ,     
      //     InternalExec().
              Result := AIS.Perform();
            end;
            function TModelsNet.Getontentment(): double;
            begin
              Result := Fontentment;
            end;
            procedure TModelsNet.Setontentment(const AValue: double);
            begin
      //        FVitality := AValue;
            end;
            function TModelsNet.GetPlatform(): TPlatform;
            begin
              Result := FPlatform;
            end;
            procedure TModelsNet.SetPlatform(AValue: TPlatform);
            var
              ASubmodel: TSubmodel;
            begin
              FPlatform := AValue;
              for ASubmodel in Submodels do
                begin
                  ASubmodel.Prototype.Platform := Self.Platform;
                end;
            end;


      Prepare(…):



      //.......................................................
          AIS.Prepare();
      //.......................................................


      - . Prepare(…),



      //.......................................................
          TSpeedyAIS = class(TActivateInhibiteSystem)
      //.......................................................
          public
            procedure Prepare(); overload; overrride; 
      //.......................................................
          end;
      //.......................................................
            procedure TSpeedyAIS.Prepare(); 
            begin
      //.......................................................
              Submodels.Add(TSubmodel.Create(Owner.Automate.FindByName('')));
              Submodels.Add(TSubmodel.Create(Owner.Automate.FindByName('')));
      //.......................................................
            end;
      //.......................................................


      , , -, .

      Prepare(…) , – - , , - . !

      - :

      1. - , - .

      2. - - () .

      3. - .

      - , …



      -



      -



      - – , - .

      - :

      1. .

      2. i- () () () -.

      3. i-

      4. .

      :

      1. i- -;

      2. i- ();

      3. i- ;

      4. - ( - , - – );

      5. -;

      6. -;

      -:



      [XMLROOT('TAutomate')][XMLSerializerMode([soOrderSerialize])]
          TAutomate = class(TDesignate)
          private
      //   i-.
              FSequence: TSequence;
          private
              FReady: boolean;
          private
      //   "".
              Fontentment: double;
          private
      //   i-.
              FModels: TModels;
              FMNet: TModelsNet;
      //    i-.
              FConnections: TConnections;
          private
      //    i-.
              FEngine: TEngineConveyor;
          private
      //  - .
              FPlatform: TPlatform;
          private
              FOnBeforeExecute: TOnAutomateExecuteBefore;
              FOnAutomateBeforeAction: TOnActionExecuteBefore;
              FOnAutomateAfterAction: TOnActionExecuteAfter;
              FOnAfterExecute: TOnAutomateExecuteAfter;
          private
            function GetObjectName(): TNameObject; overload; override;
            procedure SetObjectName(const AValue: TNameObject); overload; override;
            function GetObjectNameShort(): TNameShort; overload; override;
            procedure SetObjectNameShort(const AValue: TNameShort); overload; override;
            function GetObjectCode(): TObjectName; overload; override;
            procedure SetObjectCode(const AValue: TObjectName); overload; override;
          protected
            function GetSequence(): TSequence; overload; virtual;
            procedure SetSequence(const AValue: TSequence); overload; virtual;
          protected
            function GetReady(): boolean; overload; virtual;
            procedure SetReady(const AValue: boolean); overload; virtual;
          protected
            function Getontentment(): double; overload; virtual;
            procedure Setontentment(const AValue: double); overload; virtual;
            function GetModels(): TModels; overload; virtual;
            procedure SetModels(const AValue: TModels); overload; virtual;
            function GetConnections: TConnections; overload; virtual;
            procedure SetConnections(const AValue: TConnections); overload; virtual;
            function GetEngine(): TEngineConveyor; overload; virtual;
            procedure SetEngine(const AValue: TEngineConveyor); overload; virtual;
            function GetPlatform(): TPlatform; overload; virtual;
            procedure SetPlatform(const AValue: TPlatform); overload; virtual;
          protected
            function GetOnAutomateBeforeExecute(): TOnAutomateExecuteBefore; overload; virtual;
            procedure SetOnAutomateBeforeExecute(const AValue: TOnAutomateExecuteBefore); overload; virtual;
            function GetOnBeforeAction(): TOnActionExecuteBefore; overload; virtual;
            procedure SetOnBeforeAction(const AValue: TOnActionExecuteBefore); overload; virtual;
            function GetOnAfterAction(): TOnActionExecuteAfter; overload; virtual;
            procedure SetOnAfterAction(const AValue: TOnActionExecuteAfter); overload; virtual;
            function GetOnAutomateAfterExecute(): TOnAutomateExecuteAfter; overload; virtual;
            procedure SetOnAutomateAfterExecute(const AValue: TOnAutomateExecuteAfter); overload; virtual;
          protected
            class function GetClassModels(): TModelsClass; overload; virtual;
            class function GetClassConnections(): TConnectionsClass; overload; virtual;
            class function GetClassEngineConveyor(): TEngineConveyorClass; overload; virtual;
            class function GetClassModelNet(): TModelsNetClass; overload; virtual;
          protected
            procedure Binding(); overload; virtual;
            procedure BindSubmodel(ASubmodel: TSubmodel); overload; virtual;
          protected
            function ExecBeforeExecute(): boolean; overload; virtual;
            function ExecBeforeAction(): boolean; overload; virtual;
            procedure ExecAfterAction(var AStatus: boolean); overload; virtual;
            procedure ExecAfterExecute(var AStatus: boolean); overload; virtual;
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          public
            procedure Clear(); overload; virtual;
          public
            function FindById(const AModelId: int64): TModel; overload; virtual;
            function FindByName(const AModelName: string): TModel; overload; virtual;
          public
            procedure LoadFromFile(const AFileName: string); overload; virtual;
            procedure SaveToFile(const AFileName: string); overload; virtual;
          public
            function Next(): boolean; overload; virtual;
            function Exec(): boolean; overload; virtual;
            procedure Reset(); overload; virtual;
          public
            function Connect(ASourceId, ATargetId: int64): boolean; overload; virtual;
            function Disconnect(ASourceId, ATargetId: int64): boolean; overload; virtual;
            function ConnectBy(ASourceId, ATargetId: int64): boolean; overload; virtual;
          public
              property Ready: boolean read GetReady write SetReady;
          public
              property Platform: TPlatform read GetPlatform write SetPlatform;
          published
      [XMLEmbedding('Sequence')]
              property Sequence: TSequence read GetSequence write SetSequence;
          published
      [XMLARRAY('Models','Model')]
              property Models: TModels read GetModels write SetModels;
      [XMLARRAY('Connections','Connection')]
              property Connections: TConnections read GetConnections write SetConnections;
      [XMLARRAY('Conveyor','Model')]
              property Engine: TEngineConveyor read GetEngine write SetEngine;
          published
      [XMLAttribute('Vitality')]
              property Contentment: double read Getontentment write Setontentment;
          published
              property OnBeforeExecute: TOnAutomateExecuteBefore read GetOnAutomateBeforeExecute write SetOnAutomateBeforeExecute;
              property OnBeforeAction: TOnActionExecuteBefore read GetOnBeforeAction write SetOnBeforeAction;
              property OnAfterAction: TOnActionExecuteAfter read GetOnAfterAction write SetOnAfterAction;
              property OnAfterExecute: TOnAutomateExecuteAfter read GetOnAutomateAfterExecute write SetOnAutomateAfterExecute;
          end;
          TAutomateClass = class of TAutomate;


      -:

      1. TDesignate, ;

      2. , ,

      3. ontentment – «» -, «» - ;

      4. Ready, - ( ).

      5. - :

      OnBeforeExecute (OnAfterExecute) – () / -;

      OnBeforeAction (OnAfterAction) – () / i-.

      .

      6. / - :

      – Next(): boolean – / -:



            function TAutomate.Next(): boolean;
            begin
              if (not ExecBeforeAction()) then exit(false);
              Result := Exec();
              ExecAfterAction(Result);
            end;


      – Exec(): boolean – / - , «» -:



            function TAutomate.Exec(): boolean;
            begin
              if (not ExecBeforeExecute()) then exit(false);
              repeat
                Result := Next();
              until (not Result);
              ExecAfterExecute(Result);
            end;


      7. :

      Clear() – -;

      FindById(const AModelId: int64) – ;

      FindByName(const AModelName: string) – ;

      LoadFromFile(const AFileName: string) – - :



            procedure TAutomate.LoadFromFile(const AFileName: string);
            var
              AlterPath: string;
              ANameFile: JOBLIB.FileName.TFileName;
            begin
              ANameFile := AFileName;
              if (TFile.Exists(ANameFile)) then
                begin
                  Ready := false;
                  TSerializer.LoadFromFile(Self, AFileName);
                  Ready := true;
                  Binding();
                  Modified := false;
                  exit;
                end;
              Modified := true;
              TSerializer.SaveToFile(Self, AFileName);
              Modified := false;
            end;


      SaveToFile(const AFileName: string) – - ;

      Reset() – - ;

      Binding() – - :



            procedure TAutomate.Binding();
            var
              AModel: TModel;
              ASubmodel: TSubmodel;
              AGroupModels: TModelGroup;
              AConnection: TConnection;
            begin
              Fontentment := 0.0;
      //     !
              for AModel in Models do
                begin
                  AModel.Automate := Self;
                  if (not (AModel is TModelGroup)) then continue;
                  AGroupModels := (AModel as TModelGroup);
                  for ASubmodel in AGroupModels.Submodels do
                    begin
                      BindSubmodel(ASubmodel);
                    end;
                end;
      //    !
              for AConnection in Connections do
                begin
                  with AConnection do
                    begin
                      FindById(SourceId).Connect(FindById(TargetId), AConnection);
                    end;
                end;
            end;


      BindSubmodel(ASubmodel: TSubmodel) – () - ( ).

      8. -, -, – .





      . -,

      i-

      – /.

      TEngineConveyor:



          TEngineConveyor = class(TModelGroup)
          private
              FCurrModel: int64;
          protected
            procedure SetModesFreePrototype(const AValue: TModesFreePrototype); overload; override;
          public
            constructor Create(); overload; override;
            constructor Create(AOwner: TAutomate); overload; virtual;
            destructor Destroy(); override;
          public
            procedure Reset(); overload; virtual;
            function Next(): boolean; overload; virtual;
            function Perform(): boolean; overload; override;
            function Exec(): boolean; overload; override;
          end;
          TEngineConveyorClass = class of TEngineConveyor;


      , :



            procedure TEngineConveyor.Reset();
            begin
              FCurrModel := 0;
            end;
            function TEngineConveyor.Next(): boolean;
            begin
              if (not Automate.ExecBeforeAction()) then exit(false);
              Result := false;
              if (FCurrModel < Submodels.Count) then
                begin
                  Result := Submodels[FCurrModel].Prototype.Exec();
                  System.Inc(FCurrModel);
                end;
              Automate.ExecAfterAction(Result);
            end;
            function TEngineConveyor.Exec(): boolean;
            begin
              Reset();
              if (not Automate.ExecBeforeExecute()) then exit(false);
              repeat
                Result := Next();
              until (not Result);
              Automate.ExecAfterExecute(Result);
            end;
            function TEngineConveyor.Perform(): boolean;
            begin
            end;


      , Exec Next -



            function TAutomate.Next(): boolean;
            begin
              Result := Engine.Next();
            end;
            function TAutomate.Exec(): boolean;
            begin
              Result := Engine.Exec();
            end;




            procedure TEngineConveyor.SetModesFreePrototype(const AValue: TModesFreePrototype);
            begin
            end;


      - ( TEngineConveyor FModesFreePrototype := []).



      ()



      () -

      – ,

      – , .

      , , , . :



          TPlatform = class(TModel)
          private
              FOnBeforeExecute: TOnAutomateExecuteBefore;
              FOnAutomateBeforeAction: TOnActionExecuteBefore;
              FOnAutomateAfterAction: TOnActionExecuteAfter;
              FOnAfterExecute: TOnAutomateExecuteAfter;
          protected
            function GetOnAutomateBeforeExecute(): TOnAutomateExecuteBefore; overload; virtual;
            procedure SetOnAutomateBeforeExecute(const AValue: TOnAutomateExecuteBefore); overload; virtual;
            function GetOnBeforeAction(): TOnActionExecuteBefore; overload; virtual;
            procedure SetOnBeforeAction(const AValue: TOnActionExecuteBefore); overload; virtual;
            function GetOnAfterAction(): TOnActionExecuteAfter; overload; virtual;
            procedure SetOnAfterAction(const AValue: TOnActionExecuteAfter); overload; virtual;
            function GetOnAutomateAfterExecute(): TOnAutomateExecuteAfter; overload; virtual;
            procedure SetOnAutomateAfterExecute(const AValue: TOnAutomateExecuteAfter); overload; virtual;
          protected
            function HandleBeforeExecute(AAutomate: TAutomate): boolean; overload; virtual;
            function HandleAutomateBeforeAction(AAutomate: TAutomate): boolean; overload; virtual;
            function HandleAutomateAfterAction(AAutomate: TAutomate; const AStatus: boolean): boolean; overload; virtual;
            function HandleAfterExecute(AAutomate: TAutomate; const AStatus: boolean): boolean; overload; virtual;
          public
            constructor Create(); overload; override;
            destructor Destroy(); override;
          public
            procedure Prepare(); overload; virtual;
          public
            function Exec(): boolean; overload; override;
          published
              property OnBeforeExecute: TOnAutomateExecuteBefore read GetOnAutomateBeforeExecute write SetOnAutomateBeforeExecute;
              property OnBeforeAction: TOnActionExecuteBefore read GetOnBeforeAction write SetOnBeforeAction;
              property OnAfterAction: TOnActionExecuteAfter read GetOnAfterAction write SetOnAfterAction;
              property OnAfterExecute: TOnAutomateExecuteAfter read GetOnAutomateAfterExecute write SetOnAutomateAfterExecute;
          end;
          TPlatformClass = class of TPlatform;


      1. () -;

      2. ;

      3. Exec:



            function TPlatform.Exec(): boolean;
            begin
              Prepare();
              Result := Automate.Exec();
            end;


      4. , - («») . …





      , -, , , – . , :

      1. «», () -.

      2. :

      2.1. -.

      2.2. () - i- .

      2.3. (, ) i- .

      2.4. -.

      2.5.1. - ( ).

      2.5.2. - ( ).

      3. () - - ().

      4. () -.

      5. () i-, ().

      6.1. () (DLL / BPL), .

      6.2. i- , , (, ZeroMQ), .

      7. «» - .





      , .. .

      1. , [3] .. . :

      – « »,

      – -, (M- ).

      2. , , [3], [2, 4]. , .. , , [3] , : [4], [1] [2].

      3. , «» , -.

      4. [3] «» , .. , - , , «-» . !

      5. , [3] . () .. : , i- . .. , , , .. [7] .. [8].

      6. i- – (, ) – , ( , , ) .

      7. - . - . , , , - « » . , - - . . .

      , , , , !

      , .



      (Ustas) open-source , .




      1. .. . – , 1965.

      2. .. . – , 1969.

      3. .., .., .., .. : . – , 1973.

      4. .. – , 1979.

      5. .. . – ., 1981.

      6. .. . – ., 1987.

      7. .., .., .. – «» — . , « ». ., 1975; . 152–171 « ». ., 2010; . 61-81.

      8. Demin A.V., Vityaev E.E. El sistema de control animado basado en la teoría de sistemas funcionales de P.K. Anokhina

      9. Rabinovich M.I., Myezinolu M.K. Dinámica no lineal del cerebro: emociones y actividad intelectual - UFN, vol. 180 (2010), p. 371-387




All Articles