Commit 87ccb359 authored by Jeannie Backer's avatar Jeannie Backer
Browse files

PROG: Added QDataStream and XML serialization capabilities to...

PROG: Added QDataStream and XML serialization capabilities to StatCumProbDistDynCalc class. Improved per coding standards. Renamed member methods and variables for clarity. Improved coding test coverage. These updates were merged from the ipce branch.

git-svn-id: http://subversion.wr.usgs.gov/repos/prog/isis3/trunk@6482 41f8697f-d340-4b68-9986-7bafba869bb8
parent 3d063a99
Loading
Loading
Loading
Loading
+516 −186

File changed.

Preview size limit exceeded, changes collapsed.

+104 −43
Original line number Diff line number Diff line
@@ -21,89 +21,150 @@
 *  http://www.usgs.gov/privacy.html.
 */

#include <vector>
#include <QList>
#include <QObject>
#include <QVector>

#include "XmlStackedHandler.h"

class QDataStream;
class QUuid;
class QXmlStreamWriter;

namespace Isis {
  class Project;// ??? does xml stuff need project???
  class XmlStackedHandlerReader;

 /**
  * @brief This class is used to approximate cumulative probibility distributions of a stream of observations without storing the observations or having any apriori knowlege of the range of the data.  
  * @brief This class is used to approximate cumulative probibility distributions of a stream of
  *        observations without storing the observations or having any apriori knowlege of the range
  *        of the data.  
  *
  * This class is used to approximate cumulative probibility distributions of a stream of observations without storing the observations or having any apriori knowlege of the range of the data.
  * "The P^2 algorithim for dynamic calculation of Quantiles and Histograms without storing Obswervations" Raj Jain and Imrich Chlamtac, Communication of the ACM Oct 1985, is used.
  * A finite set of evenly spaced qunatiles are dynamically updated as more observations are added.  The number of quantiles is set in the construtor, and has a defualt of 20.
  * After sufficient data points (number of observations >> number of quantiles to track) the class provides cumulative probility as a function of value or vice versa.
  * Thus it can be used to build histograms or find any number of discrete quantiles.  Specific points on the function are evaluated by fiting piece wise parabolic functions to the three nearest adjacent nodes.
  * Preformance of algorithim is within a few percent error for most of the distribution (given sufficient data), however care should be taken if the points to be querried are within 200/(numberOfQuantiles-1)% of the edges of the distributions.
  * Near the edges the individual quantiles are still well calculated, but the piece wise parabolic function doesn't always fit the tails well, so interpolated points are more unrealiable.
  * Developement note: Two possible ways to improve the fitting of the tails: caculate more densely place quantiles near the edges, use exponential regression (or some other alternative--perhaps adaptively selected).
  * This class is used to approximate cumulative probibility distributions of a stream of
  * observations without storing the observations or having any apriori knowlege of the range of the 
  * data. "The P^2 algorithim for dynamic calculation of Quantiles and Histograms without storing 
  * Observations" Raj Jain and Imrich Chlamtac, Communication of the ACM Oct 1985, is used. A finite 
  * set of evenly spaced qunatiles are dynamically updated as more observations are added.  The 
  * number of quantiles is set in the construtor, and has a defualt of 20. After sufficient data 
  * points (number of observations >> number of quantiles to track) the class provides cumulative 
  * probility as a function of value or vice versa. Thus it can be used to build histograms or find 
  * any number of discrete quantiles.  Specific points on the function are evaluated by fiting piece 
  * wise parabolic functions to the three nearest adjacent nodes. Preformance of algorithim is 
  * within a few percent error for most of the distribution (given sufficient data), however care 
  * should be taken if the points to be querried are within 200/(numberOfQuantiles-1)% of the edges 
  * of the distributions. Near the edges the individual quantiles are still well calculated, but the 
  * piece wise parabolic function doesn't always fit the tails well, so interpolated points are more 
  * unrealiable. Developement note: Two possible ways to improve the fitting of the tails: caculate 
  * more densely place quantiles near the edges, use exponential regression (or some other 
  * alternative--perhaps adaptively selected).
  *
  *
  *
  * @ingroup Math
  * @ingroup Statistics
  *
  * @author 2012-03-23 Orrin Thomas
  *
  * @internal
  *   @history 2012-03-23 Orrin Thomas - Original Version
  *   @history 2014-07-19 Jeannie Backer - Added QDataStream >> and << operator methods. Brought
  *                           code closer to ISIS standards. Updated unitTest to include these
  *                           methods.
  *   @history 2014-09-11 Jeannie Backer - Added xml write/read capabilities. Fixed bug in cumPro()
  *                           method for previously untested lines (case where the given value is
  *                           closest to the last quantile value). Renamed member variables for
  *                           clarity.
  *
  */
  class StatCumProbDistDynCalc{
    //class uses the P^2 Algorithim to calculate equiprobability cell histograms from a stream of data without storing the data
    //  see "The p^2 Algorithim for Dynamic Calculations of Quantiles and Histograms Without Storing Observations"
  class StatCumProbDistDynCalc : public QObject {
    Q_OBJECT
    // class uses the P^2 Algorithim to calculate equiprobability cell histograms from a stream of 
    // data without storing the data 
    //  see "The p^2 Algorithim for Dynamic Calculations of Quantiles and Histograms Without Storing
    //  Observations"
    public:
    StatCumProbDistDynCalc(unsigned int nodes=20);  //individual qunatile value to be calculated
    ~StatCumProbDistDynCalc() { }; //empty destructor
      StatCumProbDistDynCalc(unsigned int nodes=20, QObject *parent = 0);  //individual qunatile value to be calculated
      StatCumProbDistDynCalc(Project *project, XmlStackedHandlerReader *xmlReader, 
                             QObject *parent = 0);   // TODO: does xml stuff need project???
      StatCumProbDistDynCalc(const StatCumProbDistDynCalc &other);
      ~StatCumProbDistDynCalc();
      StatCumProbDistDynCalc &operator=(const StatCumProbDistDynCalc &other);
    
