オートマトンとインテリジェントな動作。コンセプト(アプローチ)の主な規定Amosova N.M.





Alexander Ershov(Ustas)の出版物「ニューラルネットワークビジュアル検索」提起されたトピックの1つを続けて、Habrの読者がN.M.の世界に飛び込むことを提案します。アモソワ、彼女-モデル、Mネットおよびマシン。彼らが「強力な知性」、または他の用語では「人工的な知性」の愛好家がその実装方法を理解することに近づくことを可能にする「銀の弾丸」の役割の最も可能性の高い候補であることを願っています。



() . « . », .. : 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. - , , -.



3. - .



4. - , . - , .



5. - , , .



.



6. - , , , .



6.1. - , .



6.2. - . - , .



6.2.1. - .



6.2.2. - , Π, . j- - t ΠのトンのJ.



6.2.3. - , - .



7. - , , . :



7.1. - - j -.



7.2. - , .



7.3. - .



7.4. R, , , , .



, - j - , t R tij.



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



9. Rtij Rtij=rijrijr((0jr((0j, rijrij — , r((0jr((0j — .



10. , Rtij, , , , - . rijrij. , rijrij Rtij, — .



r((0ijrij((1そして





r((0ijrij..。((1b



.



10.1. Rtij=0 Rtij, .. 0.00.00.00.0.



10.2. , -:



Rtij=R((ΠtΠtjRt-1ijΔt((2



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



10.3. t , Rtij=0. Rt-1ij=0 Rtij>>0, , t Rtij. , . (2) , ,



Rtij=R1((ΠtΠtjΔt((3



(3) .



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



rtij=r1((rt-1ijrt((0ij((4そして



rtij=r2((rt-1ijrt((0ij((4b



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



rt((0ij=r3((rt-1((0ij((そして



rt((0ij=r4((rt-1((0ij((b



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



10.5. E (E) - rtij (rtij) - j- - Πj. - - (E) (E) :



E=E((Πt1Πt2..。rt1rt2..。..。..。((6A



E=E((Πt1Πt2..。rt1rt2..。..。..。((6b



11. -.



11.1. - , - . -, . - .



11.2. - - . — - θt, Et - - t. — . (Kt), Et, (Ktn). Ktn θt , Kt.



11.3. , - , :



Kt=Φ((KtnEt((7



11.4. , - :



Πt=T((Pt-1Ktn((8



(8) - « » -.



11.4. , - - :



Πt=Π((KtθtEt((ナイン



11.5. Ktn θt -:



θt=θ((θt-1Πt((A



Ktn=K((KtnΠt((b



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



12. - - .



12.1. - , , , , .



12.2. - :



- ;

- ;

C ;

- ;

J -.



— - .



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



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



-





- , , - - - .



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



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



Πt=Φ((EtEtΠt-1Kt-1nθt-1((十一



- -, -, -. - .



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



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



, - -. . .. , .



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



3
, Δt, .



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


, - . Δ -, .





- :



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



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



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



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



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



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



著者によると、自己学習と自己組織化のプロセスは教育につながる可能性があります -「第2層」モデル、つまり オリジナルからのアンサンブル-モデルは、「第3層」などのアンサンブルを形成できます。この種のアンサンブルは、Mネットワークの新しい機能要素、およびそれらの形成プロセス、つまり以前に利用可能なものに基づいて新しい複雑な概念を形成するプロセスと見なすことができます。





図1.さまざまなレベルの一般化のモデルにおけるオブジェクトとその反映。「入力」と「出力」:En-エネルギー; B-物質。再現図。[4]から12。

clで説明されているプロセス。図1と図2では、著者は自己学習プロセスと呼んでいます。3と4は、 Mネットワーク自己組織化のプロセスと呼ばれます。



M-netの正式な定義



M-netの要素の以前に導入された特性(- ) :



– ;

– ;

– .



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



(3)-(5), -.



(2) -.



-. - μ :



μ=PSRLFC((12



P-; S-; R — ; L — ; F — ; C — ; -.



– ()





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





, -モデル-この場合、Mオートマトンで正のフィードバックが発生する可能性が高くなります。これにより、このようなクラスターの励起が無制限に(指数関数的に)増加する状況になります。 -モデル。間の肯定的なフィードバック-モデルは、外部環境を介して「接続を閉じる」場合にも可能です。これの自然な類似物は、いわゆる「蟻の死の輪」の発生、または行進するシルクワームの毛虫の円運動である可能性があります(同様の状況は、昆虫の世界だけでなく発生する可能性があります-たとえば、を参照してください残念ながら、より複雑な状況では、雄羊の輪は、そのような「輪の中を歩く」ことが人間の集団に見られます。



死の蟻の輪

マーチングシルクワームキャタピラーの円運動

備考4
i- ( ).


, - ( -). .





:



1. – r-, ;



2. - ( ) – θ;



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



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



… ( ), () .

, « » - ( « ») – -





, , .



« »! - . - ( ).



5
« » , .


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



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

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

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

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



- ( [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] .

図2.特定の認知機能の実行に関与する多数の相互作用モードの並列および順次アクティビティを説明する動的システムの多次元位相空間の「ヘテロクリニックツリー」(最終決定または開発された行動戦略を表す状態は、ライトディスクでマークされます)。図:レビューから9 [9]

このような高レベルのメカニズムは、特定のグループの興奮の制御されない増加を抑制することを可能にするだけではありません -モデルだけでなく、必要に応じて、特定のアンサンブルのセット内でのアクティビティの伝達の「悪循環」を解消します -モデル。



基本的なプロパティ



1.コンセプトでは、SDTの役割は、Mネットワークで発生する情報処理プロセスでローカルの正と負のフィードバックを整理することです。これにより、各時間間隔で、Mネットワークで並行して開発されている他のプログラムよりも、適応の観点から最も重要な情報処理プログラムの優位性が保証されます。



2.SDTは次のように動作します。



2.1。いくつかのM-netを与えましょう。



2.2。情報興奮を処理する過程で-ネットワークモデルは変化しています。それぞれの励起量-モデルは、それに記録された情報の「重要性」または価値を間接的に示します。



SDSとMネットワークの他の要素との相互作用のスキームを次の図に示します。





図3.SDSのスキーム。 S -SUT; F -メインモデルの強化。 B -残りをブレーキします。 1 そして 2 -周囲の世界の意味の階建てモデル。 A1A2 -外向きの行動の階建てモデル。 C1C2 -意識のプログラムのモデル; e f-感情と感情のモデル。再現図。[2]から19。

2.3。最も興奮している各時間の割り当てが想定されています-情報処理の一般的な過程への影響をモデル化し、強化することで、ネットワークの効率が向上します。これはまさにSDTが解決するものです。



2.4。仕事SUT:



2.4.1。各瞬間のSDTは最も興奮しているものを選択します-モデル、彼女の興奮をさらに高め、残りの興奮性を低下させます -モデル(速度を落とします)。ある時点で同じ最大の興奮があった場合n -モデル、そしてそれらのそれぞれのためのSDTからの追加の興奮は n 時間が短縮されました。



2.4.2。「アクティブ」ごとに-モデルにはブレーキ「ツイン」が必要です(補完的 -), -. . , ().



2.4.3. -. - , -.



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



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



2.4.6. «» , ( , - ).



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



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



, , :





図4.階層型SDSの編成図。「作業」モデルの3つのフィールドと、最初の()と2番目(II)増幅を伴うSDTのフロア(持ってる)とブレーキ(T)要素。再現図。仕事から20 [2]。

3.1。すべてしましょう-ネットワークモデルは、従来、何らかの理由で重複しないいくつかのグループに結合されていました。これらは、最初の(最低の)レベルのグループです。これらのグループは、順番に、より大きな第2レベルのグループに結合でき、後者は第3レベルのグループに結合できます。トップレベルのグループには、前のすべてのグループが含まれるため、すべて-ネットワークモデル。それぞれの特定の場合におけるそのような「ピラミッド」のレベルの総数は、Mネットワークの複雑さとオートマトンが構築されているタスクの複雑さに応じて決定することができます。



次の図は、階層型SDTの編成図と、レベルとの相互作用の原理を示しています。 -Mネットワークのモデル。



3.2。そのような各グループに-モデル、SDTサブシステムの1つが関連付けられています。Mネットワークでは、異なるレベルのグループが存在するのと同じ数のSDTサブシステムが同時に機能します。





図5.階層型SDTとレベルの相互作用のスキーム -Mネットワークのモデル。 AB -モデルを使用した皮質の「作業」ゾーン a – a – ab – b – bc – c – cd – d – d..。

最も興奮したモデル a – a – a ゾーン内 A、 ゾーン内 B モデル c – c – c より抑制されていない d – d – d..。



素子 N から持ってるT- 強化された要素 M から抑制 から持ってるT-; T -ブレーキング; 持ってる - 利得。



再現図。仕事から21 [2]。



3.3。実装のための可能なオプションの1つとして、トレースを提供できます。作業アルゴリズム:



3.3.1。1つのレベルのSDSのサブシステム(サブシステムのレベルは、それらが機能するグループのレベルに応じて割り当てられます)は、励起を比較し、残りの分離と抑制を増幅します-グループ内のモデルのみ。次のレベルのSDTのサブシステムは、それぞれ独自のグループ内にあり、グループのすでに平均的な励起を比較します-下位レベルのモデル。





図6.関係の例 -Mネットワークのモデル。 A -最上階モデル。 a、b、c -低層モデル; 12..。..。..。 -隣接するモデル。 D -モデル-拮抗薬; T -ブレーキング; K -高品質モデル; H1H2-感情のモデル。点線はブレーキ経路を示しています。再現図。仕事から22 [2]。

3.3.2。ゲインはシングルには適用されません-モデル、しかしすべてに -現在割り当てられているグループのモデル。 -同じレベルの他のグループのモデルは、比例してブレーキがかけられます。



3.4. -, , - .



3.5. , -.



-



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



, , - , . — -.



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



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



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



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



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



5. - :



-, .

-. -, , «» «» .

– () , , , .



-



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



2. -:



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



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



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



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



2.5。間のリンクを確立するとき-さまざまなアンサンブルのモデル。その強度(透過性)は、アンサンブルに含まれるジョイント励起の頻度に依存します。 -モデル、PrとNPrの評価のための統合センターの状態、およびその他のいくつかの要因、強く関連している -モデルは、他のモデルと比較して、増幅ブレーキシステムによる連続選択の可能性が高くなります -ネットワークモデル。したがって、SDTを割り当てる場合-強く接続された2つのアンサンブルのいずれかに属するモデルの場合、しばらくするとSDTがいずれかのアンサンブルに切り替わる可能性が高くなります。 -2番目のアンサンブルのモデル。





図7.N.の概念における個々の要素とそれらの関係のクラス図の可能な(最終ではない)バージョン。アモソフ。

3.覚醒の変化 - , — . , .



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



-



-



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



:



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



2) , -;



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



4) , , -;



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



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



- μA: - μ そしてその機能のためのアルゴリズムが含まれています A..。一般に、Mオートマトンの動作は次のように表すことができます。





図8.Mオートマトン機能アルゴリズムのブロック図。再現図。仕事から5 [3]。

M-netの場合 μは(12)の形式で与えられ、そのようなMオートマトンは完全です。



M-netのすべての機能が実現されているわけではないM-オートマトンを構築することは可能です。



自己学習型Mオートマトンは、Mネットワークタスクの完全性に応じて区別されます。



μ=PSRLC((13



および非学習M-オートマトン。



μ=PSRC((14



符号 対応する項目が入力されていないことを示します。



アルゴリズム そして 自己学習型の場合、Mオートマトンにはブロックが含まれていません F または自己組織化の特性のグループ、および非学習者の場合-ブロック F そして L -自己学習の特徴のグループ。



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



- -, そして .



:



1. - (-) -.



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



-



, . - :



1. , (: ) .



2. . 1 -. -, .



3. , .



4. « » -, .. .



5. «» .



6. . 3 , . -.



7. . 3 -.



8. , - . . , , .



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;


.



- :



  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;    


, (), , : .



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



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. P.K.による機能システムの理論に基づくアニメート制御システム アノキナ

      9.ラビノビッチM.I.、ミエジノルM.K. 脳の非線形ダイナミクス:感情と知的活動-物理学±Uspekhi、vol。180(2010)、p。371-387




All Articles