diff --git a/PAMI/fuzzyFrequentPattern/basic/FFIMiner.py b/PAMI/fuzzyFrequentPattern/basic/FFIMiner.py index a56b8a51..660041f7 100644 --- a/PAMI/fuzzyFrequentPattern/basic/FFIMiner.py +++ b/PAMI/fuzzyFrequentPattern/basic/FFIMiner.py @@ -164,7 +164,7 @@ class FFIMiner(_ab._fuzzyFrequentPatterns): _memoryRSS = float() _sep = "\t" - def __init__(self, iFile: str, minSup: float, sep: str="\t") -> None: + def __init__(self, iFile: str, minSup: float, sep: str = "\t", k: int = 1) -> None: super().__init__(iFile, minSup, sep) self._Database = None self._startTime = 0 @@ -173,6 +173,7 @@ def __init__(self, iFile: str, minSup: float, sep: str="\t") -> None: self._minSup = minSup self._iFile = iFile self._sep = sep + self._k = k self._finalPatterns = {} self._memoryUSS = 0 self._memoryRSS = 0 @@ -219,7 +220,7 @@ def _creatingItemsets(self) -> None: except IOError: print("File Not Found") quit() - + def startMine(self): self.mine() @@ -243,7 +244,7 @@ def _convert(self, value) -> Union[int, float]: else: value = int(value) return value - + def dfs(self, cands): """ Perform depth-first search (DFS) to find frequent patterns in a database. @@ -296,6 +297,20 @@ def mine(self): items[item] = {} items[item][lineNo] = fuzzyValue + if self._k >= 1: + #default k = 1 (max cardinality) + labelsByBaseItem = {} + for label in items: + token = label[0] + baseItem = token.rsplit('.', 1)[0] if '.' in token else token + labelsByBaseItem.setdefault(baseItem,[]).append(label) + for baseItem,labels in labelsByBaseItem.items(): + if len(labels) <= self._k: + continue + ranked = sorted(labels, key=lambda lbl: sum(items[lbl].values()), reverse=True) + for lbl in ranked[self._k:]: + del items[lbl] + self._minSup = self._convert(self._minSup) self._Database = items.copy() diff --git a/PAMI/fuzzyGeoreferencedFrequentPattern/basic/FFSPMiner.py b/PAMI/fuzzyGeoreferencedFrequentPattern/basic/FFSPMiner.py index f1768146..df4f696e 100644 --- a/PAMI/fuzzyGeoreferencedFrequentPattern/basic/FFSPMiner.py +++ b/PAMI/fuzzyGeoreferencedFrequentPattern/basic/FFSPMiner.py @@ -278,13 +278,14 @@ class FFSPMiner(_ab._fuzzySpatialFrequentPatterns): _nFile = " " _sep = "\t" - def __init__(self, iFile: str, nFile: str, minSup: float, sep: str="\t") -> None: + def __init__(self, iFile: str, nFile: str, minSup: float, sep: str = "\t", k: int = 1) -> None: super().__init__(iFile, nFile, minSup, sep) self.oFile = None self._mapItemNeighbours = {} self._startTime = 0 self._endTime = 0 self._mapItemSum = {} + self._k = k self._joinsCnt = 0 self._BufferSize = 200 self._itemSetBuffer = [] @@ -446,6 +447,20 @@ def mine(self) -> None: self._mapItemSum[item] += quantities[i] else: self._mapItemSum[item] = quantities[i] + + if self._k >= 1: + #default k = 1 (max cardinality) + labelsByBaseItem = {} + for label in self._mapItemSum: + baseItem = label.rsplit('.', 1)[0] if '.' in label else label + labelsByBaseItem.setdefault(baseItem, []).append(label) + for baseItem, labels in labelsByBaseItem.items(): + if len(labels) <= self._k: + continue + ranked = sorted(labels, key=lambda lbl: self._mapItemSum[lbl], reverse=True) + for lbl in ranked[self._k:]: + del self._mapItemSum[lbl] + listOfFFList = [] mapItemsToFFLIST = {} #self._minSup = self._convert(self._minSup) @@ -466,7 +481,7 @@ def mine(self) -> None: pair.item = items[i] pair.quantity = quantities[i] item = pair.item - if self._mapItemSum[item] >= self._minSup: + if self._mapItemSum.get(item, 0) >= self._minSup: if pair.quantity > 0: revisedTransaction.append(pair) revisedTransaction.sort(key=_ab._functools.cmp_to_key(self._compareItems)) diff --git a/PAMI/fuzzyGeoreferencedPeriodicFrequentPattern/basic/FGPFPMiner.py b/PAMI/fuzzyGeoreferencedPeriodicFrequentPattern/basic/FGPFPMiner.py index ddda9f63..fb5e6bde 100644 --- a/PAMI/fuzzyGeoreferencedPeriodicFrequentPattern/basic/FGPFPMiner.py +++ b/PAMI/fuzzyGeoreferencedPeriodicFrequentPattern/basic/FGPFPMiner.py @@ -268,13 +268,14 @@ class FGPFPMiner(_ab._fuzzySpatialFrequentPatterns): _sep = "\t" - def __init__(self, iFile, nFile, minSup, maxPer, sep): + def __init__(self, iFile, nFile, minSup, maxPer, sep, k=1): super().__init__(iFile, nFile, minSup, maxPer, sep) self.oFile = None self._mapItemNeighbours = {} self._startTime = 0 self._endTime = 0 self._itemsCnt = 0 + self._k = k self._itemSupData = {} self._mapItemSum = {} self._joinsCnt = 0 @@ -463,6 +464,19 @@ def mine(self): Step3. At the end, sort the list of stored Candidate Frequent-Periodic Patterns in ascending order """ + if self._k >= 1: + #default k = 1 (max cardinality) + labelsByBaseItem = {} + for label in self._itemSupData: + baseItem = label.rsplit('.', 1)[0] if '.' in label else label + labelsByBaseItem.setdefault(baseItem, []).append(label) + for baseItem, labels in labelsByBaseItem.items(): + if len(labels) <= self._k: + continue + ranked = sorted(labels, key=lambda lbl: self._itemSupData[lbl], reverse=True) + for lbl in ranked[self._k:]: + del self._itemSupData[lbl] + listOfFFList = [] mapItemsToFFLIST = {} #region_label = [] diff --git a/PAMI/fuzzyPeriodicFrequentPattern/basic/FPFPMiner.py b/PAMI/fuzzyPeriodicFrequentPattern/basic/FPFPMiner.py index 21df6521..5733ee4d 100644 --- a/PAMI/fuzzyPeriodicFrequentPattern/basic/FPFPMiner.py +++ b/PAMI/fuzzyPeriodicFrequentPattern/basic/FPFPMiner.py @@ -309,12 +309,13 @@ class FPFPMiner(_ab._fuzzyPeriodicFrequentPatterns): _fuzzyValues = [] _ts = [] - def __init__(self, iFile: Union[str, _ab._pd.DataFrame], minSup: Union[int, float], period: Union[int, float], sep: str="\t") -> None: + def __init__(self, iFile: Union[str, _ab._pd.DataFrame], minSup: Union[int, float], period: Union[int, float], sep: str = "\t", k: int = 1) -> None: super().__init__(iFile, minSup, period, sep) self._oFile = "" self._BufferSize = 200 self._itemSetBuffer = [] self._mapItemSum = {} + self._k = k self._finalPatterns = {} self._joinsCnt = 0 self._itemsCnt = 0 @@ -451,6 +452,20 @@ def mine(self) -> None: self._mapItemSum[item] += quantities[i] else: self._mapItemSum[item] = quantities[i] + + if self._k >= 1: + #default k = 1 (max cardinality) + labelsByBaseItem = {} + for label in self._mapItemSum: + baseItem = label.rsplit('.', 1)[0] if '.' in label else label + labelsByBaseItem.setdefault(baseItem, []).append(label) + for baseItem, labels in labelsByBaseItem.items(): + if len(labels) <= self._k: + continue + ranked = sorted(labels, key=lambda lbl: self._mapItemSum[lbl], reverse=True) + for lbl in ranked[self._k:]: + del self._mapItemSum[lbl] + listOfFFIList = [] mapItemsToFFLIST = {} # self._minSup = self._convert(self._minSup) @@ -475,7 +490,7 @@ def mine(self) -> None: pair.item = items[i] item = pair.item pair.quantity = quantities[i] - if self._mapItemSum[item] >= self._minSup: + if self._mapItemSum.get(item, 0) >= self._minSup: if pair.quantity > 0: revisedTransaction.append(pair) revisedTransaction.sort(key=_ab._functools.cmp_to_key(self._compareItems)) diff --git a/setup.py b/setup.py index 2a288ff0..83d8ecf9 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name='pami', - version='2026.06.14.1', + version='2026.06.24.1', author='Rage Uday Kiran', author_email='uday.rage@gmail.com', description='This software is being developed at the University of Aizu, Aizu-Wakamatsu, Fukushima, Japan',