Finished HW3

This commit is contained in:
2019-09-27 23:21:56 -07:00
parent 2acbda9b5b
commit f80dc2c031
276 changed files with 11817 additions and 1167 deletions

View File

@@ -1,279 +1,151 @@
#include <iostream>
#include <random>
#include <string>
#include <cstdint>
#include <iomanip>
//
// If the default clang follows the the one true brace style is that not
// obviously the better brace style???
//
class DistributionPair
{
public:
DistributionPair(std::uint32_t minValue, std::uint32_t maxValue) :
minValue(minValue), maxValue(maxValue), count(0) {}
std::uint32_t minValue;
std::uint32_t maxValue;
std::uint32_t count;
};
std::vector<DistributionPair>
generateUniformDistribution(std::uint32_t howMany, std::uint32_t min,
std::uint32_t max, std::uint8_t numberBins);
std::vector<DistributionPair>
generateNormalDistribution(std::uint32_t howMany, float mean, float stdev,
std::uint8_t numberBins);
std::vector<DistributionPair>
generatePoissonDistribution(std::uint32_t howMany, std::uint8_t howOften,
std::uint8_t numberBins);
void plotDistribution(std::string title,
const std::vector<DistributionPair>& distribution,
const std::uint8_t maxPlotLineSize);
std::vector<DistributionPair> createBins(int min, int max, int binCount);
std::random_device randomDevice;
std::default_random_engine randomEngine(randomDevice());
// ------------------------------------------------------------------
//
// Testing Code
//
// ------------------------------------------------------------------
#include <functional>
#include <iostream>
#include <numeric>
#include <string>
namespace testing::detail
{
using namespace std::string_literals;
using Bins = std::vector<std::pair<std::uint32_t, std::uint32_t>>;
using DistFunc = std::function<std::vector<DistributionPair>()>;
#define CS3460_ASSERT_EQ(expected, actual, message) \
if (expected != actual) \
{ \
fail(message, "[ Expected", expected, "but got", actual, "]"); \
return; \
}
#define CS3460_CASE(x) \
[] { return x; }; \
std::cout << " Case " << #x << "\n";
template <typename Message>
void failInternal(const Message& message)
{
std::cout << message << " ";
}
template <typename Message, typename... Messages>
void failInternal(const Message& message, const Messages&... messages)
{
failInternal(message);
failInternal(messages...);
}
template <typename... Messages>
void fail(const Messages&... messages)
{
std::cout << " Assertion failed: ";
failInternal(messages...);
std::cout << "\n";
}
Bins generateBins(const std::uint32_t min, const std::uint32_t max, const std::uint8_t numberBins)
{
const auto binRange = (max - min) / numberBins;
auto minBin = min;
auto maxBin = min + binRange;
Bins results(numberBins);
for (std::uint8_t bin = 0u; bin < numberBins; bin++)
{
results[bin] = {minBin, maxBin};
minBin = maxBin + 1;
maxBin = minBin + binRange;
}
return results;
}
void returnsTheExpectedBins(const DistFunc& func, const Bins& bins)
{
const auto result = func();
CS3460_ASSERT_EQ(bins.size(), result.size(), "Wrong number of bins");
for (auto i = 0u; i < bins.size(); i++)
{
CS3460_ASSERT_EQ(bins[i].first, result[i].minValue, "Wrong minimum value for bin "s + std::to_string(i));
CS3460_ASSERT_EQ(bins[i].second, result[i].maxValue, "Wrong maximum value for bin "s + std::to_string(i));
}
}
void hasTheCorrectTotalAcrossAllBins(const DistFunc& func, const std::uint32_t howMany)
{
const auto result = func();
const auto add_counts = [](std::uint32_t total, const DistributionPair& bin) { return total + bin.count; };
CS3460_ASSERT_EQ(howMany, std::accumulate(result.cbegin(), result.cend(), 0u, add_counts),
"Wrong number of elements across all bins");
}
void testUniformDistribution()
{
std::cout << "Testing generateUniformDistribution\n";
auto func = CS3460_CASE(generateUniformDistribution(100000, 0, 79, 40));
returnsTheExpectedBins(func, generateBins(0, 79, 40));
hasTheCorrectTotalAcrossAllBins(func, 100000);
}
void testNormalDistribution()
{
std::cout << "Testing generateNormalDistribution\n";
auto func = CS3460_CASE(generateNormalDistribution(100000, 50, 5, 40));
returnsTheExpectedBins(func, generateBins(30, 69, 40));
hasTheCorrectTotalAcrossAllBins(func, 100000);
}
void testPoissonDistribution()
{
std::cout << "Testing generatePoissonDistribution\n";
auto func = CS3460_CASE(generatePoissonDistribution(100000, 6, 40));
returnsTheExpectedBins(func, generateBins(0, 39, 40));
hasTheCorrectTotalAcrossAllBins(func, 100000);
}
} // namespace testing::detail
void test()
{
using namespace testing::detail;
testUniformDistribution();
testNormalDistribution();
testPoissonDistribution();
std::cout << "\n\n";
}
int main()
{
auto uniform = generateUniformDistribution(100000, 0, 79, 40);
plotDistribution("--- Uniform ---", uniform, 80);
auto normal = generateNormalDistribution(100000, 50, 5, 40);
plotDistribution("--- Normal ---", normal, 80);
auto poisson = generatePoissonDistribution(100000, 6, 40);
plotDistribution("--- Poisson ---", poisson, 80);
test();
return 0;
}
std::vector<DistributionPair>
generateUniformDistribution(std::uint32_t howMany, std::uint32_t min,
std::uint32_t max, std::uint8_t numberBins)
{
std::uniform_int_distribution<int> distribution(min, max);
auto bins = createBins(min, max, numberBins);
for (int i = 0; i < static_cast<int>(howMany); i++)
{
float number = distribution(randomEngine);
for(int i = 0; i <= numberBins; i++)
{
if(bins[i].maxValue >= number && bins[i].minValue <= number)
bins[i].count++;
}
}
return bins;
}
std::vector<DistributionPair>
generateNormalDistribution(std::uint32_t howMany, float mean, float stdev,
std::uint8_t numberBins)
{
int min = static_cast<int>(mean - (4 * stdev));
int max = static_cast<int>(mean + (4 * stdev) - 1);
std::normal_distribution<double> distribution(mean, stdev);
auto bins = createBins(min, max, numberBins);
for (int i = 0; i < static_cast<int>(howMany); i++)
{
double number = distribution(randomEngine);
int position =
static_cast<int>(number - min / ((max - min) / float(numberBins)));
if (position > numberBins - 1)
bins[numberBins - 1].count++;
else if (position < 0)
bins[0].count++;
else
bins[position].count++;
}
return bins;
}
std::vector<DistributionPair>
generatePoissonDistribution(std::uint32_t howMany, std::uint8_t howOften,
std::uint8_t numberBins)
{
std::poisson_distribution<int> distribution(howOften);
int min = 0;
int max = numberBins - 1;
auto bins = createBins(min, max, numberBins);
for (int i = 0; i < static_cast<int>(howMany); i++)
{
int number = distribution(randomEngine);
if (number > numberBins - 1)
bins[numberBins - 1].count++;
else if (number < 0)
bins[0].count++;
else
bins[number].count++;
}
return bins;
}
std::vector<DistributionPair> createBins(int min, int max, int binCount)
{
std::vector<DistributionPair> myVector;
int difference = static_cast<int>(float(max - min + 1) / binCount);
for (int i = 0; i < binCount; i++)
{
DistributionPair dpair((min + i) * difference,
(min + i) * difference + difference - 1);
myVector.push_back(dpair);
}
return myVector;
}
void plotDistribution(std::string title,
const std::vector<DistributionPair>& distribution,
const std::uint8_t maxPlotLineSize)
{
std::cout << title << std::endl;
auto max = 0;
for (auto currentBin : distribution)
{
if (static_cast<int>(currentBin.count) > static_cast<int>(max))
max = currentBin.count;
}
for (auto currentBin : distribution)
{
int starCount =
static_cast<int>(currentBin.count / float(max) * maxPlotLineSize);
std::string info = "[ " + std::to_string(currentBin.minValue) + ", "
+ std::to_string(currentBin.maxValue) + " ] : ";
std::string starString;
for (int i = 0; i < starCount; i++)
starString += "*";
std::cout << std::setw(15) << info << starString;
std::cout << std::endl;
}
}
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <random>
#include <string>
//
// If the default clang follows the the one true brace style is that not
// obviously the better brace style???
//
class DistributionPair
{
public:
DistributionPair(std::uint32_t minValue, std::uint32_t maxValue) :
minValue(minValue), maxValue(maxValue), count(0) {}
std::uint32_t minValue;
std::uint32_t maxValue;
std::uint32_t count;
};
std::vector<DistributionPair>
generateUniformDistribution(std::uint32_t howMany, std::uint32_t min,
std::uint32_t max, std::uint8_t numberBins);
std::vector<DistributionPair>
generateNormalDistribution(std::uint32_t howMany, float mean, float stdev,
std::uint8_t numberBins);
std::vector<DistributionPair>
generatePoissonDistribution(std::uint32_t howMany, std::uint8_t howOften,
std::uint8_t numberBins);
void plotDistribution(std::string title,
const std::vector<DistributionPair>& distribution,
const std::uint8_t maxPlotLineSize);
std::vector<DistributionPair> createBins(int min, int max, int binCount);
std::random_device randomDevice;
std::default_random_engine randomEngine(randomDevice());
int main()
{
auto uniform = generateUniformDistribution(100000, 0, 79, 40);
plotDistribution("--- Uniform ---", uniform, 80);
auto normal = generateNormalDistribution(100000, 50, 5, 40);
plotDistribution("--- Normal ---", normal, 80);
auto poisson = generatePoissonDistribution(100000, 6, 40);
plotDistribution("--- Poisson ---", poisson, 80);
return 0;
}
std::vector<DistributionPair>
generateUniformDistribution(std::uint32_t howMany, std::uint32_t min,
std::uint32_t max, std::uint8_t numberBins)
{
std::uniform_int_distribution<int> distribution(min, max);
auto bins = createBins(min, max, numberBins);
for (int i = 0; i < static_cast<int>(howMany); i++)
{
int number = distribution(randomEngine);
for (int j = 0; j <= numberBins; j++)
{
if (static_cast<int>(bins[j].maxValue) >= number && static_cast<int>(bins[j].minValue) <= number)
bins[j].count++;
}
}
return bins;
}
std::vector<DistributionPair>
generateNormalDistribution(std::uint32_t howMany, float mean, float stdev,
std::uint8_t numberBins)
{
int min = static_cast<int>(mean - (4 * stdev));
int max = static_cast<int>(mean + (4 * stdev) - 1);
std::normal_distribution<double> distribution(mean, stdev);
auto bins = createBins(min, max, numberBins);
for (int i = 0; i < static_cast<int>(howMany); i++)
{
double number = distribution(randomEngine);
int position =
static_cast<int>(number - min / ((max - min) / float(numberBins)));
if (position > numberBins - 1)
bins[numberBins - 1].count++;
else if (position < 0)
bins[0].count++;
else
bins[position].count++;
}
return bins;
}
std::vector<DistributionPair>
generatePoissonDistribution(std::uint32_t howMany, std::uint8_t howOften,
std::uint8_t numberBins)
{
std::poisson_distribution<int> distribution(howOften);
int min = 0;
int max = numberBins - 1;
auto bins = createBins(min, max, numberBins);
for (int i = 0; i < static_cast<int>(howMany); i++)
{
int number = distribution(randomEngine);
if (number > numberBins - 1)
bins[numberBins - 1].count++;
else if (number < 0)
bins[0].count++;
else
bins[number].count++;
}
return bins;
}
std::vector<DistributionPair> createBins(int min, int max, int binCount)
{
std::vector<DistributionPair> myVector;
int difference = static_cast<int>(float(max - min + 1) / binCount);
for (int i = 0; i < binCount; i++)
{
DistributionPair dpair((min + i) * difference,
(min + i) * difference + difference - 1);
myVector.push_back(dpair);
}
return myVector;
}
void plotDistribution(std::string title,
const std::vector<DistributionPair>& distribution,
const std::uint8_t maxPlotLineSize)
{
std::cout << title << std::endl;
auto max = 0;
for (auto currentBin : distribution)
{
if (static_cast<int>(currentBin.count) > static_cast<int>(max))
max = currentBin.count;
}
for (auto currentBin : distribution)
{
int starCount =
static_cast<int>(currentBin.count / float(max) * maxPlotLineSize);
std::string info = "[ " + std::to_string(currentBin.minValue) + ", " + std::to_string(currentBin.maxValue) + " ] : ";
std::string starString;
for (int i = 0; i < starCount; i++)
starString += "*";
std::cout << std::setw(15) << info << starString;
std::cout << std::endl;
}
}

