12345678910111213141516171819202122232425262728293031exceptionErrorofstringtypet=intletoffset=64letto_probabilityt=letz=10.**(Float.of_intt/.-10.)inz/.(1.+.z)letto_asciit=letx=t+offsetinif33<=x&&x<=126thenChar.of_int_exnxelseError(sprintf"%d cannot be encoded as a visible ASCII character"t)|>raiseletof_asciix=letc=Char.to_intxinif33<=c&&c<=126thenc-offsetelseError(sprintf"%c is not a valid score"x)|>raiseletof_probability?(f=Float.iround_nearest_exn)x=ifFloat.(0.0<=x&&x<=1.0)thenf(-10.*.Float.log10(x/.(1.-.x)))elseError(sprintf"invalid probability %0.17g"x)|>raise