Module ortools_utils.model_indexation.obvious_conflict

Expand source code
from abc import abstractmethod, ABC
from typing import List, Tuple

from .constraints import ConstantConstraint


class ObviousConflict(ABC):
    DETECTED = 1
    TWO_CONSTANT_CONFLICT = 2
    ONE_CONSTANT_CONFLICT = 3
    BACKGROUND_CONSTANT_CONFLICT = 4

    @abstractmethod
    def write_conflict(self, model) -> List[str]:
        pass

    @abstractmethod
    def get(self) -> Tuple:
        pass


class ObviousConflictRaiseError(ObviousConflict):
    def __init__(self, expression, sentence):
        self.expression = expression
        self.sentence = sentence

    def write_conflict(self, model):
        return [self.sentence]

    def get(self):
        return ObviousConflict.DETECTED, self.expression

    def __eq__(self, b):
        if isinstance(b, ObviousConflictRaiseError):
            return self.expression == b.expression and self.sentence == b.sentence
        return NotImplemented


class ObviousConflictConstant(ObviousConflict):
    def __init__(self, c1: ConstantConstraint, c2: ConstantConstraint = None):
        self.c1 = c1
        self.c2 = c2

    @staticmethod
    def elegant_name(model, cc: ConstantConstraint):
        mes_dim = cc.dimensions()
        ma_clef = '-'
        for d in mes_dim:
            ma_clef = ma_clef + d + '-'

        nom_macroblock = cc.name_macroblock()
        my_sentence = None
        if model.dict_indexing().has_mb(nom_macroblock):
            my_sentence = model.dict_indexing().get_mb(nom_macroblock).get_explanation_for_key(ma_clef)

        if not my_sentence:
            name = nom_macroblock
            if len(mes_dim) > 0:
                name_dim = " ("
                for d in mes_dim:
                    name_dim = name_dim + d + "=" + str(cc.dim_value(d)) + ", "
                name_dim = name_dim[:-2] + ")"
                name = name + name_dim
            return name

        for d in mes_dim:
            dim_key = '{' + d + '}'
            my_sentence = my_sentence.replace(dim_key, str(cc.dim_value(d)))

        return my_sentence

    def write_conflict(self, model):
        if self.c2:
            return [self.elegant_name(model, self.c1), self.elegant_name(model, self.c2)]
        else:
            return [self.elegant_name(model, self.c1)]

    def get(self):
        if self.c2:
            return ObviousConflict.TWO_CONSTANT_CONFLICT, (self.c1, self.c2)
        else:
            return ObviousConflict.ONE_CONSTANT_CONFLICT, self.c1


class ObviousConflictBackground(ObviousConflict):
    def __init__(self, variable, val1, val2):
        self.v = variable
        self.val1 = val1
        self.val2 = val2

    def write_conflict(self, model):
        return ['La constante {} est définie deux fois dans les background blocks, une fois à {} et une fois à {}'.format(self.v, self.val1, self.val2)]

    def get(self):
        return ObviousConflict.BACKGROUND_CONSTANT_CONFLICT, (self.v, self.val1, self.val2)

Classes

class ObviousConflict

Helper class that provides a standard way to create an ABC using inheritance.

Expand source code
class ObviousConflict(ABC):
    DETECTED = 1
    TWO_CONSTANT_CONFLICT = 2
    ONE_CONSTANT_CONFLICT = 3
    BACKGROUND_CONSTANT_CONFLICT = 4

    @abstractmethod
    def write_conflict(self, model) -> List[str]:
        pass

    @abstractmethod
    def get(self) -> Tuple:
        pass

Ancestors

  • abc.ABC

Subclasses

Class variables

var BACKGROUND_CONSTANT_CONFLICT
var DETECTED
var ONE_CONSTANT_CONFLICT
var TWO_CONSTANT_CONFLICT

Methods

def get(self) ‑> Tuple[]
Expand source code
@abstractmethod
def get(self) -> Tuple:
    pass
def write_conflict(self, model) ‑> List[str]
Expand source code
@abstractmethod
def write_conflict(self, model) -> List[str]:
    pass
class ObviousConflictBackground (variable, val1, val2)

Helper class that provides a standard way to create an ABC using inheritance.

Expand source code
class ObviousConflictBackground(ObviousConflict):
    def __init__(self, variable, val1, val2):
        self.v = variable
        self.val1 = val1
        self.val2 = val2

    def write_conflict(self, model):
        return ['La constante {} est définie deux fois dans les background blocks, une fois à {} et une fois à {}'.format(self.v, self.val1, self.val2)]

    def get(self):
        return ObviousConflict.BACKGROUND_CONSTANT_CONFLICT, (self.v, self.val1, self.val2)

