Other Links:
|
This page contains the version history for the Inference Engine Component Suite. The latest patches and updates are available on our Support Page. Note: THE IECS uses the Fuzzy Logic Component Library and the RiverSoftAVG Common Classes Library. Please see the FLCL Version History and RCCL Version History for additional details. ------------------------------------------------------------------- November 19, 2023 Version 7.3 - Updated for RAD Studio 12 Athens Support ------------------------------------------------------------------- July 23, 2023 Version 7.2.1 - Updated for RAD Studio 11.3 Alexandria Support ------------------------------------------------------------------- September 19, 2021 Version 7.2 - Updated for RAD Studio 11 Alexandria Support ------------------------------------------------------------------- June 10, 2020 Version 7.1.1 - Updated for RAD Studio 10.4 Sydney Support - Changed {$IFDEF NEXTGEN}[Weak] to {$IFDEF AUTOREFCOUNT}[Weak] - Added Contnrs if NEXTGEN is not defined to remove compiler hints ------------------------------------------------------------------- November 25, 2018 Version 7.1 - Updated for RAD Studio 10.3 Rio Support ------------------------------------------------------------------- January 27, 2018 Version 7.0.2 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- August 13, 2017 Version 7.0.1 - Recompiled for RAD Studio 10.2.1 Tokyo Support ------------------------------------------------------------------- April 2, 2017 Version 7.0 - Added RAD Studio 10.2 Tokyo Support - Added Linux Support - Added Linux Console Demo Application ------------------------------------------------------------------- February 20, 2017 Version 6.1.5 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- January 8, 2017 Version 6.1.4 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- November 6, 2016 Version 6.1.3 - Updated unit namespace documentation for IECS units ------------------------------------------------------------------- October 9, 2016 Version 6.1.2 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- September 5, 2016 Version 6.1.1 - Recompiled because of RiverSoftAVG Charting Component Suite Changes ------------------------------------------------------------------- July 24, 2016 Version 6.1 - Reduced size of installer by removing RiverSoftAVG Common Classes Library - Reduced size of installer by removing Fuzzy Logic Component Library - Updated installer to download RivSerSoftAVG Common Classes Library as needed - Updated installer to download Fuzzy Logic Component Library, decrypt it and install as needed - Updated installer creation procedure to automatically generate version numbers and be encrypted ------------------------------------------------------------------- June 5, 2016 Version 6.0.2 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- May 22, 2016 Version 6.0.1 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- April 24, 2016 Version 6.0 - Added RAD Studio 10.1 Berlin Support - Removed Directory Exists warning from installer - Modified TInputBoxFMXFunction.Call method to use TDialogServiceSync in 10.1+ - Modified TInputQueryFMXFunction.Call method to use TDialogServiceSync in 10.1+ - Modified TMessageDlgFMXFunction.Call method to use TDialogServiceSync in 10.1+ - Disabled TInputBoxFMXFunction for ANDROID - Disabled TInputQueryFMXFunction for ANDROID - Disabled TMessageDlgFMXFunction for ANDROID - Modified TIEConsoleDlg.FindText method to use TDialogServiceSync.MessageDialog method in 10.1 Berlin - Modified TIEConsoleDlg.InferenceEngine1ReadLine method to use TDialogServiceSync.InputQuery method in 10.1 Berlin - Modified TIEConsoleDlg.InferenceEngine1ReadToken method to use TDialogServiceSync.InputQuery method in 10.1 Berlin - Fixed bug in TIEConsoleDlg.ceSearchKeyUp method where carriage return would not be recognized - Fixed row index out of bounds error in TValueEditDlg.sgValuesMouseDown method (FMX) - Modified TModulesEditDlg.miRenameClick method to use TDialogServiceSync.InputQuery method in 10.1 Berlin - Changed Search Box from TClearingEdit to TEdit in RuleEditorForm ------------------------------------------------------------------- March 13, 2016 Version 5.9.6 - Fixed Controls being grayed out in Delphi Palette when target was iOS 64-bit ------------------------------------------------------------------- March 5, 2016 Version 5.9.5 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- February 5, 2016 Version 5.9.4 - Recompiled because of RiverSoftAVG Common Classes Library Changes - Recompiled for Delphi 10 Seattle Update 1 ------------------------------------------------------------------- January 10, 2016 Version 5.9.3 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- December 6, 2015 Version 5.9.2 - Recompiled because of RiverSoftAVG Common Classes Library Changes - Fixed bug in installer which would not set the library path correctly for iOS64 in XE8+ ------------------------------------------------------------------- November 16, 2015 Version 5.9.1 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- September 6, 2015 Version 5.9 - Added RAD Studio 10 Seattle Support - Added Winapi.Windows (instead of just Windows) to uses clause to correctly compile in RX 10 Seattle - Changed assignment to tsModules.FullSize to use TBehaviorBoolean type introducted in Delphi 10 Seattle (FMX.RS.RuleEditorForm.pas) - Changed assignment to tsModules.FullSize to use TBehaviorBoolean type introducted in Delphi 10 Seattle (FMX.RS.FactTemplateEditorForm.pas) - Changed assignment to tsModules.FullSize to use TBehaviorBoolean type introducted in Delphi 10 Seattle (FMX.RS.FactEditorForm.pas) ------------------------------------------------------------------- June 14, 2015 Version 5.8.3 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- May 17, 2015 Version 5.8.2 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- May 3, 2015 Version 5.8.1 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- April 19, 2015 Version 5.8 - Added RAD Studio XE8 Support - Renamed IEInterfaces to IECSInterfaces because of collision with new System.Win.IEInterfaces unit - Changed uses unit from IEInterfaces to new name, IECSInterfaces - Added reference to FMX.Memo.Types in FMX.RS.RuleEditorForm for Delphi XE8+ - Modified GetPointPosition function in FMX.RS.RuleEditorForm to return the current caret position in Delphi XE8+. This is not a correct value but Delphi XE8+ does not seem to expose the routines needed to figure out the correct value ------------------------------------------------------------------- February 15, 2015 Version 5.7 - Includes new RiverSoftAVG Charting Component Suite v6.0 - Recompiled because of Fuzzy Logic Component Library Changes and RiverSoftAVG Common Classes Library Changes NOTE: The Fuzzy Unit Compatibility Index was fixed. Fuzzy demos that scaled the fuzzy result by the compatibility index will have different final values ------------------------------------------------------------------- January 04, 2015 Version 5.6 - Upgraded Demo applications for more recent Delphi releases, which had a couple major problems: - When the project would be upgraded, the more recent Delphis would mess up the name scoping, making it look like they needed a recompile (not true), making it difficult for Evaluation users Error: "Unit IESlotTest was compiled with a different version of FMX.RS.HelperFunctions.ClonePersistentClass" - DB demos were broken by a combination of "deprecated" (actually broken) TDataSet methods and defmodule-introduced issues - Upgraded DB Demo applications to use TClientDataSet MyBase local XML files, no longer requiring database configuraion - Upgraded DB Multiview demo to show inference engine output - Upgraded Fuzzy/Project Risk Assessment demo to chart individual risk factors - Added TInferenceEngine.IsRunning property - Fixed TIEValue.EqualsStar method to allow floating point values to equal with a same error - Fixed TIEValue.EqualsStar method to handle case where AValue is dtNone type - Fixed TIEValue.Equals method to allow floating point values to equal with a same error - Fixed TIEValue.Equals method to handle case where AValue is dtNone type - Added support for additional field types in TDBIESlot.GetFieldSlotTypes method - Added support for additional field types in TDBInferenceEngine.GetFieldSlotTypes method - Added support for additional field types in TDBInferenceEngine.GetFieldSlotValue method - Added support for additional field types in TDBInferenceEngine.SetFieldSlotValue method - Fixed parsing bug in TIEDataSet.CreateFact method where method would try to parse a blank string for a fact slot - Overrode in TIEDataSet the TDataSet.GetFieldData method introduced in XE4 that broke the code getting the field values from the TDBInferenceEngine fact - Overrode in TIEDataSet the TDataSet.SetFieldData method introduced in XE4 that broke the code changing the underlying TDBInferenceEngine fact ------------------------------------------------------------------- December 28, 2014 Version 5.5.3 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- November 16, 2014 Version 5.5.2 - Recompiled for RAD Studio XE7 Update 1 ------------------------------------------------------------------- September 22, 2014 Version 5.5.1 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- September 7, 2014 Version 5.5 - Added RAD Studio XE7 Support - Changed packages to use LibSuffix.inc exclusively (no more LibSuffix120.inc, LibSuffix130.inc, etc) - Changed TPropertyAnimationFunction to call TAnimator methods instead of TFMXObject methods for XE7+ - Changed TAnimationFunction to call TAnimator methods instead of TFMXObject methods for XE7+ - Moved GListBox.pas from \Commmon to \AI\IE (simplifies installation) - Moved GEdit.pas from \Commmon to \AI\IE (simplifies installation) - Moved RSPageControl.pas from \Commmon to \AI\IE (simplifies installation) - Moved EditBoxes.dpk from \Commmon to \AI\IE (simplifies installation) ------------------------------------------------------------------- July 6, 2014 Version 5.4 - Added Appmethod (Object Pascal) Support - Recompiled for Delphi XE6 Update 1 - Recompiled because of RiverSoftAVG Common Classes Library Changes - Fixed the memo line carriage returns in IE Expert System Wizard - Reloaded IEExpertSystemWizardForm to reset the TIEPatternSlotItem.Equal property (used to be called Equals) - Fixed Define Terms Wizard Frame so that buttons are only enabled when needed - Turned off deprecated warnings from VCL for IEDataSet.pas - Turned off deprecated warnings from VCL for DBInferenceEngine.pas ------------------------------------------------------------------- June 8, 2014 Version 5.3.2 - Changed TDirectory.GetCurrentDirectory calls to GetCurrentDir calls as the former cause errors on OSX (XE4+) or crashed the OSX compiler (XE2 and XE3) - Fixed bug in FMX.RS.ConsoleEditorForm IEAddActivation and IERemoveActivation methods which would occur if tsModules.TabIndex = -1 - Update Basic Console Demo - Added Basic Console (FMX) Demo ------------------------------------------------------------------- May 26, 2014 Version 5.3.1 - Fixed StandardPackage.pas uses statement for MACOS (uses MacAPI.Foundation) - Included RSGenerics.Collections in FactEditorForm to get rid of hints - Included RSGenerics.Collections in FactTemplateEditorForm to get rid of hints - Included RSGenerics.Collections in FMX.RS.FactEditorForm to get rid of hints - Included RSGenerics.Collections in FMX.RS.FactTemplateEditorForm to get rid of hints - Included RSGenerics.Collections in FMX.RS.ModuleEditorForm to get rid of hints - Included RSGenerics.Collections in FMX.RS.RuleEditorForm to get rid of hints - Included RSGenerics.Collections in FMX.RS.TypeEditorForm to get rid of hints - Included RSGenerics.Collections in FMX.RS.TypeEditorFrame to get rid of hints - Included RSGenerics.Collections in IEModule to get rid of hints - Included RSGenerics.Collections in ModuleEditorForm to get rid of hints - Included RSGenerics.Collections in RuleEditorForm to get rid of hints - Included RSGenerics.Collections in TypeEditorForm to get rid of hints - Included RSGenerics.Collections in TypeEditorFrame to get rid of hints - Included RSGenerics.Collections in ValueEditorForm to get rid of hints ------------------------------------------------------------------- April 27, 2014 Version 5.3 - Added RAD Studio XE6 Support - ************************ Temporarily disabled mmOutput.GoToTextEnd statement in TIEConsoleDlg.InferenceEngine1PrintOut method for XE6 as it causes access violations (FMX.RS.ConsoleEditorForm) ************************ - Fixed Cut, Copy, and Paste for XE4+ by turning off shortcuts for menu items: miCut, miCopy, and miPaste (FMX.RS.ConsoleEditorForm) - Fixed mmOutput.Font not being set to 'Courier New' in XE4+ because of mmOutput.StyledSettings property (FMX.RS.ConsoleEditorForm) - Changed tsModules.FullSize to True for XE6 as it will hide tabs if there are too many to show (FMX.RS.*Form) - Removed TTabItem.Position.Point properties in DFM as XE6 will not handle gracefully (FMX.RS.*Form) - Changed lbFunctions.DragMode to dmManual because behavior changes across various versions of Delphi (FMX.RS.RuleEditorForm) - Fixed FMX.RS.RuleEditorForm bug to show new rule on panel opening if there are no rules in the inference engine - Fixed access violation in eEditChangeTracking event where EditListBox is nil (FMX.RS.RuleEditorForm) - Fixed splitter between rules tree and tab control containing fact templates and functions listboxes (FMX.RS.RuleEditorForm) - Fixed access violation in TFactsEditDlg.UpdateMemo method when CurrentFact is nil ------------------------------------------------------------------- March 30, 2014 Version 5.2.2 - Recompiled because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- February 9, 2014 Version 5.2.1 - Updated because of RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- January 19, 2014 Version 5.2 - Recompiled for RiverSoftAVG Common Classes Library Changes ------------------------------------------------------------------- September 22, 2013 Version 5.1 - Added RAD Studio XE5 Support - Added Android Support - Validated library on physical Android Device - Moved AddChildTreeViewItem functions from FMX.RS.IEHelperFunctions to FMX.RS.HelperFunctions - Moved vx_XXX constants from FMX.RS.IEHelperFunctions to FMX.RS.HelperFunctions - Added FMX.Graphics to uses clause for XE5+ ------------------------------------------------------------------- August 25, 2013 Version 5.0.1 - Added ComponentPlatformsAttribute to TRule so that it can be added at design-time to all target platforms - Added missing *.inc files to installer so that components can be built ------------------------------------------------------------------- August 18, 2013 Version 5.0 - Validated library on physical iOS Device - Changed code to call DisposeOf on AUTOREFCOUNT, not NEXTGEN - Fixed workaround for nasty, subtle bug in Embarcadero's iOS device compiler (not iOSSimulator) which would fail with a backend error (and no line number to find cause). It was caused by the IFactTemplate.GetOwner method signature mapping to a DYNAMIC method. Added GetAOwner method and mapped IFactTemplate.GetOwner = GetAOwner - Changed TFactSlot.Equals method to match TObject.Equals method signature - Changed TFactTemplate.Equals method to match TObject.Equals method signature - Changed TFact.Equals method to match TObject.Equals method signature - Changed TFactTemplate.Owner property from TComponent to TPersistent - Changed TFactTemplate constructors to pass in TPersistent Owner - Fixed bug where RuleEditorForm (FMX) would not allow selection of rules because DragMode=dmAutomatic (behavior changed in XE4) - Fixed bug in RuleEditorForm where you could not drag and drop the first pattern in the rule ------------------------------------------------------------------- July 29, 2013 Version 5.0B1 - Modified TActivationAgenda to use TStringList<TActivation> for XE+ (had been turned off because to TStringList<T> bug) - Replaced Free calls with DisposeOf for NEXTGEN compiler - Changed TFMXxxxDialog ComponentPlatformsAttribute to pidRS_DESKTOP_SUPPORT Known Bugs: - FMX.RS.RuleEditorForm cannot select rule from treeview in XE4 Note: This release dramatically changed support classes in order to better support XE4 Mobile compiler features: Automatic Reference Counting, TList deprecation, and suggested deprecation of Pointer type. It makes heavy use of generics instead of older TList-type and TGHashTable classes which used pointers. A lot of effort has gone into making the new classes support the same methods and properties of the old classes. However, there may be changes needed to be made to your code. Of special note: - InterfaceCollections unit has been replaced with RSInterfaceCollections unit - Contnrs.pas, GLists.pas, and GHashTable.pas have been replaced with System.Generics.Collections.pas or RSGenerics.Collections.pas The old units are still available but are not used. ------------------------------------------------------------------- July 21, 2013 Version 5.0B0 - Added RAD Studio XE4 Support - Added iOS Support - Added 32 New IECS Functions (OS, Directory, and File functions) - Dropped RAD Studio 2009 Support - Deprecated IEDataset.pas - Refactored classes to use generics versions of lists and hash tables instead of classes from Contnrs.pas, GLists.pas, InterfaceCollections.pas, Structures.pas, and GHashTable.pas - Refactored Packages (dpk) to use $IFDEFs with $LIBVERSION to create multiple compiled versions for each version of Delphi from the same package file - Replaced Free calls with DisposeOf for NEXTGEN compiler - Removed Free calls for NEXTGEN compiler - Added IECS Execute Mobile Demo App - Added TDirectoryFunction, adds get-current-dir, set-current-dir, get-files get-dirs, get-parent-dir, get-root-dir is-dir-empty, is-dir-exists, create-dir copy-dir, move-dir, delete-dir dir-delim - Added TOSVersionFunction, adds get-os-name, get-os-architecture, get-os-platform get-os-build-version, get-os-major-version, get-os-minor-version - Added TFileFunction, adds is-file-exists, copy-file, delete-file move-file, rename-file, get-file-ext get-filename, get-file-path, change-file-ext change-file-path - Added TPathFunction, adds get-home-path, get-documents-path, and get-temp-path - Added [Weak] Attribute to owner objects references for Automatic Reference Counting (ARC) compiler - Changed TIEDefinedTypes class to descend from TRSStringHashTable<IIEDefinedType> - Removed TIEDefinedTypesEnumerator class - Added TFactsCache type (TRSHashTable<Integer, IFact>) - Modified TFacts class to use TFactsCache type - Removed TFactsEnumerator class - Removed TModulesEnumerator class - Modified TFactSetsEnumerator class to descend from TRSObjectListEnumerator<TComponent> for NEXTGEN compiler - Changed TFactSets to descend from TRSComponentList - Removed TRulesEnumerator class - Changed TRules class to descend from TRSStringObjectHashTable<TRule> - Removed TIOStreamsEnumerator class - Changed TIOStreams class to descend from TRSStringObjectHashTable<TGTextStream> - Removed TUserFunctionsEnumerator class - Changed TUserFunctions class to descend from TRSStringHashTable<IUserFunction> - Added TInferenceEngine.AddDefaultFuzzyTerms protected method - Changed TInferenceEngine.ReloadComps protected property to TRSComponentList type - Modified TInferenceEngine.ParseRulePatterns method signature to use TIEParserVariables type - Modified TInferenceEngine.ParseRuleActions method signature to use TIEParserVariables type - Fixed bug in TUserFunctions.Clear method, which could skip user functions on clear. This occurred because removing a user function while iterating over the hash table screwed up the enumeration. - Fixed bug in TFactTemplates.Clear(TConstructScope) method, which could skip user functions on clear. This occurred because removing a user function while iterating over the hash table screwed up the enumeration. - Fixed bug in TInferenceEngine.RemoveDependencies(IFactTemplate) method where removing dependent fact templates could be skipped. This occurred because removing a fact template while iterating over the hash table screwed up the enumeration. - Fixed bug in TIEDefinedTypes.Clear(TConstructScope) method, which could skip defined types on clear. This occurred because removing a defined type while iterating over the hash table screwed up the enumeration. - Fixed bug in TInferenceEngine.RemoveTypeDependencies method where removing dependent defined types could be skipped. This occurred because removing a defined type while iterating over the hash table screwed up the enumeration. - Fixed bug where TInferenceEngine.Destroy was not nil'ing module structures after all of the modules have been freed - Changed TIEDefinedType.ConstraintIntegers property type to TList<Integer> - Fixed TGetPropertiesFunction.Call method to compile with NEXTGEN compiler - Modified TPlotFuzzySetFunction.Call method to NOT use AnsiStrings and AnsiChars - Modified TIEToken reference count code for NEXTGEN compiler - Changed TIETokenTree.Buckets protected property type to TObjectList<TInterfaceList> - Changed TFactsHashTable to descend from TRSHashTable<Integer,IFact> - Changed TDBInferenceEngine component attributes to specify Vcl support only (pidRS_WINDOWS_SUPPORT) - Refixed (doh) code for TIEDataSet string fields - Added FMX.StdCtrls to Dialogs uses clause for XE4+ - Added TIModuleImportList = TList<IModuleImport> type - Changed TModule to use TIModuleImportList type - Added TModuleList = TList<IModule> type - Changed TModuleConstruct to use TModuleList type - Added [Weak] Attribute to owner objects references for Automatic Reference Counting (ARC) compiler - Modified TModuleConstruct reference count code for NEXTGEN compiler - Modified TModule reference count code for NEXTGEN compiler - Modified TModuleImportExport reference count code for NEXTGEN compiler - Changed TBindings to descend from TRSStringObjectHashTable<TBinding> - Removed TBindingsEnumerator class - Changed TRulePatternList type to descend from TObjectList<TIEPattern> - Changed TRuleActionList type to descend from TRSAssignList<IFunCall> - Added TRuleBindingsList type for TRule.FBindings field - Added [Weak] Attribute to owner objects references for Automatic Reference Counting (ARC) compiler - Removed TRuleActionListEnumerator class - Removed TRulePatternListEnumerator class - Updated AssignDefinedTypesToTreeView function for new generics TIEDefinedTypes - Updated AssignFactTemplatesToTreeView function for new generics TFactTemplates - Updated AssignRulesToTreeView function for new generics TRules - Changed TSlotTests type to descend from TObjectList<TIEPatternMatchTest> - Added TFactTemplateSlots class - Modified TFactTemplate to use TFactTemplateSlots class - Changed TFactValueHashtableEntry from a class to a record - Modified TFactValues to descend from TRSStringHashTable<TFactValueHashtableEntry> - Removed TFactValueHashtableEnumerator class - Modified TFact reference count code for NEXTGEN compiler - Modified TFactSlot reference count code for NEXTGEN compiler - Added TIEPatternTests type {$IFDEF XE+}TStringList<Integer>{$ELSE}TGStringList{$ENDIF} - Changed TIEPattern.Tests property to use TIEPatternTests type - Modified TDBIEBookmark reference count code for NEXTGEN compiler - Changed TDBInferenceEngine component attributes to specify Vcl support only (pidRS_WINDOWS_SUPPORT) - Removed TDataSetListEnumerator class - Changed TDataSetList to descend from TList<TDataSet> - Changed TDBInferenceEngine.FactBookmarks property type to TRSHashTable<Integer,IDBIEBookmark> - Added {$IFDEFs} in StandardPackage.pas to include units (usually WinAPI.Windows) to remove compiler hints - Changed TIETokenizerStream.PutBackToken method signature to pass interface by const - Modified TIEStreamToken reference count code for NEXTGEN compiler - Added TIEParserVariables type (TRSStringHashTable<Integer>) - Modified TIEParser.ParseRulePatterns method signature to use TIEParserVariables type - Modified TIEParser.ParseRuleActions method signature to use TIEParserVariables type - Modified TIEParser.ParsePattern method signature to use TIEParserVariables type - Changed CharInSet expressions to use RSCharInSet to avoid deprecation warnings from XE4+ - Changed TIEClipsStream.PutBackToken method signature to pass interface by const - Added TIStreamTokenStack = TStack<IStreamToken> type - Replaced use of TIStack with TIStreamTokenStack in IEClipsParser unit - Added TSlotFunctionsStrings type {$IFDEF DELPHI15PLUS}TStringList<TSlotArgRecord>{$ELSE}TGStringList{$ENDIF} - Changed TIEClipsParser.SlotFunctions property to use TSlotFunctionStrings type - Modified TIEClipsParser.ParseRulePatterns method signature to use TIEParserVariables type - Modified TIEClipsParser.ParseRuleActions method signature to use TIEParserVariables type - Modified TIEClipsParser.ParsePattern method signature to use TIEParserVariables type - Changed name TIEPatternSlotItem.Equals property to Equal to avoid collisions with TObject.Equals method - Modified TIEESRuleItem.AssignTo method signature to use TIEParserVariables type - Changed TBaseReasonerList type to descend from TRSAssignList<IReasoner> - Changed TUserFunctionList type to descend from TRSAssignList<IUserFunction> - Changed TFunctionCall.Arguments type to TList<IIEValue> - Removed TBaseReasonerListEnumerator class - Removed TUserFunctionListEnumerator class - Modified TFunctionCall reference count code for NEXTGEN compiler - Modified TIEUserFunctionCall reference count code for NEXTGEN compiler - Changed TValueHashTable class to descend from TRSStringHashTable<IIEValue> - Changed TIEValue.ToString from property to method to get rid of compiler warnings - Modified TIEValueRec to support AUTOREFCOUNT for TObjects, required moving the VObject: TObject outside of the variant section of the record - Modified TIEValueRec to support AUTOREFCOUNT for IInterfaces, required moving the VInterface: IInterface outside of the variant section of the record (EXPERIMENT TO SEE IF IMPROVES iOS SUPPORT) - Modified TIEValue reference count code for NEXTGEN compiler - Modified TSingletonsVector reference count code for NEXTGEN compiler - Changed TValueVectorEnumerator class to descend from TInterfaceListIterator - Removed TValueHashTableEnumerator class - Modified TActivationAgenda to descend from TStringList<TActivation> for XE+ (SET USING FLAG FOR NOW IN ORDER TO FIND BUG) - Deleted TActivationAgendaEnumerator class for XE+ - Added TReteNodes (TList<TReteNode>) type - Changed code in TReteNetwork to use TReteNodes type - Added TActivations (TList<TActivation>) type - Changed code in TReteNetwork to use TActivations type - Added TTestNodeTests (TObjectList<TIESlotTest>) type - Changed code in TTestNode to use TTestNodeTests type - Added TRuleNodes (TRSDictionary<TRule, TReteNodes>) type - Changed code in TReteNetwork to use TRuleNodes type Known Bugs: - Using TActivationAgenda when it is descended from TStringList<TActivation> has bug with Project Risk.ie - FMX.RS.RuleEditorForm cannot select rule from treeview in XE4 Note: This release dramatically changed support classes in order to better support XE4 Mobile compiler features: Automatic Reference Counting, TList deprecation, and suggested deprecation of Pointer type. It makes heavy use of generics instead of older TList-type and TGHashTable classes which used pointers. A lot of effort has gone into making the new classes support the same methods and properties of the old classes. However, there may be changes needed to be made to your code. Of special note: - InterfaceCollections unit has been replaced with RSInterfaceCollections unit - Contnrs.pas, GLists.pas, and GHashTable.pas have been replaced with System.Generics.Collections.pas or RSGenerics.Collections.pas The old units are still available but are not used. ------------------------------------------------------------------- March 24, 2013 Version 4.1.1 - Fixed parsing of mixed line ending (CR, LF, CR/LF) files in TIEClipsStream so that line numbers are correctly reported on errors - Fixed pattern matching bug where patterns such as (student Tom|Dan) would match ANY student (fixed in TIEPattern.FixTests) - Changed occurrences of #13#10 to use sLineBreak constant - Fixed bug in Advanced Console demo where MAIN module tab would not be selected automatically causing a List Index out of bounds error ------------------------------------------------------------------- January 27, 2013 Version 4.1 - Changed Evaluation version code allowing no restrictions, except only for VCL and FMX Win32/64 and displaying nag screen when Delphi is not running - Updated for Rad Studio XE3, Update 2 - Fixed bug in TFactSetDialog where imported defined types and fact templates would be deleted/changed when defining facts (Thanks D.T.) - Removed TFactSetDialog.EnableModuleSwitch property as changing modules makes no sense when defining facts for a factset - Removed assignment to TFactSetDialog.EnableModuleSwitch property in TFactsProperty.Edit as this property was removed ------------------------------------------------------------------- December 9, 2012 Version 4.0 - Fixed bug in TInferenceEngine.RemoveDependencies where dependent facts were not being retracted - Fixed bug in TInferenceEngine.RemoveDependencies( IModule, IIEDefinedType ) to properly delete the defined type from all modules' DefinedTypes hash table - Fixed bug in TInferenceEngine.RemoveDependencies( IFactTemplate ) to properly delete the defined type from all modules' DefinedTypes hash table - Fixed bug in TFactTemplates.AssignLocal where imported fact templates were being deleted - Fixed bug in TIEDefinedTypes.AssignLocal where imported defined types were being deleted - Added TInferenceEngine.RemoveDependencies( IModule, IFactTemplate ) protected method - Changed TInferenceEngine.RenameDefinedType method to ignore renames to deftypes not in the DefinedTypes hash table - Changed TInferenceEngine.RenameFactTemplate method to ignore renames to deftypes not in the DefinedTypes hash table - Added TFactTemplates.Clear( TConstructScope ) method - Added TIEDefinedTypes.Clear( TConstructScope ) method - Added TFacts.Clear( TConstructScope ) method - Changed Type Editor Form behavior so that only deftypes local to the module can be modified or deleted - Added TIETypesEditDlg.EnableNodes method - Fixed access violation in TIETypesEditDlg.ToggleFocus when ActiveControl is nil - Fixed bug in TIETypesEditDlg.actReplaceTypeExecute to replace type, not just delete and then re-add it - Changed Fact Template Editor Form behavior so that only fact templates local to the module can be modified or deleted - Added TFactTemplatesEditDlg.EnableNodes method - Fixed TFactTemplatesEditDlg.AddTypeAndValue method to convert integer slot default values to float if basetypes contains float (Thanks DT) - Added TConstructScope type - Added TConstructScopes type - Added DefType parameter to IReasoner.RenameDefinedType method - Added FactTemplate parameter IReasoner.RenameFactTemplate method - Fixed TModuleImportExport.ImportConstructs bug where a defined types, fact templates, and facts could be imported multiple times from different modules - Fixed bug in TRule.SetEngine method where a rule with the same name could accidentally be deleted from the TInferenceEngine.Rules property (Thanks DT) - Fixed bug in TFactTemplate.SetTemplateName method where template with new name would be removed (or attempted to) ------------------------------------------------------------------- November 25, 2012 Version 4.0 EEP6 - Massive Help File Updates including changing popup links to normal links and updated hierarchy topics - Added design-time context-sensitive help for IECS components when user right-clicks the component and selects "Help..." - Added TGetHelpEditor component editor to display IECS component help - Changed TInferenceEngineEditor to descend from TGetHelpEditor. Because TGetHelpEditor descends from TDefaultEditor, the behavior of the component editor for TRule when you double-click is to create an event handler instead of invoking context-menu - Changed TRuleEditor to descend from TGetHelpEditor. Because TGetHelpEditor descends from TDefaultEditor, the behavior of the component editor for TRule when you double-click is to create an event handler instead of invoking context-menu - Added FMX.RS.IEPropertyEditors.pas unit - Added call to FMX.RS.IEPropertyEditors.Register in Register function - Added Documentation Insight to IEInterfaces.pas unit - Renamed IModule.AssignModuleParameters method to AssignModuleDefinition - Changed IModule.RemoveModule methods from procedures to functions - Changed IModuleSharedConstruct.RemoveModule method from procedures to function - Added IModule.GetExpertSystem method - Added Documentation Insight to InferencEngine.pas unit - Added TInferenceEngine.CurrentFocus property - Added TFacts.LocalsToString method - Added TFacts.LocalCount property - Added code to support Automatic Focusing of Modules on Rule Activation - Changed TInferenceEngine.GetExpertSystem method to use IModule.GetExpertSystem - Fixed bug in TFactTemplates.GenerateToString where if LocalsOnly was TRUE the first non-local fact template would keep the following fact templates from printing - Fixed bug in TIEDefinedTypes.AssignLocal method where the Defined Type would be assigned twice - Fixed bug in TIEDefinedTypes.Replace method which would incorrectly not decrement ImportCount property - Fixed bug in TFactTemplates.Replace method which would incorrectly not decrement ImportCount property - Modified TInferenceEngine.Loaded method to also reload TFactSets - Added Auto Focus Checkbox to Rule Editor (Vcl and FMX) - Fixed bug in Rule Editor (FMX) where Rules TreeView would not update when switching modules - Added TIEParser.FindConstructType method - Added TIEParser.GetConstructName abstract method - Added TIEParser.PrettyPrint( TParsedType ) abstract method - Added SFactSetComment, SDefTypeComment, etc resource strings - Added SXXXSyntax resource strings for construct (deftype, defrule, ...) types - Implemented TIEClipsParser.GetConstructName method which returns the name or label (e.g., deftype, defrule, etc) of a construct type - Implemented TIEClipsParser.PrettyPrint( TParsedType ) method which prints a syntax definition for the construct type - Modified TIEClipsParser.ParseRule method to support auto-focus "(declare (auto-focus TRUE))" - Modified PrettyPrint(TIERule) to output TIERule.AutoFocus property - Added WrapTextColumn variable - Fixed bug in TIEDefinedType.Assign(const AValue: IInterface) where constraint values kept doubling because original constraints were not cleared first (Thanks DT) - Fixed bugs in TFactSet where fact set could be added or removed from wrong module - Fixed bug in TFactSet where deleting TFactSet could cause access violation - Changed TFactSet.Loaded method to just call the TInferenceEngine.Reload method - Added TFactSet.Reload method to actually add the factset to the inference engine (called by TInferenceEngine.Loaded method) - Renamed TModule.AssignModuleParameters method to AssignModuleDefinition - Changed TModule.RemoveModule methods from procedures to functions - Changed TModuleConstruct.RemoveModule method from procedures to function - Added implementation of IModule.GetExpertSystem method - Added TRule.AutoFocus property - Fixed bugs in TRule where rule could be added or removed from wrong module - Modified TPrettyPrintFunction to pretty print construct types (deftype, deftemplate, defrule, etc) on ppdeffunction - Fixed syntax statement for TWatchFunction to include focus keyword - Fixed syntax statement for TUnwatchFunction to include focus keyword ------------------------------------------------------------------- October 21, 2012 Version 4.0 EEP5 - Added TFMXModulesDialog component - Added FMX.RS.ModuleEditorForm form for editing modules in FMX - Updated Demo applications - Added Cut, Copy, and Paste Menu Items to Module Editor (Vcl and FMX) - Added Cut, Copy, and Paste Menu Items to Type Editor (Vcl and FMX) - Added Cut, Copy, and Paste Menu Items to Facts Editor (Vcl and FMX) - Added Cut, Copy, and Paste Menu Items to Fact Templates Editor (Vcl and FMX) - Added Cut, Copy, and Paste Menu Items to Rules Editor (Vcl and FMX) - Added ability in Console Editor to double-click Rules, Fact Templates, and Facts Listboxes and display selected item in output memo - Added Modules Editor to Console Editor (Vcl and FMX) - Enabled Edit <STRUCT> menus in FMX.RS.ConsoleEditor - Changed ConsoleEditor to sort Fact Templates listbox - Changed ConsoleEditor to sort Rules listbox - Added OnClearModule event handler for Console Editor to clear listboxes - Added Comment Edit box for Module Editor - Added Rename Module Menu Item to Module Editor - Added TModulesProperty editor - Added Expand All and Collapse All menu items to FMX Rule Editor - Fixed bug where FMX.RS.RuleEditorForm would allow typing in invalid characters - Fixed bug where FMX.RS.RuleEditorForm Open and Save Dialogs would not list Rules *.ier files - Fixed bug where FMX.RS.TypeEditorFrame would allow typing in invalid characters - Changed behavior so that default component editor for TInferenceEngine is "Edit Expert System..." - Removed SubProperties attribute from DefinedTypes, FactTemplates, Modules, and Rules (subproperties won't show up in object inspector) - Fixed bug in TInferenceEngine.ReplaceTemplate method which would raise Index out of bounds exception - Fixed bug where a DefinedType would be reassigned to current module instead of parent module on Assign call - Modified TInferenceEngine.GetExpertSystem to print much smaller (and be more efficiently parsed) by having each module only print local fact templates, rules, etc and not printing module qualifiers - Added TIEDefinedTypes.ImportCount and LocalsCount properties - Added TIEDefinedTypes.LocalsToString public method (and GenerateToString(Boolean) protected method) - Added TFacts.ImportCount and LocalsCount properties - Added TFacts.LocalsToString public method (and GenerateToString(Boolean) protected method) - Added TFactSets.ImportCount and LocalsCount properties - Added TFactSets.LocalsToString public method (and GenerateToString(Boolean) protected method) - Added TRules.ImportCount and LocalsCount properties - Added TRules.LocalsToString public method (and GenerateToString(Boolean) protected method) - Added TFactTemplates.ImportCount and LocalsCount properties - Added TFactTemplates.LocalsToString public method (and GenerateToString(Boolean) protected method) - Added TInferenceEngine.ParseModule method - Added TInferenceEngine.ParseConstructType method - Added TInferenceEngine.OnParseModule event - Changed TInferenceEngine.Modules property from public to published - Changed TInferenceEngine to stream Modules and their constructs (DefinedTypes, Fact Templates, Rules, Facts, etc) as a hidden ModuleText Defined Property - Added TInferenceEngine.Reload method to allow TComponents to allow the inference engine to reload TComponents that were loaded before it was loaded - Changed TInferenceEngine.DefinedTypes property to no longer be streamed - Changed TInferenceEngine.FactTemplates property to no longer be streamed - Changed TInferenceEngine.Rules property to no longer be streamed - Added TIEDefinedTypes.FindUnsharedType method to find out if FactTemplate contains any types not shared by module - Fixed bug where using TInferenceEngine.Modules.Add method would not properly prepare module for use - Fixed bug in TModules.Assign where MAIN module would not properly export constructs - Added TIEParser.AutoRenameCopy property which controls whether the Parser should try and keep rename the Parsed header until a unique name is found (default=false). This property is useful for copy and paste of a structure and not having to worry about the name - Added TIEParser.IgnoreModuleQualifier property which controls whether the parser ignores the domain qualifier or not - Added TIEParser.PrintModuleQualifiers property which controls whether the module qualifier is output when a construct is pretty printed - Added TIEParser.GetConstructType abstract methods - Implemented AutoRenameCopy property in TIEClipsParser.ParseHeader methods. AutoRenameCopy property controls whether the Parser should try and keep rename the Parsed header until a unique name is found (default=false). This property is useful for copy and paste of a structure and not having to worry about the name - Implemented IgnoreModuleQualifier property in TIEClipsParser.ParseHeader, which controls whether the parser ignores the domain qualifier or not - Implemented PrintModuleQualifiers property in TIEClipsParser, which controls whether the module qualifier is output when a construct is pretty printed - Added TIEClipsParser.RenameCopy protected method - Added TIEClipsParser.GetConstructType method - Added SFactSetKeyword, SFuzzyTermKeyword, SDefinedTypeKeyword, SFactTemplateKeyword, SModuleKeyword, SRuleKeyword, SUserFunctionKeyword, and SDefGlobalKeyword resourcestrings - Added vaEditModules to TValidAction - Added SModuleMAINReserved resource string - Added SUnsharedFactTemplateType resource string - Fixed bug in TModule.SetName method that would allow MAIN module to be renamed or another module to be named MAIN - Changed TRule.Loaded method to just call the TInferenceEngine.Reload method - Added TRule.Reload method to actually add the rule to the inference engine (called by TInferenceEngine.Loaded method) - Added CreditAssessment-Standalone.ie to Demos\Scripts - Added CreditAssessment-Modules.ie to Demos\Scripts ------------------------------------------------------------------- October 8, 2012 Version 4.0 EEP4 *** KNOWN LIMITATIONS *** - Design-time support is not ready. The EEP handles expert systems that only use the MAIN defmodule. The EEP does not correctly stream in/out other defmodules - Demo applications have not been updated yet - Help files need to be updated MORE - Updated Help Files - Added TModulesDialog component - Added ModuleEditorForm VCL form for editing modules - Added TInferenceEngine.PrettyPrint( Construct: TObject ) method - Added TInferenceEngine.RenameDefinedType method - Added TInferenceEngine.RenameModule method - Renamed TInferenceEngine.ChangeFactTemplateName to RenameFactTemplate - Changed behavior of TIEDefinedTypes.Replace to allow replacing a deftype with another deftype from a different module - Changed behavior of TFactTemplates.Replace to allow replacing a template with another template from a different module - Changed TInferenceEngine.ReplaceTemplate method to update InitialFactPattern or NullFact if the template being replaced is of that type - Added TInferenceEngine.LoadModules and SaveModules methods - Changed TModules.Assign method to set Module Name before adding to TInferenceEngine (fixes bug where tabs could be created for EMPTY string Module Names) - Added PrettyPrint( IFactTemplate ) method to IReasoner interface - Added PrettyPrint( IModule ) method to IReasoner interface - Added RenameDefinedType method to IReasoner interface - Added RenameFactTemplate method to IReasoner interface - Added RenameModule method to IReasoner interface - Added RenameRule method to IReasoner interface - Added overloaded AddImport( String ) to IModule interface - Added overloaded RemoveImport( String ) to IModule interface - Modified PrettyPrint(IModule) to not print out constructs if import/export is ?NONE (e.g., (import MAIN deftype ?NONE)) - Added SDuplicateModuleNames resource string - Fixed bug in TIEDefinedType.SetName where invalid name characters were accepted in deftype name - Fixed bug where module would import constructs from a module that were not exported by the second module - Fixed bug where modules could have the same name - Changed behavior of TModule so that EVERY module has its own InitialFactPattern (necessary for some RETE constructs, e.g., (not (Something))) - Added implementation of IModule.AddImport( String ) method - Added implementation of IModule.RemoveImport( String ) method - Updated AgendaComment to include defmodule information - Updated ShowFactsComment to include defmodule information - Updated ListDefTypesComment to include defmodule information - Updated ListFactSetsComment to include defmodule information - Updated ListTemplatesComment to include defmodule information - Fixed TReteNetwork.AddRule method to only add InitialFactPattern if it exists - Fixed TReteNetwork.ProcessFourthPass method to handle rules without ANY patterns (even Initial-Fact) (can happen with non-MAIN modules - Updated WatchComment to include focus keyword - Updated UnwatchComment to include focus keyword - Fixed bug in Console AddActivation event handler where current module's activations wouldn't show up in listbox - Fixed bug in Console RemoveActivation event handler where current module's activations wouldn't show up in listbox ------------------------------------------------------------------- September 16, 2012 Version 4.0 EEP3 *** KNOWN LIMITATIONS *** - Design-time support is not ready. The EEP handles expert systems that only use the MAIN defmodule. The EEP does not correctly stream in/out other defmodules - Demo applications have not been updated yet - Help files need to be updated - Added RAD Studio XE3 Support - Updated Vcl/FMX Dialogs (Facts, FactTemplates, Types, and Rules) to support modules - Added TabControl for defmodules - Refactored code to update display properly when module changes - Changed buttons from TSpeedButton to TButton because of streaming errors in XE3 for TSpeedButton (TabOrder) (FMX) - Updated FontFill/FontColor property change from XE2 to XE3 (FMX) - Removed ability to use Delete Key to delete an item from the DefTypes and Rules TTreeView (XE3+ deleted OnKeyDown event) (FMX) - Added AssignDefinedTypesToTreeView function (IEVclHelperFunctions.pas and FMX.RS.IEHelperFunctions.pas) - Fixed range check bug in TIETypeEditorFrame.eUnitsChange by changing f from float to double, trunc(MaxInt) was returning MinInt - Fixed bug in TIEClipsParser.ParseFactTemplateSlot method where units with spaces were not being handled properly - Added TFacts.AssignLocal to only assign "local" (owned by module) facts (leaving non-local facts untouched) - Added TFacts.SortById method - Added TInferenceEngine.GetFacts method to retrieve all facts in every module - Changed TInferenceEngine.RemoveDependencies() to check for any fact templates that are exported - Changed TInferenceEngine.RemoveTemplate(IFactTemplate) to remove current module as ImportModule - Fixed TInferenceEngine.Run(Integer) to avoid infinite loop when stepping through inference - Fixed TIEDefinedTypes.Remove to remove dependencies properly - Modified TInferenceEngine.GetExpertSystem to output focus stack and not assert facts that are shared twice - Fixed bug in TInferenceEngine.GetExpertSystem which reported incorrect number of constructs for each module - Added TModules.ToNamesString method - Added TInferenceEngine.OnChangeCurrentModule event, called when CurrentModule is set. (Note that this event is NOT called when Module.FocusModule is called) - Added TInferenceEngine.OnAddModule event - Added TInferenceEngine.OnRemoveModule event - Added TInferenceEngine.OnClearModule event - Added TInferenceEngine.OnClearModules event - Added TInferenceEngine.DoChangeCurrentModule method - Changed TAnimationFunction (stop-trigger-animation) to require trigger expression - Changed behavior of TFactsDialog/TFMXFactsDialog to copy ENTIRE inference engine instead of just facts to ensure ALL domains facts get copied over - Added EnableModuleSwitch property for defined types, facts, fact sets, fact templates, and rules dialogs - Changed dialog behavior to copy all facts/templates/etc of all modules - Added EnableModuleSwitch property for defined types, facts, fact sets, fact templates, and rules dialogs - Added FCPopFocus constant (like FCTrue), used to pop focus from rule RHS - Added code in TRule.Fire method to allow using (return) command to immediately exit the rule and pop the focus - Modified TRetractFunction (retract) to raise exception if fact-id is not found - Added ability for TReturnFunction (return) to immediately exit a rule and pop focus. (return) must be on RHS of rule and have no parameters - Added CarriageReturn constant redefinition (XE2 has it wrong for FMX) - Added TInferenceEngineConstruct type - Added SInvalidModuleDependency resource string - Added SImportedDefTypeExists resource string - Added SImportedTemplateExists resource string - Added SUnableFindFact resource string - Added IModule.AssignModuleParameters method to Assign the module's name, comment, and import/export structures ONLY (no inference structures) - Changed IModule interface to descend from cloneable - Changed IModuleExport interface to descend from cloneable - Added IModule.AssignModuleParameters method to Assign the module's name, comment, and import/export structures ONLY (no inference structures) - Added IModuleImport.Release method - Added IModuleSharedConstruct.IndexOfImportModule method - Added IReasoner.GetCurrentModule method - Added implementation of ICloneable to TModule class - Added implementation of ICloneable to TModuleImportExport class - Added TModule.AssignModuleParameters method to Assign the module's name, comment, and import/export structures ONLY (no inference structures) - Added TModuleImport.Release method - Added TModuleSharedConstruct.IndexOfImportModule method - Changed TIEDefinedType to set the Module property when Reasoner property is set ------------------------------------------------------------------- July 29, 2012 Version 4.0 EEP2 *** KNOWN LIMITATIONS *** - Design-time support is not ready. The EEP does not correctly stream in/out defmodules - Dialogs do not work properly. Do not use TRulesDialog, etc as the assignment (when you hit OK) will not work properly. - DefinedTypes support with defmodules does not work. - Demo applications have not been updated yet. - Added defmodule support - Added IModule (defmodule) interface to define a defmodule - Added IModuleExport interface to define the structures a module exports - Added IModuleImport interface to define the structures a module imports - Added Module property (and getters/setters) to IFactTemplate and IIEDefinedType - Added IEModule unit that defines - TModuleImportExport implements IModuleExport and IModuleImport to track the structures a module either imports or exports - TModule implements a defmodule (IModule) - TModuleConstruct implements IModuleSharedConstruct interface, a construct (fact template, defined type) that is sharable between modules - Added defmodules (TInferenceEngine.Modules) to inference engine - Created TModules class (InferenceEngine.pas) - Modified TInferenceEngine.GetExpertSystem to output all modules - Modified TFactTemplates.PutValue to add the TFactTemplates.Module as an import module for the fact template - Modified TIEDefinedTypes.PutValue to add the TIEDefinedTypes.Module as an import module for the defined type - Added TInferenceEngine.AddModule method to add a module to the inference engine (and prepare it) - Added TInferenceEngine.RemoveModule method to remove a module from the inference engine (and release its resources) - Added TInferenceEngine.ParseFullName method to parse defmodule::Name strings - Added TInferenceEngine.Clear(IModule) method to clear the module - Added TInferenceEngine.ClearFacts(IModule) method to clear the facts from the module - Added TInferenceEngine.Reset(IModule) method to reset the module - Moved TInferenceEngine.CreateIEObject from protected to public - Moved TInferenceEngine module constructs (agenda, facts, rete, etc) from private to protected - Modified TInferenceEngine.CreateIEObject to create modules - Added otModules and otFactsPending to TIEObjectType (InferenceEngine.pas) - Added TIEParser.ParseFullName method - Added TIEParser.ParseModule method - Added TIEParser.PrettyPrint( IModule ) method - Added TIEClipsParser.ParseFullName method - Added TIEClipsParser.ParseModule method - Added TIEClipsParser.PrettyPrint( IModule ) method - Added PrettyPrint( IModule ) to unit - Modified PrettyPrint(IFactTemplate) to print module in name - Modified PrettyPrint(TFactSet) to print module in name - Modified PrettyPrint(TRule) to print module in name - Modified PrettyPrint(IIEDefinedType) to print module in name - Updated TIEClipsStream and TIEClipsParser to find module name and separator in parsing rules (ParseRule), fact templates (ParseFactTemplate), defined types (ParseDefinedType), and fact sets (ParseFactSet) - Added TRule.Module property to specify the module that owns the rule - Changed ancestor of TFactTemplate from TPersistent to TModuleConstruct - Modified TFactTemplate.Create methods to set the Module property to the TInferenceEngine.CurrentModule property - Removed redundant implementations of ICloneable and IInterface methods from TFactTemplate - Changed ancestor of TIEDefinedType from TPersistent to TModuleConstruct - Removed redundant implementations of ICloneable and IInterface methods from TIEDefinedType - Added TReteNetwork.Module property (set in constructor) - Modified TReteNetwork.Create constructor to require Module be passed in - Added cwFocus to TConstructWatch (IEConsts.pas) - Added IEAllWatches Constant (IEConsts.pas) - Added FMX Animation functions to FMX.RS.IEFMXPackage - Added TAnimationFunction (adds start-animation, stop-animation, pause-animation, resume-animation, start-trigger-animation, stop-trigger-animation, and start-trigger-animation-wait) - Added TGetAlphaColorFunction (adds get-color and get-color-name functions) - Added TPropertyAnimationFunction (adds animate-float, animate-float-delay, animate-float-wait, animate-color, animate-color-delay, animate-color-wait and stop-property-animation) - Added TGetColorFunction (adds get-color and get-color-name functions) to IEVclPackage - Fixed minimum number of arguments for message-dlg function - Added/Modified IECS functions - Added cwFocus to TWatchFunction and TUnwatchFunction - Added TCurrentModuleFunction (adds get-current-module and set-current-module commands) - Added TFocusModuleFunction (adds focus, clear-focus-stack, get-focus, get-focus-stack, and pop-focus commands) - Added defmodule support to TPrettyPrintFunction - Added TListFocusStackFunction (list-focus-stack) - Added support for specifying module name in TShowFactsFunction ([*|ModuleName]) - Added support for specifying module name in TAgendaFunction ([*|ModuleName]) - Added support for specifying module name in TListRulesFunction ([*|ModuleName]) - Added support for specifying module name in TListTemplatesFunction ([*|ModuleName]) - Added support for specifying module name in TListDefTypesFunction ([*|ModuleName]) - Added support for specifying module name in TListFactSetsFunction ([*|ModuleName]) - Added support for specifying module name in TPrettyPrintFunction (MODULE::NAME) - Added support for specifying module name in TUnDefTemplateFunction (MODULE::NAME) - Added support for specifying module name in TUnDefRuleFunction (MODULE::NAME) - Added support for specifying module name in TUnDefTypeFunction (MODULE::NAME) - Added support for specifying module name in TUnDefFactsFunction (MODULE::NAME) - Added IECSVersion Constant (IEConsts.pas) ------------------------------------------------------------------- June 03, 2012 Version 4.0 EEP1 - Added support for FireMonkey - Created FMX versions of IE Dialogs - Created FMX.RS.IEDialogs.pas unit - Created FMX.RS.ConsoleEditorForm.pas form/unit - Created FMX.RS.RuleEditorForm.pas form/unit - Created FMX.RS.FactEditorForm.pas form/unit - Created FMX.RS.FactTemplateEditorForm.pas form/unit - Created FMX.RS.FunctionsEditorForm.pas form/unit - Created FMX.RS.TypeEditorForm.pas form/unit - Created FMX.RS.TypeEditorFrame.pas form/unit - Created FMX.RS.ValueEditorForm.pas form/unit - Created IECustomDialog.pas unit - Added TIEVclCommonDialog class - Added TIEFMXCommonDialog class - Created IEVclPackage.pas and FMX.RS.IEFMXPackage.pas for Vcl and FMX specific versions respectively of IECS user functions - Moved CreateComponent function from ObjectPackage to IEVclPackage - Created CreateComponent function in FMX.RS.IEFMXPackage - Moved InputBox function from MiscPackage to IEVclPackage - Created InputBox function in FMX.RS.IEFMXPackage - Moved InputQuery function from MiscPackage to IEVclPackage - Created InputQuery function in FMX.RS.IEFMXPackage - Moved MessageDlg function from MiscPackage to IEVclPackage - Created MessageDlg function in FMX.RS.IEFMXPackage - Moved ShowMessage function from MiscPackage to IEVclPackage - Created ShowMessage function in FMX.RS.IEFMXPackage - Created IEVclHelperFunctions.pas and FMX.RS.IEHelperFunctions.pas for Vcl and FMX specific versions respectively of IECS helper functions - Added AssignDefinedTypeToTreeView function - Added AssignDefinedTypeToTreeNode function - Added AssignFactTemplateToTreeView function - Added AssignFactTemplateToTreeNode function - Added AssignFactSlotToTreeNode function - Added AssignRuleToTreeView function - Added AssignRuleToTreeNode function - Added TGlobalVariablesProperty editor for TInferenceEngine.GlobalVariables property design-time editing - Created FMX.RS.InferenceEngineReg.pas unit - Removed Vcl dependencies from units - Removed support for assigning TIEDefinedType to TTreeNodes (use IEVclHelperFunctions) - Removed support for assigning TFactTemplates to TTreeNodes (use IEVclHelperFunctions) - Removed support for assigning TRules to TTreeNodes (use IEVclHelperFunctions) - Removed FillNodeSlot, FillTreeView, and FillTreeViewNode methods from TFactTemplates for XE2 and beyond (use IEVclHelperFunctions) - Removed support for assigning TReteNetwork to TTreeNodes - Moved CalculateHash function to HelperFunctions - Moved ContainsCharacters function to HelperFunctions - Moved FloatEquals function to HelperFunctions - Moved StringFilter function to HelperFunctions - Moved ReadPersistent function to HelperFunctions - Moved SetToString function to HelperFunctions - Moved StringToSet function to HelperFunctions - Moved SwapEvents function to HelperFunctions - Moved WritePersistent function to HelperFunctions - Moved SInvalidSetItem resource string to HelperFunctions - Changed TIEDefinedTypes.AssignTo method to assign text to ANY object which has a published Text property (instead of looking for TCustomEdit descendants, which is Vcl-specific) - Added Advanced Console (FMX) Demo project - Updated the Help file - Bug Fixes - Fixed bug in TInferenceEngine.StatRunTime property to correctly report number of seconds last run took - Fixed bug in TFactTemplates.FillNodeSlot method where slots with ExtendedTypeInfo did not get their TTreeNode.Data set to the TemplateName correctly - Changed TInferenceEngine.StatRunTime property to use the less precise Time, instead of MMSystem.TimeGetTime which was WinAPI specific - Changed tree node assignment and retrieval in FactTemplateEditorForm to use IEVclHelperFunctions.AssignFactTemplatesToTreeView function instead of TFactTemplates.AssignTo (required for XE2) - Changed FillTreeViewNode call in FactTemplateEditorForm.actNewExecute method to AssignFactTemplateToTreeNode - Changed FillNodeSlot call in FactTemplateEditorForm.AddTypeAndValue and actNewSlotExecute methods to AssignFactSlotToTreeNode - Changed tree node assignment and retrieval in TypeEditorForm to use IEVclHelperFunctions.AssignDefinedTypeToTreeView function instead of TIEDefinedType.AssignTo (required for XE2) - Changed TemplateID from Integer to TRSNativeInt in ConsoleEditorForm - Updated FuzzySeries1 (TRSLineChart) property from Parent to Panel in TypeEditorFrame - Changed Fuzzy Draw Mode buttons to stay pressed in TypeEditorFrame - Disabled zooming in Fuzzy Chart in TypeEditorFrame - Fixed RuleEditorForm bug in adding and replacing rules where first pattern would not show up in rule tree - Fixed RuleEditorForm bug where wrong rule could be replaced if the selected tree node was wrong - Changed tree node assignment and retrieval in RuleEditorForm to use IEVclHelperFunctions.AssignFactTemplatesToTreeView function instead of TFactTemplates.AssignTo (required for XE2) - Changed tree node assignment and retrieval in RuleEditorForm to use IEVclHelperFunctions.AssignRulesToTreeView function instead of TRules.AssignTo (required for XE2) - Changed Caption type from TCaption to String for TIECustomDialog - Fixed bug in TUserPackage.RemoveReasoners where functions were not being removed correctly from Reasoners function lists - Fixed access violation bug in FunctionsEditorForm.SetItem where an item would try to be selected even when list is empty - Fixed bug where you cannot cancel dialog for ValueEditorFrom until syntax errors are fixed - Added Delete, Duplicate, and Clear popup menu items to ValueEditorForm - Fixed bug in TSetPropertyFunction.Call method to accept tkUString - Fixed TUserFunctionWizard for Delphi 2009+ - Changed code to generate InitMetaData method instead of AfterConstruction - Fixed SUnexpectedCharacters constant to have the correct arguments - Fixed bug in TRule.SetRuleName where wrong argument was being passed when SUnexpectedCharacters exception occured - Fixed bug in TFactSlot.SetName where wrong argument was being passed when SUnexpectedCharacters exception occured - Fixed bug in TFactTemplate.SetTemplateName where wrong argument was being passed when SUnexpectedCharacters exception occured ------------------------------------------------------------------- December 11, 2011 Version 3.0 - Added support for Rad Studio XE2, Win32 and Win64 - Fixed Pointer to Integer Casts to use TRSNativeInt - Changed TIEValueRec.VInteger to be a TRSNativeInt instead of integer ------------------------------------------------------------------- September 29, 2010 Version 2.9 - Added support for Rad Studio XE - Includes updates to the RiverSoftAVG Charting Component Suite ------------------------------------------------------------------- Nov 8, 2009 Version 2.8.1.1 - Fixed issue with Console editor (TInferenceEngine->Edit...) where it wouldn't work in Delphi 6 and 7 because of properties inserted by later versions of Delphi ------------------------------------------------------------------- Sept 7, 2009 Version 2.8.1 - Added support for Delphi 2010 - Changed help file(s) from WinHelp to HTML Help. Note that there is a known issue with the display to Delphi links (available with WinHelp but not HTML Help) ------------------------------------------------------------------- Jan 31, 2009 Version 2.8 - Added support for Delphi 2009 (Final) - Includes new RiverSoftAVG Charting Component Suite 2.0 - Added TIFSValues.ToString method and TIFuzzySets.ToString methods, which just call their owners' ToString methods, to work around a D2009 "implements" problem ------------------------------------------------------------------- Dec 21, 2008 Version 2.8B1 - Changed Install Directory to C:\Comps\RiverSoftAVG to reduce chances of too long path names (on new installs to a machine) - Added optional TEncoding parameter to TInferenceEngine Batch, StartCapture, LoadXXX/SaveXXX (Facts, Rules, etc), LoadFromXXX/SaveToXXX, and ParseXXX methods for D2009 - Added optional Encoding parameter to TInferenceEngine.NewTokenizer method - Changed SaveToXXX methods to write TEncoding.Preamble - Added optional Encoding parameter to TIEClipsStream constructors - Changed AnsiUpper/LowerCase to use inline RSUpper/LowerCase which uses the correct call to avoid warnings in .NET, but still uses AnsiXXX for Win32 - Added optional Encoding parameter to ISingletonsParser.ParseSingletons method - Modified TIEStreamToken.Value method to detect all question mark variable names as encoding errors - Added SEncodingProblem resource string - Fixed button images for FactEditorForm - Fixed button images for RuleEditorForm - Fixed Save As dialog for RuleEditorForm to state "Save Rules to File..." - Inference Engine Dialogs now inherit their parent form's Font by default - Added TIECommonDialog component, which adds Font and ParentFont properties - Changed TConsoleDialog to descend from TIECommonDialog - Changed TDefinedTypesDialog to descend from TIECommonDialog - Changed TRulesDialog to descend from TIECommonDialog - Changed TFactsDialog to descend from TIECommonDialog - Changed TFactTemplatesDialog to descend from TIECommonDialog - Changed TFactSetDialog to descend from TIECommonDialog - Changed TGlobalVariablesDialog to descend from TIECommonDialog - Changed TFunctionsDialog to descend from TIECommonDialog - Added Title Captions for all dialogs ------------------------------------------------------------------- Nov 23, 2008 Version 2.8B0 - Added support for Delphi 2009 - Changed set expressions in TIEClipsStream.FinishToken to use IsNumberChar and IsNumberSymbol from HelperFunctions.pas - Modified classes to avoid warnings about collisions with new methods added to TObject (D2009/.NET) - Changed AnsiChar back to Char, to align with D2009 fixes in TGTextStream, - Changed TIEClipsStream.SkipInLineSpaces to use new GetChar method to avoid any assumptions about 1-byte characters - Changed TFactsHashTable.ToString from property to method - Modified TRSRecordBuffer in IEDataSet.pas to match new Delphi 2009 TDataSet method signatures - Added TRSRecordBufferCast in IEDataSet.pas for internal use of methods to keep using PChar, even in Delphi 2009 - Changed Writer.Write in UserFunctionWizard.StringToEditor to use PAnsiChar instead of PChar - Changed AnsiPos calls to Pos calls - Changed set expressions to use CharInSet - Changed Upper/LowerCase to AnsiUpper/LowerCase, because the Ansi version handles Unicode (go figure) - Modified code to use new common library IsUpper, IsLower, etc functions ------------------------------------------------------------------- Feb 09, 2008 Version 2.7.1 - Recompiled to be compatible with RiverSoftAVG Common Classes Library 3.6.2 ------------------------------------------------------------------- Nov 03, 2007 Version 2.7 - Includes the new Fuzzy Logic Component Library v2.7 ------------------------------------------------------------------- Oct 06, 2007 Version 2.6.1 - Added RAD Studio 2007 .NET Support - Added RAD Studio 2007 support to installer - Fixed bug in TFactTemplate constructors where, if the new fact template was created from another fact template, the new fact template would inherit the old fact template's hash code (caused backward chaining and other more obscure inferencing errors) (Thanks P.T.) - Fixed bug in TInferenceEngine.AddActivation method where an activation watch would not print out the activation that had been activated - Fixed bug in FactTemplateEditorForm where the actNewSlot Execute method to select the new slot (was causing an access violation if the user edited it immediately) - Fixed visual error in FactTemplateEditorForm where the where slot types were not visible properly (check list box was cut off) - Fixed access violations (TIEDataSet) after calling GetNullFlags in GetFieldData method by including null flags in size of record in InternalInitFieldDefs method (Thanks P.T.) - Fixed TInterpretedFunction.Call method to resolve the result BEFORE freeing the local context, which avoids an access violation on (return) functions (Thanks D.T.) - Added Expert System Explorer Demo, which displays rete network for visualizing the structure of your expert system ------------------------------------------------------------------- Jun 23, 2007 Version 2.6 - Added Delphi 2007 support to installer - Fixed resizing columns when TValueEditDlg form is resized - Fixed TValueEditDlg to parse variables when user clicks OK as well as when another cell gets selected - Fixed TValueEditDlg so that the global variables are validated BEFORE the form exits - Added support for the for-in language construct in TValueHashTable - Added support for the for-in language construct in TValueVector - Removed Published keyword from various non-TPersistent classes to get rid of D2007 warnings - Added support for the for-in language construct in TIEDefinedTypes - Added support for the for-in language construct in TFacts - Added support for the for-in language construct in TFactTemplates - Added support for the for-in language construct in TIOStreams - Added support for the for-in language construct in TFactSets - Added support for the for-in language construct in TRules - Added support for the for-in language construct in TUserFunctions - Added support for the for-in language construct in TFactTemplate (FactSlots) - Added support for the for-in language construct in TRulePatternList - Added support for the for-in language construct in TRuleActionList - Added support for the for-in language construct in TFactTemplate (FactSlots) - Added support for the for-in language construct in TFactSet (Facts) - Added support for the for-in language construct in TBaseReasonerList - Added support for the for-in language construct in TUserFunctionList - Added support for the for-in language construct in TDataSetList - Added support for the for-in language construct in TDBIEDataConnections - Improved installer ------------------------------------------------------------------- Aug 25, 2006 Version 2.5.1 RELEASE - Fixed TFuzzySet.IsUndecidable method to return correct answer - Added GetStatValues and GetAvgValue to TFuzzySetValues class - Added TFuzzySet.GetCompatibilityIndex method, which fixes CompatibilityIndex property ------------------------------------------------------------------- Feb 8, 2006 Version 2.5 RELEASE - Official Release ------------------------------------------------------------------- Dec 22, 2005 Version 2.5b10 - Rerelease for Delphi 2006 with new version of the RiverSoftAVG Common Classes Library that works around strange, unique, Delphi 2006 bug in streams (which affected parsing operations in the IECS) Thanks PG - Includes new RiverSoftAVG Charting Component Suite with new Graph Chart ------------------------------------------------------------------- Dec 11, 2005 Version 2.5b9 - Official release for Delphi 2006 ------------------------------------------------------------------- November 22, 2005 Version 2.5 Beta 8 - Added Library Suffix of D90 (Delphi 2005) or D100 (Delphi 2006) for .NET to package names - Fixed bugs for expert system wizard (.NET) - Fixed casting error in IEExpertSystemWizardForm (.NET) for tags (happened on construction of form) - Fixed null string error in IEExpertSystemWizardForm (.NET) - Added Paint Demo for .NET Known Issues/Bugs - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. ------------------------------------------------------------------- November 8, 2005 Version 2.5 Beta 7 - Optimized IEValue for .NET (gives an almost 10% speed increase) - Installers have had a massive overhaul - Compiled files are now installed to <INSTALLDIR>\Bin\W32\Dxx or <INSTALLDIR>\Bin\NET\Dxx and path is updated WARNING: BE SURE TO UNINSTALL PREVIOUS FILES WHICH MAY BE IN $(DELPHI)\Projects\Bpl DIRECTORY - Attempts to detect if evaluation or full versions are being installed and warns about incompatibilities - Smarter updates of registry - Added missing registry updates (Package Search Path, Namespace Search Path, etc) - Fixed Missing Component Icons (.NET) Known Issues/Bugs - Need to update Help files to reflect any changes - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. ------------------------------------------------------------------- October 18, 2005 Version 2.5 Beta 6 - Updated Dcl and IEWizards packages to NOT include library version, should make updating versions within Delphi easier in the future **** You MUST uninstall old versions before installing new IECS **** - Fixed IE User Function Wizard to output the corrected code - Fixed the XXXType property to properly change the comment and arguments when the first item in the enumeration was selected. For example, the TFuzzyAssertFunction.FuzzyAssertFunctionType would not set comment and arguments property for the fafAssert enumerated value in the construction of the object. ------------------------------------------------------------------- October 5, 2005 Version 2.5 Beta 5 - Fixed some installer issues with missing files Known Issues/Bugs - Need to update Help files to reflect any changes - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. ------------------------------------------------------------------- September 26, 2005 Version 2.5 Beta 4 - Vastly reduced number of hints and warnings for .NET - Changed Win32 VCL package numbers to 2.5 - Updated properties and accessor methods for interfaces and their implementing objects to add underscore for .NET - Moved interface methods for classes (such as TIEUserFunction) from protected to public visibility (which they already were, but this makes it explicit) - Updated help files (unfinished) Known Issues/Bugs - Need to update Help files to reflect any changes - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. ------------------------------------------------------------------- August 29, 2005 Version 2.5 Beta 3 - Uses new RiverSoftAVG Charts beta 2 - Updated help files (unfinished) Known Issues/Bugs - Need to update Help files to reflect any changes - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. - TRSChartPanel component still has some visual errors with the axes - TRSChartPanel component does not support all gradient directions it indicates it should ------------------------------------------------------------------- July 31, 2005 Version 2.5 Beta 2 - Attempted Optimization of IEClipsParser.pas PrettyPrint functions for .NET (However, in our test cases, the StringBuilder functions ran 20% slower). - Fixed all peverify errors to make .NET version 100% managed code - Changed TFuzzyAssertFunction, TRWFuzzyCorrelationFunction, and TRWFuzzyInferenceFunction Call methods to use, for exceptions, FuzzyCorrelationSuffixNameList and FuzzyInferenceSuffixNameList constants instead of trying to build complete set on the fly (which was difficult in .NET) - Added FuzzyCorrelationNameList and FuzzyCorrelationSuffixNameList constants to FuzzyConsts.pas - Added FuzzyInferenceNameList and FuzzyInferenceSuffixNameList constants to FuzzyConsts.pas - Fixed install script to properly copy RiverSoftAVG.VCL.Controls.dll to the bin/NET directory Known Issues/Bugs - Code is not optimized at this point. For .NET, this is especially noticeable because the IECS builds strings the inefficient way, e.g., without using StringBuilder class - Need to update Help files to reflect any changes - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. - TRSChartPanel component still has some visual errors with the axes - TRSChartPanel component does not support all gradient directions it indicates it should ------------------------------------------------------------------- June 27 2005 Version 2.5 Beta 1 - Fixed index caching bugs with hash table, would cause access violations in certain situations - Fixed bug in TypeEditorFrame.pas where access violation (or Object reference not set) would occur when switching between 2 fuzzy types Known Issues/Bugs - Code is not optimized at this point. For .NET, this is especially noticeable because the IECS builds strings the inefficient way, e.g., without using StringBuilder class - Installer needs to be improved for Delphi.NET - Need to update Help files to reflect any changes - FuzzyLogicPackage includes some unsafe code which needs to be fixed to make the IECS 100% safe, managed code - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. - TRSChartPanel component still has some visual errors with the axes - TRSChartPanel component does not support all gradient directions it indicates it should ------------------------------------------------------------------- June 2005 Version 2.5 Beta 0 MAJOR CHANGES ------------- - Added Vcl.NET support. Win32 and .NET versions are identical except that .NET does not have DB support, the User Function Wizard, and some minor miscellaneous functions - Replaced TeeChart with RiverSoftAVG Charting Components - Created RiverSoftAVG Charting Components, free for non-commercial use *with* source code, for VCL.NET and Win32. Charting components include line chart, area chart, arrow chart, bar chart, pie chart, point chart, and shape chart - For Win32 and .NET - Free with source. Royalty free for use in your non-commercial applications (Commercial use license is included free with all IECS v2.5 users ($100 value)) - Design-time definition of chart values - Less confusing and error prone - Point Chart can display images in the point - Shape Chart can display multiple shapes, with images - Created the following assemblies/packages for .NET RiverSoftAVG.Common Common Classes RiverSoftAVG.VCL.Controls VCL Classes Library (Extends VCL and Fixes errors) RiverSoftAVG.Charts Charting Components RiverSoftAVG.Charts.Design Charting Components (Design-Time) RiverSoftAVG.AI.Flocking Flocking Component Library (not included with IECS) RiverSoftAVG.AI.FuzzyLogic Fuzzy Logic Component Libary RiverSoftAVG.AI.FuzzyLogic.Design Fuzzy Logic Component Libary (Design-Time) RiverSoftAVG.AI.Genetic Genetic Algorithms Component Library (not included with IECS) RiverSoftAVG.AI.Inference Inference Engine Component Suite RiverSoftAVG.AI.Inference.Design IECS (Design-Time) RiverSoftAVG.AI.Inference.Editors IECS Editors RiverSoftAVG.AI.Inference.Editors IECS Wizards RiverSoftAVG.AI.Path Path Planning Component Library (not included with IECS) DETAILS ------- - Created RSConstants.pas file, which includes basic types and constants. Some of these constants and types were moved from IEConsts.pas and FuzzyConsts.pas Among the most important new types: - TRSPointerType, which equals Pointer in Win32 and TObject in .NET - TRSStringPointerType, which equals PChar in Win32 and String in .NET - Modified most files to: - Include RSDefines.inc - Include RSConstants.pas - Changed all methods and properties that use IUnknown interface to use IInterface interface. Added IInterface interface for Delphi 5 support - Changed all QueryInterface calls to use Supports functions. - Removed reference counting code for .NET (not needed) - Changed ToString properties to AsString and GetToString methods to ToString to sync better with .NET (in which all objects have ToString method) - Changed Tag properties to be of TRSTag type (Win32=Integer;.NET=Variant) - Introduced TxxxPersistent class to get around a delphi compiler bug with class helpers (QC report #11019) - Added inherited Creates calls to constructors for compatibility with .NET - Deleted AfterConstruction and BeforeDestruction methods (for .NET) - Extracted icons from DCR files to create assembly bitmap files for design-time icons in .NET - Conditional compiled IUnknown methods (_addref, _release...) because they are not needed with .NET RiverSoftAVG Common Classes Library (GCollections package in Delphi 5, 6, and 7; RSCommon package in Delphi 2005 (Win32) and RiverSoftAVG.Common assembly in VCL.NET) - Created TRSEncodedBits class (in RSEncodedBits.pas), a TBits descendant with methods to encode/decode simple types into the TBits - Modified InterfaceCollections.pas - Modified TGInterfaceList to descend from TPersistent - Modified descendants of TGInterfaceList to correctly override methods - Modified list classes to use a dynamic arrays instead of a pointer to such an array (as used for Win32). The pointer implementation was left for Win32 since it is faster than the dynamic array implementation - Changed DEMO out of memory errors to use standard Exception, instead of EOutOfMemory exception, which (contrary to help file) seems to have disappeared from the SysUtils unit - Modified HelperFunctions.pas - Added WriteStringToStream function - Added SameValue and Supports functions for Delphi 5 - Added CreateObjectClass and ClonePersistentClass methods - Modified GStreams.pas - Added Close method to TGBufferStream (useful for .NET) - TGSpecialFiler is not available for .NET (because can't crack protected methods of TReader/TWriter) - Modified GRegularExpression.pas - Modified String references to AnsiString references (for .NET compatibility). The Regular Expression object must use AnsiString (one byte characters) because it uses set operations which do not work with wide chars. - Modified GParser.pas - Changed StrScan calls to Pos, even though StrScan is faster it is not .NET compatible - Modified GLists.pas - Added TQOrderedList class, which is base class for the TQxxx stacks and queues, and TQOrderedListClass type. These classes are useful because they have a virtual constructor, unlike Borland's classes - Modified GHashtable.pas - Modified TGCustomHashTable to use a dynamic array of hash table entries (THashtableEntries) instead of a pointer to such an array (as used for Win32). The pointer implementation was left for Win32 since it is faster than the dynamic array implementation - Modified GGraph.pas - Changed TGCustomGraph.AddNode method visibility from protected to public (.NET does not like changing visiblity with methods) - Modified DataStructures.pas - Added TFloatHeapElement, TFloatHeap, and TFloatPriorityQueue classes - Changed TPriorityList.OrderedListClass to use GLists.TQOrderedList instead of Borland's classes because we can't get to the items of the list quickly - Modified Structures.pas - Added overloaded AddObject method to TGStringList - Added RSGraphics.pas, moved from internal development package to common classes library. Modified RSGraphics.pas as well: - Added RSCenterPoint functions - Added DrawPieSlice procedure - Added DrawArrow procedure and TArrowOption types - Changed Gradient functions to accept an open array of TColor, instead of TColors - Moved TObjectSize from Game.pas to RSGraphics.pas - Created hierarchy of TRSCustomRect, TRSObjectRect, and TObjectSize - Added TRSRect, TRSPoint and functions to manipulate them - Added overloaded DrawShape procedures and TRSShapeStyle type - Fixed LineGradient to handle "reversed" TRects (left > Right, etc) - Fixed RotateFont to change font name if font is not a true type (and wouldn't thus rotate) - Added GetRotatedTextExtent function (Delphi's Canvas.TextExtent does not work for rotated fonts) RiverSoftAVG Fuzzy Logic Component Library - Modified IFuzzyLogic.pas - Added LOTS of methods to TIFuzzySet because .NET does not support "implements" keyword - Added LOTS of methods to TIFuzzyVariable because .NET does not support "implements" keyword - Changed hash table pointer references to use TRSPointerType - Had to resurface TFuzzyStreamTokenList methods because of Delphi.NET compiler bug (QC report #) - Modified FuzzyLogic.pas - Changed VerifyAll protected method to use TFuzzyStreamTokenTypes instead of TIntegerSet (needed for .NET) and changed all calls to VerifyAll - Changed overloaded constructors to NOT call other constructor (not supported well in Delphi.NET) - Moved EFzyException to FuzzyConsts - Modified FuzzyConsts.pas - Moved some constants to RSConstants.pas - Moved EFzyException to FuzzyConsts and inherit from ERSException RiverSoftAVG Inference Engine Component Suite - Modified BusinessPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified IEClipsParser.pas - Changed Char types to AnsiChar - Modified IEConsts.pas - Added SNotDOTNETFunction resource string - Moved some constants to RSConstants.pas - Changed EIEException to inherit from ERSException - Modified FuzzyLogicPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified IEFacts.pas - Moved TIEPattern.SetOwner method visibility from protected to public (for .NET) - Moved TFactSet.SetEngineNoParse method visibility from protected to public (for .NET) - Fixed declaration of Notify for .NET - Added TFactValues.FindEntry protected method to get around .NET assembly restrictions - Modified IEHelperFunctions.pas - Changed StrScan calls to Pos, even though StrScan is faster it is not .NET compatible - ReadPersistent function does not work in .NET - Changed SetToString to call GetSetNames in .NET - Changed CalculateHashCode to use String.GetHashCode in .NET - Modified IEInterfaces.pas - Changed ToString property for all interfaces to AsString and GetToString method to ToString method (for .NET) - Modified IEPackages.pas - Added TIEUserFunction InitMetaData method for initializing the function name, comment, and argumentstring (replaces what the AfterConstruction method was used for in descendant classes, makes .NET port easier) - Modified IEParser.pas - Moved TIEParser.OnXXX events from protected to public (for .NET) - Modified IEPropertyEditors.pas - Added TIEClassProperty class, a TClassProperty editor that provides safer access to the class. - Modified the class property editor classes (TDefinedTypesProperty, TFactsProperty, etc) to descend from TIEClassProperty editor class - Modified IERule.pas - Moved TRule.AddBinding method visibility from protected to public (for .NET) - Moved TRule.Change method visibility from protected to public (for .NET) - Fixed declaration of Notify for .NET - Modified IEValue.pas - Removed TIEValue.Create(Pointer) constructor and changed TIEValue.Create(TObject; Boolean) constructor to not use default parameters. The Delphi.NET compiler gets confused with TObject and the constructors with interfaces - Added TIEValueType (.NET=Variant, Win32=TIEValueRec) and TRSPointerType (.NET=TObject, Win32=Pointer) to make writing .NET and Win32 compliant code easier - TIEValue cannot Assign AsOwningObject that is a TPersistent in .NET because .NET won't create objects without a virtual constructor - Modified IEWizPropertyEditors.pas - Modified TSlotItemProperty and TStructureItemProperty for .NET - Modified InferenceEngine.pas - Moved TInferenceEngine.ChangeFactTemplateName method from protected visibility to public (needed for .NET) - Moved TInferenceEngine.RuleChange method from protected visibility to public (needed for .NET) - Moved TInferenceEngine.NewTokenizer method from protected visibility to public (needed for .NET) - Moved TInferenceEngine.RetractFact method from protected visibility to public (needed for .NET) - Moved TInferenceEngine.AddActivation method from protected visibility to public (needed for .NET) - Moved TInferenceEngine.RemoveActivation method from protected visibility to public (needed for .NET) - Moved TInferenceEngine.RuleFired method from protected visibility to public (needed for .NET) - Changed TCustomTreeView calls to TTreeView for .NET - Modified MathPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified MiscPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified ObjectPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified TGet/SetPropertyFunction classes to not use PropInfo so that there are no .NET changes - Modified TGetPropertiesFunction for .NET - Modified PredicatePackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified ReteNetwork.pas - Moved Activations Standdown call from TPatternMatchTerminalNode BeforeDestruction method (doesn't exist in .NET) to Destroy method - Modified RuleEditorForm.pas - Added conditional compilation for TreeView.OnCompare event (which changed in .NET) - Modified StandardPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified StringPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified TrigonometryPackage.pas - Changed AfterConstruction methods to InitMetaData method - Modified TypeEditorFrame.pas - Replaced TeeChart with RSCharts - Modified TypeEditorForm.pas - Added conditional compilation for TreeView.OnCompare event (which changed in .NET) Known Issues/Bugs - Code is not optimized at this point. For .NET, this is especially noticeable because the IECS builds strings the inefficient way, e.g., without using StringBuilder class - Installer needs to be improved for Delphi.NET - Need to update Help files to reflect any changes - FuzzyLogicPackage includes some unsafe code which needs to be fixed to make the IECS 100% safe, managed code - Because the editors were not changed from .dfm to .nfm, when you load these forms it always uses the Win32 versions of the components. If you only install the IECS.NET, you will get "Component not found" errors. - TRSChartPanel component still has some visual errors with the axes - TRSChartPanel component does not support all gradient directions it indicates it should ------------------------------------------------------------------- January 2005 Version 2.13 - Modified to work with Delphi 5, 6, 7, and 2005 (Win32) - Added RSDefines.inc to simplify updates for new versions of Delphi - Modified source files to use RSDefines.inc - Renamed GCollections package to RSCommon package for Delphi 2005 ONLY - Fixed EListError exceptions in dialogs because of Delphi bug 5936, first reported by Leonel Togniolli, "Changing Visibility of a TabSheet causes Error" by introducing TRSPageControl into EditBoxesDxx package - Includes update in Common library and Fuzzy Logic Library (see their respective history files for more information) - Started Modifying source files to work with .NET (Incomplete) ------------------------------------------------------------------- April 2004 Version 2.12 - Fixed some range check errors in IEFacts, and IEValue.pas - Includes update in Common library and Fuzzy Logic Library (see their respective history files for more information) ------------------------------------------------------------------- March 2004 Version 2.11 - Installation script is much smarter about managing the different Delphi versions - Updated Common Help File - Updated Fuzzy Logic Help File - Added 9 new deffunctions (implemented by TIsIEStructFunction and TListVariablesFunction in miscpackage.pas) - Added TIsIEStructFunction (implements is-binding, is-deffacts, is-deffunction, is-defglobal, is-defrule, is-deftemplate, and is-deftype) - Added TListVariablesFunction (implements list-bindings and list-defglobals) - Added ValueEditorForm for editing TValueHashTables, such as TInferenceEngine.GlobalVariables property - Added TGlobalVariablesDialog component - Added TGlobalVariablesDialog to AI palette - Reintroduced FuzzyOperatorMinThreshold into TIFuzzySet (caused access violation in inference engine when fuzzy logic was used) - Moved TFuzzySet.Defined property to published visibility - Set Defined to True if design time - Fixed TCustomFuzzyLogic.Strings property to properly update itself when the underlying fuzzy variables have changed - Added ToString and ValuesToString properties and GetToString and GetValuesToString methods to TFuzzySet - Added ToString property and GetToString method to TFuzzyVariable - Moved TFuzzySet.Defined property to published visibility - Set Defined to True if design time - Added UpdateStrings method to TCustomFuzzyLogic - Overrode UpdateStrings method in TFuzzyLogic - Fixed Parse method in TFuzzyLogic (actually the code for UpdateStrings) - Added Parse and ParseFuzzyLogic methods to TCustomFuzzyLogicParser - Fixed Parsing error for s and z functions in CalcFuzzyFunction method of TCustomFuzzyLogicParser - Added DefuzzifyValue property and CreateCrispValue to IFuzzySet interface - Added ParseFuzzyLogic protected methods - Fixed Bug in PrettyPrint of fuzzy variables - Renamed form for Advanced Console Example Form, was causing conflicts with the Console Dialog (in Delphi 5 at least) - Fixed HSM Demo to be Delphi 5 compatible ------------------------------------------------------------------- January 2004 Version 2.1B - Added str-format user function (StringPackage.TStrFormatFunction) - Created a helper function in IEHelperFunctions to format a string according to the CLIPS formatting rules, used by format and str-format functions (CLIPSFormat) - Modified TFormatFunction to use IEHelperFunctions.CLIPSFormat function - Modified FuzzyLogic library extensively (see Fuzzy Logic History.txt) - Added two more overloaded TInferenceEngine.EvalFuzzyExpression methods to satisfy the new methods in IFuzzyParser - Added EvalFuzzyExpression methods to IFuzzyParser - Changed TIEDefinedTypes.Put method to use Low/Medium/HighFuzzyTerms resource strings for adding FuzzyAutoTerms in InferenceEngine.pas - Added Edit Defined Types button and menu item to Advanced Console Demo - Added View Expert System Action and Menu Item to Advanced Console Demo and console editor - Added vaFileView to TValidAction, which controls View Expert System ------------------------------------------------------------------- May 2003 Version 2.02 - Modified TUserFunctionWizard to use the OpenTools API instead of old Delphi 2/3 interfaces - Fixed bug in the open function for the append mode. It was overwriting previous files instead of appending to the end of them (Thanks E.P.) - Fixed bug in TUserFunctionWizard.Execute where if the form file was being displayed, the unit would be unchanged (Thanks Marc S.) ------------------------------------------------------------------- August 2002 Version 2.01 - Added SFuzzyEmpty variable to FuzzyConsts.pas - Changed FuzzyFormatStr, LeftFuzzyParentheses, and RightFuzzyParentheses to variables to FuzzyConsts.pas - Moved SFuzzyEmpty constant from IEConsts to FuzzyConsts.pas - Fixed TIEDefinedType.CreateValidDefault method to create a valid empty fuzzy set, fixed bug in Wizard with the Hometown Advisor Expert System - Modified TIEClipsParser.ParseSlotTypes to use STypeXXXXKeyword variables - Added STypeXXXKeyword variables to IEConsts - Optimized TIEClipsStream - Uses a TStringStream instead of a String for the already parsed ToString (MUCH better for long streams, 15x Faster) - Sets TFactSet.Engine without reparsing already parsed facts in ParseExpression - Added TFactSet.SetEngineNoParse protected method which sets the Engine property without reparsing all the facts (useful when you know all facts have already been parsed with the new Engine value) - Fixed bug in TIEESDomain.Destroy method causing access violation because it freed the fact template items before rule items - Fixed bug in TInferenceEngine.Assign when copying an interpreted function which refers to a fact template (before the fact template is copied) - Added overloaded TUserFunctions.Assign method and TUserFunctions.AssignInterpretedFunctions - Modified Object & Interface method calls in many classes/units to pass *strings* by const, which avoids a hidden try-finally block to speed up execution - Modified TFactTemplate.GetSlotNames to return the slot names *sorted* - Fixed bug in TFact.GetHashCode which would return different hash codes for the same fact if the slot values came in a different order - Modified TIEValue to use a special record instead of a variant and pointer to store the values, reduces memory consumption and is faster - Modified units to make them compatible with Delphi 7 - Fixed limitation in GHashTable.pas which wouldn't allow you to shrink the hash table if there were items in it ------------------------------------------------------------------- July 2002 Version 2 Final Release - Added Enabled Property to TReteNetwork. If the TReteNetwork is disabled, inferencing is disabled. However, for editor dialogs (rules and facts), disabling the TReteNetwork will speed up the loading significantly - Optimized TFactsDialog, TFactSetDialog, and TRulesDialog by turning off the Rete Network during loading - Fixed TInferenceEngine.ReplaceTemplate method which would NOT detect dependency on a fact template when the rule had an action that asserted a fact based on that fact template - Added TInferenceEngine.IsDependent methods - Fixed really stupid and annoying bug in TIFuzzyVariable.Destroy where I would refer to a field AFTER the Destroy call (sometimes causing an access violation) - Fixed TFactSlot.Assign method to correctly copy the type if the other fact slot is from another inference engine - Fixed bug in TIFuzzyVariable.Destroy method, now sets events and parser to nil - Fixed TFactSlot.Destroy to nil out SlotDefault (and its OnChange event) - Fixed TInferenceEngine.ReplaceDefinedType to also reparse slot default if type changes. This was a problem when fuzzy types would change but the value was still based on old fuzzy type - Fixed TUnDefTemplateFunction and TUnDefRuleFunction in MiscPackage.pas to return FCFalse instead of raising an exception when the construct does not exist - Added TUnDefTypeFunction to MiscPackage.pas - Fixed Edit Fact Templates dialog in Rule Editor Form to update fact templates tree view after returning - Fixed TInferenceEngine.LoadFactTemplates method to only clear fact templates (and their associated facts and rules), instead of everything - Fixed TIEDefinedTypes class to set Reasoner property of IIEDefinedType to nil when type is being deleted or cleared - Changed the DB alias used for the demos from "Applicants" to "IECS" - Added Hometown Advisor Domain to Expert System Wizard - Fixed IEExpertSystemWizard.TIEESFactItem.Assign method to not add new slots when assign IFact values - Fixed TIEESFactTemplateItem.Assign method to update facts and rules after it has changed - Updated Demo to limit number of defined types, fact templates and rules to ~30 - Fixed TFactSlot.IsValid to accept FCNil and FCNilList - Added IDBIEBookmark interface and TDBIEBookmark class - Added ReplaceFact method to TDBIEDataConnection - Added UpdateDependencies and UpdateDependentFact methods to TInferenceEngine - Moved BeginTemplateChange and EndTemplateChange methods from TDBIEDataConnections class to TDBIEDataConnection class - Fixed bugs with changing defined types not being reflected in the TDBIESlot class - Added GetUniqueName and IsUniqueName methods to TDBIEDataConnections class to ensure each data connection gets a unique fact template name - Added overloaded ParseValue methods to TInferenceEngine - Added overloaded ParseValue methods to TIEClipsParser - Changed TIEClipsParser.ParseFactTemplateSlot to use new ParseValue method - Added overloaded ParseValue methods to TIEParser - Added TDBIESlotDefinedTypeProperty editor, provides drop down list for TDBIESlot.SlotType property - Fixed TIEClipsParser.ParseFactTemplateSlot to correctly parse fuzzy default values which start with brackets ([) - Added SEmptyFuzzy constant - Fixed TInferenceEngine.EvalFuzzyExpression to detect '' or SEmptyFuzzy as an empty fuzzy set - Fixed PrettyPrint(IFuzzySet) to print out SEmptyFuzzy as blank string - Fixed behavior of TDBInferenceEngine.Reset method to reassert current record from DataSources - Fixed bug in TFuzzySet.Iterate, should return True if both are empty - Fixed bug in TIFuzzySet.Iterate, should return True if both are empty - Improved TDBInferenceEngine.Notification method to see if TField's DataSets are being destroyed to just nil the DataSources Known Issues: None ------------------------------------------------------------------- May 2002 Version 2 EEP - Update 05 - Finished FuzzyLogic.hlp (over 450 KB of help) - Updated IE.hlp (Incomplete) - Updated Common.hlp (Incomplete) - Fixed TIEClipsParser.ParseFunCall to correctly parse nested funcalls OR singletons - Fixed TReteNetwork.Evaluate method to not resolve global variables - Added TDBDataSetPropertiesFunction and TDBNavigatorFunction, which add 18 more expert system functions: get-dataset-empty, get-dataset-read-only, get-dataset-active set-dataset-read-only, set-dataset-active, dataset-first dataset-prior, dataset-next, dataset-last dataset-insert, dataset-delete, dataset-edit dataset-post, dataset-cancel, dataset-refresh dataset-at-first, dataset-at-last, dataset-move-by Known Issues: - TDBInferenceEngine has bugs when using defined types ------------------------------------------------------------------- April 2002 Version 2 EEP - Update 04 - Added SlotTypes, SlotType, and DefinedType properties to TDBIESlot to allow a database field to map to any type, including fuzzy (DBInferenceEngine.pas) - Added GetFieldSlotValue, GetFieldSlotTypes, SetFieldSlotValue methods to TDBIESlot (DBInferenceEngine.pas) - Fixed Issues with CreateFieldSlot, GetFieldSlotTypes for TDBInferenceEngine (DBInferenceEngine.pas) - Fixed TJoinNode.RunTestVaryRight method to reinitialize the Token.NegatedCount before exiting (caused pattern match errors in some special cases such as having a min and max rule together) - Added ToString method to TBindingInfo and TBinding - Optimized TIEValue.Equals method to check if parameter equals self (good optimization for checking against FCFalse and FCTrue - Modified TIEValue.GetAsInteger and TIEValue.GetAsNumeric methods to return the defuzzified value (or closest to it) if the type is fuzzy - Modified TIEValue.GetAsString to return the fuzzy expression if the type is fuzzy - Added IFuzzySet.Defuzzify method to FuzzyInterfaces.pas - Added TIFuzzySet.Defuzzify method to IFuzzyLogic.pas - Added Default keyword to TInferenceEngine.FuzzyXXXMethod properties so that the property doesn't get streamed unnecessarily - Published TInferenceEngine.GlobalVariables so that it may be streamed out - Modified the TInferenceEngine streaming mechanism to stream fact sets - Fixed IEClipsParser.PrettyPrint( Name, Value ) method to add the variable character ('?') if it is not present - Changed TPatternMatchNode.CallNode method to test slot values to see if they equal FCFalse instead of FCTrue. This has the effect of making tests that return an index or FCFalse (such as member function) working as you would expect - Fixed TIEClipsStream.ReadString method to raise an exception if the string is not terminated - Updated IEEditors.hlp to match the updated editors - Fixed LineNumber reporting error. The parser was stating the wrong line number when an exception occured - Created a TActivationAgenda and TIEAgenda class for tracking the rule activations in the TInferenceEngine. - Optimizations - Changed TGCustomGraph.RemovePredecessors to pass in ANode by const and to use TGGraphNode.RemovePredecessors method - Added TGGraphNode.RemovePredecessors method - Optimized TReteNetwork.TPatternMatchNode.Equals method - Changed TReteNetwork.TReteNode base class to TGLinkedGraphNode Known Issues: - TDBInferenceEngine has bugs when using defined types ------------------------------------------------------------------- March 2002 Version 2 EEP - Update 03 - Created FuzzyLogic.hlp - INCOMPLETE - Updated IEEditors.hlp - Updated all modules with ObjExportAll using conditional compilation to avoid possible bug in Delphi 5. From Delphi Bug List: Compiler - Linker The compiler directive {$objexportall on} in a unit (e.g. suspectunit.pas) causes the DCC32 link stage to fail, producing only a .dcu, but no .exe output and no error messages - Fixed Bug in TypeEditorFrame.pas, TIETypeEditorFrame.Change method where it would execute even when the frame was being destroyed (causing access violations) - Added ability of Expert System Wizard to use the current expert system in the IDE (modified IEPropertyEditors.TInferenceEngineEditor component) - Fixed Expert System Wizard bug in Load Expert System button, it now properly shows the loaded expert system as a domain option - Modified the Expert System wizard to show the expert system loaded when you load an expert system from disk - Fixed bug in IEValue.pas TIEValue.Resolve for dtSingletons where the fuzzy name was inproperly set to the unresolved singletons string - Modified ReteNetwork.pas TJoinNode.DoRunTestsVaryLeft and DoRunTestsVaryRight methods to pass the minimum token strength onto new tokens, fixes activation strength bug for fuzzy rules - Fixed bug in TInterpretedFunction.Call method where multivariables were not getting properly bound - Fixed TInferenceEngine.Assign method, which was raising an exception because of typechecking being performed in the Assign - Fixed Memory Leak where Fuzzy Variables would not be freed because their fuzzy sets had a reference to them. Changed the __Release method to free the fuzzy variable when its reference count equals the number of fuzzy sets in the variable - Fixed TIEDefinedTypes.Assign method, which was not properly replacing the types (causing facts based on old fuzzy variables to stay around and cause problems later) - Fixed TInferenceEngine ReplaceTemplate and RemoveDependency methods to clear out facts in a fact set when the fact template changes - Fixed TInferenceEngine.ReplaceDefinedType to properly create new fact templates containing the new types instead of the old types - Fixed TFactSet.Reset method to capture reparsing/cloning errors, which may occur because of defined type or fact template changes The fact string is left in the factset since this object is outside the engine - Fixed TIFuzzySet.FuzzyMinOperatorThreshold method in IFuzzyLogic.pas to see if value is greater than and EQUAL to the threshold, instead of just greater than - Initialized FuzzyEqualsThreshold in TInferenceEngine to above zero (0.01) - Added Automatic Rule Binding in TRule.Prepare method. Now, actions can get the executing Rule Name by accessing the ?__RULE variable - Modified MiscPackage.TPrettyPrintFunction to return the pretty print string instead of sending to PrintOut - Fixed MiscPackage.TPrettyPrintFunction to resolve the argument - Modified the TModifyFunction in StandardPackage.pas to resolve all the fact before re-asserting... this fixes an error where modifying a multislot would not resolve functions in the new value Known Issues: - TDBInferenceEngine does not work with Fuzzy slots - Problem of retaining interpreted functions & fact sets that could be loaded by the 'Edit Expert System...' Editor ------------------------------------------------------------------- February 2002 Version 2 EEP - Update 02 - Added IEStringToString function (removes outer double-quotes) to IEHelperFunctions - Added datetime-str-format to the TDateTimeStringFunction in MiscPackage, suggested by E.P. (Thanks) - Fixed bug in TIEValue.GetToString where double-quotes inside a string are not prefaced with the escape character (\) (parse "(defrule myrule \"comment\" (phase) => (printout t phase))") - Added SEscapeChar constant to IEConsts.pas - Added TIEParseFunction in MiscPackage, which parses and executes its string argument ------------------------------------------------------------------- January 2002 Version 2 EEP - Update 01 - Fixed TUniverseOfDiscourseFunction in FuzzyLogicPackage.pas, default FunctionName was not getting set properly, resulting in get-u-from function to not display its comment - Fixed TIEDefinedType.SetBaseTypes to create TIEFuzzyVariable class... not TIFuzzyVariable class. It was causing errors in the pattern matching because the TIEFuzzySet.Equals method differs from TIFuzzySet.Equals method - Fixed IEHelperFunctions.GetFuzzySlot function for slot values which are float or integer - Fixed IEExpertSystemWizard.GetValueFromString function to correctly create a dtString value without the double-quotes ------------------------------------------------------------------- January 2002 Version 2 EEP Summary of Version 2 Major Features - New! Database Support! IECS is now database-aware through the TDBInferenceEngine component and TIEDataSet component - New! Fuzzy Logic! IECS now supports fuzzy expert systems and fuzzy inferencing - New! Expert System Wizard! Step-by-step guide to creating expert systems, with examples. Available by right-clicking on TInferenceEngine - New! Type Definitions! IECS adds a new construct, the deftype, which allows you to define types that allow type inheritance, enumerations, range checking, and fuzzy sets. At design-time, the TInferenceEngine.DefinedTypes property allows access to the new types - New! User Function Wizard! Wizard helps you quickly and easily create the code for defining a user function in the IECS - New! Console Dialog! IECS adds a new console dialog, similar to the Advanced Console Editor Demo - New! Type Definition Editor! Design-time and Run-time editor for the new deftype construct - New! Over 60 New Functions, bringing the total to over 250 functions! New functions for dates and times, database, fuzzy logic, and more - Improved Expert System Execution! IECS executes expert systems up to 2.5x faster! - Improved Fact Template Redefinition! IECS now works to keep facts and rules even when the fact templates they depend on have changed - Improved, Bigger, Faster Dialogs! Dialogs have been made bigger (800x600) and in many cases been substantially improved, with additional sorting features, printer support, and type checking - Improved Parser Support! IECS has improved support for defining and designing your own parser classes. Dialogs now support new parsers! ********************************************************************** NOTE TO VERSION 1.0 USERS: Version 2.0 has been optimized. Most changes are transparent. However, because of those optimizations, many event signatures have been changed to pass interface references by the const keyword (thus avoiding Add and Release function calls). If you have used events in the IECS and get a compilation error, check your events! ********************************************************************** Details - Created New Expert System Wizard - step-by-step guide to creating expert systems, with examples - Created New TInferenceEngine Component Editor, uses the console editor to allow the user to modify the component in the most flexible way possible - Created User Function Wizard - Created TDBInferenceEngine class - a data-aware version of TInferenceEngine with the ability to be connected to multiple TDataSources, where every TDataSource supplies one generated Fact Template and facts - Created Icon for TDBInferenceEngine - Created TIEDataLink class to manage data link between TDataSource and the engine - Created TDBIESlot class to encapsulate one TField/Fact Template Slot mapping - Created TDBIESlots class to manage a collection of TDBIESlot - Created TDBIEDataConnection class to manage all details for ONE TDataSource connection to the engine, including data link and slots - Created TDBIEDataConnections class to manage a collection of TDBIEDataConnection - Created IEDBDx package to contain all the new database code - Added IEDBDx to the IEDclDx package - Created IEDBPropertyEditors.pas file for DB property editors and created TSlotDataFieldProperty editor for TDBIESlot.FieldName property - Added Fuzzy Logic (FuzzyConsts.pas, FuzzyLogic.pas, FuzzyInterfaces.pas, IFuzzyLogic.pas, and IEFuzzyLogic.pas) - Created FuzzyLogicPackage, containing 37 new functions: create-fuzzy-value, fuzzy-assert, fuzzy-assert-unconditional, fuzzy-union, fuzzy-union-x, fuzzy-intersection, fuzzy-intersection-x, get-fuzzy-correlation, get-fuzzy-inference, get-fs, get-fs-length, get-fs-x, get-fs-y, get-fs-variable, get-fs-value, get-u, get-u-from, get-u-to, get-u-units, get-fuzzy-auto-terms, set-fuzzy-auto-terms, get-fuzzy-threshold, set-fuzzy-threshold, get-activation-threshold, set-activation-threshold, moment-defuzzify, maximum-defuzzify, is-undecidable, get-compatibility-index, plot-fuzzy-value, set-fuzzy-correlation, set-fuzzy-inference, s, z, pi, tri, and beta - Created Database Package (TDBPackage), containing 7 new functions: duplicate-record, is-dataset-fact, modify-record, assert-record, assert-record-string, retract-record, and retract-record-string - Improved and new collection classes: - Created TIHashTable class, a hash table of interfaces, in InterfaceCollections - Created TFactsHashTable class to manage a hash table of IFact items - Added Indexing methods and properties to hash table classes in GHashtable and InterfaceCollections units: TGCustomHashtable, TGHashTable, TGStringHashTable, TIHashTable, and TIStringHashTable. The last access is cached so that if you are accessing the next or previous index (as in for-to and for-downto loops), these properties are fast. MUCH more intuitive way to loop over entire hash table than iterators. Also, you can loop backwards through the table and delete as you go without worry or slowdown. - Added overloaded ContainsKey methods to hash table classes: TGHashtable, TGStringHashtable, TIStringHashtable, TValueHashtable, TFactTemplates, and TRules. Overloaded method contains a VAR parameter so that it returns the item at the same time as querying the hash table. - Added overloaded HasKey protected method in TGCustomHashtable, which contains a VAR parameter so that it returns the entry at the same time as querying the hash table. - Changed TIList.Add and TIList.Insert to pass interface as const to avoid extraneous AddRef and Release calls - Added TGCollectionItem to Structures.pas, works like TComponent in that you can have notifications between TGCollectionItem classes - Added overloaded TIList.AssignTo(TPersistent) method to implement ICloneable interface change - Added TGInterfaceList class to make a more efficient TInterfaceList - Changed TIList to descend from TGInterfaceList - modified all Clone methods in InterfaceCollections.pas to use Assign(TPersistent) - Created TGListBox class, descendant of TListBox, which displays a horizontal scroll bar when items are too long for control - Improved Fact Template replacement by reparsing as many facts and rules as possible with the new fact template - Added Replace method to TFactTemplates - Added ReplaceTemplate protected method to TInferenceEngine - Modified PutValue and Assign in TFactTemplates to use Replace instead of Remove method if possible - Improved TFactTemplatesEditDlg (FactTemplateEditorForm.pas) - Modified fact templates do not now automatically delete facts and rules by using the improved fact template replacement code - Added Type Editor, with button on toolbar - Made Dialog Larger (800x600) - Added Extended Type Info controls (TypeEditorFrame) - Added Print capability and PrintMargin Property - Modified SNotCorrectType exception to print the value that wasn't of the correct type - Fixed bug with default-dynamic attributes - Added UserFunctions property to allow dialog to properly set the local user functions to be the same as the calling engine's. - Improved TFactsEditDlg (FactEditorForm.pas) - Added type checking. Fixed bug where user could enter invalidly typed data into a fact's slots. Changed IE's TypeCheck property to perform static and dynamic checks - Added Sort By Index option to TFactsEditDlg - Added ID Row to Slot View of TFactsEditDlg - Modified TFactsEditDlg to attempt to preserve fact IDs by setting TFacts.PreserveIDs property. This is useful so that the TDBInferenceEngine can detect when a fact is edited by the TFactsEditDlg - Fixed Sort By ID Bug in TFactsEditDlg (actually, it was sorting by Index) - Added Type Editor and Fact Template Editor, with buttons on toolbar - Added Button Toolbar and Options property to control it - Added Print capability and PrintMargin Property - Made Dialog Larger (800x600) - Sped up the initial assignment of facts - Changed lbFacts to a TGListBox so that a horizontal scrollbar can appear when facts are too big - Fixed bug where default-dynamic fact slots were not being resolved when adding facts - Improved TRulesEditDlg (RuleEditorForm.pas) - Added Type Editor and Fact Template Editor, with buttons on toolbar - Fixed PopupMenu bug in RuleEditorForm where the Fact Templates PopUp would show Delete Rule item - Added Button Toolbar and Options property to control it to RuleEditorForm - Added Print capability and PrintMargin Property to RuleEditorForm - Fixed DragDrop events in RuleEditorForm to properly insert a string based on the parser instead of hard-coded - Fixed UpdateCurrentRule in RuleEditorForm to use ParseRulePatterns and ParseRuleActions methods in order to be parser independent - Added OneShot Checkbox to RuleEditorForm - Made Dialog Larger (800x600) - Added Delete Menu Item to pop up menu in RuleEditorForm - Fixed Rules, which were not being sorted in tree, in RuleEditorForm - Fixed Fact Templates, which were not being sorted in tree, in RuleEditorForm - Fixed bug in RuleEditorForm where user functions added at design-time did not show up - Fixed "Invisible window cannot receive focus" bug in RuleEditorForm - Replaced lbIF and lbTHEN TListBox components with TGListBox in order to fix too long items being truncated in the listbox - Fixed "disappearing" empty line (new line) in IF and THEN listboxes - Added SNotCorrectSlotType error string to IEConsts. Modified TFact.SetValue procedure to raise this error instead of SNotCorrectType. Modified TIEClipsParser.ParseSlot and ParseFact to use this value as well - Changed the names of the packages, removing version numbers, uses the Delphi 6 version numbering instead - Added default keyword to many properties so that Delphi won't store default property values in the DFM - Fixed backward chaining pattern bugs. When a backward-chaining pattern is added to a rule, a "not" for the pattern is added automatically to ensure the rule won't fire if the non-backward-chaining pattern exists. This worked correctly. However, PrettyPrint(TRule) printed the "not" pattern and the TRule.SetPatterns and RuleEditorForm.UpdateRuleEditor did not ignore it causing lots of "not" patterns to build up in the rule - Fixed access violation for components on different forms or modules. Created/Modified SetEngine methods to add and remove free notifications for the components so that they can be notified when engines are freed - Fixed design flaw where TInferenceEngine events were being called from outside the TInferenceEngine (except for OnParse... events). Added numerous protected methods inside TInferenceEngine for firing the events. The previous design made it difficult for a component writer to override TInferenceEngine if they wanted to do some action on that event. For example, TFactTemplates.Clear was firing the OnClearFactTemplates event directly. Now, it calls the protected TInferenceEngine.ClearFactTemplates method, which fires the event. Added protected methods: AddRule, BeginInference, ClearFactTemplates, ClearRules, EndInference, NewFactTemplate, and RemoveFactTemplate - Created InferenceEngineDBReg.pas file to register database classes - Created Defined Types Editor Dialog (TIETypesEditDlg) - Created Defined Types Editor Frame (for use by TIETypesEditDlg and - Added functions to IEHelperFunctions: CreateArgumentExpressions function overloaded CalculateHash Function GetFuzzySlot function GetFuzzySetFromValue function GetIETypeName function FloatEquals Functions IsSubmenuVisible Function SwapEvents procedure StringFilter function - Added TDefinedTypesProperty Editor to IEPropertyEditors - Improved Parsing and Printing Code - Changed TIEParser and TIEClipsParser's Parse and ParseExpression methods to have Execute parameter (default = True) controlling if parsed funcalls should be executed. - Added Enabled Property to TIEClipsParser.ParseRule and TIEClipsParser.PrettyPrint rule - IFunCalls may now be commented... all commented whitespace BEFORE the function call is used - Patterns may now be commented... all commented whitespace BEFORE the pattern is used - Modified TIEClipsStream to set IStreamToken.WhiteSpace property - Modified TIEClipsParser.ParseFunCall to set Comment property from whitespace of first token (comments BEFORE the function call) - Modified TIEClipsParser.ParsePattern to set Comment property from whitespace of first token (comments BEFORE the function call) - Modified PrettyPrint(IFunCall) to print out function call comment - Modified PrettyPrint(TIEPattern) to print out pattern comment - Fixed PrettyPrint(Rule, Construct) to indent multi-line function calls properly - Added TIEClipsParser.GenerateVariable and GenerateVarName methods - Added TIEClipsParser.ParseRulePatterns and ParseRuleActions methods - Added TIEClipsParser.PrettyPrint(TRule;TRuleConstruct) method and PrettyPrint(TRule;TRuleConstruct) function - Fixed bug in automatic pattern match generation for multislots, (phase (create$ 1 2 3)) would incorrectly create a VARIABLE instead of a MULTIVARIABLE test - Added TIEClipsParser.GetSyntaxStatement method - Modified PrettyPrint(IUserFunction) function to accept SyntaxString as well - Modified functions to create TIEValues by passing into constructor the value (faster creates) - Improved parsing speed of ParseFactSet and ParseRule by replacing try-except blocks with smart try-finally blocks - Modified PrettyPrint(IFactTemplate) function to print is-a string, and to not print default slot - Modified PrettyPrint(TFactSet), PrettyPrint(IFactTemplate), and PrettyPrint(TRule) functions to not print empty comments - Modified TIEClipsParser.ParseError method to truncate source text when it is greater than 255 characters. It creates a string containing the first 128 characters and then the last 128 characters - Added ParseSingletons & PrettyPrint(ISingletonsVector) methods to TIEClipsParser & unit - Added brackets [] as delimiters in TIEClipsStream - Modified ParseValue to correctly parse fuzzy singletons, "((1 2) (3 4))", instead of bad funcall - Added SlotFunctions property (tells parser which function calls need fact slots parsed (like assert and modify) SlotFunctionStart = 0 means that ParseFact - Modified ParseFunCall to look at SlotFunctions - Fixed Multislots in fact templates to use type information - Fixed TIEClipsStream.MoveToNextConstruct method to properly find the last construct when near end of file - Added PrettyPrint(Fact,SlotName) and PrettyPrint(Fact,SlotName,Value) methods to TIEClipsParser and unit - Fixed bug in PrettyPrint(IFactSlot) so that it correctly outputs default-dynamic attributes - Added PrettyPrint(DefinedType) and ParseDefinedType methods - Modified ParseRule to parse the new OneShot property - Modified PrettyPrint(TRule) to print the new OneShot property Also doesn't print rule properties (declare...) if properties are the default - Added ParseDefinedType, ParseFuzzySet, and ParseFuzzyVariable methods to TIEClipsParser - Added OnParseDefinedType, OnParseFuzzySet, and OnParseFuzzyVariable events to TIEClipsParser - Added PrettyPrint(IIEDefinedType), PrettyPrint(IFuzzySet) and PrettyPrint(IFuzzyVariable) methods to TIEClipsParser - Added PrettyPrint(IIEDefinedType), PrettyPrint(IFuzzySet) and PrettyPrint(IFuzzyVariable) functions - Fixed PrettyPrint(IFactSlot) to use new default-dynamic property, multislots were not getting printed properly - Added Whitespace property and accessor methods to TIEStreamToken - Added TIEParser.GenerateVariable method - Added TIEParserClass type - Added TIEParser.ParseRulePatterns and ParseRuleActions methods - Added TIEParser.PrettyPrint(TRule;TRuleConstruct) method - Added TIEParser.GetSyntaxStatement method - Added ParseSingletons & PrettyPrint(ISingletonsVector) methods to TIEParser - Added OnParseSingletons event to TIEParser - Added ParseDefinedType, ParseFuzzySet, and ParseFuzzyVariable methods to TIEParser - Added PrettyPrint(Fact,SlotName) and PrettyPrint(Fact,SlotName,Value) methods to TIEParser - Modified TIEStreamToken.Clone method to unambiguously call the new Assign Method - Added PrettyPrint(IIEDefinedType), PrettyPrint(IFuzzySet) and PrettyPrint(IFuzzyVariable) methods to TIEParser - Added OnParseDefinedType, OnParseFuzzySet, and OnParseFuzzyVariable events to TIEParser - Modified TParseFactEvent, TParseFactTemplateEvent, TParseFunCallEvent, TParseFunctionEvent and TParseVariableEvent to pass interfaces by const - Added ParseFactSlot method to TIEParser and TIEClipsParser - Fixed bug in TIEClipsParser ParseFact and ParseFactSlot methods where an integer value could not be assigned to a float slot when dynamic type checking was on - Fixed bug in TFact.SetValue where an integer value could not be assigned to a float slot when dynamic type checking was on - Improved and New Dialog Components - Added TConsoleDialog component - Added EnableXXXXEditor properties to TFactTemplatesDialog, TFactsDialog, and TFactSetDialog - Added TDefinedTypesDialog component - Created/Modified SetEngine method to add and remove free notifications for TFactsDialog, TFactSetDialog, TFactTemplatesDialog, TFunctionsDialog, TRulesDialog so that it can be notified when engines NOT on current form/module are freed - Correctly set UserFunctions property in TFactTemplatesDialog - Changed TRulesDialog to assign entire IE to the form's IE. This prevents an error where the TRulesEditDlg could parse a rule (because it had no facts to match patterns and fire a "test" predicate) but the copy back to the engine would fail. - Fixed bug in TFactsDialog where dialog would throw away duplicate facts even if user wanted them - Improved TInferenceEngine component and collections - Changed TInferenceEngine.Parse method to have Execute parameter (default = True) controlling if parsed funcalls should be executed. - Fixed TFactSets bug where adding or removing would set TFactSet.Engine property properly - Fixed TFactSets.Add method bug where factset of same name didn't replace old factset - Fixed Salience bug in TInferenceEngine.SearchSalience method - Added TInferenceEngine.TokenizerType property - TInferenceEngine.Parser property is now writable - Added TInferenceEngine.ParseRulePatterns and ParseRuleActions methods - Added TInferenceEngine.PrettyPrint(TRule;TRuleConstruct) method - Added Load/SaveDefinedTypes methods to TInferenceEngine class - Added MinActivationStrength property to TInferenceEngine class - Added FuzzyEqualsThreshold property to TInferenceEngine class - Modified Assert(Fact) to include a default parameter for unconditional fuzzy asserts - Added Assert( Fact, FuzzyInferenceMethod ) method - Added FuzzyUnion and FuzzyIntersection methods - Surfaced Parser Property in TInferenceEngine - Modified TIOStreams to descend from TGStringHashTable - Added TInferenceEngine.Assert(Fact, FuzzyInference) method - Added FuzzyInference and FuzzyCorrelation methods to TInferenceEngine - Added FuzzyInferenceMethod and FuzzyCorrelationMethod properties to TInferenceEngine - Added OnFuzzyInference and OnFuzzyCorrelation Events to TInferenceEngine - Added TFuzzyCorrelationEvent type - Added ParseFactSlot method to TInferenceEngine - Optimized TFacts.IndexOf and FindFact(ID) to take advantage of facts being sorted by ID - Modified TFacts.FindFact method to pass fact by const - Modified TInferenceEngine.Assert and retract methods to pass fact by const - Modified TRules to be able to assign to TTreeNodes - Modified TFactTemplates to be able to assign to TTreeNodes - Added TIEDefinedTypes class to hold hash table of defined types for TInferenceEngine - Added DefinedTypes property to TInferenceEngine - Added OnClearDefinedTypes, OnRemoveDefinedType, OnAddDefinedType events to TInferenceEngine - Fixed TFactTemplates.GetToString method to properly order fact templates to avoid child fact templates being printed before parent fact templates - Modified TUserFunctions.PutValue, Clear and Remove methods to set the number of interpreted functions in the hash table as well as set the Add order of the interpreted function - Added PrettyPrint(Fact,SlotName) and PrettyPrint(Fact,SlotName,Value) methods to TInferenceEngine - Fixed TUserFunctions.Assign to correctly copy interpreted functions - Fixed bug with TFactSets.Assign to clone the TFactSet instead of just adding it - Added PrettyPrint(IIEDefinedType), PrettyPrint(IFuzzySet) and PrettyPrint(IFuzzyVariable) methods to TInferenceEngine - Added OnParseDefinedType, OnParseFuzzySet, and OnParseFuzzyVariable events to TInferenceEngine - Added ParseDefinedType, ParseFuzzySet, and ParseFuzzyVariable methods to TInferenceEngine - Fixed bug in TInferenceEngine.PrintOut, where printing out to other streams than default would produce gibberish - Modified TIOStreams to be a TGStringHashtable instead of a TGStringList, deleted IOStream property from TInferenceEngine - Modified TFactTemplates.FillNodeSlot method to have default parameter specifying if the node passed in is a parent node (Default) in which case create the child node, or not, in which case replace the node. - Added PreserveIDs property to TFacts (Default=False). If this property is True, the TFacts object attempts to use the same Fact ID of the fact when it is added. This property is used by the TFactsEditDlg at the cost of speed. - Improved Packages and New Functions PredicatePackage - Added FuzzyP to TVerifyTypePFunction - Added TGetValueTypeFunction - Modified TIEUserFunction Descendant Classes to set the ArgumentString property StringPackage - Modified TIEUserFunction Descendant Classes to set the ArgumentString property - Fixed Uppercase and lowercase functions to return string as correct type (e.g., when input is an atom, should return an atom) TrigonometryPackage - Modified TIEUserFunction Descendant Classes to set the ArgumentString property MathPackage - Added Randomize Function - Modified Random Function to accept from and to parameters - Modified PI Functionname to be "PI", instead of "pi" - Modified TIEUserFunction Descendant Classes to set the ArgumentString property ObjectPackage - Modified TIEUserFunction Descendant Classes to set the ArgumentString property BusinessPackage - Modified TIEUserFunction Descendant Classes to set the ArgumentString property - Modified functions to create TIEValues by passing into constructor the value (faster creates) MiscPackage - Added TGuardFunction - Added TListDefTypesFunction - Added TDateTimeStringFunction, TSystemDateTimeFunction, DecodeDateTimeFunction, and EncodeDateTimeFunction - Modified TIEUserFunction Descendant Classes to set the ArgumentString property - Modified functions to create TIEValues by passing into constructor the value (faster creates) - Modified TPrettyPrintFunction to print deftypes as well - Added PrettyPrint property and logic to TPrettyPrintFunction - Modified TIEUserFunction Descendant Classes to set the ArgumentString property StandardPackage - Added TGetSlotValueFunction - Added TMemberFunction - Fixed Member function, which had always returned 0. Also corrected its help comment - Fixed Fetch Function for when the variable is not there (supposed to return FCNil instead of erroring) - Added Argument String property (and accessor methods) to TIEUserFunction and TCustomUserFunction - Modified TGtFunction, TGtOrEqFunction, TLtFunction, and TLtOrEqFunction Call methods to more efficiently compare more than 2 items - Fixed TFormatFunction to correctly accept floating point numbers - Fixed bug in TSetFactDuplicationFunction, where it did not resolve the argument before checking for equals to FALSE - Modified Comments for TGetFactDuplicationFunction and TSetFactDuplicationFunction, they incorrectly specified the exact OPPOSITE behavior - Improved function calls - Added Comment property and accessor methods to TFunctionCall - Added TFunctionCall.Assign(TPersistent) overloaded method - Modified SNotCorrectType exception to print the value that wasn't of the correct type - Added DeleteArgument and ClearArguments to TFunctionCall class - Added Argument String property (and accessor methods) to TIEUserFunction and TCustomUserFunction - Modified TInterpretedFunction to comply with interface changes - Added Equals method to TBindingInfo and TBinding - Modified TIEContext.Resolve method to properly resolve Fuzzy expressions - Created TBindingInfo class to hold binding information. This class replaces the variant array we used to put in IIEValue - Modified TBinding class to descend from TBindingInfo class - Added TIEContext.Resolve(IFact) method - Changed TBinding constructor to accept const Value instead of just value - Modified TIEContext.AddGlobalBinding, AddLocalBinding, AddBinding, ExpandList, and FlattenList methods to pass IIEValue by const - New Constants (IEConsts.pas) - Added DefaultPrintMargin for dialogs - Added TIEDialogOptions for dialogs - Modified SNotCorrectType exception to print the value that wasn't of the correct type - Changed some constants to vars (e.g., SDefaultSlotName). Users should be able to change what is used to what matches best for their needs. - Modified CommentFormat string to take out syntax statement - Added SyntaxFormat and CLIPSSyntaxFormat resource strings - Added Resource String constants and TIETypes constants (such as IEAlwaysValidTypes) - Added FloatFormatStr - Added TValueConstraint and TValueConstraints types - Added Constraint resource strings - Added SExpectedRuleProperty resource string message - Added TValidAction, TValidActions, TValidView, and TValidViews types - Improved Rete Pattern Matching class (TReteNetwork) and support classes - Fixed bug with TReteNetwork.UpdateNodes method where adding rules after facts would sometimes not activate the rules properly - Modified TPatternMatchTerminalNode.AddActivation method to supress activations of disabled rules - Modified TPatternMatchNode.CallNode method to catch exceptions and append node information on them so that the user may know the exception happened in a rule pattern match - Added NodeMatchClass, NodeTestClass, NodeJoinClass, and NodeTerminalClass properties to TReteNetwork class. The TReteNetwork class uses those properties to control what nodes it makes when it is compiling a rule - Added Salience to the TActivation.GetToString method (complies with CLIPS better). - Reordered TPatternMatchTest enumeration to group tests better, rewrote case statement in TPatternMatchNode.CallNode method for optimization - Added Strength property (strength of rule activation, applies to fuzzy rules) to TActivation class - Modified TActivation constructor to accept Strength parameter which defaults to 1.0 - Fixed TJoinNode.CallNode method to correctly call TIETokenTree.Add method - Modified the ToString returned from a TJoinNode - Fixed TReteNetwork.AddRule to remove the rule if there is an exception - Modified TPatternMatchTerminalNode.AddActivation to not add activation if rule's HasFired and OneShot properties are true - Fixed TJoinNode.CallNode method to correctly call TIETokenTree.Add method - Optimizations - Changed TReteNetwork CallChildren and Evaluate methods to pass Token by const - Changed Nodes' CallNode methods to pass Token by const - Changed TPatternMatchTerminalNode AddActivation and StandDown methods to pass Token by const - Changed TJoinNode AskForBackChain, RunTestsVaryLeft, and RunTestsVaryRight methods to use const - Changed TTestNode AddTest methods to pass Value by const - Got rid of "AS" casting where it wasn't necessary - Modified TJoinNode.RunTestsVaryLeft and RunTestsVaryRight methods to check if token tree is empty before executing - Modified TJoinNode.DoRunTestsVaryLeft and DoRunTestsVaryRight methods to use TIETokenTree's LowIndex and HighIndex properties - Added Strength property to TIEToken - Added ToString and ToFactsString properties to TIETokenTree - Optimizations to TIEToken/TIETokenTree - Added LowIndex and HighIndex properties to TIETokenTree, indicates the parts of the table that contains data - Changed TIETokenTree's Add and Remove methods to pass Token by const - Modified TIEToken Constructors, Assign, and Equals methods to pass interfaces by const - Improved and New Interfaces (Note that changes to interfaces may require changes for v1.0 users) - Optimization! Modified method signatures so that interfaces are passed using the const keyword CommonInterfaces - Added overloaded AssignTo(TPersistent) method to ICloneable interface - Added Assign( TPersistent ) method to ICloneable - Modified ICloneable to pass interfaces by const - Added TINotifyEvent signature IEInterfaces - Added Comment property and accessor methods to IFunCall - Added Whitespace property and accessor methods to IStreamToken - Added DeleteArgument and ClearArguments to IFunCall Interface - Added Argument String property (and accessor methods) to IUserFunction - Added HashCode property and read accessor method to IFactTemplate - Added Overloaded ContainsUserFunction method to IReasoner interface - Added ISingletonsParser and ISingletons interfaces - Added Strength property to IReteToken - Modified most interfaces to pass around parameters by const (IUserFunction, IInterpretedFunction, IReasoner, IValueVector, IFactSlot, IFactTemplate, IFact, IFunCall, IIEValue, IReteToken) - Added Fuzzy property to IFactTemplate - Added ContainsType method to IFactTemplate - Added OnChange Event to IIEValue interface - Added IIEDefinedType interface - Added Fuzzy and NumFuzzySlots property and accessor methods to IFactTemplate - Added DefaultDynamic property (and accessor methods) to IFactSlot - Improved Facts, Fact Templates and Patterns classes (IEFacts.pas) - Added Comment property to TIEPattern - Modified TFactTemplate Assign statements to NOT copy the tag property - Added protected TIEPattern.AddTest method, which is called by the public AddTest and SetTests - Added protected TIEPattern.CreatePatternMatchTest methods, which are called by the AddTest and SetTests methods - Added Two overloaded TIEPatternMatchTest.Equals methods - Added HashCode property and read accessor method to TFactTemplate - Modified functions to create TIEValues by passing into constructor the value (faster creates) - Added TFactCombineEvent type - Fixed TFactSet.Reset method to properly resolve the facts before asserting them - Added Fuzzy property to TFactTemplate - Added ContainsType method to TFactTemplate - Added DefaultDynamic property (and accessor methods) to TFactSlot - Modified TFactTemplate.Clone method to unambiguously call the new Assign Method - Fixed TFactTemplate's AssignSlots method which would get into trouble if the fact slot being cloned had a funcall from another engine Optimizations - Modified TIEPattern internal tests structure to sort by slot name - Modified TFact constructors to pass interfaces by const - Modified TFactTemplate constructors to pass interfaces by const - Modified TIEPattern constructors to pass interfaces by const - Modified TIEPatternMatchTest constructors to pass interfaces by const - Modified TFactSet.Add, IndexOf, and Remove methods to pass interfaces by const - Created TFactValues hash table (and associated TFactValueHashtableEntry and TFactValueHashtableEnumerator) to hold the values for a TFact AND the slot (gets rid of of slot check overhead) - Improved IEValue.pas - Fixed bug in TIEValue.GetAsInteger where it would not convert a string float to an integer - Added IsValueConstant function to determine if a IIEValue IS (not EQUALS) a value constant, e.g., FCTrue, FCFalse, etc. - Modified SNotCorrectType exception to print the value that wasn't of the correct type - Modified functions to create TIEValues by passing into constructor the value (faster creates) - Added overload constructors to TIEValue - Added OnChange Event to TIEValue - Added TSingletonsVector class - Fixed bug in TIEValue.Resolve method for pattern bindings - Removed AsIntArray, AsStringArray and AsVariantArray properties and accessor methods from IIEValue interface to make it compatible with C++Builder - Added AsOwnedObject array to IIEValue interface - Added TValueVector.Assign(TPersistent) method to fulfill the ICloneable interface changes... just raise exception since TValueVector is not a TPersistent descendant - Added Changed method to TIEValue - Added AsFuzzy property (and accessor methods) to TIEValue - Improved TRule class - Added Enabled property to TRule - Fixed TRule.AddPattern to correctly insert the index of the pattern into bindings (if the Pattern was insert instead of added to the pattern list trouble could happen) - Fixed TRule.AddBinding to not add a binding already in the bindings - Added overloaded TRulePatternList.IndexOf(IFactTemplate) method - Modified TRule Prepare, Fire and SetSalience methods to pass interfaces by const - Modified TRuleActionList Add, Remove, IndexOf and Insert methods to pass interfaces by const - Added HasFired and OneShot Properties to TRule. OneShot property controls whether the Rule will stop activating after the first rule fire ------------------------------------------------------------------- February, 2001 Version 1.11 - Modified TIEInnerFunction to be more generic. Now, you can use TIEInnerFunction to connect to ANY TObject. Also, one component can now act as multiple IUserFunctions using one TIEInnerFunction object per IUserFunction connection - Changed Constructor to accept TComponent instead of TCustomUserFunction - Changed Owner property to TComponent from TCustomUserFunction\ - Added OnCall event for non-TCustomUserFunction components - Changed Call method to call TCustomUserFunction.Call method directly if Owner is TCustomUserFunction. Otherwise, the new OnCall event is triggered - Fixed TIEInnerFunction Notification method to check properly for removal of owner (Someone could have overridden TIEInnerFunction and connected to the TIEFunctionNexus causing this method to erroneously nil the Owner) - Fixed bug in RuleEditorForm.pas where could not add or replace facts because of embedded spaces in meSalience. This bug was introduced in in v1.1 when salience became a TMaskEdit instead of TSpinEdit ------------------------------------------------------------------- December 9th, 2000 Version 1.1 - Improved CLIPS support with the addition of 36 functions (see below) - Modified code to improve future C++Builder support - All TIEUserFunction descendants override AfterConstruction instead of the constructor now (except for multi-function objects like TPrettyPrintFunction) because FunctionName and SetMin/MaxArgumentCount are virtual - Made TFactTemplate Assign( IUnknown ) and AssignSlots non-virtual. There was no reason to have them virtual and could cause problems with C++Builder users - Moved call of TUserPackage.CreateFunctions from its constructor to AfterConstruction method - Moved TInferenceEngine.AddDefaultPackages and Assert calls from constructor to AfterConstruction - Moved Event clearing and Clear call code in TInferenceEngine.Destroy to BeforeDestruction - Moved Reset call in TIEValue.Destroy to BeforeDestruction - Moved StandDown call in TPatternMatchTerminalNode.Destroy to BeforeDestruction - Changed seSalience (TSpinEdit) to meSalience (TMaskEdit) in RuleEditorForm since C++Builder does not have a TSpinEdit - New! Created a TTrigonometryPackage containing 37 new user functions. The new functions are: acos, acosh, acot, acoth, acsc, acsch, asec, asech, asin, asinh, atan, atan2, atanh, cos, cosh, cot, coth, csc, csch, cycle-rad, deg-grad, deg-rad, distance, distance-sqr, distance-manhattan, grad-deg, grad-rad, hypotenuse, rad-cycle, rad-deg, rad-grad, sec, sech, sin, sinh, tan, and tanh - New! Created a TBusinessPackage containing 12 new user functions. The new functions are: double-declining-balance, future-value, interest-payment, interest-rate, internal-rate-of-return, net-present-value, number-of-periods, payment, period-payment, present-value, sln-depreciation, and syd-depreciation - New! Added 6 new user functions (Batch, Dribble-On, Dribble-Off, Duplicate, Rename and Remove) to TStandardPackage - Added Batch (2), StartCapture(2), and StopCapture methods to TInferenceEngine - Added InputStream and OutputStream read-only properties to TInferenceEngine - Modified TIEClipsParser to accomodate "duplicate" command syntax (similar to "modify" command syntax) - Added printout statements to TIEClipsParser.ParseExpression for dribble/captures, deleted them from OnParse events in Console apps - Updated Help File for all the changes ------------------------------------------------------------------- October 5, 2000 Version 1.01 - Set OnEndInference and OnStartInference events to nil in TInferenceEngine destructor (Could lead to bugs) - Fixed bug where TInferenceEngine would free rules that it didn't own (such as a design-time TRule) when the rule was removed - Fixed bug in Advanced Console and Basic Console demos where inference engine events could try to access non-existent controls if the controls were freed before the engine ------------------------------------------------------------------- August 31, 2000 Version 1 - Renamed Delphi 5 packages to include a D5 on end (like the Delphi 4 packages) - Unified Graph classes - TGCustomGraph unified - New classes: TGGraph (Tlist based Graph) and TGLabelGraph (TGStringHashTable based Graph) - Changed TGGraphNode ancestor from a TComponent to a TPersistent (faster and smaller memory footprint) - Modified TReteNetwork to descend from new TGGraph instead of TGCustomGraph - Fixed "Losing rules" Rule editor bug - Fixed Freeform rule editor bug where changes would not be saved unless the view was changed back to the listbox - Added OnStartInference and OnEndInference events to TInferenceEngine - Finished Help File ------------------------------------------------------------------- June 21, 2000 Version 1 - Beta 02 - Fixed many memory leaks (parsing error leak, activation leak, pattern slot test leak, and fact template/fact template slot leak) - Deleted IFactSlotOwner interface as it was no longer used (using the interface caused a circular interface reference where the slots would reference the template and the template the slots, and neither would be freed. sigh. :) ) Added GetTemplateName to IFactSlot which was what the IFactSlotOwner was used for mostly anyway. - Added show-message, input-box, input-query, and message-dlg functions to miscellaneous package - Added AddLocalBinding to TIEContext - fixes bug where rules and interpreted functions could stomp on other bindings - Added TBindings class to track TBinding objects, added it to TIEContext. - Defined Comment property for all user functions in the inference engine - Added a MoveToNextConstruct method to TIETokenizerStream and TIEClipsStream - Added ability of parsers to stop on first error on continue until finished. Required adding properties ErrorHandling and MaxErrors to TIEParser & TIEClipsParser and properties ParserErrorHandling and ParserMaxErrors to TInferenceEngine - Added DuplicateConstructs property to TInferenceEngine. It controls what happens when attempting to add duplicately named constructs. Allows easy importing of duplicate expert systems where only the data has changed or a few rules added. - Changed behavior of TInferenceEngine.Clear method to NOT clear out the user functions. Makes more sense and clear method is much faster since it doesn't free and reallocate all the functions. Clear method still deletes IInterpretedFunctions though. - Changed behavior of TInferenceEngine.LoadFromStream to not call clear before parsing - Added class TUserFunctions, a hash table of user functions for the TInferenceEngine component - Changed TInferenceEngine.UserFunctions from a TIStringHashTable to TUserFunctions - Added SlotCount read-only property (with method) to IFactTemplate and TFactTemplate - Added write accessor methods for Max/MinArgumentCount and FunctionName to IUserFunction - Added IStreamable and IDTStreamable interfaces to CommonInterfaces unit - Updated Inference Engine Help File - Updated Common Help File - Decided ES will NOT output TInferenceEngine properties by default... so it's no longer a bug :) - MAJOR revisions to user functions in inference engine architecture: - Changed TUserFunctionList from a TComponentList descendant to TIList. Means that TUserPackage only holds interfaces for functions and will only stream functions that also implement new IDTStreamable interface - Changed TCustomUserFunction. It no longer implements IUserFunction and descends from TComponent instead of TCustomReasonerOwner. However, it still provides design-time implementation of user functions. - Added new class TIEUserFunction which implements IUserFunction and IDTStreamable. Makes user functions lighter weight since they descend from TPersistent instead of TComponent/TCustomReasonerOwner - Added new class TIEInnerFunction (descends from TIEUserFunction) which implements the IUserFunction interface for TCustomUserFunction. This fixes a MAJOR bug where TCustomUserFunction could be freed but interface references would still be around. - Changed TInterpretedFunction to descend from TIEUserFunction instead of TCustomUserFunction - Changed name of TReasonerList to TBaseReasonerList and changed Owner of the list to type TIEUserFunction. Added new TReasonerList which descends from TBaseReasonerList to change the Owner to a TUserPackage. - Fixed TInferenceEngine.Assign method bug - Fixed bug where functions could be freed but the architecture would still contain references to them (access violation) - Fixed bug with multiple NOT rule patterns (not (not ...)) - Fixed bug with EXISTS keyword in rule patterns - Fixed bug where design-time rules and fact templates would not trigger initial events for TInferenceEngine (Just reordered properties for proper loading) - Fixed misreported line number with parsing errors - Fixed bug with UNIQUE keyword in rule patterns - Fixed bug so that fact templates have one default slot if none is specified when the fact template is added to TInferenceEngine Known Bugs - Still Need to update help files ------------------------------------------------------------------- May 18, 2000 Version 1 - Beta 01 - Added Expected to EIEParseException, moved to IEParser - Added ExplicitCreateTemplate and TypeCheck to TIEParser - Added TypeChecks to IE, get/set-dynamic/static-constraint-checking functions to Misc Package - Added Max/MinArgumentCount, GetToString to IUserFunction and TCustomUserFunction - Added IInterpretedFunction - Modified TInterpretedFunction - ActionValue and ActionValueCount are now Statement and StatementCount - AddAction and AddValue are now AddStatement - Argument now returns IIEValue - Binding and BindingCount are gone - Added PrettyPrint methods for IUserFunction and IInterpretedFunction to - TInferenceEngine - TIEParser and TIEClipsParser and IEClipsParser Unit - Added ppdeffunction to MiscPackage - Modified SaveFacts to save only some fact templates - Added SaveFacts and SaveStream for fact templates to TInferenceEngine - Fixed Salience in TInferenceEngine - Fixed Rule Editor bug where Hitting Replace and rule is invalid loses old rule - Fixed bug for Dragging and dropping entire template onto edit box, too many parentheses - Added slot TYPE in building fact templates! - Fixed bug where outputing ES does not include deffunctions Known Bugs - Still Need to update help files - NOT NOT patterns and Exists Are buggy - Unique Pattern bug, doesn't work - Outputing ES does not output properties like (get-reset-globals) ------------------------------------------------------------------- May 1, 2000 Version 1 - Beta 00 Original Beta Version Known Bugs - Help Files Incomplete |
Send mail to webmasterNO@SPAMRiverSoftAVG.com with questions or comments about this web site.
|