apps, analysis, indicators
apps, analysis, indicators




tools to analyze
//coming soon import Foundation /// One raw sample at time t (Hz = samplingRate) public struct NIRSSample: Sendable { public let t: TimeInterval // seconds from session start public let hbo: Double? public let hbr: Double? public let hbt: Double? public let heartRate: Double? public let flowActivity: Double? // use this as “micro-expression” channel public init(t: TimeInterval, hbo: Double?, hbr: Double?, hbt: Double?, heartRate: Double?, flowActivity: Double?) { self.t = t; self.hbo = hbo; self.hbr = hbr; self.hbt = hbt self.heartRate = heartRate; self.flowActivity = flowActivity } } public struct WindowFeatures: Sendable { public let vector: [Double] // feature vector for the window (order matches extractor) public let startT: TimeInterval public let endT: TimeInterval } public enum LikelihoodState: String, Sendable { case low, medium, high } public struct LikelihoodResult: Sendable { public let window: WindowFeatures /// Probability that the state == nback3/high-load (0...1) public let probHighLoad: Double public let state: LikelihoodState } public enum MicroEventKind: String, Sendable { case blink, smile } public struct MicroEvent: Sendable { public let kind: MicroEventKind public let t: TimeInterval public let confidence: Double // 0...1 }
//coming soon import Foundation /// One raw sample at time t (Hz = samplingRate) public struct NIRSSample: Sendable { public let t: TimeInterval // seconds from session start public let hbo: Double? public let hbr: Double? public let hbt: Double? public let heartRate: Double? public let flowActivity: Double? // use this as “micro-expression” channel public init(t: TimeInterval, hbo: Double?, hbr: Double?, hbt: Double?, heartRate: Double?, flowActivity: Double?) { self.t = t; self.hbo = hbo; self.hbr = hbr; self.hbt = hbt self.heartRate = heartRate; self.flowActivity = flowActivity } } public struct WindowFeatures: Sendable { public let vector: [Double] // feature vector for the window (order matches extractor) public let startT: TimeInterval public let endT: TimeInterval } public enum LikelihoodState: String, Sendable { case low, medium, high } public struct LikelihoodResult: Sendable { public let window: WindowFeatures /// Probability that the state == nback3/high-load (0...1) public let probHighLoad: Double public let state: LikelihoodState } public enum MicroEventKind: String, Sendable { case blink, smile } public struct MicroEvent: Sendable { public let kind: MicroEventKind public let t: TimeInterval public let confidence: Double // 0...1 }
//coming soon import Foundation /// One raw sample at time t (Hz = samplingRate) public struct NIRSSample: Sendable { public let t: TimeInterval // seconds from session start public let hbo: Double? public let hbr: Double? public let hbt: Double? public let heartRate: Double? public let flowActivity: Double? // use this as “micro-expression” channel public init(t: TimeInterval, hbo: Double?, hbr: Double?, hbt: Double?, heartRate: Double?, flowActivity: Double?) { self.t = t; self.hbo = hbo; self.hbr = hbr; self.hbt = hbt self.heartRate = heartRate; self.flowActivity = flowActivity } } public struct WindowFeatures: Sendable { public let vector: [Double] // feature vector for the window (order matches extractor) public let startT: TimeInterval public let endT: TimeInterval } public enum LikelihoodState: String, Sendable { case low, medium, high } public struct LikelihoodResult: Sendable { public let window: WindowFeatures /// Probability that the state == nback3/high-load (0...1) public let probHighLoad: Double public let state: LikelihoodState } public enum MicroEventKind: String, Sendable { case blink, smile } public struct MicroEvent: Sendable { public let kind: MicroEventKind public let t: TimeInterval public let confidence: Double // 0...1 }
Interested in working together?
BlueberryX © 2025