Ancestors

Methods

def get(self)
Expand source code
def get(self):
    return ObviousConflict.BACKGROUND_CONSTANT_CONFLICT, (self.v, self.val1, self.val2)
def write_conflict(self, model)
Expand source code
def write_conflict(self, model):
    return ['La constante {} est définie deux fois dans les background blocks, une fois à {} et une fois à {}'.format(self.v, self.val1, self.val2)]
class ObviousConflictConstant (c1: ConstantConstraint, c2: ConstantConstraint = None)

Helper class that provides a standard way to create an ABC using inheritance.

Expand source code
class ObviousConflictConstant(ObviousConflict):
    def __init__(self, c1: ConstantConstraint, c2: ConstantConstraint = None):
        self.c1 = c1
        self.c2 = c2

    @staticmethod
    def elegant_name(model, cc: ConstantConstraint):
        mes_dim = cc.dimensions()
        ma_clef = '-'
        for d in mes_dim:
            ma_clef = ma_clef + d + '-'

        nom_macroblock = cc.name_macroblock()
        my_sentence = None
        if model.dict_indexing().has_mb(nom_macroblock):
            my_sentence = model.dict_indexing().get_mb(nom_macroblock).get_explanation_for_key(ma_clef)

        if not my_sentence:
            name = nom_macroblock
            if len(mes_dim) > 0:
                name_dim = " ("
                for d in mes_dim:
                    name_dim = name_dim + d + "=" + str(cc.dim_value(d)) + ", "
                name_dim = name_dim[:-2] + ")"
                name = name + name_dim
            return name

        for d in mes_dim:
            dim_key = '{' + d + '}'
            my_sentence = my_sentence.replace(dim_key, str(cc.dim_value(d)))

        return my_sentence

    def write_conflict(self, model):
        if self.c2:
            return [self.elegant_name(model, self.c1), self.elegant_name(model, self.c2)]
        else:
            return [self.elegant_name(model, self.c1)]

    def get(self):
        if self.c2:
            return ObviousConflict.TWO_CONSTANT_CONFLICT, (self.c1, self.c2)
        else:
            return ObviousConflict.ONE_CONSTANT_CONFLICT, self.c1

Ancestors

Static methods

def elegant_name(model, cc: ConstantConstraint)
Expand source code
@staticmethod
def elegant_name(model, cc: ConstantConstraint):
    mes_dim = cc.dimensions()
    ma_clef = '-'
    for d in mes_dim:
        ma_clef = ma_clef + d + '-'

    nom_macroblock = cc.name_macroblock()
    my_sentence = None
    if model.dict_indexing().has_mb(nom_macroblock):
        my_sentence = model.dict_indexing().get_mb(nom_macroblock).get_explanation_for_key(ma_clef)

    if not my_sentence:
        name = nom_macroblock
        if len(mes_dim) > 0:
            name_dim = " ("
            for d in mes_dim:
                name_dim = name_dim + d + "=" + str(cc.dim_value(d)) + ", "
            name_dim = name_dim[:-2] + ")"
            name = name + name_dim
        return name

    for d in mes_dim:
        dim_key = '{' + d + '}'
        my_sentence = my_sentence.replace(dim_key, str(cc.dim_value(d)))

    return my_sentence

Methods

def get(self)
Expand source code
def get(self):
    if self.c2:
        return ObviousConflict.TWO_CONSTANT_CONFLICT, (self.c1, self.c2)
    else:
        return ObviousConflict.ONE_CONSTANT_CONFLICT, self.c1
def write_conflict(self, model)
Expand source code
def write_conflict(self, model):
    if self.c2:
        return [self.elegant_name(model, self.c1), self.elegant_name(model, self.c2)]
    else:
        return [self.elegant_name(model, self.c1)]
class ObviousConflictRaiseError (expression, sentence)

Helper class that provides a standard way to create an ABC using inheritance.

Expand source code
class ObviousConflictRaiseError(ObviousConflict):
    def __init__(self, expression, sentence):
        self.expression = expression
        self.sentence = sentence

    def write_conflict(self, model):
        return [self.sentence]

    def get(self):
        return ObviousConflict.DETECTED, self.expression

    def __eq__(self, b):
        if isinstance(b, ObviousConflictRaiseError):
            return self.expression == b.expression and self.sentence == b.sentence
        return NotImplemented

Ancestors

Methods

def get(self)
Expand source code
def get(self):
    return ObviousConflict.DETECTED, self.expression
def write_conflict(self, model)
Expand source code
def write_conflict(self, model):
    return [self.sentence]