mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
0.1.0 Gauss
This commit is contained in:
parent
26e3dff4ad
commit
8270df9d5a
34
libraries/Gauss/.arduino-ci.yml
Normal file
34
libraries/Gauss/.arduino-ci.yml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
platforms:
|
||||||
|
rpipico:
|
||||||
|
board: rp2040:rp2040:rpipico
|
||||||
|
package: rp2040:rp2040
|
||||||
|
gcc:
|
||||||
|
features:
|
||||||
|
defines:
|
||||||
|
- ARDUINO_ARCH_RP2040
|
||||||
|
warnings:
|
||||||
|
flags:
|
||||||
|
|
||||||
|
packages:
|
||||||
|
rp2040:rp2040:
|
||||||
|
url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
|
||||||
|
|
||||||
|
compile:
|
||||||
|
# Choosing to run compilation tests on 2 different Arduino platforms
|
||||||
|
platforms:
|
||||||
|
- uno
|
||||||
|
# - due
|
||||||
|
# - zero
|
||||||
|
# - leonardo
|
||||||
|
- m4
|
||||||
|
- esp32
|
||||||
|
- esp8266
|
||||||
|
# - mega2560
|
||||||
|
- rpipico
|
||||||
|
libraries:
|
||||||
|
- MultiMap
|
||||||
|
|
||||||
|
unittest:
|
||||||
|
# These dependent libraries will be installed
|
||||||
|
libraries:
|
||||||
|
- MultiMap
|
4
libraries/Gauss/.github/FUNDING.yml
vendored
Normal file
4
libraries/Gauss/.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: RobTillaart
|
||||||
|
|
13
libraries/Gauss/.github/workflows/arduino-lint.yml
vendored
Normal file
13
libraries/Gauss/.github/workflows/arduino-lint.yml
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
name: Arduino-lint
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: arduino/arduino-lint-action@v1
|
||||||
|
with:
|
||||||
|
library-manager: update
|
||||||
|
compliance: strict
|
17
libraries/Gauss/.github/workflows/arduino_test_runner.yml
vendored
Normal file
17
libraries/Gauss/.github/workflows/arduino_test_runner.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
name: Arduino CI
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
runTest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: 2.6
|
||||||
|
- run: |
|
||||||
|
gem install arduino_ci
|
||||||
|
arduino_ci.rb
|
18
libraries/Gauss/.github/workflows/jsoncheck.yml
vendored
Normal file
18
libraries/Gauss/.github/workflows/jsoncheck.yml
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
name: JSON check
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '**.json'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: json-syntax-check
|
||||||
|
uses: limitusus/json-syntax-check@v1
|
||||||
|
with:
|
||||||
|
pattern: "\\.json$"
|
||||||
|
|
11
libraries/Gauss/CHANGELOG.md
Normal file
11
libraries/Gauss/CHANGELOG.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Change Log Gauss
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||||
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
|
||||||
|
## [0.1.0] - 2023-07-06
|
||||||
|
- initial version
|
||||||
|
|
11
libraries/Gauss/Gauss.cpp
Normal file
11
libraries/Gauss/Gauss.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//
|
||||||
|
// FILE: Gauss.cpp
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// VERSION: 0.1.0
|
||||||
|
// PURPOSE: Library for the Gauss probability math.
|
||||||
|
// DATE: 2023-07-06
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
||||||
|
|
111
libraries/Gauss/Gauss.h
Normal file
111
libraries/Gauss/Gauss.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#pragma once
|
||||||
|
//
|
||||||
|
// FILE: Gauss.h
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// VERSION: 0.1.0
|
||||||
|
// PURPOSE: Library for the Gauss probability math.
|
||||||
|
// DATE: 2023-07-06
|
||||||
|
|
||||||
|
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "MultiMap.h"
|
||||||
|
|
||||||
|
#define GAUSS_LIB_VERSION (F("0.1.0"))
|
||||||
|
|
||||||
|
|
||||||
|
class Gauss
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Gauss()
|
||||||
|
{
|
||||||
|
_mean = 0;
|
||||||
|
_stddev = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool begin(float mean, float stddev)
|
||||||
|
{
|
||||||
|
_mean = mean;
|
||||||
|
_stddev = abs(stddev);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float P_smaller(float value)
|
||||||
|
{
|
||||||
|
if (_stddev == 0) return NAN;
|
||||||
|
return _P_smaller((value - _mean) / _stddev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float P_larger(float value)
|
||||||
|
{
|
||||||
|
return 1.0 - P_smaller(value);
|
||||||
|
// if (_stddev == 0) return NAN;
|
||||||
|
// optimize math division?
|
||||||
|
// return _P_larger((value - _mean) / _stddev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float P_between(float p, float q)
|
||||||
|
{
|
||||||
|
if (p >= q) return 0;
|
||||||
|
return P_smaller(q) - P_smaller(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float P_equal(float value)
|
||||||
|
{
|
||||||
|
if (_stddev == 0) return NAN;
|
||||||
|
float n = (value - _mean)/_stddev;
|
||||||
|
float c = 1.0 / (_stddev * sqrt(TWO_PI));
|
||||||
|
return c * exp(-0.5 * n * n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float stddevs(float value)
|
||||||
|
{
|
||||||
|
return normalize(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float normalize(float value)
|
||||||
|
{
|
||||||
|
return (value - _mean)/_stddev;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float bellCurve(float value)
|
||||||
|
{
|
||||||
|
return P_equal(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
float _P_smaller(float x)
|
||||||
|
{
|
||||||
|
// TODO improve accuracy or reduce points.
|
||||||
|
float __gauss[] = {
|
||||||
|
0.5000, 0.5398, 0.5793, 0.6179, 0.6554, 0.6915, 0.7257, 0.7580,
|
||||||
|
0.7881, 0.8159, 0.8413, 0.8643, 0.8849, 0.9032, 0.9192, 0.9332,
|
||||||
|
0.9452, 0.9554, 0.9641, 0.9713, 0.9772, 0.9821, 0.9861, 0.9893,
|
||||||
|
0.9918, 0.9938, 0.9953, 0.9965, 0.9974, 0.9981, 0.9987, 1.0000
|
||||||
|
};
|
||||||
|
float __z[] = {
|
||||||
|
0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7,
|
||||||
|
0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5,
|
||||||
|
1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3,
|
||||||
|
2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 10.0
|
||||||
|
};
|
||||||
|
|
||||||
|
if (x < 0) return 1.0 - multiMap<float>(-x, __z, __gauss, 32);
|
||||||
|
return multiMap<float>(x, __z, __gauss, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
float _mean = 0;
|
||||||
|
float _stddev = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
21
libraries/Gauss/LICENSE
Normal file
21
libraries/Gauss/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023-2023 Rob Tillaart
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
124
libraries/Gauss/README.md
Normal file
124
libraries/Gauss/README.md
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
|
||||||
|
[![Arduino CI](https://github.com/RobTillaart/Gauss/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
|
||||||
|
[![Arduino-lint](https://github.com/RobTillaart/Gauss/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/Gauss/actions/workflows/arduino-lint.yml)
|
||||||
|
[![JSON check](https://github.com/RobTillaart/Gauss/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/Gauss/actions/workflows/jsoncheck.yml)
|
||||||
|
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/Gauss/blob/master/LICENSE)
|
||||||
|
[![GitHub release](https://img.shields.io/github/release/RobTillaart/Gauss.svg?maxAge=3600)](https://github.com/RobTillaart/Gauss/releases)
|
||||||
|
|
||||||
|
|
||||||
|
# Gauss
|
||||||
|
|
||||||
|
Library for the Gauss probability math.
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Gauss is an experimental Arduino library to approximate the probability that a value is
|
||||||
|
smaller or larger than a given value.
|
||||||
|
These under the premises of a Gaussian distribution with parameters **mean** and **stddev**
|
||||||
|
(a.k.a. average / mu and standard deviation / sigma).
|
||||||
|
If these parameters are not given, 0 and 1 are used by default (normalized Gaussian distribution).
|
||||||
|
|
||||||
|
The values are approximated with **MultiMap()** using a 32 points interpolated lookup.
|
||||||
|
Therefore the **MultiMap** library need to be downloaded too (see related below).
|
||||||
|
The number of lookup points might chance in the future.
|
||||||
|
|
||||||
|
Return values are given as floats, if one needs percentages, just multiply by 100.0.
|
||||||
|
|
||||||
|
|
||||||
|
#### Accuracy
|
||||||
|
|
||||||
|
The lookup table used has 32 points with 4 significant digits.
|
||||||
|
Do not expect a higher accuracy / precision.
|
||||||
|
For many applications this accuracy is sufficient.
|
||||||
|
|
||||||
|
(links to a table with more significant digits is welcome).
|
||||||
|
|
||||||
|
|
||||||
|
#### Applications
|
||||||
|
|
||||||
|
- use as a filter? do not allow > 3 sigma
|
||||||
|
- compare historic data to current data
|
||||||
|
- compare population data with individual
|
||||||
|
|
||||||
|
|
||||||
|
#### Related
|
||||||
|
|
||||||
|
- https://en.wikipedia.org/wiki/Normal_distribution
|
||||||
|
- https://github.com/RobTillaart/Multimap
|
||||||
|
- https://github.com/RobTillaart/Statistic (more stat links there).
|
||||||
|
|
||||||
|
|
||||||
|
## Interface
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include Gauss.h
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Base
|
||||||
|
|
||||||
|
- **Gauss()** constructor. Uses mean = 0 and stddev = 1 by default.
|
||||||
|
- **bool begin(float mean, float stddev)** set the mean and stddev.
|
||||||
|
Returns true on success. If needed stddev is made positive.
|
||||||
|
|
||||||
|
#### Probability
|
||||||
|
|
||||||
|
- **float P_smaller(float f)** returns probability **P(x < f)**.
|
||||||
|
Multiply by 100.0 to get the value as a percentage.
|
||||||
|
- **float P_larger(float f)** returns probability **P(x > f)**.
|
||||||
|
Multiply by 100.0 to get the value as a percentage.
|
||||||
|
- **float P_between(float f, float g)** returns probability **P(f < x < g)**.
|
||||||
|
Multiply by 100.0 to get the value as a percentage.
|
||||||
|
- **float P_equal(float f)** returns probability **P(x == f)**.
|
||||||
|
This is the bell curve formula.
|
||||||
|
|
||||||
|
#### Other
|
||||||
|
|
||||||
|
- **float normalize(float f)** normalize a value to normalized distribution.
|
||||||
|
Is equal to number of **stddevs()**.
|
||||||
|
- **float stddevs(float f)** returns the number of stddevs from the mean.
|
||||||
|
E.g if mean == 50 and stddev == 14, then 71 ==> +1.5 sigma.
|
||||||
|
- **float bellCurve(float f)** returns probability **P(x == f)**.
|
||||||
|
|
||||||
|
|
||||||
|
## Future
|
||||||
|
|
||||||
|
#### Must
|
||||||
|
|
||||||
|
- documentation
|
||||||
|
- mu + sigma character
|
||||||
|
- unit tests
|
||||||
|
|
||||||
|
#### Should
|
||||||
|
|
||||||
|
- optimize performance
|
||||||
|
- remove division by stddev
|
||||||
|
- optimize accuracy
|
||||||
|
- revisit lookup of MultiMap
|
||||||
|
- (-10 .. 0) might be more accurate (significant digits)?
|
||||||
|
- double instead of floats? (good table?)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### Could
|
||||||
|
|
||||||
|
- **void setMean(float f)**
|
||||||
|
- **float getMean()**
|
||||||
|
- **void setStddev(float f)**
|
||||||
|
- **float getStddev()**
|
||||||
|
- default values for **begin(0,1)**
|
||||||
|
- add examples
|
||||||
|
- e.g. temperature (DS18B20 or DHT22)
|
||||||
|
- e.g. loadcell (HX711)
|
||||||
|
- does the stddev needs to be positive,
|
||||||
|
- what happens if negative values are allowed?
|
||||||
|
- equality test Gauss objects
|
||||||
|
- move code to .cpp file? (rather small lib).
|
||||||
|
- embed MultiMap hardcoded instead of library dependency
|
||||||
|
- **bellCurve()** => **Z()**?
|
||||||
|
|
||||||
|
|
||||||
|
#### Won't (unless requested)
|
||||||
|
|
||||||
|
|
154
libraries/Gauss/examples/Gauss_performance/Gauss_performance.ino
Normal file
154
libraries/Gauss/examples/Gauss_performance/Gauss_performance.ino
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
//
|
||||||
|
// FILE: Gauss_performance.ino
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// PURPOSE: demo
|
||||||
|
|
||||||
|
|
||||||
|
#include "Gauss.h"
|
||||||
|
|
||||||
|
Gauss G;
|
||||||
|
volatile float x;
|
||||||
|
|
||||||
|
uint32_t start;
|
||||||
|
uint32_t stop;
|
||||||
|
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println(__FILE__);
|
||||||
|
Serial.print("GAUSS_LIB_VERSION: ");
|
||||||
|
Serial.println(GAUSS_LIB_VERSION);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("Timing in micros");
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
test_1();
|
||||||
|
test_2();
|
||||||
|
test_3();
|
||||||
|
test_4();
|
||||||
|
test_5();
|
||||||
|
test_6();
|
||||||
|
|
||||||
|
Serial.println("\ndone...");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_1()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
start = micros();
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
x = G.P_smaller(f);
|
||||||
|
}
|
||||||
|
stop = micros();
|
||||||
|
|
||||||
|
Serial.print("P_smaller:\t");
|
||||||
|
Serial.print(stop - start);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_2()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
start = micros();
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
x = G.P_larger(f);
|
||||||
|
}
|
||||||
|
stop = micros();
|
||||||
|
|
||||||
|
Serial.print("P_larger:\t");
|
||||||
|
Serial.print(stop - start);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_3()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
start = micros();
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
x = G.P_between(0, f);
|
||||||
|
}
|
||||||
|
stop = micros();
|
||||||
|
|
||||||
|
Serial.print("P_between:\t");
|
||||||
|
Serial.print(stop - start);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_4()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
start = micros();
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
x = G.normalize(f);
|
||||||
|
}
|
||||||
|
stop = micros();
|
||||||
|
|
||||||
|
Serial.print("normalize:\t");
|
||||||
|
Serial.print(stop - start);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_5()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
start = micros();
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
x = G.bellCurve(f);
|
||||||
|
}
|
||||||
|
stop = micros();
|
||||||
|
|
||||||
|
Serial.print("bellCurve:\t");
|
||||||
|
Serial.print(stop - start);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_6()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
float cf = 0.52330751; // See Gauss_test_bell_curve.ino
|
||||||
|
start = micros();
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
float a = G.P_smaller(f - cf);
|
||||||
|
float b = G.P_smaller(f + cf);
|
||||||
|
x = a - b;
|
||||||
|
}
|
||||||
|
stop = micros();
|
||||||
|
|
||||||
|
Serial.print("approx.bell:\t");
|
||||||
|
Serial.print(stop - start);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
@ -0,0 +1,16 @@
|
|||||||
|
Arduino UNO
|
||||||
|
IDE 1.8.19
|
||||||
|
|
||||||
|
Gauss_performance.ino
|
||||||
|
GAUSS_LIB_VERSION: 0.1.0
|
||||||
|
|
||||||
|
Timing in micros
|
||||||
|
|
||||||
|
P_smaller: 375396
|
||||||
|
P_larger: 384368
|
||||||
|
P_between: 265624
|
||||||
|
normalize: 44172
|
||||||
|
bellCurve: 255728
|
||||||
|
approx.bell: 764028
|
||||||
|
|
||||||
|
done...
|
80
libraries/Gauss/examples/Gauss_test/Gauss_test.ino
Normal file
80
libraries/Gauss/examples/Gauss_test/Gauss_test.ino
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
//
|
||||||
|
// FILE: Gauss_test.ino
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// PURPOSE: demo
|
||||||
|
|
||||||
|
|
||||||
|
#include "Gauss.h"
|
||||||
|
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println(__FILE__);
|
||||||
|
Serial.print("GAUSS_LIB_VERSION: ");
|
||||||
|
Serial.println(GAUSS_LIB_VERSION);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
test_1();
|
||||||
|
test_2();
|
||||||
|
test_3();
|
||||||
|
test_4();
|
||||||
|
|
||||||
|
Serial.println("\ndone...");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_1()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.025)
|
||||||
|
{
|
||||||
|
Serial.println(100 * G.P_smaller(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_2()
|
||||||
|
{
|
||||||
|
G.begin(100, 25);
|
||||||
|
|
||||||
|
for (float f = 0; f <= 200; f += 1)
|
||||||
|
{
|
||||||
|
Serial.println(100 * G.P_smaller(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_3()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.025)
|
||||||
|
{
|
||||||
|
Serial.println(100 * G.P_larger(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_4()
|
||||||
|
{
|
||||||
|
G.begin(100, 25);
|
||||||
|
|
||||||
|
for (float f = 0; f <= 200; f += 1)
|
||||||
|
{
|
||||||
|
Serial.println(100.0 * G.P_larger(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
@ -0,0 +1,87 @@
|
|||||||
|
//
|
||||||
|
// FILE: Gauss_test_bell_curve.ino
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// PURPOSE: demo
|
||||||
|
|
||||||
|
|
||||||
|
#include "Gauss.h"
|
||||||
|
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
volatile float x;
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println(__FILE__);
|
||||||
|
Serial.print("GAUSS_LIB_VERSION: ");
|
||||||
|
Serial.println(GAUSS_LIB_VERSION);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
get_bell_curve();
|
||||||
|
approximate();
|
||||||
|
|
||||||
|
Serial.println("\ndone...");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void get_bell_curve()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
Serial.println(100.0 * G.bellCurve(f), 6);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void approximate()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
// width == 2x 0.5233 == 1.0466
|
||||||
|
// 0.0466 heuristic correction factor to match peak of bellCurve()
|
||||||
|
// not exact match but almost perfect
|
||||||
|
float cf = 0.52330751;
|
||||||
|
float a = G.P_smaller(f - cf);
|
||||||
|
float b = G.P_smaller(f + cf);
|
||||||
|
Serial.println(100.0 * (b - a), 6);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// find the correction factor for the appoximate function
|
||||||
|
// so the peak matches the bell curve function.
|
||||||
|
// ==> 0.52330751
|
||||||
|
void find_correction_factor()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
float ref = 100.0 * G.bellCurve(0);
|
||||||
|
float cf = 0.5233; // 0.52330751;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
cf += 0.0000001;
|
||||||
|
float a = G.P_smaller(-cf);
|
||||||
|
float b = G.P_smaller(+cf);
|
||||||
|
x = 100.0 * (b - a);
|
||||||
|
}
|
||||||
|
while (x < ref);
|
||||||
|
Serial.print("Correction Factor: ");
|
||||||
|
Serial.println(cf, 8);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
81
libraries/Gauss/examples/Gauss_test_dump/Gauss_test_dump.ino
Normal file
81
libraries/Gauss/examples/Gauss_test_dump/Gauss_test_dump.ino
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
//
|
||||||
|
// FILE: Gauss_test_dump.ino
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// PURPOSE: demo
|
||||||
|
|
||||||
|
|
||||||
|
#include "Gauss.h"
|
||||||
|
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println(__FILE__);
|
||||||
|
Serial.print("GAUSS_LIB_VERSION: ");
|
||||||
|
Serial.println(GAUSS_LIB_VERSION);
|
||||||
|
|
||||||
|
test_1();
|
||||||
|
test_2();
|
||||||
|
test_3();
|
||||||
|
test_4();
|
||||||
|
|
||||||
|
Serial.println("\ndone...");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_1()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.025)
|
||||||
|
{
|
||||||
|
Serial.println(100 * G.P_smaller(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_2()
|
||||||
|
{
|
||||||
|
G.begin(100, 25);
|
||||||
|
|
||||||
|
for (float f = 0; f <= 200; f += 1)
|
||||||
|
{
|
||||||
|
Serial.println(100 * G.P_smaller(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_3()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.025)
|
||||||
|
{
|
||||||
|
Serial.println(100 * G.P_larger(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_4()
|
||||||
|
{
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
for (float f = -5.0; f <= 5.0; f += 0.01)
|
||||||
|
{
|
||||||
|
Serial.println(100.0 * G.P_equal(f));
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
23
libraries/Gauss/keywords.txt
Normal file
23
libraries/Gauss/keywords.txt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Syntax Colouring Map For Gauss
|
||||||
|
|
||||||
|
# Data types (KEYWORD1)
|
||||||
|
Gauss KEYWORD1
|
||||||
|
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
|
||||||
|
begin KEYWORD2
|
||||||
|
|
||||||
|
P_smaller KEYWORD2
|
||||||
|
P_larger KEYWORD2
|
||||||
|
P_between KEYWORD2
|
||||||
|
P_equal KEYWORD2
|
||||||
|
|
||||||
|
stddevs KEYWORD2
|
||||||
|
normalize KEYWORD2
|
||||||
|
bellCurve KEYWORD2
|
||||||
|
|
||||||
|
|
||||||
|
# Constants (LITERAL1)
|
||||||
|
GAUSS_LIB_VERSION LITERAL1
|
||||||
|
|
||||||
|
|
31
libraries/Gauss/library.json
Normal file
31
libraries/Gauss/library.json
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "Gauss",
|
||||||
|
"keywords": "Probability",
|
||||||
|
"description": "Library for the Gauss probability math.",
|
||||||
|
"authors":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Rob Tillaart",
|
||||||
|
"email": "Rob.Tillaart@gmail.com",
|
||||||
|
"maintainer": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"repository":
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/RobTillaart/Gauss.git"
|
||||||
|
},
|
||||||
|
"dependencies":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"owner": "Rob Tillaart",
|
||||||
|
"name": "MultiMap",
|
||||||
|
"version": "^0.1.7"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": "0.1.0",
|
||||||
|
"license": "MIT",
|
||||||
|
"frameworks": "arduino",
|
||||||
|
"platforms": "*",
|
||||||
|
"headers": "Gauss.h"
|
||||||
|
}
|
12
libraries/Gauss/library.properties
Normal file
12
libraries/Gauss/library.properties
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
name=Gauss
|
||||||
|
version=0.1.0
|
||||||
|
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||||
|
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||||
|
sentence=Library for the Gauss probability math.
|
||||||
|
paragraph=
|
||||||
|
category=Data Processing
|
||||||
|
url=https://github.com/RobTillaart/Gauss
|
||||||
|
architectures=*
|
||||||
|
includes=Gauss.h
|
||||||
|
depends=MultiMap
|
||||||
|
|
117
libraries/Gauss/test/unit_test_001.cpp
Normal file
117
libraries/Gauss/test/unit_test_001.cpp
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
//
|
||||||
|
// FILE: unit_test_001.cpp
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// DATE: 2023-07-07
|
||||||
|
// PURPOSE: unit tests for the Gauss library
|
||||||
|
// https://github.com/RobTillaart/Gauss
|
||||||
|
// https://github.com/Arduino-CI/arduino_ci/blob/master/REFERENCE.md
|
||||||
|
//
|
||||||
|
|
||||||
|
// supported assertions
|
||||||
|
// ----------------------------
|
||||||
|
// assertEqual(expected, actual)
|
||||||
|
// assertNotEqual(expected, actual)
|
||||||
|
// assertLess(expected, actual)
|
||||||
|
// assertMore(expected, actual)
|
||||||
|
// assertLessOrEqual(expected, actual)
|
||||||
|
// assertMoreOrEqual(expected, actual)
|
||||||
|
// assertTrue(actual)
|
||||||
|
// assertFalse(actual)
|
||||||
|
// assertNull(actual)
|
||||||
|
|
||||||
|
|
||||||
|
#include <ArduinoUnitTests.h>
|
||||||
|
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "Gauss.h"
|
||||||
|
|
||||||
|
|
||||||
|
unittest_setup()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GAUSS_LIB_VERSION: %s\n", (char *) GAUSS_LIB_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest_teardown()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest(test_constructor)
|
||||||
|
{
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
assertEqualFloat(0.5, G.P_smaller(0), 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest(test_P_smaller)
|
||||||
|
{
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
assertEqualFloat(0.0013, G.P_smaller(-3.0), 0.001);
|
||||||
|
assertEqualFloat(0.0228, G.P_smaller(-2.0), 0.001);
|
||||||
|
assertEqualFloat(0.1587, G.P_smaller(-1.0), 0.001);
|
||||||
|
assertEqualFloat(0.5000, G.P_smaller(0.0), 0.001);
|
||||||
|
assertEqualFloat(0.8413, G.P_smaller(1.0), 0.001);
|
||||||
|
assertEqualFloat(0.9772, G.P_smaller(2.0), 0.001);
|
||||||
|
assertEqualFloat(0.9987, G.P_smaller(3.0), 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest(test_P_larger)
|
||||||
|
{
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
assertEqualFloat(0.9987, G.P_larger(-3.0), 0.001);
|
||||||
|
assertEqualFloat(0.9772, G.P_larger(-2.0), 0.001);
|
||||||
|
assertEqualFloat(0.8413, G.P_larger(-1.0), 0.001);
|
||||||
|
assertEqualFloat(0.5000, G.P_larger(0.0), 0.001);
|
||||||
|
assertEqualFloat(0.1587, G.P_larger(1.0), 0.001);
|
||||||
|
assertEqualFloat(0.0228, G.P_larger(2.0), 0.001);
|
||||||
|
assertEqualFloat(0.0013, G.P_larger(3.0), 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest(test_P_between)
|
||||||
|
{
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
assertEqualFloat(0.4987, G.P_between(-3.0, 0.0), 0.001);
|
||||||
|
assertEqualFloat(0.4772, G.P_between(-2.0, 0.0), 0.001);
|
||||||
|
assertEqualFloat(0.3413, G.P_between(-1.0, 0.0), 0.001);
|
||||||
|
assertEqualFloat(0.0000, G.P_between(0.0, 0.0), 0.001);
|
||||||
|
assertEqualFloat(0.3413, G.P_between(0.0, 1.0), 0.001);
|
||||||
|
assertEqualFloat(0.4772, G.P_between(0.0, 2.0), 0.001);
|
||||||
|
assertEqualFloat(0.4987, G.P_between(0.0, 3.0), 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest(test_P_equal)
|
||||||
|
{
|
||||||
|
Gauss G;
|
||||||
|
|
||||||
|
G.begin(0, 1);
|
||||||
|
|
||||||
|
assertEqualFloat(0.004432, G.P_equal(-3.0), 0.001);
|
||||||
|
assertEqualFloat(0.053991, G.P_equal(-2.0), 0.001);
|
||||||
|
assertEqualFloat(0.241971, G.P_equal(-1.0), 0.001);
|
||||||
|
assertEqualFloat(0.398942, G.P_equal(0.0), 0.001);
|
||||||
|
assertEqualFloat(0.241971, G.P_equal(1.0), 0.001);
|
||||||
|
assertEqualFloat(0.053991, G.P_equal(2.0), 0.001);
|
||||||
|
assertEqualFloat(0.004432, G.P_equal(3.0), 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unittest_main()
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
Loading…
Reference in New Issue
Block a user