66 lines
2.1 KiB
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
|
|
}
|
|
}
|