Mercurial > hg > amuse
view tools/segmentation/methods.lisp @ 161:676283afe8fb
misc bug fixes
darcs-hash:20071211150333-1f211-716a232fef6cf85127f8a2e52e71b813495a1cac.gz
author | d.mullensiefen <d.mullensiefen@gold.ac.uk> |
---|---|
date | Tue, 11 Dec 2007 15:03:33 +0000 |
parents | fd85f52d9f9d |
children |
line wrap: on
line source
(in-package "AMUSE-SEGMENTATION") (defmethod boundary-time (segmenter (object anchored-period)) (if (segments-beforep segmenter) (onset object) (cut-off object))) (defmethod boundary-time (segmenter (object moment)) object) ;;;;;;;;;;;;;;;;;;;;;;; ;;; Seriously made-up stuff (= dodgy) (defun map-segmenters (composition &key (start-boundary-segmenter nil) (end-boundary-segmenter nil)) (cond ((and start-boundary-segmenter end-boundary-segmenter) #+nil (%map-non-contiguous-segmenters composition start-boundary-segmenter end-boundary-segmenter) ;; hacky fix for broken code (remove-duplicates (nconc (%map-start-segmenter composition start-boundary-segmenter) (%map-end-segmenter composition end-boundary-segmenter)) :test #'period=)) (start-boundary-segmenter (%map-start-segmenter composition start-boundary-segmenter)) (end-boundary-segmenter (%map-end-segmenter composition end-boundary-segmenter)) (t (error "Map-segmenters called with no segmenters")))) (defun %map-start-segmenter (composition segmenter) (let ((segments)) (sequence:dosequence (event composition (progn (setf (duration (car segments)) (duration (time- (cut-off composition) (onset (car segments))))) (reverse segments))) (when (> (boundary-strength segmenter event composition) 0) (when segments (setf (duration (car segments)) (duration (time- (boundary-time segmenter event) (onset (car segments)))))) (push (make-instance 'standard-anchored-period :time (timepoint (boundary-time segmenter event))) segments))))) (defun %map-end-segmenter (composition segmenter) (let ((segments (list (make-instance 'standard-anchored-period :time (timepoint composition))))) (sequence:dosequence (event composition (reverse (cdr segments))) (when (> (boundary-strength segmenter event composition) 0) (setf (duration (car segments)) (duration (time- (boundary-time segmenter event) (onset (car segments))))) (push (make-instance 'standard-anchored-period :time (timepoint (boundary-time segmenter event))) segments))))) (defun %map-non-contiguous-segmenters (composition start-boundary-segmenter end-boundary-segmenter) ;; FIXME: crappy queue implementation ;; FIXME: This only returns paired starts and ends. Should we ;; process unpaired boundaries? (let ((segments) (starts)) (sequence:dosequence (event composition (reverse segments)) (when (> (boundary-strength start-boundary-segmenter event composition) 0) (if starts (setf (cdr (last starts)) (list (boundary-time start-boundary-segmenter event))) (setf starts (list (boundary-time start-boundary-segmenter event))))) (when (> (boundary-strength end-boundary-segmenter event composition) 0) (when starts (push (make-instance 'standard-anchored-period :interval (amuse::duration (time- (boundary-time end-boundary-segmenter event) (car starts))) :time (timepoint (pop starts))) segments))))))