summaryrefslogtreecommitdiff
path: root/services/nnls.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'services/nnls.rkt')
-rw-r--r--services/nnls.rkt47
1 files changed, 25 insertions, 22 deletions
diff --git a/services/nnls.rkt b/services/nnls.rkt
index 898072c..90acb41 100644
--- a/services/nnls.rkt
+++ b/services/nnls.rkt
@@ -70,7 +70,6 @@
(let ([max-j (argmax (λ (j) (colv-ref w j)) (set->list R))])
(values (colv-ref w max-j) max-j))))
-
;; Build full candidate vector s from current P:
;; s_P = (A_Pᵀ A_P)⁻¹ A_Pᵀ y, s_R = 0
(define (make-s-from-P)
@@ -132,6 +131,7 @@
[(or (set-empty? P) (> min-sP 0))
(set! x s)
(outer-loop)]
+
[else
;; Compute α = min_{i in P, s_i <= 0} x_i / (x_i - s_i)
(define α
@@ -180,24 +180,27 @@
(define test-date "2025-01-01")
- (run-tests
- (test-suite "Nutrient measurement model"
- #:before
- (λ ()
- (connect! #:path 'memory)
- ;; (connect! #:path "test.sqlite3")
- (migrate-all!)
-
- (define nitrogen (create-nutrient! "Nitrogen" "N"))
- (define phosphorus (create-nutrient! "Phosphorus" "P"))
-
- (create-nutrient-measurement! test-date `((,nitrogen . 0) (,phosphorus . 0)))
- (create-nutrient-target! test-date `((,nitrogen . 100) (,phosphorus . 50)))
-
- (create-fertilizer-product! "King Nitrogen" `((,nitrogen . 100)))
- (create-fertilizer-product! "Phosphorescent Baboon" `((,nitrogen . 10) (,phosphorus . 100)))
- (create-fertilizer-product! "John's Phosphorus" `((,nitrogen . 3) (,phosphorus . 30))))
- #:after (λ () (disconnect!))
-
- (test-case "Solve for NNLS"
- (displayln (format "Final solution for fertilizers is combination ~a" (find-ferti-recipe)))))))
+ (run-tests (test-suite "Nutrient measurement model"
+ #:before (λ ()
+ (connect! #:path 'memory)
+ ;; (connect! #:path "test.sqlite3")
+ (migrate-all!)
+
+ (define nitrogen (create-nutrient! "Nitrogen" "N"))
+ (define phosphorus (create-nutrient! "Phosphorus" "P"))
+
+ (create-nutrient-measurement! test-date (hash nitrogen 0 phosphorus 0))
+ (create-nutrient-target! test-date (hash nitrogen 100 phosphorus 50))
+
+ (create-fertilizer-product! "Nitrogen" "King Nitrogen" (hash nitrogen 100))
+ (create-fertilizer-product! "Phosphorus"
+ "Phosphorescent Baboon"
+ (hash nitrogen 10 phosphorus 100))
+ (create-fertilizer-product! "Diluted phosphorus"
+ "John's Phosphorus"
+ (hash nitrogen 3 phosphorus 30)))
+ #:after (λ () (disconnect!))
+
+ (test-case "Solve for NNLS"
+ (displayln (format "Final solution for fertilizers is combination ~a"
+ (find-ferti-recipe)))))))
Copyright 2019--2026 Marius PETER