!if $wims_read_parm!=slib_header
 !goto proc
!endif
slib_title=Effectifs of statistical series in classes
slib_parms=2\
 ,[x_1,...,x_n] \
 ,[a_1,...,a_m]
slib_author=Adeline Grelot et Bernadette PERRIN-RIOU
slib_out= [effectifs of classes] ,[classes data]
slib_comment= data : [x_1,...,x_n]  ; classes : [a_1,...,a_m] (with min and max add if necessary) ;\
 if only 2 numbers in classes data, first one is the smaller, second one the width of classes ;\
 if no classes, classes are created of width ceil(4*n^(1/4)
slib_example=[1,1,1,3,4,5,6,2],[1,4,6]\
[1,1,1,3,4,5,6,2,7 ,4,7],[2,3,6]\
[1,1,1,3,4,5,6,2],[1,4]\
[1,1,1,3,4,5,6,2]

!exit
:proc
slib_out=

!readproc slib/stat/dataproc $wims_read_parm

slib_v=!declosing $slib_data
slib_w=!declosing $slib_weight
!if $slib_v$slib_w=$empty
	slib_out=0
	!exit
!else
	slib_v=!sort numeric item  of $slib_v
	slib_max=!item -1 of $slib_v
	slib_min=!item 1 of $slib_v
	slib_cnt= !itemcnt $slib_v
	slib_cntw=!itemcnt $slib_w
	!if $slib_cntw=2
		!distribute item $slib_w into slib_b,slib_p
		slib_c=$[ceil(($slib_max-$slib_b)/$slib_p)]
		slib_d=$[min(0,floor(($slib_min-($slib_b))/$slib_p))]
		slib_w=!values $slib_b+x*$slib_p for x=$slib_d to $slib_c
	!endif
	slib_w=!sort numeric item  of $slib_w
	!if $slib_w=$empty
		slib_N=$[ceil(4*($slib_cnt)^(1/4))]
		slib_w=!values $slib_min+x*$[(($slib_max-($slib_min))/$slib_N)] for x=0 to $slib_N
	!else
		slib_m=!item -1 of $slib_w
		slib_max=$[max($slib_max,$slib_m)]
		slib_m=!item 1 of $slib_w
		slib_min=$[min($slib_min,$slib_m)]
		slib_w=$slib_min,$slib_w,$slib_max
		slib_w= !listuniq $slib_w
	!endif
	slib_cpt=0
	slib_cntw=!itemcnt $slib_w
	slib_wpointer=2
# end est le point de separation
	slib_end=!item $slib_wpointer of $slib_w
	slib_result=
	!for slib_i=1 to $slib_cnt
 		slib_dat=!item $slib_i of $slib_v
		!if $slib_dat<$slib_end or ($slib_dat=$slib_max and $slib_wpointer=$slib_cntw)
  # On est toujours dans le meme intervalle
 			!advance slib_cpt
 		!else
  # Le point de separation franchi
  # creer un nouveau point de separation
:point
 			!advance slib_wpointer
 			 slib_end=!item $slib_wpointer of $slib_w
 			!if $slib_wpointer < $slib_cntw
 				slib_end1=!item $[$slib_wpointer+1] of $slib_w
			!else 
				slib_end1=$[$slib_end+2]
			!endif
		slib_result=!append item $[$slib_cpt] to $slib_result
			!if $slib_dat>=$slib_end
				slib_cpt=0
				!goto point
			!else
				slib_cpt=1
			!endif
		!endif
	!next slib_i
#Le dernier intervalle
	slib_result=!append item $[$slib_cpt] to $slib_result
	!if $[$slib_wpointer+1] <=$slib_cntw
		slib_zero=!values 0 for x=$[$slib_wpointer+1] to $slib_cntw
		slib_result=$slib_result,$slib_zero
	!endif
!endif
slib_out=!trim $slib_result
slib_out=!line -1 of $slib_out
slib_out=[$slib_out],[$slib_w]
