Add LinguisticVariable and new method

This commit is contained in:
Alexander Ignatov 2021-12-30 23:05:03 +02:00
parent 414cf2be21
commit c6f841ec4b
5 changed files with 58 additions and 1 deletions

View File

@ -0,0 +1,39 @@
import FuzzySets
public struct LinguisticVariable<Universe, TermName: Hashable, Term: FuzzySetOperations, TermModifierName: Hashable> {
public typealias TermModifier = (Grade) -> Grade
let baseTerms: [TermName: Term]
let termModifiers: [TermModifierName: TermModifier]
public init(
baseTerms: [TermName: Term],
termModifiers: [TermModifierName: TermModifier] = [:]
) {
self.baseTerms = baseTerms
self.termModifiers = termModifiers
}
public func term(_ name: TermName) -> Term? {
baseTerms[name]
}
public subscript(_ termName: TermName) -> Term? {
term(termName)
}
public subscript(_ termName: TermName, applyModifier modifierName: TermModifierName) -> Term? {
applyModifier(modifierName, to: termName)
}
public func applyModifier(_ modifierName: TermModifierName, to termName: TermName) -> Term? {
guard let term = term(termName) else { return nil }
return applyModifier(modifierName, to: term)
}
public func applyModifier(_ modifierName: TermModifierName, to term: Term) -> Term? {
guard let modifier = termModifiers[modifierName] else { return nil }
return term.appliedCustomFunction(modifier)
}
}

View File

@ -13,4 +13,6 @@ public protocol FuzzySetOperations: FuzzySet {
func symmetricDifference(_ other: Self, method: SymmetricDifferenceFunction) -> Self func symmetricDifference(_ other: Self, method: SymmetricDifferenceFunction) -> Self
func power(_ n: Double) -> Self func power(_ n: Double) -> Self
func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> Self
} }

View File

@ -48,7 +48,11 @@ extension AnyFuzzySet: FuzzySetOperations {
} }
public func power(_ n: Double) -> Self { public func power(_ n: Double) -> Self {
return .init { Double.pow(membershipFunction($0), n) } .init { Double.pow(membershipFunction($0), n) }
}
public func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> Self {
.init { function(membershipFunction($0)) }
} }
} }

View File

@ -62,6 +62,12 @@ extension DiscreteMutableFuzzySet: FuzzySetOperations {
result.applyPower(n) result.applyPower(n)
return result return result
} }
public func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> Self {
var result = self
result.applyFunction(function)
return result
}
} }
// MARK: - Mutability // MARK: - Mutability

View File

@ -91,6 +91,12 @@ extension IterableFuzzySet: FuzzySetOperations {
Double.pow(function($0), n) Double.pow(function($0), n)
} }
} }
public func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> IterableFuzzySet<Universe, S> {
.init(sequence) {
function(self.function($0))
}
}
} }
// MARK: - Sequence // MARK: - Sequence