- Periodically, we should try including each of these files below into a blank cpp file and see if the include
  can be cleanly included alone
- For cpp files, if they have an associated include file eg: Tensor.hpp and Tensor.cpp then we don't need
  to include in the cpp file any of the files included in the hpp file since they are implicitly included
  AND they should include their associated hpp file first and then all other include files in order below

// anywhere
#include "libebm.h" // PUBLIC. Cannot have dependencies on any private files
#include "logging.h" // depends on libebm.h ONLY. Designed to be included everywhere else
#include "unzoned.h" // depends on libebm.h and logging.h

// zone control
#include "zones.h" // defines zone definition bits that we use in the bridge

#include "bridge.h" // depends on libebm.h, logging.h, unzoned.h, zones.h

// bridge files that depend on zoning
#include "common.hpp"
#include "bridge.hpp"
#include "GradientPair.hpp"
#include "Bin.hpp" // depends on GradientPair.hpp

// everything below here more or less depends on all the above includes

// compute side include files
#include "zoned_bridge_cpp_functions.hpp" // depends on libebm.h, zones.h    circular pointer to Objective.hpp.  pointers to structs in bridge_c.h
#include "compute.hpp" // GENERAL include file in the compute zones.  Depends on zones.h, and bridge_cpp.hpp, and indirectly through bridge_cpp.hpp depends on libebm.h, bridge_c.h, common_cpp.hpp
#include "approximate_math.hpp"
#include "registration_exceptions.hpp"
#include "Registration.hpp" // depends on registration_exceptions.hpp
#include "Objective.hpp" // depends on zoned_bridge_cpp_functions.hpp, compute.hpp.  The cpp file depends on: zoned_bridge_c_functions.h, registration_exceptions.hpp, Registration.hpp

// main side include files
#include "ebm_internal.hpp" // GENERAL include file in the non-compute zones.  Almost all the below depend on it
#include "RandomDeterministic.hpp"
#include "RandomNondeterministic.hpp"
#include "GaussianDistribution.hpp" // implicitly depends on RandomDeterministic.hpp and RandomNondeterministic.hpp but the dependency is templated away
#include "ebm_stats.hpp" // depends on approximate_math.hpp
#include "Feature.hpp" // ONLY zones.h
#include "Term.hpp" // ONLY zones.h and Feature.hpp
#include "Transpose.hpp"
#include "dataset_shared.hpp"
#include "DataSetBoosting.hpp" // depends on dataset_shared.hpp, Feature.hpp, Term.hpp
#include "DataSetInteraction.hpp" // depends on dataset_shared.hpp
#include "DataSetInnerBag.hpp" // depends on RandomDeterministic.hpp
#include "SubsetInnerBag.hpp" // depends on RandomDeterministic.hpp
#include "Tensor.hpp" // depends on Term.hpp and Feature.hpp
#include "TreeNode.hpp" // depends on Bin.hpp
#include "SplitPosition.hpp" // depends on Bin.hpp
#include "TensorTotalsSum.hpp" // depends on GradientPair.hpp and Bin.hpp
#include "BoosterCore.hpp" // depends on many of the above
#include "BoosterShell.hpp" // depends on many of the above
#include "InteractionCore.hpp" // depends on many of the above
#include "InteractionShell.hpp" // depends on many of the above
