Глава 1: Введение и фундаментальные принципы
Проект BEAST (Browser-based Embodied Agent Simulation and Testing) представляет собой браузерное приложение, моделирующее индивидуальную адаптивность. Его цель — не создание «работающего существа», а формализация и реализация теории адаптивных систем в виде программного кода. Проект служит инструментом для изучения и отладки архитектуры, где каждая деталь поведения системы является следствием строгих, документированных и выполняемых алгоритмов.
В папке /demos/ проекта BEAST есть демо для показа реализованных принципов.
1.1. Назначение проекта
Проект BEAST позиционируется как наиболее адекватный способ реализации теории индивидуальной адаптивности. Аналогично тому, как математика формализует физические законы, BEAST служит формализацией для теории адаптивных систем. Код выступает не просто как продукт, а как спецификация и схема работы системы, позволяя тестировать, модифицировать и отлаживать адаптивное поведение.
В рамках проекта сознательно исключены сложные вербальные интерфейсы (распознавание фраз, символы, тон сообщений). Фокус сделан на базовых слоях: гомеостаз, базовые контексты, стимулы, рефлексы, дерево условий, семантическая и эпизодическая память, процесс осознания и автоматизмы. Это позволяет удерживать систему в границах управляемой сложности, сосредоточившись на ядре адаптивности.
1.2. Ядро архитектуры: от организма к сознанию
Архитектура BEAST построена вокруг иерархической модели, где каждый новый слой абстрагирует и усложняет поведение предыдущего.
1.3. Время: Дискретный пульс
Фундаментальной единицей времени в BEAST является пульс (puls.js). Это искусственное, дискретное время, в котором выполняется большая часть системных процессов.
1.4. Ключевые понятия
Глава 2: Пульс и поток обработки: от стимула к действию (исправленная версия)
В этой главе мы проследим путь сигнала в системе BEAST — от момента нажатия оператором кнопки стимула до финального изменения состояния системы (действия, обновления памяти, смены контекста). Это позволит понять, как дискретный пульс синхронизирует все компоненты и обеспечивает целостность поведения.
2.1. Жизненный цикл пульса
Центральный цикл системы реализован в файле beast/puls.js. Это рекурсивная функция sep_of_puls(), которая имитирует «сердцебиение» существа, вызывая себя с задержкой в 1 секунду (или меньше, если обработка заняла больше времени). Каждый пульс — это строго определенная последовательность шагов:
|
№ |
Шаг |
Описание |
|
1 |
Фиксация «нулевой» значимости |
Вызов getDiffImportance() сохраняет текущее состояние в PrevDiffForEpisode для будущего расчета эффекта ЭП |
|
2 |
Сохранение в IndexedDB |
runIndexedDBSavesForPulse() — все модули с флагом dirty записывают свое состояние |
|
3 |
Инкремент пульса |
Cur_puls_val++, обновление UI и localStorage |
|
4 |
Тик эпизодической памяти |
EpisodicMemory_onPulse() — счетчик ожидания ответа, закрытие кадра по таймауту |
|
5 |
Обновление виталов |
performSensorOperations() — сдвиг значений по shift, учет активных стимулов |
|
6 |
Обновление контекстов |
getActiveBasicContexts() — расчет BadVitalsValue, выбор BasicContextsActived, обновление BadNormWell |
|
7 |
Обновление UI |
Контексты, ветка дерева, инфокартина (Info_updateFromPerceptionTree) |
|
8 |
Стартовый цикл (пульс 3) |
Если нет главного цикла, создается начальный цикл осмысления со стимулом 0 |
|
9 |
Диспетчер сознания |
dispetchConsciousnessThinking() — шаг главного цикла, шаг фоновых (раз в 5 пульсов) |
|
10 |
Рефлексы |
processGeneticReflexes() — отложенные, условные, генетические рефлексы |
|
11 |
Сброс флага УР |
EpisodicMemory_skipConditionalReflexFormation = false |
|
12 |
Визуализация пульса |
Мигание зеленого кружка в UI |
2.2. Ориентировочный рефлекс (ОР) как спусковой крючок
ОР (orientation_reflex.js) запускается при любом изменении набора активных стимулов (клик по кнопке). Это центральный механизм выбора того, на что обратить внимание.
2.2.1. Алгоритм выбора победителя
Шаг 1: Сбор кандидатов
Полный набор активных стимулов → FinalImageId (образ полной картины)
Каждый активный стимул отдельно → FinalImageId (образ одного стимула)
Шаг 2: Расчет актуальности для каждого кандидата
text
Копировать
Скачать
актуальность = новизна × значимость
|
Компонент |
Формула |
Примечание |
|
Новизна |
(meanImportance × samplesCount) / 10 |
Если нет семантики → 1. Умножается на коэффициент отсутствующих уровней дерева (×2, ×3, ×4, ×5, ×6) |
|
Значимость |
meanImportance из семантики |
Если нет → (сумма importance виталов) / (количество виталов × 20) |
|
Множитель цепочки ЭП |
×2 + 1 |
Для стимулов из суффикса кадров с реакциями (≥2 кадра подряд) |
Шаг 3: Конкуренция и гистерезис
У всех кандидатов, кроме прошлого победителя, вычитается OR_HYSTERESIS = 0.5
Если активна «Важная проблема» (ImportantProblem), гистерезис удваивается (×2)
Стимулы из приоритетной цепочки ЭП не подвергаются гистерезису
Шаг 4: Пороговые проверки после выбора победителя
|
Проверка |
Условие |
Действие |
|
Период ожидания ЭП |
EpisodicMemory_isInWaitingPeriod() = true |
Закрыть текущий кадр с ответом = победитель, открыть новый кадр по победителю, запустить повторный ОР (второй проход) |
|
Достаточность опыта |
samplesCount < OR_well_known (10) |
Не создавать кадр ЭП, не запускать ФО. Исключения: состояние «Плохо» (well=1), стимулы Еда/Вода (1001, 1002) |
|
Регистрация семантики |
Всегда |
Вызов registerSemanticSample для накопления статистики значимости |
Шаг 5: Запуск полного цикла (если все проверки пройдены)
Сохранение победителя в гиппокампе (actual_stimul_ID)
Блокировка рефлексов на 2 пульса (setBlockedReflex)
Добавление в очередь отложенных рефлексов (addBlockedReflexToQueue) с привязкой к branchId
Вызов stimuls_consciousness(context) — вход в процесс осознания
Создание кадра эпизодической памяти (save_episodic_memory)
2.3. Процесс осознания: от входа до действия
Функция stimuls_consciousness (conscious_attention_channel.js) — это шлюз, который определяет, стоит ли прерывать текущую мысль новым стимулом.
2.3.1. Порог прерывания («тишина мысли»)
Если есть активный главный цикл осмысления и он еще не помечен expired, новый стимул конкурирует с ним:
Базовый порог:
text
Копировать
Скачать
эффективная_значимость_стимула ≥ thinkingImportance_главного × INTERRUPT_THRESHOLD_ATTENTION_RATIO (1.5)
Модификаторы эффективной значимости:
|
Ситуация |
Модификатор |
|
Тема/ситуация стимула ≠ теме/ситуации главного цикла |
× 0.5 |
|
Активна «Важная проблема» (ImportantProblem) |
× 0.5 |
|
Стимул из приоритетной цепочки ЭП |
нет проверки порога |
|
Стимул — победитель ОР (orientationReflexWinner) |
нет проверки порога |
Если значимость стимула недостаточна, вызов stimuls_consciousness завершается без создания нового цикла.
2.3.2. Создание цикла осмысления
Если порог преодолен:
Текущий главный цикл (если есть) пушится в стек прерываний (ConsciousnessBackgroundStack)
Создается новый цикл (Consciousness_createCycle) с весом (weight) = значимости стимула
Новый цикл становится главным (Consciousness_setMainCycle)
2.3.3. Элементарный проход (уровни 1–2)
Новый цикл сразу же выполняет Consciousness_runElementary:
Уровень 1 — Поиск автоматического решения:
|
Ветка |
Условие |
Действие |
|
Позитивное правило ЭП |
Семантика стимула < 0 и есть правило в ЭП для родительской ветки с effect > 0 |
Запуск автоматизма через info_automatismWithEpisodeFeedbackAndExpireCycle |
|
Штатный автоматизм |
Есть автоматизм для ветки с isDefault=true и usefulness ≥ 0 |
Запуск автоматизма |
Уровень 2 — Постановка цели и решение (если автоматизм не запущен):
Фиксация unsolved_problem = актуальный стимул
Вызов conscience_level_2(context)
Определение цели (приоритет сверху вниз):
|
Приоритет |
Тип цели |
Условие |
Действие |
|
1 |
Выживание |
isShockState или suddenChange или criticalVital |
Поиск жизненного опыта с positive usefulness → автоматизм; если нет — цепочка по Target_rule_stack; если нет — умолчательная цель «Плачь» |
|
2 |
Жизненный опыт |
Есть цель для ветки с effect > 0 |
Запуск автоматизма по этому ОД |
|
3 |
Смысл (meaning) |
Значимость стимула > 3 и нет цели по ветке |
Прогноз по ЭП, обновление гештальта, усиление абстракций |
|
4 |
Нет цели |
Исчерпаны варианты |
Режим passive у цикла |
Если автоматизм запущен на любом из этих уровней:
Цикл помечается expired и переводится в фоновые
Устанавливается флаг awaitingAutomatismEpisodeFeedback = true
В EpisodicMemory_pendingFeedbackAutomatizmId записывается ID запущенного автоматизма
Цикл ожидает ответа оператора (закрытия кадра ЭП)
2.4. Рефлексы на пульсе: генетические и условные
Обработка рефлексов (processGeneticReflexes) происходит на каждом пульсе после диспетчера сознания. Это гарантирует, что если осознание уже запустило автоматизм, рефлекс по той же ветке не сработает.
2.4.1. Порядок обработки
|
Очередь |
Что обрабатывается |
Как |
|
1. Отложенные рефлексы |
Рефлексы, заблокированные ОР на 2 пульса |
Выполняются, если не были удалены (removeDelayedReflexesForBranch) при запуске автоматизма |
|
2. Условные рефлексы |
synonyms_tryRunReflexes() |
Проверка зрелых рефлексов (tryCount > 3) с совпадением stimulIds и контекста |
|
3. Генетические рефлексы |
Сравнение текущих и предыдущих активных стимулов |
Для каждого нового стимула из карт рефлексов выбирается действие |
2.4.2. Формирование условных рефлексов
Условный рефлекс создается при вызове synonyms_onGeneticActionFired (из startAction), если:
Источник действия — не 'synonym' (не повторный запуск по УР)
Нет флага noConditionalReflex (рефлекс не был заблокирован ОР)
Нет периода ожидания ЭП
Активных стимулов больше одного (чтобы было что сочетать)
Структура условного рефлекса:
context: строка "well:id1,id2" — состояние + базовые контексты
stimulIds: массив глобальных ID стимулов, которые были активны кроме вызвавшего реакцию
actionId: ID базового действия
tryCount: число сочетаний (порог зрелости = 3)
isReady: флаг готовности (становится true при tryCount > 3)
2.5. Действие и регистрация в памяти
startAction (genetic_reflexes_engine.js) — финальная точка, где действие становится фактом.
|
Действие |
Что происходит |
|
UI |
Обновление блока «Активность Beast» с названием действия и значимостью стимула |
|
Режим |
Info_setMode('target') — перевод инфокартины в целевой режим |
|
Образ действия |
ActionsImage_registerReaction(finalImageId, actionId) — создание/дополнение ОД |
|
Эпизодическая память |
EpisodicMemory_setLastFrameActionFromActionId(actionId) — запись действия в открытый кадр |
|
Условные рефлексы (обучение) |
synonyms_onGeneticActionFired(stimId, sourceType, actionId) — при выполнении условий |
|
Пролонгированные действия |
Регистрация в prolongedActions (есть в ActionProlongator) для последующего влияния на виталы |
2.6. Закрытие кадра ЭП и оценка эффекта
Закрытие кадра — момент получения обратной связи. Может произойти тремя способами:
|
Способ |
Триггер |
Действие |
|
Ответ оператора |
Активация стимула в период ожидания |
closeLastFrame(стимул_ответа) — кадр закрывается с ответным стимулом |
|
Таймаут |
Истечение response_waiting_period пульсов |
closeLastFrame(null) — если не было действия, в кадр пишется 0 |
|
Новый ОР |
Новый победитель ОР при открытом кадре |
Закрытие предыдущего кадра с ответом = новый победитель |
2.6.1. Что происходит в closeLastFrame
Шаг 1: Вычисление эффекта
text
Копировать
Скачать
effect = clamp(diffAfter - diffBefore, -10, +10)
Если diffBefore недоступен → effect = 0.
Шаг 2: Заполнение «дырок» в правиле
Если к моменту закрытия в кадре нет ОД или ответного стимула → записывается 0 (маркер
«не было»).
Шаг 3: Единая оценка эффекта
Запись effect в кадр ЭП
Передача effect в штатный автоматизм ветки: Automatizms_addUsefulnessSample(automatizmId, effect)
Шаг 4: Уведомление модулей
|
Модуль |
Вызов |
Что делает |
|
Гештальт |
Gestalt_onEpisodeFeedbackClosed() |
Добавляет сигнатуру в буфер резонанса, обновляет статус гештальта |
|
Абстракции |
AbstractImages_cloneFromEpisodeFrame() |
Создает/усиливает клоны восприятия и действия |
|
Ментальные правила |
MentalRules_registerFromEpisodeFrame() |
Усредняет правило по абстракции |
Шаг 5: Обработка ответа оператора (если был ответ)
Если кадр закрыт ответным стимулом и это был автоматизм:
Цикл получает automatismOperatorAnswerReceived = true
lastAutomatismEpisodeEffect = effect
На следующем шаге runOneStep вызывается conscience_level_2 с _operatorAnswerCycleOnly = true
2.7. Сводная таблица потока данных
|
Этап |
Место в коде |
Вход |
Выход |
|
Активация стимула |
stimuls_ui.js → клик по кнопке |
stimId |
Обновление Active*Stimuls, вызов OrientationReflex_runOnStimulusActivation() |
|
Ориентировочный рефлекс |
orientation_reflex.js |
Активные стимулы, семантика, виталы |
Победитель (winnerId), регистрация семантики, возможно создание кадра ЭП |
|
Осознание (вход) |
conscious_attention_channel.js |
Контекст (winnerId, branchId) |
Новый цикл ФО, запуск runElementary |
|
Уровень 1–2 |
conscious_attention_channel.js |
Цикл, актуальный стимул |
Запуск автоматизма (если найден), иначе unsolved_problem |
|
Уровень 2 (цели) |
conscience_level_2.js |
unsolved_problem, инфокартина |
Определение цели, запуск автоматизма или переход в passive |
|
Рефлексы |
genetic_reflexes_engine.js |
Активные стимулы (на пульсе) |
Выполнение действий, регистрация в ЭП, формирование УР |
|
Закрытие кадра |
episodic_memory.js |
Ответ оператора или таймаут |
Запись effect, уведомление абстракций и гештальта |
|
Ответ оператора |
conscience_level_2.js |
effect, закрытый кадр |
Обновление абстракций, полезности цели, завершение цикла ожидания |
Глава 3: Модели памяти и абстракции: от эпизода к знанию
В этой главе мы разберем, как система BEAST трансформирует конкретный опыт в обобщенные знания. Ключевое различие, реализованное в архитектуре: эпизодическая память хранит последовательности событий (что за чем следовало), а семантическая память и абстракции фиксируют устойчивые связи и значимость, отделяя суть от контекста.
3.1. Три уровня памяти
|
Уровень |
Где хранится |
Что хранит |
Ключ (идентификатор) |
|
Семантическая |
SemanticMemory, SemanticMemoryIndex |
Значимость (meanImportance) образа стимула в данных условиях |
(well, emotionId, finalImageId) |
|
Эпизодическая |
Episodes |
Правила: условия → стимул → действие → эффект → ответ оператора |
Индекс в массиве (порядок важен) |
|
Абстракции (клоны) |
AbstractPerceptionImages, AbstractActionImages |
Клоны жестких образов, их semanticStructure — правила по ветке+ситуации |
(perceptionNodeId, stimulusImageId) или (perceptionNodeId, actionImageId) |
3.2. Семантическая память: значимость образа
Семантическая память отвечает на вопрос: «насколько этот стимул важен в данных обстоятельствах?».
3.2.1. Структура записи
javascript
Копировать
Скачать
{
wellNormaBad: 1|2|3, // состояние: Плохо/Норма/Хорошо
emotionId: number, // ID эмоции (сочетание базовых контекстов)
finalImageId: number, // ID образа стимула
meanImportance: number, // средняя значимость (усредненный effect)
samplesCount: number, // число наблюдений
lastImportance: number // последнее зафиксированное значение
}
3.2.2. Формирование записи
Семантическая запись создается или обновляется в двух местах:
|
Сценарий |
Вызов |
Особенность |
|
Активация стимула (ОР) |
registerSemanticSample (всегда) |
Фиксирует значимость стимула ДО того, как система на него отреагировала |
|
Закрытие кадра ЭП |
addUsefulnessSample → AbstractImages_clone... |
Клоны абстракций усредняют значимость по effect |
Важно: Семантика регистрируется при каждой активации стимула, даже если ОР не создал кадр ЭП (например, из-за недостаточного samplesCount). Это обеспечивает накопление опыта.
3.2.3. Механизм «лупы» значимости
При слабой семантике (|meanImportance| ≤ 0.5) и отсутствии выхода виталов из нормы (BadVitalsValue все 0) система усиливает слабый сигнал:
text
Копировать
Скачать
усиленный_эффект = normalizeValue(clamp(LastDiffImportanceRaw × 5, -3, +3))
Это позволяет «расслышать» слабые, но значимые изменения в спокойном состоянии, не искажая семантику при стрессе.
3.2.4. Использование семантики
|
Где используется |
Цель |
|
ОР |
Расчет новизны и значимости стимула, порог OR_well_known |
|
Уровень 3 ФО |
При meanImportance < 0 — блокировка мотора по правилу ЭП |
|
Модели понимания |
getImageUnderstandingModel для UI-диалога по клику на «i» |
3.3. Эпизодическая память: правила и их закрытие
Эпизодическая память хранит кадры — записи о том, что произошло: в каких условиях, какой стимул, какое действие, какой эффект, и как ответил оператор.
3.3.1. Структура кадра
javascript
Копировать
Скачать
{
perceptionNodeId: number, // ID ветки дерева (условия)
stimulusImageId: number, // ID образа стимула
situationId: number, // ID ситуации (из дерева ситуаций)
actionImageId: number|null, // ID образа действия (null — еще не выполнено)
effect: number|null, // эффект (-10..+10, null — кадр открыт)
responseStimulusImageId: number|null, // ответ оператора (null — нет ответа)
diffBefore: number, // значимость ДО активации (для расчета effect)
createdAt: number // timestamp
}
3.3.2. Жизненный цикл кадра
|
Этап |
Что происходит |
|
Создание |
При срабатывании ОР (после прохождения порога) → save_episodic_memory. Кадр открыт (effect = null). Устанавливается EpisodicMemory_waitingStartedAt и счетчик пульсов ожидания. |
|
Заполнение действием |
При выполнении любого действия (startAction) → setLastFrameActionFromActionId. Действие записывается в открытый кадр. |
|
Закрытие |
Ответ оператора, таймаут или новый ОР → closeLastFrame. Вычисляется effect, записывается ответный стимул (если был). |
|
Нулевое правило |
Если к моменту закрытия нет ОД или ответа → в поля пишется 0 (кадр остается в истории, не удаляется). |
3.3.3. Период ожидания ответа
Период ожидания — это интервал (в пульсах, по умолчанию 15), в течение которого система ждет ответа оператора на свое действие.
Ключевые правила периода ожидания:
|
Ситуация |
Поведение |
|
Стимул в период ожидания |
Стимул трактуется как ответ оператора (не проверяется OR_well_known). Текущий кадр закрывается с этим ответом, создается новый кадр по ответу, запускается повторный полный ОР. |
|
Истечение периода |
Кадр закрывается (closeLastFrame(null)). Если действия не было — actionImageId = 0. |
|
Нет ответа, но действие было |
Кадр закрывается, эффект вычисляется, абстракции обновляются. |
|
Прогресс-бар |
Отображается только при waitingStartedAt != null (активное ожидание в этой сессии). После обновления страницы не восстанавливается. |
3.3.4. Приоритет цепочек кадров
Если в конце массива Episodes есть ≥ 2 кадра подряд, у каждого из которых есть actionImageId (реакция), эти стимулы получают приоритет:
|
Где проявляется |
Механизм |
|
В ОР |
Не вычитается гистерезис, актуальность усиливается (×2 + 1) |
|
В ФО |
Не применяются понижающие множители (несовпадение темы/ситуации, ImportantProblem), порог прерывания — как у равной значимости (ratio = 1) |
Это позволяет не обрывать смысловую цепочку (например, действие → ответ → следующий стимул) посторонними стимулами.
3.4. Абстракции: клоны жестких образов
Абстракции — это «клоны» жестких образов восприятия и действия, которые живут в префронтальной коре (в терминах модели) и могут свободно комбинироваться, в отличие от своих жестких прототипов.
3.4.1. Два типа клонов
|
Тип |
Массив |
Ключ |
Создается при |
|
Клон восприятия |
AbstractPerceptionImages |
perceptionNodeId + stimulusImageId |
Закрытии кадра ЭП (всегда) |
|
Клон действия |
AbstractActionImages |
perceptionNodeId + actionImageId |
Закрытии кадра ЭП (только если actionImageId > 0) |
3.4.2. Структура клона
javascript
Копировать
Скачать
{
id: number,
perceptionNodeId: number, // ветка дерева
stimulusImageId: number, // жесткий образ (для клона восприятия)
actionImageId: number, // жесткий ОД (для клона действия)
meanImportance: number, // средняя значимость (усредненный effect)
count: number, // число усреднений
createdAt: number,
lastUsedAt: number,
semanticStructure: { // правила для этой абстракции
frames: [
{
perceptionNodeId: number,
situationId: number,
ruleKind: 'episodic' | 'teacher' | 'fantasy',
stimulusImageId: number,
actionImageId: number|null,
effect: number|null,
responseStimulusImageId: number|null,
updatedAt: number
},
// ...
]
}
}
3.4.3. Семантическая структура (semanticStructure)
semanticStructure — это набор правил, привязанных к конкретным условиям (ветка + ситуация). Для каждой такой пары условий может быть только один кадр.
Приоритет правил:
|
ruleKind |
Приоритет |
Когда создается |
|
teacher |
Наивысший |
Кадр ЭП с responseStimulusImageId > 0 |
|
episodic |
Средний |
Кадр ЭП без ответа оператора |
|
fantasy |
Низший |
Цепочка пассивного фантазирования (info_new_abstract_semantic) |
Если для одних условий уже есть учительское правило, fantasy-правило не перезаписывает его. Для episodic-правила выбор идет по большему effect.
3.4.4. Использование абстракций
|
Где используется |
Что делает |
|
Уровень 3 (shortcut) |
AbstractImages_findRuleFrameMatchingContext — поиск правила по (ветка, ситуация, стимул). Если найдено и значимость положительна (effect > 0 или ruleKind === 'teacher'), запускается автоматизм. |
|
Ответ оператора |
AbstractImages_applyEpisodeEffectToSemanticContextAbstractions — усредняет meanImportance клонов, если есть совпадающий кадр в semanticStructure. |
|
Цель «значение» |
AbstractImages_boostSemanticRulesForAction — усредняет meanImportance всех абстракций, в чьем semanticStructure есть правило с данным ОД. |
|
Учительский fallback (ур.3) |
AbstractImages_activateTeacherRuleOnAbstractions — создает учительский слот в semanticStructure для текущих условий. |
3.5. Ментальные автоматизмы и символы
Над клонами надстраивается еще один уровень абстракции — символы (Abstractions) и ментальные автоматизмы (MentalAutomatizms).
3.5.1. Структуры ментального уровня
|
Структура |
Назначение |
Ключевые поля |
|
MentalActionImage |
Ментальный образ действия |
sourceActionImageId (исходный ОД), abstractActionIds (символы) |
|
MentalEpisodeRule |
Ментальное правило |
perceptionNodeId, stimulusImageId, abstractionId, meanEffect |
|
MentalAutomatizm |
Ментальный автоматизм |
themeId, situationId, mentalActionImageId, usefulness |
|
Abstraction |
Символ верхнего уровня |
id, может хранить любую структуру (пока заготовка) |
3.5.2. Формирование ментальных правил
Ментальное правило создается при вызове MentalRules_registerFromEpisodeFrame из closeLastFrame:
javascript
Копировать
Скачать
// abstractClone = { abstractPerceptionId, abstractActionId }
var absId = abstractClone.abstractActionId || abstractClone.abstractPerceptionId;
MentalRules_addSample(pn, stim, absId, effect);
То есть ментальное правило привязывается к абстракции (клону восприятия или действия), а не к жесткому образу.
3.5.3. Создание ментального автоматизма
После ответа оператора, при effect > 0 и наличии кадра в semanticStructure, вызывается MentalAutomatizms_tryCreateFromSemanticStructureRule:
3.6. Сводная таблица: от эпизода к абстракции
|
Этап |
Вход |
Обработка |
Выход |
|
Закрытие кадра |
Кадр ЭП с effect |
AbstractImages_cloneFromEpisodeFrame |
Клон восприятия (всегда) + клон действия (если есть ОД) |
|
Обновление semanticStructure |
Кадр ЭП + клон |
AbstractImages_upsertSemanticRuleFromEpisodeFrame |
Правило (episodic/teacher) в semanticStructure клона |
|
Учительский fallback (ур.3) |
Текущие условия + учительский кадр |
AbstractImages_activateTeacherRuleOnAbstractions |
Учительский слот в semanticStructure клонов |
|
Ответ оператора |
effect + совпадение semanticStructure |
AbstractImages_applyEpisodeEffect... |
Усреднение meanImportance клонов |
|
Цель «значение» |
Прогноз по ЭП |
AbstractImages_boostSemanticRulesForAction |
Усреднение meanImportance абстракций с данным ОД |
|
Ментальное правило |
Кадр ЭП + абстракция |
MentalRules_registerFromEpisodeFrame |
Запись в MentalEpisodeRules |
|
Ментальный автоматизм |
Положительный effect + semanticStructure |
MentalAutomatizms_tryCreateFrom... |
Запись в MentalAutomatizms, штатный для (ветка, ситуация) |
3.7. Схема потока: от эпизода к абстракции
Этап 1: Закрытие кадра ЭП
Кадр ЭП (perceptionNodeId, stimulusImageId, actionImageId, effect)
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ AbstractImages_cloneFromEpisodeFrame │
├─────────────────────────────────────────────────────────────────┤
│ 1. clonePerception(perceptionNodeId, stimulusImageId, effect) │
│ → обновляет meanImportance клона восприятия │
│ 2. если actionImageId > 0: │
│ cloneAction(perceptionNodeId, actionImageId, effect) │
│ → обновляет meanImportance клона действия │
│ 3. AbstractImages_upsertSemanticRuleFromEpisodeFrame │
│ → добавляет/обновляет правило в semanticStructure клонов │
│ 4. MentalRules_registerFromEpisodeFrame │
│ → создает ментальное правило по абстракции │
└─────────────────────────────────────────────────────────────────┘
Этап 2: Использование абстракций в ФО
text
Копировать
Скачать
Текущие условия (perceptionNodeId, situationId, actualStimulusImageId)
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ AbstractImages_findRuleFrameMatchingContext │
├─────────────────────────────────────────────────────────────────┤
│ Поиск в AbstractPerceptionImages: │
│ - perceptionNodeId == текущий │
│ - stimulusImageId == actualStimulusImageId │
│ - в semanticStructure.frames: │
│ perceptionNodeId == текущий │
│ situationId == текущий │
│ stimulusImageId == actualStimulusImageId │
│ actionImageId != null │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ conscience_level_3_semanticStructureFrameAllowsMotor │
├─────────────────────────────────────────────────────────────────┤
│ Разрешает мотор, если: │
│ - ruleKind === 'teacher' │
│ - ИЛИ responseStimulusImageId > 0 │
│ - ИЛИ effect > 0 (для episodic) │
└─────────────────────────────────────────────────────────────────┘
Этап 3: Создание ментального автоматизма
Ответ оператора: effect > 0
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ MentalAutomatizms_tryCreateFromSemanticStructureRule │
├─────────────────────────────────────────────────────────────────┤
│ 1. Найти кадр в semanticStructure по (ветка, ситуация, стимул) │
│ 2. findAbstractActionRecordId(ветка, ОД из кадра) │
│ 3. MentalActionImages_getOrCreate(ОД, [abstractActionId]) │
│ 4. MentalAutomatizms_create(themeId=ветка, │
│ situationId, │
│ mentalActionImageId, │
│ usefulness=effect) │
│ 5. MentalAutomatizms_setDefault(id) │
└─────────────────────────────────────────────────────────────────┘
Глава 4: Гештальты и уровень 4 — доминанты и инсайты
В этой главе мы разберем самый высокий уровень осознания в BEAST — уровень 4, реализованный через механизм гештальтов. Если эпизодическая память фиксирует что было, а абстракции обобщают как это работает, то гештальты отвечают на вопрос: «какая проблема еще не решена и что мы о ней знаем?».
4.1. Что такое гештальт в BEAST
Гештальт — это долгоживущая доминанта, запись о нерешенной задаче. В отличие от кадра эпизодической памяти (который фиксирует произошедшее), гештальт живет дольше одного цикла осмысления и может накапливать информацию о попытках решения.
Ключевые свойства гештальта:
4.2. Структура данных
|
Поле |
Тип |
Назначение |
|
id |
number |
Уникальный идентификатор |
|
problemTreeId |
number |
Ветка дерева восприятия (условия проблемы) |
|
situationId |
number |
Ситуация (из дерева ситуаций) |
|
goalImageId |
number |
Образ цели (из GoalImagesLife) — уникальный ключ |
|
automatismIds |
number[] |
ID опробованных моторных автоматизмов |
|
status |
0–4 |
0=новый, 1=начато, 2=частично, 3=закрыт успехом, 4=архив |
|
lastInsightPuls |
number |
Пульс последнего инсайта |
|
lastInsightKind |
string |
Тип инсайта ('pre', 'local', 'analogy', 'feedback') |
|
insightChainCount |
number |
Счетчик инсайтов (для статистики) |
|
analogyPool |
array |
Хвост предложений аналогий (ограниченного размера) |
Важное правило: на один goalImageId может быть только один гештальт. Если задача решена (status=3), новая запись для той же цели не создается (пока не реализовано переоткрытие).
4.3. Статусы гештальта
|
Статус |
Значение |
Когда устанавливается |
|
0 (NEW) |
Заведен, нет устойчивого решения |
При создании записи |
|
1 (STARTED) |
Начато, есть кандидаты |
При первом инсайте (аналогия, резонанс) |
|
2 (PARTIAL) |
Частичное решение |
При положительном фидбеке (effect > 0, но ниже порога закрытия) |
|
3 (CLOSED_SUCCESS) |
Успешно закрыт |
При effect ≥ 6 (сильный положительный эффект) |
|
4 (ARCHIVED) |
Архив (зарезервировано) |
— |
4.4. Буфер резонанса (GestaltResonanceBuffer)
Это FIFO-очередь сигнатур закрытых кадров ЭП. Каждая сигнатура — это «слепок» успешного (или неуспешного) опыта, который может быть использован для аналогий.
Структура сигнатуры:
javascript
Копировать
Скачать
{
id: number, // порядковый номер сигнатуры
atPuls: number, // пульс создания
sourceCycleId: number, // ID цикла, в котором произошло закрытие
goalImageId: number, // цель цикла (если была)
problemTreeId: number, // ветка проблемы
situationId: number, // ситуация
perceptionNodeId: number, // ветка восприятия
automatismId: number, // ID автоматизма, который сработал
actionImageId: number, // ОД, который был выполнен
effect: number, // эффект (от -10 до +10)
kind: string // 'positive_feedback' | 'non_positive'
}
Правила буфера:
4.5. Инсайты и аналогии
4.5.1. Что считается инсайтом
Инсайт — это событие, в котором система связывает образ цели гештальта с конкретным кандидатом решения (автоматизмом, аналогией), изменяя понимание задачи.
Типы инсайтов:
|
Тип |
Источник |
Когда возникает |
|
pre |
Предварительный |
При effect ≤ 0 — переинтерпретация |
|
local |
Локальный |
Внутри цикла-хозяина (цель «значение», прогноз по ЭП) |
|
analogy |
Аналогия |
При совпадении сигнатуры буфера с открытым гештальтом |
|
feedback |
Обратная связь |
При закрытии кадра ЭП с effect > 0 |
4.5.2. Механизм аналогии (резонанс)
При каждом тике уровня 4 для главного цикла выполняется Gestalt_processResonanceBufferForCycle:
4.5.3. Инсайт из обратной связи
При закрытии кадра ЭП (Gestalt_onEpisodeFeedbackClosed):
4.5.4. Инсайт из цели «значение»
В уровне 2, при прогнозе по ЭП для цели «значение», вызывается Gestalt_bumpFromMeaningForecast:
4.6. Интеграция с уровнями осознания
|
Точка вызова |
Функция |
Что делает |
|
Начало ур.3 |
Gestalt_prepareContextForCycle |
Помещает в global.GestaltContextForLevel3 снимок открытого гештальта для текущего цикла (если есть цель) |
|
Тик ур.4 |
Gestalt_onConsciousnessTick |
Обрабатывает резонанс для главного цикла, обновляет контекст |
|
Закрытие кадра ЭП |
Gestalt_onEpisodeFeedbackClosed |
Добавляет сигнатуру в буфер, обновляет статус гештальта по цели цикла ожидания |
|
Цель «значение» (ур.2) |
Gestalt_bumpFromMeaningForecast |
Повышает статус гештальта при прогнозе |
Важно: Гештальты не запускают мотор сами по себе. Они только:
4.7. Поток данных: от сигнатуры к инсайту
Этап 1: Закрытие кадра ЭП добавляет сигнатуру в буфер
text
Копировать
Скачать
closeLastFrame()
│
▼
Gestalt_onEpisodeFeedbackClosed()
│
├── Gestalt_pushResonanceSignature() → добавляет сигнатуру в буфер (FIFO)
│
└── Если есть goalImageId у цикла ожидания:
├── Найти гештальт по goalImageId
├── appendAutomatismIfNew() — добавить automatismId в список опробованных
├── Если effect ≥ 6 → status = 3 (CLOSED_SUCCESS), инсайт 'feedback'
├── Если effect > 0 и статус ≤ 1 → status = 2 (PARTIAL), инсайт 'feedback'
└── Если effect ≤ 0 → инсайт 'pre'
Этап 2: Тик уровня 4 обрабатывает резонанс
text
Копировать
Скачать
conscience_level_4_runFromChannel()
│
▼
Gestalt_onConsciousnessTick(cycle) // только для главного цикла
│
├── Gestalt_bindActiveMaster(cycle) → находит/создает гештальт по goalImageId
│
└── Gestalt_processResonanceBufferForCycle(cycle)
│
├── Для каждой сигнатуры с effect > 0:
│ └── Для каждого открытого гештальта:
│ ├── score = сходство сигнатуры с гештальтом
│ ├── если score ≥ 0.55:
│ │ ├── appendAutomatismIfNew() — добавить автоматизм
│ │ ├── добавить в analogyPool
│ │ └── если статус 0 → 1 (инсайт 'analogy')
│ │ если статус 1 → инсайт 'analogy' (уточнение)
│ └── обновить problemTreeId/situationId если они были 0
│
└── Gestalt_prepareContextForCycle(cycle) → обновить контекст для ур.3
Этап 3: Уровень 3 получает контекст гештальта
text
Копировать
Скачать
conscience_level_3_runFromChannel()
│
▼
Gestalt_prepareContextForCycle(cycle)
│
└── global.GestaltContextForLevel3 = {
gestaltId, goalImageId, gestaltStatus, problemTreeId, situationId
}
4.8. Интерфейс оператора
В строке «Информационная картина» отображаются индикаторы:
|
Индикатор |
Назначение |
По клику |
|
гешт: N |
Число записей гештальтов |
Info_showGestaltsList() — список ID |
|
— |
— |
По ID → Info_showGestaltDetail() — детализация (статус, automatismIds, analogyPool) |
Детализация гештальта включает:
4.9. Сводка ключевых констант
|
Константа |
Значение |
Назначение |
|
MAX_RESONANCE_BUFFER |
48 |
Максимальный размер FIFO-очереди сигнатур |
|
MAX_ANALOGY_POOL |
16 |
Максимальный размер analogyPool у гештальта |
|
EFFECT_STRONG_CLOSE |
6 |
Порог effect для закрытия гештальта (status 3) |
|
RESONANCE_SCORE_INSIGHT |
0.55 |
Минимальный score для инсайта по аналогии |
4.10. Текущие границы реализации
Глава 5: Персистенция и сохранение состояния
В этой главе мы рассмотрим, как BEAST сохраняет свое состояние между сессиями и как оператор может сохранять/загружать «память» существа в файл. Система использует гибридный подход: IndexedDB для автоматического фонового сохранения и File System Access API для экспорта/импорта полных снимков.
5.1. Две стратегии сохранения
|
Стратегия |
Механизм |
Назначение |
Частота |
|
Автоматическое |
IndexedDB |
Сохранение состояния между перезагрузками страницы |
При каждом изменении данных (dirty-флаги) |
|
Ручное |
File System Access API |
Экспорт/импорт полной памяти в файл |
По команде оператора (кнопки «Сохранить»/«Загрузить») |
5.2. IndexedDB: автоматическое фоновое сохранение
5.2.1. Архитектура сохранения
В sys/IndexedDB/indexeddb.js реализована обертка над IndexedDB и механизм регистрации «сохранялок». Каждый модуль, которому нужно сохранять состояние, регистрирует функцию через registerIndexedDBSaver.
Принцип работы:
5.2.2. Модули с автоматическим сохранением
|
Модуль |
База данных |
Хранилище |
Когда сохраняется |
|
Семантическая память |
BEAST_DB |
semantic_state |
При изменении семантики (registerSemanticSample) |
|
Дерево восприятия |
BEAST_PerceptionTree_DB |
perception_tree_state |
При добавлении нового узла |
|
Условные рефлексы |
BEAST_UR_DB |
conditional_reflexes_state |
При создании/усилении УР |
|
Эпизодическая память |
BEAST_Episodes_DB |
episodes_state |
При создании/закрытии кадра |
|
Образы действия |
BEAST_ActionImages_DB |
action_images_state |
При создании/обновлении ОД |
|
Автоматизмы |
BEAST_Automatizms_DB |
automatizms_state |
При создании/обновлении автоматизма |
|
Цели (GoalImagesLife) |
BEAST_Goals_DB |
goals_state |
При добавлении/обновлении цели |
|
Абстракции |
BEAST_AbstractImages_DB |
abstract_images_state |
При создании/обновлении клонов |
|
Гештальты |
BEAST_Gestalt_DB |
gestalt_state |
При изменении статуса, добавлении аналогий |
|
Ситуации и темы |
BEAST_SituationsTree_DB |
situations_tree_state |
При создании новых образов |
5.2.3. Оптимизация: dirty-флаг и подпись состояния
Каждый модуль использует три переменные для оптимизации:
|
Переменная |
Назначение |
|
*Dirty (например, epDirty) |
Флаг, указывающий, что данные изменились с момента последнего сохранения |
|
last*SavedSig |
Подпись последнего сохраненного состояния (JSON-строка) |
|
serializeState() |
Функция, возвращающая текущее состояние для сохранения |
Алгоритм сохранения:
Это предотвращает лишние записи, когда данные изменились, но их семантическое содержание осталось тем же (например, обновился lastUsedAt).
5.2.4. Резервное копирование в localStorage
Для абстракций (abstract_images.js) реализован механизм резервирования:
5.3. Сохранение в файл: полный снимок памяти
5.3.1. Реестр сохраняемых модулей
В date/saving_ui.js определен реестр BEAST.persistentModules. Каждый модуль регистрируется с тремя компонентами:
javascript
Копировать
Скачать
{
key: 'SemanticState', // ключ в JSON-файле
serialize: function() { ... }, // возвращает состояние для сохранения
apply: function(data) { ... } // применяет загруженное состояние
}
Зарегистрированные модули:
|
Ключ |
Модуль |
Что сохраняется |
|
Cur_puls_val |
puls.js |
Счетчик пульсов |
|
VitalsValues |
vitals.js |
Значения виталов |
|
SemanticState |
semantic_memory.js |
Вся семантическая память |
|
ConditionalReflexesState |
synonyms_reflexes.js |
Условные рефлексы |
|
PerceptionTreeState |
perception_tree.js |
Дерево восприятия |
|
ActionImagesState |
actions_image.js |
Образы действия |
|
EpisodesState |
episodic_memory.js |
Кадры ЭП |
|
AutomatizmsState |
automatizms.js |
Моторные автоматизмы |
|
GoalImagesState |
goals.js |
Образы целей |
|
SituationsTreeState |
situatioms_tree.js |
Ситуации и темы |
|
MentalAutomatizmsState |
mental_automatism.js |
Ментальные автоматизмы |
|
AbstractImagesState |
abstract_images.js |
Абстракции (клоны) |
5.3.2. Процесс сохранения в файл
Кнопка «Сохранить»:
Кнопка «Загрузить»:
5.3.3. Запоминание последней папки
В semantic_memory.js реализованы функции для сохранения и загрузки последней выбранной папки:
Это позволяет при повторном сохранении/загрузке открывать диалог в той же папке.
5.4. Сохранение перед закрытием
В date/saving_before_closing/saving_before_closing.js реализован механизм обнаружения аварийного завершения.
5.4.1. Флаг was_emergency_shutdown
|
Значение |
Значение |
|
true |
Предыдущая сессия завершилась аварийно (браузер/компьютер завис, вкладка «убита») |
|
false |
Предыдущая сессия завершилась штатно |
Механизм:
5.4.2. Сохранение флага
Флаг дублируется в localStorage (ключ was_emergency_shutdown), чтобы сохраняться между перезагрузками страницы.
5.5. Индикатор сохранения
В index.html реализован визуальный индикатор (синий кружок), который загорается при любой операции записи (IndexedDB или файл).
Механизм:
Где вызывается:
5.6. Сводка ключевых функций
|
Функция |
Модуль |
Назначение |
|
registerIndexedDBSaver(fn) |
indexeddb.js |
Регистрация функции для вызова на каждом пульсе |
|
runIndexedDBSavesForPulse() |
indexeddb.js |
Вызов всех зарегистрированных функций |
|
IndexedDBModule.put() |
indexeddb.js |
Запись в IndexedDB (с индикатором) |
|
IndexedDBModule.get() |
indexeddb.js |
Чтение из IndexedDB |
|
collect_memory_data() |
saving_ui.js |
Сбор данных от всех модулей для сохранения в файл |
|
apply_loaded_memory(loaded) |
saving_ui.js |
Применение загруженных данных ко всем модулям |
|
handle_save_memory_click() |
saving_all.js |
Обработчик кнопки «Сохранить» |
|
load_all_memory() |
saving_all.js |
Загрузка из файла |
|
saveLastMemoryDirectory() |
semantic_memory.js |
Сохранение последней папки в IndexedDB |
|
init_saving_before_closing() |
saving_before_closing.js |
Инициализация обработчика закрытия |
5.7. Порядок восстановления при загрузке
Важно: При загрузке из файла порядок применения данных важен. Например, сначала должны загрузиться ActionImagesState (ОД), потом GoalImagesState (цели, которые ссылаются на ОД), иначе ссылки могут быть не восстановлены.
5.8. Схема потока сохранения
Автоматическое сохранение (на пульсе):
Ручное сохранение (кнопка):
Ручная загрузка (кнопка):
Глава 6: Оценка архитектуры и направления развития
В этой главе мы подведем итоги анализа архитектуры BEAST, оценим ее сильные стороны, выявим ограничения и наметим возможные направления дальнейшего развития. Это не список багов, а рефлексия над тем, как текущая реализация соответствует заявленным целям и где есть пространство для улучшения.
6.1. Сильные стороны архитектуры
6.1.1. Дискретное время как фундамент детерминизма
Привязка всех процессов к пульсу — одно из самых сильных архитектурных решений. Это позволяет:
|
Преимущество |
Пояснение |
|
Предсказуемость |
Нет race conditions между UI-событиями и фоновыми процессами |
|
Отладка |
Состояние системы в любой момент можно описать как функцию номера пульса |
|
ЭП-ожидание |
Период ожидания ответа измеряется в пульсах, а не в реальном времени, что исключает рассинхрон при зависании вкладки |
|
Синхронность |
Все модули обновляются в едином такте, нет «полуобновленных» состояний |
6.1.2. Разделение ролей памяти
Трехуровневая система памяти (семантическая, эпизодическая, абстракции) имеет четкое разделение ответственности:
|
Тип памяти |
Что хранит |
Когда обновляется |
Использование |
|
Семантическая |
Значимость образа в условиях |
При каждой активации стимула |
ОР (новизна, порог), Уровень 3 (демотиватор) |
|
Эпизодическая |
Последовательности: стимул → действие → эффект → ответ |
При срабатывании ОР |
Правила для ФО, цепочки приоритета, учительские правила |
|
Абстракции |
Обобщенные правила по ветке+ситуации |
При закрытии кадра ЭП |
Shortcut в Уровне 3, ментальные автоматизмы |
Такое разделение позволяет избежать дублирования и обеспечивает единый источник истины для каждого типа знаний.
6.1.3. Единая оценка эффекта
Ключевое архитектурное решение — effect вычисляется один раз в closeLastFrame и передается во все заинтересованные модули:
Это исключает расхождение оценок между разными подсистемами.
6.1.4. Гейты ожидания в Уровне 3
Механизм awaitingAutomatismEpisodeFeedback предотвращает повторный поиск правил, пока система ждет ответа на уже запущенный автоматизм. Это важно, потому что:
6.1.5. Приоритет цепочек ЭП
Механизм, при котором стимулы из суффикса кадров с реакциями (≥2 подряд) получают приоритет в ОР и ФО, решает проблему обрыва смысловых последовательностей:
6.1.6. Преемственность абстракций
Система абстракций (AbstractPerceptionImages, AbstractActionImages) обеспечивает плавный переход от конкретных эпизодов к обобщенным правилам:
6.2. Ограничения и точки напряжения
6.2.1. Вербальные уровни дерева не используются
Дерево восприятия имеет 6 уровней, но уровни 4–6 (ToneMoodID, SimbolID, PhraseID) всегда 0. Это наследие архитектуры OLD_CODE, где предполагался вербальный ввод. В текущей реализации эти уровни не заполняются, но структура поддерживается для совместимости.
Влияние: Потенциальная сложность дерева не используется, но и не мешает. При расширении (например, добавлении невербальных тональных маркеров) эти уровни могут получить смысл.
6.2.2. Нет механизма «забывания»
Ни один из массивов памяти не имеет автоматической обрезки по времени или релевантности:
|
Массив |
Потенциальная проблема |
|
Episodes |
Растет бесконечно, может замедлить загрузку и сохранение |
|
SemanticMemory |
Старые, неактуальные значимости не вытесняются |
|
GoalImagesLife |
Цели с отрицательным effect не удаляются |
|
GestaltArr |
Закрытые гештальты (status=3) не архивируются и не удаляются |
В проекте есть ограничение MAX_CYCLES = 100 для циклов осмысления, но для массивов памяти таких ограничений нет.
6.2.3. Линейный поиск в условных рефлексах
synonyms_tryRunReflexes() каждый пульс перебирает весь массив SynonymReflexes для поиска подходящего. При росте числа УР (сотни и тысячи) это может стать узким местом.
Потенциальное решение: Индекс по ключу context + activeIdsKey для O(1) доступа.
6.2.4. Гештальты не влияют на выбор цели
Гештальты предоставляют контекст для уровня 3 (GestaltContextForLevel3), но не могут сами иницировать смену цели или запуск автоматизма. Это ограничение делает гештальты «пассивными» накопителями информации, а не активными участниками принятия решений.
6.2.5. Отсутствие переоткрытия гештальта
Если гештальт закрыт успехом (status=3), новая запись для той же цели не создается. При повторном возникновении той же проблемы система не будет знать, что задача уже решалась. Это ограничивает способность к обучению на собственном опыте.
6.2.6. Ручная загрузка файла может нарушить целостность ссылок
При загрузке из файла порядок применения данных важен. Если, например, GoalImagesState загрузится раньше ActionImagesState, ссылки на несуществующие ОД будут временно битыми. Хотя после загрузки всех модулей ссылки восстанавливаются, в момент применения может возникнуть временная несогласованность.
6.3. Эффективность: что работает хорошо
|
Аспект |
Оценка |
Пояснение |
|
Семантический доступ |
O(1) |
Индекс SemanticMemoryIndex[well][emotionId][finalImageId] |
|
Поиск кадров ЭП по условиям |
O(n) |
Линейный обход, но ограниченный (last 10 для UI, выборка по ключам для поиска правил) |
|
Абстракции и semanticStructure |
O(1) |
Индексы byPerceptionKey, byActionKey |
|
Дерево восприятия |
O(1) |
Индекс pathIndex по пути из 6 уровней |
|
Автоматизмы по ветке |
O(1) |
Индекс byBranchId |
|
Условные рефлексы |
O(n) |
Линейный обход (потенциальное узкое место) |
6.4. Направления развития
6.4.1. Механизм забывания и консолидации
Предложение: Добавить в каждый модуль памяти порог размера и стратегию вытеснения:
6.4.2. Индексация условных рефлексов
Предложение: Построить индекс для быстрого поиска УР:
javascript
Копировать
Скачать
// Ключ: context + activeIdsKey
var urIndex = new Map();
function rebuildUrIndex() {
urIndex.clear();
for (var ur of global.SynonymReflexes) {
if (!ur.isReady) continue;
var key = ur.context + '|' + activeIdsKey(ur.stimulIds);
if (!urIndex.has(key)) urIndex.set(key, []);
urIndex.get(key).push(ur);
}
}
При каждой активации стимулов поиск будет O(1) по хешу, а не O(n) по всему массиву.
6.4.3. Активные гештальты
Предложение: Дать гештальтам возможность влиять на выбор цели и запуск автоматизмов:
6.4.4. Переоткрытие гештальтов
Предложение: При повторном возникновении проблемы для уже закрытой цели:
6.4.5. Нормализация порядка загрузки
Предложение: В apply_loaded_memory реализовать сортировку модулей по зависимостям:
javascript
Копировать
Скачать
var order = [
'ActionImagesState', // сначала ОД
'GoalImagesState', // потом цели, ссылающиеся на ОД
'AutomatizmsState', // автоматизмы, ссылающиеся на ОД
// ... остальные
];
Или в каждом модуле указать массив dependsOn для автоматического разрешения порядка.
6.4.6. Расширение уровней 4–6 дерева
Предложение: Использовать уровни 4–6 для невербальных измерений, не связанных с речью:
Это позволит использовать существующую структуру дерева для более тонкой дифференциации контекста.
6.4.7. Консолидация фантазийных цепочек в сон
Сейчас механизм info_new_abstract_semantic переносит фантазийные цепочки (fantasizmArr) в semanticStructure абстракций, но вызывается только вручную. Предложение: Интегрировать этот вызов в «сон» — период, когда нет активных стимулов и цикл находится в пассивном режиме более N пульсов.
6.5. Заключение
Архитектура BEAST представляет собой стройную реализацию теории индивидуальной адаптивности. Ключевые решения — дискретное время, разделение типов памяти, единая оценка эффекта, гейты ожидания — обеспечивают предсказуемость и целостность системы. Система абстракций и гештальтов создает основу для обобщения опыта и кросс-цикловых аналогий.
Основные ограничения связаны с отсутствием механизмов забывания, потенциальной O(n) сложностью некоторых операций и пассивной ролью гештальтов. Эти ограничения не критичны для текущих масштабов, но определяют направления развития при усложнении системы.
Проект успешно выполняет свою основную задачу: быть рабочей спецификацией теории адаптивности, где каждый алгоритм реализован, документирован и может быть протестирован.