War3-lua-NDArray

Added by , published
Алгоритмы, Наработки и Способности
Способ реализации:
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] - статья про то какие бывают алгоритмы пуассоновского распределения и какие используются в какой мат. системе.
`
LOADING AD...
The comment is deleted
0
38
0
imp-lua-mm - пакетный менеджер для lua, подходит для warcraft 3.
Это не пакетный менеджер, это менеджер модулей (imp mm), который также является пакетом пакетного менеджера IMP
Replies (1)
0
11
0
ScorpioT1000, спасибо, поправлю.
0
29
0
Может есть уже готовые работы, которые можно непосредственно внедрить в warcraft 3
Можешь посмотреть здесь. Ну и поискать какую-то либу для геометри.
To leave a comment please sign in to the site.