Не прекращайте учебу с
LOKAD TV
x = fun(arg1, arg2, arg3, ..., argN) by [Group] sort [Order]Оператор
fun
будет заменен на имя функции, а arg1, arg2, arg3, ..., argN
— на ее аргументы. Все функции работают по векторам.by
и sort
. Несмотря на то, что синтаксис таких функций похож на синтаксис агрегаторов, они таковыми не являются. Аргумент by
не является обязательным. Если его опустить, значение будет равно by 1
. Параметры Group
и Order
поддерживают кортежи векторов, то есть группы векторов, разделенных запятыми. Например:
R = rank() by [A, B] sort [1]
abs(number)
— напоминает функцию ABS в Excel.ceiling(number)
— напоминает функцию ОКРВВЕРХ в Excel.exp(number)
— напоминает функцию EXP в Excel.floor(number)
— напоминает функцию ОКРВНИЗ в Excel.log(number, base)
— напоминает функцию LOG в Excel. Аргумент base
не является обязательным. Если его опустить, значение будет равно 10.max(num1, num2, num3, ..., numN)
— напоминает функцию МАКС в Excel.min(num1, num2, num3, ..., numN)
— напоминает функцию МИН в Excel.percent(N) by [Group]
— возвращает значение N
, разделенное на сумму всех значений в пределах Group
.norminv(number)
— напоминает функцию НОРМОБР в Excel со средним значением 0 и стандартным отклонением 1.pow(number, exponent)
— напоминает функцию СТЕПЕНЬ в Excel. Envision также поддерживает оператор степени number ^ exponent
, который выполняет ту же функцию.round(number, digits)
— напоминает функцию ОКРУГЛ в Excel. Второй аргумент не является обязательным, он отражает количество символов, которое необходимо отобразить.sqrt(number)
— напоминает функцию SQRT в Excel.concat(text1, text2, ..., textN)
— объединяет текстовые значения от text1
до textN
.contains(text, pattern)
— возвращает значение true
, если текст содержит указанную последовательность.endswith(text, pattern)
— возвращает значение true
, если текст содержит указанную последовательность в конце.field(text, separator, index)
: — возвращает n-ое поле (с нулевым индексом) в текстовом значении, которое содержит несколько вложенных строк, отделенных указанным разделителем. Пример: field("a-b-c-d-", "-", 2) == "c"
. Данная функция вводится для прочтения значений, которые соединены в одном столбце таблицы.field.r(text, separator, index)
— напоминает функцию field()
, однако подсчет делителей начинается справа. Пример: field.r("a-b-c-d-", "-", 0) == "c"
.indexof(text, pattern)
— возвращает индекс первого случая появления последовательности в тексте, или -1, если такой случай не обнаружен.lowercase(text)
— возвращает текст в нижнем регистре.parsedate(text, format)
— преобразует текст в дату в указанном формате. Формат указывать необязательно. При пропуске формата дата считывается в соответствии с функцией автоматического распознавания дат Envision. Если формат указан, дата считывается в соответствии с ним. См. «Выбор пользовательского формата даты» для получения более подробной информации о соответствующем синтаксисе. Если дату считать невозможно, будет установлено значение 2001-01-01.parsenumber(text)
— преобразует текст в число. Анализатор использует функцию автоматического распознавания чисел Envision. Если число не прочитывается, значение устанавливается на ноль.parsetime(text, format)
— преобразует время дня в дробь от 0 до 1. Формат указывать необязательно. Если формат не указан, по умолчанию используется yyyy-MM-dd HH:mm:ss
. В Envision используется пользовательский формат времени .NET.replace(text, pattern, replacement)
— заменяет все случаи появления определенного элемента в тексте на заданную единицу. Данная функция напоминает функцию ЗАМЕНЫ в Excel, кроме аргумента instance_num
.startswith(text, pattern)
— возвращает значение true
, если текст начинается с указанной последовательности символов.strlen(text)
— возвращает длину текстового аргумента.substr(text, start, count)
— начальное положение определяется параметром start
. Отрицательное значение подразумевает отклонение от конца строки, в иных случаях отклонение отсчитывается от начала строки. Длина возвращенной строки определяется по count
, это значение приравнивается к 0 при count < 0
. Если сегмент полностью или частично выходит за пределы строки, например substr("A", 2, 1)
, то он обрезается до нужного размера. Функция substr(text, start)
определяется как substr(text, start, <infinity>)
.uppercase(text)
— возвращает текст в верхнем регистре."\{myDate:yyyy-MM-dd}"
— пользовательский формат даты через интерполяцию строки. Формат даты указывается токеном, который стоит после точки с запятой. Подробнее о строках формата даты.chineseYear(date)
— возвращает текущий год по китайскому календарю.chineseYearEnd(date)
— возвращает последний день текущего года по китайскому календарю.chineseYearStart(date)
— возвращает первый день текущего года по китайскому календарю.date(y, m, d)
— возвращает дату, состоящую из года, месяца и дня, являющихся аргументами. Аргументы y
, m
и d
должны быть представлены числами.monday(date)
— возвращает дату первого понедельника перед датой (включительно).month(date)
— возвращает номер месяца, в котором содержится дата, расчет месяцев начинается с 1 января 2001 г.monthnum(date)
— возвращает соответствующий номер месяца (1–12) для даты, являющейся аргументом.today(timezone)
— возвращает дату, при этом временной пояс является аргументом и выражается в виде разницы в часах по сравнению с UTC.year(date)
— возвращает соответствующий год для даты, являющейся аргументом. Напоминает функцию ГОД в Excel.yearStart(date)
— возвращает первый день текущего года.yearEnd(date)
— возвращает последний день текущего года.weeknum(date)
— напоминает функцию НОМНЕДЕЛИ (System 2) в Excel.argfirst() by [Group] sort [Order]
— возвращает значение true
для одного первого значения группы в соответствии с порядком значений (сортировка). Группу указывать необязательно. Когда группа указана, функция возвращает значение true
один раз для каждой группы. Перегрузка argfirst() by [Group] sort [Order] where condition
также предоставляется для удобства. При использовании опции where
могут появиться группы без значений true
, потому что условие является false
(ложным) для всей группы.arglast() by [Group] sort [Order]
— то же самое, что argfirst()
, но возвращает значение true
для одного последнего значения.cumsum(N) by [Group] sort [Order]
— возвращает накопленную сумму всех чисел N
в соответствии с возрастанием ранга. Группу указывать необязательно. Если группа указана, она используется для расчета локальной накопленной суммы для каждой группы.fifo(V, T.D, T.Q)
— помощь при проведении FIFO-анализа запасов. Возвращает количество нераспроданных товаров в виде вектора T
. Вектор V
отражает все запасы. Таблица T
содержит заказы на закупку. В T.D
содержатся даты, а в T.Q
— объемы закупок. Данная функция рассчитывает количество нераспроданного товара, воспроизводя заказы на закупку в обратном хронологическом порядке. См. также Принцип FIFOrank() by [Group] sort [Order]
— возвращает ранг числовых значений без привязок. Напоминает функцию РАНГ.РВ в Excel, однако здесь все числа получают отдельный ранг (приоритет элементов с одинаковым рангом выбирается произвольно). Группу указывать необязательно. Если группа указана, она используется для расчета локальных рангов для каждой группы.rank(N, Group, S)
— более сложная функция ранжирования, заметно отличается от других перегрузок типа rank()
. Данная перегрузка предназначена для создания приоритетного списка закупок. В частности, rank(N, Group, S)
нельзя представить в виде простого выражения сортировки и группировки. Это двухэтапный императивный алгоритм. На первом этапе значения группируются по параметру Group
в стеки, каждый из которых упорядочивается по увеличению S
. На втором этапе алгоритм находит наивысшее значение N
среди верхних элементов всех стеков, выделяет этот элемент, присваивает ему ранг (начиная с 1), а затем повторяет все действия до тех пор, пока элементы стеков не закончатся.rankd(N) by [Group]
— возвращает ранги числовых значений N
, одинаковые значения получают одинаковый ранг. Напоминает функцию РАНГ.РВ в Excel.canonical(A, B)
— выдает канонического представителя для всех значений A
. На практике данная функция используется для замены кодов (например для замены кодов SKU). Например, функция canonical(OldSku, NewSku)
выдает значения последних доступных SKU для каждого элемента, после чего выполняет замены. См. также nonCanonical()
.nonCanonical(A, B)
— возвращает значение true
, когда невозможно рассчитать канонического представителя для A
. Это происходит при обнаружении циклических алгоритмов или алгоритмов ветвления.connected(A, B) by [Group]
— анализирует неориентированный граф, описанный всеми ребрами (A,B), а затем возвращает для всех узлов A имя наименьшего узла связанного компонента A. Под "наименьшим" узлом понимается узел с самым маленьким именем (получено путем сравнения строк). Группу указывать необязательно. Если группа указана, набор данных сначала разделяется в соответствии с указанными группами.dirac(n)
— возвращает функцию равную нулю во всех точках, кроме n
, где она равна 1.identity(n)
— возвращает функцию $\text{id}: k \to k$, но она ограничена сегментом [0;n] и равна 0 в других точках.uniform(n)
— возвращает функцию $\text{unif}: k \to 1$, но она ограничена сегментом [0;n] и равна 0 в других точках.uniform(m, n)
— возвращает функцию $\text{unif}: k \to 1$, но она ограничена сегментом [m;n] и равна 0 в других точках. If $m - 1 = n$, the uniform()
возвращает нулевое распределение.uniform(D)
— возвращает функцию $\text{unif}: k \to 1$, но она ограничена множеством распределения D
и равна 0 в других точках.poisson(lambda)
— возвращает распределение Пуассона параметра lambda
($\lambda$ в литературе).exponential(lambda)
— возвращает экспоненциальное распределение параметра lambda
($\lambda$ в литературе).negativebinomial(mu, sigma)
— возвращает отрицательное биномиальное распределение среднего значения mu
и стандартного отклонения sigma
. Если стандартное отклонение меньше среднего значения, то функция возвращает вместо него распределение Пуассона среднего mu
.ranvar.uniform(n)
— возвращает распределение, представленное функцией $k \to \frac{1}{|n| + 1}$ по сегменту [0;n] (if $n \geq 0$) или [n;0] (if $n < 0$), и 0 в остальных случаях.ranvar.uniform(m, n)
— возвращает распределение, представленное функцией $k \to \frac{1}{n + 1 - m}$ по сегменту [m;n] и 0 в остальных случаях. Мы предполагаем, что $m < n$. При $m > n$ система выдаст ошибку.distrib(Id, G.Probability, G.Min, G.Max)
— данная функция возвращает распределение, заданное списком групп, каждая из которых имеет ограничения и собственное значение.ranvar(T.X)
— этот агрегатор возвращает эмпирическое распределение, рассчитанное по данным вектора T.X
.ranvar.segment(...)
— сложная функция для создания эмпирического распределения на основе плавающего временного периода (подробнее далее).crps(X, A)
, гдеA
— целое число, возвращает FORMATTER ERROR (Malformed Image Tag), под которой понимается обобщение показателей непрерывной приоритетной вероятности до пары распределений.mean(X)
— возвращает статистическое среднее значение.variance(X)
— возвращает статистическое отклонение.int(X, A, B)
, где A
и B
являются целыми числами, возвращает целое значение X
для сегмента [A;B].quantile(X, tau)
— возвращает квантиль распределения; наименьшее значение $x$, например $\mathbf{P}[X \leq x] \geq \tau$.spark(X)
— возвращает текст, содержащий компактное представление распределения в кодировке ASCII.support.max(X)
— возвращает верхнюю границу несущего множества распределения.support.min(X)
— возвращает нижнюю границу несущего множества распределения.reflect(X)
— возвращает отраженную функцию распределения $k \to f(-k)$.transform(X, a)
— возвращает функцию распределения, которая получена через интерполяцию $k \to f(k / a)$.fillrate(X)
— возвращает предельное значение уровня пополнения запасов. Необходимо указать случайную переменную, возвращает случайную переменную.truncate(X, a, b)
— возвращает ограниченное распределение $k \to f(k) \text{ if } k \in [a;b] \text{ else } 0$. Границы A
и B
включаются в диапазон результатов.maxr(X, a)
or maxr(a, X)
— возвращает распределение $k \to f(k) \text{ if } k \in [a + 1; \infty[ \text{ or } \sum_{i=-\infty}^a f(i) \text{ if } k = a \text{ else } 0$.minr(X, a)
or minr(a, X)
— возвращает распределение $k \to f(k) \text{ if } k \in ]-\infty; a - 1] \text{ or } \sum_{i=a}^\infty f(i) \text{ if } k = a \text{ else } 0$.mixture(X1, p, X2)
— возвращает смесь двух распределений и вес: $k \to p \times f_1(k) + (1 - p) \times f_2(k)$.mixture(X1, p1, X2, p2, X3)
— возвращает смесь трех распределений и два веса: $k \to p_1 \times f_1(k) + p_2 \times f_2(k) + (1 - p_1 - p_2) \times f_3(k)$.mixture(X1, p1, X2, p2, X3, p3, X4)
— возвращает смесь четырех распределений и три веса: $k \to p_1 \times f_1(k) + p_2 \times f_2(k) + p_3 \times f_3(k) + (1 - p_1 - p_2 - p_3) \times f_4(k)$.zoz(X)
(ноль на ноль) — возвращает распределение, где $k \to f(k) \text{ if } k \neq 0 \text{ else } 0$.extend.range(T.N)
— создает N
строк для каждой строки из таблицы T
, где N
— целое число. Например:
table T = extend.range(Orders.42)
T.Quantity = Orders.Quantity // подразумеваемое расширение
show table "T" with T.N, T.Quantity
extend.distrib(distribution, gap, multiplier, reach)
— раскладывает распределение в таблице. См. также extend.distrib().extend.billOfMaterials(...)
— преобразует историю спроса на наименования в историю спроса на запчасти. См. также спецификацию().cumsub(G.Item, G.Stock, G.Quantity, G.Rank)
G.Item
— идентификатор элемента; все строки с одинаковым значением относятся к одному элементу;G.Stock
— изначальный запас элемента; у всех строк, относящихся к одному элементу, должно быть одинаковое значение G.Stock
;G.Quantity
— количество единиц элемента, необходимое для закупки всей строки таблицы;G.Rank
— идентификатор набора; все строки с одним идентификатором набора относятся к одному набору. Строки с одинаковой парой значений (G.Item, G.Rank)
запрещены, и все наборы упорядочиваются по увеличению ранга.cumsub()
обрабатывает все наборы в порядке увеличения ранга, учитывая запасы всех элементов. Изначально запасы задаются вектором G.Stock
. Для каждого набора данная функция определяет, достаточно ли оставшихся запасов для закупки всех строк таблицы, входящих в набор, в зависимости от того, превышает ли уровень запаса параметр G.Quantity
. В таких случаях функция снижает запасы всех элементов и добавляет к каждой строке количество оставшихся единиц товара. Если запасов недостаточно для комплектации целого набора (как правило, потому что закончился один из его элементов), то функция не обновляет показатели оставшихся запасов и для каждой строки находит значение -(S+1)
, где S
— оставшийся запас указанного товара на данный момент. Это нужно, чтобы показать, что данную строку не нужно закупать (проверить G.S < 0
) и что именно из-за этой строки не закупается набор (проверить G.Quantity + G.S + 1 > 0
), а также насколько (G.Missing = G.Quantity + G.S + 1
).forex(value, Origin, Destination, date)
Origin
, в виде соответствующего значения в другой валюте Destination
в соответствии с данными об обменном курсе для указанной даты. Валюты необходимо указывать с помощью общепринятых трехзначных кодов. Lokad поддерживает около 30 валют, используя данные, предоставленные Центральным банком Европы. Обменный курс обновляется ежедневно. См. также функцию проверки валюты isCurrency()
.hash(value)
isCurrency(currencyCode)
true
, если текст, выступающий в роли аргумента, является кодом валюты, распознаваемым функцией forex()
.mkuid(X, offset)
X
игнорируется, а в таблице, привязанной к X
, создается UID (уникальный идентификатор) в виде скалярного значения. offset
— это дополнительное скалярное значение, которое отражает начальный суффикс UID. Созданные строки являются числами в формате PPPPPPPAAA
, где P
— номер страницы (не может начинаться с 0), который всегда только увеличивается, а A
— пошаговый счетчик, который запускается от начала отклонения (или от 0, если отклонение не задано). Значение P
должно состоять не менее, чем из 7 цифр, а значение A
— не менее, чем из 3. solve.moq(...)
pricebrk(D, P, Prices.MinQ, Prices.P, Stock, StockP)
priopack(V, MaxV, JT, B) by [Group] sort [Order]
V
— объем каждой строки.MaxV
— максимальный объем, значение которого однородно V
, и оно должно быть постоянным во всем эквивалентном классе Group
.JT
— изменчивый порог, значения которого однородны с V
, обычно это небольшое значение, кратное Group
.B
— дополнительный аргумент, который понимается как барьер. Когда указывается данное значение, в процессе бинарной упаковки нельзя изменять порядок строк, которые принадлежат к одному и тому же классу равенства, как определяется в B
.Group
— класс эквивалентности поставщиков, упаковка контейнеров рассчитывается на поставщика.Order
содержит ранги упаковываемых строк.ranvar.segment(...)
D = ranvar.segment( start: Items.Start // первая дата для каждого элемента (включительно) end: Items.End // последняя дата для каждого элемента (включительно) step: Items.Step // число, интервал между наблюдениями в днях horizon: Items.Horizon // число, длительность периода в днях для каждого элемента date: Orders.Date // дата каждого события quantity: Orders.Quantity) // количество для каждого событияДля каждого элемента данная функция рассчитывает распределение суммы объемов по периодам с горизонтами от первой до последней даты для соответствующего элемента. Например, если дата начала — 1 января, а конца — 7 января, горизонт составляет 3 дня, во время единственного события задействуется 5 единиц товара, и оно происходит 2 января, то наблюдаемые периоды будут представлены следующим образом:
smudge(values, present) by [Group] sort [Order]
values
и логический вектор, который определяет, где находятся допустимые значения. Она возвращает полный вектор допустимых значений, который заполняется за счет распределения допустимых значений поверх недопустимых. Если говорить точнее, то конечный вектор создается путем анализа каждой строки, группа за группой (если есть аргумент Group
), в порядке возрастания параметра Order
и замены всех недопустимых значений последним наблюдаемым значением или значением по умолчанию, если допустимое значение для данной группы еще не было найдено.stockrwd.m(D, AM), stockrwd.s(D), stockrwd.c(D, AC)