View File

@@ -1,14 +1,31 @@
cmake_minimum_required(VERSION 3.14)
project(Assignment2)
set(CMAKE_CXX_STANDARD 17)
set(SOURCE_FILES
Assignment2.cpp)
add_executable(RandDistributions ${SOURCE_FILES})
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
target_compile_options(RandomDistributions PRIVATE /W4 /permissive-)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
target_compile_options(RandomDistributions PRIVATE -Wall -Wextra -pedantic)
endif()
find_program(CLANG_FORMAT "clang-format")
if(CLANG_FORMAT)
unset(SOURCE_FILES_PATHS)
foreach(SOURCE_FILE ${SOURCE_FILES})
get_source_file_property(WHERE ${SOURCE_FILE} LOCATION)
set(SOURCE_FILES_PATHS ${SOURCE_FILES_PATHS} ${WHERE})
endforeach()
add_custom_target(
ClangFormat COMMAND
${CLANG_FORMAT}
-i
-style=file
${SOURCE_FILES_PATHS})
add_dependencies(RandDistributions ClangFormat)
endif()

View File

@@ -37,6 +37,16 @@
<DistClean command="/usr/bin/make -j4 -f &quot;/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="ClangFormat">
<Option working_dir="/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug"/>
<Option type="4"/>
<MakeCommands>
<Build command="/usr/bin/make -j4 -f &quot;/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/Makefile&quot; VERBOSE=1 ClangFormat"/>
<CompileFile command="/usr/bin/make -j4 -f &quot;/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/Makefile&quot; VERBOSE=1 &quot;$file&quot;"/>
<Clean command="/usr/bin/make -j4 -f &quot;/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
<DistClean command="/usr/bin/make -j4 -f &quot;/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/Makefile&quot; VERBOSE=1 clean"/>
</MakeCommands>
</Target>
<Target title="RandDistributions">
<Option output="/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/RandDistributions" prefix_auto="0" extension_auto="0"/>
<Option working_dir="/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug"/>

