def make_track_greedy_decomposition(gEpG,radius,keypoint_selector=2,cosine_threshold=0.9999):
    if type(keypoint_selector)==int:
        kp_functor=keypoint_selectors[keypoint_selector]
    else:
        kp_functor=keypoint_selector
    make_structure = make_structure_factory(cosine_threshold)
    def track_greedy_decomposition(T):
        """
        track_greedy_decomposition(T):
        given: kps,cliques,factors,kps2cliques
            tracks = {}
            excluded_keypoints = {}
            while T = initialize track (...)
                while kp = select keypoint (...)
                    add keypoint kp to T
                add track T to tracks
            return tracks        
        """
        # Problem Structure
        ps=make_structure(T,gEpG)
        tracks={}
        track_initialization_is_possible = True
        excluded_keypoints=set()
        iteration=0
        while track_initialization_is_possible:
                current_track=init_track(
                    excluded_keypoints,
                    ps.keypoints,
                    ps.cliques,
                    ps.distances,
                    ps.kpsToCliques)
                if not len(current_track)<2:
                    support_expansion_is_possible=True        
                    while support_expansion_is_possible:
                        kp=kp_functor(
                            ps.cliques,
                            ps.distances,
                            ps.kpsToCliques,
                            current_track,
                            excluded_keypoints,
                            radius,
                            len(ps.keypoints))
                        if kp == -1:
                            support_expansion_is_possible = False
                        else:
                            current_track.add(kp)
                else:
                    track_initialization_is_possible = False
                excluded_keypoints.update(current_track)
                tracks[iteration]=list(current_track)
                iteration+=1
        return build_tracks(T,tracks,ps.keypoints)
    def safe_track_greedy_decomposition(T):
        mem_safe_tracks=safe_decomposition([T])
        if len(mem_safe_tracks)==1:
            return track_greedy_decomposition(T)
        else:
            print len(mem_safe_tracks),' splitted connected components' 
            tracks=[]
            for t in mem_safe_tracks:
                tracks+=track_greedy_decomposition(t)
            return tracks
    return safe_track_greedy_decomposition
 def __init__(self,gEpG,T):
     self.gEpG=gEpG
     self.T=T
     make_structure = make_structure_factory(1.)
     ps=make_structure(T,gEpG)
     self.ps=make_structure(T,gEpG)