All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
This is a backwards incompatible rewrite.
- A new
dimension
symbol. - Support for multiple outputs in each process.
- A new mini language
ccml
and interpreter for easily specifying initial chunks & rules. - The
dev
module, collecting tools and resources relevant for developing new components. - Visualization and inspection tools.
- New processes:
NAM
,Drives
- Renamed several classes in base; basic design is preserved.
- Replaced construct symbols with URI strings in a majority of cases. Construct symbols still used as numdict keys for features, chunks and rules. Even in these cases, the design has been heavily revised.
- Integrated
Domain
andInterface
functionality intoProcess
objects. - Simplified
Process
objects. Most notably,call()
now expects a list of numdicts instead of a mapping. - Rewrote nearly all previous components with simplified implementations. Variable component parameters now passed through inputs to call.
- Chunk and rule databases are now full-fledged
Process
objects. - Completely rewrote numdicts.
- Native QNet support.
Domain.disjoint(*domains)
for checking if domains are mutually disjoint.Chunk.support(self, *domains)
to check if domains support self.Rule.support(self, *cdbs)
to check if cdbs support self.Chunks.enforce_support(self, *domains)
context manager to ensure that chunks are built out of domain features.Rules.enforce_support(self, *cdbs)
context manager to ensure that rules are built out of predefined chunks.ActionRules
now has a threshold parameter.GoalStay
communicates previous goal information in dedicated features.
ChunkExtractor
no longer ensures chunk form uniqueness.- Adjusted defaults for buffer and goal stay interfaces.
- Goal chunk invocation on resumption
GoalStay
would change the order in which goals are executed (away from FILO order). Removed for more consistent behavior. - A bug in
Pruned
caused it to excluded expected construct type instead of including it.
BLAs.prune()
, which removes BLA records below threshold.- Automatic symbolic address expansion.
CompositeProcess
renamed toComposite
WrappedProcess
renamed toWrapped
FeatureDomain
andSimpleDomain
replaced withDomain
FeatureInterface
andSimpleInterface
replaced withInterface
ReinforcementDomain
renamed toReinforcements
- Simplified implementation and control interfaces for
ParamSet
,Register
,RegisterArray
,GoalStay
Process
input types nowMapping[Any, NumDict]
. This is a compromise. The ideal would be to set keys to be of typeSymbolicAddress
. However,SymbolicAddress
is a union type andMapping
is invariant in its key type, therefore being explicit about the key type is prone to false alarms.
ControlledExtractor
- Optional
blas
argument toRegister
andRegisterArray
, supporting BLA based deletion of stored entries. - New construct type
updater
for constructs solely dedicated to update processes (e.g., for databases, or due to sequencing requirements). - Automatic activation sequence generation at assembly time:
Structure
instances now step member constructs in roughly the order they were added to the structure. CompositeProcess
andWrappedProcess
classes for simplifying compositional component definitions.- Construct input structure checking and automated input extraction (see
Process.check_inputs()
andProcess.extract_inputs()
).
- Constructs now connect directly to each other.
- Replaced
SymbolTries
in inputs and outputs with flat mappings from symbolic addresses to numdicts. - Renamed
BLADrivenStrengths
toBLAStrengths
- Combined
BLAInvocationTracker
andBLADrivenDeleter
intoBLAMaintainer
- Renamed
ReniforcementMap
toReinforcementDomain
. - Replaced
Component
,Emitter
,Propagator
withProcess
. - Former
Updater
components recast asProcess
components servingupdater
constructs. - Realizers now structurally immutable (see removed for list of removed methods.). Behavior can still be modified by replacing emitters, but constructs may not be added or removed after initial assembly.
- Streamlined realizer construction; use of with syntax encouraged exclusively:
- Several
Realizer
methods now protected:offer()
,accepts()
,finalize_assembly()
- Several
Structure
methods now protected:add()
,update_links()
,offer()
,finalize_assembly()
- Several
SymbolTrie
RegisterArrayBLAUpdater
, added BLA support toRegister
andRegisterArray
instead (see added)Updater
and all child abstractions.Cycle
and all child classes and submodulecomponents.cycles
.- Separate update cycle; stepping constructs now issues calls to a single stepping function only (
step()
for basic constructs). - Removed realizer mutation methods:
- Several
Realizer
methods:drop()
,clear_inputs()
- Several
Structure
methods:__delitem__()
,remove()
,clear()
,drop()
,clear_inputs()
,clear_links()
,reweave()
- Several
- Runtime checkable generic protocol
SymbolTrie
- New differentiable op
tanh
innumdicts.ops
. - Functions
squeeze
,with_default
,val_max
,val_min
,all_val
,any_val
innumdicts.funcs
- Compact rule definitions; enabled by nested use of
Chunks.define
andRules.define
(see Changed). - Delete requests for Chunk, Rule, and BLA databases.
GoalStay
propagator for maintaining and coordinating goals.BLADrivenStrengths
propagator for determining chunk (and other construct) strengths based on their BLAs.MSCycle
, experimental activation cycle for motivational subsystem
- Type
Inputs
toSymbolTrie[NumDict]
to be more precise. Chunks.link()
renamedChunks.define()
and returns achunk
.Rules.link()
renamedRules.define()
and returns arule
.- For
Chunks
andRules
:request_update
renamed torequest_add
,resolve_update_requests
renamedstep
BLAs.update()
renamedBLAs.step()
Structure
output type.PullFunc
output type.PullFuncs
output type.- Incorrect filtering behaviour for
MutableNumDict.keep()
andMutableNumDict.drop()
. Pruned.preprocess()
BLAs.request_reset()
- Several additions to
components
subpackage, including:chunks_
submodule defining chunk databases and several related components.rules
submodule defining rule databases and several related components.qnets
submodule definingSimpleQNet
andReinforcementMap
for building simple Q-learning models.buffers
submodule defnining buffer propagatorsParamSet
,Register
, andRegisterArray
.blas
defining BLA databases and some basic related updaters.
- Various quality of life improvements including:
- Use of
with
statements to automate adding constructs to containers. assets
attribute forStructure
objects for storing datastructures shared by multiple components of the parent realizer (e.g, chunk database may be shared by updaters).utils.pprint
submodule which extends stdlibpprint
to handle somepyClarion
objects.
- Use of
- Examples
flow_control.py
,q_learning.py
,chunk_extraction.py
,working_memory.py
. - New construct types and symbols for rules, feature/chunk pools, and preprocessing flows.
numdicts
subpackage, providing dictionaries that support numerical operations and automatic differentiation.base.components
submodule defining basic abstractions for components:Component
,Emitter
,Updater
abstractions for specifying components and setting up links.Propagator
andCycle
classes for specifying activation propagation procedures forConstruct
andStructure
instances.Assets
, a simple namespace object for holding structure assets.FeatureDomain
,FeatureInterface
,SimpleDomain
,SimpleInterface
for structuring specification of feature domains and feature driven control of components
- Reorganzied library. The basic design has persisted, but almost everything else has changed. Expect no backwards compatibility. Some notable changes include:
ConstructSymbol
replaced with newSymbol
class.- Old construct realizer classes simplified and replaced:
Structure
class for containersConstruct
class for basic constructs.
- Realizers and propagators all modified to emit and operate on numdicts, as defined by
numdicts
submodule. - Individual chunk and feature nodes no longer explicitly represented, instead use of feature pools is encouraged.
- Circular imports.
SimpleFilterJunction
for filtering flow/response inputs.ConstructType.NullConstruct
alias for empty flag value.
- Python version requirement dropped down to
>=3.6
. - Reworked
examples/free_association.py
to be more detailed and more clear. - Replaced all
is
checks on flags and construct symbols with==
checks.
ConstructRealizer
could not be initialized due to failing construct symbol check and botched__slots__
configuration.BasicConstructRealizer.clear_activations()
may throw attribute errors when realizer has already been cleared or has no output.SimpleNodeJunction
would not recognize a construct symbol of the same form as its stored construct symbol. This caused nodes to fail to output activations. Due to use ofis
in construct symbol checks (should have used==
).
CategoricalSelector
object for categorical choices (essentially a boltzmann selector but on log strengths).ConstructRealizer.clear_activations()
for resetting agent/construct output state.- multiindexing for
ContainerConstructRealizer
members. - functions
make_realizer
,make_subsystem
,make_agent
for initializing empty realizers from symbolic templates. ConstructRealizer.ready()
method signaling whether realizer initalization is complete.ConstructRealizer.missing()
andContainerConstructRealizer.missing_recursive()
for identifying missing realizer components.SubsystemRealizer
andAgentRealizer
automatically connect member realizers upon insertion (using data present in members' construct symbols) and disconnect them upon deletion.BufferRealizer.propagate()
docs now contain a warning about potential unexpected/unwanted behavior.
Microfeature
renamed toFeature
for brevity and to better reflect theory.ContainerConstructRealizer
properties now return lists instead of iterables for easier interactive inspection. Generators still acssessible through iterator methods such asrealizer.iter_ctype()
andrealizer.items_ctype()
.- Improved
str
andrepr
outputs for construct symbols and realizers. SimpleBoltzmannSelector
renamedBoltzmannSelector
- Additional
ConstructRealizer
subclass initialization arguments now optional. Behavior
,Buffer
andResponse
factories assignBehaviorID
,BufferID
, andResponseID
tuples as construct identifiers.Appraisal
construct renamedResponse
to avoid association with appraisal theory.
- Simplified
BasicConstructRealizer
initialization and data model. - Bug in
SubsystemRealizer
allowing connections between constructs that should not be linked. - Bug in
ConstantSource
allowing mutation of output activation packets.
- Dependency on
numpy
.