OverviewFilesCommitsIssuesDocsReleasesPeers

hypercore-kb / opencog-kb / language-learning / mvp / test-cpu-debug.scm

69 lines · scm ref:
;;
;; 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))