Add binomial calculation and tests.
Change-Id: I7a758d098c7af53e7b719461aa5d0e8de240052d
diff --git a/frc971/control_loops/BUILD b/frc971/control_loops/BUILD
index b6b0362..6d895de 100644
--- a/frc971/control_loops/BUILD
+++ b/frc971/control_loops/BUILD
@@ -294,3 +294,19 @@
visibility = ["//visibility:public"],
deps = ["//frc971:python_init"],
)
+
+cc_library(
+ name = "binomial",
+ hdrs = ["binomial.h"],
+)
+
+cc_test(
+ name = "binomial_test",
+ srcs = [
+ "binomial_test.cc",
+ ],
+ deps = [
+ ":binomial",
+ "//aos/testing:googletest",
+ ],
+)
diff --git a/frc971/control_loops/binomial.h b/frc971/control_loops/binomial.h
new file mode 100644
index 0000000..4f4c4dc
--- /dev/null
+++ b/frc971/control_loops/binomial.h
@@ -0,0 +1,24 @@
+#ifndef FRC971_CONTROL_LOOPS_BINOMIAL_H_
+#define FRC971_CONTROL_LOOPS_BINOMIAL_H_
+
+namespace frc971 {
+namespace control_loops {
+
+// Computes the factorial of n
+constexpr double Factorial(int n) {
+ if (n <= 1) {
+ return 1.0;
+ } else {
+ return Factorial(n - 1) * n;
+ }
+}
+
+// Computes the binomial coefficients. n choose k.
+constexpr double Binomial(int n, int k) {
+ return Factorial(n) / (Factorial(k) * Factorial(n - k));
+}
+
+} // namespace control_loops
+} // namespace frc971
+
+#endif // FRC971_CONTROL_LOOPS_BINOMIAL_H_
diff --git a/frc971/control_loops/binomial_test.cc b/frc971/control_loops/binomial_test.cc
new file mode 100644
index 0000000..482790e
--- /dev/null
+++ b/frc971/control_loops/binomial_test.cc
@@ -0,0 +1,44 @@
+#include "frc971/control_loops/binomial.h"
+
+#include "gtest/gtest.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+
+// Tests some factorials.
+TEST(BinomialTest, Factorial) {
+ EXPECT_EQ(1.0, Factorial(0));
+ EXPECT_EQ(1.0, Factorial(1));
+ EXPECT_EQ(2.0, Factorial(2));
+ EXPECT_EQ(6.0, Factorial(3));
+ EXPECT_EQ(24.0, Factorial(4));
+}
+
+// Test a 2nd order polynomial.
+TEST(BinomialTest, Quadratic) {
+ EXPECT_EQ(1.0, Binomial(2, 0));
+ EXPECT_EQ(2.0, Binomial(2, 1));
+ EXPECT_EQ(1.0, Binomial(2, 2));
+}
+
+// Test a 3th order polynomial.
+TEST(BinomialTest, Cubic) {
+ EXPECT_EQ(1.0, Binomial(3, 0));
+ EXPECT_EQ(3.0, Binomial(3, 1));
+ EXPECT_EQ(3.0, Binomial(3, 2));
+ EXPECT_EQ(1.0, Binomial(3, 3));
+}
+
+// Test a 4th order polynomial.
+TEST(BinomialTest, Quartic) {
+ EXPECT_EQ(1.0, Binomial(4, 0));
+ EXPECT_EQ(4.0, Binomial(4, 1));
+ EXPECT_EQ(6.0, Binomial(4, 2));
+ EXPECT_EQ(4.0, Binomial(4, 3));
+ EXPECT_EQ(1.0, Binomial(4, 4));
+}
+
+} // namespace testing
+} // namespace control_loops
+} // namespace frc971