AI Lab

Open Artificial Intelligence Laboratory

Русский (Russian Federation)English (United Kingdom)
Разработки Neuro Modeler Neuro Modeler Software Development Kit

Neuro Modeler Software Development Kit

E-mail Печать PDF
Оценка пользователей: / 0
ПлохоОтлично 

NMSDK - библиотека, облегчающая создание систем с большим количеством самостоятельных модулей (компонент), каждый из которых имеет различное, и в общем случае переменное число входов и выходов. Связи между компонентами могут быть произвольными, включая обратные от выхода компоненты к ее же входам. Компоненты могут содержать в себе другие компоненты, с произвольной организацией связей. Число уровней вложенности не ограничивается.

Помимо этого сделана попытка  обеспечить выполнение следующих условий:

  • Минимизация трудоемкости создания конечного класса на основе базового класса библиотеки (минимизация числа и сложности базовых методов библиотеки, которые необходимо переопределить).
  • Создание единого хранилища классов всех возможных конечных компонент, и единое хранилище всех экземпляров этих классов, для уменьшения расходов времени на выделение и освобождение ресурсов. Предусмотрена возможность добавления новых классов в процессе выполнения программы.
  • Поддержка единообразного доступа к:
- входным и выходным значениям компонента, его параметрам;

- компонентам содержащимся внутри заданного компонента по составному идентификатору, включающему в себя идентификаторы всех его владельцев вверх по дереву.

  • Сокрытие от пользователя обхода всех компонент при расчете системы на заданном шаге, сброса состояния блоков в исходное, восстановление настроек по умолчанию, и т.п.
  • Защита от утечки памяти в случае динамического удаления произвольного экземпляра класса. Обеспечить сохранение работоспособности системы в этом случае.

 

icon NMSDK Руководство разработчика (1.14 Мбайт) 

icon NMSDK Исходный код (95.03 Кбайт) 

 

1.     Обзор библиотеки

1.1.         Классы уровня ядра

На Рис. 1 представлена диаграмма базовых классов ядра библиотеки. Все остальные классы являются расширением библиотеки, реализующие некоторый специфический функционал и конечные алгоритмы.

 

nmsdk_programmersguide_pic1
Рис.1. Базовые классы ядра

 

 

В ядре библиотеки существует три фундаментальных класса представляющие интерфейс обмена данными между объектами:

1.     NAConnector: public NAContainer - коннектор - предоставляет реализацию интерфейса приема данных.

2.     NAItem: public NAConnector - источник - предоставляет реализацию интерфейса передачи данных.

3.     NANet: public NAContainer - сеть - предоставляет реализацию интерфейса, обеспечивающего организацию связей между объектами. Этот класс является контейнером, могущим хранить в себе набор из объектов всех трех описанных выше классов. Таким образом возможно создавать вложенные сети.

 

1.1.1.   UModule           

Класс UModule является частью библиотеки MySDK. Он предоставляет интерфейс управления процессом счета. Класс предоставляет средства для автоматического восстановления внутренней структуры объекта и сброса процесса счета в исходное состояние при необходимости.

Атрибуты класса:

  • bool Ready - Флаг готовности объекта к счету. Если false, то перед итерацией счета будет вызван метод Build. Флаг должен быть сброшен в false любым методам класса, который приводит класс в состояние, непригодное к исполнению кода в теле методов Reset, Calculate и вызываемых в них методах. Таким методом является, например метод, изменяющий значение некоторого параметра, являющегося значением размера массива выходных данных.

 

Открытые методы класса (интерфейс пользователя):

  • bool IsReady(void) - Возвращает значение атрибута Ready, характеризующего текущее состояние готовности объекта к счету.
  • bool Default(void) - Восстановление настроек по умолчанию и сброс процесса счета. Метод сбрасывает флаг Ready, вызывает метод ADefault, и в случае успешного его выполнения возвращает результат вызова метода Build.
  • bool Build(void) - Обеспечивает сборку внутренней структуры объекта после настройки параметров. Переопределяется, в случае, когда структура объекта зависит от значений параметров, например, параметры являются размерами массивов. Немедленно возвращает true если флаг Ready уже true. В противном случае вызывает метод ABuild и в случае успешного его выполнения выставляет флаг Ready в true и возвращает результат вызова метода Reset. В противном случае возвращает false.
  • bool Reset(void) - Сброс процесса счета. Переопределяется в случае, когда результат вычисления блока на следующем шаге зависит от предыдущего шага. Если флаг Ready == false метод немедленно возвращает результат вызова метода Build, осуществляя, таким образом, автоматическое восстановление структуры объекта. Иначе возвращает результат вызова метода AReset.
  • bool Calculate(void) - Выполняет расчет этого объекта. Переопределяется всегда, содержит собственно код расчетов на заданном шаге. Если флаг Ready == false вызывается метод Build, осуществляя, таким образом, автоматическое восстановление структуры объекта. В случае успешного вызова метода Build или если Ready == true возвращает результат вызова метода ACalculate.

 

