Add LinguisticVariable and new method
This commit is contained in:
parent
414cf2be21
commit
c6f841ec4b
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -13,4 +13,6 @@ public protocol FuzzySetOperations: FuzzySet {
|
|||
func symmetricDifference(_ other: Self, method: SymmetricDifferenceFunction) -> Self
|
||||
|
||||
func power(_ n: Double) -> Self
|
||||
|
||||
func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> Self
|
||||
}
|
||||
|
|
|
@ -48,7 +48,11 @@ extension AnyFuzzySet: FuzzySetOperations {
|
|||
}
|
||||
|
||||
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)) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -62,6 +62,12 @@ extension DiscreteMutableFuzzySet: FuzzySetOperations {
|
|||
result.applyPower(n)
|
||||
return result
|
||||
}
|
||||
|
||||
public func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> Self {
|
||||
var result = self
|
||||
result.applyFunction(function)
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Mutability
|
||||
|
|
|
@ -91,6 +91,12 @@ extension IterableFuzzySet: FuzzySetOperations {
|
|||
Double.pow(function($0), n)
|
||||
}
|
||||
}
|
||||
|
||||
public func appliedCustomFunction(_ function: @escaping (Grade) -> Grade) -> IterableFuzzySet<Universe, S> {
|
||||
.init(sequence) {
|
||||
function(self.function($0))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Sequence
|
||||
|
|
Loading…
Reference in New Issue