Skip to content

Commit 5d21369

Browse files
authored
MatrixLib for numpy
1 parent 2c21f88 commit 5d21369

File tree

2 files changed

+170
-5
lines changed

2 files changed

+170
-5
lines changed

libraries/mathlib.km3

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,36 @@ package mathlib {
324324
pre: true
325325
post: result = lambda x : double in MathLib.definiteIntegral(0,x,f);
326326

327+
static query numericRange(st : double, en : double, step : double) : Sequence(double)
328+
pre: step > 0
329+
post: true
330+
activity:
331+
var res : Sequence(double) := Sequence{st};
332+
var x : double := st + step;
333+
while x < en
334+
do
335+
(res := res->append(x) ;
336+
x := x + step);
337+
return res;
338+
339+
static query numericSeries(st : double, en : double, steps : int) : Sequence(double)
340+
pre: steps > 1
341+
post: true
342+
activity:
343+
var res : Sequence(double) := Sequence{st};
344+
var step : double := (en - st)/(steps - 1);
345+
var x : double := st + step;
346+
while x < en
347+
do
348+
(res := res->append(x) ;
349+
x := x + step);
350+
return res;
351+
327352
}
328353

354+
355+
356+
329357
class FinanceLib {
330358

331359
stereotype external;
@@ -345,11 +373,6 @@ package mathlib {
345373
post:
346374
result = Integer.subrange(1,values->size())->collect( _ind | FinanceLib.discountDiscrete(values->at(_ind), rate, (_ind - 1) ) )->sum();
347375

348-
static query presentValueDiscrete(rate: double, values: Sequence(double)) : double
349-
pre: rate > -1
350-
post:
351-
result = Integer.subrange(1,values->size())->collect( _ind | FinanceLib.discountDiscrete(values->at(_ind), rate, _ind) )->sum();
352-
353376
static query irrDiscrete(values: Sequence(double)) : double
354377
pre: true post: true;
355378

libraries/matrixlib.km3

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package matrixlib {
2+
3+
4+
class MatrixLib {
5+
6+
static query rowMult(s : Sequence(double), m : Sequence(Sequence(double))) : Sequence(double)
7+
pre: true
8+
post: result = Integer.subrange(1, s.size)->collect( i | Integer.Sum(1, m.size, k, s[k]*(m[k]->at(i))));
9+
10+
static query matrixMultiplication(m1: Sequence(Sequence(double)), m2 : Sequence(Sequence(double))) : Sequence(Sequence(double))
11+
pre: true
12+
post: result = m1->collect( row | MathLib.rowMult(row, m2) );
13+
14+
static query subRows(m : Sequence(Sequence(double)), s : Sequence(int)) : Sequence(Sequence(double))
15+
pre: true
16+
post: result = s->select( i | 1 <= i & i <= m.size )->collect( j | m[j] );
17+
18+
static query shape(x : OclAny) : Sequence(int)
19+
pre: true
20+
post: true
21+
activity:
22+
var res : Sequence(int) := Sequence{} ;
23+
if x->oclIsTypeOf(Sequence)
24+
then
25+
var sq : Sequence(OclAny) := x->oclAsType(Sequence) ;
26+
res := Sequence{ sq->size() } ;
27+
if sq->size() > 0
28+
then
29+
res := res->union(MatrixLib.shape(sq->at(1)))
30+
else
31+
return res
32+
else
33+
return res ;
34+
return res;
35+
36+
static query setSingleValue(sh : Sequence(int), x : double) : Sequence(OclAny)
37+
pre: true
38+
post: true
39+
activity:
40+
if sh->size() = 0
41+
then
42+
return Sequence{}
43+
else skip ;
44+
45+
if sh->size() = 1
46+
then
47+
return Integer.subrange(1,sh->at(1))->collect(x)
48+
else skip ;
49+
50+
var res : Sequence(OclAny) ;
51+
res := Integer.subrange(1,sh->at(1))->collect(MatrixLib.setSingleValue(sh->tail(), x)) ;
52+
return res;
53+
54+
static query setValues(sq : Sequence(double), sh : Sequence(int)) : Sequence(OclAny)
55+
pre: true
56+
post: true
57+
activity:
58+
if sh->size() = 0
59+
then
60+
return Sequence{}
61+
else skip ;
62+
63+
if sh->size() = 1
64+
then
65+
return sq.subrange(1,sh->at(1))
66+
else skip ;
67+
68+
var res : Sequence(OclAny) := Sequence{} ;
69+
var prod : int := sh->tail()->prd() ;
70+
71+
for i : Integer.subrange(1,sh->at(1))
72+
do
73+
(var rowi : Sequence(double) :=
74+
MatrixLib.setValues(sq.subrange(1 + prod*(i-1), prod*i), sh->tail()) ;
75+
res := res->append(rowi) ) ;
76+
77+
return res;
78+
79+
static query identityMatrix(n : int) : Sequence(Sequence(double))
80+
pre: true
81+
post:
82+
result = Integer.subrange(1,n)->collect( i | Integer.subrange(1,n)->collect( j | if i = j then 1.0 else 0.0 endif ) );
83+
84+
static query flattenMatrix(m : Sequence(OclAny)) : Sequence(double)
85+
pre: true
86+
post: true
87+
activity:
88+
if m->size() = 0
89+
then
90+
return Sequence{}
91+
else skip;
92+
93+
if m->at(1)->oclIsTypeOf(Sequence)
94+
then
95+
return MatrixLib.flattenMatrix(m->at(1))->union(MatrixLib.flattenMatrix(m->tail()))
96+
else
97+
return m;
98+
99+
static query elementwiseApply(m : Sequence(OclAny), f : Function(double,double)) : Sequence(OclAny)
100+
pre: true
101+
post: true
102+
activity:
103+
if m->size() = 0
104+
then
105+
return Sequence{}
106+
else skip;
107+
108+
if m->at(1)->oclIsTypeOf(Sequence)
109+
then
110+
return MatrixLib.elementwiseApply(m->at(1),f)->union(MatrixLib.elementwiseApply(m->tail(), f))
111+
else
112+
skip;
113+
114+
for ind : Integer.subrange(1,m->size())
115+
do
116+
m[ind] := f->apply(m->at(ind)->oclAsType(double));
117+
return m;
118+
119+
120+
static query elementwiseMult(m : Sequence(OclAny), x : double) : Sequence(OclAny)
121+
pre: true
122+
post: true
123+
activity:
124+
if m->size() = 0
125+
then
126+
return Sequence{}
127+
else skip;
128+
129+
if m->at(1)->oclIsTypeOf(Sequence)
130+
then
131+
return MatrixLib.elementwiseMult(m->at(1), x)->union(MatrixLib.elementwiseMult(m->tail(), x))
132+
else
133+
skip;
134+
135+
for ind : Integer.subrange(1,m->size())
136+
do
137+
m[ind] := (m->at(ind)->oclAsType(double))*x;
138+
return m;
139+
}
140+
141+
142+
}

0 commit comments

Comments
 (0)