Защищенные методы класса (интерфейс разработчика):

  • bool ADefault(void) - Выполняет специфические действия установки значений параметров по умолчанию.
  • bool ABuild(void) - Выполняет специфические действия сборки внутренней структуры объекта после настройки параметров.
  • bool AReset(void) - Выполняет специфические действия сброса процесса счета.
  • bool ACalculate(void) - Выполняет специфические действия по расчету этого объекта.

Все методы возвращают true в случае успешного выполнения.

 

1.1.2.   NAContainer   

Класс NAContainer: public UModule описывает компонент - функциональную единицу библиотеки, содержащую набор параметров и дочерних компонент. Объект класса определяется среди множества других объектов посредством целочисленного идентификатора и строкового имени образующих уникальную пару в пределах компонента-владельца данным компонентом. Каждый параметр класса также определяется целочисленным идентификатором и строковым именем, уникальным в пределах этого класса. Класс предоставляет абстрагированные от типов средства доступа к параметрам и дочерним компонентам по имени или идентификатору и методы сериализации объектов. Также класс предоставляет возможность создания копии объекта класса с точностью до значений всех параметров и состояния всех дочерних компонент. При необходимости класс осуществляет автоматическое освобождение памяти всем дочерним компонентам.

Атрибуты класса:

  • NAContainer *Owner - Указатель на владельца этим объектом.
  • NStorage *Storage - Указатель на хранилище компонент этого объекта.
  • IdT LastId - Последний использованный Id компонент.

Параметры класса:

  • UProperty<string,NAContainer> Name - Имя объекта (короткое имя). В терминах библиотеки коротким именем называют значение переменной ‘Name'. Длинным именемПолным именем дочернего компонента называют его длинное имя от верхнего уровня иерархии.
    называют составное имя дочернего компонента вплоть до заданного уровня иерархии. Составное имя получается последовательным сложением переменных ‘Name' всех родительских компонент по имя дочернего включительно, через разделитель ".".
  • UProperty<IdT,NAContainer> Id - Идентификатор объекта. Аналогично имени, идентификаторы также бывают короткими, длинными и полными. Длинные и полные идентификаторы представляют собой значения типа LongIdT который определяется как typedef vector<IdT> LongIdT.
  • UProperty<TimeT,NAContainer> TimeStep - Шаг счета.
  • UProperty<bool,NAContainer> Activity - Флаг активности компонента, true - расчет объекта (вызов ACalculate объекта и Calculate всех его дочерних компонент) будет выполняться; false - расчет объекта будет игнорироваться.

Временные переменные:

  • NAContainer* *PComponents - Указатель на 0-й элемент вектора компонент. Используется только для чтения, для ускорения доступа к компонентам.
  • size_t NumComponents - Количество компонент в векторе компонент. Используется только для чтения, для ускорения доступа к компонентам.
  • TimeT OwnerTimeStep - Хранит величину шага счета родительского объекта или величину шага счета этого объекта если родительского объекта не существует.
  • TimeT CalcCounter - Если 'TimeStep' > 'Owner->TimeStep' то 'CalcCounter' является счетчиком текущего интервала ожидания. В противном случае 'CalcCounter' не ипользуется.

 

Открытые методы класса (интерфейс пользователя) делятся на следующие группы:

1)    Системные методы управления объектом. Обычно эти методы не требуется вызывать явно ни пользователю, ни разработчику новых компонент.

  • NAContainer* New(const string &name)=0 - Выделяет память для новой чистой копии объекта этого класса. Должен быть обязательно переопределен в каждом конечном классе следующим образом:

NAContainer* NPulseNeuron::New(const string &name)

{ return new NPulseNeuron(name); }

 
  • NAContainer* Alloc(const string &name, NStorage *stor=0) - Создает копию этого объекта с сохранением всех компонент и значений параметров. Если 'stor' == 0, то создание объектов осуществляется в том же хранилище, где располагается этот объект.
  • bool Copy(NAContainer *target, NStorage *stor=0) const - Копирует этот объект в 'target' с сохранением всех компонент и значений параметров Если 'stor' == 0, то создание объектов осуществляется в том же хранилище где располагается этот объект.
  • void Free(void) - Осуществляет освобождение этого объекта в его хранилище или вызов деструктора, если Storage == 0.

