Skip to content
Snippets Groups Projects
Commit 8056780e authored by Chris's avatar Chris
Browse files

Update for Performance and fixed indentation

parent 9b04a774
No related branches found
No related tags found
No related merge requests found
...@@ -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(frozenset([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.difference([domain_element]) result_map = result_map.delete(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.union(b), self.map.values(), set()) _range = reduce(lambda a, b: a.update(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, frozenset([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 += " |-> "
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment