fn shuffle_flatten()

in protocol/src/suid_create/sharer.rs [192:282]


    fn shuffle_flatten(
        &self,
        mut data: Vec<(Vec<Vec<TPoint>>, Vec<Vec<TPoint>>)>,
    ) -> Result<TPayload, ProtocolError> {
        match (
            self.permutation.clone().write(),
            self.num_entries.clone().write(),
        ) {
            (Ok(mut permutation), Ok(mut num_entries)) => {
                num_entries.clear();
                num_entries.extend(data.iter().map(|(x, _)| x.len()).collect::<Vec<_>>());

                let total_entries = num_entries.iter().sum();

                permutation.clear();
                permutation.extend(gen_permute_pattern(total_entries));

                let (c1_buf, c2_buf, offset) = {
                    let mut c1 = Vec::<Vec<TPoint>>::new();
                    for x in data.iter_mut() {
                        c1.append(&mut x.0);
                    }

                    let mut c2 = Vec::<Vec<TPoint>>::new();
                    for x in data.iter_mut() {
                        c2.append(&mut x.1);
                    }

                    assert_eq!(c1.len(), c2.len());
                    assert_eq!(c1.len(), permutation.len());

                    // Free up memory
                    data.clear();
                    data.shrink_to_fit();

                    // Global permute
                    permute(permutation.as_slice(), &mut c1);
                    permute(permutation.as_slice(), &mut c2);

                    // Flatten and calculate offsets for unflattening
                    let (c1_f, offset_c1, _) = serialize_helper(c1);
                    let (c2_f, offset_c2, _) = serialize_helper(c2);

                    assert_eq!(c1_f.len(), c2_f.len());
                    assert_eq!(offset_c1.len(), offset_c2.len());

                    // Check if the vectors are identical
                    assert_eq!(
                        offset_c1
                            .iter()
                            .zip_eq(offset_c2.iter())
                            .filter(|&(a, b)| a != b)
                            .count(),
                        0
                    );

                    (
                        self.ec_cipher.to_bytes(&c1_f),
                        self.ec_cipher.to_bytes(&c2_f),
                        offset_c1,
                    )
                };

                let offset_len = offset.len();

                let mut buf = c1_buf;
                buf.extend(c2_buf);

                let data_len = buf.len();

                // Push only one offset for two data since both should
                // have same shape
                buf.extend(offset);

                buf.push(ByteBuffer {
                    buffer: (data_len as u64).to_le_bytes().to_vec(),
                });
                buf.push(ByteBuffer {
                    buffer: (offset_len as u64).to_le_bytes().to_vec(),
                });

                Ok(buf)
            }
            _ => {
                error!("Unable to shuffle data");
                Err(ProtocolError::ErrorShuffle(
                    "unable to shuffle data".to_string(),
                ))
            }
        }
    }