FuzzyKit/Sources/FuzzyNumbers/Implementations/TriangularFuzzyNumber.swift

66 lines
2.1 KiB
Swift

import FuzzySets
public struct TriangularFuzzyNumber: FuzzyNumber {
public typealias Universe = Double
public let minimum: Universe
public let peak: Universe
public let maximum: Universe
internal let function: MembershipFunction<Universe>
public init(minimum: Universe, peak: Universe, maximum: Universe) {
self.minimum = minimum
self.peak = peak
self.maximum = maximum
self.function = .triangular(minimum: minimum, peak: peak, maximum: maximum)
}
public init(peak: Universe, leftInterval: Universe, rightInterval: Universe) {
self.minimum = peak - leftInterval
self.peak = peak
self.maximum = peak + rightInterval
self.function = .triangular(minimum: minimum, peak: peak, maximum: maximum)
}
public func eraseToAnyFuzzySet() -> AnyFuzzySet<Universe> {
.init(membershipFunction: function)
}
public static func + (lhs: TriangularFuzzyNumber, rhs: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
.init(
minimum: lhs.minimum + rhs.minimum,
peak: lhs.peak + rhs.peak,
maximum: lhs.maximum + rhs.maximum
)
}
public static func - (lhs: TriangularFuzzyNumber, rhs: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
.init(
minimum: lhs.minimum - rhs.maximum,
peak: lhs.peak - rhs.peak,
maximum: lhs.maximum - rhs.minimum
)
}
prefix public static func - (x: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
.init(minimum: -x.maximum, peak: -x.peak, maximum: -x.minimum)
}
//
// public func approximatelyMultiplied(by other: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
// // TODO
// }
//
// public func approximatelyDivided(by other: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
// // TODO
// }
}
extension TriangularFuzzyNumber: Equatable {
public static func == (lhs: TriangularFuzzyNumber, rhs: TriangularFuzzyNumber) -> Bool {
lhs.minimum == rhs.minimum && lhs.peak == rhs.peak && lhs.maximum == rhs.maximum
}
}