# requirez(fileExists.awk)
# requirez(size.awk)

function simulateFromFile(f) {
	if (fileExists(f)) {
		array(Names);
		array(Cdf);
		file2Cdf(f,Names,Cdf);
		simulate();
	
	} else {
		bad(f " unknown") };
}
function simulate(    com,x,want,start,here,i,wants,max,sum) {
	if (empty(Cdf)) 
		return 1;
	if (Risk) printf ""> Risk;
	start=here=N
	com=simFilter();
	while(here-- > 0 ) {
		array(Cache);
		array(want);
		if (Pause && ! ((start - N) % Pause)) 
			blab(" " start - N);
		sample1(Names[0],Cdf,Cache);
		select(Wbs,WbsRows,Names[0],Cdf,Cache,want);
		for(i in want)  {
			wants[i]++
			max = wants[i] >= max ? wants[i] : max;
		}
	}
	simReport(wants,max,com);
	close(com);
}
function emulate(f,    com,lines,i,want,any,max) {
	com=simFilter();
	while(getline < f) {
		if (++lines==1) {
			for(i=1;i<=NF;i++) {
				Names[++Names[0]]=$i;
				Names[$i]= Names[0]
			}
		} else {
			if (NF == Names[0]) {
				array(Cache);
				array(want);
				for(i=1;i<=NF;i++)
					Cache[i]=$i;
				select(Wbs,WbsRows,Names[0],Cdf,Cache,want);
				for(i in want)  {
					wants[i]++;
					max = wants[i] >= max ? wants[i] : max;
		}}}}
	simReport(wants,max,com);
	close(com);	
	close(f);
}
function simFilter() { 
	return "sort -t: -n +2 -n +0 | malign -b :" 
}
function simReport(wants,max,com,   i,x) {
	for( i in wants) { 
		x= round(100*wants[i]/max);
		printf("%s : %s : %s %% : %s\n",
				i,
				Wbs["wbs",i,"factor"],
				x > 100 ? 100 : x,
			    str(30*wants[i]/max,"*")) | com
	}
}
function doVerboseStuff() {
	if (Verbose) {
		demo4();
		printCdf(Names,Cdf,Verbose);
}}