Skip to content

Commit

Permalink
f
Browse files Browse the repository at this point in the history
  • Loading branch information
mayeul-zama committed Sep 13, 2023
1 parent 247147e commit a0fb04b
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 29 deletions.
40 changes: 25 additions & 15 deletions tfhe/docs/application_tutorials/dark_market.md
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,10 @@ The new version for the plain `fill_orders` is as follows:
```rust
fn fill_orders(total_orders: u16, orders: &mut [u16], prefix_sum_arr: &[u16]) {
orders.iter().for_each(|order : &mut u64| {
let diff = total_orders as i64 - *prefix_sum_arr.get(i - 1).unwrap_or(&0) as i64;
let previous_prefix_sum = if i == 0 { 0 } else { prefix_sum_arr[i - 1] };

let diff = total_orders as i64 - previous_prefix_sum as i64;

if (diff < 0) {
*order = 0;
} else if diff < order {
Expand All @@ -351,7 +354,9 @@ To write this new function we need transform the conditional code into a mathema

fn fill_orders(total_orders: u16, orders: &mut [u16], prefix_sum_arr: &[u16]) {
for (i, order) in orders.iter_mut().enumerate() {
*order = (total_orders as i64 - *prefix_sum_arr.get(i - 1).unwrap_or(&0) as i64)
let previous_prefix_sum = if i == 0 { 0 } else { prefix_sum_arr[i - 1] };

*order = (total_orders as i64 - previous_prefix_sum as i64)
.max(0)
.min(*order as i64) as u16;
}
Expand Down Expand Up @@ -418,25 +423,30 @@ fn fill_orders(
.into_par_iter()
.enumerate()
.for_each(move |(i, order)| {
// (total_orders - prefix_sum).max(0)
let mut diff = if let Some(prefix_sum) = prefix_sum_arr.get(i - 1) {
// total_orders - prefix_sum
let mut diff = server_key
.smart_sub_parallelized(&mut total_orders.clone(), &mut prefix_sum.clone());
// (total_orders - previous_prefix_sum).max(0)
let mut diff = if i == 0 {
total_orders.clone()
} else {
let previous_prefix_sum = &prefix_sum_arr[i - 1];

// total_orders > prefix_sum
// total_orders - previous_prefix_sum
let mut diff = server_key.smart_sub_parallelized(
&mut total_orders.clone(),
&mut previous_prefix_sum.clone(),
);

let mut cond = server_key
.smart_gt_parallelized(&mut total_orders.clone(), &mut prefix_sum.clone());
// total_orders > prefix_sum
let mut cond = server_key.smart_gt_parallelized(
&mut total_orders.clone(),
&mut previous_prefix_sum.clone(),
);

// (total_orders - prefix_sum) * (total_orders > prefix_sum)
// = (total_orders - prefix_sum).max(0)
// (total_orders - previous_prefix_sum) * (total_orders > previous_prefix_sum)
// = (total_orders - previous_prefix_sum).max(0)
server_key.smart_mul_parallelized(&mut cond, &mut diff)
} else {
total_orders.clone()
};

// (total_orders - prefix_sum.get(i - 1)).max(0).min(*order);
// (total_orders - previous_prefix_sum).max(0).min(*order);
*order = server_key.smart_min_parallelized(&mut diff, order);
});
}
Expand Down
31 changes: 18 additions & 13 deletions tfhe/examples/dark_market/improved_parallel_fhe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,25 +57,30 @@ fn fill_orders(
.into_par_iter()
.enumerate()
.for_each(move |(i, order)| {
// (total_orders - prefix_sum).max(0)
let mut diff = if let Some(prefix_sum) = prefix_sum_arr.get(i - 1) {
// total_orders - prefix_sum
let mut diff = server_key
.smart_sub_parallelized(&mut total_orders.clone(), &mut prefix_sum.clone());
// (total_orders - previous_prefix_sum).max(0)
let mut diff = if i == 0 {
total_orders.clone()
} else {
let previous_prefix_sum = &prefix_sum_arr[i - 1];

// total_orders > prefix_sum
// total_orders - previous_prefix_sum
let mut diff = server_key.smart_sub_parallelized(
&mut total_orders.clone(),
&mut previous_prefix_sum.clone(),
);

let mut cond = server_key
.smart_gt_parallelized(&mut total_orders.clone(), &mut prefix_sum.clone());
// total_orders > prefix_sum
let mut cond = server_key.smart_gt_parallelized(
&mut total_orders.clone(),
&mut previous_prefix_sum.clone(),
);

// (total_orders - prefix_sum) * (total_orders > prefix_sum)
// = (total_orders - prefix_sum).max(0)
// (total_orders - previous_prefix_sum) * (total_orders > previous_prefix_sum)
// = (total_orders - previous_prefix_sum).max(0)
server_key.smart_mul_parallelized(&mut cond, &mut diff)
} else {
total_orders.clone()
};

// (total_orders - prefix_sum.get(i - 1)).max(0).min(*order);
// (total_orders - previous_prefix_sum).max(0).min(*order);
*order = server_key.smart_min_parallelized(&mut diff, order);
});
}
Expand Down
4 changes: 3 additions & 1 deletion tfhe/examples/dark_market/improved_plain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ fn compute_prefix_sum(arr: &[u16]) -> Vec<u16> {

fn fill_orders(total_orders: u16, orders: &mut [u16], prefix_sum_arr: &[u16]) {
for (i, order) in orders.iter_mut().enumerate() {
*order = (total_orders as i64 - *prefix_sum_arr.get(i - 1).unwrap_or(&0) as i64)
let previous_prefix_sum = if i == 0 { 0 } else { prefix_sum_arr[i - 1] };

*order = (total_orders as i64 - previous_prefix_sum as i64)
.max(0)
.min(*order as i64) as u16;
}
Expand Down

0 comments on commit a0fb04b

Please sign in to comment.