module ArrayTest import StdEnv import StdDebug cons a b = [a:b] foldl1 op [x:xs] :== foldl op x xs width = 1024 height = 1024 test_array_2D :: *{*{#Real}} test_array_2D = { { toReal (i + j) \\ i <- [0..width-1] } \\ j <- [0..height-1] } ufor_ary :: (u:(a v:b) -> .(Int -> (.c,u:(a v:b)))) (.c -> .(.d -> .d)) .d u:(a v:b) -> (.d,u:(a v:b)) | Array a b, [u <= v] ufor_ary sel comb final ary = sub_list 0 ary2 where (sz,ary2) = usize ary sub_list idx ary | idx == sz = (final,ary) # (e,ary) = sel ary idx # (l,ary) = sub_list (idx + 1) ary = (comb e l,ary) loop_ary :: (u:(a v:b) -> .(Int -> (.c,u:(a v:b)))) u:(a v:b) -> u:(a v:b) | Array a b, [u <= v] loop_ary sel ary = snd (ufor_ary sel undef undef ary) uToList :: u:(a b) -> (.[b],u:(a b)) | Array a b uToList ary = ufor_ary uselect cons [] ary uToList_2D :: *(a u:(b c)) -> (.[c],*(a u:(b c))) | Array a (b c) & Array b c uToList_2D ary = ufor_ary sel_op (++) [] ary where sel_op ary idx # (row,ary) = replace ary idx undef # (lst,row) = uToList row # ary = update ary idx row = (lst,ary) map_in_place_arr :: (a -> a) *(b a) -> *(b a) | Array b a map_in_place_arr fn ary = loop_ary sel_op ary where sel_op ary idx # (e,ary) = ary![idx] # ary = update ary idx (fn e) = (undef,ary) map_in_place_2d_arr :: (a -> a) *(b *(c a)) -> *(b *(c a)) | Array b (c a) & Array c a map_in_place_2d_arr fn ary = loop_ary sel_op ary where sel_op ary idx # (row,ary) = replace ary idx undef # row = map_in_place_arr fn row # ary = update ary idx row = (undef,ary) normalize_2D_ary :: *(a *(b c)) -> *(a *(b c)) | Array a (b c) & Array b c & / c & Ord c /* normalize_2D_ary ary # (lst,ary) = uToList_2D ary # max_elem = foldl1 max lst = (map_in_place_2d_arr (\ x -> x / max_elem) ary) */ normalize_2D_ary ary = let (lst,ary2) = uToList_2D ary max_elem = foldl1 max lst in map_in_place_2d_arr (\ x -> x / max_elem) ary2 Start = normalize_2D_ary test_array_2D