;;
;; test-cpu-debug.scm - Debug CPU PMFG to find why [0-1] is missing
;;
(use-modules (ice-9 format))
(display "\n=== CPU PMFG Debug ===\n\n")
;; MI matrix
(define mi-vals
(list 0.0 5.0 1.0 0.5 0.1
5.0 0.0 4.0 0.8 0.2
1.0 4.0 0.0 3.0 0.3
0.5 0.8 3.0 0.0 2.0
0.1 0.2 0.3 2.0 0.0))
;; Crossing check with logging
(define (crosses? a b c d)
(let ((i (min a b)) (j (max a b))
(k (min c d)) (l (max c d)))
(let ((result (or (and (< i k) (< k j) (< j l))
(and (< k i) (< i l) (< l j)))))
result)))
;; Build and sort pairs
(define pairs '())
(do ((i 0 (+ i 1))) ((= i 5))
(do ((j (+ i 1) (+ j 1))) ((= j 5))
(let ((mi (list-ref mi-vals (+ (* i 5) j))))
(set! pairs (cons (list mi i j) pairs)))))
(display "Unsorted pairs:\n")
(for-each (lambda (p) (format #t " [~a-~a] MI=~a~%" (cadr p) (caddr p) (car p))) pairs)
(set! pairs (sort pairs (lambda (a b) (> (car a) (car b)))))
(display "\nSorted pairs (descending MI):\n")
(for-each (lambda (p) (format #t " [~a-~a] MI=~a~%" (cadr p) (caddr p) (car p))) pairs)
;; Greedy PMFG with debug logging
(display "\n--- Processing pairs ---\n")
(define cpu-edges '())
(for-each
(lambda (p)
(when (< (length cpu-edges) 9)
(let ((pos1 (cadr p)) (pos2 (caddr p)) (ok #t))
(format #t "\nTrying [~a-~a] (MI=~a), ~a existing edges~%"
pos1 pos2 (car p) (length cpu-edges))
(for-each
(lambda (e)
(let ((crosses (crosses? pos1 pos2 (car e) (cadr e))))
(when crosses
(format #t " CROSSES with [~a-~a]~%" (car e) (cadr e))
(set! ok #f))))
cpu-edges)
(if ok
(begin
(format #t " → ADDED~%")
(set! cpu-edges (cons (list pos1 pos2) cpu-edges)))
(format #t " → REJECTED~%")))))
pairs)
(display "\n=== Final CPU edges ===\n")
(for-each
(lambda (e) (format #t " [~a-~a]~%" (car e) (cadr e)))
(reverse cpu-edges))
(format #t "Total: ~a edges~%" (length cpu-edges))