|  | rssoft
    0.0.0
    Reed-Solomon codes library with soft decision decoding | 
#include <FinalEvaluation.h>

| Public Member Functions | |
| FinalEvaluation (const gf::GFq &_gf, unsigned int _k, const EvaluationValues &_evaluation_values) | |
| ~FinalEvaluation () | |
| void | run (const std::vector< gf::GFq_Polynomial > &polynomials, const ReliabilityMatrix &relmat) | 
| const std::vector < gf::GFq_Symbol > & | get_best_codeword () const | 
| const std::vector < ProbabilityCodeword > & | get_codewords () const | 
| const std::vector < gf::GFq_Symbol > & | get_best_message () const | 
| const std::vector < ProbabilityCodeword > & | get_messages () const | 
| void | print_codewords (std::ostream &os, const std::vector< ProbabilityCodeword > &words) const | 
| Protected Attributes | |
| const gf::GFq & | gf | 
| Galois Field in use. | |
| unsigned int | k | 
| k as in RS(n,k) | |
| const EvaluationValues & | evaluation_values | 
| Evaluation X,Y values used for coding. | |
| std::map< gf::GFq_Element, unsigned int > | symbol_index | 
| Symbol index in reliability matrix row order. | |
| std::vector< ProbabilityCodeword > | codewords | 
| The codewords (overriden at each run) | |
| std::vector< ProbabilityCodeword > | messages | 
| The encoded messages (overriden at each run) | |
| rssoft::FinalEvaluation::FinalEvaluation | ( | const gf::GFq & | _gf, | 
| unsigned int | _k, | ||
| const EvaluationValues & | _evaluation_values | ||
| ) | 
Constructor
| _gf | Galois Field in use | 
| _k | k as in RS(n,k) | 
| _evaluation_values | Evaluation X,Y values used for coding | 
                                                                                                              :
    gf(_gf),
    k(_k),
    evaluation_values(_evaluation_values)
{
        std::vector<gf::GFq_Element>::const_iterator s_it = evaluation_values.get_symbols().begin();
    unsigned int i_s = 0;
    
    for (; s_it != evaluation_values.get_symbols().end(); ++s_it, i_s++)
    {
        symbol_index.insert(std::make_pair(*s_it, i_s));
    }
}

Destructor. Nothing special
{}
| const std::vector<gf::GFq_Symbol>& rssoft::FinalEvaluation::get_best_codeword | ( | ) | const  [inline] | 
Get the best probability scoring codeword
    {
        return codewords.begin()->get_codeword();
    }
| const std::vector<gf::GFq_Symbol>& rssoft::FinalEvaluation::get_best_message | ( | ) | const  [inline] | 
Get the best probability scoring message
    {
        return messages.begin()->get_codeword();
    }
| const std::vector<ProbabilityCodeword>& rssoft::FinalEvaluation::get_codewords | ( | ) | const  [inline] | 
Get all codewords with their probability score
    {
        return codewords;
    }
| const std::vector<ProbabilityCodeword>& rssoft::FinalEvaluation::get_messages | ( | ) | const  [inline] | 
Get all messages with their probability score
    {
        return messages;
    }
| void rssoft::FinalEvaluation::print_codewords | ( | std::ostream & | os, | 
| const std::vector< ProbabilityCodeword > & | words | ||
| ) | const | 
Print a codeword or message word to an output stream
{
        std::vector<ProbabilityCodeword>::const_iterator w_it = words.begin();
        unsigned int i_w = 0;
        for (; w_it != words.end(); ++w_it, i_w++)
        {
                std::streamsize prec = os.precision();
                os << "#" << i_w << ": (" << std::setprecision(3) << w_it->get_probability_score() << " dB/symbol) ";
                os.precision(prec);
                w_it->print_codeword(os);
                os << std::endl;
        }
}
| void rssoft::FinalEvaluation::run | ( | const std::vector< gf::GFq_Polynomial > & | polynomials, | 
| const ReliabilityMatrix & | relmat | ||
| ) | 
Runs one evaluation for the given polynomials
{
    if (polynomials.size() == 0)
    {
        throw RSSoft_Exception("Cannot evaluate empty list of polynomials");
    }
    else if (relmat.get_nb_symbols() != gf.size()+1)
    {
        throw RSSoft_Exception("Reliability matrix number of rows is incompatible with GF size");
    }
    else if (relmat.get_message_length()!= evaluation_values.get_evaluation_points().size())
    {
        throw RSSoft_Exception("Reliability matrix number of columns is incompatible with the number of evaluation points");
    }
    else
    {
        std::vector<gf::GFq_Polynomial>::const_iterator poly_it = polynomials.begin();
        static const ProbabilityCodeword tmp_pc;
        
        for (; poly_it != polynomials.end(); ++poly_it)
        {
            codewords.push_back(tmp_pc);
            messages.push_back(tmp_pc);
            float proba_score = 0.0; // We will use log scale in dB/symbol
            unsigned int proba_count = 0; // number of individual symbol probabilities considered
            std::vector<gf::GFq_Element>::const_iterator evalpt_it = evaluation_values.get_evaluation_points().begin();
            unsigned int i_pt = 0;
            
            for (; evalpt_it != evaluation_values.get_evaluation_points().end(); ++evalpt_it, i_pt++)
            {
                gf::GFq_Element eval = (*poly_it)(*evalpt_it); // Evaluate polynomial at current point
                codewords.back().get_codeword().push_back(eval.poly()); // Store the corresponding symbol in the codeword
                unsigned int& i_s = symbol_index.at(eval); // Retrieve symbol index in reliability matrix row order
                float p_ij = relmat(i_s, i_pt);
                if (p_ij != 0.0) // symbol was not erased
                {
                        proba_score += 10.0 * log10(p_ij); // Accumulate probability (dB)
                        proba_count++;
                }
            }
            
            // Probability score in dB is divided by the number of evaluation points used. This is an attempt to get a common metric among codes of different lengths
            codewords.back().get_probability_score() = proba_score/proba_count; // Store the probability score in the probability score weighted codeword
            messages.back().get_probability_score() = proba_score/proba_count; // Store the message with probability score.
            poly_it->get_poly_symbols(messages.back().get_codeword(), k); // Message is polynomial's coefficients
        }
    }
    
    // Sort codewords and messages vectors according to decreasing codewords probability score 
    std::sort(codewords.begin(), codewords.end(), std::greater<ProbabilityCodeword>());
    std::sort(messages.begin(), messages.end(), std::greater<ProbabilityCodeword>());
}

| std::vector<ProbabilityCodeword> rssoft::FinalEvaluation::codewords  [protected] | 
The codewords (overriden at each run)
| const EvaluationValues& rssoft::FinalEvaluation::evaluation_values  [protected] | 
Evaluation X,Y values used for coding.
| const gf::GFq& rssoft::FinalEvaluation::gf  [protected] | 
Galois Field in use.
| unsigned int rssoft::FinalEvaluation::k  [protected] | 
k as in RS(n,k)
| std::vector<ProbabilityCodeword> rssoft::FinalEvaluation::messages  [protected] | 
The encoded messages (overriden at each run)
| std::map<gf::GFq_Element, unsigned int> rssoft::FinalEvaluation::symbol_index  [protected] | 
Symbol index in reliability matrix row order.