Mercurial > hg > amuse
view tools/segmentation/methods.lisp @ 74:a98c2adfd420
initial segmentation idea
darcs-hash:20070713100751-f76cc-2cc54f680199ee8f8e7f620c5d46d1e4f059baec.gz
author | David Lewis <d.lewis@gold.ac.uk> |
---|---|
date | Fri, 13 Jul 2007 11:07:51 +0100 |
parents | |
children | 6b2ac9eef629 |
line wrap: on
line source
(in-package "AMUSE-SEGMENTATION") (defmethod boundary-strength ((segmenter basic-segmenter) object composition) (funcall (%segmenter-method segmenter) object composition)) (defmethod boundary-time ((segmenter basic-segmenter) (object anchored-period-designator)) (if (segments-beforep segmenter) (onset object) (cut-off object))) (defmethod boundary-time (segmenter (object moment-designator)) object) (defmethod ground-truth-segmenterp ((segmenter basic-segmenter)) (%segmenter-ground-truthp segmenter)) (defmethod segments-beforep ((segmenter basic-segmenter)) (eq (%segmenter-direction segmenter) :before)) (defun make-basic-segmenter (method &key (ground-truthp nil) (direction :after)) (make-instance 'basic-segmenter :method method :ground-truthp ground-truthp :direction direction)) ;;;;;;;;;;;;;;;;;;;;;;; ;;; 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) (%map-non-contiguous-segmenters composition start-boundary-segmenter end-boundary-segmenter)) (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 'anchored-period :time (timepoint (boundary-time segmenter event))) segments))))) (defun %map-end-segmenter (composition segmenter) (let ((segments (list (make-instance '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 '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) (setf (cdr (last starts)) (list (boundary-time start-boundary-segmenter event)))) (when (> (boundary-strength end-boundary-segmenter event composition) 0) (when starts (push (make-instance 'anchored-period :interval (amuse::duration (time- (boundary-time end-boundary-segmenter event) (car starts))) :time (timepoint (pop starts))) segments))))))