2)    Методы доступа к параметрам. Применяются в первую очередь для разработки интерфейса пользователя. Внутри библиотеки используются для копирования значений параметров между объектами одного класса. Не требуют переопределения в дочерних классах. Методы активно используют глобальную в пространстве имен NMSDK переменную PTemp, поэтому следует избегать использования в одном выражении вызова нескольких методов этой группы, либо предоставлять методам альтернативную временную перменную.

  • ParamT& GetParameter(const IdT &id, ParamT &values=PTemp) - Возвращает значение параметра по Id 'id'. Метод возвращает ссылку на второй аргумент.
  • ParamT& GetParameter(const string &name, ParamT &values= PTemp) - Возвращает значение параметра по имени 'name'. Метод возвращает ссылку на второй аргумент.
  • bool SetParameter(const IdT &id, ParamT &values) - Устанавливает значение параметра по Id 'id'.
  • bool SetParameter(const string &name, ParamT &values) - Устанавливает значение параметра по имени 'name'.
  • map<string,ParameterT>& GetParametersList(void) const - Возвращает список имен и Id параметров, содержащихся непосредственно в этом объекте.
  • bool CopyParameters(NAContainer* comp) const - Копирует все параметры этого объекта в объект 'comp', если возможно.

3)    Методы доступа к компонентам. Применяются в первую очередь для разработки интерфейса пользователя. Внутри библиотеки используются для копирования компонент между объектами одного класса. Обычно не требуют переопределения в дочерних классах (исключая метод CheckComponentType).

  • bool CheckComponentType(const NAContainer* comp) const - Метод проверяет на допустимость объекта данного типа в качестве компоненты данного объекта Метод возвращает 'true' в случае допустимости и 'false' в случае некорректного типа. По умолчанию всегда возвращает ‘false'. Если метод возвращает ‘false' для некоторого объекта, то такой объект невозможно добавить в качестве дочернего компонента в данный компонент. Должен быть переопределен для конечных классов, объекты которых могут содержать в себе другие дочерние компоненты следующим образом:

 
 

bool NANet::CheckComponentType(const NAContainer* comp) const

{

 return (dynamic_cast(comp) ||

    dynamic_cast(comp) ||

 dynamic_cast(comp)) ?true: NAContainer::CheckComponentType(comp);

}

 

 

 

 

 

 

 

 

 

 

Здесь происходит проверка типа компонента на принадлежность трем разрешенным для добавления типам: NAItem, NANet, NAConnector.

  • NAContainer* GetComponent(const IdT &id) const - Возвращает указатель на дочерний компонент, хранимый в этом объекте по короткому Id 'id'. В случае неудачи возвращает 0.
  • NAContainer* GetComponent(const string &name) const - Возвращает указатель на дочерний компонент, хранимый в этом объекте по короткому имени 'name'. В случае неудачи возвращает 0.
  • GetComponentL(const LongIdT &id) const - Возвращает указатель на дочерний компонент по длинному Id 'id'. Дочерний компонент может быть на любом уровне владения. В случае неудачи возвращает 0.
  • NAContainer* GetComponentL(const string &name) const - Возвращает указатель на дочерний компонент по ДЛИННОМУ имени 'name'. Дочерний компонент может быть на любом уровне владения. В случае неудачи возвращает 0.
  • IdT AddComponent(NAContainer* comp) - Добавляет дочерний компонент в этот объект. Возвращает его Id или ForbiddenId если добавление неудачно. Метод вызвает AAddComponent для выполнения пользовательских функций при завершении операции добавления. В случае если AAddComponent возвращает false, будет выполнен откат действий по добавлению компонента, и состояние объектов не изменится. При ручном создании компонента ‘comp' в этом случае программист обязан позаботиться о его корректном удалении самостоятельно.
  • bool DelComponent(const IdT &id, bool canfree=true) - Удаляет дочерний компонент из этого объекта. Удаляемый компонент должен содержаться именно в этом объекте. Таким образом 'id' - должно быть коротким Id удаляемого объекта. Если 'canfree' == true - предпринимается попытка вернуть объект в хранилище, или удалить его. Иначе объект сохраняется в хранилище в состоянии занят либо повисает, если хранилище не установлено. Метод вызвает ADelComponent для выполнения пользовательских функций перед началом операции удаления. В случае если ADelComponent возвращает false, будет выполнен откат действий по удалению компонента, и состояние объектов не изменится.
  • bool DelComponent(const string &name, bool canfree=true) - аналогично предыдущему методу удаляет дочерний компонент по короткому имени ‘name'.
  • void DelAllComponents(void) - Принудительно удаляет все дочерние компоненты, с попыткой вернуть объекты в хранилище, либо удалить их оператором delete.
  • const map<string,IdT>& GetComponentsList(void) const - Возвращает список имен и Id компонент, содержащихся непосредственно в этом объекте.
  • bool CopyComponents(NAContainer* comp, NStorage* stor=0) const - Копирует все компоненты этого объекта в объект 'comp', если возможно. Если хранилище stor != 0 то используется оно, иначе используется хранилище объекта, метод которого был вызван.

