Added validation.

This commit is contained in:
Simon Brooke 2026-08-14 12:02:20 +01:00
parent 8a7202f57d
commit a377b3a845
4 changed files with 77 additions and 7 deletions

View file

@ -39,7 +39,6 @@
relative-humidity saturation-vapour-pressure temperature relative-humidity saturation-vapour-pressure temperature
temperature-celsius temperature-kelvin volume temperature-celsius temperature-kelvin volume
wet-bulb-temperature-celsius] :as packet}] wet-bulb-temperature-celsius] :as packet}]
(println packet)
(if temperature (resolve-humidity (if temperature (resolve-humidity
(assoc (dissoc packet :temperature) (assoc (dissoc packet :temperature)
:temperature-celsius temperature)) :temperature-celsius temperature))
@ -61,9 +60,10 @@
(relative-humidity-fn packet)) (relative-humidity-fn packet))
:saturation-vapour-pressure (when-not saturation-vapour-pressure :saturation-vapour-pressure (when-not saturation-vapour-pressure
(saturation-vapour-pressure-fn packet)) (saturation-vapour-pressure-fn packet))
:temperature-celsius (when :temperature-celsius (cond
(and temperature-kelvin temperature temperature
(not temperature-celsius)) (and temperature-kelvin
(not temperature-celsius))
(- temperature-kelvin celsius-offset)) (- temperature-kelvin celsius-offset))
:temperature-kelvin (when :temperature-kelvin (when
(and temperature-celsius (and temperature-celsius
@ -81,3 +81,45 @@
(let [p' (resolve-humidity p)] (let [p' (resolve-humidity p)]
(if (= (keys p) (keys p')) p (if (= (keys p) (keys p')) p
(recur p'))))) (recur p')))))
(defn validation-error
[key limit a b]
(let [m (max a b)
error (abs (float (/ (compare a b) (if (zero? m) 0.000001 m) (/ limit 100))))]
(if (> error limit)
(do
(println (format "ERROR: key: %s; a: %s; b %s; errror: %s%%." key a b error))
false)
true)))
(def ^:dynamic
*validation-limit*
"Percentage limit for discrepancies in values during validation."
1)
(defn validate
"Validate a packet by recalculating each value. Discrepancies within
`*validation-limit*`% will be ignored."
[& {:keys [pressure-millibars pressure-pascals temperature-celsius
temperature-kelvin] :as packet}]
(let [v (?assoc (into (sorted-map) packet)
:absolute-humidity (absolute-humidity-fn packet)
:actual-vapour-pressure (actual-vapour-pressure-fn packet)
:dew-point-celsius (dew-point-celsius-fn packet)
:pressure-pascals (if pressure-millibars
(* pressure-millibars 100) Pa)
:pressure-millibars (if pressure-pascals
(float (/ pressure-pascals 100))
(float (/ Pa 100)))
:relative-humidity (relative-humidity-fn packet)
:saturation-vapour-pressure
(saturation-vapour-pressure-fn packet)
:temperature-celsius (- temperature-kelvin celsius-offset)
:temperature-kelvin (+ temperature-celsius celsius-offset)
:volume (volume-fn packet)
:wet-bulb-temperature-celsius
(wet-bulb-temperature-celsius-fn packet))]
(empty?
(remove true?
(map #(validation-error % *validation-limit* (packet %) (v %))
(keys packet))))))

View file

@ -1,7 +1,7 @@
(ns humidity.core-test (ns humidity.core-test
(:require (:require
[clojure.test :refer [deftest is testing]] [clojure.test :refer [deftest is testing]]
[humidity.core :refer [resolution]])) [humidity.core :refer [resolution validate]]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;
@ -40,3 +40,32 @@
packet {:relative-humidity 100 :temperature-celsius 35} packet {:relative-humidity 100 :temperature-celsius 35}
actual (resolution packet)] actual (resolution packet)]
(is (= actual expected)))) (is (= actual expected))))
(deftest validation-test
(testing "validation"
(let [expected true
actual (validate {:absolute-humidity 3953.618101887827,
:actual-vapour-pressure 4765.10094206357,
:dew-point-celsius 35.00000000000001,
:pressure-millibars 1013.25,
:pressure-pascals 101325,
:relative-humidity 100,
:saturation-vapour-pressure 5622.488734516426,
:temperature-celsius 35,
:temperature-kelvin 308.15,
:volume 1.1281347245103424,
:wet-bulb-temperature-celsius 35.11625928298915})]
(is (= actual expected)))
(let [expected false
actual (validate {:absolute-humidity 3953.618101887827,
:actual-vapour-pressure 4765.10094206357,
:dew-point-celsius 35.00000000000001,
:pressure-millibars 1013.25,
:pressure-pascals 101325,
:relative-humidity 95, ;; <-- deliberately wrong
:saturation-vapour-pressure 5622.488734516426,
:temperature-celsius 35,
:temperature-kelvin 308.15,
:volume 1.1281347245103424,
:wet-bulb-temperature-celsius 35.11625928298915})]
(is (= actual expected)))))

View file

@ -1,6 +1,5 @@
(ns humidity.dew-point-test (ns humidity.dew-point-test
(:require [clojure.test :refer [deftest is testing]] (:require [clojure.test :refer [deftest is testing]]
[humidity.constants :refer [celsius-offset]]
[humidity.dew-point-celsius :refer [dew-point-celsius-fn]])) [humidity.dew-point-celsius :refer [dew-point-celsius-fn]]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;

View file

@ -1,7 +1,7 @@
(ns humidity.relative-test (ns humidity.relative-test
(:require [clojure.test :refer [deftest is testing]] (:require [clojure.test :refer [deftest is testing]]
[humidity.constants :refer [celsius-offset]] [humidity.constants :refer [celsius-offset]]
[humidity.relative-humidity :refer [relative-humidity-fn relative-humidity-fn]])) [humidity.relative-humidity :refer [relative-humidity-fn]]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;