annotate tools/segmentation/methods.lisp @ 124:b0a1760ab0dd

base/: amuse-object as top-level class darcs-hash:20070730133602-c0ce4-2f8758c81a98323e1dca0c6b482e5cdef5c9d3d9.gz
author Marcus Pearce <m.pearce@gold.ac.uk>
date Mon, 30 Jul 2007 14:36:02 +0100
parents 4ad1427d46d8
children fd85f52d9f9d
rev   line source
d@74 1 (in-package "AMUSE-SEGMENTATION")
d@74 2
m@76 3 (defmethod boundary-time (segmenter (object anchored-period-designator))
d@74 4 (if (segments-beforep segmenter)
d@74 5 (onset object)
d@74 6 (cut-off object)))
d@74 7 (defmethod boundary-time (segmenter (object moment-designator))
d@74 8 object)
d@74 9
d@74 10 ;;;;;;;;;;;;;;;;;;;;;;;
d@74 11 ;;; Seriously made-up stuff (= dodgy)
d@74 12
d@74 13 (defun map-segmenters (composition &key (start-boundary-segmenter nil) (end-boundary-segmenter nil))
d@74 14 (cond
d@74 15 ((and start-boundary-segmenter end-boundary-segmenter)
d@74 16 (%map-non-contiguous-segmenters composition start-boundary-segmenter end-boundary-segmenter))
d@74 17 (start-boundary-segmenter
d@74 18 (%map-start-segmenter composition start-boundary-segmenter))
d@74 19 (end-boundary-segmenter
d@74 20 (%map-end-segmenter composition end-boundary-segmenter))
d@74 21 (t (error "Map-segmenters called with no segmenters"))))
d@74 22
d@74 23 (defun %map-start-segmenter (composition segmenter)
d@74 24 (let ((segments))
d@74 25 (sequence:dosequence (event composition (progn
d@74 26 (setf (duration (car segments))
d@74 27 (duration (time- (cut-off composition)
d@74 28 (onset (car segments)))))
d@74 29 (reverse segments)))
d@74 30 (when (> (boundary-strength segmenter event composition) 0)
d@74 31 (when segments
d@74 32 (setf (duration (car segments))
d@74 33 (duration (time- (boundary-time segmenter event)
d@74 34 (onset (car segments))))))
d@74 35 (push (make-instance 'anchored-period
d@74 36 :time (timepoint (boundary-time segmenter event)))
d@74 37 segments)))))
d@74 38
d@74 39 (defun %map-end-segmenter (composition segmenter)
d@74 40 (let ((segments (list (make-instance 'anchored-period :time (timepoint composition)))))
d@74 41 (sequence:dosequence (event composition (reverse (cdr segments)))
d@74 42 (when (> (boundary-strength segmenter event composition) 0)
d@74 43 (setf (duration (car segments))
d@74 44 (duration (time- (boundary-time segmenter event)
d@74 45 (onset (car segments)))))
d@74 46 (push (make-instance 'anchored-period
d@74 47 :time (timepoint (boundary-time segmenter event)))
d@74 48 segments)))))
d@74 49
d@74 50 (defun %map-non-contiguous-segmenters (composition start-boundary-segmenter end-boundary-segmenter)
d@74 51 ;; FIXME: crappy queue implementation
d@74 52 ;; FIXME: This only returns paired starts and ends. Should we
d@74 53 ;; process unpaired boundaries?
d@74 54 (let ((segments) (starts))
d@74 55 (sequence:dosequence (event composition (reverse segments))
d@74 56 (when (> (boundary-strength start-boundary-segmenter event composition) 0)
d@74 57 (setf (cdr (last starts))
d@74 58 (list (boundary-time start-boundary-segmenter event))))
d@74 59 (when (> (boundary-strength end-boundary-segmenter event composition) 0)
d@74 60 (when starts
d@74 61 (push (make-instance 'anchored-period
d@74 62 :interval (amuse::duration (time- (boundary-time end-boundary-segmenter event)
d@74 63 (car starts)))
d@74 64 :time (timepoint (pop starts)))
d@74 65 segments))))))
d@74 66