Source code for pyinference.fuzzy.domain
# -*- coding: UTF-8 -*-
"""Модуль, описывающий различные типы носителей нечетких множеств, а также
реализующий функциональность нечетких правил логического вывода.
"""
import pyinference.fuzzy
[docs]class Domain(object):
"""Абстрактный класс, реализующий интерфейс носителя нечеткого множества.
Смысловую нагрузку несут подклассы этого класса,
представляющие различные виды носителей. Преимуществом такого подхода
является его универсальность: в качестве носителя при определении
нечеткого множества можно задавать действительный интервал,
целочисленный интервал, в принципе, любую итерируемую структуру.
"""
def __init__(self):
pass
def __iter__(self):
pass
[docs] def char(self):
for i in self:
print i
[docs] def card(self):
"""Cardinality of the domain
"""
pass
[docs]class RationalRange(Domain):
"""Данный класс реализует носитель нечеткого подмножества в виде отрезка действительной оси.
В качестве параметров конструктор класса
принимает значения начала и конца интервала, а также параметр "точность" -
целое число, определяющее количество проходов при расчете нечетких
функционалов численным методом. Это число является компромиссом между
точностью и скоростью подсчета, поэтому там, где это возможно,
численный расчет нечетких функционалов заменен аналитическими выражениями.
Синтаксис:
>>> B = RationalRange(end=3.0, acc=3)
>>> for i in B: print i
0.0
1.0
2.0
3.0
>>> B = RationalRange(end=3.0, acc=8)
>>> for i in B: print i
0.0
0.375
0.75
1.125
1.5
1.875
2.25
2.625
3.0
Attributes:
begin:
end:
acc:
"""
def __init__(self, begin=0.0, end=1.0, acc=pyinference.fuzzy.ACCURACY):
super(RationalRange, self).__init__()
self.begin = float(begin)
self.end = float(end)
self.acc = acc
def __iter__(self):
if self.begin == self.end:
for i in range(self.acc):
yield self.begin
else:
delta = (self.end - self.begin) / self.acc
i = self.begin
while i <= self.end:
yield i
i += delta
[docs] def card(self):
return len(self)
def __len__(self):
return self.end - self.begin
def __contains__(self, item):
if self.begin <= item <= self.end:
return True
return False
def __abs__(self):
return self.card()
[docs]class IntegerRange(RationalRange):
"""Класс, моделирующий носитель нечеткого множества в виде целочисленного интервала.
По сути, является частным случаем предыдущего класса
(см. :class:`RationalRange`), когда точность равна разнице границ интервала.
Синтаксис:
>>> B=IntegerRange(begin=0.0, end=3.0)
>>> for i in B: print i
0
1
2
3
Attributes:
begin
end
"""
def __init__(self, begin=1, end=100):
begin = int(begin)
end = int(end)
acc = end - begin or 1
super(IntegerRange, self).__init__(begin, end, acc)
self.begin = begin
self.end = end
def __contains__(self, item):
if int(item) == item and self.begin <= item <= self.end:
return True
return False