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
|