passenger 6.0.1 → 6.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +145 -18
- data/CONTRIBUTORS +6 -0
- data/bin/passenger-install-nginx-module +1 -1
- data/bin/passenger-status +15 -0
- data/build/misc.rb +3 -1
- 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/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 +2 -0
- 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 +1 -0
- data/src/agent/Core/ApplicationPool/Options.h +10 -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 +14 -1
- data/src/agent/Core/Controller.h +1 -0
- data/src/agent/Core/Controller/Config.h +5 -1
- data/src/agent/Core/Controller/ForwardResponse.cpp +13 -0
- data/src/agent/Core/Controller/InitRequest.cpp +3 -0
- data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -0
- data/src/agent/Core/CoreMain.cpp +2 -1
- data/src/agent/Core/OptionParser.h +3 -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/TempDirToucher/TempDirToucherMain.cpp +2 -0
- data/src/agent/Watchdog/Config.h +15 -1
- data/src/agent/Watchdog/WatchdogMain.cpp +7 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +10 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +10 -0
- data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +30 -0
- data/src/apache2_module/Hooks.cpp +6 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +20 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +24 -0
- data/src/cxx_supportlib/Constants.h +2 -1
- data/src/cxx_supportlib/LoggingKit/Config.h +2 -0
- data/src/cxx_supportlib/LoggingKit/Implementation.cpp +15 -9
- data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
- data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +20 -19
- 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/helper-scripts/prespawn +1 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +40 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +26 -0
- data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +48 -0
- data/src/nginx_module/Configuration.c +6 -2
- data/src/nginx_module/ContentHandler.c +5 -1
- data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +15 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +28 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +6 -0
- data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +11 -0
- data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +11 -0
- data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +23 -0
- data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +8 -0
- data/src/nginx_module/ngx_http_passenger_module.c +2 -0
- data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +0 -0
- data/src/ruby_native_extension/extconf.rb +7 -0
- data/src/ruby_supportlib/phusion_passenger.rb +7 -7
- data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +8 -0
- data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +23 -0
- data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -0
- data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -3
- data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +37 -0
- 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 +2 -2
- data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +5 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +11 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +3 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/tee_input.rb +6 -0
- 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
|