Skip to content

[4.2][SE-0202][stdlib] Random unification #16495

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

lorentey
Copy link
Member

@lorentey lorentey commented May 10, 2018

This is @Azoy's implementation of SE-0202, cherry picked from #16413.

Reviewed by @natecook1000, @milseman, @stephentyrone, @xwu & myself

rdar://problem/39666971

Azoy and others added 6 commits May 10, 2018 14:51
Initial random api

Use C syscall for I/O

1. Fixed an issue where integers would would result in an infinite loop if they were unsigned, or signed integers always returning negative numbers.
2. Fixed an issue with Bool initialization

Add shuffle functions

Add documentation to Random API

Fix a few typos within the documentation

Fixes more typos

Also states that the range for floating points is from 0 to 1 inclusive

Update API to reflect mailing list discussions

Remove unnecessary import

Make sure not to return upperBound on Range

Use SecRandomCopyBytes on older macOS

Update API to match mailing list discussion, add tests

Added pick(_:) to collection
Added random(in:using:) to Randomizable
Added tests

Fix typo in Randomizable documentation

Rename pick to sampling

Move sampling below random

Update docs

Use new Libc naming

Fix Random.swift with new Libc naming

Remove sampling

gybify signed integer creation

Make FloatingPoint.random exclusive

Refactor {Closed}Range.random

Fix FloatingPoint initialization

Precondition getting a random number from range

Fix some doc typos

Make .random a function

Update API to reflect discussion

Make .random a function
Remove .random() in favor of .random(in:) for all numeric types

Fix compile errors

Clean up _stdlib_random

Cleanup around API

Remove `.random()` requirement from `Collection`

Use generators

Optimize shuffle()

Thread safety for /dev/urandom

Remove {Closed}Range<BinaryFloatingPoint>.random()

Add Collection random requirement

Refactor _stdlib_random

Remove whitespace changes

Clean linux shim

Add shuffle and more tests

Provide finishing tests and suggestions

Remove refs to Countable ranges

Revert to checking if T is > UInt64

(cherry picked from commit d23d219)
* Remove refs to Countable ranges

* Add `_stdlib_random` for more platforms

* Use `getrandom` (if available) for Android, Cygwin

* Reorder the `_stdlib_random` functions

* Also include <features.h> on Linux

* Add `#error TODO` in `_stdlib_random` for Windows

* Colon after Fatal Error

Performance improvement for Random

gybify ranges

Fix typo in 'basic random numbers'
Add _stdlib_random as a testable method

Switch to generic constraints

Hopefully link against bcrypt

Fix some implementation details

1. Uniform distribution is now uniform
2. Apply Jens' method for uniform floats

Fix a lineable attribute

(cherry picked from commit a5df0ef)
* [stdlib] Revise documentation for new random APIs

* [stdlib] Fix constraints on random integer generation

* [test] Isolate failing Random test

* [benchmark] Add benchmarks for new random APIs

Fix Float80 test

Value type generators

random -> randomElement

Fix some docs

One more doc fix

Doc fixes & bool fix

Use computed over explicit

(cherry picked from commit f146d17)
* Use the `__has_include` and `GRND_RANDOM` macros

* Use `getentropy` instead of `getrandom`

* Use `std::min` from the <algorithm> header

* Move `#if` out of the `_stdlib_random` function

* Use `getrandom` with "/dev/urandom" fallback

* Use `#pragma comment` to import "Bcrypt.lib"

* <https://docs.microsoft.com/en-us/cpp/preprocessor/comment-c-cpp>
* <https://clang.llvm.org/docs/UsersManual.html#microsoft-extensions>

* Use "/dev/urandom" instead of `SecRandomCopyBytes`

* Use `swift::StaticMutex` for shared "/dev/urandom"

* Add `getrandom_available`; use `O_CLOEXEC` flag

Add platform impl docs

Update copyrights

Fix docs

Add _stdlib_random test

Update _stdlib_random test

Add missing &

Notice about _stdlib_random

Fix docs

Guard on upperBound = 0

Test full range of 8 bit integers

Remove some gyb

Clean up integerRangeTest

Remove FixedWidthInteger constraint

Use arc4random universally

Fix randomElement

Constrain shuffle to RandomAccessCollection

warning instead of error

Move Apple's implementation

Fix failing test on 32 bit systems

(cherry picked from commit b65d0c1)
…eir raw memory

Custom FixedWidthInteger types may not support this.

Introduce a new (non-public) FixedWidthInteger requirement for generating random values; implement it using &<</+ in the generic case, and specialize it using RandomNumberGenerator._fill(bytes) for the builtin types.

(cherry picked from commit 54b3b8b)
@lorentey
Copy link
Member Author

@swift-ci please test

@lorentey
Copy link
Member Author

cc @airspeedswift, @tkremenek

StdlibCollectionUnittest is not available in smoke tests.

(cherry picked from commit c03fe15)
@lorentey
Copy link
Member Author

@swift-ci test

@swift-ci
Copy link
Contributor

Build failed
Swift Test OS X Platform
Git Sha - fe24609

@airspeedswift
Copy link
Member

@swift-ci please test macOS platform

@Azoy
Copy link
Contributor

Azoy commented May 10, 2018

@airspeedswift after this gets merged, should I write up a pr for the changelog and update the proposal status?

@airspeedswift
Copy link
Member

@Azoy yes please

@swift-ci
Copy link
Contributor

Build failed
Swift Test OS X Platform
Git Sha - fe24609

@airspeedswift
Copy link
Member

OK one more time in the hope we don't get assigned the cursed build bot of doom...

@airspeedswift
Copy link
Member

@swift-ci please test macOS platform

@huonw
Copy link
Contributor

huonw commented May 11, 2018

There's two small tweaks that are probably good to pull in. I've done them for the 04-30-2018 branch at #16524. If this fails again could you pull them in here too?

huonw added 2 commits May 11, 2018 14:26
…0.999.

With the number of tests Swift does, this had a relatively high chance to fail
regularly somewhere.

Also, rejecting the lower tail means rejecting things that are perfectly
uniform, which I don't think should be the purpose of this test.
@huonw
Copy link
Contributor

huonw commented May 11, 2018

I realised that I could edit this PR directly, and because of timezones, the

@swift-ci please test

run will likely finish before everyone else comes back online; so I added those fixes.

@huonw
Copy link
Contributor

huonw commented May 11, 2018

@swift-ci please test

@swift-ci
Copy link
Contributor

Build failed
Swift Test Linux Platform
Git Sha - fe24609

@swift-ci
Copy link
Contributor

Build failed
Swift Test OS X Platform
Git Sha - fe24609

@airspeedswift airspeedswift merged commit b2a75e2 into swiftlang:swift-4.2-branch May 11, 2018
@lorentey lorentey deleted the random-unification-4.2 branch May 31, 2018 17:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants