Module turingmachine.alphabetgenerator

Module for generating names for Turing machine conditions

Expand source code
"""Module for generating names for Turing machine conditions"""

import itertools
import re
import string


class AlphabetError(Exception):
    """Base exception class for this module"""

    pass


class NotAllowedName(AlphabetError):
    """Raise this exception when the name is
    starting with numbers or special symbols,
    not with a latin letter"""

    def __init__(self, name):
        self.name = name
        super().__init__(self.__str__())

    def __str__(self):
        msg = "Disallowed name: {!r}"
        return msg.format(self.name)


class NameTemplate:
    """Class for generating new condition name based on
    a given symbol.

    Example:
        given 'q32' generated item will be q33
        given 'q' generated item will be q1
    """

    reg = re.compile(r'([a-zA-z]+)([0-9]*)')

    def __init__(self, name):
        match = re.match(self.reg, name)
        if match:
            count = match.group(2)
            self.counter = int(count) if count else 0
            self.letter = match.group(1)
        else:
            raise NotAllowedName(name)
        self.it = self.iterate()

    def __eq__(self, other):
        return all((
            self.counter == other.counter,
            self.letter == other.letter
            ))

    def __repr__(self):
        s = "NameTemplate(\nCounter: \n{}\nLetter: \n{}\n)"

        return s.format(self.counter, self.letter)

    __str__ = __repr__

    def iterate(self):
        while True:
            self.counter += 1
            yield self.letter + str(self.counter)

    def get_reserved(self):
        for i in range(self.counter + 1):
            yield self.letter + str(i)
        yield self.letter


class AlphabetGenerator:
    """Class for generating short, unique condition strings
    to work with in a TuringMachineMacro"""

    def __init__(self, alphabet=None, gen=None):
        if alphabet is None:
            self.alphabet = string.ascii_lowercase + string.digits
        else:
            self.alphabet = alphabet

        self.it = self._get_letter()

        self.templates = {}
        self.reserved = set()
        if gen is not None:
            self.set_template(gen)
        else:
            self.it = self._get_letter()

    def __eq__(self, other):
        return all((
            self.reserved == other.reserved,
            self.templates == other.templates,
            self.alphabet == other.alphabet
            ))

    def __repr__(self):
        s = "AlphabetGenerator(\nAlphabet: \n{}\nReserved: \n{}\nTemplates: \n{}\n)"
        return s.format(self.alphabet, self.reserved, self.templates)

    __str__ = __repr__

    def set_template(self, name):
        """Set a new template, or continue if
        it already exists"""

        temp = NameTemplate(name)
        name = temp.letter

        if name not in self.templates:
            self.templates[name] = temp

        self.it = self.templates[name].iterate()
        self.reserved.update(set(temp.get_reserved()))

    def del_template(self):
        """Set template to default generator"""

        self.it = self._get_letter()

    cur_template = property(None, set_template, del_template)

    def _get_letter(self):
        """Generate all possible products of all possible symbols,
        that doesn't start with a number
        """

        for i in range(1, len(self.alphabet)):  # error with the same names
            for elem in map(
                    lambda x: ''.join(x),
                    filter(
                        lambda x: x[0] not in string.digits,
                        itertools.product(self.alphabet, repeat=i)
                        )
                    ):
                    yield elem

    def pop(self):
        while True:
            res = next(self.it)
            if res not in self.reserved:
                self.reserved.add(res)
                return res

Classes

class AlphabetError (*args, **kwargs)

Base exception class for this module

Expand source code
class AlphabetError(Exception):
    """Base exception class for this module"""

    pass

Ancestors

  • builtins.Exception
  • builtins.BaseException

Subclasses

class AlphabetGenerator (alphabet=None, gen=None)

Class for generating short, unique condition strings to work with in a TuringMachineMacro

