Line data Source code
1 : /* 2 : * Copyright (c) 2015 Cisco and/or its affiliates. 3 : * Licensed under the Apache License, Version 2.0 (the "License"); 4 : * you may not use this file except in compliance with the License. 5 : * You may obtain a copy of the License at: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 9 : * Unless required by applicable law or agreed to in writing, software 10 : * distributed under the License is distributed on an "AS IS" BASIS, 11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : * See the License for the specific language governing permissions and 13 : * limitations under the License. 14 : */ 15 : /* 16 : Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus 17 : 18 : Permission is hereby granted, free of charge, to any person obtaining 19 : a copy of this software and associated documentation files (the 20 : "Software"), to deal in the Software without restriction, including 21 : without limitation the rights to use, copy, modify, merge, publish, 22 : distribute, sublicense, and/or sell copies of the Software, and to 23 : permit persons to whom the Software is furnished to do so, subject to 24 : the following conditions: 25 : 26 : The above copyright notice and this permission notice shall be 27 : included in all copies or substantial portions of the Software. 28 : 29 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 30 : EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 31 : MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 32 : NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 33 : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 34 : OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 35 : WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 36 : */ 37 : 38 : #include <vppinfra/random.h> 39 : 40 : /** \file random.c 41 : Random number support 42 : */ 43 : 44 : /** \brief Default random seed for standalone version of library. 45 : Value can be overridden by platform code from e.g. 46 : machine's clock count register. */ 47 : u32 standalone_random_default_seed = 1; 48 : 49 : /** 50 : * \brief Compute the X2 test statistic for a vector of counts. 51 : * Each value element corresponds to a histogram bucket. 52 : * 53 : * Typical use-case: test the hypothesis that a set of octets 54 : * are uniformly distributed (aka random). 55 : * 56 : * In a 1-dimensional use-case, the result should be compared 57 : * with the critical value from chi square tables with 58 : * vec_len(values) - 1 degrees of freedom. 59 : * 60 : * @param[in] values vector of histogram bucket values 61 : * @return d - Pearson's X2 test statistic 62 : */ 63 : 64 : __clib_export f64 65 0 : clib_chisquare (u64 *values) 66 : { 67 : u32 i, len; 68 : f64 d, delta_d, actual_frequency, expected_frequency; 69 0 : u64 n_observations = 0; 70 : 71 0 : len = vec_len (values); 72 : /* 73 : * Shut up coverity. Return a huge number which should always exceed 74 : * the X2 critical value. 75 : */ 76 0 : if (len == 0) 77 0 : return (f64) 1e70; 78 : 79 0 : for (i = 0; i < len; i++) 80 0 : n_observations += values[i]; 81 : 82 0 : expected_frequency = (1.0 / (f64) len) * (f64) n_observations; 83 : 84 0 : d = 0.0; 85 : 86 0 : for (i = 0; i < len; i++) 87 : { 88 0 : actual_frequency = ((f64) values[i]); 89 0 : delta_d = ((actual_frequency - expected_frequency) 90 0 : * (actual_frequency - expected_frequency)) 91 : / expected_frequency; 92 0 : d += delta_d; 93 : } 94 0 : return d; 95 : } 96 : 97 : /* 98 : * fd.io coding-style-patch-verification: ON 99 : * 100 : * Local Variables: 101 : * eval: (c-set-style "gnu") 102 : * End: 103 : */