Mercurial > hg > amuse
view tools/segmentation/methods.lisp @ 193:c18f795f4463
rollback the amuse.asd generics/classes dependency fix
Ignore-this: be4e0351d31f24f5348cc8dc434477dc
Fix properly this time by moving the specialized get-constituents method from generics to methods.
rolling back:
Wed Jan 23 15:55:34 GMT 2008 Jamie Forth <j.forth@gold.ac.uk>
* Fixed amuse.asd dependency - generics depends on classes.
M ./amuse.asd -2 +2
darcs-hash:20090524164116-16a00-2b561eab1a5829a251eb5e9b40357945af13e6a6.gz
author | j.forth <j.forth@gold.ac.uk> |
---|---|
date | Sun, 24 May 2009 17:41:16 +0100 |
parents | 676283afe8fb |
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))))))