4)    Методы управления текущим состоянием (сериализация). Применяются в первую очередь для разработки интерфейса пользователя, сохранения и загрузки структуры компонент и значений параметров. Не требуют переопределения в дочерних классах.

  • bool Save(UClassRegistry &buffer) - Сохраняет объект в дерево.
  • bool Load(UClassRegistry &buffer, NStorage *storage=0, bool paramsonly=false) - Загружает объект из дерева. Для создания компонент используется хранилище этого объекта или storage, если он не 0. Если никакое хранилище не задано, то не делает ничего и возвращает false, кроме случая paramsonly == true. Если флаг paramsonly == true то только обновляет данные параметров для компонента и всех его уже существующих дочерних компонент.

5)    Методы управления атрибутами. Не требуют переопределения в дочерних классах.

  • NAContainer* const GetOwner(void) const - Возвращает владельца этого объекта.
  • bool CheckOwner(const NAContainer *owner) const - Проверяет, является ли объект owner владельцем этого объекта на каком-либо уровне иерархии.
  • bool BreakOwner(void) - Удаляет владельца объекта. Обычно не требуется пользователю или разработчику.
  •  NStorage* const GetStorage(void) const - Возвращает хранилище этого объекта.
  • string& GetFullName(string &buffer=NameTemp) const - Возвращает полное имя объекта (включая имена всех владельцев). Метод возвращает ссылку на ‘buffer'. По умолчанию использует глобальный в пространстве имен NMSDK буфер ‘NameTemp' поэтому следует избегать использования нескольких вызовов метода в одном выражении или предоставлять им собственные временные переменные.
  • string& GetLongName(const NAContainer *mainowner, string &buffer=NameTemp) const - Возвращает длинное имя объекта (исключая имя владельца 'mainowner'). Метод возвращает ссылку на ‘buffer'. Возвращает пустую строку, если 'mainowner' - не является владельцем объекта, ни на каком уровне иерархии. По умолчанию использует глобальный в пространстве имен NMSDK буфер ‘NameTemp' поэтому следует избегать использования нескольких вызовов метода в одном выражении или предоставлять им собственные временные переменные.
  • LongIdT& GetFullId(LongIdT &buffer=LongIdTemp) const - Возвращает полный Id объекта (включая Id всех владельцев). Метод возвращает ссылку на ‘buffer'. По умолчанию использует глобальный в пространстве имен NMSDK буфер ‘LongIdTemp' поэтому следует избегать использования нескольких вызовов метода в одном выражении или предоставлять им собственные временные переменные.
  • LongIdT& GetLongId(const NAContainer *mainowner, LongIdT &buffer=LongIdTemp) const - Возвращает длинный идентификатор объекта (исключая имя владельца 'mainowner'). Метод возвращает пустой вектор, если 'mainowner' - не является владельцем объекта ни на каком уровне иерархии.
  • IdT GetLastId(void) const - Возвращает последний использованный Id компонент. Метод используется для внутреннего применения при назначении идентификаторов добавляемым компонентам.
  • bool CheckName(const string &name) - Проверяет предлагаемое имя 'name' на уникальность в рамках данного объекта.
  • bool CheckId(const IdT &id) - Проверяет предлагаемый идентификатор 'id' на уникальность в рамках данного, объекта.
  • string& GenerateName(const string &prefix, string &namebuffer) - Генерирует имя уникальное в компонентах этого объекта.
  • IdT GenerateId(void) - Генерирует уникальный Id в компонентах этого объекта.

