Quinoa regression test code coverage report
Current view: top level - Statistics - Statistics.hpp (source / functions) Hit Total Coverage
Commit: Quinoa_v0.3-957-gb4f0efae0 Lines: 8 8 100.0 %
Date: 2021-11-09 13:40:20 Functions: 0 0 -
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/Statistics/Statistics.hpp
       4                 :            :   \copyright 2012-2015 J. Bakosi,
       5                 :            :              2016-2018 Los Alamos National Security, LLC.,
       6                 :            :              2019-2021 Triad National Security, LLC.
       7                 :            :              All rights reserved. See the LICENSE file for details.
       8                 :            :   \brief     Statistics class declaration
       9                 :            :   \details   This file implements a statistics class that can be used to
      10                 :            :     estimate statistics from an ensemble. Supported at this time are ordinary
      11                 :            :     and central statistical moments of arbitrary-length products and arbitrary
      12                 :            :     number of 1D, 2D, and 3D probability density functions (PDF) with sample
      13                 :            :     spaces of ordinary and/or central sample space variables.
      14                 :            : 
      15                 :            :     _Definitions and nomenclature:_
      16                 :            : 
      17                 :            :     - Upper-case letters denote a full random variable, e.g., X
      18                 :            : 
      19                 :            :     - Lower-case letters denote a fluctuation about the mean, i.e.,
      20                 :            :       x = X - \<X\>
      21                 :            : 
      22                 :            :     - Letters can be augmented by a field ID, i.e., X2 is the full variable of
      23                 :            :       the second component of the vector X, while x1 = X1 - \<X1\> is the
      24                 :            :       fluctuation about the mean of the first component of vector X.
      25                 :            : 
      26                 :            :     - If the field ID is unspecified, it defaults to the first field, i.e.,
      27                 :            :       X = X1, x = x1, etc.
      28                 :            : 
      29                 :            :     - Statistical moments of arbitrary-length products can be computed.
      30                 :            : 
      31                 :            :       Examples:
      32                 :            :       - \<X\> - mean,
      33                 :            :       - \<xx\> - variance,
      34                 :            :       - \<xxx\> - third central moment,
      35                 :            :       - \<xy\> - covariance of X and Y,
      36                 :            :       - \<x1y2\> - covariance of the first component of vector X and the second
      37                 :            :         component of vector Y
      38                 :            : 
      39                 :            :     - In general, arbitrary-length products can be estimated that make up a
      40                 :            :       statistical moment, using any number and combinations of upper and
      41                 :            :       lower-case letters and their field IDs \< [A-Za-z][1-9] ... \>.
      42                 :            : 
      43                 :            :     - A statistical moment is ordinary if and only if all of its terms are
      44                 :            :       ordinary. A central moment has at least one term that is central, i.e., a
      45                 :            :       fluctuation about its mean.
      46                 :            : 
      47                 :            :       - Examples of ordinary moments: \<X\>, \<XX\>, \<XYZ\>, etc.
      48                 :            :       - Examples of central moments: \<x1x2\>, \<Xy\>, \<XYz\>, etc.
      49                 :            : 
      50                 :            :     - Estimation of the PDFs can be done using either ordinary or central sample
      51                 :            :       space variables.
      52                 :            : 
      53                 :            :       Examples:
      54                 :            :       - p(X) denotes the univariate PDF of the full variable X,
      55                 :            :       - f(x1,x2) denotes the bivariate joint PDF of the fluctuations of the
      56                 :            :         variables x1 and x2 about their respective means,
      57                 :            :       - g(X,y,Z2) denotes the trivariate joint PDF of variables X,
      58                 :            :         y = Y - \<Y\>, and Z2.
      59                 :            : 
      60                 :            :   \see @ref statistics_output
      61                 :            : */
      62                 :            : // *****************************************************************************
      63                 :            : #ifndef Statistics_h
      64                 :            : #define Statistics_h
      65                 :            : 
      66                 :            : #include <vector>
      67                 :            : #include <cstddef>
      68                 :            : 
      69                 :            : #include "Types.hpp"
      70                 :            : #include "StatCtr.hpp"
      71                 :            : #include "Particles.hpp"
      72                 :            : #include "SystemComponents.hpp"
      73                 :            : #include "UniPDF.hpp"
      74                 :            : #include "BiPDF.hpp"
      75                 :            : #include "TriPDF.hpp"
      76                 :            : 
      77                 :            : namespace tk {
      78                 :            : 
      79                 :            : //! Statistics estimator
      80                 :            : class Statistics {
      81                 :            : 
      82                 :            :   public:
      83                 :            :     //! Constructor
      84                 :            :     explicit Statistics( const tk::Particles& particles,
      85                 :            :                          const ctr::OffsetMap& offset,
      86                 :            :                          const std::vector< ctr::Product >& stat,
      87                 :            :                          const std::vector< ctr::Probability >& pdf,
      88                 :            :                          const std::vector< std::vector< tk::real > >& binsize );
      89                 :            : 
      90                 :            :     //! Accumulate (i.e., only do the sum for) ordinary moments
      91                 :            :     void accumulateOrd();
      92                 :            : 
      93                 :            :     //! Accumulate (i.e., only do the sum for) central moments
      94                 :            :     void accumulateCen( const std::vector< tk::real >& om );
      95                 :            : 
      96                 :            :     //! Accumulate (i.e., only do the sum for) ordinary PDFs
      97                 :            :     void accumulateOrdPDF();
      98                 :            : 
      99                 :            :     //! Accumulate (i.e., only do the sum for) central PDFs
     100                 :            :     void accumulateCenPDF( const std::vector< tk::real >& om );
     101                 :            : 
     102                 :            :     //! Ordinary moments accessor
     103                 :    4495789 :     const std::vector< tk::real >& ord() const noexcept { return m_ordinary; }
     104                 :            : 
     105                 :            :     //! Central moments accessor
     106                 :    4495789 :     const std::vector< tk::real >& ctr() const noexcept { return m_central; }
     107                 :            : 
     108                 :            :     //! Ordinary univariate PDFs accessor
     109                 :    4495789 :     const std::vector< tk::UniPDF >& oupdf() const noexcept { return m_ordupdf; }
     110                 :            : 
     111                 :            :     //! Ordinary bivariate PDFs accessor
     112                 :    4495789 :     const std::vector< tk::BiPDF >& obpdf() const noexcept { return m_ordbpdf; }
     113                 :            : 
     114                 :            :     //! Ordinary trivariate PDFs accessor
     115                 :    4495789 :     const std::vector< tk::TriPDF >& otpdf() const noexcept { return m_ordtpdf; }
     116                 :            : 
     117                 :            :     //! Central univariate PDFs accessor
     118                 :    4495789 :     const std::vector< tk::UniPDF >& cupdf() const noexcept { return m_cenupdf; }
     119                 :            : 
     120                 :            :     //! Central bivariate PDFs accessor
     121                 :    4495789 :     const std::vector< tk::BiPDF >& cbpdf() const noexcept { return m_cenbpdf; }
     122                 :            : 
     123                 :            :     //! Central trivariate PDFs accessor
     124                 :    4495789 :     const std::vector< tk::TriPDF >& ctpdf() const noexcept { return m_centpdf; }
     125                 :            : 
     126                 :            :   private:
     127                 :            :     /** @name Setup functions, called from the constructor */
     128                 :            :     ///@{
     129                 :            :     //! Setup ordinary moments
     130                 :            :     void setupOrdinary( const ctr::OffsetMap& offset,
     131                 :            :                         const std::vector< ctr::Product >& stat );
     132                 :            : 
     133                 :            :     //! Setup central moments
     134                 :            :     void setupCentral( const ctr::OffsetMap& offset,
     135                 :            :                        const std::vector< ctr::Product >& stat );
     136                 :            : 
     137                 :            :     //! Setup PDFs
     138                 :            :     void setupPDF( const ctr::OffsetMap& offset,
     139                 :            :                    const std::vector< ctr::Probability >& pdf,
     140                 :            :                    const std::vector< std::vector< tk::real > >& binsize  );
     141                 :            :     ///@}
     142                 :            : 
     143                 :            :     //! Return mean for fluctuation
     144                 :            :     std::size_t mean(const tk::ctr::Term& term) const;
     145                 :            : 
     146                 :            :     //! Particle properties
     147                 :            :     const tk::Particles& m_particles;
     148                 :            : 
     149                 :            :     /** @name Data for statistical moment estimation */
     150                 :            :     ///@{
     151                 :            :     //! Instantaneous variable pointers for computing ordinary moments
     152                 :            :     std::vector< std::vector< const tk::real* > > m_instOrd;
     153                 :            :     //! Ordinary moments
     154                 :            :     std::vector< tk::real > m_ordinary;
     155                 :            :     //! Ordinary moment Terms, used to find means for fluctuations
     156                 :            :     std::vector< tk::ctr::Term > m_ordTerm;
     157                 :            :     //! Number of ordinary moments
     158                 :            :     std::size_t m_nord;
     159                 :            : 
     160                 :            :     //! Instantaneous variable pointers for computing central moments
     161                 :            :     std::vector< std::vector< const tk::real* > > m_instCen;
     162                 :            :     //! Central moments
     163                 :            :     std::vector< tk::real > m_central;
     164                 :            :     //! Ordinary moments about which to compute central moments
     165                 :            :     std::vector< std::vector< const tk::real* > > m_ctr;
     166                 :            :     //! Number of central moments
     167                 :            :     std::size_t m_ncen;
     168                 :            :     ///@}
     169                 :            : 
     170                 :            :     /** @name Data for univariate probability density function estimation */
     171                 :            :     ///@{
     172                 :            :     //! Instantaneous variable pointers for computing ordinary univariate PDFs
     173                 :            :     std::vector< std::vector< const tk::real* > > m_instOrdUniPDF;
     174                 :            :     //! Ordinary univariate PDFs
     175                 :            :     std::vector< tk::UniPDF > m_ordupdf;
     176                 :            : 
     177                 :            :     //! Instantaneous variable pointers for computing central univariate PDFs
     178                 :            :     std::vector< std::vector< const tk::real* > > m_instCenUniPDF;
     179                 :            :     //! Central univariate PDFs
     180                 :            :     std::vector< tk::UniPDF > m_cenupdf;
     181                 :            :     //! Ordinary moments about which to compute central univariate PDFs
     182                 :            :     std::vector< std::vector< const tk::real* > > m_ctrUniPDF;
     183                 :            :     ///@}
     184                 :            : 
     185                 :            :     /** @name Data for bivariate probability density function estimation */
     186                 :            :     ///@{
     187                 :            :     //! Instantaneous variable pointers for computing ordinary bivariate PDFs
     188                 :            :     std::vector< std::vector< const tk::real* > > m_instOrdBiPDF;
     189                 :            :     //! Ordinary bivariate PDFs
     190                 :            :     std::vector< tk::BiPDF > m_ordbpdf;
     191                 :            : 
     192                 :            :     //! Instantaneous variable pointers for computing central bivariate PDFs
     193                 :            :     std::vector< std::vector< const tk::real* > > m_instCenBiPDF;
     194                 :            :     //! Central bivariate PDFs
     195                 :            :     std::vector< tk::BiPDF > m_cenbpdf;
     196                 :            :     //! Ordinary moments about which to compute central bivariate PDFs
     197                 :            :     std::vector< std::vector< const tk::real* > > m_ctrBiPDF;
     198                 :            :     ///@}
     199                 :            : 
     200                 :            :     /** @name Data for trivariate probability density function estimation */
     201                 :            :     ///@{
     202                 :            :     //! Instantaneous variable pointers for computing ordinary trivariate PDFs
     203                 :            :     std::vector< std::vector< const tk::real* > > m_instOrdTriPDF;
     204                 :            :     //! Ordinary trivariate PDFs
     205                 :            :     std::vector< tk::TriPDF > m_ordtpdf;
     206                 :            : 
     207                 :            :     //! Instantaneous variable pointers for computing central trivariate PDFs
     208                 :            :     std::vector< std::vector< const tk::real* > > m_instCenTriPDF;
     209                 :            :     //! Central trivariate PDFs
     210                 :            :     std::vector< tk::TriPDF > m_centpdf;
     211                 :            :     //! Ordinary moments about which to compute central trivariate PDFs
     212                 :            :     std::vector< std::vector< const tk::real* > > m_ctrTriPDF;
     213                 :            :     ///@}
     214                 :            : };
     215                 :            : 
     216                 :            : } // tk::
     217                 :            : 
     218                 :            : #endif // Statistics_h
     219                 :            : 

Generated by: LCOV version 1.14