    void addObs(double obs); //
      void initialize(); // clears the member lists and initializes the rest of the member data to 0 
      void setQuantiles(unsigned int nodes); // initializes/resets the class to start new calculation

      void validate();
      void addObs(double obs);
    
      double cumProb(double value); //given a value return the cumulative probility
      double value(double cumProb); //given a cumulative probibility return a value
      double max(); //return the largest value so far
      double min(); //return the smallest values so far
    void initialize(unsigned int nodes=20); //resets the class to start a new dynamic calculation

  private:

    /** The number of cells or bins that being used to model the probility density function
     */
    unsigned int m_nCells;     //the number of cells in the histogram


    /** The number of quantiles being used to model the probility density function
     *    This is one more than the number of cells.
     */
    unsigned int m_nQuan;     //the number of quantiles being calculated (m_cells+1)
    
      void save(QXmlStreamWriter &stream, const Project *project) const;   // TODO: does xml stuff need project???
    
      QDataStream &write(QDataStream &stream) const;
      QDataStream &read(QDataStream &stream);

    /** the quantiles being modeled begining at 0 and going to 1
    private:
      /**
       *
       * @author 2014-07-28 Jeannie Backer
       *
       * @internal
       */
    std::vector<double> m_quan;        //the target quantile
      class XmlHandler : public XmlStackedHandler {
        public:
          XmlHandler(StatCumProbDistDynCalc *probabilityCalc, Project *project);   // TODO: does xml stuff need project???
          ~XmlHandler();
   
          virtual bool startElement(const QString &namespaceURI, const QString &localName,
                                    const QString &qName, const QXmlAttributes &atts);
          virtual bool characters(const QString &ch);
          virtual bool endElement(const QString &namespaceURI, const QString &localName,
                                    const QString &qName);
   
        private:
          Q_DISABLE_COPY(XmlHandler);
   
    /** The ideal number of observations that should be less than or equal to the value of the corresponding quantiles, note this is dynamically changing as observations are added
     */
    std::vector<double> m_nIdeal;      //ideal positions of quantiles
          StatCumProbDistDynCalc *m_xmlHandlerCumProbCalc;
          Project *m_xmlHandlerProject;   // TODO: does xml stuff need project???
          QString m_xmlHandlerCharacters;
      };

      QUuid *m_id; /**< A unique ID for this object (useful for others to reference this object when
                                      saving to disk).*/

      unsigned int m_numberCells; /**< The number of cells or histogram bins that are being used to
                                      model the probility density function.*/
      
    /** The actual number of observations that are less than or equal to the value of the corresponding quantiles, note this is dynamically changing as observations are added
     */
    std::vector<int> m_n;
      unsigned int m_numberQuantiles; /**< The number of quantiles being used to model the probility
                                      density function. This value is one more than the number of
                                      cells, (i.e. m_numberQuantiles=m_cells+1).*/
      
