Module pyqec.experiments

Expand source code
from math import sqrt

class Statistics:
    def __init__(self):
        self.number_of_successes = 0
        self.number_of_failures = 0

    def add_failure(self):
        self.number_of_failures += 1

    def add_success(self):
        self.number_of_successes += 1

    def sample_size(self):
        return self.number_of_failures + self.number_of_successes

    def failure_rate(self):
        return self.number_of_failures / self.sample_size()

    def success_rate(self):
        return self.number_of_successes / self.sample_size()

    def uncertainty(self):
        assert(self.sample_size != 0)
        return sqrt(
            self.failure_rate() 
            * self.success_rate() 
            / self.sample_size()
        )


class ClassicalExperiment:
    def __init__(self, code, decoder, noise):
        self.code = code
        self.decoder = decoder
        self.noise = noise

    def run_once(self):
        error = self.noise.sample_error_of_length(self.code.block_size())
        correction = self.decoder.decode(error)
        return error == correction

    def run_while(self, condition):
        stats = Statistics()
        while condition(stats):
            if self.run_once():
                stats.add_success()
            else:
                stats.add_failure()
        return stats

    def run_n_times(self, number_of_iterations):
        self.run_while(lambda s: s.sample_size() < number_of_iterations)

Classes

class ClassicalExperiment (code, decoder, noise)
Expand source code
class ClassicalExperiment:
    def __init__(self, code, decoder, noise):
        self.code = code
        self.decoder = decoder
        self.noise = noise

    def run_once(self):
        error = self.noise.sample_error_of_length(self.code.block_size())
        correction = self.decoder.decode(error)
        return error == correction

    def run_while(self, condition):
        stats = Statistics()
        while condition(stats):
            if self.run_once():
                stats.add_success()
            else:
                stats.add_failure()
        return stats

    def run_n_times(self, number_of_iterations):
        self.run_while(lambda s: s.sample_size() < number_of_iterations)

Methods

def run_n_times(self, number_of_iterations)
Expand source code
def run_n_times(self, number_of_iterations):
    self.run_while(lambda s: s.sample_size() < number_of_iterations)
def run_once(self)
Expand source code
def run_once(self):
    error = self.noise.sample_error_of_length(self.code.block_size())
    correction = self.decoder.decode(error)
    return error == correction
def run_while(self, condition)
Expand source code
def run_while(self, condition):
    stats = Statistics()
    while condition(stats):
        if self.run_once():
            stats.add_success()
        else:
            stats.add_failure()
    return stats
class Statistics
Expand source code
class Statistics:
    def __init__(self):
        self.number_of_successes = 0
        self.number_of_failures = 0

    def add_failure(self):
        self.number_of_failures += 1

    def add_success(self):
        self.number_of_successes += 1

    def sample_size(self):
        return self.number_of_failures + self.number_of_successes

    def failure_rate(self):
        return self.number_of_failures / self.sample_size()

    def success_rate(self):
        return self.number_of_successes / self.sample_size()

    def uncertainty(self):
        assert(self.sample_size != 0)
        return sqrt(
            self.failure_rate() 
            * self.success_rate() 
            / self.sample_size()
        )

Methods

def add_failure(self)
Expand source code
def add_failure(self):
    self.number_of_failures += 1
def add_success(self)
Expand source code
def add_success(self):
    self.number_of_successes += 1
def failure_rate(self)
Expand source code
def failure_rate(self):
    return self.number_of_failures / self.sample_size()
def sample_size(self)
Expand source code
def sample_size(self):
    return self.number_of_failures + self.number_of_successes
def success_rate(self)
Expand source code
def success_rate(self):
    return self.number_of_successes / self.sample_size()
def uncertainty(self)
Expand source code
def uncertainty(self):
    assert(self.sample_size != 0)
    return sqrt(
        self.failure_rate() 
        * self.success_rate() 
        / self.sample_size()
    )