passenger 6.0.2 → 6.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +152 -19
- data/CONTRIBUTING.md +1 -1
- data/CONTRIBUTORS +5 -0
- data/bin/passenger-install-nginx-module +1 -1
- data/bin/passenger-memory-stats +65 -12
- data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +56 -3
- data/dev/copy_boost_headers +1 -0
- data/package.json +1 -1
- data/passenger.gemspec +9 -1
- data/resources/templates/error_renderer/with_details/dist/bundle.js +1 -1
- data/resources/templates/error_renderer/with_details/src/GetHelpView.jsx +1 -1
- data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.css +0 -0
- data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.js +0 -0
- data/resources/templates/error_renderer/with_details/src/bootstrap/config.json +0 -0
- data/resources/templates/standalone/http.erb +1 -0
- data/resources/templates/standalone/rails_asset_pipeline.erb +1 -1
- data/resources/templates/standalone/server.erb +1 -0
- data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
- data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +2 -0
- data/src/agent/Core/ApplicationPool/Implementation.cpp +0 -1
- data/src/agent/Core/ApplicationPool/Options.h +19 -0
- data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
- data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
- data/src/agent/Core/Config.h +15 -1
- data/src/agent/Core/Controller.h +1 -0
- data/src/agent/Core/Controller/Config.h +9 -1
- data/src/agent/Core/Controller/ForwardResponse.cpp +13 -0
- data/src/agent/Core/Controller/InitRequest.cpp +5 -0
- data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -0
- data/src/agent/Core/CoreMain.cpp +1 -0
- data/src/agent/Core/OptionParser.h +3 -0
- data/src/agent/Core/SpawningKit/Config.h +11 -0
- data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +13 -0
- data/src/agent/Core/SpawningKit/Context.h +1 -0
- data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -1
- data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
- data/src/agent/Core/SpawningKit/Spawner.h +1 -0
- data/src/agent/TempDirToucher/TempDirToucherMain.cpp +2 -0
- data/src/agent/Watchdog/Config.h +16 -1
- data/src/agent/Watchdog/WatchdogMain.cpp +7 -0
- data/src/apache2_module/Config.cpp +1 -1
- data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +15 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +15 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +40 -0
- data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +10 -0
- data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +6 -0
- data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +26 -0
- data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +14 -0
- data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +34 -0
- data/src/apache2_module/Hooks.cpp +5 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +11 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +13 -0
- data/src/cxx_supportlib/Constants.h +4 -2
- data/src/cxx_supportlib/Hooks.h +1 -0
- data/src/cxx_supportlib/LoggingKit/Config.h +1 -0
- data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
- data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +2 -2
- data/src/cxx_supportlib/WebSocketCommandReverseServer.h +11 -7
- data/src/cxx_supportlib/oxt/system_calls.cpp +10 -10
- data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/finder.hpp +0 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +46 -37
- data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +16 -15
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +45 -26
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/future.hpp +33 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_buffer_sequence.hpp +38 -14
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_future.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/bad_address_cast.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_results.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/packaged_task.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +8 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context_base.hpp +17 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +50 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/thread_pool.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +4 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +5 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_x86_dcas.hpp +13 -12
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/chrono.hpp +10 -10
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp +34 -34
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/thread_clock.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/chrono.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp +27 -27
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/thread_clock.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/system.hpp +5 -4
- data/src/cxx_supportlib/vendor-modified/boost/chrono/io/time_point_io.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/circular_buffer.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/allocators.hpp +89 -0
- data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/base.hpp +83 -74
- data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/details.hpp +21 -33
- data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/space_optimized.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/concept/assert.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/concept/detail/general.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/concept/detail/has_constraints.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/concept/usage.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/concept_check.hpp +19 -19
- data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +8 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +5 -2
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +5 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +6 -2
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/comeau.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +368 -52
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +6 -3
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/greenhills.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/kai.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/nvcc.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +9 -4
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp_zos.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/detail/select_compiler_config.hpp +1 -2
- data/src/cxx_supportlib/vendor-modified/boost/config/detail/suffix.hpp +13 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +14 -4
- data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +262 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +4 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +7 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +22 -19
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +833 -459
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +24 -6
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocator_version_traits.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +61 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +33 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +132 -41
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterator.hpp +16 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +54 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +58 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +28 -23
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +167 -115
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +55 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/thread_mutex.hpp +181 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +167 -29
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/type_traits.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/variadic_templates_tools.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +18 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +389 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +262 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +52 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +364 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +4 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/synchronized_pool_resource.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +286 -6
- data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +56 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +43 -6
- data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +100 -31
- data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +126 -69
- data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +75 -51
- data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +136 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/exchange.hpp +49 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/explicit_operator_bool.hpp +9 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +101 -130
- data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test_trait.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/core/noncopyable.hpp +16 -1
- data/src/cxx_supportlib/vendor-modified/boost/core/quick_exit.hpp +59 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/ref.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/core/swap.hpp +9 -2
- data/src/cxx_supportlib/vendor-modified/boost/core/typeinfo.hpp +26 -10
- data/src/cxx_supportlib/vendor-modified/boost/date_time/compiler_config.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/posix_time_duration.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/date_time/time_duration.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/detail/basic_pointerbuf.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/detail/indirect_traits.hpp +38 -47
- data/src/cxx_supportlib/vendor-modified/boost/detail/lcast_precision.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/detail/reference_content.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +62 -58
- data/src/cxx_supportlib/vendor-modified/boost/function.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +29 -29
- data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +38 -40
- data/src/cxx_supportlib/vendor-modified/boost/integer/common_factor_rt.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree_algorithms.hpp +44 -44
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree_algorithms.hpp +39 -39
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +15 -15
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_slist_algorithms.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/any_node_and_algorithms.hpp +14 -14
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/avltree_node.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_iterator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_node.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/node_cloner_disposer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/rbtree_node.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/simple_disposers.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_node.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_iterator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_node.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_value_compare.hpp +33 -14
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +12 -12
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/linear_slist_algorithms.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_plus_bits.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +39 -39
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree_algorithms.hpp +61 -61
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree_algorithms.hpp +66 -66
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_algorithms.hpp +54 -54
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +6 -2
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set_hook.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +65 -0
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +23 -23
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +5 -4
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +5 -2
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +18 -13
- data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/cregex.cpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/libs/system/src/error_code.cpp +16 -5
- data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/future.cpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +14 -8
- data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/tss_null.cpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/detail/fp_traits.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/math_fwd.hpp +27 -0
- data/src/cxx_supportlib/vendor-modified/boost/math/tools/config.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +29 -6
- data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +12 -3
- data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/core.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/mpl/assert.hpp +23 -3
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/experimental_traits.hpp +9 -3
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +10 -11
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +20 -1
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +211 -101
- data/src/cxx_supportlib/vendor-modified/boost/parameter/python.hpp +5 -6
- data/src/cxx_supportlib/vendor-modified/boost/pool/detail/mutex.hpp +119 -25
- data/src/cxx_supportlib/vendor-modified/boost/predef/architecture.h +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/arm.h +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/ptx.h +44 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/compiler.h +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/compaq.h +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/nvcc.h +73 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/detail/endian_compat.h +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/predef/language.h +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/language/cuda.h +52 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/make.h +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/predef/os/cygwin.h +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/predef/other/endian.h +1 -2
- data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/preprocessor/config/config.hpp +17 -8
- data/src/cxx_supportlib/vendor-modified/boost/preprocessor/stringize.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/preprocessor/wstringize.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/gray_coded_qrng.hpp +166 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/niederreiter_base2_table.hpp +513 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/qrng_base.hpp +291 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/sobol_table.hpp +4106 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/faure.hpp +367 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/niederreiter_base2.hpp +360 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/sobol.hpp +237 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/as_literal.hpp +43 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/begin.hpp +13 -5
- data/src/cxx_supportlib/vendor-modified/boost/range/concepts.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/range/detail/common.hpp +1 -3
- data/src/cxx_supportlib/vendor-modified/boost/range/detail/implementation_help.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/range/distance.hpp +11 -5
- data/src/cxx_supportlib/vendor-modified/boost/range/end.hpp +14 -6
- data/src/cxx_supportlib/vendor-modified/boost/range/has_range_iterator.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/ratio/config.hpp +6 -2
- data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +55 -37
- data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex.hpp +7 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +5 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/fileiter.hpp +0 -3
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/instances.hpp +15 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +1 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_results.hpp +12 -3
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +7 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +7 -3
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +6 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +0 -5
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_iterator.hpp +0 -8
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_raw_buffer.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_split.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_token_iterator.hpp +0 -8
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +12 -11
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +7 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_iterator.hpp +1 -9
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_token_iterator.hpp +2 -10
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +60 -115
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/local_counted_base.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_aix.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_clang.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_nt.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_pt.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_spin.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_sync.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/yield_k.hpp +14 -8
- data/src/cxx_supportlib/vendor-modified/boost/system/config.hpp +4 -24
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +57 -0
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category.hpp +101 -0
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_interoperability.hpp +141 -0
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_posix.hpp +132 -0
- data/src/cxx_supportlib/vendor-modified/boost/system/error_code.hpp +775 -588
- data/src/cxx_supportlib/vendor-modified/boost/system/system_error.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/config.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/move.hpp +13 -6
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/nullary_function.hpp +8 -3
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread_safety.hpp +160 -0
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/tss_hooks.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/thread/exceptions.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/thread/executors/basic_thread_pool.hpp +24 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +10 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/lock_guard.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/thread/lockable_traits.hpp +31 -0
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable_fwd.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/mutex.hpp +8 -53
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +73 -4
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/recursive_mutex.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/thread_data.hpp +14 -9
- data/src/cxx_supportlib/vendor-modified/boost/thread/xtime.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/throw_exception.hpp +9 -8
- data/src/cxx_supportlib/vendor-modified/boost/token_functions.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +21 -19
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/common_arithmetic_type.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/config.hpp +9 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/detector.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/has_postfix_operator.hpp +55 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/has_prefix_operator.hpp +72 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_03.hpp +108 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_11.hpp +501 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_msvc10_fix.hpp +30 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_likely_lambda.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_03.hpp +117 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_11.hpp +557 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_rvalue_reference_msvc10_fix.hpp +43 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detected.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/detected_or.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/enable_if.hpp +37 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_dereference.hpp +344 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_minus.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_minus_assign.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_plus_assign.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_post_decrement.hpp +21 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_post_increment.hpp +21 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_pre_decrement.hpp +21 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_pre_increment.hpp +22 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_assign.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_constructor.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/integral_constant.hpp +5 -15
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/intrinsics.hpp +16 -6
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_complete.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_copy_assignable.hpp +3 -4
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_copy_constructible.hpp +4 -6
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected_convertible.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected_exact.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_final.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_function.hpp +4 -79
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_member_function_pointer.hpp +3 -97
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_noncopyable.hpp +39 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_assignable.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_constructible.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_rvalue_reference.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_virtual_base_of.hpp +104 -63
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/make_void.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/nonesuch.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/typeof/constant.hpp +26 -0
- data/src/cxx_supportlib/vendor-modified/boost/typeof/dmc/typeof_impl.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode.hpp +0 -3
- data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode_params.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/typeof/int_encoding.hpp +4 -5
- data/src/cxx_supportlib/vendor-modified/boost/typeof/modifiers.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/typeof/msvc/typeof_impl.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/typeof/native.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/typeof/pointers_data_members.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/typeof/register_functions_iterate.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/typeof/register_mem_functions.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/typeof/template_encoding.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/typeof/template_template_param.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/typeof/type_encoding.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof_impl.hpp +16 -16
- data/src/cxx_supportlib/vendor-modified/boost/typeof/vector.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/typeof/vector100.hpp +201 -201
- data/src/cxx_supportlib/vendor-modified/boost/typeof/vector150.hpp +301 -301
- data/src/cxx_supportlib/vendor-modified/boost/typeof/vector200.hpp +401 -401
- data/src/cxx_supportlib/vendor-modified/boost/typeof/vector50.hpp +101 -101
- data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/utility/string_ref.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/utility/string_view.hpp +26 -6
- data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/modp_b64_data.h +0 -4
- data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +5 -1
- data/src/helper-scripts/node-loader.js +1 -1
- data/src/helper-scripts/prespawn +1 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +40 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +27 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +48 -0
- data/src/nginx_module/Configuration.c +14 -1
- data/src/nginx_module/ContentHandler.c +5 -1
- data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +21 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +30 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +42 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +9 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +15 -0
- data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +6 -0
- data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +12 -0
- data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +4 -0
- data/src/nginx_module/ngx_http_passenger_module.c +3 -2
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +0 -0
- data/src/ruby_supportlib/phusion_passenger.rb +8 -8
- data/src/ruby_supportlib/phusion_passenger/admin_tools/memory_stats.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +22 -0
- data/src/ruby_supportlib/phusion_passenger/constants.rb +3 -1
- data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +4 -2
- data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +35 -0
- data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +10 -0
- data/src/ruby_supportlib/phusion_passenger/request_handler.rb +7 -6
- data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +5 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +13 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +4 -2
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +15 -11
- metadata +42 -8
- data/src/cxx_supportlib/vendor-modified/boost/call_traits.hpp +0 -20
- data/src/cxx_supportlib/vendor-modified/boost/detail/call_traits.hpp +0 -172
- data/src/cxx_supportlib/vendor-modified/boost/detail/no_exceptions_support.hpp +0 -17
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_code.ipp +0 -496
@@ -0,0 +1,367 @@
|
|
1
|
+
/* boost random/faure.hpp header file
|
2
|
+
*
|
3
|
+
* Copyright Justinas Vygintas Daugmaudis 2010-2018
|
4
|
+
* Distributed under the Boost Software License, Version 1.0. (See
|
5
|
+
* accompanying file LICENSE_1_0.txt or copy at
|
6
|
+
* http://www.boost.org/LICENSE_1_0.txt)
|
7
|
+
*/
|
8
|
+
|
9
|
+
#ifndef BOOST_RANDOM_FAURE_HPP
|
10
|
+
#define BOOST_RANDOM_FAURE_HPP
|
11
|
+
|
12
|
+
#include <boost/random/detail/qrng_base.hpp>
|
13
|
+
|
14
|
+
#include <cmath>
|
15
|
+
#include <vector>
|
16
|
+
#include <algorithm>
|
17
|
+
|
18
|
+
#include <boost/assert.hpp>
|
19
|
+
|
20
|
+
namespace boost {
|
21
|
+
namespace random {
|
22
|
+
|
23
|
+
/** @cond */
|
24
|
+
namespace detail {
|
25
|
+
|
26
|
+
namespace qrng_tables {
|
27
|
+
|
28
|
+
// There is no particular reason why 187 first primes were chosen
|
29
|
+
// to be put into this table. The only reason was, perhaps, that
|
30
|
+
// the number of dimensions for Faure generator would be around
|
31
|
+
// the same order of magnitude as the number of dimensions supported
|
32
|
+
// by the Sobol qrng.
|
33
|
+
struct primes
|
34
|
+
{
|
35
|
+
typedef unsigned short value_type;
|
36
|
+
|
37
|
+
BOOST_STATIC_CONSTANT(int, number_of_primes = 187);
|
38
|
+
|
39
|
+
// A function that returns lower bound prime for a given n
|
40
|
+
static value_type lower_bound(std::size_t n)
|
41
|
+
{
|
42
|
+
static const value_type prim_a[number_of_primes] = {
|
43
|
+
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
|
44
|
+
59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
|
45
|
+
127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
|
46
|
+
191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251,
|
47
|
+
257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
|
48
|
+
331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
|
49
|
+
401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
|
50
|
+
467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
|
51
|
+
563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619,
|
52
|
+
631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
|
53
|
+
709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787,
|
54
|
+
797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
|
55
|
+
877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953,
|
56
|
+
967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031,
|
57
|
+
1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093,
|
58
|
+
1097, 1103, 1109, 1117 };
|
59
|
+
|
60
|
+
qrng_detail::dimension_assert("Faure", n, prim_a[number_of_primes - 1]);
|
61
|
+
|
62
|
+
return *std::lower_bound(prim_a, prim_a + number_of_primes, n);
|
63
|
+
}
|
64
|
+
};
|
65
|
+
|
66
|
+
} // namespace qrng_tables
|
67
|
+
} // namespace detail
|
68
|
+
|
69
|
+
namespace qrng_detail {
|
70
|
+
namespace fr {
|
71
|
+
|
72
|
+
// Returns the integer part of the logarithm base Base of arg.
|
73
|
+
// In erroneous situations, e.g., integer_log(base, 0) the function
|
74
|
+
// returns 0 and does not report the error. This is the intended
|
75
|
+
// behavior.
|
76
|
+
template <typename T>
|
77
|
+
inline T integer_log(T base, T arg)
|
78
|
+
{
|
79
|
+
T ilog = T();
|
80
|
+
while (base <= arg)
|
81
|
+
{
|
82
|
+
arg /= base; ++ilog;
|
83
|
+
}
|
84
|
+
return ilog;
|
85
|
+
}
|
86
|
+
|
87
|
+
// Perform exponentiation by squaring (potential for code reuse in multiprecision::powm)
|
88
|
+
template <typename T>
|
89
|
+
inline T integer_pow(T base, T e)
|
90
|
+
{
|
91
|
+
T result = static_cast<T>(1);
|
92
|
+
while (e)
|
93
|
+
{
|
94
|
+
if (e & static_cast<T>(1))
|
95
|
+
result *= base;
|
96
|
+
e >>= 1;
|
97
|
+
base *= base;
|
98
|
+
}
|
99
|
+
return result;
|
100
|
+
}
|
101
|
+
|
102
|
+
} // namespace fr
|
103
|
+
|
104
|
+
// Computes a table of binomial coefficients modulo qs.
|
105
|
+
template<typename RealType, typename SeqSizeT, typename PrimeTable>
|
106
|
+
struct binomial_coefficients
|
107
|
+
{
|
108
|
+
typedef RealType value_type;
|
109
|
+
typedef SeqSizeT size_type;
|
110
|
+
|
111
|
+
// Binomial values modulo qs_base will never be bigger than qs_base.
|
112
|
+
// We can choose an appropriate integer type to hold modulo values and
|
113
|
+
// shave off memory footprint.
|
114
|
+
typedef typename PrimeTable::value_type packed_uint_t;
|
115
|
+
|
116
|
+
// default copy c-tor is fine
|
117
|
+
|
118
|
+
explicit binomial_coefficients(std::size_t dimension)
|
119
|
+
{
|
120
|
+
resize(dimension);
|
121
|
+
}
|
122
|
+
|
123
|
+
void resize(std::size_t dimension)
|
124
|
+
{
|
125
|
+
qs_base = PrimeTable::lower_bound(dimension);
|
126
|
+
|
127
|
+
// Throw away previously computed coefficients.
|
128
|
+
// This will trigger recomputation on next update
|
129
|
+
coeff.clear();
|
130
|
+
}
|
131
|
+
|
132
|
+
template <typename Iterator>
|
133
|
+
void update(size_type seq, Iterator first, Iterator last)
|
134
|
+
{
|
135
|
+
if (first != last)
|
136
|
+
{
|
137
|
+
const size_type ilog = fr::integer_log(static_cast<size_type>(qs_base), seq);
|
138
|
+
const size_type hisum = ilog + 1;
|
139
|
+
if (coeff.size() != size_hint(hisum)) {
|
140
|
+
ytemp.resize(static_cast<std::size_t>(hisum)); // cast safe because log is small
|
141
|
+
compute_coefficients(hisum);
|
142
|
+
qs_pow = fr::integer_pow(static_cast<size_type>(qs_base), ilog);
|
143
|
+
}
|
144
|
+
|
145
|
+
*first = compute_recip(seq, ytemp.rbegin());
|
146
|
+
|
147
|
+
// Find other components using the Faure method.
|
148
|
+
++first;
|
149
|
+
for ( ; first != last; ++first)
|
150
|
+
{
|
151
|
+
*first = RealType();
|
152
|
+
RealType r = static_cast<RealType>(1);
|
153
|
+
|
154
|
+
for (size_type i = 0; i != hisum; ++i)
|
155
|
+
{
|
156
|
+
RealType ztemp = ytemp[static_cast<std::size_t>(i)] * upper_element(i, i, hisum);
|
157
|
+
for (size_type j = i + 1; j != hisum; ++j)
|
158
|
+
ztemp += ytemp[static_cast<std::size_t>(j)] * upper_element(i, j, hisum);
|
159
|
+
|
160
|
+
// Sum ( J <= I <= HISUM ) ( old ytemp(i) * binom(i,j) ) mod QS.
|
161
|
+
ytemp[static_cast<std::size_t>(i)] = std::fmod(ztemp, static_cast<RealType>(qs_base));
|
162
|
+
r *= static_cast<RealType>(qs_base);
|
163
|
+
*first += ytemp[static_cast<std::size_t>(i)] / r;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
private:
|
170
|
+
inline static size_type size_hint(size_type n)
|
171
|
+
{
|
172
|
+
return n * (n + 1) / 2;
|
173
|
+
}
|
174
|
+
|
175
|
+
packed_uint_t& upper_element(size_type i, size_type j, size_type dim)
|
176
|
+
{
|
177
|
+
BOOST_ASSERT( i < dim );
|
178
|
+
BOOST_ASSERT( j < dim );
|
179
|
+
BOOST_ASSERT( i <= j );
|
180
|
+
return coeff[static_cast<std::size_t>((i * (2 * dim - i + 1)) / 2 + j - i)];
|
181
|
+
}
|
182
|
+
|
183
|
+
template<typename Iterator>
|
184
|
+
RealType compute_recip(size_type seq, Iterator out) const
|
185
|
+
{
|
186
|
+
// Here we do
|
187
|
+
// Sum ( 0 <= J <= HISUM ) YTEMP(J) * QS**J
|
188
|
+
// Sum ( 0 <= J <= HISUM ) YTEMP(J) / QS**(J+1)
|
189
|
+
// in one go
|
190
|
+
RealType r = RealType();
|
191
|
+
size_type m, k = qs_pow;
|
192
|
+
for( ; k != 0; ++out, seq = m, k /= qs_base )
|
193
|
+
{
|
194
|
+
m = seq % k;
|
195
|
+
RealType v = static_cast<RealType>((seq - m) / k); // RealType <- size type
|
196
|
+
r += v;
|
197
|
+
r /= static_cast<RealType>(qs_base);
|
198
|
+
*out = v; // saves double dereference
|
199
|
+
}
|
200
|
+
return r;
|
201
|
+
}
|
202
|
+
|
203
|
+
void compute_coefficients(const size_type n)
|
204
|
+
{
|
205
|
+
// Resize and initialize to zero
|
206
|
+
coeff.resize(static_cast<std::size_t>(size_hint(n)));
|
207
|
+
std::fill(coeff.begin(), coeff.end(), packed_uint_t());
|
208
|
+
|
209
|
+
// The first row and the diagonal is assigned to 1
|
210
|
+
upper_element(0, 0, n) = 1;
|
211
|
+
for (size_type i = 1; i < n; ++i)
|
212
|
+
{
|
213
|
+
upper_element(0, i, n) = 1;
|
214
|
+
upper_element(i, i, n) = 1;
|
215
|
+
}
|
216
|
+
|
217
|
+
// Computes binomial coefficients MOD qs_base
|
218
|
+
for (size_type i = 1; i < n; ++i)
|
219
|
+
{
|
220
|
+
for (size_type j = i + 1; j < n; ++j)
|
221
|
+
{
|
222
|
+
upper_element(i, j, n) = ( upper_element(i, j-1, n) +
|
223
|
+
upper_element(i-1, j-1, n) ) % qs_base;
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
|
228
|
+
private:
|
229
|
+
packed_uint_t qs_base;
|
230
|
+
|
231
|
+
// here we cache precomputed data; note that binomial coefficients have
|
232
|
+
// to be recomputed iff the integer part of the logarithm of seq changes,
|
233
|
+
// which happens relatively rarely.
|
234
|
+
std::vector<packed_uint_t> coeff; // packed upper (!) triangular matrix
|
235
|
+
std::vector<RealType> ytemp;
|
236
|
+
size_type qs_pow;
|
237
|
+
};
|
238
|
+
|
239
|
+
} // namespace qrng_detail
|
240
|
+
|
241
|
+
typedef detail::qrng_tables::primes default_faure_prime_table;
|
242
|
+
|
243
|
+
/** @endcond */
|
244
|
+
|
245
|
+
//!Instantiations of class template faure_engine model a \quasi_random_number_generator.
|
246
|
+
//!The faure_engine uses the algorithm described in
|
247
|
+
//! \blockquote
|
248
|
+
//!Henri Faure,
|
249
|
+
//!Discrepance de suites associees a un systeme de numeration (en dimension s),
|
250
|
+
//!Acta Arithmetica,
|
251
|
+
//!Volume 41, 1982, pages 337-351.
|
252
|
+
//! \endblockquote
|
253
|
+
//
|
254
|
+
//! \blockquote
|
255
|
+
//!Bennett Fox,
|
256
|
+
//!Algorithm 647:
|
257
|
+
//!Implementation and Relative Efficiency of Quasirandom
|
258
|
+
//!Sequence Generators,
|
259
|
+
//!ACM Transactions on Mathematical Software,
|
260
|
+
//!Volume 12, Number 4, December 1986, pages 362-376.
|
261
|
+
//! \endblockquote
|
262
|
+
//!
|
263
|
+
//!In the following documentation @c X denotes the concrete class of the template
|
264
|
+
//!faure_engine returning objects of type @c RealType, u and v are the values of @c X.
|
265
|
+
//!
|
266
|
+
//!Some member functions may throw exceptions of type @c std::bad_alloc.
|
267
|
+
template<typename RealType, typename SeqSizeT, typename PrimeTable = default_faure_prime_table>
|
268
|
+
class faure_engine
|
269
|
+
: public qrng_detail::qrng_base<
|
270
|
+
faure_engine<RealType, SeqSizeT, PrimeTable>
|
271
|
+
, qrng_detail::binomial_coefficients<RealType, SeqSizeT, PrimeTable>
|
272
|
+
, SeqSizeT
|
273
|
+
>
|
274
|
+
{
|
275
|
+
typedef faure_engine<RealType, SeqSizeT, PrimeTable> self_t;
|
276
|
+
|
277
|
+
typedef qrng_detail::binomial_coefficients<RealType, SeqSizeT, PrimeTable> lattice_t;
|
278
|
+
typedef qrng_detail::qrng_base<self_t, lattice_t, SeqSizeT> base_t;
|
279
|
+
|
280
|
+
friend class qrng_detail::qrng_base<self_t, lattice_t, SeqSizeT>;
|
281
|
+
|
282
|
+
public:
|
283
|
+
typedef RealType result_type;
|
284
|
+
|
285
|
+
/** @copydoc boost::random::niederreiter_base2_engine::min() */
|
286
|
+
static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
287
|
+
{ return static_cast<result_type>(0); }
|
288
|
+
|
289
|
+
/** @copydoc boost::random::niederreiter_base2_engine::max() */
|
290
|
+
static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
291
|
+
{ return static_cast<result_type>(1); }
|
292
|
+
|
293
|
+
//!Effects: Constructs the `s`-dimensional default Faure quasi-random number generator.
|
294
|
+
//!
|
295
|
+
//!Throws: bad_alloc, invalid_argument.
|
296
|
+
explicit faure_engine(std::size_t s)
|
297
|
+
: base_t(s) // initialize the binomial table here
|
298
|
+
{}
|
299
|
+
|
300
|
+
/** @copydetails boost::random::niederreiter_base2_engine::seed(UIntType)
|
301
|
+
* Throws: bad_alloc.
|
302
|
+
*/
|
303
|
+
void seed(SeqSizeT init = 0)
|
304
|
+
{
|
305
|
+
compute_seq(init);
|
306
|
+
base_t::reset_seq(init);
|
307
|
+
}
|
308
|
+
|
309
|
+
#ifdef BOOST_RANDOM_DOXYGEN
|
310
|
+
//=========================Doxygen needs this!==============================
|
311
|
+
|
312
|
+
/** @copydoc boost::random::niederreiter_base2_engine::dimension() */
|
313
|
+
std::size_t dimension() const { return base_t::dimension(); }
|
314
|
+
|
315
|
+
/** @copydoc boost::random::niederreiter_base2_engine::operator()() */
|
316
|
+
result_type operator()()
|
317
|
+
{
|
318
|
+
return base_t::operator()();
|
319
|
+
}
|
320
|
+
|
321
|
+
/** @copydoc boost::random::niederreiter_base2_engine::discard(boost::uintmax_t)
|
322
|
+
* Throws: bad_alloc.
|
323
|
+
*/
|
324
|
+
void discard(boost::uintmax_t z)
|
325
|
+
{
|
326
|
+
base_t::discard(z);
|
327
|
+
}
|
328
|
+
|
329
|
+
/** Returns true if the two generators will produce identical sequences of outputs. */
|
330
|
+
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(faure_engine, x, y)
|
331
|
+
{ return static_cast<const base_t&>(x) == y; }
|
332
|
+
|
333
|
+
/** Returns true if the two generators will produce different sequences of outputs. */
|
334
|
+
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(faure_engine)
|
335
|
+
|
336
|
+
/** Writes the textual representation of the generator to a @c std::ostream. */
|
337
|
+
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, faure_engine, s)
|
338
|
+
{ return os << static_cast<const base_t&>(s); }
|
339
|
+
|
340
|
+
/** Reads the textual representation of the generator from a @c std::istream. */
|
341
|
+
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, faure_engine, s)
|
342
|
+
{ return is >> static_cast<base_t&>(s); }
|
343
|
+
|
344
|
+
#endif // BOOST_RANDOM_DOXYGEN
|
345
|
+
|
346
|
+
private:
|
347
|
+
/** @cond hide_private_members */
|
348
|
+
void compute_seq(SeqSizeT seq)
|
349
|
+
{
|
350
|
+
qrng_detail::check_seed_sign(seq);
|
351
|
+
this->lattice.update(seq, this->state_begin(), this->state_end());
|
352
|
+
}
|
353
|
+
/** @endcond */
|
354
|
+
};
|
355
|
+
|
356
|
+
/**
|
357
|
+
* @attention This specialization of \faure_engine supports up to 1117 dimensions.
|
358
|
+
*
|
359
|
+
* However, it is possible to provide your own prime table to \faure_engine should the default one be insufficient.
|
360
|
+
*/
|
361
|
+
typedef faure_engine<double, boost::uint_least64_t, default_faure_prime_table> faure;
|
362
|
+
|
363
|
+
} // namespace random
|
364
|
+
|
365
|
+
} // namespace boost
|
366
|
+
|
367
|
+
#endif // BOOST_RANDOM_FAURE_HPP
|
@@ -0,0 +1,360 @@
|
|
1
|
+
/* boost random/nierderreiter_base2.hpp header file
|
2
|
+
*
|
3
|
+
* Copyright Justinas Vygintas Daugmaudis 2010-2018
|
4
|
+
* Distributed under the Boost Software License, Version 1.0. (See
|
5
|
+
* accompanying file LICENSE_1_0.txt or copy at
|
6
|
+
* http://www.boost.org/LICENSE_1_0.txt)
|
7
|
+
*/
|
8
|
+
|
9
|
+
#ifndef BOOST_RANDOM_NIEDERREITER_BASE2_HPP
|
10
|
+
#define BOOST_RANDOM_NIEDERREITER_BASE2_HPP
|
11
|
+
|
12
|
+
#include <boost/random/detail/niederreiter_base2_table.hpp>
|
13
|
+
#include <boost/random/detail/gray_coded_qrng.hpp>
|
14
|
+
|
15
|
+
#include <boost/dynamic_bitset.hpp>
|
16
|
+
|
17
|
+
namespace boost {
|
18
|
+
namespace random {
|
19
|
+
|
20
|
+
/** @cond */
|
21
|
+
namespace qrng_detail {
|
22
|
+
namespace nb2 {
|
23
|
+
|
24
|
+
// Return the base 2 logarithm for a given bitset v
|
25
|
+
template <typename DynamicBitset>
|
26
|
+
inline typename DynamicBitset::size_type
|
27
|
+
bitset_log2(const DynamicBitset& v)
|
28
|
+
{
|
29
|
+
if (v.none())
|
30
|
+
boost::throw_exception( std::invalid_argument("bitset_log2") );
|
31
|
+
|
32
|
+
typename DynamicBitset::size_type hibit = v.size() - 1;
|
33
|
+
while (!v.test(hibit))
|
34
|
+
--hibit;
|
35
|
+
return hibit;
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
// Multiply polynomials over Z_2.
|
40
|
+
template <typename PolynomialT, typename DynamicBitset>
|
41
|
+
inline void modulo2_multiply(PolynomialT P, DynamicBitset& v, DynamicBitset& pt)
|
42
|
+
{
|
43
|
+
pt.reset(); // pt == 0
|
44
|
+
for (; P; P >>= 1, v <<= 1)
|
45
|
+
if (P & 1) pt ^= v;
|
46
|
+
pt.swap(v);
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
// Calculate the values of the constants V(J,R) as
|
51
|
+
// described in BFN section 3.3.
|
52
|
+
//
|
53
|
+
// pb = polynomial defined in section 2.3 of BFN.
|
54
|
+
template <typename DynamicBitset>
|
55
|
+
inline void calculate_v(const DynamicBitset& pb,
|
56
|
+
typename DynamicBitset::size_type kj,
|
57
|
+
typename DynamicBitset::size_type pb_degree,
|
58
|
+
DynamicBitset& v)
|
59
|
+
{
|
60
|
+
typedef typename DynamicBitset::size_type size_type;
|
61
|
+
|
62
|
+
// Now choose values of V in accordance with
|
63
|
+
// the conditions in section 3.3.
|
64
|
+
size_type r = 0;
|
65
|
+
for ( ; r != kj; ++r)
|
66
|
+
v.reset(r);
|
67
|
+
|
68
|
+
// Quoting from BFN: "Our program currently sets each K_q
|
69
|
+
// equal to eq. This has the effect of setting all unrestricted
|
70
|
+
// values of v to 1."
|
71
|
+
for ( ; r < pb_degree; ++r)
|
72
|
+
v.set(r);
|
73
|
+
|
74
|
+
// Calculate the remaining V's using the recursion of section 2.3,
|
75
|
+
// remembering that the B's have the opposite sign.
|
76
|
+
for ( ; r != v.size(); ++r)
|
77
|
+
{
|
78
|
+
bool term = false;
|
79
|
+
for (typename DynamicBitset::size_type k = 0; k < pb_degree; ++k)
|
80
|
+
{
|
81
|
+
term ^= pb.test(k) & v[r + k - pb_degree];
|
82
|
+
}
|
83
|
+
v[r] = term;
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
} // namespace nb2
|
88
|
+
|
89
|
+
template<typename UIntType, unsigned w, typename Nb2Table>
|
90
|
+
struct niederreiter_base2_lattice
|
91
|
+
{
|
92
|
+
typedef UIntType value_type;
|
93
|
+
|
94
|
+
BOOST_STATIC_ASSERT(w > 0u);
|
95
|
+
BOOST_STATIC_CONSTANT(unsigned, bit_count = w);
|
96
|
+
|
97
|
+
private:
|
98
|
+
typedef std::vector<value_type> container_type;
|
99
|
+
|
100
|
+
public:
|
101
|
+
explicit niederreiter_base2_lattice(std::size_t dimension)
|
102
|
+
{
|
103
|
+
resize(dimension);
|
104
|
+
}
|
105
|
+
|
106
|
+
void resize(std::size_t dimension)
|
107
|
+
{
|
108
|
+
typedef boost::dynamic_bitset<> bitset_type;
|
109
|
+
|
110
|
+
dimension_assert("Niederreiter base 2", dimension, Nb2Table::max_dimension);
|
111
|
+
|
112
|
+
// Initialize the bit array
|
113
|
+
container_type cj(bit_count * dimension);
|
114
|
+
|
115
|
+
// Reserve temporary space for lattice computation
|
116
|
+
bitset_type v, pb, tmp;
|
117
|
+
|
118
|
+
// Compute Niedderreiter base 2 lattice
|
119
|
+
for (std::size_t dim = 0; dim != dimension; ++dim)
|
120
|
+
{
|
121
|
+
const typename Nb2Table::value_type poly = Nb2Table::polynomial(dim);
|
122
|
+
if (poly > std::numeric_limits<value_type>::max()) {
|
123
|
+
boost::throw_exception( std::range_error("niederreiter_base2: polynomial value outside the given value type range") );
|
124
|
+
}
|
125
|
+
|
126
|
+
const unsigned degree = multiprecision::msb(poly); // integer log2(poly)
|
127
|
+
const unsigned space_required = degree * ((bit_count / degree) + 1); // ~ degree + bit_count
|
128
|
+
|
129
|
+
v.resize(degree + bit_count - 1);
|
130
|
+
|
131
|
+
// For each dimension, we need to calculate powers of an
|
132
|
+
// appropriate irreducible polynomial, see Niederreiter
|
133
|
+
// page 65, just below equation (19).
|
134
|
+
// Copy the appropriate irreducible polynomial into PX,
|
135
|
+
// and its degree into E. Set polynomial B = PX ** 0 = 1.
|
136
|
+
// M is the degree of B. Subsequently B will hold higher
|
137
|
+
// powers of PX.
|
138
|
+
pb.resize(space_required); tmp.resize(space_required);
|
139
|
+
|
140
|
+
typename bitset_type::size_type kj, pb_degree = 0;
|
141
|
+
pb.reset(); // pb == 0
|
142
|
+
pb.set(pb_degree); // set the proper bit for the pb_degree
|
143
|
+
|
144
|
+
value_type j = high_bit_mask_t<bit_count - 1>::high_bit;
|
145
|
+
do
|
146
|
+
{
|
147
|
+
// Now choose a value of Kj as defined in section 3.3.
|
148
|
+
// We must have 0 <= Kj < E*J = M.
|
149
|
+
// The limit condition on Kj does not seem to be very relevant
|
150
|
+
// in this program.
|
151
|
+
kj = pb_degree;
|
152
|
+
|
153
|
+
// Now multiply B by PX so B becomes PX**J.
|
154
|
+
// In section 2.3, the values of Bi are defined with a minus sign :
|
155
|
+
// don't forget this if you use them later!
|
156
|
+
nb2::modulo2_multiply(poly, pb, tmp);
|
157
|
+
pb_degree += degree;
|
158
|
+
if (pb_degree >= pb.size()) {
|
159
|
+
// Note that it is quite possible for kj to become bigger than
|
160
|
+
// the new computed value of pb_degree.
|
161
|
+
pb_degree = nb2::bitset_log2(pb);
|
162
|
+
}
|
163
|
+
|
164
|
+
// If U = 0, we need to set B to the next power of PX
|
165
|
+
// and recalculate V.
|
166
|
+
nb2::calculate_v(pb, kj, pb_degree, v);
|
167
|
+
|
168
|
+
// Niederreiter (page 56, after equation (7), defines two
|
169
|
+
// variables Q and U. We do not need Q explicitly, but we
|
170
|
+
// do need U.
|
171
|
+
|
172
|
+
// Advance Niederreiter's state variables.
|
173
|
+
for (unsigned u = 0; j && u != degree; ++u, j >>= 1)
|
174
|
+
{
|
175
|
+
// Now C is obtained from V. Niederreiter
|
176
|
+
// obtains A from V (page 65, near the bottom), and then gets
|
177
|
+
// C from A (page 56, equation (7)). However this can be done
|
178
|
+
// in one step. Here CI(J,R) corresponds to
|
179
|
+
// Niederreiter's C(I,J,R), whose values we pack into array
|
180
|
+
// CJ so that CJ(I,R) holds all the values of C(I,J,R) for J from 1 to NBITS.
|
181
|
+
for (unsigned r = 0; r != bit_count; ++r) {
|
182
|
+
value_type& num = cj[dimension * r + dim];
|
183
|
+
// set the jth bit in num
|
184
|
+
num = (num & ~j) | (-v[r + u] & j);
|
185
|
+
}
|
186
|
+
}
|
187
|
+
} while (j != 0);
|
188
|
+
}
|
189
|
+
|
190
|
+
bits.swap(cj);
|
191
|
+
}
|
192
|
+
|
193
|
+
typename container_type::const_iterator iter_at(std::size_t n) const
|
194
|
+
{
|
195
|
+
BOOST_ASSERT(!(n > bits.size()));
|
196
|
+
return bits.begin() + n;
|
197
|
+
}
|
198
|
+
|
199
|
+
private:
|
200
|
+
container_type bits;
|
201
|
+
};
|
202
|
+
|
203
|
+
} // namespace qrng_detail
|
204
|
+
|
205
|
+
typedef detail::qrng_tables::niederreiter_base2 default_niederreiter_base2_table;
|
206
|
+
|
207
|
+
/** @endcond */
|
208
|
+
|
209
|
+
//!Instantiations of class template niederreiter_base2_engine model a \quasi_random_number_generator.
|
210
|
+
//!The niederreiter_base2_engine uses the algorithm described in
|
211
|
+
//! \blockquote
|
212
|
+
//!Bratley, Fox, Niederreiter, ACM Trans. Model. Comp. Sim. 2, 195 (1992).
|
213
|
+
//! \endblockquote
|
214
|
+
//!
|
215
|
+
//!\attention niederreiter_base2_engine skips trivial zeroes at the start of the sequence. For example,
|
216
|
+
//!the beginning of the 2-dimensional Niederreiter base 2 sequence in @c uniform_01 distribution will look
|
217
|
+
//!like this:
|
218
|
+
//!\code{.cpp}
|
219
|
+
//!0.5, 0.5,
|
220
|
+
//!0.75, 0.25,
|
221
|
+
//!0.25, 0.75,
|
222
|
+
//!0.375, 0.375,
|
223
|
+
//!0.875, 0.875,
|
224
|
+
//!...
|
225
|
+
//!\endcode
|
226
|
+
//!
|
227
|
+
//!In the following documentation @c X denotes the concrete class of the template
|
228
|
+
//!niederreiter_base2_engine returning objects of type @c UIntType, u and v are the values of @c X.
|
229
|
+
//!
|
230
|
+
//!Some member functions may throw exceptions of type std::range_error. This
|
231
|
+
//!happens when the quasi-random domain is exhausted and the generator cannot produce
|
232
|
+
//!any more values. The length of the low discrepancy sequence is given by
|
233
|
+
//! \f$L=Dimension \times (2^{w} - 1)\f$.
|
234
|
+
template<typename UIntType, unsigned w, typename Nb2Table = default_niederreiter_base2_table>
|
235
|
+
class niederreiter_base2_engine
|
236
|
+
: public qrng_detail::gray_coded_qrng<
|
237
|
+
qrng_detail::niederreiter_base2_lattice<UIntType, w, Nb2Table>
|
238
|
+
>
|
239
|
+
{
|
240
|
+
typedef qrng_detail::niederreiter_base2_lattice<UIntType, w, Nb2Table> lattice_t;
|
241
|
+
typedef qrng_detail::gray_coded_qrng<lattice_t> base_t;
|
242
|
+
|
243
|
+
public:
|
244
|
+
//!Effects: Constructs the default `s`-dimensional Niederreiter base 2 quasi-random number generator.
|
245
|
+
//!
|
246
|
+
//!Throws: bad_alloc, invalid_argument, range_error.
|
247
|
+
explicit niederreiter_base2_engine(std::size_t s)
|
248
|
+
: base_t(s) // initialize lattice here
|
249
|
+
{}
|
250
|
+
|
251
|
+
#ifdef BOOST_RANDOM_DOXYGEN
|
252
|
+
//=========================Doxygen needs this!==============================
|
253
|
+
typedef UIntType result_type;
|
254
|
+
|
255
|
+
//!Returns: Tight lower bound on the set of values returned by operator().
|
256
|
+
//!
|
257
|
+
//!Throws: nothing.
|
258
|
+
static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
259
|
+
{ return (base_t::min)(); }
|
260
|
+
|
261
|
+
//!Returns: Tight upper bound on the set of values returned by operator().
|
262
|
+
//!
|
263
|
+
//!Throws: nothing.
|
264
|
+
static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
265
|
+
{ return (base_t::max)(); }
|
266
|
+
|
267
|
+
//!Returns: The dimension of of the quasi-random domain.
|
268
|
+
//!
|
269
|
+
//!Throws: nothing.
|
270
|
+
std::size_t dimension() const { return base_t::dimension(); }
|
271
|
+
|
272
|
+
//!Effects: Resets the quasi-random number generator state to
|
273
|
+
//!the one given by the default construction. Equivalent to u.seed(0).
|
274
|
+
//!
|
275
|
+
//!\brief Throws: nothing.
|
276
|
+
void seed()
|
277
|
+
{
|
278
|
+
base_t::seed();
|
279
|
+
}
|
280
|
+
|
281
|
+
//!Effects: Effectively sets the quasi-random number generator state to the `init`-th
|
282
|
+
//!vector in the `s`-dimensional quasi-random domain, where `s` == X::dimension().
|
283
|
+
//!\code
|
284
|
+
//!X u, v;
|
285
|
+
//!for(int i = 0; i < N; ++i)
|
286
|
+
//! for( std::size_t j = 0; j < u.dimension(); ++j )
|
287
|
+
//! u();
|
288
|
+
//!v.seed(N);
|
289
|
+
//!assert(u() == v());
|
290
|
+
//!\endcode
|
291
|
+
//!
|
292
|
+
//!\brief Throws: range_error.
|
293
|
+
void seed(UIntType init)
|
294
|
+
{
|
295
|
+
base_t::seed(init);
|
296
|
+
}
|
297
|
+
|
298
|
+
//!Returns: Returns a successive element of an `s`-dimensional
|
299
|
+
//!(s = X::dimension()) vector at each invocation. When all elements are
|
300
|
+
//!exhausted, X::operator() begins anew with the starting element of a
|
301
|
+
//!subsequent `s`-dimensional vector.
|
302
|
+
//!
|
303
|
+
//!Throws: range_error.
|
304
|
+
result_type operator()()
|
305
|
+
{
|
306
|
+
return base_t::operator()();
|
307
|
+
}
|
308
|
+
|
309
|
+
//!Effects: Advances *this state as if `z` consecutive
|
310
|
+
//!X::operator() invocations were executed.
|
311
|
+
//!\code
|
312
|
+
//!X u = v;
|
313
|
+
//!for(int i = 0; i < N; ++i)
|
314
|
+
//! u();
|
315
|
+
//!v.discard(N);
|
316
|
+
//!assert(u() == v());
|
317
|
+
//!\endcode
|
318
|
+
//!
|
319
|
+
//!Throws: range_error.
|
320
|
+
void discard(boost::uintmax_t z)
|
321
|
+
{
|
322
|
+
base_t::discard(z);
|
323
|
+
}
|
324
|
+
|
325
|
+
//!Returns true if the two generators will produce identical sequences of outputs.
|
326
|
+
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(niederreiter_base2_engine, x, y)
|
327
|
+
{ return static_cast<const base_t&>(x) == y; }
|
328
|
+
|
329
|
+
//!Returns true if the two generators will produce different sequences of outputs.
|
330
|
+
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(niederreiter_base2_engine)
|
331
|
+
|
332
|
+
//!Writes the textual representation of the generator to a @c std::ostream.
|
333
|
+
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, niederreiter_base2_engine, s)
|
334
|
+
{ return os << static_cast<const base_t&>(s); }
|
335
|
+
|
336
|
+
//!Reads the textual representation of the generator from a @c std::istream.
|
337
|
+
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, niederreiter_base2_engine, s)
|
338
|
+
{ return is >> static_cast<base_t&>(s); }
|
339
|
+
|
340
|
+
#endif // BOOST_RANDOM_DOXYGEN
|
341
|
+
};
|
342
|
+
|
343
|
+
|
344
|
+
/**
|
345
|
+
* @attention This specialization of \niederreiter_base2_engine supports up to 4720 dimensions.
|
346
|
+
*
|
347
|
+
* Binary irreducible polynomials (primes in the ring `GF(2)[X]`, evaluated at `X=2`) were generated
|
348
|
+
* while condition `max(prime)` < 2<sup>16</sup> was satisfied.
|
349
|
+
*
|
350
|
+
* There are exactly 4720 such primes, which yields a Niederreiter base 2 table for 4720 dimensions.
|
351
|
+
*
|
352
|
+
* However, it is possible to provide your own table to \niederreiter_base2_engine should the default one be insufficient.
|
353
|
+
*/
|
354
|
+
typedef niederreiter_base2_engine<boost::uint_least64_t, 64u, default_niederreiter_base2_table> niederreiter_base2;
|
355
|
+
|
356
|
+
} // namespace random
|
357
|
+
|
358
|
+
} // namespace boost
|
359
|
+
|
360
|
+
#endif // BOOST_RANDOM_NIEDERREITER_BASE2_HPP
|