std::vector<std::vector<size_t> > process_clustering(std::vector<imgptr> images) {
    
    std::vector<size_t> set1(images.size());
    
    std::iota (std::begin(set1), std::end(set1), 0);
    
    distance_processor d;
    d.calculate_distances(images);
    
    std::vector<std::vector<size_t> > res1(cluster_set(set1, d));
    std::vector<std::vector<size_t> > res2;
    for (std::vector<size_t>& r: res1) {
        auto rt = cluster_set(r, d);
        res2.insert(res2.end(), std::make_move_iterator(rt.begin()),
                std::make_move_iterator(rt.end()));
    }
    std::cout<<"clusters1 :" <<res1.size()<<" clusters2: "<<res2.size()<<"\n";
    return res2;
}
static GList *
cluster_list (s4_resultset_t *set, xmms_fetch_spec_t *spec)
{
	GHashTable *table;
	GList *list = NULL;

	table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
	cluster_set (set, spec, table, &list);
	g_hash_table_destroy (table);

	return g_list_reverse (list);
}
static GHashTable *
cluster_dict (s4_resultset_t *set, xmms_fetch_spec_t *spec)
{
	GHashTable *table;
	GList *list = NULL;

	table = g_hash_table_new_full (g_str_hash, g_str_equal,
	                               g_free, (GDestroyNotify) s4_resultset_free);

	cluster_set (set, spec, table, &list);
	g_list_free (list);

	return table;
}