War3-lua-NDArray

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Алгоритм
Версия Warcraft:
1.36+

Модуль NDArray

Описание модуля NDArray

Модуль многомерных таблиц или многомерного массива. Для использования требуется расширенный модуль таблиц table.
Для инициализации данного модуля необходимо указать в качестве таблицы форму массива shape = {5,4,3,...}. Такая организация позволяет реализовывать методы автоматического заполнения всей таблицы числами или через генераторы. Все мульти таблицы хранятся только в числовых ключах, что решает вопрос десинхронизации.
Альтернативой данному модулю служит MDTable. MDTable представляет собой класс мульти таблиц lua с синхронизацией pairs для онлайна в warcraft 3. Однако есть некоторое отличие, в MDTable необходимо явно указать только размерность, что не позволяет автоматически заполнять таблицу через пользовательский интерфейс. Также ключи могут быть не числовыми.

Программный интерфейс (API) модуля NDArray

do
    ---@type NDArrayClass
    ---@overload fun(shape:table): NDArray
    NDArray = NDArray or {}

    ---@class NDArray
    ---@field fill fun(self:NDArray, value:any):table
    ---@field tostring fun(self:NDArray):string
    ---@field shape table
    ---@field ndim number
    local object = {}

    ---@class NDArrayClass
    ---@field emptify fun(self:NDArrayClass, ndarray:NDArray):NDArray
    ---@field create fun(self:NDArrayClass, shape:table):NDArray
    local class = {}
end 

Релизация

Код модуля (release 20.09.2024)
do -- require "table"

    --- генератор нулей
    local empty = math.empty or function()
        return nil
    end

    local function tostring2d(ndarray)
        local _str = "{"
        for i = 1, #ndarray do
            _str = _str .. table.tostring(ndarray[i])
            if i < #ndarray then
                _str = _str .. ",\n "
            else
                _str = _str .. "}"
            end
        end
        return _str
    end

    ---------------- Class NDArray API ----------------------------
    ---@type NDArrayClass
    ---@overload fun(shape:table): NDArray
    NDArray = NDArray or {}

    ---@class NDArray
    ---@field fill fun(self:NDArray, value:any):table
    ---@field tostring fun(self:NDArray):string
    ---@field shape table
    ---@field ndim number
    local object = {}

    ---@class NDArrayClass
    ---@field emptify fun(self:NDArrayClass, ndarray:NDArray):NDArray
    ---@field create fun(self:NDArrayClass, shape:table):NDArray
    local class = {}
    ---------------- object methods ---------------------------------
    ---fill
    ---@param value table
    ---@return NDArray
    function object:fill(value)
        NDArray:fill_nda(self, self.shape, value)
        return self
    end


    function object:tostring()
        if self.ndim == 1 then
            return table.tostring(self)
        end
        if self.ndim == 2 then
            return tostring2d(self)
        end
        if self.ndim == 3 then
            local str = "{\n\n"
            for i = 1, #self do
                str = str .. tostring2d(self[i]) .. ",\n\n"
            end
            return str
        end
    end

    local object_meta = {
        __index = object,
        __tostring = object.tostring
    }

    ---create
    ---@param shape table
    ---@return NDArray
    function class:create(shape)
        local obj = {} ---@type NDArray
        obj.shape = shape
        obj.ndim = #obj.shape
        self:emptify(obj)
        return setmetatable(obj, object_meta)
    end

    ---------------- class methods ------------------------
    ---emptify
    ---@param ndarray NDArray
    ---@return NDArray
    function class:emptify(ndarray)
        local shape = ndarray.shape

        if #shape == n then
            return table.fill(ndarray, empty, shape[n])
        end

        local old_stack = {}
        local new_stack = {}
        table.insert(old_stack, ndarray)
        --
        for n = 1, #shape - 1 do
            for _, _ndarray in ipairs(old_stack) do
                table.fill(_ndarray, table.empty, shape[n])
                for _, item in ipairs(_ndarray) do
                    table.insert(new_stack, item)
                end
            end
            old_stack = new_stack
            new_stack = {}
        end
    end

    function class:fill_nda(array, shape, value, n)
        n = n or 1
        if #shape == n then table.fill(array, value, shape[n]) return end
        for i = 1, shape[n] do
            self:fill_nda(array[i], shape, value, n + 1)
        end
    end


    setmetatable(NDArray, {
        __index = class,
        __call = class.create
    })
end

Заключение

Данный репозиторий я создал в основном для себя но ресурс с желанием поделиться наработками. Надеюсь на фидбек. Было бы интересно узнать о полезности данного репозитория для комьюнити. Может есть уже готовые работы, которые можно непосредственно внедрить в warcraft 3. Также было бы интересно узнать какие функции стоило бы еще внедрить в свою библиотеку.

Использованные источники

  • lua-table - база функций расширяющих стандартный набор table c добавлением дополнительных свойств.
  • t-util - библиотека функций расширяющих стандартный набор,
в репозитории использовались идеи из этого репозитория.
  • table-manual - официальный мануал по таблицам.
  • LuaSortingAlgorithms - репозиторий конвертированных из python алгоритмов сортировки, функции были адаптированы для warcraft 3 reforged.

Полезные источники

  • lua-set - реализация множества для lua
  • cheapack - совсем не дешевый упаковщик *.lua файлов в *.wct файл Warcraft 3.
  • imp-lua-mm - пакетный менеджер для lua, подходит для warcraft 3.
  • luaforwindows - репозиторий хранящий Lua.exe файл для windows.
  • [1] - xlua это база функций расширяющих стандартный набор, не использовалось при разработке данного репозитория, но очень интересная.
  • [2] - MDTable класс мульти таблиц lua с синхронизацией pairs для онлайна в warcraft 3.
  • [3] - статья про то какие бывают алгоритмы пуассоновского распределения и какие используются в какой мат. системе.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
38
imp-lua-mm - пакетный менеджер для lua, подходит для warcraft 3.
Это не пакетный менеджер, это менеджер модулей (imp mm), который также является пакетом пакетного менеджера IMP
29
Может есть уже готовые работы, которые можно непосредственно внедрить в warcraft 3
Можешь посмотреть здесь. Ну и поискать какую-то либу для геометри.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.