// Copyright (C) 2010  Davis E. King (davis@dlib.net)
// License: Boost Software License   See LICENSE.txt for the full license.
#ifndef DLIB_MULTICLASS_TOoLS_Hh_
#define DLIB_MULTICLASS_TOoLS_Hh_

#include "multiclass_tools_abstract.h"

#include <vector>
#include <set>
#include "../unordered_pair.h"

namespace dlib
{

// ----------------------------------------------------------------------------------------

    template <typename label_type>
    std::vector<label_type> select_all_distinct_labels (
        const std::vector<label_type>& labels
    )
    {
        std::set<label_type> temp;
        temp.insert(labels.begin(), labels.end());
        return std::vector<label_type>(temp.begin(), temp.end());
    }

// ----------------------------------------------------------------------------------------

    template <typename label_type, typename U>
    std::vector<unordered_pair<label_type> > find_missing_pairs (
        const std::map<unordered_pair<label_type>,U>& bdfs 
    )
    {
        typedef std::map<unordered_pair<label_type>,U> map_type;

        // find all the labels
        std::set<label_type> temp;
        for (typename map_type::const_iterator i = bdfs.begin(); i != bdfs.end(); ++i)
        {
            temp.insert(i->first.first);
            temp.insert(i->first.second);
        }

        std::vector<unordered_pair<label_type> > missing_pairs;

        // now make sure all label pairs are present
        typename std::set<label_type>::const_iterator i, j;
        for (i = temp.begin(); i != temp.end(); ++i)
        {
            for (j = i, ++j; j != temp.end(); ++j)
            {
                const unordered_pair<label_type> p(*i, *j);

                if (bdfs.count(p) == 0)
                    missing_pairs.push_back(p);
            }
        }

        return missing_pairs;
    }

// ----------------------------------------------------------------------------------------

}

#endif // DLIB_MULTICLASS_TOoLS_Hh_