lib-amostras-1_0.mpam 10.3 KB
Newer Older
Bernardo Quaresma Dias's avatar
Bernardo Quaresma Dias committed
1
2
func{ id = "sum", name = "Calcular Somatório de Lista", description =
 [[Função que recebe lista de valores reais e retorna o somatório desses valores.
Bernardo Quaresma Dias's avatar
Bernardo Quaresma Dias committed
3

Bernardo Quaresma Dias's avatar
Bernardo Quaresma Dias committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
 	Se o pârametro for positivo, as N primeiras amostras serão consideradas;
 	Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
 	Caso o parâmetro seja nulo, todas as amostras serão consideradas.

 	Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
 	]],
 	parameters = {
 		{name = "Lista", type = "REAL[]" },
 		{name = "N", type = "INTEGER" },
 	},
 	results = {
 		{name = "Somatório", type = "REAL" },
 		{name = "Primeiro", type = "INTEGER" },
 		{name = "Último", type = "INTEGER" },
 	},
 	code = [===[ function (l, n)
 		local first, last = 1, #l
 		if n ~= nil then
 			if n > 0 then
 				last = math.min(last, n)
 			elseif n < 0 then
 				first = math.max(first, 1 + last + n)
 			end
 		end

 		local value = 0
 		for i = first, last do
 			value = value + l[i]
 		end
 		return value, first, last
 	end ]===],
}

func{ id = "average", name = "Calcular Média de Lista", description =
 [[Função que recebe lista de valores reais e retorna a média desses valores de acordo com parâmetro N.

 	Se o pârametro for positivo, as N primeiras amostras serão consideradas;
 	Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
 	Caso o parâmetro seja nulo, todas as amostras serão consideradas.

 	Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
 	]],
 	parameters = {
 		{name = "Lista", type = "REAL[]" },
 		{name = "N", type = "INTEGER" },
 	},
 	results = {
 	 {name = "Média", type = "REAL" },
 		{name = "Primeiro", type = "INTEGER" },
 		{name = "Último", type = "INTEGER" },
 	},
 	code = [===[ function (l, n)
 		local total, first, last = sum(l, n)
 		local size = last - first + 1

 		return total / size, first, last
 	end ]===],
}

func{ id = "devsq", name = "Calcular Desvio Padrão de Lista", description =
 [[Função que recebe lista de valores reais, calcula a média e retorna o desvio padrão para os valores.

 	Se o pârametro for positivo, as N primeiras amostras serão consideradas;
 	Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
 	Caso o parâmetro seja nulo, todas as amostras serão consideradas.

 	Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
 	]],
 	parameters = {
 		{name = "Lista", type = "REAL[]" },
 		{name = "N", type = "INTEGER" },
 	},
 	results = {
 		{name = "Desvio Padrão", type = "REAL" },
 		{name = "Média", type = "REAL" },
 	},
 	code = [===[ function (l, n)
 		local avg, first, last = average(l, n)
 		local value = 0
 		for i = first, last do
 			value = value + (l[i] - avg) ^ 2
 		end
 		local size = last - first + 1
 		return math.sqrt(value/size), avg
 	end ]===],
}

