public bool CalculateProbabilityAndClassDistribution(ref List <CinematographyTechniqueImplementation> implementations)
    {
        for (int i = 0; i < m_categories.Count; i++)
        {
            int defaultTechniqueIndex = m_categories[i].m_techniques.FindIndex(o => o.m_title.CompareTo(m_categories[i].m_defaultTechniqueTitle) == 0);

            if (defaultTechniqueIndex < 0)
            {
                Debug.LogError("Techniques inside the category does not contain the default technique, please check your JSON file!");
                return(false);
            }

            m_categories[i].m_defaultTechnique = m_categories[i].m_techniques[defaultTechniqueIndex];

            m_categories[i].m_techniques.OrderBy(o => o.m_probabilityDistribution);

            float sum    = m_categories[i].m_techniques.Sum(o => o.m_value);
            float sumExp = m_categories[i].m_techniques.Sum(o => Mathf.Exp(o.m_value));

            for (int j = 0; j < m_categories[i].m_techniques.Count; j++)
            {
                CinematographyTechnique technique = m_categories[i].m_techniques[j];
                technique.CalculateDistributions(sum, sumExp);

                // Check whether implementations exist.
                int implementationIndex = implementations.FindIndex(o => o.GetType().ToString().CompareTo(technique.m_title) == 0);
                if (implementationIndex < 0)
                {
                    Debug.LogError("Implementation for " + technique.m_title + " could not be found. Make sure you have an implementation class deriving from" +
                                   "CinematographyTechniqueImplementation base class and is the same name as the technique's title.");
                    return(false);
                }
                else
                {
                    technique.m_implementation = implementations[implementationIndex];
                }
            }
        }

        return(true);
    }