In [9]:
from sympy import *
init_printing(use_unicode=True)
In [10]:
m = Matrix([1, 2, 3])
In [11]:
m = Matrix(["c"])
In [12]:
m
Out[12]:
In [13]:
m*m
Out[13]:
In [14]:
from sympy.abc import a,b,c
In [15]:
m
Out[15]:
In [16]:
m = ImmutableMatrix([c,c**2])
In [17]:
m
Out[17]:
In [18]:
m*m.T
Out[18]:
In [26]:
(m*m.T)**2
Out[26]:
In [28]:
m[0,0]
Out[28]:
In [20]:
q = Matrix([[1,2],[3,4]])
In [21]:
q^2
In [25]:
q^-1
In [1]:
q**-1
In [ ]:
In [4]:
import numpy as np
from bqplot import *
from bqplot.marks import Graph
from ipywidgets import Layout
from relmath import *
type(M)
fig_layout = Layout(width='960px', height='500px')
def disp(expr):
print(type(expr))
if type(expr) is MatMul:
binop = expr
left = binop.left.simp()
right = binop.right.simp()
if type(left) is not Rel:
raise ValueError("Can't simplify left operand to a Rel ! Found %s " % left)
if type(right) is not Rel:
raise ValueError("Can't simplify right operand to a Rel ! Found %s " % right)
print(left)
print(right)
node_data = left.dom + left.cod + right.cod
print(node_data)
link_data = []
n = len(left.dom)
m = len(left.cod)
w = len(right.cod)
for i in range(n):
for j in range(m):
link_data.append({'source': i, 'target': n+j, 'value': left.g[i][j].val})
for i in range(m):
for j in range(w):
link_data.append({'source': n+i, 'target': n+m+j, 'value': right.g[i][j].val})
print(link_data)
xs = LinearScale()
ys = LinearScale()
lcs = ColorScale(scheme='Greens')
x = ([100] * n) + ([200]*m) + ([300]*w)
y = list(range(n)) + list(range(m)) + list(range(w))
print(x)
print(y)
graph = Graph(node_data=node_data, link_data=link_data, link_type='line',
colors=['orange'], directed=False,
scales={'x': xs, 'y': ys, 'link_color': lcs},
x=x, y=y, color=np.random.rand(len(node_data)))
return Figure(marks=[graph], layout=fig_layout)
elif type(expr) is Rel:
node_data = expr.dom() + expr.cod()
#print(node_data)
link_data = []
for i in range(len(expr.dom)):
for j in range(len(expr.cod)):
link_data.append({'source': i, 'target': i+j, 'value': expr.g[i][j].val})
#print(link_data)
xs = LinearScale()
ys = LinearScale()
lcs = ColorScale(scheme='Greens')
x = ([100] * len(expr.dom)) + ([200]*len(expr.cod))
y = list(range(len(expr.dom))) + list(range(len(expr.cod)))
#print(x)
#print(y)
graph = Graph(node_data=node_data, link_data=link_data, link_type='line',
colors=['orange'], directed=False,
scales={'x': xs, 'y': ys, 'link_color': lcs},
x=x, y=y, color=np.random.rand(len(node_data)))
return Figure(marks=[graph], layout=fig_layout)
else:
raise ValueError("not supported type: %s" % type(expr) )
disp(E)
In [ ]:
In [5]:
X = MatrixSymbol('X', 3, 4)
In [6]:
X
Out[6]:
In [35]:
X[0,0]
Out[35]:
In [36]:
m
Out[36]:
In [31]:
srepr(m*m)
Out[31]:
In [41]:
sympify("m * m.T", locals={'m':m}, evaluate=False)
Out[41]:
In [39]:
help(sympify)
In [44]:
Matrix(['s',3])
Out[44]:
In [43]:
p
Out[43]:
In [45]:
Matrix(['s',{'a':'b'}])
Out[45]:
In [54]:
p = Matrix(['s',['a']])
p
Out[54]:
In [56]:
p += Matrix(["c","d"])
In [51]:
p = Matrix([[['s'],'r'],['a','e']])
Out[51]:
In [58]:
p.c = 2
In [59]:
p
Out[59]:
In [60]:
p.c
Out[60]:
In [61]:
p.afdsf = 2
In [151]:
m = ImmutableMatrix([2,3])
In [317]:
isinstance(4, float)
Out[317]:
In [313]:
from sympy.core.singleton import S
class Dioid(AtomicExpr):
is_number = True
@cacheit
def __new__(cls,*args):
tmp = []
for a in args:
a = sympify(a,strict=True)
if type(a) is cls:
tmp.extend(a.args)
else:
tmp.append(a)
return super().__new__(cls,*tmp)
def __mul__(self, other):
return self._eval_mul(other)
@decorators._sympifyit('other', NotImplemented)
def __add__(self, other):
return self._eval_add(other)
def __neg__(self):
return self._eval_neg()
def s(self):
""" The set of discourse """
raise NotImplementedError("IMPLEMENT ME!")
def zero(self):
raise NotImplementedError("IMPLEMENT ME!")
def one(self):
raise NotImplementedError("IMPLEMENT ME!")
def __str__(self):
return "%s(%s)" % (self.__class__.__name__, str(self.args[0]))
def __repr__(self):
return self.__str__()
def _eval_neg(self, other):
""" NOTE: in a dioid, negation is _not_ mandatory. See page 7 of Graphs, Dioids and Semirings book
"""
raise NotImplemented("Not available for this dioid !")
raise NotImplementedError("")
def _eval_add(self, other):
raise NotImplementedError("")
def _eval_mul(self, other):
raise NotImplementedError("")
def __radd__(self, a):
"""Implementation of reverse add method."""
return a.__add__(self)
class RD(Dioid):
def __init__(self, val):
self.val = sympify(val)
super().__init__()
def zero(self):
return S(0)
def one(self):
return S(1)
def s(self):
return "TODO R^ set "
def _eval_neg(self):
""" NOTE: in a dioid, negation is _not_ mandatory. See page 7 of Graphs, Dioids and Semirings book
"""
return self.__class__(- self.args[0])
def _eval_add(self, d2):
if isinstance(d2,int) or isinstance(d2,float):
return self.__class__(self.args[0] * d2)
elif isinstance(d2, RD):
return self.__class__(self.args[0] + d2.args[0])
def _eval_mul(self, d2):
if isinstance(d2,int) or isinstance(d2,float):
return self.__class__(self.args[0] * d2)
elif isinstance(d2, RD):
return self.__class__(self.args[0] * d2.args[0])
elif return NotImplemented
#@classmethod
#def eval(cls, arg):
# Phi(x) + Phi(-x) == 1
#if arg.could_extract_minus_sign():
# return 1-cls(-arg)
class Rel(ImmutableMatrix):
def __init__(self, par, dom=[], cod=[]):
super().__init__()
self.dom=dom
self.cod=cod
def _eval_matrix_mul(self, other):
r = super()._eval_matrix_mul(other)
r.dom = self.dom
r.cod = other.cod
return r
def _eval_transpose(self):
r = super()._eval_transpose()
r.dom = self.cod
r.cod = self.dom
return r
T = property(transpose, None, None, "Matrix transposition.")
In [314]:
(Add(RD(3), RD(7))).evalf()
Out[314]:
In [315]:
simplify(Add(RD(3), RD(7)))
Out[315]:
In [291]:
RD(5)
Out[291]:
In [292]:
RD(5) == RD(5)
Out[292]:
In [293]:
-RD(5)
Out[293]:
In [294]:
RD(3) + RD(7)
Out[294]:
In [295]:
w = Rel([RD(3)])
In [296]:
sympify(Add(RD(3), RD(7)))
Out[296]:
In [285]:
Add(RD(3), RD(7)).doit()
Out[285]:
In [286]:
simplify(Add(RD(3), RD(7)))
Out[286]:
In [300]:
(Add(Integer(3), Integer(7))).evalf()
Out[300]:
In [301]:
simplify(Add(Integer(3), Integer(7)))
Out[301]:
In [258]:
w = Rel([[RD(2),RD(5)]], dom=['a','b'], cod=['x','y','z'])
In [259]:
w
Out[259]:
In [261]:
x = w*w.T
In [270]:
x
Out[270]:
In [274]:
simplify(x[0])
Out[274]:
In [263]:
r = Rel([[2,5]], dom=['a','b'], cod=['x','y','z'])
In [268]:
p = r*r.T
In [269]:
p
Out[269]:
In [265]:
type(p)
Out[265]:
In [266]:
p.dom
Out[266]:
In [267]:
p.cod
Out[267]:
In [160]:
r
Out[160]:
In [106]:
r.dom
Out[106]:
In [107]:
Rel([2,5])
Out[107]:
In [109]:
s = sympify("r * r.T", locals={'r':r}, evaluate=False)
In [111]:
s
Out[111]:
In [113]:
s.args[0].dom
Out[113]:
In [115]:
s.args[0].cod
Out[115]:
In [ ]:
s.simplify
In [81]:
m
Out[81]:
In [82]:
m.prova = ['a','b']
In [83]:
m.prova
Out[83]:
In [84]:
s = sympify("m * m.T", locals={'m':m}, evaluate=False)
In [85]:
s
Out[85]:
In [86]:
s.args[0]
Out[86]:
In [87]:
s.args[0].prova
In [ ]: