Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
b2program
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
general
stups
b2program
Commits
8056780e
Commit
8056780e
authored
Feb 9, 2021
by
Chris
Browse files
Options
Downloads
Patches
Plain Diff
Update for Performance and fixed indentation
parent
9b04a774
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
btypes_primitives/src/main/python_magicstack_immutable/btypes/BRelation.py
+708
-754
708 additions, 754 deletions
.../src/main/python_magicstack_immutable/btypes/BRelation.py
with
708 additions
and
754 deletions
btypes_primitives/src/main/python_magicstack_immutable/btypes/BRelation.py
+
708
−
754
View file @
8056780e
...
@@ -5,7 +5,6 @@ from btypes.BTuple import *
...
@@ -5,7 +5,6 @@ from btypes.BTuple import *
from
btypes.BSet
import
*
from
btypes.BSet
import
*
import
immutables
import
immutables
from
copy
import
deepcopy
from
functools
import
reduce
from
functools
import
reduce
import
random
import
random
...
@@ -24,8 +23,8 @@ class BRelation:
...
@@ -24,8 +23,8 @@ class BRelation:
value
=
e
.
projection2
()
value
=
e
.
projection2
()
_set
=
self
.
map
.
get
(
key
)
_set
=
self
.
map
.
get
(
key
)
if
not
_set
:
if
not
_set
:
_set
=
frozenset
()
_set
=
immutables
.
Map
()
_set
=
_set
.
union
({
value
}
)
_set
=
_set
.
set
(
value
,
value
)
self
.
map
=
self
.
map
.
set
(
key
,
_set
)
self
.
map
=
self
.
map
.
set
(
key
,
_set
)
@staticmethod
@staticmethod
...
@@ -36,10 +35,10 @@ class BRelation:
...
@@ -36,10 +35,10 @@ class BRelation:
value
=
e
.
projection2
()
value
=
e
.
projection2
()
_range
=
result_map
.
get
(
key
,
None
)
_range
=
result_map
.
get
(
key
,
None
)
if
_range
is
None
:
if
_range
is
None
:
_range
=
{
value
}
_range
=
immutables
.
Map
({
value
:
value
})
result_map
=
result_map
.
set
(
key
,
_range
)
result_map
=
result_map
.
set
(
key
,
_range
)
else
:
else
:
_range
=
_range
.
union
(
frozen
set
(
[
value
])
)
_range
=
_range
.
set
(
value
,
value
)
result_map
=
result_map
.
set
(
key
,
_range
)
result_map
=
result_map
.
set
(
key
,
_range
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
...
@@ -57,71 +56,60 @@ class BRelation:
...
@@ -57,71 +56,60 @@ class BRelation:
return
self
.
__eq__
(
other
)
return
self
.
__eq__
(
other
)
def
__hash__
(
self
):
def
__hash__
(
self
):
return
hash
(
frozenset
(
self
.
map
)
)
return
hash
(
self
.
map
)
def
intersect
(
self
,
relation
:
'
BRelation
'
)
->
'
BRelation
'
:
def
intersect
(
self
,
relation
:
'
BRelation
'
)
->
'
BRelation
'
:
this_map
=
self
.
map
other_map
=
relation
.
map
other_map
=
relation
.
map
other_domain
=
set
(
relation
.
map
.
keys
())
# Remove all elements not in other domain
this_domain
=
set
(
self
.
map
.
keys
())
result_map
=
reduce
(
lambda
current_map
,
el
:
current_map
.
delete
(
el
)
if
el
not
in
other_map
else
current_map
,
intersection_domain
=
this_domain
.
intersection
(
other_domain
)
this_map
,
this_map
)
difference_domain
=
this_domain
.
difference
(
other_domain
)
# Trim range for all elements to match other range
for
obj
in
result_map
:
result_map
=
self
.
map
this_range
=
result_map
[
obj
]
for
obj
in
intersection_domain
:
other_range
=
other_map
[
obj
]
domain_element
=
obj
result_map
=
result_map
.
set
(
obj
,
reduce
(
this_range_set
=
self
.
map
[
domain_element
]
lambda
current_range
,
el
:
current_range
.
delete
(
el
)
if
el
not
in
other_range
else
current_range
,
other_range_set
=
other_map
[
domain_element
]
this_range
,
this_range
))
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
.
union
(
other_range_set
))
for
obj
in
difference_domain
:
domain_element
=
obj
result_map
=
result_map
.
delete
(
domain_element
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
difference
(
self
,
relation
:
'
BRelation
'
)
->
'
BRelation
'
:
def
difference
(
self
,
relation
:
'
BRelation
'
)
->
'
BRelation
'
:
this_map
=
self
.
map
other_map
=
relation
.
map
other_map
=
relation
.
map
other_domain
=
set
(
other_map
.
keys
())
# Remove all elements not in other domain
this_domain
=
set
(
self
.
map
.
keys
())
result_map
=
reduce
(
lambda
current_map
,
el
:
current_map
.
delete
(
el
)
if
el
not
in
other_map
else
current_map
,
difference_domain
=
this_domain
.
difference
(
other_domain
)
this_map
,
this_map
)
rest_domain
=
this_domain
.
difference
(
difference_domain
)
# Remove all elements in other range
for
obj
in
result_map
:
result_map
=
self
.
map
this_range
=
result_map
[
obj
]
for
obj
in
difference_domain
:
other_range
=
other_map
[
obj
]
domain_element
=
obj
result_map
=
result_map
.
set
(
obj
,
reduce
(
this_range_set
=
self
.
map
[
domain_element
]
lambda
current_range
,
el
:
current_range
.
delete
(
el
)
if
el
in
other_range
else
current_range
,
other_range_set
=
other_map
[
domain_element
]
this_range
,
this_range
))
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
.
difference
(
other_range_set
))
for
obj
in
rest_domain
:
domain_element
=
obj
result_map
=
result_map
.
delete
(
domain_element
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
union
(
self
,
relation
:
'
BRelation
'
)
->
'
BRelation
'
:
def
union
(
self
,
relation
:
'
BRelation
'
)
->
'
BRelation
'
:
other_map
=
relation
.
map
other_map
=
relation
.
map
other_domain
=
other_map
.
keys
()
result_map
=
self
.
map
for
domain_element
in
other_map
:
result_map
=
deepcopy
(
self
.
map
)
for
obj
in
other_domain
:
domain_element
=
obj
this_range_set
=
self
.
map
.
get
(
domain_element
)
this_range_set
=
self
.
map
.
get
(
domain_element
)
other_range_set
=
relation
.
map
.
get
(
domain_element
,
None
)
other_range_set
=
other_map
.
get
(
domain_element
,
None
)
if
other_range_set
is
None
:
continue
if
this_range_set
is
None
:
if
this_range_set
is
None
:
this_range_set
=
set
()
this_range_set
=
immutables
.
Map
()
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
.
union
(
other_range_set
))
for
element
in
other_range_set
:
this_range_set
=
this_range_set
.
set
(
element
,
element
)
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
size
(
self
)
->
'
int
'
:
def
size
(
self
)
->
'
int
'
:
size
=
0
size
=
0
this_domain
=
self
.
map
.
keys
()
this_map
=
self
.
map
for
obj
in
this_domain
:
for
domain_element
in
this_map
:
domain_element
=
obj
size
+=
len
(
this_map
[
domain_element
])
this_range_set
=
self
.
map
[
domain_element
]
size
+=
len
(
this_range_set
)
return
size
return
size
...
@@ -146,31 +134,29 @@ class BRelation:
...
@@ -146,31 +134,29 @@ class BRelation:
if
prj1
not
in
domain
:
if
prj1
not
in
domain
:
return
BBoolean
(
False
)
return
BBoolean
(
False
)
_range
=
self
.
map
[
prj1
]
return
BBoolean
(
prj2
in
domain
[
prj1
])
return
BBoolean
(
prj2
in
_range
)
def
notElementOf
(
self
,
obj
:
'
BTuple
'
)
->
'
BBoolean
'
:
def
notElementOf
(
self
,
obj
:
'
BTuple
'
)
->
'
BBoolean
'
:
prj1
=
obj
.
projection1
()
prj1
=
obj
.
projection1
()
prj2
=
obj
.
projection2
()
prj2
=
obj
.
projection2
()
domain
=
self
.
map
.
keys
()
domain
=
self
.
map
if
prj1
not
in
domain
:
if
prj1
not
in
domain
:
return
BBoolean
(
True
)
return
BBoolean
(
True
)
_range
=
self
.
map
[
prj1
]
return
BBoolean
(
prj2
not
in
domain
[
prj1
])
return
BBoolean
(
prj2
not
in
_range
)
def
relationImage
(
self
,
domain
:
'
BSet
'
)
->
'
BSet
'
:
def
relationImage
(
self
,
domain
:
'
BSet
'
)
->
'
BSet
'
:
result_set
=
set
()
result_set
=
immutables
.
Map
()
this_map
=
self
.
map
for
domain_element
in
domain
:
for
domain_element
in
domain
:
this_range_set
=
self
.
map
.
get
(
domain_element
)
this_range_set
=
this_
map
.
get
(
domain_element
)
if
this_range_set
is
None
:
if
this_range_set
is
None
:
continue
continue
result_set
=
result_set
.
union
(
this_range_set
)
for
element
in
this_range_set
:
return
BSet
(
*
result_set
)
result_set
=
result_set
.
set
(
element
,
element
)
return
BSet
(
result_set
)
def
functionCall
(
self
,
arg
):
def
functionCall
(
self
,
arg
):
_range
=
self
.
map
.
get
(
arg
)
_range
=
self
.
map
.
get
(
arg
)
...
@@ -183,7 +169,6 @@ class BRelation:
...
@@ -183,7 +169,6 @@ class BRelation:
def
pow
(
self
)
->
'
BSet
'
:
def
pow
(
self
)
->
'
BSet
'
:
this_map
=
self
.
map
this_map
=
self
.
map
this_domain
=
this_map
.
keys
()
start
=
BRelation
()
start
=
BRelation
()
queue
=
[
start
]
queue
=
[
start
]
...
@@ -191,11 +176,9 @@ class BRelation:
...
@@ -191,11 +176,9 @@ class BRelation:
while
not
len
(
queue
)
==
0
:
while
not
len
(
queue
)
==
0
:
current_set
=
queue
.
pop
(
0
)
current_set
=
queue
.
pop
(
0
)
for
e1
in
this_domain
:
for
domain_element
in
this_map
:
domain_element
=
e1
_range
=
this_map
[
domain_element
]
_range
=
this_map
[
domain_element
]
for
e2
in
_range
:
for
range_element
in
_range
:
range_element
=
e2
next_relation
=
current_set
.
union
(
BRelation
.
fromSet
(
BSet
(
BTuple
(
domain_element
,
range_element
))))
next_relation
=
current_set
.
union
(
BRelation
.
fromSet
(
BSet
(
BTuple
(
domain_element
,
range_element
))))
previous_size
=
result
.
size
()
previous_size
=
result
.
size
()
result
=
result
.
union
(
BSet
(
next_relation
))
result
=
result
.
union
(
BSet
(
next_relation
))
...
@@ -215,18 +198,16 @@ class BRelation:
...
@@ -215,18 +198,16 @@ class BRelation:
def
domain
(
self
)
->
'
BSet
'
:
def
domain
(
self
)
->
'
BSet
'
:
this_map
=
self
.
map
this_map
=
self
.
map
_set
=
self
.
map
.
keys
()
result_map
=
this_map
result_set
=
_set
for
domain_element
in
this_map
:
for
obj
in
_set
:
domain_element
=
obj
_range
=
this_map
[
domain_element
]
_range
=
this_map
[
domain_element
]
if
len
(
_range
)
==
0
:
if
len
(
_range
)
==
0
:
result_
set
=
result_
set
.
differenc
e
(
[
domain_element
]
)
result_
map
=
result_
map
.
delet
e
(
domain_element
)
return
BSet
(
*
list
(
result_
set
)
)
return
BSet
(
result_
map
)
def
_range
(
self
)
->
'
BSet
'
:
def
_range
(
self
)
->
'
BSet
'
:
_set
=
reduce
(
lambda
a
,
b
:
a
.
u
nion
(
b
),
self
.
map
.
values
(),
set
())
_range
=
reduce
(
lambda
a
,
b
:
a
.
u
pdate
(
b
),
self
.
map
.
values
(),
immutables
.
Map
())
return
BSet
(
*
list
(
_set
)
)
return
BSet
(
_range
)
def
inverse
(
self
)
->
'
BRelation
'
:
def
inverse
(
self
)
->
'
BRelation
'
:
this_map
=
self
.
map
this_map
=
self
.
map
...
@@ -240,59 +221,58 @@ class BRelation:
...
@@ -240,59 +221,58 @@ class BRelation:
range_element
=
e2
range_element
=
e2
current_range
=
result_map
.
get
(
range_element
)
current_range
=
result_map
.
get
(
range_element
)
if
current_range
is
None
:
if
current_range
is
None
:
current_range
=
set
()
current_range
=
immutables
.
Map
()
current_range
=
current_range
.
union
([
domain_element
]
)
current_range
=
current_range
.
set
(
domain_element
,
domain_element
)
result_map
=
result_map
.
set
(
range_element
,
current_range
)
result_map
=
result_map
.
set
(
range_element
,
current_range
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
domainRestriction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
def
domainRestriction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
_set
=
set
(
self
.
map
.
keys
())
other_set
=
arg
.
getSet
()
result_set
=
_set
.
difference
(
other_set
)
result_map
=
self
.
map
result_map
=
self
.
map
for
obj
in
result_set
:
for
obj
in
result_map
:
if
not
obj
in
arg
:
result_map
=
result_map
.
delete
(
obj
)
result_map
=
result_map
.
delete
(
obj
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
domainSubstraction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
def
domainSubstraction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
_set
=
self
.
map
.
keys
()
other_set
=
arg
.
getSet
()
result_map
=
self
.
map
result_map
=
self
.
map
for
obj
in
other_set
:
for
obj
in
arg
:
if
obj
in
result_map
:
if
obj
in
result_map
:
result_map
=
result_map
.
delete
(
obj
)
result_map
=
result_map
.
delete
(
obj
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
rangeRestriction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
def
rangeRestriction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
other_set
=
arg
.
getSet
()
other_set
=
arg
.
getSet
()
this_domain
=
self
.
map
.
keys
()
this_domain
=
self
.
map
result_map
=
self
.
map
result_map
=
self
.
map
for
obj
in
this_domain
:
for
domain_element
in
this_domain
:
domain_element
=
obj
this_range_set
=
self
.
map
[
domain_element
]
this_range_set
=
self
.
map
[
domain_element
]
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
.
intersection
(
other_set
))
# Intersection of sets
this_range_set
=
reduce
(
lambda
current_set
,
el
:
current_set
.
delete
(
el
)
if
el
not
in
other_set
else
current_set
,
this_range_set
,
this_range_set
)
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
rangeSubstraction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
def
rangeSubstraction
(
self
,
arg
:
'
BSet
'
)
->
'
BRelation
'
:
other_set
=
arg
.
getSet
()
other_set
=
arg
.
getSet
()
this_domain
=
self
.
map
.
keys
()
this_domain
=
self
.
map
result_map
=
self
.
map
result_map
=
self
.
map
for
obj
in
this_domain
:
for
domain_element
in
this_domain
:
domain_element
=
obj
this_range_set
=
self
.
map
[
domain_element
]
this_range_set
=
self
.
map
[
domain_element
]
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
.
difference
(
other_set
))
# Difference of sets
this_range_set
=
reduce
(
lambda
current_set
,
el
:
current_set
.
delete
(
el
)
if
el
in
this_range_set
else
current_set
,
other_set
,
this_range_set
)
result_map
=
result_map
.
set
(
domain_element
,
this_range_set
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
override
(
self
,
arg
:
'
BRelation
'
)
->
'
BRelation
'
:
def
override
(
self
,
arg
:
'
BRelation
'
)
->
'
BRelation
'
:
other_map
=
arg
.
map
other_map
=
arg
.
map
other_domain
=
other_map
.
keys
()
result_map
=
self
.
map
result_map
=
self
.
map
for
obj
in
other_domain
:
domain_element
=
obj
for
domain_element
in
other_map
:
_range
=
other_map
[
domain_element
]
_range
=
other_map
[
domain_element
]
result_map
=
result_map
.
set
(
domain_element
,
_range
)
result_map
=
result_map
.
set
(
domain_element
,
_range
)
...
@@ -309,7 +289,7 @@ class BRelation:
...
@@ -309,7 +289,7 @@ class BRelation:
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
i
in
map
(
BInteger
,
range
(
1
,
size
.
intValue
()
+
1
)):
for
i
in
map
(
BInteger
,
range
(
1
,
size
.
intValue
()
+
1
)):
range_element
=
self
.
functionCall
(
size
.
minus
(
i
).
succ
())
range_element
=
self
.
functionCall
(
size
.
minus
(
i
).
succ
())
result_map
=
result_map
.
set
(
i
,
frozenset
([
range_element
]
))
result_map
=
result_map
.
set
(
i
,
immutables
.
Map
({
range_element
:
range_element
}
))
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
front
(
self
)
->
'
BRelation
'
:
def
front
(
self
)
->
'
BRelation
'
:
...
@@ -320,7 +300,7 @@ class BRelation:
...
@@ -320,7 +300,7 @@ class BRelation:
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
i
in
map
(
BInteger
,
range
(
2
,
size
+
1
)):
for
i
in
map
(
BInteger
,
range
(
2
,
size
+
1
)):
range_element
=
self
.
functionCall
(
i
)
range_element
=
self
.
functionCall
(
i
)
result_map
=
result_map
.
set
(
i
.
pred
(),
frozenset
([
range_element
]
))
result_map
=
result_map
.
set
(
i
.
pred
(),
immutables
.
Map
({
range_element
:
range_element
}
))
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
take
(
self
,
n
:
'
BInteger
'
)
->
'
BRelation
'
:
def
take
(
self
,
n
:
'
BInteger
'
)
->
'
BRelation
'
:
...
@@ -347,7 +327,6 @@ class BRelation:
...
@@ -347,7 +327,6 @@ class BRelation:
result_map
=
self
.
map
result_map
=
self
.
map
other_map
=
arg
.
map
other_map
=
arg
.
map
size
=
self
.
card
()
size
=
self
.
card
()
i
:
BInteger
for
i
in
map
(
BInteger
,
range
(
1
,
arg
.
_size
().
intValue
()
+
1
)):
for
i
in
map
(
BInteger
,
range
(
1
,
arg
.
_size
().
intValue
()
+
1
)):
result_map
=
result_map
.
set
(
size
.
plus
(
i
),
other_map
[
i
])
result_map
=
result_map
.
set
(
size
.
plus
(
i
),
other_map
[
i
])
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
...
@@ -361,7 +340,7 @@ class BRelation:
...
@@ -361,7 +340,7 @@ class BRelation:
def
append
(
self
,
arg
)
->
'
BRelation
'
:
def
append
(
self
,
arg
)
->
'
BRelation
'
:
result_map
=
self
.
map
result_map
=
self
.
map
result_map
=
result_map
.
set
(
self
.
card
().
succ
(),
frozenset
([
arg
]
))
result_map
=
result_map
.
set
(
self
.
card
().
succ
(),
immutables
.
Map
({
arg
:
arg
}
))
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
prepend
(
self
,
arg
)
->
'
BRelation
'
:
def
prepend
(
self
,
arg
)
->
'
BRelation
'
:
...
@@ -370,54 +349,44 @@ class BRelation:
...
@@ -370,54 +349,44 @@ class BRelation:
size
=
self
.
_size
().
intValue
()
size
=
self
.
_size
().
intValue
()
for
i
in
map
(
BInteger
,
range
(
1
,
size
+
1
)):
for
i
in
map
(
BInteger
,
range
(
1
,
size
+
1
)):
result_map
=
result_map
.
set
(
i
.
succ
(),
this_map
.
get
(
i
))
result_map
=
result_map
.
set
(
i
.
succ
(),
this_map
.
get
(
i
))
result_map
=
result_map
.
set
(
BInteger
(
1
),
frozenset
([
arg
]
))
result_map
=
result_map
.
set
(
BInteger
(
1
),
immutables
.
Map
({
arg
:
arg
}
))
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
directProduct
(
self
,
arg
:
'
BRelation
'
)
->
'
BRelation
'
:
def
directProduct
(
self
,
arg
:
'
BRelation
'
)
->
'
BRelation
'
:
this_map
=
self
.
map
this_map
=
self
.
map
this_domain
=
this_map
.
keys
()
other_map
=
arg
.
map
other_map
=
arg
.
map
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
obj
in
this_domain
:
for
domain_element
in
this_map
:
domain_element
=
obj
other_range
=
other_map
.
get
(
domain_element
)
this_range
=
this_map
.
get
(
domain_element
,
None
)
other_range
=
other_map
.
get
(
domain_element
,
None
)
if
other_range
is
None
:
if
other_range
is
None
:
continue
continue
result_range
=
set
()
this_range
=
this_map
.
get
(
domain_element
)
result_range
=
immutables
.
Map
()
for
lhs
in
this_range
:
for
lhs
in
this_range
:
for
rhs
in
other_range
:
for
rhs
in
other_range
:
lhs_element
=
lhs
_tuple
=
BTuple
(
lhs
,
rhs
)
rhs_element
=
rhs
result_range
=
result_range
.
set
(
_tuple
,
_tuple
)
result_range
=
result_range
.
union
([
BTuple
(
lhs_element
,
rhs_element
)])
result_map
=
result_map
.
set
(
domain_element
,
result_range
)
result_map
=
result_map
.
set
(
domain_element
,
result_range
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
parallelProduct
(
self
,
arg
:
'
BRelation
'
)
->
'
BRelation
'
:
def
parallelProduct
(
self
,
arg
:
'
BRelation
'
)
->
'
BRelation
'
:
this_map
=
self
.
map
this_map
=
self
.
map
this_domain
=
this_map
.
keys
()
other_map
=
arg
.
map
other_map
=
arg
.
map
other_domain
=
other_map
.
keys
()
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
domain_elementThis
in
this_domain
:
for
domain_elementThis
in
this_map
:
for
domaineElementOther
in
other_domain
:
for
domaineElementOther
in
other_map
:
domain_element_this_element
=
domain_elementThis
domain_element_other_element
=
domaineElementOther
this_range
=
this_map
[
domain_element_this_element
]
this_range
=
this_map
[
domain_elementThis
]
other_range
=
other_map
[
domain_element_other_element
]
other_range
=
other_map
[
domaineElementOther
]
result_range
=
immutables
.
Map
()
result_range
=
set
()
for
lhs
in
this_range
:
for
lhs
in
this_range
:
for
rhs
in
other_range
:
for
rhs
in
other_range
:
lhs_element
=
lhs
pair_tuple
=
BTuple
(
lhs
,
rhs
)
rhs_element
=
rhs
result_range
=
result_range
.
set
(
pair_tuple
,
pair_tuple
)
result_range
=
result_range
.
union
([
BTuple
(
lhs_element
,
rhs_element
)])
_tuple
=
BTuple
(
domain_elementThis
,
domaineElementOther
)
_tuple
=
BTuple
(
domain_element_this_element
,
domain_element_other_element
)
result_map
=
result_map
.
set
(
_tuple
,
result_range
)
result_map
=
result_map
.
set
(
_tuple
,
result_range
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
...
@@ -425,51 +394,46 @@ class BRelation:
...
@@ -425,51 +394,46 @@ class BRelation:
this_map
=
self
.
map
this_map
=
self
.
map
other_map
=
arg
.
map
other_map
=
arg
.
map
this_domain
=
this_map
.
keys
()
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
e1
in
this_domain
:
for
domain_element
in
this_map
:
domain_element
=
e1
_range
=
this_map
[
domain_element
]
_range
=
this_map
[
domain_element
]
_set
=
set
()
_set
=
immutables
.
Map
()
for
e2
in
_range
:
for
range_element
in
_range
:
range_element
=
e2
union_element
=
other_map
.
get
(
range_element
)
union_element
=
other_map
.
get
(
range_element
)
if
union_element
is
None
:
if
union_element
is
None
:
union_element
=
set
()
continue
_set
=
_set
.
union
(
union_element
)
for
element
in
union_element
:
_set
=
_set
.
set
(
element
,
element
)
result_map
=
result_map
.
set
(
domain_element
,
_set
)
result_map
=
result_map
.
set
(
domain_element
,
_set
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
iterate
(
self
,
n
:
'
BInteger
'
)
->
'
BRelation
'
:
def
iterate
(
self
,
n
:
'
BInteger
'
)
->
'
BRelation
'
:
this_relation
=
self
this_relation
=
self
result
=
self
.
identity
(
self
.
domain
())
result
=
self
.
identity
(
self
.
domain
())
for
_
in
map
(
BInteger
,
range
(
1
,
n
.
intValue
()
+
1
)
)
:
for
_
in
range
(
1
,
n
.
intValue
()
+
1
):
result
=
result
.
union
(
result
.
composition
(
this_relation
))
result
=
result
.
union
(
result
.
composition
(
this_relation
))
return
result
return
result
def
closure
(
self
)
->
'
BRelation
'
:
def
closure
(
self
)
->
'
BRelation
'
:
this_relation
=
self
result
=
self
.
identity
(
self
.
domain
())
result
=
self
.
identity
(
self
.
domain
())
next_result
=
result
.
composition
(
this_relation
)
next_result
=
result
.
composition
(
self
)
while
True
:
while
True
:
last_result
=
deepcopy
(
result
)
last_result
=
result
result
=
result
.
union
(
next_result
)
result
=
result
.
union
(
next_result
)
next_result
=
result
.
composition
(
this_relation
)
next_result
=
result
.
composition
(
self
)
if
result
.
equal
(
last_result
).
booleanValue
():
if
result
.
equal
(
last_result
).
booleanValue
():
break
break
return
result
return
result
def
closure1
(
self
)
->
'
BRelation
'
:
def
closure1
(
self
)
->
'
BRelation
'
:
this_relation
=
self
result
=
self
result
=
self
next_result
=
result
.
composition
(
this_relation
)
next_result
=
result
.
composition
(
self
)
while
True
:
while
True
:
last_result
=
deepcopy
(
result
)
last_result
=
result
result
=
result
.
union
(
next_result
)
result
=
result
.
union
(
next_result
)
next_result
=
result
.
composition
(
this_relation
)
next_result
=
result
.
composition
(
self
)
if
result
.
equal
(
last_result
).
booleanValue
():
if
result
.
equal
(
last_result
).
booleanValue
():
break
break
return
result
return
result
...
@@ -480,13 +444,11 @@ class BRelation:
...
@@ -480,13 +444,11 @@ class BRelation:
arg_set_2
=
arg2
.
getSet
()
arg_set_2
=
arg2
.
getSet
()
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
e1
in
arg_set_1
:
for
element1
in
arg_set_1
:
for
e2
in
arg_set_2
:
element1_tuple
=
immutables
.
Map
({
element1
:
element1
})
element1
=
e1
for
element2
in
arg_set_2
:
element2
=
e2
_tuple
=
BTuple
(
element1
,
element2
)
_tuple
=
BTuple
(
element1
,
element2
)
result_map
=
result_map
.
set
(
_tuple
,
frozenset
([
element1
])
)
result_map
=
result_map
.
set
(
_tuple
,
element1
_tuple
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
@staticmethod
@staticmethod
...
@@ -495,13 +457,11 @@ class BRelation:
...
@@ -495,13 +457,11 @@ class BRelation:
arg_set_2
=
arg2
.
getSet
()
arg_set_2
=
arg2
.
getSet
()
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
e1
in
arg_set_1
:
for
element2
in
arg_set_2
:
for
e2
in
arg_set_2
:
element2_tuple
=
immutables
.
Map
({
element2
:
element2
})
element1
=
e1
for
element1
in
arg_set_1
:
element2
=
e2
_tuple
=
BTuple
(
element1
,
element2
)
_tuple
=
BTuple
(
element1
,
element2
)
result_map
=
result_map
.
set
(
_tuple
,
frozenset
([
element2
])
)
result_map
=
result_map
.
set
(
_tuple
,
element2
_tuple
)
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
fnc
(
self
)
->
'
BRelation
'
:
def
fnc
(
self
)
->
'
BRelation
'
:
...
@@ -509,11 +469,10 @@ class BRelation:
...
@@ -509,11 +469,10 @@ class BRelation:
domain
=
self
.
domain
().
getSet
()
domain
=
self
.
domain
().
getSet
()
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
e
in
domain
:
for
domain_element
in
domain
:
domain_element
=
e
_range
=
this_map
[
domain_element
]
_range
=
this_map
[
e
]
range_set
=
BSet
(
_range
)
range_set
=
BSet
(
_range
)
result_map
=
result_map
.
set
(
domain_element
,
frozen
set
([
range_set
]
))
result_map
=
result_map
.
set
(
domain_element
,
immutables
.
Map
({
range_
set
:
range_set
}
))
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
rel
(
self
)
->
'
BRelation
'
:
def
rel
(
self
)
->
'
BRelation
'
:
...
@@ -530,7 +489,7 @@ class BRelation:
...
@@ -530,7 +489,7 @@ class BRelation:
def
identity
(
arg
:
'
BSet
'
)
->
'
BRelation
'
:
def
identity
(
arg
:
'
BSet
'
)
->
'
BRelation
'
:
result_map
=
immutables
.
Map
()
result_map
=
immutables
.
Map
()
for
e
in
arg
:
for
e
in
arg
:
result_map
=
result_map
.
set
(
e
,
frozenset
([
e
]
))
result_map
=
result_map
.
set
(
e
,
immutables
.
Map
({
e
:
e
}
))
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
@staticmethod
@staticmethod
...
@@ -541,12 +500,10 @@ class BRelation:
...
@@ -541,12 +500,10 @@ class BRelation:
return
BRelation
(
result_map
)
return
BRelation
(
result_map
)
def
nondeterminism
(
self
)
->
'
BTuple
'
:
def
nondeterminism
(
self
)
->
'
BTuple
'
:
domain
=
self
.
map
.
keys
()
index
=
random
.
choice
(
range
(
len
(
self
.
map
)))
index
=
random
.
choice
(
range
(
len
(
domain
)))
i
=
0
i
=
0
domain_element
=
None
domain_element
=
None
for
obj
in
domain
:
for
obj
in
self
.
map
:
if
i
==
index
:
if
i
==
index
:
domain_element
=
obj
domain_element
=
obj
break
break
...
@@ -713,14 +670,14 @@ class BRelation:
...
@@ -713,14 +670,14 @@ class BRelation:
return
BBoolean
(
False
)
return
BBoolean
(
False
)
def
isInjection
(
self
)
->
'
BBoolean
'
:
def
isInjection
(
self
)
->
'
BBoolean
'
:
visited
=
set
()
visited
=
immutables
.
Map
()
for
element
in
self
.
domain
():
for
element
in
self
.
domain
():
_range
=
self
.
map
[
element
]
_range
=
self
.
map
[
element
]
for
e
in
_range
:
for
e
in
_range
:
range_element
=
e
range_element
=
e
if
range_element
in
visited
:
if
range_element
in
visited
:
return
BBoolean
(
False
)
return
BBoolean
(
False
)
visited
=
visited
.
union
([
range_element
]
)
visited
=
visited
.
set
(
range_element
,
range_element
)
return
BBoolean
(
True
)
return
BBoolean
(
True
)
def
isBijection
(
self
,
_range
:
'
BSet
'
):
def
isBijection
(
self
,
_range
:
'
BSet
'
):
...
@@ -744,17 +701,14 @@ class BRelation:
...
@@ -744,17 +701,14 @@ class BRelation:
def
__str__
(
self
)
->
'
str
'
:
def
__str__
(
self
)
->
'
str
'
:
this_map
=
self
.
map
this_map
=
self
.
map
domain
=
this_map
.
keys
()
size
=
self
.
size
()
size
=
self
.
size
()
i
=
0
i
=
0
sb
=
"
{
"
sb
=
"
{
"
for
e1
in
domain
:
for
domain_element
in
this_map
:
domain_element
=
e1
_range
=
this_map
[
domain_element
]
_range
=
this_map
[
domain_element
]
for
e2
in
_range
:
for
range_element
in
_range
:
range_element
=
e2
sb
+=
"
(
"
sb
+=
"
(
"
sb
+=
str
(
domain_element
)
sb
+=
str
(
domain_element
)
sb
+=
"
|->
"
sb
+=
"
|->
"
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment