linmeric 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 341e267a03b8fea5821479cf3572e1525b80c328
4
+ data.tar.gz: 59fb9adb800c906fdbc186ace484ac4392323c44
5
+ SHA512:
6
+ metadata.gz: 6c57ef652f21153f0b2ad5bccb3c184db5919591535bfe73f809bd68cf38ff7025584e7bf07c3b8339f74a775a4c67d5f5b95dc4e37bcc4bc148200173886933
7
+ data.tar.gz: 288c4ec1de4395995a952e3af6ad96999414a3575d0897c217e4568c723959ab446476ec58d071aefec7b5e631d122dba457bcf993c319b0036d983fd818273d
data/bin/linmeric ADDED
@@ -0,0 +1,547 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require "linmeric"
4
+
5
+
6
+ @error = false
7
+ @vars = {}
8
+ @operators = {
9
+ :+ => lambda do |a,b|
10
+ a = evaluate(a) if a.is_a? Array
11
+ b = evaluate(b) if b.is_a? Array
12
+ a = replace_var(a) if a.is_a? String
13
+ b = replace_var(b) if b.is_a? String
14
+ unless @error
15
+ if a.similar_to? b then
16
+ return a + b
17
+ elsif a.is_a? Matrix and b.is_a? Matrix then
18
+ t = b.tr
19
+ if a.similar_to? t then
20
+ a += t
21
+ # if a.raised_exception? != nil then
22
+ # puts " " + a.raised_exception?
23
+ # @error = true
24
+ # return nil
25
+ # end
26
+ return a
27
+ else
28
+ puts " Argument Error: Cannot sum #{a.getRws}x#{a.getCls} matrix with #{b.getRws}x#{b.getCls}"#; puts
29
+ @error = true
30
+ return nil
31
+ end
32
+ else
33
+ puts " Math Error: cannot sum #{a.class} with #{b.class}"#; puts
34
+ @error = true
35
+ return nil
36
+ end
37
+ end
38
+ end,
39
+
40
+ :- => lambda do |a,b|
41
+ a = evaluate(a) if a.is_a? Array
42
+ b = evaluate(b) if b.is_a? Array
43
+ a = replace_var(a) if a.is_a? String
44
+ b = replace_var(b) if b.is_a? String
45
+ unless @error
46
+ if (a.is_a? Numeric or a == nil) and b.is_a? Numeric then
47
+ return (a || 0) - b
48
+ elsif a.is_a? Matrix and b.is_a? Matrix then
49
+ if a.similar_to? b then
50
+ a = a - b
51
+ else
52
+ t = b.tr
53
+ if a.similar_to? t then
54
+ a = a - t
55
+ else
56
+ puts " Argument Error: Cannot subtract #{a.getRws}x#{a.getCls} matrix with #{b.getRws}x#{b.getCls}"#; puts
57
+ @error = true
58
+ return nil
59
+ end
60
+ end
61
+ # if a.raised_exception? != nil then
62
+ # puts " " + a.raised_exception?
63
+ # @error = true
64
+ # return nil
65
+ # else
66
+ return a
67
+ # end
68
+ else
69
+ puts " Math Error: cannot subtract #{a.class} with #{b.class}"#; puts
70
+ @error = true
71
+ return nil
72
+ end
73
+ end
74
+ end,
75
+
76
+ :"=" => lambda do |a,b|
77
+ a = evaluate(a) if a.is_a? Array
78
+ b = evaluate(b) if b.is_a? Array
79
+ b = replace_var(b) if b.is_a? String
80
+ unless @error
81
+ if a.is_a? Numeric or a.is_a? Matrix then
82
+ a == b ? (puts true) : (puts false);puts
83
+ else
84
+ @vars[a] = b
85
+ if not b.is_a? Matrix then
86
+ print "=> "; b.show#; puts
87
+ else
88
+ puts "=>"
89
+ b.show#; puts
90
+ end
91
+ end
92
+ end
93
+ end,
94
+
95
+ :* => lambda do |a,b|
96
+ a = evaluate(a) if a.is_a? Array
97
+ b = evaluate(b) if b.is_a? Array
98
+ a = replace_var(a) if a.is_a? String
99
+ b = replace_var(b) if b.is_a? String
100
+ unless @error
101
+ if a.can_multiply? b then
102
+ return a * b
103
+ elsif a.is_a? Matrix and b.is_a? Matrix then
104
+ t = b.tr
105
+ if a.can_multiply? t then
106
+ return a * t
107
+ else
108
+ puts " Cannot multiply #{a.getRws}x#{a.getCls} matrix with #{b.getRws}x#{b.getCls}"#; puts
109
+ @error = true
110
+ return nil
111
+ end
112
+ else
113
+ puts " Cannot multiply #{a.class} with #{b.class}"#; puts
114
+ end
115
+ end
116
+ end,
117
+
118
+ :/ => lambda do |a,b|
119
+ a = evaluate(a) if a.is_a? Array
120
+ b = evaluate(b) if b.is_a? Array
121
+ a = replace_var(a) if a.is_a? String
122
+ b = replace_var(b) if b.is_a? String
123
+ unless @error
124
+ if (a.can_divide? b) and b != 0 then
125
+ return a / b.to_f
126
+ #elsif (a.is_a? Matrix and b.s_a? Numeric) or (a.is_a? Numeric and b.is_a? Matrix) then
127
+ # return a / b
128
+ else
129
+ @error = true
130
+ if b == 0 then
131
+ puts " Math Error: division for 0"#; puts
132
+ else
133
+ puts " Math Error: invalid divison between #{a.class} and #{b.class}"#; puts
134
+ end
135
+ return nil
136
+ end
137
+ end
138
+ end,
139
+
140
+ :^ => lambda do |a,b|
141
+ a = evaluate(a) if a.is_a? Array
142
+ b = evaluate(b) if b.is_a? Array
143
+ a = replace_var(a) if a.is_a? String
144
+ b = replace_var(b) if b.is_a? String
145
+ unless @error
146
+ if a != 0 or b != 0 then
147
+ if a.is_a? Numeric and b.is_a? Numeric then
148
+ return a ** b
149
+ elsif (a.is_a? Matrix and b.is_a? Numeric) or (a.is_a? Numeric and b.is_a? Matrix)
150
+ return a ** b
151
+ else
152
+ puts " Math Error: invalid power #{a.class}-#{b.class}"#; puts
153
+ @error = true
154
+ return nil
155
+ end
156
+ else
157
+ puts " Math Error: 0^0"#; puts
158
+ @error = true
159
+ return nil
160
+ end
161
+ end
162
+ end,
163
+
164
+ :> => lambda do |a,b|
165
+ a = evaluate(a) if a.is_a? Array
166
+ a = replace_var(a) if a.is_a? String
167
+ b = b - '"'
168
+ unless @error
169
+ if a.is_a? Matrix then
170
+ a.to_file(b)
171
+ # unless a.raised_exception? == nil
172
+ # puts " " + a.raised_exception?; puts
173
+ # @error = true
174
+ # end
175
+ else
176
+ if Dir.exist? File.dirname(b) then
177
+ File.open(b,"w") do |ln|
178
+ ln.puts "#{a}"
179
+ end
180
+ else
181
+ puts " Argument Error: Invalid directory; Directory not found"#; puts
182
+ @error = true
183
+ end
184
+ end
185
+ end
186
+ return nil
187
+ end,
188
+
189
+ :"t:" => lambda do |a|
190
+ a = evaluate(a) if a.is_a? Array
191
+ a = replace_var(a) if a.is_a? String
192
+ unless @error
193
+ if a.is_a? Matrix then
194
+ return a.tr
195
+ else
196
+ puts " Math Error: cannot traspose a #{a.class} value"#; puts
197
+ @error = true
198
+ return nil
199
+ end
200
+ end
201
+ end,
202
+
203
+ :"det:" => lambda do |a|
204
+ a = evaluate(a) if a.is_a? Array
205
+ a = replace_var(a) if a.is_a? String
206
+ unless @error
207
+ if a.is_a? Matrix then
208
+ if a.is_squared? then
209
+ return a.laplace
210
+ else
211
+ puts " Math Error: determinant on a non-squared Matrix"#; puts
212
+ @error = true
213
+ return nil
214
+ end
215
+ else
216
+ puts " Math Error: determinant on #{a.class} value"#; puts
217
+ @error = true
218
+ return nil
219
+ end
220
+ end
221
+ end,
222
+
223
+ :"norm:" => lambda do |a|
224
+ a = evaluate(a) if a.is_a? Array
225
+ a = replace_var(a) if a.is_a? String
226
+ unless @error
227
+ if a.is_a? Matrix then
228
+ return a.norma
229
+ else
230
+ puts " Math Error: norm on a #{a.class} value"#; puts
231
+ @error = true
232
+ return nil
233
+ end
234
+ end
235
+ end,
236
+
237
+ :"id_mx:" => lambda do |a|
238
+ a = evaluate(a) if a.is_a? Array
239
+ a = replace_var(a) if a.is_a? String
240
+ unless @error
241
+ if a.is_a? Fixnum
242
+ return Matrix.identity(a) if a > 0
243
+ end
244
+ @error = true
245
+ puts " Argument Error: bad value #{a} for Identity Matrix"#; puts
246
+ return nil
247
+ end
248
+ end,
249
+
250
+ :"from:" => lambda do |a|
251
+ a = a - "\"" if a.is_a? String
252
+ return Filename.new(a) if a.is_a? String
253
+ @error = true
254
+ puts " Argument Error: bad filename #{a}"#; puts
255
+ return nil
256
+ end,
257
+
258
+ :"as:" => lambda do |a|
259
+ if a.include? '"' then
260
+ a = a - '"'
261
+ return Function.new(a)
262
+ else
263
+ return replace_var(a)
264
+ end
265
+ end,
266
+
267
+ :"mx:" => lambda do |a,b|
268
+ b = evaluate(b) if b.is_a? Array
269
+ b = replace_var(b) if b.is_a? String
270
+ a = evaluate(a) if a.is_a? Array
271
+ unless a.class == Filename
272
+ if '123456789,"'.contain_all? a then
273
+ a = Dim.new(a)
274
+ if a.sx == nil then
275
+ @error = true
276
+ return nil
277
+ end
278
+ else
279
+ puts "viene"
280
+ puts " Argument Error: invalid range for matrix"
281
+ @error = true
282
+ return nil
283
+ end
284
+ end
285
+ unless @error
286
+ if b == nil then
287
+ case a.class.to_s
288
+ when "Filename"
289
+ m = Matrix.from_file(a)
290
+ when "Dim"
291
+ m = Matrix.new(a.sx,a.dx)
292
+ else
293
+ puts " Argument Error: invalid #{a.class} #{a} found"
294
+ @error = true
295
+ return nil
296
+ end
297
+ else
298
+ unless b.is_a? Function
299
+ @error = true
300
+ return nil
301
+ end
302
+ unless @error
303
+ b = b.to_block(2)
304
+ if b == nil then
305
+ @error = true
306
+ puts " Argument Error: bad function for Matrix"#; puts
307
+ return nil
308
+ end
309
+ m = eval(" Matrix.new(a.sx,a.dx) #{b}")
310
+ end
311
+ end
312
+ # if m.raised_exception? != nil then
313
+ # @error = true
314
+ # puts " " + m.raised_exception?; puts
315
+ # return nil
316
+ # end
317
+ return m
318
+ end
319
+ return nil
320
+ end,
321
+
322
+ :"f:" => lambda do |a|
323
+ a = a - '"'
324
+ a = Function.new(a)
325
+ unless a.ok?
326
+ puts " Argument Error: bad function inserted. Maybe sintax error?"#; puts
327
+ @error = true
328
+ return nil
329
+ end
330
+ return a
331
+ end,
332
+
333
+ :"shw:" => lambda do |a|
334
+ if a.is_a? String then
335
+ a = replace_var(a)
336
+ unless @error
337
+ print "=> " if not a.is_a? Matrix
338
+ puts "=>" if a.is_a? Matrix
339
+ a.show; puts
340
+ return nil
341
+ end
342
+ else
343
+ puts " Argument Error: Bad argument #{a} for 'shw:' command"#; puts
344
+ end
345
+ end,
346
+
347
+ :"shwvar:" => lambda do ||
348
+ if @vars.size > 0
349
+ Tool.print_stack(@vars)
350
+ else
351
+ puts " No variables defined yet"
352
+ end
353
+ end,
354
+
355
+ :"solve:" => lambda do |a,b|
356
+ a = evaluate(a) if a.is_a? Array
357
+ b = evaluate(b) if b.is_a? Array
358
+ a = replace_var(a) if a.is_a? String
359
+ b = replace_var(b) if b.is_a? String
360
+ [a,b].each do |m|
361
+ unless m.is_a? Matrix
362
+ puts " Argument Error: expecting matrix for LU factorization, but '#{m.class}' found"
363
+ @error = true
364
+ return nil
365
+ end
366
+ end
367
+ unless a.is_squared?
368
+ puts " Argument Error: non-squared matrix for LU factorization found"
369
+ @error = true
370
+ return nil
371
+ end
372
+ unless a.getRws == b.getRws
373
+ puts " Argument Error: invalid #{b.getRws}x1 solution for #{a.getRws}x#{a.getCls} matrix"
374
+ @error = true
375
+ return nil
376
+ end
377
+ unless b.getCls == 1
378
+ puts " Argument Error: invalid solution matrix #{b.getRws}x#{b.getCls}"
379
+ @error = true
380
+ return nil
381
+ end
382
+ LU.reset
383
+ solution = LU.factorize(a,b)
384
+ @vars['L'] = LU.L
385
+ @vars['U'] = LU.U
386
+ return solution
387
+ end,
388
+
389
+ :"integ:" => lambda do |f,r,n,m|
390
+ if f.is_a? String then
391
+ if f.include? '"'
392
+ f = f - '"'
393
+ f = Function.new(f)
394
+ unless f.ok?
395
+ @error = true
396
+ puts " Argument Error: bad function for integration"#; puts
397
+ return nil
398
+ end
399
+ else
400
+ f = replace_var(f)
401
+ end
402
+ end
403
+ unless f.is_a? Function
404
+ puts " Argument Error: function for integration expected but #{f.class} found"
405
+ @error = true
406
+ return nil
407
+ end
408
+ r = Dim.new(r)
409
+ if r.sx == nil then
410
+ @error = true
411
+ return nil
412
+ end
413
+ if n <= 0 then
414
+ puts " Argument Error: bad NumPoints for integration"#; puts
415
+ @error = true
416
+ return nil
417
+ end
418
+ unless @error
419
+ if m == nil then
420
+ res = f.integrate(r,n)
421
+ else
422
+ res = f.integrate(r,n,m)
423
+ end
424
+ if res == nil
425
+ @error = true
426
+ return nil
427
+ else
428
+ return res
429
+ end
430
+ end
431
+ end
432
+
433
+ }
434
+
435
+
436
+
437
+ def replace_var(var)
438
+ if @vars.include? var then
439
+ return @vars[var]
440
+ else
441
+ puts " Argument Error: variable '#{var}' not defined"#; puts
442
+ @error = true
443
+ return nil
444
+ end
445
+ end
446
+
447
+
448
+ def evaluate(token_arr)
449
+ return 0 if token_arr.size == 0
450
+ return token_arr[0] if token_arr.size == 1 and !(token_arr[0].is_a? Array) and !(token_arr[0].is_a? Symbol)
451
+ return evaluate(token_arr[0]) if token_arr.size == 1 and token_arr[0].is_a? Array
452
+ for i in 0...token_arr.size
453
+ if token_arr[i].is_a? Symbol then
454
+ if @operators.include? token_arr[i] then
455
+ if Tool.keys.include? token_arr[i].to_s then
456
+ case token_arr[i]
457
+ when :"solve:"
458
+ token_arr[i+2] = @operators[token_arr[i]][token_arr[i+1],token_arr[i+2]]
459
+ when :"mx:"
460
+ token_arr[i+2] = @operators[token_arr[i]][token_arr[i+1],token_arr[i+2]]
461
+ when :"integ:"
462
+ token_arr[i+4] = @operators[token_arr[i]][token_arr[i+1],
463
+ token_arr[i+2],
464
+ token_arr[i+3],
465
+ token_arr[i+4]]
466
+ when :"shwvar:"
467
+ token_arr[i] = @operators[token_arr[i]][]
468
+ else
469
+ token_arr[i+1] = @operators[token_arr[i]][token_arr[i+1]]
470
+ end
471
+ else
472
+ token_arr[i+1] = @operators[token_arr[i]][token_arr[i - 1],token_arr[i + 1]]
473
+ end
474
+ else
475
+ puts " Unknown keyword or operator '#{token_arr[i]}'"#; puts
476
+ @error = true
477
+ return nil
478
+ end
479
+ end
480
+ return nil if @error
481
+ end
482
+ return token_arr[token_arr.size - 1]
483
+ end
484
+
485
+
486
+
487
+
488
+ ##############################################
489
+ # BODY #
490
+ ##############################################
491
+
492
+ scp = Scp.new
493
+ parser = Parser.new
494
+ reader = Listener.new
495
+ sizer = Sizer.new
496
+ print "Linmeric-main> "
497
+ begin
498
+ string = reader.gets
499
+ while string != "exit"
500
+ if sizer.analyze(string)
501
+ tree = parser.parse(scp.scopify(string.compact))
502
+ unless tree == nil or tree == []
503
+ ev = evaluate(tree)
504
+ ev = replace_var(ev) if ev.is_a? String
505
+ unless (string.include? '=') or (string.include? "shw:" or
506
+ string.include? "shwvar:") or @error
507
+ if ev.is_a? Matrix then
508
+ puts "=>"
509
+ ev.show
510
+ else
511
+ print "=> "; ev.show#; puts
512
+ end
513
+ end
514
+ end
515
+ end
516
+ @error = false
517
+ parser.reset
518
+ print "Linmeric-main> "
519
+ reader.reset
520
+ string = reader.gets
521
+ end
522
+
523
+ rescue => error
524
+ puts error
525
+ retry
526
+ end
527
+
528
+
529
+
530
+ ##############################################
531
+ # TESTS #
532
+ ##############################################
533
+ =begin
534
+ a = Matrix.new(2,3) {|i,j| i + j}
535
+ b = Matrix.new(3,2) {|i,j| i + j}
536
+ @vars = {"a" => a, "b" => b}
537
+ scopify = Scp.new
538
+ @operators[:"shwvar:" ][]#["2,3",Function.new("i+j")].show
539
+ #puts evaluate(Parser.parse(scopify.scopify('12=3*4')))#.show
540
+ puts @vars
541
+ =end
542
+
543
+
544
+
545
+
546
+
547
+