Модуль 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] - статья про то какие бывают алгоритмы пуассоновского распределения и какие используются в какой мат. системе.
Edited by ScorpioT1000