6)    Методы доступа к таблицам соотвествий. Не требуют переопределения в дочерних классах. Применяются для получения значений идентификатора по имени и наоборот для параметров и дочерних компонент объекта.

  • const string& GetComponentName(const IdT &id) const - Возвращает имя дочернего компонента по его идентификатору.
  • const IdT& GetComponentId(const string &name) const - Возвращает идентификатор дочернего компонента по его короткому имени.
  • const string& GetParameterName(const IdT &id) const - Возвращает имя параметра по его идентификатору.
  • const IdT& GetParameterId(const string &name) const - Возвращает идентификатор параметра по его имени. Используется для сериализации.
  • string GetParameterLongName(const string &name) const - Возвращает полное имя параметра без префикса NMSDK, и суффикса '*' по его имени. Используется для сериализации.
  • string GetParameterLongName(const IdT &id) const - Возвращает полное имя параметра без префикса NMSDK, и суффикса '*' по его идентификатору.

 

Защищенные методы класса (интерфейс разработчика). Здесь описываются только те методы, которые допускается переопределять разработчикам дочерних классов. Могут быть разделены на следующие группы:

1)    Скрытые методы управления компонентами:

  • bool AAddComponent(NAContainer* comp) - Выполняет завершающие пользовательские действия при добавлении дочернего компонента в этот объект. Метод будет вызван только если comp был успешно добавлен в список компонент (см. описание AddComponent).
  • bool ADelComponent(NAContainer* comp) - Выполняет предварительные пользовательские действия при удалении дочернего компонента из этого объекта. Метод будет вызван, только если comp существует в списке компонент (см. описание DelComponent).

Таким образом, при разработке дочернего от NAContainer класса необходимо обязательно определить только метод New. Если разрабатываемый класс может содержать в себе компоненты то дополнительно определяется метод CheckComponentType. В случае, если требуется выполнение некоторых обязательных действий при добавлении или удалении компонент, необходимо также определить методы AAddComponent и ADelComponent. Переопределение других методов класса в большинстве случаев не требуется.

 

 

1.1.3.   NAConnector  

Класс NAConnector: public NAContainer описывает компонент - обеспечивающий поддержку организации обмена данными между объектами. Класс предоставляет реализацию интерфейса приема данных. Для минимизации процедур копирования памяти - при подключении к объекту источника сигнала, происходит настройка указателей  на выходы источника. Таким образом, в классе физически не фигурируют входные данные.

Допускается одновременное подключение неограниченного числа источников сигнала. Класс предоставляет средства для раздельного доступа к этим данным.

При необходимости класс осуществляет автоматическое отключение себя от всех источников сигнала, осуществляя соответствующие вызовы каждому источнику для корректного отсоединения.

Хранилище связей:

  • CItemListT CItemList - Список пар <указатель на подключенный элемент сети, вектор входов Input>.
  • vector<const NIOData*> Inputs - Массив указателей на вектора входов.
  • vector<size_t> InputsSize - Массив размеров векторов входов.

Переменные быстрого доступа к данным входов. Только для чтения! Используются разработчиками для прямого доступа к данным:

  • const NIOData** PInput - Указатель на первый элемент массива указателей на вектора входов.
  • size_t* PInputSize - Указатель на первый элемент массива размеров векторов входов.
  • size_t NumInputs - Размер массива векторов входов.
  • size_t FullInputsSize - Суммарное число всех входов.

 

Открытые методы класса (интерфейс пользователя) делятся на следующие группы:

1)    Методы доступа к данным. Не требуют переопределения в производных классах:

  • CItemListTCIterator GetFirstCItem(void) const - Возвращает итератор на первый подключенный к этому коннектору объект.
  • CItemListTCIterator GetLastCItem(void) const - Возвращает итератор на следующий за последним подключенным к этому коннектору объект.
  • size_t GetNumInputs(void) const - Возвращает число подключенных элементов типа NAItem.
  • const NIOData* GetInput(NAItem *citem) const - Возвращает указатель на вектор входов Input по указателю на item. Возвращает 0 если citem == 0, или не найден в списке подключений.
  • const NIOData* GetInput(size_t index) const - Возвращает указатель на вектор входов Input по индексу. Не проверяет индекс на корректность.
  • size_t GetInputSize(size_t index) const - Возвращает размер вектора входов Input по индексу. Не проверяет индекс на корректность.
  • size_t GetFullInputSize(void) const - Возвращает суммарный размер всех векторов входов.

 

