quoracle/examples/paper.py

91 lines
2.9 KiB
Python
Raw Normal View History

2021-02-03 07:03:57 +00:00
from quorums import *
import datetime
def main() -> None:
# The basics.
a, b, c = Node('a'), Node('b'), Node('c')
majority = QuorumSystem(reads=a*b + b*c + a*c)
print(majority.resilience()) # 1
print(majority.capacity(read_fraction=1)) # 1.5
print()
# Different capacities
a, b = Node('a', capacity=100), Node('b', capacity=100)
c, d = Node('c', capacity=50), Node('d', capacity=50)
grid = QuorumSystem(reads=a*b + c*d)
print(grid.capacity(read_fraction=1)) # 150
print()
# Different read and write capacities.
a = Node('a', write_capacity=100, read_capacity=200)
b = Node('b', write_capacity=100, read_capacity=200)
c = Node('c', write_capacity=50, read_capacity=100)
d = Node('d', write_capacity=50, read_capacity=100)
grid = QuorumSystem(reads=a*b + c*d)
print(grid.capacity(read_fraction=1)) # 300
print(grid.capacity(read_fraction=0.5)) # 200
print(grid.capacity(read_fraction=0)) # 100
print()
# Workload distribution.
grid = QuorumSystem(reads=a*b + c*d)
print(grid.capacity(read_fraction={0.9: 75, 0.5: 25})) # 229
print()
# f-resilient strategies.
grid = QuorumSystem(reads=a*b + c*d)
choose2 = QuorumSystem(reads=choose(2, [a, b, c, d]))
print(grid.capacity(read_fraction=1)) # 300
print(choose2.capacity(read_fraction=1)) # 300
print(grid.capacity(read_fraction=1, f=1)) # 100
print(choose2.capacity(read_fraction=1, f=1)) # 200
print(choose2.strategy(read_fraction=1, f=1)) # abd: 0.5, abc: 0.5
print()
# Network load and latency.
def seconds(n: int) -> datetime.timedelta:
return datetime.timedelta(seconds=n)
a = Node('a', write_capacity=100, read_capacity=200, latency=seconds(4))
b = Node('b', write_capacity=100, read_capacity=200, latency=seconds(4))
c = Node('c', write_capacity=50, read_capacity=100, latency=seconds(1))
d = Node('d', write_capacity=50, read_capacity=100, latency=seconds(1))
grid = QuorumSystem(reads=a*b + c*d)
sigma = grid.strategy(read_fraction=1)
print(sigma.capacity(read_fraction=1)) # 300
print(sigma.network_load(read_fraction=1)) # 2
print(sigma.latency(read_fraction=1)) # 3 seconds
print(grid.strategy(
read_fraction = 1,
optimize = 'latency',
load_limit = 1 / 150,
network_limit = 2,
)) # ab: 1/3, cd: 2/3
print()
# Search.
qs = search(
nodes = [a, b, c, d],
read_fraction = 1,
optimize = 'latency',
load_limit = 1 / 150,
network_limit = 2,
# timeout = seconds(3),
)
print(qs) # a + b + c + d
sigma = qs.strategy(
read_fraction = 1,
optimize = 'latency',
load_limit = 1 / 150,
network_limit = 2,
)
print(sigma) # c: 1/3 d: 2/3
print(sigma.capacity(read_fraction=1)) # 150
print(sigma.network_load(read_fraction=1)) # 1
print(sigma.latency(read_fraction=1)) # 1
if __name__ == '__main__':
main()