pub mod ob_similarity;
pub fn to_ob_fp_kind(kind: &chiral_common::kinds::Fingerprint) -> openbabel::fingerprint::Kind {
match kind {
chiral_common::kinds::Fingerprint::OpenBabel { kind: common_op_fp_kind } => {
match common_op_fp_kind {
chiral_common::kinds::FingerprintOpenBabel::FP2 { nbits } => openbabel::fingerprint::Kind::FP2 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::FP3 { nbits } => openbabel::fingerprint::Kind::FP2 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::FP4 { nbits } => openbabel::fingerprint::Kind::FP2 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::ECFP0 { nbits } => openbabel::fingerprint::Kind::ECFP0 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::ECFP2 { nbits } => openbabel::fingerprint::Kind::ECFP2 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::ECFP4 { nbits } => openbabel::fingerprint::Kind::ECFP4 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::ECFP6 { nbits } => openbabel::fingerprint::Kind::ECFP6 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::ECFP8 { nbits } => openbabel::fingerprint::Kind::ECFP8 { nbits: *nbits },
chiral_common::kinds::FingerprintOpenBabel::ECFP10 { nbits } => openbabel::fingerprint::Kind::ECFP10 { nbits: *nbits },
}
}
}
}
pub fn similarity_tanimoto(fpd_1: &[u32], fpd_2: &[u32]) -> f32 {
let mut andbits: u32 = 0;
let mut orbits: u32 = 0;
for i in 0..fpd_1.len() {
let andfp: u32 = fpd_1[i] & fpd_2[i];
let orfp: u32 = fpd_1[i] | fpd_2[i];
andbits += andfp.count_ones();
orbits += orfp.count_ones();
}
if orbits > 0 {
andbits as f32 / orbits as f32
} else {
0.0
}
}