      unsigned int m_numberObservations; /**< The number of observations, note this is dynamically
                                      changing as observations are added.*/

      QList<double> m_quantiles; /**< The target quantiles being modeled, between 0 and 1.*/
      
    /**  The calculated values of the quantiles, note this is dynamically changing as observations are added
     */
    std::vector<double> m_q;
      QList<double> m_observationValues; /**< The calculated values of the quantiles, note this is
                                      dynamically changing as observations are added.*/

      QList<double> m_idealNumObsBelowQuantile; /**< The ideal number of observations that
                                      should be less than or equal to the value of the corresponding
                                      quantiles, note this is dynamically changing as observations
                                      are added.*/
      
      QList<int> m_numObsBelowQuantile; /**< The actual number of observations that are less
                                      than or equal to the value of the corresponding quantiles,
                                      note this is dynamically changing as observations are added.*/
            
    /**  The number of observations, note this is dynamically changing as observations are added
     */
    unsigned int m_nObs;  //the number of observations
  };

  // operators to read/write StatCumProbDistDynCalc to/from binary data
  QDataStream &operator<<(QDataStream &stream, const StatCumProbDistDynCalc &scpddc);
  QDataStream &operator>>(QDataStream &stream, StatCumProbDistDynCalc &scpddc);

} //end namespace Isis

#endif
+340 −18
Original line number Diff line number Diff line
Testing failure modes 
Querying minimum before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying minimum before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying a value (as a function of cumulative probability) before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying a cumulative probability (as a function of value) before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying a nonsense cumulative probability (2.0): **PROGRAMMER ERROR** Argument to StatCumProbDistDynCalc::value(double cumProb) must be on the domain [0,1].
Querying a nonsense cumulative probability (-1.0): **PROGRAMMER ERROR** Argument to StatCumProbDistDynCalc::value(double cumProb) must be on the domain [0,1].

Testing approximations
Querying minimum before the number of observations is greater than or equal to the number of quantiles:  
**PROGRAMMER ERROR** StatCumProbDistDynCalc will return no data until the number of observations added [20] matches the number of quantiles [51] (i.e. number of nodes) selected.
Querying maximum before the number of observations is greater than or equal to the number of quantiles:  
**PROGRAMMER ERROR** StatCumProbDistDynCalc will return no data until the number of observations added [20] matches the number of quantiles [51] (i.e. number of nodes) selected.
Querying a value (as a function of cumulative probability) before the number of observations is greater than or equal to the number of quantiles:  
**PROGRAMMER ERROR** StatCumProbDistDynCalc will return no data until the number of observations added [20] matches the number of quantiles [51] (i.e. number of nodes) selected.
Querying a cumulative probability (as a function of value) before the number of observations is greater than or equal to the number of quantiles:  
**PROGRAMMER ERROR** StatCumProbDistDynCalc will return no data until the number of observations added [20] matches the number of quantiles [51] (i.e. number of nodes) selected.
Querying a nonsense cumulative probability (2.0):  
**PROGRAMMER ERROR** Invalid cumulative probability [2.0] passed in to StatCumProbDistDynCalc::value(double cumProb). Must be on the domain [0, 1].
Querying a nonsense cumulative probability (-1.0):  
**PROGRAMMER ERROR** Invalid cumulative probability [-1.0] passed in to StatCumProbDistDynCalc::value(double cumProb). Must be on the domain [0, 1].
Testing XML: read XML with no attributes or values to StatCumProbDistDynCalc object... Then try to get min from object with no observations. 
**PROGRAMMER ERROR** StatCumProbDistDynCalc will return no data until the quantiles have been set. Number of cells = [0].

Testing successful construction of StatCumProbDistDynCalc object 
Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 
@@ -19,6 +36,18 @@ percent error: 2.49513%
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 
@@ -31,18 +60,184 @@ approximate cumprobabilty [-oo,5.0]: 0.691477
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 



reinitialize the class and redo the tests 
Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 

0.50 approximated Quantile:  4.09981 
0.50 theoretical Quantile: 4.0 
percent error:  2.49513 % 

0.75 approximated Quantile:  5.31623 
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 

approximated cumprobabilty [-oo, 2.0]:  0.144109 
theoretical: 0.158655253931457... 
percent error:  -9.16825 % 

approximate cumprobabilty [-oo, 5.0]:  0.691477 
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 



Testing copy constructor... 
Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 

0.50 approximated Quantile:  4.09981 
0.50 theoretical Quantile: 4.0 
percent error:  2.49513 % 

0.75 approximated Quantile:  5.31623 
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 

approximated cumprobabilty [-oo, 2.0]:  0.144109 
theoretical: 0.158655253931457... 
percent error:  -9.16825 % 

approximate cumprobabilty [-oo, 5.0]:  0.691477 
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 



Testing assignment operator=... 
Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 

0.50 approximated Quantile:  4.09981 
0.50 theoretical Quantile: 4.0 
percent error:  2.49513 % 

0.75 approximated Quantile:  5.31623 
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 

approximated cumprobabilty [-oo, 2.0]:  0.144109 
theoretical: 0.158655253931457... 
percent error:  -9.16825 % 

approximate cumprobabilty [-oo, 5.0]:  0.691477 
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 


Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

reinitiliaze the class and redo the tests
Testing failure modes
Querying minimum before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying minimum before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying a value (as a function of cumulative probability) before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying a cumulative probability (as a function of value) before the number of observations is greater than or equal to the number of quantiles: **PROGRAMMER ERROR** StatCumDistDynCalc will return no data until there has been at least m_nQuan observations added.
Querying a nonsense cumulative probability (2.0): **PROGRAMMER ERROR** Argument to StatCumProbDistDynCalc::value(double cumProb) must be on the domain [0,1].
Querying a nonsense cumulative probability (-1.0): **PROGRAMMER ERROR** Argument to StatCumProbDistDynCalc::value(double cumProb) must be on the domain [0,1].

Testing approximations
0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 
@@ -55,6 +250,18 @@ percent error: 2.49513%
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 
@@ -67,3 +274,118 @@ approximate cumprobabilty [-oo,5.0]: 0.691477
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 



Testing serialization... 
Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 

0.50 approximated Quantile:  4.09981 
0.50 theoretical Quantile: 4.0 
percent error:  2.49513 % 

0.75 approximated Quantile:  5.31623 
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 

approximated cumprobabilty [-oo, 2.0]:  0.144109 
theoretical: 0.158655253931457... 
percent error:  -9.16825 % 

approximate cumprobabilty [-oo, 5.0]:  0.691477 
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 



Testing XML: write XML from StatCumProbDistDynCalc object... 
Testing XML: read XML to StatCumProbDistDynCalc object... 
Min =  -1.27253 
Max =  9.07652 

0.0 approximated Quantile:  -1.27253 
0.0 theoretical Quantile: -1.272533598... 
percent error:  0 % 

0.005 approximated Quantile:  -1.05122 

0.25 approximated Quantile:  2.84146 
0.25 theoretical Quantile: 2.6510204996078... 
percent error:  7.18374 % 

0.50 approximated Quantile:  4.09981 
0.50 theoretical Quantile: 4.0 
percent error:  2.49513 % 

0.75 approximated Quantile:  5.31623 
0.75 theoretical Quantile: 5.34897950039216... 
percent error:  -0.612173 % 

0.995 approximated Quantile:  8.98943 

0.0 approximated Quantile:  9.07652 
0.0 theoretical Quantile: 9.07652065... 
percent error:  0 % 

approximated cumprobabilty [-oo, -2.0]:  0 
theoretical: 0.0... 
percent error:  0 % 

approximated cumprobabilty [-oo, -1.2]:  0.00163608 

approximated cumprobabilty [-oo, 0]:  0.0290357 
theoretical: 0.022750131948179... 
percent error:  27.6285 % 

approximated cumprobabilty [-oo, 2.0]:  0.144109 
theoretical: 0.158655253931457... 
percent error:  -9.16825 % 

approximate cumprobabilty [-oo, 5.0]:  0.691477 
theoretical: 0.691462461274013... 
percent error:  0.00216297 % 

approximate cumprobabilty [-oo, 9.0]:  0.996511 

approximate cumprobabilty [-oo, 9.07652065]:  1 
theoretical: 1.0... 
percent error:  0 % 
+642 −133

File changed.

Preview size limit exceeded, changes collapsed.

+10 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<statCumProbDistDynCalc>
    <id></id>
    <numberQuantiles></numberQuantiles>
    <numberCells></numberCells>
    <numberObservations></numberObservations>
    <observationData>
        <observation />
    </observationData>
</statCumProbDistDynCalc>
Loading