123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120# 1 "src/owl/core/owl_slicing.ml"(*
* OWL - OCaml Scientific and Engineering Computing
* Copyright (c) 2016-2020 Liang Wang <liang.wang@cl.cam.ac.uk>
*)openBigarrayopenOwl_types(* include the base implementation of slicing function *)includeOwl_base_slicing(* fancy slicing function *)letget_fancy_array_typaxisx=let_kind=Genarray.kindxin(* check axis is within boundary then re-format *)letsx=Genarray.dimsxinletaxis=check_slice_definitionaxissxin(* calculate the new shape for slice *)letsy=calc_slice_shapeaxisinlety=Genarray.create_kindC_layoutsyin(* optimise the shape if possible *)letaxis',x',y'=optimise_input_shapeaxisxyin(* slicing vs. fancy indexing *)ifis_basic_slicingaxis=truethen(Owl_slicing_basic.get_kindaxis'x'y';y)else(Owl_slicing_fancy.get_kindaxis'x'y';y)letget_fancy_array_typ_axisxy=let_kind=Genarray.kindxin(* check axis is within boundary then re-format *)letsx=Genarray.dimsxinletaxis=check_slice_definitionaxissxin(* optimise the shape if possible *)letaxis',x',y'=optimise_input_shapeaxisxyin(* slicing vs. fancy indexing *)ifis_basic_slicingaxis=truethenOwl_slicing_basic.get_kindaxis'x'y'elseOwl_slicing_fancy.get_kindaxis'x'y'letset_fancy_array_typaxisxy=let_kind=Genarray.kindxin(* check axis is within boundary then re-format *)letsx=Genarray.dimsxinletaxis=check_slice_definitionaxissxin(* validate the slice shape is the same as y's *)letsy=calc_slice_shapeaxisinassert(Genarray.dimsy=sy);(* optimise the shape if possible *)letaxis',x',y'=optimise_input_shapeaxisxyin(* slicing vs. fancy indexing *)ifis_basic_slicingaxis=truethenOwl_slicing_basic.set_kindaxis'x'y'elseOwl_slicing_fancy.set_kindaxis'x'y'(* Basic slicing function *)letget_slice_array_typaxisx=let_kind=Genarray.kindxinletsx=Genarray.dimsxinletaxis=check_slice_definitionaxissxinletsy=calc_slice_shapeaxisinlety=Genarray.create_kindC_layoutsyinletaxis',x',y'=optimise_input_shapeaxisxyinOwl_slicing_basic.get_kindaxis'x'y';yletget_slice_array_typ_axisxy=let_kind=Genarray.kindxinletsx=Genarray.dimsxinletaxis=check_slice_definitionaxissxinletaxis',x',y'=optimise_input_shapeaxisxyinOwl_slicing_basic.get_kindaxis'x'y'letset_slice_array_typaxisxy=let_kind=Genarray.kindxinletsx=Genarray.dimsxinletaxis=check_slice_definitionaxissxinletsy=calc_slice_shapeaxisinassert(Genarray.dimsy=sy);letaxis',x',y'=optimise_input_shapeaxisxyinOwl_slicing_basic.set_kindaxis'x'y'(* same as slice_array_typ function but take list type as slice definition *)letget_fancy_list_typaxisx=get_fancy_array_typ(sdlist_to_sdarrayaxis)xletget_fancy_list_typ_axisxy=get_fancy_array_typ_(sdlist_to_sdarrayaxis)xy(* same as set_slice_array_typ function but take list type as slice definition *)letset_fancy_list_typaxisxy=set_fancy_array_typ(sdlist_to_sdarrayaxis)xy(* simplified get_slice function which accept list of list as slice definition *)letget_slice_list_typaxisx=letaxis=List.map(funi->R_(Array.of_listi))axis|>Array.of_listinget_slice_array_typaxisxletget_slice_list_typ_axisxy=letaxis=List.map(funi->R_(Array.of_listi))axis|>Array.of_listinget_slice_array_typ_axisxy(* simplified set_slice function which accept list of list as slice definition *)letset_slice_list_typaxisxy=letaxis=List.map(funi->R_(Array.of_listi))axis|>Array.of_listinset_slice_array_typaxisxy(* ends here *)