2)    Общедоступные методы коммуникации. Не требуют переопределения в производных классах:

  • void Activate(NAItem *na) - Активирует этот коннектор. Элемент типа NAItem вызывает этот метод для всех подключенных к нему коннекторов, в конце своего метода Calculate. При необходимости может быть переопределен, в библиотеке не используется.
  • LinksListT& GetLinks(LinksListT &linkslist, const NAContainer *netlevel) const - Возвращает список подключений этого коннектора ко всем объектам типа NAItem начиная с netlevel уровня сети.
  • void DisconnectAllItems(void) - Разрывает все текущие связи.
  • void DisconnectByObject(const NAContainer *brklevel) - Разрывает все связи объекта исключая его внутренние связи и обратные связи brklevel - объект, относительно которого связи считаются внутренними.

 

Защищенные методы класса (интерфейс разработчика). Могут быть разделены на следующие группы:

1)    Скрытые методы коммуникации. Не требуют переопределения в производных классах:

  • bool ConnectToItem(NAItem *na) - Устанавливает связь с элементом сети 'na'. Переназначает связь изменяя размер входного вектора, если na уже подключен и его размер изменился.
  • void DisconnectFromItem(NAItem *na) - Разрывает связь с элементом сети 'na'.

 

Таким образом при разработке производного от NAConnector класса никакие дополнительные методы переопределять не требуется.

 

1.1.4.   NAItem  

Класс NAItem: public NAConnector описывает компонент - обеспечивающий поддержку организации обмена данными между объектами. Класс предоставляет реализацию интерфейса передачи данных.

При необходимости класс осуществляет автоматическое отключение себя от всех приемников сигнала, осуществляя соответствующие вызовы подключенным коннекторам для корректного отсоединения.

Данные:

  • NIOData Output - Вектор выходных данных.
  • vector<NAConnector*> AssociatedConnectors - Список коннекторов подключенных к выходу этого объекта.

Параметры:

  • UVProperty<SizeT,NAItem> OutputSize - Размер вектора выходов.
  • UVProperty<SizeT,NAItem> ByteOutputSize - Размер вектора выходов в байтах.
  • UVProperty<SizeT,NAItem> ByteDataOutputSize - Размер единичного данного вектора выходов в байтах.

Открытые методы класса (интерфейс пользователя) делятся на следующие группы:

1)    Методы доступа к данным. Не требуют переопределения в производных классах:

  • const NIOData& GetOutput(void) const - Возвращает вектор выходных данных.

2)    Общедоступные методы коммуникации. Не требуют переопределения в производных классах:

  • size_t GetConnectorsNumber(void) const - Возвращает текущее число соединений.
  • bool Disconnect(const IdT &id) - Разрывает связь выхода этого объекта с коннектором по идентификатору 'id'.
  • void DisconnectAll(void) - Разрывает связь выхода этого объекта со всеми подключенными коннекторами.
  • void DisconnectBy(const NAContainer *brklevel) - Разрывает все связи объекта исключая его внутренние связи и обратные связи brklevel - объект, относительно которого связи считаются внутренними.
  • NAConnector* GetConnector(const IdT &id) - Возвращает указатель на коннектор из списка подключений по идентификатору 'id'.
  • vector<NAConnector*>::const_iterator GetFirstConnector(void) const - Возвращает итератор на первый коннектор из списка подключений.
  • vector<NAConnector*>::const_iterator GetLastConnector(void) const - Возвращает итератор на следующий за последним коннектор из списка подключений.
  • LinksListT& GetLinks(LinksListT &linkslist, const NAContainer *netlevel) const - Возвращает список подключений этого источника ко всем объектам типа NAConnector начиная с netlevel уровня сети.

 

Защищенные методы класса (интерфейс разработчика). Могут быть разделены на следующие группы:

1)    Скрытые методы коммуникации. Не требуют переопределения в производных классах:

  • bool Connect(NAConnector *c) - Устанавливает связь с коннектором.
  • void Disconnect(NAConnector *c) - Разрывает связь выхода этого объекта с коннектором.

Дополнительно в классе переопределяются методы Default, Calculate, CheckComponentType.

При разработке производного от NAItem класса никакие дополнительные методы переопределять не требуется.

 

 

1.1.5.   NANet    

Класс NANet: public NAContainer описывает компонент - обеспечивающий поддержку организации обмена данными между объектами. Класс предоставляет реализацию интерфейса обеспечивающего организацию связей между объектами.

При необходимости класс осуществляет автоматическое отключение себя и всех дочерних компонент от всех приемников и источников сигнала, осуществляя соответствующие вызовы для корректного отсоединения.

Открытые методы класса (интерфейс пользователя) делятся на следующие группы:

