@@ -1022,6 +1022,90 @@ pub fn weighted_median_col_sparse(
1022
1022
median
1023
1023
}
1024
1024
1025
+ // Element-wise interpolation of two matrices: Result = A + ratio * (B - A).
1026
+ // ratio has intended range [0, 1]
1027
+ // ratio=0: Result = A
1028
+ // ratio=1: Result = B
1029
+ #[ allow( dead_code) ]
1030
+ pub fn interpolate ( mat1 : & [ Vec < I32F32 > ] , mat2 : & [ Vec < I32F32 > ] , ratio : I32F32 ) -> Vec < Vec < I32F32 > > {
1031
+ if ratio == I32F32 :: from_num ( 0 ) {
1032
+ return mat1. to_owned ( ) ;
1033
+ }
1034
+ if ratio == I32F32 :: from_num ( 1 ) {
1035
+ return mat2. to_owned ( ) ;
1036
+ }
1037
+ assert ! ( mat1. len( ) == mat2. len( ) ) ;
1038
+ if mat1. is_empty ( ) {
1039
+ return vec ! [ vec![ ] ; 1 ] ;
1040
+ }
1041
+ if mat1. first ( ) . unwrap_or ( & vec ! [ ] ) . is_empty ( ) {
1042
+ return vec ! [ vec![ ] ; 1 ] ;
1043
+ }
1044
+ let mut result: Vec < Vec < I32F32 > > =
1045
+ vec ! [ vec![ I32F32 :: from_num( 0 ) ; mat1. first( ) . unwrap_or( & vec![ ] ) . len( ) ] ; mat1. len( ) ] ;
1046
+ for ( i, ( row1, row2) ) in mat1. iter ( ) . zip ( mat2. iter ( ) ) . enumerate ( ) {
1047
+ assert ! ( row1. len( ) == row2. len( ) ) ;
1048
+ for ( j, ( & v1, & v2) ) in row1. iter ( ) . zip ( row2. iter ( ) ) . enumerate ( ) {
1049
+ if let Some ( res) = result. get_mut ( i) . unwrap_or ( & mut vec ! [ ] ) . get_mut ( j) {
1050
+ * res = v1. saturating_add ( ratio. saturating_mul ( v2. saturating_sub ( v1) ) ) ;
1051
+ }
1052
+ }
1053
+ }
1054
+ result
1055
+ }
1056
+
1057
+ // Element-wise interpolation of two sparse matrices: Result = A + ratio * (B - A).
1058
+ // ratio has intended range [0, 1]
1059
+ // ratio=0: Result = A
1060
+ // ratio=1: Result = B
1061
+ #[ allow( dead_code) ]
1062
+ pub fn interpolate_sparse (
1063
+ mat1 : & [ Vec < ( u16 , I32F32 ) > ] ,
1064
+ mat2 : & [ Vec < ( u16 , I32F32 ) > ] ,
1065
+ columns : u16 ,
1066
+ ratio : I32F32 ,
1067
+ ) -> Vec < Vec < ( u16 , I32F32 ) > > {
1068
+ if ratio == I32F32 :: from_num ( 0 ) {
1069
+ return mat1. to_owned ( ) ;
1070
+ }
1071
+ if ratio == I32F32 :: from_num ( 1 ) {
1072
+ return mat2. to_owned ( ) ;
1073
+ }
1074
+ assert ! ( mat1. len( ) == mat2. len( ) ) ;
1075
+ let rows = mat1. len ( ) ;
1076
+ let zero: I32F32 = I32F32 :: from_num ( 0 ) ;
1077
+ let mut result: Vec < Vec < ( u16 , I32F32 ) > > = vec ! [ vec![ ] ; rows] ;
1078
+ for i in 0 ..rows {
1079
+ let mut row1: Vec < I32F32 > = vec ! [ zero; columns as usize ] ;
1080
+ if let Some ( row) = mat1. get ( i) {
1081
+ for ( j, value) in row {
1082
+ if let Some ( entry) = row1. get_mut ( * j as usize ) {
1083
+ * entry = * value;
1084
+ }
1085
+ }
1086
+ }
1087
+ let mut row2: Vec < I32F32 > = vec ! [ zero; columns as usize ] ;
1088
+ if let Some ( row) = mat2. get ( i) {
1089
+ for ( j, value) in row {
1090
+ if let Some ( entry) = row2. get_mut ( * j as usize ) {
1091
+ * entry = * value;
1092
+ }
1093
+ }
1094
+ }
1095
+ for j in 0 ..columns as usize {
1096
+ let v1 = row1. get ( j) . unwrap_or ( & zero) ;
1097
+ let v2 = row2. get ( j) . unwrap_or ( & zero) ;
1098
+ let interp = v1. saturating_add ( ratio. saturating_mul ( v2. saturating_sub ( * v1) ) ) ;
1099
+ if zero < interp {
1100
+ if let Some ( res) = result. get_mut ( i) {
1101
+ res. push ( ( j as u16 , interp) ) ;
1102
+ }
1103
+ }
1104
+ }
1105
+ }
1106
+ result
1107
+ }
1108
+
1025
1109
// Element-wise product of two matrices.
1026
1110
#[ allow( dead_code) ]
1027
1111
pub fn hadamard ( mat1 : & [ Vec < I32F32 > ] , mat2 : & [ Vec < I32F32 > ] ) -> Vec < Vec < I32F32 > > {
0 commit comments