#! /usr/bin/env -S guile -s
!#
;
; file-episodic.scm -- Unit test for FileStorageNode w/AtomSpaces
;
; This is a modified copy of the `episodic-space.scm` demo in the main
; examples directory.
;
(use-modules (opencog) (opencog persist) (opencog persist-file))
(use-modules (opencog test-runner))
; ---------------------------------------------------------------------
; Create a unique file name.
(set! *random-state* (random-state-from-platform))
(define fbase (format #f "/tmp/opencog-test-~D.scm" (random 1000000000)))
(define fsub1 (format #f "/tmp/opencog-test-~D.scm" (random 1000000000)))
(define fsub2 (format #f "/tmp/opencog-test-~D.scm" (random 1000000000)))
(format #t "Using files:\n~A\n~A\n~A\n" fbase fsub1 fsub2)
; ---------------------------------------------------------------------
(opencog-test-runner)
(define tname "store_episodes")
(test-begin tname)
; Get a reference to the current AtomSpace; this is our main space.
(define base-space (cog-atomspace))
(ConceptNode "foo")
(cog-set-value! (ConceptNode "foo") (Predicate "bunch o numbers")
(FloatValue 1 2 3.14159 4 5 6))
(cog-set-value! (ConceptNode "foo") (Predicate "some words")
(StringValue "once" "upon" "a" "time"))
(cog-set-value! (ConceptNode "foo") (Predicate "some atoms")
(LinkValue (Concept "dog") (Concept "cat") (Concept "mouse")))
(cog-set-value! (ConceptNode "foo") (Predicate "real life")
(AtomSpace "happy thoughts"))
(cog-set-value! (ConceptNode "foo") (Predicate "repressed mem")
(AtomSpace "crushing defeat"))
; Populate the subspaces
(cog-set-atomspace!
(cog-value (ConceptNode "foo") (Predicate "real life")))
; Add some content.
(ListLink (Concept "mom") (Concept "dad"))
(ListLink (Concept "first crush") (Concept "Gilanda"))
(ListLink (Concept "stack blocks"))
; Switch to the other AtomSpace.
(cog-set-atomspace! base-space)
(cog-set-atomspace!
(cog-value (ConceptNode "foo") (Predicate "repressed mem")))
(ListLink (Concept "misdemeanor") (Concept "vandalism"))
(ListLink (Concept "furious") (Concept "anger"))
; Return to the main space.
(cog-set-atomspace! base-space)
(format #t "Atom counts in subspaces are ~A ~A ~A\n"
(count-all)
(count-all (cog-value (ConceptNode "foo") (Predicate "real life")))
(count-all (cog-value (ConceptNode "foo") (Predicate "repressed mem"))))
; Verify contents
; 11 atoms + 1 for Predicate "*-IsKeyFlag-*"
(test-assert "base-count" (equal? 12 (count-all)))
(test-assert "space1-count" (equal? 8
(count-all (cog-value (ConceptNode "foo") (Predicate "real life")))))
(test-assert "space2-count" (equal? 6
(count-all (cog-value (ConceptNode "foo") (Predicate "repressed mem")))))
; Dump to files
(define fsn (FileStorageNode fbase))
(cog-set-value! fsn (*-open-*))
(cog-set-value! fsn (*-store-atomspace-*) (cog-atomspace))
(cog-set-value! fsn (*-close-*))
; So, let's save the other two parts.
(define as-one (cog-value (ConceptNode "foo") (Predicate "real life")))
(define as-two (cog-value (ConceptNode "foo") (Predicate "repressed mem")))
(define fsa (FileStorageNode fsub1))
(define fsb (FileStorageNode fsub2))
(cog-set-value! fsa (*-open-*))
(cog-set-value! fsb (*-open-*))
(cog-set-value! fsa (*-store-atomspace-*) as-one)
(cog-set-value! fsa (*-close-*))
(cog-set-value! fsb (*-store-atomspace-*) as-two)
(cog-set-value! fsb (*-close-*))
; Return to home base.
(cog-set-atomspace! base-space)
; Verify that the contents are as expected
(cog-prt-atomspace)
(cog-prt-atomspace as-one)
(cog-prt-atomspace as-two)
; Clobber temps
(set! as-one #f)
(set! as-two #f)
(set! fsa #f)
(set! fsb #f)
(set! fsn #f)
(gc) (gc)
(cog-atomspace-clear)
; ---------------------------------------------------------------------
; Load everything from the file.
(define gsn (FileStorageNode fbase))
(define gsa (FileStorageNode fsub1))
(define gsb (FileStorageNode fsub2))
(cog-set-value! gsn (*-open-*))
(cog-set-value! gsn (*-load-atomspace-*) (cog-atomspace))
(cog-set-value! gsn (*-close-*))
(format #t "Loaded Atom counts ~A ~A ~A\n"
(count-all)
(count-all (cog-value (ConceptNode "foo") (Predicate "real life")))
(count-all (cog-value (ConceptNode "foo") (Predicate "repressed mem"))))
; 11 loaded + 1 for *-IsKeyFlag-* + three FileStorageNodes
; Plus four more: (Predicate "*-store-atomspace-*")
; and (Predicate "*-load-atomspace-*") and *-open-* and *-close-*
(test-assert "base-count" (equal? 19 (count-all)))
(test-assert "space1-count" (equal? 0
(count-all (cog-value (ConceptNode "foo") (Predicate "real life")))))
(test-assert "space2-count" (equal? 0
(count-all (cog-value (ConceptNode "foo") (Predicate "repressed mem")))))
; Now, restore the two batches of episodic memories.
(define as-one (cog-value (ConceptNode "foo") (Predicate "real life")))
(define as-two (cog-value (ConceptNode "foo") (Predicate "repressed mem")))
(cog-set-value! gsa (*-open-*))
(cog-set-value! gsb (*-open-*))
(cog-set-value! gsa (*-load-atomspace-*) as-one)
(cog-set-value! gsa (*-close-*))
(cog-set-value! gsb (*-load-atomspace-*) as-two)
(cog-set-value! gsb (*-close-*))
; Return to home base.
(cog-set-atomspace! base-space)
(format #t "Return to base; Loaded Atom counts ~A ~A ~A\n"
(count-all)
(count-all (cog-value (ConceptNode "foo") (Predicate "real life")))
(count-all (cog-value (ConceptNode "foo") (Predicate "repressed mem"))))
; Same count as before: 19 (with *-IsKeyFlag-* marker)
(test-assert "base-count" (equal? 19 (count-all)))
(test-assert "space1-count" (equal? 8
(count-all (cog-value (ConceptNode "foo") (Predicate "real life")))))
(test-assert "space2-count" (equal? 6
(count-all (cog-value (ConceptNode "foo") (Predicate "repressed mem")))))
; Verify that the contents are as expected
(cog-prt-atomspace)
(cog-prt-atomspace as-one)
(cog-prt-atomspace as-two)
; --------------------------
; Clean up.
(delete-file fbase)
(delete-file fsub1)
(delete-file fsub2)
(test-end tname)
(opencog-test-end)