1)    Методы управления связями. Не требуют переопределения в производных классах:

  • LinksListT& GetLinks(LinksListT &linkslist, const NAContainer *netlevel) const - Возвращает список всех связей этой сети и ее дочерних компонент со всеми объектами начиная с netlevel уровня сети.
  • bool CreateLink(const LongIdT &itemid, const LongIdT &connectorid) - Устанавливает новую связь между выходом элемента сети 'item' и коннектором 'connector'.
  • bool CreateLink(const string &item, const string &connector) - Устанавливает новую связь между выходом элемента сети 'item' и коннектором 'connector'.
  • bool CreateLinks(const LinksListT &linkslist) - Устанавливает все связи из массива 'linkslist'.
  • bool BreakLink(const LongIdT &id) - Разрывает все связи с выходом элемента сети, если 'id' - есть Id элемента сети. Иначе, если 'id' - Id коннектора, то метод разрывает связи этого коннектора.
  • bool BreakLink(const LongIdT &itemid, const LongIdT &connectorid) - Разрывает связь между выходом элемента сети, 'itemid' и коннектором 'connectorid'.
  • bool BreakLink(const string &itemid, const string &connectorid) - Разрывает связь между выходом элемента сети, 'itemid' и коннектором 'connectorid'
  • void BreakLinks(const NAContainer* brklevel) - Разрывает все связи сети исключая ее внутренние связи и обратные связи brklevel - объект, относительно которого связи считаются внутренними.
  • void BreakLinks(void) - Разрывает все внутренние связи сети.

Дополнительно в классе переопределяются методы Copy, CheckComponentType, AAddComponent, ADelComponent.

При разработке производного от NANet класса никакие дополнительные методы переопределять не требуется.

 

1.1.6.   NStorage          

Класс NStorage описывает хранилище образцов компонент и свободных экземпляров. Обычно необходим только один экземпляр этого класса.

Использование хранилища подразумевает его первоначальную инициализацию. При этом в хранилище заносятся образцы - одиночные экземпляры каждого класса, которые могут быть использованы в дальнейшем для создания копий методом Alloc. Поскольку этот процесс происходит во время выполнения программы, становится возможным динамически расширять набор образцов через динамические библиотеки. 

NStorage Storage;

NAContainer *cont;

 

 cont=new NConnector("Input");

 cont->Default();

 Storage.AddClass("NConnector",cont);

// Образец хранилища будет иметь имя класса "NConnector", копии образца,

// отдаваемые хранилищем будут иметь короткое имя "Input".

 

  

После такой инициализации можно обращаться к хранилищу для создания экземпляров образцов. При этом хранилище берет на себя заботу о корректном высвобождении памяти. Пример использования хранилища приведен ниже:

NAContainer *cont;

 

cont=Storage.TakeObject("NConnector"); // Получили копию образца "NConnector"

// Выполняем действия с cont

Cont->Free(); // Объект возвращается в хранилище и помечается как свободный

 

Класс не является обязательным для использования. В этом случае задача удаления неиспользуемых объектов ложится на разработчика.

Данные:

  • ClassesStorageT ClassesStorage - Список доступных "классов" -образцов объектов.
  • ObjectsStorageT ObjectsStorage - Список свободных объектов.
  • IdT LastClassId - Последний использованный Id образцов классов.

 

Открытые методы класса (интерфейс пользователя) делятся на следующие группы:

1)    Методы управления хранилищем классов:

  • bool AddClass(const string &classname, NAContainer *classtemplate) - Добавляет образец класса объекта в хранилище
  • bool DelClass(const IdT &classid) - Удаляет образец класса объекта из хранилища. Возвращает false если classid не найден, или присутствуют объекты этого класса.
  • bool CheckClass(const IdT &classid) const - Проверяет наличие образца класса объекта в хранилище.
  • NAContainer* const GetClass(const IdT &classid) const - Возвращает образец класса
  • void GetClassNameList(vector<string> &buffer) const - Возвращает список имен всех классов хранилища. Буфер 'buffer' будет очищен от предыдущих значений.
  • void FreeClassesStorage(void) - Удаляет все не используемые образцы классов из хранилища
  • bool ClearClassesStorage(void) - Удаляет все образцы классов из хранилища. Возвращает false если в хранилище присутствуют объекты.

