Merge branch 'dashu' of https://github.com/coasys/scryer-prolog into coasys-dashu
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use crate::parser::ast::*;
|
||||
use crate::parser::parser::*;
|
||||
|
||||
use dashu::integer::UBig;
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
use crate::arena::*;
|
||||
@@ -24,22 +25,24 @@ use crate::machine::preprocessor::to_op_decl;
|
||||
use crate::machine::stack::*;
|
||||
use crate::machine::streams::*;
|
||||
use crate::parser::char_reader::*;
|
||||
use crate::parser::rug::Integer;
|
||||
use crate::parser::rug::rand::RandState;
|
||||
use crate::parser::dashu::Integer;
|
||||
use crate::read::*;
|
||||
use crate::types::*;
|
||||
use rand::{Rng, SeedableRng};
|
||||
use rand::rngs::StdRng;
|
||||
|
||||
use ordered_float::OrderedFloat;
|
||||
|
||||
use fxhash::{FxBuildHasher, FxHasher};
|
||||
use indexmap::IndexSet;
|
||||
|
||||
use ref_thread_local::{RefThreadLocal, ref_thread_local};
|
||||
pub(crate) use ref_thread_local::RefThreadLocal;
|
||||
|
||||
use std::borrow::BorrowMut;
|
||||
use std::cell::Cell;
|
||||
use std::cmp::Ordering;
|
||||
use std::collections::BTreeSet;
|
||||
use std::convert::{TryFrom};
|
||||
use std::convert::TryFrom;
|
||||
use std::env;
|
||||
use std::ffi::CString;
|
||||
use std::fs;
|
||||
@@ -86,10 +89,6 @@ use http_body_util::BodyExt;
|
||||
use bytes::Buf;
|
||||
use reqwest::Url;
|
||||
|
||||
ref_thread_local! {
|
||||
pub(crate) static managed RANDOM_STATE: RandState<'static> = RandState::new();
|
||||
}
|
||||
|
||||
pub(crate) fn get_key() -> KeyEvent {
|
||||
let key;
|
||||
enable_raw_mode().expect("failed to enable raw mode");
|
||||
@@ -2733,7 +2732,7 @@ impl Machine {
|
||||
// n has already been confirmed as an integer, and
|
||||
// internally, Rational is assumed reduced, so its denominator
|
||||
// must be 1.
|
||||
r.numer().to_string()
|
||||
r.numerator().to_string()
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
@@ -2762,7 +2761,7 @@ impl Machine {
|
||||
// n has already been confirmed as an integer, and
|
||||
// internally, Rational is assumed reduced, so its
|
||||
// denominator must be 1.
|
||||
r.numer().to_string()
|
||||
r.numerator().to_string()
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
@@ -4138,9 +4137,24 @@ impl Machine {
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn maybe(&mut self) {
|
||||
fn generate_random_bits(num_bits: usize) -> u64 {
|
||||
let mut rng = rand::thread_rng();
|
||||
let rand = rng.borrow_mut();
|
||||
let mut random_bits: u64 = 0;
|
||||
|
||||
for _ in 0..num_bits {
|
||||
random_bits <<= 1;
|
||||
|
||||
if rand.gen_bool(0.5) {
|
||||
random_bits |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
random_bits
|
||||
}
|
||||
|
||||
let result = {
|
||||
let mut rand = RANDOM_STATE.borrow_mut();
|
||||
rand.bits(1) == 0
|
||||
generate_random_bits(1) == 0
|
||||
};
|
||||
|
||||
self.machine_st.fail = result;
|
||||
@@ -5239,7 +5253,7 @@ impl Machine {
|
||||
// n has already been confirmed as an integer, and
|
||||
// internally, Rational is assumed reduced, so its
|
||||
// denominator must be 1.
|
||||
r.numer().to_u8().unwrap()
|
||||
r.numerator().to_u8().unwrap()
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
@@ -5950,12 +5964,20 @@ impl Machine {
|
||||
#[inline(always)]
|
||||
pub(crate) fn set_seed(&mut self) {
|
||||
let seed = self.deref_register(1);
|
||||
let mut rand = RANDOM_STATE.borrow_mut();
|
||||
|
||||
|
||||
match Number::try_from(seed) {
|
||||
Ok(Number::Fixnum(n)) => rand.seed(&Integer::from(n)),
|
||||
Ok(Number::Integer(n)) => rand.seed(&*n),
|
||||
Ok(Number::Rational(n)) if n.denom() == &1 => rand.seed(n.numer()),
|
||||
Ok(Number::Fixnum(n)) => {
|
||||
let _: StdRng = SeedableRng::seed_from_u64(Integer::from(n).to_u64().unwrap());
|
||||
},
|
||||
Ok(Number::Integer(n)) => {
|
||||
let _: StdRng = SeedableRng::seed_from_u64(n.to_u64().unwrap());
|
||||
},
|
||||
Ok(Number::Rational(n)) => {
|
||||
if n.denominator() == &UBig::from(1 as u32) {
|
||||
let _: StdRng = SeedableRng::seed_from_u64(n.numerator().to_u64().unwrap());
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
self.machine_st.fail = true;
|
||||
}
|
||||
@@ -5969,7 +5991,7 @@ impl Machine {
|
||||
let time = match Number::try_from(time) {
|
||||
Ok(Number::Float(n)) => n.into_inner(),
|
||||
Ok(Number::Fixnum(n)) => n.get_num() as f64,
|
||||
Ok(Number::Integer(n)) => n.to_f64(),
|
||||
Ok(Number::Integer(n)) => n.to_f64().value(),
|
||||
_ => {
|
||||
unreachable!()
|
||||
}
|
||||
@@ -7625,7 +7647,7 @@ impl Machine {
|
||||
Number::Fixnum(Fixnum::build_with(n.get_num().count_ones() as i64))
|
||||
}
|
||||
Ok(Number::Integer(n)) => {
|
||||
Number::arena_from(n.count_ones().unwrap(), &mut self.machine_st.arena)
|
||||
Number::arena_from(n.count_ones(), &mut self.machine_st.arena)
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
|
||||
Reference in New Issue
Block a user