func{ id = "covar", name = "Calcular Co-Variância de Lista", description =
 [[Função que recebe duas listas de valores reais, e calcula a co-variância entre os valores.]],
 	parameters = { {name = "Lista", type = "REAL[]" }, },
 	results = { {name = "Desvio Padrão", type = "REAL" }, },
 	code = [===[ function (l1, l2)
 		assert(#l1 == #l2,"lists need to have the same number of elements")
 		local n = #l1

 		local m1 = average(l1)
 		local m2 = average(l2)

 		local c = 0
 		for i = 1, n do
 			c = c + (l1[i] - m1) * (l2[i] - m2)
 		end
 		return c / n
 	end ]===],
}

func{ id = "slope", name = "Calcular Slope de Lista", description =
 [[Função que recebe duas listas de valores reais, e calcula a co-variância entre os valores.]],
 	parameters = { {name = "Lista 1", type = "REAL[]" }, {name = "Lista 2", type = "REAL[]" }, },
 	results = { {name = "Slope", type = "REAL" }, },
 	code = [===[ function (l1, l2)
 		local covar_12 = covar(l1,l2)
 		local q = devsq(l2)/#l1
 		return (q == 0) and 0 or covar_12/q
 	end ]===],
}

func{ id = "mediana", name = "Calcular Mediana de Lista", description =
 [[Calcula a mediana de uma lista de valores.]],
 	parameters = {
 		{ name = "Valores", type = "REAL[]" },
 	},
 	results = {
 		{ name = "Mediana", type = "REAL" },
 	},
 	code = [===[ function(l)
 		table.sort(l)

 		local m = #l/2
 		if math.mod(#l,2) == 0 then -- número par de elementos na lista
 			return (l[m] + l[m+1])/2
 		else
 			return l[math.floor(m)+1]
 		end
 	end ]===],
}

class{ id = "lista_persistente", name = "Lista Persistente", group = "Listas",
	bases = {},
	description = [[Equipamento para armazenar uma lista de valores textuais em disco para que possam ser carregados em uma nova sessão.
A lista é carregada automaticamente ao inicilaizar a instância da classe e salva ao inserir ou remover um elemento.]],
	attributes = {
		{ id = "limite_elementos",
			name   = "Limite de Elementos",
			type   = "INTEGER",
			access = "gs",
			description = [[Limite de elementos que podem ser inseridos na lista.
	Se, ao inserir um novo elemento, esse limite seja excedido, os elementos são removidos a partir do início da lista até que esse valor seja respeitado.]],
		},
	},
	code = [====[
		function _CLASS:load()
			local val = loadfile(self._filename)
			self._valores = val and val() or {}
		end

		function _CLASS:save()
			local file = io.open(self._filename, "w")
			file:write("return {\n")
			for i, elem in ipairs(self._valores) do
				file:write(string.format("%q,\n",elem))
			end
			file:write("}\n")
			file:close()
		end

		function _CLASS:init()
			self._filename = tostring(self)..".lua"
			self:load()
		end
	]====],
	methods = {
		{ id = "inserir", name = "Inserir",	description =
 [[Insere um novo elemento no final da lista.
 Os valores são armazenados como texto.]],
			parameters = {
				{ name = "Novo Valor", type = "STRING" },
			},
			results = {
			},
			code = [===[ function(self, valor)
				table.insert(self._valores, valor)
				while self.limite_elementos and (#self._valores > math.max(0, self.limite_elementos) ) do
					self:remover()
				end
				self:save()
			end ]===],
		},
		{ id = "remover", name = "Remover",	description =
 [[Remove o elemento na posição informada e retorna.
 Se nenhuma posição for informada, o primeiro elemento da lista será removido.]],
			parameters = {
				{ name = "Posição", type = "INTEGER" },
			},
			results = {
			},
			code = [===[ function(self, posicao)
				local ret =  table.remove(self._valores, posicao or 1)
				self:save()
				return ret
			end ]===],
		},
		{ id = "informar", name = "Informar",	description =
  [[Informa o valor de determinada posição da lista.
 Se nenhuma posição for passada, indica o valor na última posição.]],
			parameters = {
				{ name = "Posição", type = "INTEGER" },
			},
			results = {
				{ name = "Valor", type = "STRING" },
			},
			code = [===[ function(self, posicao)
				return self._valores[posicao or #self._valores]
			end ]===],
		},
		{ id = "informar_tamanho", name = "Informar Tamanho",	description =
 [[Informa o tamanho da lista.]],
			parameters = {
			},
			results = {
				{ name = "Tamanho", type = "INTEGER" },
			},
			code = [===[ function(self)
				return #self._valores
			end ]===],
		},
	},
}

class{ id = "amostras", name = "Amostras", group = "Listas",
Bernardo Quaresma Dias's avatar
Bernardo Quaresma Dias committed
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
	bases = {}, description =
 [[Classe que modela um conjunto de amostras de uma variável de processo.]],
	attributes = {
		{ id = "intervalo_min", name ="Intervalo Mínimo", type = "REAL", access ="", description =
 [[Intervalo mínimo entre amostras.]],
		},
		{ id = "validade", name ="Validade", type = "REAL", access ="", description =
 [[Validade em segundos de uma amostra inserida na lista.]],
		},
	},
	code = [====[
		function _CLASS:init()
			self._samples = {}
		end
	]====],
	methods = {
		{ id = "iniciar", name ="Iniciar", description =
 [[Inicia atemporização estabelecendo um tempo limite para sua conclusão.]],
			parameters = {
			},
			results = {
			},
			code = [===[ function(self)
				self:init()
			end ]===],
		},
		{ id = "inserir", name ="Inserir", description =
 [[Insere elemento na lista de amostras com o valor informado.]],
			parameters = {
				{ name = "Valor", type = "REAL" },
			},
			results = {
			},
			code = [===[ function(self, v)
				local t_atual = time()
				local amostras = self._samples

				local t_ultima = amostras[1] and amostras[1].tempo
				if (not t_ultima) or (t_atual - self.intervalo_min > t_ultima) then 
					local amostra = {
						valor = v,
						tempo = t_atual
					}
					table.insert(amostras, 1, amostra)

					self:atualizar()
				end
			end ]===],
		},
		{ id = "atualizar", name ="Atualizar", description =
 [[Atualiza amostras removendo vencidas da lista.]],
			parameters = {
			},
			results = {
			},
			code = [===[ function(self, v)
				if self.validade then
					local t_limite = time() - self.validade
					local amostras = self._samples
					while amostras[#amostras].tempo < t_limite do
						table.remove(amostras)
					end
				end
			end ]===],
		},
		{ id = "validar", name ="Validar", description =
 [[Informa se o tempo da última amostra é maior que a validade configurada ou que o período de tempo passado por parâmetro.]],
			parameters = {
				{ name = "Tempo", type = "REAL" },
			},
			results = {
				{ name = "Válido", type = "BOOLEAN" },
			},
			code = [===[ function(self, t)
				if not (t or self.validade) then
					return list[1] and true or false
				else
					return (time() - list[#list].tempo) > (t or self.validade)
				end
			end ]===],
		},
		{ id = "obter_historico", name ="Obter Histórico", description =
 [[Obtém o histórico de valores de amostras pelo período de tempo passado por parâmetro.]],
			parameters = {
				{ name = "Tempo", type = "REAL" },
			},
			results = {
				{ name = "Histórico", type = "REAL[]" },
			},
			code = [===[ function(self, t)
				local historico = {}
				local t_atual = time()

				local a = 1
				for a, amostra in ipairs(self._samples) do
					if t and (t_atual - t > amostra.tempo) then
						break
					end
					historico[#historico+1] = amostra.valor                               
				end

				return historico
			end ]===],
		},
	},
}