Expand source code
class AlphabetGenerator:
    """Class for generating short, unique condition strings
    to work with in a TuringMachineMacro"""

    def __init__(self, alphabet=None, gen=None):
        if alphabet is None:
            self.alphabet = string.ascii_lowercase + string.digits
        else:
            self.alphabet = alphabet

        self.it = self._get_letter()

        self.templates = {}
        self.reserved = set()
        if gen is not None:
            self.set_template(gen)
        else:
            self.it = self._get_letter()

    def __eq__(self, other):
        return all((
            self.reserved == other.reserved,
            self.templates == other.templates,
            self.alphabet == other.alphabet
            ))

    def __repr__(self):
        s = "AlphabetGenerator(\nAlphabet: \n{}\nReserved: \n{}\nTemplates: \n{}\n)"
        return s.format(self.alphabet, self.reserved, self.templates)

    __str__ = __repr__

    def set_template(self, name):
        """Set a new template, or continue if
        it already exists"""

        temp = NameTemplate(name)
        name = temp.letter

        if name not in self.templates:
            self.templates[name] = temp

        self.it = self.templates[name].iterate()
        self.reserved.update(set(temp.get_reserved()))

    def del_template(self):
        """Set template to default generator"""

        self.it = self._get_letter()

    cur_template = property(None, set_template, del_template)

    def _get_letter(self):
        """Generate all possible products of all possible symbols,
        that doesn't start with a number
        """

        for i in range(1, len(self.alphabet)):  # error with the same names
            for elem in map(
                    lambda x: ''.join(x),
                    filter(
                        lambda x: x[0] not in string.digits,
                        itertools.product(self.alphabet, repeat=i)
                        )
                    ):
                    yield elem

    def pop(self):
        while True:
            res = next(self.it)
            if res not in self.reserved:
                self.reserved.add(res)
                return res

Instance variables

var cur_template

Methods

def del_template(self)

Set template to default generator

Expand source code
def del_template(self):
    """Set template to default generator"""

    self.it = self._get_letter()
def pop(self)
Expand source code
def pop(self):
    while True:
        res = next(self.it)
        if res not in self.reserved:
            self.reserved.add(res)
            return res
def set_template(self, name)

Set a new template, or continue if it already exists

Expand source code
def set_template(self, name):
    """Set a new template, or continue if
    it already exists"""

    temp = NameTemplate(name)
    name = temp.letter

    if name not in self.templates:
        self.templates[name] = temp

    self.it = self.templates[name].iterate()
    self.reserved.update(set(temp.get_reserved()))
class NameTemplate (name)

Class for generating new condition name based on a given symbol.

Example

given 'q32' generated item will be q33 given 'q' generated item will be q1

Expand source code
class NameTemplate:
    """Class for generating new condition name based on
    a given symbol.

    Example:
        given 'q32' generated item will be q33
        given 'q' generated item will be q1
    """

    reg = re.compile(r'([a-zA-z]+)([0-9]*)')

    def __init__(self, name):
        match = re.match(self.reg, name)
        if match:
            count = match.group(2)
            self.counter = int(count) if count else 0
            self.letter = match.group(1)
        else:
            raise NotAllowedName(name)
        self.it = self.iterate()

    def __eq__(self, other):
        return all((
            self.counter == other.counter,
            self.letter == other.letter
            ))

    def __repr__(self):
        s = "NameTemplate(\nCounter: \n{}\nLetter: \n{}\n)"

        return s.format(self.counter, self.letter)

    __str__ = __repr__

    def iterate(self):
        while True:
            self.counter += 1
            yield self.letter + str(self.counter)

    def get_reserved(self):
        for i in range(self.counter + 1):
            yield self.letter + str(i)
        yield self.letter

Class variables

var reg

Compiled regular expression object.

Methods

def get_reserved(self)
Expand source code
def get_reserved(self):
    for i in range(self.counter + 1):
        yield self.letter + str(i)
    yield self.letter
def iterate(self)
Expand source code
def iterate(self):
    while True:
        self.counter += 1
        yield self.letter + str(self.counter)
class NotAllowedName (name)

Raise this exception when the name is starting with numbers or special symbols, not with a latin letter

Expand source code
class NotAllowedName(AlphabetError):
    """Raise this exception when the name is
    starting with numbers or special symbols,
    not with a latin letter"""

    def __init__(self, name):
        self.name = name
        super().__init__(self.__str__())

    def __str__(self):
        msg = "Disallowed name: {!r}"
        return msg.format(self.name)

Ancestors