View File

@@ -0,0 +1,2 @@
# Hashes of file build rules.
92a1204bae516636bc42041a26ec4b67 CMakeFiles/ClangFormat

View File

@@ -52,5 +52,6 @@ set(CMAKE_MAKEFILE_PRODUCTS
# Dependency information for all targets:
set(CMAKE_DEPEND_INFO_FILES
"CMakeFiles/ClangFormat.dir/DependInfo.cmake"
"CMakeFiles/RandDistributions.dir/DependInfo.cmake"
)

View File

@@ -64,11 +64,43 @@ CMAKE_SOURCE_DIR = /Users/bradybodily/Repositories/CS3460/Hw2
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug
#=============================================================================
# Target rules for target CMakeFiles/ClangFormat.dir
# All Build rule for target.
CMakeFiles/ClangFormat.dir/all:
$(MAKE) -f CMakeFiles/ClangFormat.dir/build.make CMakeFiles/ClangFormat.dir/depend
$(MAKE) -f CMakeFiles/ClangFormat.dir/build.make CMakeFiles/ClangFormat.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles --progress-num= "Built target ClangFormat"
.PHONY : CMakeFiles/ClangFormat.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/ClangFormat.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/ClangFormat.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles 0
.PHONY : CMakeFiles/ClangFormat.dir/rule
# Convenience name for target.
ClangFormat: CMakeFiles/ClangFormat.dir/rule
.PHONY : ClangFormat
# clean rule for target.
CMakeFiles/ClangFormat.dir/clean:
$(MAKE) -f CMakeFiles/ClangFormat.dir/build.make CMakeFiles/ClangFormat.dir/clean
.PHONY : CMakeFiles/ClangFormat.dir/clean
# clean rule for target.
clean: CMakeFiles/ClangFormat.dir/clean
.PHONY : clean
#=============================================================================
# Target rules for target CMakeFiles/RandDistributions.dir
# All Build rule for target.
CMakeFiles/RandDistributions.dir/all:
CMakeFiles/RandDistributions.dir/all: CMakeFiles/ClangFormat.dir/all
$(MAKE) -f CMakeFiles/RandDistributions.dir/build.make CMakeFiles/RandDistributions.dir/depend
$(MAKE) -f CMakeFiles/RandDistributions.dir/build.make CMakeFiles/RandDistributions.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles --progress-num=1,2 "Built target RandDistributions"

View File

@@ -7,22 +7,14 @@
#IncludeRegexTransform:
/Users/bradybodily/Repositories/CS3460/Hw2/Assignment2.cpp
cstdint
-
iomanip
-
iostream
-
random
-
string
-
cstdint
-
iomanip
-
functional
-
iostream
-
numeric
-
string
-

View File

@@ -1,3 +1,4 @@
/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles/rebuild_cache.dir
/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles/edit_cache.dir
/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles/ClangFormat.dir
/Users/bradybodily/Repositories/CS3460/Hw2/cmake-build-debug/CMakeFiles/RandDistributions.dir

View File

@@ -110,6 +110,19 @@ depend:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
#=============================================================================
# Target rules for targets named ClangFormat
# Build rule for target.
ClangFormat: cmake_check_build_system
$(MAKE) -f CMakeFiles/Makefile2 ClangFormat
.PHONY : ClangFormat
# fast build rule for target.
ClangFormat/fast:
$(MAKE) -f CMakeFiles/ClangFormat.dir/build.make CMakeFiles/ClangFormat.dir/build
.PHONY : ClangFormat/fast
#=============================================================================
# Target rules for targets named RandDistributions
@@ -158,6 +171,7 @@ help:
@echo "... depend"
@echo "... rebuild_cache"
@echo "... edit_cache"
@echo "... ClangFormat"
@echo "... RandDistributions"
@echo "... Assignment2.o"
@echo "... Assignment2.i"