2)    Методы управления хранилищем объектов:

  • NAContainer* TakeObject(const IdT &classid) - Извлекает объект из хранилища. Возвращает указатель на свободный объект по имени класса. Выбранный объект помечается как занятый в хранилище. Флаг 'Activity' объекта выставляется в true. Если свободного объекта не существует, он создается и добавляется в хранилище.
  • NAContainer* TakeObject(const string &classname) - аналогично предыдущему но по имени класса;
  • bool ReturnObject(NAContainer *object) - Возвращает объект в хранилище. Выбранный объект помечается как свободный в хранилище. Флаг 'Activity' объекта выставляется в false. Если объект не существует в хранилище - возвращается false. Вместо этого метода допускается вызов метода Free у возвращаемого объекта.
  • bool PushObject(const IdT &classid, NAContainer *object) - Добавляет уже созданный объект в хранилище. Если объект уже принадлежит иному хранилищу, то возвращает false. Непосредственное использование этого метода обычно не требуется.
  • IdT PopObject(NAContainer *object) - Выводит уже созданный объект из хранилища и возвращает его classid. В случае ошибки возвращает ForbiddenId. Непосредственное использование этого метода обычно не требуется.
  • bool MoveObject(NAContainer *object, NStorage *newstorage) - Перемещает объект в другое хранилище.
  • bool CheckObject(const NAContainer *object) const - Проверяет существует ли объект 'object' в хранилище.
  • IdT FindClass(const NAContainer *object) const - Возвращает Id класса, отвечающий объекту 'object'.
  • void FreeObjectsStorage(void) - Удалаяет все свободные объекты из хранилища.
  • void ClearObjectsStorage(void) - Удаляет все объекты из хранилища.

3)    Методы доступа к таблицам соотвествий:

  • const string& GetClassName(const IdT &id) const - Возвращает имя класса по его Id.
  • const IdT& GetClassId(const string &name) const - Возвращает Id класса по его имени.

 

1.1.7.   Пример переопределения методов в наследуемом классе    

Предположим, что мы создаем новый класс NSynapse наследуемый от NAConnector.

1. Конструктор класса. 

NSynapse::NSynapse (const string &name)

: NAConnector (name)

{

 // Тело конструктора, если необходимо

}

 

 2. Метод New. Выделяет память для новой чистой копии объекта этого класса. Тело метода реализуется следующим образом. 

virtual NAContainer* NSynapse::New(const string &name)

{

 return new NSynapse(name);

}

 

3. Метод ADefault. Восстановление настроек по умолчанию и сброс процесса счета. В теле метода реализуется сброс всех параметров системы в значения по умолчанию. Вызов методов Build и Reset будет осуществлено автоматически. В случае успешной инициализации метод обязан вернуть true.

virtual bool NSynapse::ADefault(void)

{

 // Инициализация параметров

 return true;

}

 

4. Метод ABuild. Обеспечивает сборку внутренней структуры объекта после настройки параметров. Переопределяется, в случае, когда структура объекта зависит от значений параметров, например, параметры являются размерами массивов. Автоматически выставляет флаг Ready в true и затем производит вызов метода Reset. В случае успешной сборки метод обязан вернуть true.

virtual bool NSynapse::ABuild(void)

{

 // Сборка структры, например установка размеров массивов

 return true;

}

 

5. Метод AReset. Сброс процесса счета. Переопределяется в случае, когда результат вычисления блока на следующем шаге зависит от предыдущего шага. В случае успешного сброса метод обязан вернуть true.

virtual bool NSynapse::AReset(void)

{

 // Сброс счета, например обнуление временных переменных

 return true;

}

 

6. Метод ACalculate. Выполняет расчет этого объекта. Переопределяется всегда, содержит собственно код расчетов на заданном шаге.  В случае успеха метод обязан вернуть true.

virtual bool NSynapse::ACalculate(void)

{

 // Расчет, например решение дифферинциального уравнения на текущем шаге интегрирования

 return true;

}

 

 

 

1.2. BCL

На основе описанных выше базовых классов построена BCL (Basic Class Library). Ее диаграмма классов представлена на Рис. 2.

nmsdk_programmersguide_pic2

  Рис. 2. Диаграмма классов BCL

 

        

1.3.  NLib

Библиотека NLib (Neural library) содержит конечные реализации некоторых конкретных моделей нейронов, их рецепторов и эффекторов. Диаграмма классов библиотеки представлена на Рис. 3.

 

 

nmsdk_programmersguide_pic3

  Рис. 3. Диаграмма классов NLib

 

 

1.4.  CRLib

Библиотека CRLib (Class Recognition Library) содержит базовые и конечные классы для решения задач распознавания образов. Диаграмма классов библиотеки представлена на Рис. 4.

        

nmsdk_programmersguide_pic4

  Рис. 4. Диаграмма классов CRLib

Обсудить на форуме (0 комментариев).

Сейчас на сайте: [1 пользователь] [143 гостей]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RuWeb.net - гибкий хостинг

RuWeb.net - гибкий хостинг