001    package util.wavelet;
002    
003    import java.util.List;
004    import static java.lang.Math.*;
005    
006    /**  
007     * Corresponds to a feature in the original signal. A WObject contains a set of connected
008     * {@link InterscaleRelationship} instances representing a tree of Structure instances spanning multiple scales and usually restricted
009     * to a small subset of positions in the original signal. Each {@link InterscaleRelationship}
010     * share one Structure instance in common with another InterscaleRelationship instance in the same WOBject.
011     * A WObject is composed of zero or more sub-WObjects represented by a subset of the {@link InterscaleRelationship} instances
012     * of the 'parent' WOBject.
013     *
014     * @author John Talbot
015     */
016    public class WObject {
017    
018        /** Set of InterscaleRelationship instances */
019        public java.util.Set<InterscaleRelationship> relationships = new java.util.HashSet<InterscaleRelationship>(16);
020    
021        /** Set of structure instances sorted from smallest scale to */
022        public java.util.SortedSet<Structure> structures = new java.util.TreeSet<Structure>();
023    
024        /** The size of the original signal (also the wavelet space size). */
025        private int size;
026        
027        /** 
028         * Construct the WObject.
029         * @param relationships a set of interscale relationships
030         */
031        public WObject(java.util.Set<InterscaleRelationship> relationships) {
032            this.relationships = relationships;
033            for (InterscaleRelationship relationship : relationships) {  
034                structures.add(relationship.getChild());
035                structures.add(relationship.getParent());           
036            }
037            size = relationships.iterator().next().getChild().getScale().size();   //FIX: Very kludgy !
038        }
039        
040        /** 
041         * Reconstruct the signal for this WOBject (without the last smoothed scale). 
042         * @return the reconstructed signal
043         */
044        public SimpleSignal reconstruct() {
045            SimpleSignal sum = new SimpleSignal(size);
046            for (Structure structure : structures) sum.add(structure.getCoefficients());
047            return sum;
048        }
049    
050        // TODO: Get a tree-structure starting at the root of this WObject
051    
052        /** 
053         * Get the list of structures in this WOBject. The list is ordered by increasing scale.
054         * @return a list of structures belonging to this WObject
055         */
056        public java.util.SortedSet<Structure> getStructures() {
057            return structures;
058        }
059        
060    }