This is an automated email from the ASF dual-hosted git repository.

leerho pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-datasketches-characterization.git


The following commit(s) were added to refs/heads/master by this push:
     new be3b64e  Update char tests for Req, and minor changes to Kll tests.
be3b64e is described below

commit be3b64efd11baa631a67fa7a327eab46b168a5f9
Author: Lee Rhodes <[email protected]>
AuthorDate: Fri Oct 16 14:18:55 2020 -0700

    Update char tests for Req, and minor changes to Kll tests.
---
 ...tchSizeSpeedProfile20200929_115151GMT-07:00.tsv |   0
 ...etchAccuracyProfile20201015_180629GMT-07:00.tsv |   0
 ...etchAccuracyProfile20201015_180802GMT-07:00.tsv | 101 +++++++++
 .../uniquecount/BaseUpdateSpeedProfile.java        |   2 +
 ...hAccuracyJob.conf => KllSketchAccuracyJob.conf} |  21 +-
 .../resources/quantiles/KllSketchSizeSpeedJob.conf |  38 ++++
 ...AccuracyJob.conf => ReqSketchAccuracy2Job.conf} |  31 ++-
 ...hAccuracyJob.conf => ReqSketchAccuracyJob.conf} |  14 +-
 ...AccuracyJob.conf => ReqSketchSizeSpeedJob.conf} |  37 ++--
 .../apache/datasketches/MonotonicPointsTest.java   |  14 ++
 .../characterization/quantiles/FlipFlopStream.java | 102 +++++++++
 ...yProfile.java => KllSketchAccuracyProfile.java} |  79 ++-----
 .../quantiles/KllSketchSizeSpeedProfile.java       | 170 ++++++++++++++
 .../quantiles/ReqSketchAccuracyProfile.java        |  81 ++++---
 .../quantiles/ReqSketchAccuracyProfile2.java       | 245 +++++++++++++++++++++
 .../quantiles/ReqSketchSizeSpeedProfile.java       | 178 +++++++++++++++
 .../characterization/quantiles/StreamMaker.java    | 146 ++++++++++++
 .../characterization/quantiles/TrueRanks.java      | 172 +++++++++++++++
 18 files changed, 1282 insertions(+), 149 deletions(-)

diff --git a/KllSketchSizeSpeedProfile20200929_115151GMT-07:00.tsv 
b/KllSketchSizeSpeedProfile20200929_115151GMT-07:00.tsv
new file mode 100644
index 0000000..e69de29
diff --git a/ReqSketchAccuracyProfile20201015_180629GMT-07:00.tsv 
b/ReqSketchAccuracyProfile20201015_180629GMT-07:00.tsv
new file mode 100644
index 0000000..e69de29
diff --git a/ReqSketchAccuracyProfile20201015_180802GMT-07:00.tsv 
b/ReqSketchAccuracyProfile20201015_180802GMT-07:00.tsv
new file mode 100644
index 0000000..75a3848
--- /dev/null
+++ b/ReqSketchAccuracyProfile20201015_180802GMT-07:00.tsv
@@ -0,0 +1,101 @@
+nPP    Value   Rank    -3SD    -2SD    -1SD      Med   +1SD    +2SD    +3SD    
1LB     1UB       U
+  0.0100000000              1    0.0000009537    0.0000000000    0.0000000000  
  0.0000000000    0.0000000000    0.0000000000    0.0000000000    0.0000000000  
  0.0000000000    0.0000000000       1
+  0.0200000000          10593    0.0101022720   -0.0000753403   -0.0000495911  
 -0.0000257492    0.0000000000    0.0000238419    0.0000495911    0.0000753403  
 -0.0000263951    0.0000263951     157
+  0.0300000000          21184    0.0202026367   -0.0001678467   -0.0001134872  
 -0.0000572205    0.0000019073    0.0000600815    0.0001125336    0.0001668930  
 -0.0000527852    0.0000527852     323
+  0.0400000000          31776    0.0303039551   -0.0002250671   -0.0001621246  
 -0.0000753403    0.0000019073    0.0000839233    0.0001668930    0.0002470016  
 -0.0000791778    0.0000791778     447
+  0.0500000000          42368    0.0404052734   -0.0003385544   -0.0002155304  
 -0.0001058578    0.0000000000    0.0001125336    0.0002260208    0.0003299713  
 -0.0001055705    0.0001055705     575
+  0.0600000000          52959    0.0505056381   -0.0004119873   -0.0002603531  
 -0.0001306534    0.0000009537    0.0001363754    0.0002803802    0.0003957748  
 -0.0001319606    0.0001319606     683
+  0.0700000000          63551    0.0606069565   -0.0004701614   -0.0003118515  
 -0.0001544952    0.0000019073    0.0001668930    0.0003194809    0.0005187988  
 -0.0001583532    0.0001583532     774
+  0.0800000000          74143    0.0707082748   -0.0005569458   -0.0003747940  
 -0.0001840591    0.0000038147    0.0001811981    0.0003738403    0.0005359650  
 -0.0001847458    0.0001847458     876
+  0.0900000000          84734    0.0808086395   -0.0006151199   -0.0004310608  
 -0.0002107620    0.0000076294    0.0002164841    0.0004262924    0.0006141663  
 -0.0002111359    0.0002111359     980
+  0.1000000000          95326    0.0909099579   -0.0007505417   -0.0004987717  
 -0.0002622604    0.0000047684    0.0002651215    0.0005130768    0.0007600784  
 -0.0002375285    0.0002375285    1117
+  0.1100000000         105918    0.1010112762   -0.0008420944   -0.0005598068  
 -0.0002956390    0.0000009537    0.0002851486    0.0005741119    0.0009031296  
 -0.0002639212    0.0002639212    1214
+  0.1200000000         116509    0.1111116409   -0.0008878708   -0.0006446838  
 -0.0003213882    0.0000000000    0.0003366470    0.0006694794    0.0009956360  
 -0.0002903113    0.0002903113    1336
+  0.1300000000         127101    0.1212129593   -0.0010671616   -0.0006504059  
 -0.0003318787    0.0000076294    0.0003433228    0.0006723404    0.0010585785  
 -0.0003167039    0.0003167039    1376
+  0.1400000000         137693    0.1313142776   -0.0010280609   -0.0007343292  
 -0.0003595352    0.0000019073    0.0003814697    0.0007343292    0.0010890961  
 -0.0003430965    0.0003430965    1470
+  0.1500000000         148284    0.1414146423   -0.0010976791   -0.0007400513  
 -0.0003643036    0.0000066757    0.0003986359    0.0007743835    0.0011396408  
 -0.0003694866    0.0003694866    1471
+  0.1600000000         158876    0.1515159607   -0.0012865067   -0.0008125305  
 -0.0003986359    0.0000133514    0.0004320145    0.0008401871    0.0011882782  
 -0.0003958792    0.0003958792    1611
+  0.1700000000         169468    0.1616172791   -0.0013608932   -0.0008525848  
 -0.0004062653    0.0000019073    0.0004482269    0.0008659363    0.0012674332  
 -0.0004222719    0.0004222719    1606
+  0.1800000000         180059    0.1717176437   -0.0013246536   -0.0008792877  
 -0.0004539490    0.0000095367    0.0004644394    0.0008916855    0.0014505386  
 -0.0004486620    0.0004486620    1663
+  0.1900000000         190651    0.1818189621   -0.0013713837   -0.0009517670  
 -0.0004520416    0.0000066757    0.0004940033    0.0009441376    0.0014085770  
 -0.0004750546    0.0004750546    1717
+  0.2000000000         201243    0.1919202805   -0.0013380051   -0.0009107590  
 -0.0004529953    0.0000057220    0.0004968643    0.0009841919    0.0014181137  
 -0.0005014472    0.0005014472    1677
+  0.2100000000         211834    0.2020206451   -0.0013475418   -0.0009613037  
 -0.0004720688   -0.0000019073    0.0004892349    0.0009593964    0.0014410019  
 -0.0005278373    0.0005278373    1689
+  0.2200000000         222426    0.2121219635   -0.0013647079   -0.0009317398  
 -0.0004911423    0.0000009537    0.0004768372    0.0009860992    0.0014543533  
 -0.0005542299    0.0005542299    1679
+  0.2300000000         233018    0.2222232819   -0.0014381409   -0.0010509491  
 -0.0005607605   -0.0000009537    0.0005512238    0.0011014938    0.0015983582  
 -0.0005806226    0.0005806226    1820
+  0.2400000000         243609    0.2323236465   -0.0015563965   -0.0010881424  
 -0.0005626678    0.0000085831    0.0005712509    0.0011091232    0.0016765594  
 -0.0006070127    0.0006070127    1886
+  0.2500000000         254201    0.2424249649   -0.0016355515   -0.0011262894  
 -0.0005970001   -0.0000123978    0.0005836487    0.0011863708    0.0017824173  
 -0.0006334053    0.0006334053    1904
+  0.2600000000         264793    0.2525262833   -0.0016899109   -0.0011730194  
 -0.0006093979   -0.0000114441    0.0005817413    0.0011634827    0.0018281937  
 -0.0006597979    0.0006597979    1927
+  0.2700000000         275384    0.2626266479   -0.0017824173   -0.0011892319  
 -0.0005865097   -0.0000028610    0.0006179810    0.0012149811    0.0019531250  
 -0.0006861880    0.0006861880    1950
+  0.2800000000         285976    0.2727279663   -0.0017061234   -0.0011634827  
 -0.0006036758    0.0000104904    0.0006198883    0.0012369156    0.0018644333  
 -0.0007125806    0.0007125806    1934
+  0.2900000000         296568    0.2828292847   -0.0017910004   -0.0012397766  
 -0.0006418228   -0.0000076294    0.0006093979    0.0011978149    0.0018558502  
 -0.0007389733    0.0007389733    1975
+  0.3000000000         307159    0.2929296494   -0.0018682480   -0.0012092590  
 -0.0005989075   -0.0000019073    0.0006408691    0.0012416840    0.0017833710  
 -0.0007653634    0.0007653634    1951
+  0.3100000000         317751    0.3030309677   -0.0018186569   -0.0011978149  
 -0.0006303787   -0.0000104904    0.0006275177    0.0013170242    0.0019407272  
 -0.0007917560    0.0007917560    2003
+  0.3200000000         328343    0.3131322861   -0.0019865036   -0.0012874603  
 -0.0006484985   -0.0000019073    0.0006542206    0.0012903214    0.0019330978  
 -0.0008181486    0.0008181486    2017
+  0.3300000000         338934    0.3232326508   -0.0019016266   -0.0013437271  
 -0.0006828308    0.0000076294    0.0006647110    0.0013132095    0.0020294189  
 -0.0008445387    0.0008445387    2059
+  0.3400000000         349526    0.3333339691   -0.0019350052   -0.0013370514  
 -0.0006885529   -0.0000104904    0.0006818771    0.0013570786    0.0020389557  
 -0.0008709313    0.0008709313    2093
+  0.3500000000         360118    0.3434352875   -0.0020971298   -0.0013771057  
 -0.0006637573   -0.0000114441    0.0007047653    0.0013923645    0.0020122528  
 -0.0008973240    0.0008973240    2120
+  0.3600000000         370709    0.3535356522   -0.0022888184   -0.0015745163  
 -0.0007686615    0.0000543594    0.0007762909    0.0015277863    0.0023908615  
 -0.0009237141    0.0009237141    2182
+  0.3700000000         381301    0.3636369705   -0.0023107529   -0.0014991760  
 -0.0007905960    0.0000228882    0.0008106232    0.0016012192    0.0023536682  
 -0.0009501067    0.0009501067    2259
+  0.3800000000         391893    0.3737382889   -0.0023403168   -0.0015926361  
 -0.0007724762    0.0000200272    0.0008230209    0.0016098022    0.0021905899  
 -0.0009764993    0.0009764993    2283
+  0.3900000000         402484    0.3838386536   -0.0023441315   -0.0015563965  
 -0.0008106232    0.0000467300    0.0008039474    0.0016412735    0.0025234222  
 -0.0010028894    0.0010028894    2301
+  0.4000000000         413076    0.3939399719   -0.0021772385   -0.0015220642  
 -0.0007934570    0.0000238419    0.0007991791    0.0016241074    0.0022792816  
 -0.0010292820    0.0010292820    2240
+  0.4100000000         423668    0.4040412903   -0.0022611618   -0.0015325546  
 -0.0008344650    0.0000257492    0.0007972717    0.0015115738    0.0022306442  
 -0.0010556747    0.0010556747    2213
+  0.4200000000         434259    0.4141416550   -0.0023488998   -0.0015430450  
 -0.0008230209    0.0000104904    0.0008220673    0.0015287399    0.0022363663  
 -0.0010820648    0.0010820648    2307
+  0.4300000000         444851    0.4242429733   -0.0021839142   -0.0015287399  
 -0.0007963181    0.0000123978    0.0008497238    0.0016670227    0.0023078918  
 -0.0011084574    0.0011084574    2325
+  0.4400000000         455443    0.4343442917   -0.0025243759   -0.0015592575  
 -0.0007829666    0.0000085831    0.0008487701    0.0015964508    0.0024461746  
 -0.0011348500    0.0011348500    2343
+  0.4500000000         466034    0.4444446564   -0.0021667480   -0.0015630722  
 -0.0007867813    0.0000057220    0.0008602142    0.0016269684    0.0023508072  
 -0.0011612401    0.0011612401    2292
+  0.4600000000         476626    0.4545459747   -0.0024347305   -0.0015563965  
 -0.0007705688   -0.0000123978    0.0008354187    0.0016031265    0.0022211075  
 -0.0011876327    0.0011876327    2293
+  0.4700000000         487218    0.4646472931   -0.0025815964   -0.0015792847  
 -0.0008020401   -0.0000276566    0.0007877350    0.0015344620    0.0022583008  
 -0.0012000000    0.0012000000    2310
+  0.4800000000         497809    0.4747476578   -0.0024290085   -0.0016431808  
 -0.0008316040   -0.0000600815    0.0008211136    0.0017290115    0.0024728775  
 -0.0012000000    0.0012000000    2352
+  0.4900000000         508401    0.4848489761   -0.0026121140   -0.0017194748  
 -0.0008897781    0.0000181198    0.0009317398    0.0017547607    0.0026702881  
 -0.0012000000    0.0012000000    2413
+  0.5000000000         518993    0.4949502945   -0.0024757385   -0.0017881393  
 -0.0008773804   -0.0000190735    0.0009050369    0.0018634796    0.0026206970  
 -0.0012000000    0.0012000000    2436
+  0.5100000000         529584    0.5050506592   -0.0026559830   -0.0017099380  
 -0.0008516312   -0.0000019073    0.0009241104    0.0018625259    0.0026092529  
 -0.0012000000    0.0012000000    2463
+  0.5200000000         540176    0.5151519775   -0.0024824142   -0.0017385483  
 -0.0008926392    0.0000209808    0.0008869171    0.0017423630    0.0026817322  
 -0.0012000000    0.0012000000    2427
+  0.5300000000         550768    0.5252532959   -0.0026636124   -0.0017910004  
 -0.0008869171   -0.0000038147    0.0009479523    0.0018558502    0.0027999878  
 -0.0012000000    0.0012000000    2483
+  0.5400000000         561359    0.5353536606   -0.0029363632   -0.0018301010  
 -0.0009260178    0.0000095367    0.0008926392    0.0018148422    0.0027704239  
 -0.0012000000    0.0012000000    2423
+  0.5500000000         571951    0.5454549789   -0.0025777817   -0.0017671585  
 -0.0008964539    0.0000114441    0.0008716583    0.0017576218    0.0027484894  
 -0.0012000000    0.0012000000    2373
+  0.5600000000         582543    0.5555562973   -0.0026884079   -0.0017175674  
 -0.0008459091    0.0000333786    0.0008783340    0.0017719269    0.0027713776  
 -0.0012000000    0.0012000000    2376
+  0.5700000000         593134    0.5656566620   -0.0026464462   -0.0017910004  
 -0.0008964539    0.0000343323    0.0009250641    0.0017967224    0.0026435852  
 -0.0012000000    0.0012000000    2413
+  0.5800000000         603726    0.5757579803   -0.0025796890   -0.0017805099  
 -0.0008792877    0.0000247955    0.0008859634    0.0017967224    0.0027923584  
 -0.0012000000    0.0012000000    2252
+  0.5900000000         614318    0.5858592987   -0.0025110245   -0.0018844604  
 -0.0009279251    0.0000381470    0.0009088516    0.0017337799    0.0025186539  
 -0.0012000000    0.0012000000    2157
+  0.6000000000         624909    0.5959596634   -0.0027236938   -0.0018301010  
 -0.0008745193   -0.0000085831    0.0008592606    0.0017156601    0.0025835037  
 -0.0012000000    0.0012000000    2001
+  0.6100000000         635501    0.6060609818   -0.0027532578   -0.0017757416  
 -0.0009222031    0.0000352859    0.0009088516    0.0018339157    0.0026197433  
 -0.0012000000    0.0012000000    1992
+  0.6200000000         646093    0.6161623001   -0.0026407242   -0.0017843246  
 -0.0009012222   -0.0000047684    0.0009298325    0.0017919540    0.0025215149  
 -0.0012000000    0.0012000000    2025
+  0.6300000000         656684    0.6262626648   -0.0026865005   -0.0017108917  
 -0.0008935928   -0.0000066757    0.0008850098    0.0018348694    0.0025501251  
 -0.0012000000    0.0012000000    1973
+  0.6400000000         667276    0.6363639832   -0.0026960373   -0.0016841888  
 -0.0009222031   -0.0000524521    0.0009050369    0.0017414093    0.0027265549  
 -0.0012000000    0.0012000000    1965
+  0.6500000000         677868    0.6464653015   -0.0026159286   -0.0017070770  
 -0.0008764267   -0.0000057220    0.0009422302    0.0018005371    0.0026721954  
 -0.0012000000    0.0012000000    1918
+  0.6600000000         688459    0.6565656662   -0.0026712418   -0.0018005371  
 -0.0008583069    0.0000095367    0.0008907318    0.0018177032    0.0025796890  
 -0.0012000000    0.0012000000    1936
+  0.6700000000         699051    0.6666669846   -0.0030174255   -0.0024833679  
 -0.0008068085   -0.0001726151    0.0014085770    0.0021553040    0.0036058426  
 -0.0012000000    0.0012000000    2021
+  0.6800000000         709643    0.6767683029   -0.0029497147   -0.0024290085  
 -0.0007648468   -0.0001697540    0.0014257431    0.0021085739    0.0028028488  
 -0.0012000000    0.0012000000    1945
+  0.6900000000         720234    0.6868686676   -0.0030326843   -0.0024118423  
 -0.0008249283   -0.0002031326    0.0013999939    0.0021038055    0.0027675629  
 -0.0012000000    0.0012000000    1995
+  0.7000000000         730826    0.6969699860   -0.0031080246   -0.0024814606  
 -0.0008878708   -0.0001773834    0.0014419556    0.0020389557    0.0037240982  
 -0.0012000000    0.0012000000    1985
+  0.7100000000         741418    0.7070713043   -0.0030717850   -0.0024528503  
 -0.0008554459   -0.0002460480    0.0013761520    0.0020523071    0.0033168793  
 -0.0012000000    0.0012000000    1906
+  0.7200000000         752009    0.7171716690   -0.0031852722   -0.0025110245  
 -0.0009069443   -0.0003013611    0.0013952255    0.0020122528    0.0035734177  
 -0.0012000000    0.0012000000    1914
+  0.7300000000         762601    0.7272729874   -0.0031871796   -0.0024805069  
 -0.0009021759   -0.0002822876    0.0013217926    0.0019445419    0.0034885406  
 -0.0012000000    0.0012000000    1915
+  0.7400000000         773193    0.7373743057   -0.0031614304   -0.0024385452  
 -0.0009651184   -0.0003261566    0.0013561249    0.0019702911    0.0034246445  
 -0.0012000000    0.0012000000    1970
+  0.7500000000         783784    0.7474746704   -0.0033473969   -0.0025119781  
 -0.0010175705   -0.0002975464    0.0013084412    0.0019044876    0.0034818649  
 -0.0012000000    0.0012000000    1892
+  0.7600000000         794376    0.7575759888   -0.0034284592   -0.0024509430  
 -0.0009918213   -0.0002689362    0.0013103485    0.0018386841    0.0035314560  
 -0.0012000000    0.0012000000    1864
+  0.7700000000         804968    0.7676773071   -0.0033655167   -0.0022640228  
 -0.0010519028   -0.0003299713    0.0012588501    0.0018539429    0.0034389496  
 -0.0012000000    0.0012000000    1822
+  0.7800000000         815559    0.7777776718   -0.0033588409   -0.0022478104  
 -0.0011110306   -0.0002746582    0.0012083054    0.0018129349    0.0032701492  
 -0.0012000000    0.0012000000    1856
+  0.7900000000         826151    0.7878789902   -0.0032835007   -0.0019512177  
 -0.0010986328   -0.0002412796    0.0012245178    0.0018367767    0.0034141541  
 -0.0012000000    0.0012000000    1859
+  0.8000000000         836743    0.7979803085   -0.0033378601   -0.0018882751  
 -0.0011501312   -0.0002212524    0.0011558533    0.0018377304    0.0034475327  
 -0.0012000000    0.0012000000    1788
+  0.8100000000         847334    0.8080806732   -0.0034370422   -0.0018472672  
 -0.0011329651    0.0000000000    0.0010976791    0.0017948151    0.0036478043  
 -0.0012000000    0.0012000000    1708
+  0.8200000000         857926    0.8181819916   -0.0036230087   -0.0019035339  
 -0.0012073517    0.0002698898    0.0011234283    0.0020818710    0.0034389496  
 -0.0012000000    0.0012000000    1793
+  0.8300000000         868518    0.8282833099   -0.0032329559   -0.0017871857  
 -0.0012617111    0.0003108978    0.0010719299    0.0021553040    0.0033712387  
 -0.0012000000    0.0012000000    1774
+  0.8400000000         879109    0.8383836746   -0.0034103394   -0.0018396378  
 -0.0012292862    0.0003614426    0.0010814667    0.0021877289    0.0033025742  
 -0.0012000000    0.0012000000    1764
+  0.8500000000         889701    0.8484849930   -0.0034685135   -0.0018959045  
 -0.0012884140    0.0003814697    0.0010204315    0.0023784637    0.0032253265  
 -0.0012000000    0.0012000000    1663
+  0.8600000000         900293    0.8585863113   -0.0033397675   -0.0018653870  
 -0.0012779236    0.0003318787    0.0009584427    0.0023794174    0.0032587051  
 -0.0012000000    0.0012000000    1691
+  0.8700000000         910884    0.8686866760   -0.0032901764   -0.0019330978  
 -0.0013332367    0.0002851486    0.0009880066    0.0024414063    0.0034379959  
 -0.0012000000    0.0012000000    1698
+  0.8800000000         921476    0.8787879944   -0.0034999847   -0.0019016266  
 -0.0012969971    0.0003061295    0.0009222031    0.0024023056    0.0031290054  
 -0.0012000000    0.0012000000    1633
+  0.8900000000         932068    0.8888893127   -0.0032014847   -0.0019741058  
 -0.0013494492    0.0003404617    0.0008687973    0.0024385452    0.0032720566  
 -0.0012000000    0.0012000000    1582
+  0.9000000000         942659    0.8989896774   -0.0037488937   -0.0020399094  
 -0.0014276505    0.0002708435    0.0008754730    0.0025758743    0.0032062531  
 -0.0012000000    0.0012000000    1614
+  0.9100000000         953251    0.9090909958   -0.0033588409   -0.0020027161  
 -0.0014028549    0.0002107620    0.0008363724    0.0024156570    0.0031442642  
 -0.0012000000    0.0012000000    1600
+  0.9200000000         963843    0.9191923141   -0.0030479431   -0.0020656586  
 -0.0014820099    0.0002336502    0.0008420944    0.0024671555    0.0030546188  
 -0.0012000000    0.0012000000    1495
+  0.9300000000         974434    0.9292926788   -0.0036220551   -0.0021476746  
 -0.0014238358    0.0001707077    0.0007848740    0.0024690628    0.0030746460  
 -0.0012000000    0.0012000000    1548
+  0.9400000000         985026    0.9393939972   -0.0033369064   -0.0022249222  
 -0.0013942719    0.0002059937    0.0008106232    0.0025148392    0.0029973984  
 -0.0012000000    0.0012000000    1498
+  0.9500000000         995618    0.9494953156   -0.0026865005   -0.0020885468  
 -0.0014610291    0.0001382828    0.0007486343    0.0024480820    0.0030632019  
 -0.0012000000    0.0012000000    1396
+  0.9600000000        1006209    0.9595956802   -0.0025234222   -0.0021381378  
 -0.0014200211    0.0000762939    0.0007638931    0.0022850037    0.0028791428  
 -0.0012000000    0.0012000000    1321
+  0.9700000000        1016801    0.9696969986   -0.0030612946   -0.0023288727  
 -0.0013608932    0.0001029968    0.0007171631    0.0024213791    0.0029067993  
 -0.0012000000    0.0012000000    1277
+  0.9800000000        1027393    0.9797983170   -0.0026569366   -0.0022916794  
 -0.0013227463    0.0000371933    0.0007495880    0.0023622513    0.0028581619  
 -0.0012000000    0.0012000000    1080
+  0.9900000000        1037984    0.9898986816   -0.0028610229   -0.0022287369  
 -0.0009107590    0.0000686646    0.0008163452    0.0022869110    0.0027770996  
 -0.0012000000    0.0012000000     762
+  1.0000000000        1048576    1.0000000000    0.0000000000    0.0000000000  
  0.0000000000    0.0000000000    0.0000000000    0.0000000000    0.0000000000  
 -0.0012000000    0.0012000000       1
diff --git 
a/src/main/java/org/apache/datasketches/characterization/uniquecount/BaseUpdateSpeedProfile.java
 
b/src/main/java/org/apache/datasketches/characterization/uniquecount/BaseUpdateSpeedProfile.java
index 703b255..fd123ac 100644
--- 
a/src/main/java/org/apache/datasketches/characterization/uniquecount/BaseUpdateSpeedProfile.java
+++ 
b/src/main/java/org/apache/datasketches/characterization/uniquecount/BaseUpdateSpeedProfile.java
@@ -102,7 +102,9 @@ public abstract class BaseUpdateSpeedProfile implements 
JobProfile {
         sumUpdateTimePerU_nS += doTrial(nextU);
       }
       final double meanUpdateTimePerU_nS = sumUpdateTimePerU_nS / trials;
+
       process(meanUpdateTimePerU_nS, trials, nextU, dataStr);
+
       job.println(dataStr.toString());
     }
   }
diff --git a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf 
b/src/main/resources/quantiles/KllSketchAccuracyJob.conf
similarity index 59%
copy from src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
copy to src/main/resources/quantiles/KllSketchAccuracyJob.conf
index cb76163..347725f 100644
--- a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
+++ b/src/main/resources/quantiles/KllSketchAccuracyJob.conf
@@ -15,35 +15,24 @@
 # specific language governing permissions and limitations
 # under the License.
 
-JobProfile=org.apache.datasketches.characterization.quantiles.ReqSketchAccuracyProfile
+JobProfile=org.apache.datasketches.characterization.quantiles.KllSketchAccuracyProfile
 
 # Trials config (indep of sketch)
 ## Stream lengths
-LgMin=17    # The starting stream length
-LgMax=17    # How high the stream length goes
+LgMin=11    # The starting stream length
+LgMax=11    # How high the stream length goes
 LgDelta=3   # If > 0, this is the lg Increment
 PPO=8       # The horizontal x-resolution of trials points
 
-LgTrials=12 # lgTrials at every stream length
+LgTrials=14 # lgTrials at every stream length
 ErrSkLgK=12   # parameter for the rank error distribution sketch
 
 # Plotting
 NumPlotPoints=100 # number of plot points along the x-axis
-EvenlySpaced=true # if true the x-axis points will be evenly spaced ranks in 
[0,1], otherwise exponential in [0,1]
-Exponent=2.0 # the steepness of the exponential x-axis density gradient curve, 
must be >= 1.0
-StdDev=1 # std deviation used when plotting LB, UB
-RankRange=1.0 #.0002 # range of rank to plot. If LRA => 0 to 0.3; if HRA => 
0.7 to 1.0 
 
 # Specific sketch config
-K=50 # sketch size and accuracy parameter
+K=100 # sketch size and accuracy parameter
 
-#For LRA, LE,GT have the converged point at rank 1.0
-#For HRA, LT,GE have the converged point at rank 0.0
-Criterion=LE # LT, LE, GT, GE, must be all caps
-HRA=false # if true use high-rank accuracy, otherwise low-rank accuracy
-
-#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out
-#ReqDebugFmt=%5.0f
 
 # Date-Time Profile
 TimeZone=PDT
diff --git a/src/main/resources/quantiles/KllSketchSizeSpeedJob.conf 
b/src/main/resources/quantiles/KllSketchSizeSpeedJob.conf
new file mode 100644
index 0000000..d5e759a
--- /dev/null
+++ b/src/main/resources/quantiles/KllSketchSizeSpeedJob.conf
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+JobProfile=org.apache.datasketches.characterization.quantiles.KllSketchSizeSpeedProfile
+
+# Trials config (indep of sketch)
+LgMinT=4
+LgMaxT=12
+
+## Stream lengths
+LgMinSL=1    # The starting stream length
+LgMaxSL=20    # How high the stream length goes
+PpoSL=2       # The horizontal x-resolution of trials points per octave
+LgMinBpSL=10   # The SL breakpoint where the slope starts
+LgMaxBpSL=20   # The SL breakpoint where the slope stops
+
+# Specific sketch config
+KllK=100 # KllSketch size and accuracy 
+
+# Date-Time Profile
+TimeZone=PDT
+TimeZoneOffset=-25200000 # offset in millisec: PST (UTC-8) = -28_800_000  PDT 
(UTC-7) = -25_200_000
+FileNameDateFormat=yyyyMMdd'_'HHmmssz
+ReadableDateFormat=yyyy/MM/dd HH:mm:ss 
\ No newline at end of file
diff --git a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf 
b/src/main/resources/quantiles/ReqSketchAccuracy2Job.conf
similarity index 62%
copy from src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
copy to src/main/resources/quantiles/ReqSketchAccuracy2Job.conf
index cb76163..22e0753 100644
--- a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
+++ b/src/main/resources/quantiles/ReqSketchAccuracy2Job.conf
@@ -15,34 +15,31 @@
 # specific language governing permissions and limitations
 # under the License.
 
-JobProfile=org.apache.datasketches.characterization.quantiles.ReqSketchAccuracyProfile
+JobProfile=org.apache.datasketches.characterization.quantiles.ReqSketchAccuracyProfile2
 
 # Trials config (indep of sketch)
 ## Stream lengths
-LgMin=17    # The starting stream length
-LgMax=17    # How high the stream length goes
-LgDelta=3   # If > 0, this is the lg Increment
-PPO=8       # The horizontal x-resolution of trials points
-
-LgTrials=12 # lgTrials at every stream length
-ErrSkLgK=12   # parameter for the rank error distribution sketch
-
+LgSL=20    # The stream length
 # Plotting
 NumPlotPoints=100 # number of plot points along the x-axis
-EvenlySpaced=true # if true the x-axis points will be evenly spaced ranks in 
[0,1], otherwise exponential in [0,1]
-Exponent=2.0 # the steepness of the exponential x-axis density gradient curve, 
must be >= 1.0
+
 StdDev=1 # std deviation used when plotting LB, UB
-RankRange=1.0 #.0002 # range of rank to plot. If LRA => 0 to 0.3; if HRA => 
0.7 to 1.0 
 
-# Specific sketch config
-K=50 # sketch size and accuracy parameter
+# Patterns
+Pattern=Random
+Offset=1 #0 for min value of 0; 1 for min value of 1
+
+ErrQSkLgK=12   # the rank error distribution sketch LgK
 
+# Target sketch config
+K=50 # sketch size and accuracy parameter
+HRA=true # if true use high-rank accuracy, otherwise low-rank accuracy
 #For LRA, LE,GT have the converged point at rank 1.0
 #For HRA, LT,GE have the converged point at rank 0.0
-Criterion=LE # LT, LE, GT, GE, must be all caps
-HRA=false # if true use high-rank accuracy, otherwise low-rank accuracy
+Criterion=LE # LT, LE Must be all caps.
+Compatible=false
 
-#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out
+#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out. Use only when 
LgTrials=0
 #ReqDebugFmt=%5.0f
 
 # Date-Time Profile
diff --git a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf 
b/src/main/resources/quantiles/ReqSketchAccuracyJob.conf
similarity index 81%
copy from src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
copy to src/main/resources/quantiles/ReqSketchAccuracyJob.conf
index cb76163..76e9d03 100644
--- a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
+++ b/src/main/resources/quantiles/ReqSketchAccuracyJob.conf
@@ -19,30 +19,32 @@ 
JobProfile=org.apache.datasketches.characterization.quantiles.ReqSketchAccuracyP
 
 # Trials config (indep of sketch)
 ## Stream lengths
-LgMin=17    # The starting stream length
-LgMax=17    # How high the stream length goes
+LgMin=20    # The starting stream length
+LgMax=20    # How high the stream length goes
 LgDelta=3   # If > 0, this is the lg Increment
 PPO=8       # The horizontal x-resolution of trials points
 
 LgTrials=12 # lgTrials at every stream length
-ErrSkLgK=12   # parameter for the rank error distribution sketch
+ErrQSkLgK=12   # the rank error distribution sketch LgK
+ErrHllSkLgK=12 # the rank error HLL sketch Lgk
 
 # Plotting
 NumPlotPoints=100 # number of plot points along the x-axis
 EvenlySpaced=true # if true the x-axis points will be evenly spaced ranks in 
[0,1], otherwise exponential in [0,1]
 Exponent=2.0 # the steepness of the exponential x-axis density gradient curve, 
must be >= 1.0
 StdDev=1 # std deviation used when plotting LB, UB
-RankRange=1.0 #.0002 # range of rank to plot. If LRA => 0 to 0.3; if HRA => 
0.7 to 1.0 
+RankRange=1.0 # range of rank to plot. E.g., given 0.3: if LRA => 0 to 0.3; if 
HRA => 0.7 to 1.0 
 
 # Specific sketch config
 K=50 # sketch size and accuracy parameter
 
 #For LRA, LE,GT have the converged point at rank 1.0
 #For HRA, LT,GE have the converged point at rank 0.0
-Criterion=LE # LT, LE, GT, GE, must be all caps
+Criterion=LE # LT, LE, GT, GE. Must be all caps.
+Compatible=false
 HRA=false # if true use high-rank accuracy, otherwise low-rank accuracy
 
-#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out
+#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out. Use only when 
LgTrials=0
 #ReqDebugFmt=%5.0f
 
 # Date-Time Profile
diff --git a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf 
b/src/main/resources/quantiles/ReqSketchSizeSpeedJob.conf
similarity index 58%
rename from src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
rename to src/main/resources/quantiles/ReqSketchSizeSpeedJob.conf
index cb76163..5b52f2f 100644
--- a/src/main/resources/quantiles/ReqFloatsSketchAccuracyJob.conf
+++ b/src/main/resources/quantiles/ReqSketchSizeSpeedJob.conf
@@ -15,38 +15,31 @@
 # specific language governing permissions and limitations
 # under the License.
 
-JobProfile=org.apache.datasketches.characterization.quantiles.ReqSketchAccuracyProfile
+JobProfile=org.apache.datasketches.characterization.quantiles.ReqSketchSizeSpeedProfile
 
 # Trials config (indep of sketch)
-## Stream lengths
-LgMin=17    # The starting stream length
-LgMax=17    # How high the stream length goes
-LgDelta=3   # If > 0, this is the lg Increment
-PPO=8       # The horizontal x-resolution of trials points
-
-LgTrials=12 # lgTrials at every stream length
-ErrSkLgK=12   # parameter for the rank error distribution sketch
+LgMinT=4
+LgMaxT=12
 
-# Plotting
-NumPlotPoints=100 # number of plot points along the x-axis
-EvenlySpaced=true # if true the x-axis points will be evenly spaced ranks in 
[0,1], otherwise exponential in [0,1]
-Exponent=2.0 # the steepness of the exponential x-axis density gradient curve, 
must be >= 1.0
-StdDev=1 # std deviation used when plotting LB, UB
-RankRange=1.0 #.0002 # range of rank to plot. If LRA => 0 to 0.3; if HRA => 
0.7 to 1.0 
+## Stream lengths
+LgMinSL=1    # The starting stream length
+LgMaxSL=20    # How high the stream length goes
+PpoSL=2       # The horizontal x-resolution of trials points per octave
+LgMinBpSL=10   # The SL breakpoint where the slope starts
+LgMaxBpSL=20   # The SL breakpoint where the slope stops
 
 # Specific sketch config
-K=50 # sketch size and accuracy parameter
-
-#For LRA, LE,GT have the converged point at rank 1.0
-#For HRA, LT,GE have the converged point at rank 0.0
-Criterion=LE # LT, LE, GT, GE, must be all caps
+ReqK=12 # ReqSketch size and accuracy 
 HRA=false # if true use high-rank accuracy, otherwise low-rank accuracy
+#For HRA, LT,GE have the converged point at rank 0.0
+#For LRA, LE,GT have the converged point at rank 1.0
+Criterion=LE # LT, LE, GT, GE. Must be all caps.
 
-#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out
+#ReqDebugLevel=2 # or 0, 1, 2. disable by commenting it out. Use only when 
LgTrials=0
 #ReqDebugFmt=%5.0f
 
 # Date-Time Profile
 TimeZone=PDT
 TimeZoneOffset=-25200000 # offset in millisec: PST (UTC-8) = -28_800_000  PDT 
(UTC-7) = -25_200_000
 FileNameDateFormat=yyyyMMdd'_'HHmmssz
-ReadableDateFormat=yyyy/MM/dd HH:mm:ss 
+ReadableDateFormat=yyyy/MM/dd HH:mm:ss 
\ No newline at end of file
diff --git a/src/test/java/org/apache/datasketches/MonotonicPointsTest.java 
b/src/test/java/org/apache/datasketches/MonotonicPointsTest.java
index 7ae2675..f56b6ee 100644
--- a/src/test/java/org/apache/datasketches/MonotonicPointsTest.java
+++ b/src/test/java/org/apache/datasketches/MonotonicPointsTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.datasketches;
 
+import static org.testng.Assert.assertEquals;
+
 import org.testng.annotations.Test;
 
 /**
@@ -33,6 +35,18 @@ public class MonotonicPointsTest {
     for (int i = 0; i < arr.length; i++) { println(arr[i] + ""); }
   }
 
+  @Test
+  public void checkMonotonicPoints2() {
+    double[] arr = MonotonicPoints.evenlySpaced(0, 1, 3, false);
+    assertEquals(arr[0], 0.0);
+    assertEquals(arr[1], 0.5);
+    assertEquals(arr[2], 1.0);
+    arr = MonotonicPoints.evenlySpaced(3, 7, 3, false);
+    assertEquals(arr[0], 3.0);
+    assertEquals(arr[1], 5.0);
+    assertEquals(arr[2], 7.0);
+  }
+
   @Test void checkEvenlySpacedPoints() {
     double[] arr = Util.evenlySpaced(0.0, 100.0, 21);
     for (int i = 0; i < arr.length; i++) { println(arr[i] + ""); }
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/FlipFlopStream.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/FlipFlopStream.java
new file mode 100644
index 0000000..d526a52
--- /dev/null
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/FlipFlopStream.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.datasketches.characterization.quantiles;
+
+import org.testng.annotations.Test;
+
+/**
+ * Generate multiple flip-flop sequences with the given N.
+ * @author Lee Rhodes
+ */
+public class FlipFlopStream {
+  private float[] arr;
+  private int v;
+  private int idx;
+  private int low;
+  private int high;
+  private int lo;
+  private int hi;
+
+  /**
+   * Constuctor used by TestNG
+   */
+  public FlipFlopStream() {}
+
+  /**
+   * Construct an overall sequence of size N
+   * @param N the length of the sequence and size of the returned array.
+   * @param offset The lowest value in the sequence. Usually either 0 or 1.
+   */
+  public FlipFlopStream(int N, int offset) {
+    arr = new float[N];
+    idx = 0;
+    v = offset;
+    low = 0;
+    high = N - 1;
+    lo = low;
+    hi = high;
+  }
+
+  /**
+   * Generates a flip-flop sequence
+   * @param loReps repetitions for the low range
+   * @param hiReps repetitions for the high range
+   * @param steps maximum number of steps for this sequence
+   */
+  public void flipFlop(int loReps, int hiReps, int steps) {
+    int n = hi - lo + 1;
+    while (n > 0 && steps > 0) {
+      int i = loReps;
+      while (n > 0 && steps > 0 && i > 0) {
+        arr[idx++] = lo++ + v;
+        n--;
+        steps--;
+        i--;
+      }
+      int j = hiReps;
+      while (n > 0 && steps > 0 && j > 0) {
+        arr[idx++] = hi-- + v;
+        n--;
+        steps--;
+        j--;
+      }
+    }
+  }
+
+  /**
+   * @return the populated array
+   */
+  public float[] getArray() {
+    return arr;
+  }
+
+  @Test
+  public void checkFlipFlop() {
+    int N = 50;
+    FlipFlopStream ffs = new FlipFlopStream(N, 1);
+    ffs.flipFlop(1, 1, 20);
+    ffs.flipFlop(10, 1, 10);
+    ffs.flipFlop(1, 10, 10);
+    ffs.flipFlop(1, 1, 10);
+    for (int i = 0; i < N; i++) { println(ffs.arr[i]); }
+  }
+
+  static void println(Object o) { System.out.println(o.toString()); }
+}
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/KllSketchAccuracyProfile.java
similarity index 71%
copy from 
src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
copy to 
src/test/java/org/apache/datasketches/characterization/quantiles/KllSketchAccuracyProfile.java
index 57867d0..01f3d92 100644
--- 
a/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/KllSketchAccuracyProfile.java
@@ -20,29 +20,24 @@
 package org.apache.datasketches.characterization.quantiles;
 
 import static java.lang.Math.round;
-import static 
org.apache.datasketches.ExponentiallySpacedPoints.expSpacedFloats;
 import static org.apache.datasketches.GaussianRanks.GAUSSIANS_3SD;
 import static org.apache.datasketches.Util.evenlySpacedFloats;
 import static org.apache.datasketches.Util.pwr2LawNext;
-import static org.apache.datasketches.req.Criteria.GE;
-import static org.apache.datasketches.req.Criteria.LT;
 
 import org.apache.datasketches.Job;
 import org.apache.datasketches.JobProfile;
 import org.apache.datasketches.MonotonicPoints;
 import org.apache.datasketches.characterization.Shuffle;
+import org.apache.datasketches.kll.KllFloatsSketch;
 import org.apache.datasketches.quantiles.DoublesSketch;
 import org.apache.datasketches.quantiles.DoublesSketchBuilder;
 import org.apache.datasketches.quantiles.UpdateDoublesSketch;
-import org.apache.datasketches.req.Criteria;
-import org.apache.datasketches.req.ReqDebugImpl;
-import org.apache.datasketches.req.ReqSketch;
-import org.apache.datasketches.req.ReqSketchBuilder;
+
 
 /**
  * @author Lee Rhodes
  */
-public class ReqSketchAccuracyProfile implements JobProfile {
+public class KllSketchAccuracyProfile implements JobProfile {
   private Job job;
 
   //FROM PROPERTIES
@@ -57,19 +52,12 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
 
   //plotting & x-axis configuration
   private int numPlotPoints;
-  private boolean evenlySpaced;
-  private double exponent;
-  private int sd;
-  private double rankRange;
 
   //Target sketch configuration & error analysis
   private int K;
-  private boolean hra; //high rank accuracy
-  private Criteria criterion;
-  private org.apache.datasketches.req.ReqDebugImpl reqDebugImpl = null;
 
   //DERIVED globals
-  private ReqSketch sk;
+  private KllFloatsSketch sk;
 
   //The array of Gaussian quantiles for +/- StdDev error analysis
   private double[] gRanks;
@@ -82,13 +70,12 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
   private float[] corrTrueValues;
 
   private final String[] columnLabels =
-    {"rPP", "Value", "Rank", "-3SD","-2SD", "-1SD", "Med", "+1SD", "+2SD", 
"+3SD", "RLB", "RUB"};
+    {"nPP", "Value", "Rank", "-3SD","-2SD", "-1SD", "Med", "+1SD", "+2SD", 
"+3SD"};
   private final String sFmt =
-    "%3s\t%5s\t%4s\t%4s\t%4s\t%4s\t%5s\t%4s\t%4s\t%4s\t%3s\t%3s\n";
+    "%3s\t%5s\t%4s\t%4s\t%4s\t%4s\t%5s\t%4s\t%4s\t%4s\n";
   private final String fFmt =
     "%14.10f\t%14.0f\t%14.10f\t" //rPP, Value, Rank
-  + "%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t" //-3sd 
to +3sd
-  + "%14.10f\t%14.10f\n"; //rlb, rub
+  + "%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t\n"; 
//-3sd to +3sd
 
   //JobProfile interface
   @Override
@@ -117,27 +104,16 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
     errorSkLgK = Integer.parseInt(job.getProperties().mustGet("ErrSkLgK"));
     //plotting & x-axis config
     numPlotPoints = 
Integer.parseInt(job.getProperties().mustGet("NumPlotPoints"));
-    evenlySpaced = 
Boolean.valueOf(job.getProperties().mustGet("EvenlySpaced"));
-    exponent = Double.parseDouble(job.getProperties().mustGet("Exponent"));
-    sd = Integer.parseInt(job.getProperties().mustGet("StdDev"));
-    rankRange = Double.parseDouble(job.getProperties().mustGet("RankRange"));
     //Target sketch config
     K = Integer.parseInt(job.getProperties().mustGet("K"));
-    hra = Boolean.parseBoolean(job.getProperties().mustGet("HRA"));
-    criterion = Criteria.valueOf(job.getProperties().mustGet("Criterion"));
-    String reqDebugLevel = job.getProperties().get("ReqDebugLevel");
-    String reqDebugFmt = job.getProperties().get("ReqDebugFmt");
-    if (reqDebugLevel != null) {
-      int level = Integer.parseInt(reqDebugLevel);
-      reqDebugImpl = new ReqDebugImpl(level, reqDebugFmt);
-    }
+
   }
 
   void configureCommon() {
     configureSketch();
     trueValues = new float[numPlotPoints];
     corrTrueValues = new float[numPlotPoints];
-    trueValueCorrection = criterion == GE || criterion == LT ? 1 : 0;
+    trueValueCorrection = 1; //KLL is always LT
     errQSkArr = new UpdateDoublesSketch[numPlotPoints];
     //configure the error quantiles array
     final DoublesSketchBuilder builder = DoublesSketch.builder().setK(1 << 
errorSkLgK);
@@ -151,11 +127,7 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
   }
 
   void configureSketch() {
-    final ReqSketchBuilder bldr = ReqSketch.builder();
-    bldr.setK(K).setHighRankAccuracy(hra);
-    if (reqDebugImpl != null) { bldr.setReqDebug(reqDebugImpl); }
-    sk = bldr.build();
-    sk.setCriterion(criterion);
+    sk = new KllFloatsSketch(K);
   }
 
   private void doJob() {
@@ -191,17 +163,14 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
     job.printfData(sFmt, (Object[])columnLabels);
 
     //build the stream
-    //the values themselves reflect their integer ranks starting with 1.
+    //the values themselves reflect their integer ranks starting with 1 
(except for LT)
     stream = new float[streamLength];
     for (int sl = 1; sl <= streamLength; sl++) { stream[sl - 1] = sl; } //1 to 
SL
 
     //compute the true values used at the plot points
-    final int subStreamLen = (int)Math.round(rankRange * streamLength);
-    final float start = hra ? streamLength - subStreamLen : 1.0f;
-    final float end = hra ? streamLength : subStreamLen;
-    final float[] fltValues = evenlySpaced
-        ? evenlySpacedFloats(start, end, numPlotPoints)
-        : expSpacedFloats(1.0f, streamLength, numPlotPoints, exponent, hra);
+    final float start = 1.0f;
+    final float end = streamLength;
+    final float[] fltValues = evenlySpacedFloats(start, end, numPlotPoints);
 
     for (int pp = 0; pp < numPlotPoints; pp++) {
       trueValues[pp] = round(fltValues[pp]);
@@ -210,6 +179,7 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
 
     //Do numTrials for all plotpoints
     for (int t = 0; t < numTrials; t++) {
+      sk = new KllFloatsSketch(K);
       doTrial(sk, stream, trueValues, corrTrueValues, errQSkArr);
     }
 
@@ -217,8 +187,6 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
     for (int pp = 0 ; pp < numPlotPoints; pp++) {
       final double v = trueValues[pp];
       final double tr = v / streamLength; //the true rank
-      final double rlb = sk.getRankLowerBound(tr, sd) - tr;
-      final double rub = sk.getRankUpperBound(tr, sd) - tr;
 
       //for each of the numErrDistRanks distributions extract the sd quantiles
       final double[] errQ = errQSkArr[pp].getQuantiles(gRanks); //get error 
values at the Gaussian ranks
@@ -226,12 +194,11 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
       //Plot the row. We ignore quantiles collected at 0 and 1.0.
       final double relPP = (double)(pp + 1) / numPlotPoints;
       job.printfData(fFmt, relPP, v, tr,
-          errQ[0], errQ[1], errQ[2], errQ[3], errQ[4], errQ[5], errQ[6],
-          rlb, rub);
+          errQ[0], errQ[1], errQ[2], errQ[3], errQ[4], errQ[5], errQ[6]);
       errQSkArr[pp].reset(); //reset the errQSkArr for next streamLength
     }
-    job.println(LS + "Serialization Bytes: " + sk.getSerializationBytes());
-    job.println(sk.viewCompactorDetail("%5.0f", false));
+    job.println(LS + "Serialization Bytes: " + sk.getSerializedSizeBytes());
+
   }
 
   /**
@@ -242,17 +209,19 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
    * @param trueValues the true integer ranks at each of the plot points
    * @param errQSkArr the quantile error sketches for each plot point to be 
updated
    */
-  static void doTrial(final ReqSketch sk, final float[] stream, final float[] 
trueValues,
+  static void doTrial(final KllFloatsSketch sk, final float[] stream, final 
float[] trueValues,
       final float[] corrTrueValues, final UpdateDoublesSketch[] errQSkArr) {
-    sk.reset();
     Shuffle.shuffle(stream);
     final int sl = stream.length;
     for (int i = 0; i < sl; i++) {
       sk.update(stream[i]);
     }
-    //get estimated ranks from sketch for all plotpoints, this is a bulk 
operation
-    final double[] estRanks = sk.getRanks(trueValues);
     final int numPP = trueValues.length;
+    //get estimated ranks from sketch for all plotpoints
+    final double[] estRanks = new double[numPP];
+    for (int pp = 0; pp < numPP; pp++) {
+      estRanks[pp] = sk.getRank(trueValues[pp]);
+    }
     //compute errors for each plotPoint
     for (int pp = 0; pp < numPP; pp++) {
       final double errorAtPlotPoint = estRanks[pp] - 
(double)corrTrueValues[pp] / sl;
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/KllSketchSizeSpeedProfile.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/KllSketchSizeSpeedProfile.java
new file mode 100644
index 0000000..058237b
--- /dev/null
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/KllSketchSizeSpeedProfile.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.datasketches.characterization.quantiles;
+
+import static java.lang.Math.log;
+import static java.lang.Math.pow;
+import static org.apache.datasketches.Util.pwr2LawNext;
+
+import org.apache.datasketches.Job;
+import org.apache.datasketches.JobProfile;
+import org.apache.datasketches.Properties;
+import org.apache.datasketches.kll.KllFloatsSketch;
+
+
+/**
+ * @author Lee Rhodes
+ */
+public class KllSketchSizeSpeedProfile implements JobProfile {
+  private Job job;
+  private Properties prop;
+
+  //FROM PROPERTIES
+  private int lgMinT;
+  private int lgMaxT;
+  private int lgMinBpSL;
+  private int lgMaxBpSL;
+  //For computing the different stream lengths
+  private int lgMinSL;
+  private int lgMaxSL;
+  private int ppoSL;
+
+  private double slope;
+
+  //Target sketch configuration & error analysis
+  private int kllK;
+
+  //DERIVED & GLOBALS
+  private KllFloatsSketch kllSk;
+
+
+  private final String[] columnLabels = {"PP", "SL", "Trials", "KllBytes", 
"Kll nS" };
+  private final String sFmt =  "%2s\t%2s\t%6s\t%8s\t%4s\n";
+  private final String dFmt =  "%,6d\t%,12d\t%,12d\t%,12d\t%,12.6f\n";
+
+  private void extractProperties() {
+    //trials config
+    lgMinT = Integer.parseInt(prop.mustGet("LgMinT"));
+    lgMaxT = Integer.parseInt(prop.mustGet("LgMaxT"));
+    lgMinBpSL = Integer.parseInt(prop.mustGet("LgMinBpSL"));
+    lgMaxBpSL = Integer.parseInt(prop.mustGet("LgMaxBpSL"));
+    //stream length
+    lgMinSL = Integer.parseInt(prop.mustGet("LgMinSL"));
+    lgMaxSL = Integer.parseInt(prop.mustGet("LgMaxSL"));
+    ppoSL = Integer.parseInt(prop.mustGet("PpoSL"));
+
+    //Target sketch config
+    kllK = Integer.parseInt(prop.mustGet("KllK"));
+  }
+
+  void configureCommon() {
+    slope = (double) (lgMaxT - lgMinT) / (lgMinBpSL - lgMaxBpSL);
+  }
+
+  void configureSketch() {
+    kllSk = new KllFloatsSketch(kllK);
+  }
+
+//JobProfile interface
+  @Override
+  public void start(final Job job) {
+    this.job = job;
+    prop = job.getProperties();
+    extractProperties();
+    configureCommon();
+    configureSketch();
+    doTrials();
+  }
+
+  @Override
+  public void shutdown() {}
+
+  @Override
+  public void cleanup() {}
+  //end JobProfile
+
+  /**
+   * Traverses all the axis plot points and performs trials(sl) at each point
+   * and outputs a row per axis plot point.
+   */
+  private void doTrials() {
+    final int maxSL = 1 << lgMaxSL;
+    final int minSL = 1 << lgMinSL;
+    int lastSL = 0;
+    job.printf(sFmt, (Object[]) columnLabels); //Header
+    int pp = 1;
+    while (lastSL < maxSL) { //Trials for each plotPoint on X-axis, and one 
row on output
+      final int nextSL = lastSL == 0 ? minSL : pwr2LawNext(ppoSL, lastSL);
+      lastSL = nextSL;
+      final int trials = getNumTrials(nextSL);
+
+      double sumUpdateTimePerItem_nS = 0;
+      for (int t = 0; t < trials; t++) {
+        sumUpdateTimePerItem_nS += doTrial(nextSL);
+      }
+      final double meanUpdateTimePerItem_nS = sumUpdateTimePerItem_nS / trials;
+      final int bytes = kllSk.getSerializedSizeBytes();
+      job.printf(dFmt, pp, nextSL, trials, bytes, meanUpdateTimePerItem_nS);
+      pp++;
+    }
+  }
+
+  /**
+   * Return the average update time per item for this trial
+   * @param streamLen the streamLength for this trial
+   * @return the average update time per item for this trial
+   */
+  private double doTrial(final int streamLen) {
+    kllSk = new KllFloatsSketch(kllK);
+    final long startUpdateTime_nS = System.nanoTime();
+
+    for (int i = 0; i < streamLen; i++) {
+      kllSk.update(i);
+    }
+    final long updateTime_nS = System.nanoTime() - startUpdateTime_nS;
+    return (double) updateTime_nS / streamLen;
+  }
+
+  /**
+   * Computes the number of trials for a given current stream length for a
+   * trial set. This is used in speed trials and decreases the number of trials
+   * as the stream length increases.
+   *
+   * @param curSL the given current stream length for a trial set.
+   * @return the number of trials for a given current stream length for a
+   * trial set.
+   */
+  private int getNumTrials(final int curSL) {
+    final int minBpSL = 1 << lgMinBpSL;
+    final int maxBpSL = 1 << lgMaxBpSL;
+    final int maxT = 1 << lgMaxT;
+    final int minT = 1 << lgMinT;
+    if (lgMinT == lgMaxT || curSL <= minBpSL) {
+      return maxT;
+    }
+    if (curSL >= maxBpSL) {
+      return minT;
+    }
+    final double lgCurU = log(curSL) / LN2;
+    final double lgTrials = slope * (lgCurU - lgMinBpSL) + lgMaxT;
+    return (int) pow(2.0, lgTrials);
+  }
+
+}
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
index 57867d0..5ecbc98 100644
--- 
a/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile.java
@@ -20,21 +20,23 @@
 package org.apache.datasketches.characterization.quantiles;
 
 import static java.lang.Math.round;
+import static org.apache.datasketches.Criteria.GE;
+import static org.apache.datasketches.Criteria.LT;
 import static 
org.apache.datasketches.ExponentiallySpacedPoints.expSpacedFloats;
 import static org.apache.datasketches.GaussianRanks.GAUSSIANS_3SD;
 import static org.apache.datasketches.Util.evenlySpacedFloats;
 import static org.apache.datasketches.Util.pwr2LawNext;
-import static org.apache.datasketches.req.Criteria.GE;
-import static org.apache.datasketches.req.Criteria.LT;
 
+import org.apache.datasketches.Criteria;
 import org.apache.datasketches.Job;
 import org.apache.datasketches.JobProfile;
 import org.apache.datasketches.MonotonicPoints;
+import org.apache.datasketches.Properties;
 import org.apache.datasketches.characterization.Shuffle;
+import org.apache.datasketches.hll.HllSketch;
 import org.apache.datasketches.quantiles.DoublesSketch;
 import org.apache.datasketches.quantiles.DoublesSketchBuilder;
 import org.apache.datasketches.quantiles.UpdateDoublesSketch;
-import org.apache.datasketches.req.Criteria;
 import org.apache.datasketches.req.ReqDebugImpl;
 import org.apache.datasketches.req.ReqSketch;
 import org.apache.datasketches.req.ReqSketchBuilder;
@@ -44,6 +46,7 @@ import org.apache.datasketches.req.ReqSketchBuilder;
  */
 public class ReqSketchAccuracyProfile implements JobProfile {
   private Job job;
+  private Properties prop;
 
   //FROM PROPERTIES
   //For computing the different stream lengths
@@ -53,7 +56,8 @@ public class ReqSketchAccuracyProfile implements JobProfile {
   private int ppo; //not currently used
 
   private int numTrials; //num of Trials per plotPoint
-  private int errorSkLgK; //size of the error quantiles sketches
+  private int errQSkLgK; //size of the error quantiles sketches
+  private int errHllSkLgK; //size of the error HLL sketch
 
   //plotting & x-axis configuration
   private int numPlotPoints;
@@ -65,6 +69,7 @@ public class ReqSketchAccuracyProfile implements JobProfile {
   //Target sketch configuration & error analysis
   private int K;
   private boolean hra; //high rank accuracy
+  private boolean compatible;
   private Criteria criterion;
   private org.apache.datasketches.req.ReqDebugImpl reqDebugImpl = null;
 
@@ -74,26 +79,28 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
   //The array of Gaussian quantiles for +/- StdDev error analysis
   private double[] gRanks;
   private UpdateDoublesSketch[] errQSkArr;
+  private HllSketch[] errHllSkArr;
 
   //Specific to a streamLength
-  private float[] stream;
-  private float[] trueValues;
+  private float[] stream; //a shuffled array of values from 1...N
+  private float[] trueValues; //
   private int trueValueCorrection;
   private float[] corrTrueValues;
 
   private final String[] columnLabels =
-    {"rPP", "Value", "Rank", "-3SD","-2SD", "-1SD", "Med", "+1SD", "+2SD", 
"+3SD", "RLB", "RUB"};
+    {"nPP", "Value", "Rank", "-3SD","-2SD", "-1SD", "Med", "+1SD", "+2SD", 
"+3SD", "1LB", "1UB", "U"};
   private final String sFmt =
-    "%3s\t%5s\t%4s\t%4s\t%4s\t%4s\t%5s\t%4s\t%4s\t%4s\t%3s\t%3s\n";
+    "%3s\t%5s\t%4s\t%4s\t%4s\t%4s\t%5s\t%4s\t%4s\t%4s\t%3s\t%3s\t%3s\n";
   private final String fFmt =
     "%14.10f\t%14.0f\t%14.10f\t" //rPP, Value, Rank
   + "%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t" //-3sd 
to +3sd
-  + "%14.10f\t%14.10f\n"; //rlb, rub
+  + "%14.10f\t%14.10f\t%6d\n"; //1lb, 1ub, U
 
   //JobProfile interface
   @Override
   public void start(final Job job) {
     this.job = job;
+    prop = job.getProperties();
     extractProperties();
     configureCommon();
     doJob();
@@ -108,25 +115,27 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
 
   private void extractProperties() {
     //stream length
-    lgMin = Integer.parseInt(job.getProperties().mustGet("LgMin"));
-    lgMax = Integer.parseInt(job.getProperties().mustGet("LgMax"));
-    lgDelta = Integer.parseInt(job.getProperties().mustGet("LgDelta"));
-    ppo = Integer.parseInt(job.getProperties().mustGet("PPO"));
-    //numTrials & error quantiles sketch config
-    numTrials = 1 << Integer.parseInt(job.getProperties().mustGet("LgTrials"));
-    errorSkLgK = Integer.parseInt(job.getProperties().mustGet("ErrSkLgK"));
+    lgMin = Integer.parseInt(prop.mustGet("LgMin"));
+    lgMax = Integer.parseInt(prop.mustGet("LgMax"));
+    lgDelta = Integer.parseInt(prop.mustGet("LgDelta"));
+    ppo = Integer.parseInt(prop.mustGet("PPO"));
+    //numTrials & error quantiles & HLL sketch config
+    numTrials = 1 << Integer.parseInt(prop.mustGet("LgTrials"));
+    errQSkLgK = Integer.parseInt(prop.mustGet("ErrQSkLgK"));
+    errHllSkLgK = Integer.parseInt(prop.mustGet("ErrHllSkLgK"));
     //plotting & x-axis config
-    numPlotPoints = 
Integer.parseInt(job.getProperties().mustGet("NumPlotPoints"));
-    evenlySpaced = 
Boolean.valueOf(job.getProperties().mustGet("EvenlySpaced"));
-    exponent = Double.parseDouble(job.getProperties().mustGet("Exponent"));
-    sd = Integer.parseInt(job.getProperties().mustGet("StdDev"));
-    rankRange = Double.parseDouble(job.getProperties().mustGet("RankRange"));
+    numPlotPoints = Integer.parseInt(prop.mustGet("NumPlotPoints"));
+    evenlySpaced = Boolean.valueOf(prop.mustGet("EvenlySpaced"));
+    exponent = Double.parseDouble(prop.mustGet("Exponent"));
+    sd = Integer.parseInt(prop.mustGet("StdDev"));
+    rankRange = Double.parseDouble(prop.mustGet("RankRange"));
     //Target sketch config
-    K = Integer.parseInt(job.getProperties().mustGet("K"));
-    hra = Boolean.parseBoolean(job.getProperties().mustGet("HRA"));
-    criterion = Criteria.valueOf(job.getProperties().mustGet("Criterion"));
-    String reqDebugLevel = job.getProperties().get("ReqDebugLevel");
-    String reqDebugFmt = job.getProperties().get("ReqDebugFmt");
+    K = Integer.parseInt(prop.mustGet("K"));
+    hra = Boolean.parseBoolean(prop.mustGet("HRA"));
+    compatible = Boolean.parseBoolean(prop.mustGet("Compatible"));
+    criterion = Criteria.valueOf(prop.mustGet("Criterion"));
+    String reqDebugLevel = prop.get("ReqDebugLevel");
+    String reqDebugFmt = prop.get("ReqDebugFmt");
     if (reqDebugLevel != null) {
       int level = Integer.parseInt(reqDebugLevel);
       reqDebugImpl = new ReqDebugImpl(level, reqDebugFmt);
@@ -139,10 +148,12 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
     corrTrueValues = new float[numPlotPoints];
     trueValueCorrection = criterion == GE || criterion == LT ? 1 : 0;
     errQSkArr = new UpdateDoublesSketch[numPlotPoints];
-    //configure the error quantiles array
-    final DoublesSketchBuilder builder = DoublesSketch.builder().setK(1 << 
errorSkLgK);
+    errHllSkArr = new HllSketch[numPlotPoints];
+    //configure the error quantiles array & HLL sketch arr
+    final DoublesSketchBuilder builder = DoublesSketch.builder().setK(1 << 
errQSkLgK);
     for (int i = 0; i < numPlotPoints; i++) {
       errQSkArr[i] = builder.build();
+      errHllSkArr[i] = new HllSketch(errHllSkLgK);
     }
     gRanks = new double[GAUSSIANS_3SD.length - 2]; //omit 0.0 and 1.0
     for (int i = 1; i < GAUSSIANS_3SD.length - 1; i++) {
@@ -210,7 +221,7 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
 
     //Do numTrials for all plotpoints
     for (int t = 0; t < numTrials; t++) {
-      doTrial(sk, stream, trueValues, corrTrueValues, errQSkArr);
+      doTrial(sk, stream, trueValues, corrTrueValues, errQSkArr, errHllSkArr);
     }
 
     //at this point each of the errQSkArr sketches has a distribution of error 
from numTrials
@@ -220,15 +231,18 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
       final double rlb = sk.getRankLowerBound(tr, sd) - tr;
       final double rub = sk.getRankUpperBound(tr, sd) - tr;
 
+
       //for each of the numErrDistRanks distributions extract the sd quantiles
       final double[] errQ = errQSkArr[pp].getQuantiles(gRanks); //get error 
values at the Gaussian ranks
+      final int errCnt = (int)round(errHllSkArr[pp].getEstimate());
 
-      //Plot the row. We ignore quantiles collected at 0 and 1.0.
+      //Plot the row.
       final double relPP = (double)(pp + 1) / numPlotPoints;
       job.printfData(fFmt, relPP, v, tr,
           errQ[0], errQ[1], errQ[2], errQ[3], errQ[4], errQ[5], errQ[6],
-          rlb, rub);
+          rlb, rub, errCnt);
       errQSkArr[pp].reset(); //reset the errQSkArr for next streamLength
+      errHllSkArr[pp].reset(); //reset the errHllSkArr for next streamLength
     }
     job.println(LS + "Serialization Bytes: " + sk.getSerializationBytes());
     job.println(sk.viewCompactorDetail("%5.0f", false));
@@ -243,7 +257,7 @@ public class ReqSketchAccuracyProfile implements JobProfile 
{
    * @param errQSkArr the quantile error sketches for each plot point to be 
updated
    */
   static void doTrial(final ReqSketch sk, final float[] stream, final float[] 
trueValues,
-      final float[] corrTrueValues, final UpdateDoublesSketch[] errQSkArr) {
+      final float[] corrTrueValues, final UpdateDoublesSketch[] errQSkArr, 
HllSketch[] errHllSkArr) {
     sk.reset();
     Shuffle.shuffle(stream);
     final int sl = stream.length;
@@ -253,10 +267,11 @@ public class ReqSketchAccuracyProfile implements 
JobProfile {
     //get estimated ranks from sketch for all plotpoints, this is a bulk 
operation
     final double[] estRanks = sk.getRanks(trueValues);
     final int numPP = trueValues.length;
-    //compute errors for each plotPoint
+    //compute errors and update HLL for each plotPoint
     for (int pp = 0; pp < numPP; pp++) {
       final double errorAtPlotPoint = estRanks[pp] - 
(double)corrTrueValues[pp] / sl;
       errQSkArr[pp].update(errorAtPlotPoint); //update each of the errQArr 
sketches
+      errHllSkArr[pp].update(errorAtPlotPoint);
     }
   }
 
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile2.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile2.java
new file mode 100644
index 0000000..727eaf8
--- /dev/null
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchAccuracyProfile2.java
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.datasketches.characterization.quantiles;
+
+import static org.apache.datasketches.GaussianRanks.GAUSSIANS_3SD;
+import static org.apache.datasketches.Util.evenlySpacedFloats;
+
+import org.apache.datasketches.Criteria;
+import org.apache.datasketches.Job;
+import org.apache.datasketches.JobProfile;
+import org.apache.datasketches.Properties;
+import org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern;
+import org.apache.datasketches.quantiles.DoublesSketch;
+import org.apache.datasketches.quantiles.DoublesSketchBuilder;
+import org.apache.datasketches.quantiles.UpdateDoublesSketch;
+import org.apache.datasketches.req.ReqDebugImpl;
+import org.apache.datasketches.req.ReqSketch;
+import org.apache.datasketches.req.ReqSketchBuilder;
+
+/**
+ * @author Lee Rhodes
+ */
+public class ReqSketchAccuracyProfile2 implements JobProfile {
+  private Job job;
+  private Properties prop;
+  Pattern pattern;
+
+  //PROPERTIES
+  //plotting & x-axis configuration
+  private int lgSL;
+  private int numPlotPoints;
+  private int stdDev;
+
+  //Patterns
+  private int offset; //Stream offset, 0 or 1
+//  private int[] advSeq1 = new int[3];
+//  private int[] advSeq2 = new int[3];
+//  private int[] advSeq3 = new int[3];
+
+  private int errQSkLgK;
+
+  //TargetSketch config & error analysis
+  private int K;
+  private boolean hra;
+  private boolean compatible;
+  private Criteria criterion;
+  private org.apache.datasketches.req.ReqDebugImpl reqDebugImpl = null;
+
+  //DERIVED INTERNAL globals
+  private ReqSketch sk;
+  private int N;
+
+  //The array of Gaussian quantiles for +/- StdDev error analysis
+  private double[] gRanks;
+  private UpdateDoublesSketch[] errQSkArr;
+
+  //Specific to the stream
+  private TrueRanks trueRanks;
+  private float[] sortedPPValues;
+  private int[] sortedPPIndices;
+  private int[] sortedPPAbsRanks;
+
+  private final String[] columnLabels =
+      { "PP", "Value", "TrueRanks",
+        "-3SD","-2SD", "-1SD", "Med", "+1SD", "+2SD", "+3SD",
+        "1LB", "1UB" };
+  private final String sFmt =
+        "%2s\t%5s\t%9s\t"
+      + "%4s\t%4s\t%4s\t%3s\t%4s\t%4s\t%4s\t"
+      + "%3s\t%3s\n";
+  private final String fFmt =
+      "%5d\t%,14.0f\t%14.10f\t" //nPP, Value, Rank
+    + "%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t%14.10f\t" //-3sd 
to +3sd
+    + "%14.10f\t%14.10f\n"; //1lb, 1ub
+
+  //JobProfile interface
+  @Override
+  public void start(Job job) {
+    this.job = job;
+    prop = job.getProperties();
+    extractProperties();
+    configureSketch();
+    configureStream();
+    configurePlotPoints();
+    doStreamLength(N);
+  }
+
+  @Override
+  public void shutdown() { }
+
+  @Override
+  public void cleanup() { }
+  //end JobProfile
+
+  private void extractProperties() {
+    //plotting & x-axis configuration
+    lgSL = Integer.parseInt(prop.mustGet("LgSL"));
+    numPlotPoints = Integer.parseInt(prop.mustGet("NumPlotPoints"));
+    stdDev = Integer.parseInt(prop.mustGet("StdDev"));
+    //Patterns
+    pattern = Pattern.valueOf(prop.mustGet("Pattern"));
+    offset = Integer.parseInt(prop.mustGet("Offset"));
+//    String[] sarr = prop.mustGet("AdvSeq1").split(",", 3);
+//    for (int i = 0; i < sarr.length; i++) { advSeq1[i] = 
Integer.parseInt(sarr[i]); }
+//    sarr = prop.mustGet("AdvSeq2").split(",", 3);
+//    for (int i = 0; i < sarr.length; i++) { advSeq2[i] = 
Integer.parseInt(sarr[i]); }
+//    sarr = prop.mustGet("AdvSeq3").split(",", 3);
+//    for (int i = 0; i < sarr.length; i++) { advSeq3[i] = 
Integer.parseInt(sarr[i]); }
+
+    // error quantiles & HLL sketch config
+    errQSkLgK = Integer.parseInt(prop.mustGet("ErrQSkLgK"));
+    //plotting & x-axis config
+
+    //Target sketch config
+    K = Integer.parseInt(prop.mustGet("K"));
+    hra = Boolean.parseBoolean(prop.mustGet("HRA"));
+    criterion = Criteria.valueOf(prop.mustGet("Criterion"));
+    compatible = Boolean.parseBoolean(prop.mustGet("Compatible"));
+    String reqDebugLevel = prop.get("ReqDebugLevel");
+    String reqDebugFmt = prop.get("ReqDebugFmt");
+    if (reqDebugLevel != null) {
+      int level = Integer.parseInt(reqDebugLevel);
+      reqDebugImpl = new ReqDebugImpl(level, reqDebugFmt);
+    }
+  }
+
+  private void configureSketch() {
+    final ReqSketchBuilder bldr = ReqSketch.builder();
+    bldr.setK(K).setHighRankAccuracy(hra);
+    bldr.setCompatible(compatible);
+    if (reqDebugImpl != null) { bldr.setReqDebug(reqDebugImpl); }
+    sk = bldr.build();
+    sk.setCriterion(criterion);
+  }
+
+  private void configureStream() {
+    N = 1 << lgSL;
+    StreamMaker sm = new StreamMaker();
+    float[] stream = sm.makeStream(N, pattern, offset);
+    if (criterion == Criteria.LT) {
+      trueRanks = new TrueRanks(stream, false);
+    } else {
+      trueRanks = new TrueRanks(stream, true);
+    }
+  }
+
+  private void configurePlotPoints() {
+    sortedPPIndices = new int[numPlotPoints];
+    sortedPPAbsRanks = new int[numPlotPoints];
+    sortedPPValues = new float[numPlotPoints];
+    final int[] sortedAbsRanks = trueRanks.getSortedAbsRanks();
+    final float[] sortedStream = trueRanks.getSortedStream();
+    int minIdx = (int)Math.round((double)(N - 1) / numPlotPoints);
+    final float[] temp = evenlySpacedFloats(minIdx, N - 1, numPlotPoints);
+    for (int pp = 0; pp < numPlotPoints; pp++) {
+      final int idx = Math.round(temp[pp]);
+      sortedPPIndices[pp] = idx;
+      sortedPPAbsRanks[pp] = sortedAbsRanks[idx];
+      sortedPPValues[pp] = sortedStream[idx];
+    }
+
+    //configure the error quantiles array
+    errQSkArr = new UpdateDoublesSketch[numPlotPoints];
+    final DoublesSketchBuilder builder = DoublesSketch.builder().setK(1 << 
errQSkLgK);
+    for (int pp = 0; pp < numPlotPoints; pp++) {
+      errQSkArr[pp] = builder.build();
+    }
+    gRanks = new double[GAUSSIANS_3SD.length - 2]; //omit 0.0 and 1.0
+    for (int i = 1; i < GAUSSIANS_3SD.length - 1; i++) {
+      gRanks[i - 1] = GAUSSIANS_3SD[i];
+    }
+  }
+
+  private void doStreamLength(int streamLength) {
+    job.println(LS + "Stream Length: " + streamLength );
+    job.printfData(sFmt, (Object[])columnLabels);
+
+    doTrial();
+
+    //at this point each of the errQSkArr sketches has a distribution of error
+    for (int pp = 0 ; pp < numPlotPoints; pp++) {
+      final double tr = (double)sortedPPAbsRanks[pp] / N;
+      final float v = sortedPPValues[pp];
+      final double rlb = sk.getRankLowerBound(tr, stdDev) - tr;
+      final double rub = sk.getRankUpperBound(tr, stdDev) - tr;
+
+      //for each of the numErrDistRanks distributions extract the sd quantiles
+      final double[] errQ = errQSkArr[pp].getQuantiles(gRanks); //get error 
values at the Gaussian ranks
+      if (errQ != null) {
+      //Plot the row.
+      job.printfData(fFmt, pp + 1, v, tr,
+          errQ[0], errQ[1], errQ[2], errQ[3], errQ[4], errQ[5], errQ[6],
+          rlb, rub);
+      }
+      errQSkArr[pp].reset(); //reset the errQSkArr for next streamLength
+    }
+    job.println(LS + "Serialization Bytes: " + sk.getSerializationBytes());
+    job.println(sk.viewCompactorDetail("%5.0f", false));
+  }
+
+  void doTrial() { //for all plot points
+    sk.reset();
+    final float[] stream = trueRanks.getStream();
+    for (int i = 0; i < N; i++) { sk.update(stream[i]); }
+
+    final float[] sortedStream = trueRanks.getSortedStream();
+    final int[] sortedAbsRanks = trueRanks.getSortedAbsRanks();
+
+    int pp = 0;
+    int ppAbsIdx = sortedPPIndices[pp];
+    UpdateDoublesSketch qSk = errQSkArr[pp];
+    for (int idx = 0; idx < N; idx++) {
+      final double skRank = sk.getRank(sortedStream[idx]);
+      double trueRank = (double)sortedAbsRanks[idx] / N;
+      if (idx <= ppAbsIdx) {
+        final double rErr = skRank - trueRank;
+        qSk.update(rErr);
+      } else {
+        if (++pp < numPlotPoints) {
+          ppAbsIdx = sortedPPIndices[pp];
+          qSk = errQSkArr[pp];
+          final double rErr = skRank - trueRank;
+          qSk.update(rErr);
+        } else { break; }
+      }
+    }
+  }
+}
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchSizeSpeedProfile.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchSizeSpeedProfile.java
new file mode 100644
index 0000000..8fe87dd
--- /dev/null
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/ReqSketchSizeSpeedProfile.java
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.datasketches.characterization.quantiles;
+
+import static java.lang.Math.log;
+import static java.lang.Math.pow;
+import static org.apache.datasketches.Util.pwr2LawNext;
+
+import org.apache.datasketches.Criteria;
+import org.apache.datasketches.Job;
+import org.apache.datasketches.JobProfile;
+import org.apache.datasketches.Properties;
+import org.apache.datasketches.req.ReqSketch;
+import org.apache.datasketches.req.ReqSketchBuilder;
+
+/**
+ * @author Lee Rhodes
+ */
+public class ReqSketchSizeSpeedProfile implements JobProfile {
+  private Job job;
+  private Properties prop;
+
+  //FROM PROPERTIES
+  private int lgMinT;
+  private int lgMaxT;
+  private int lgMinBpSL;
+  private int lgMaxBpSL;
+  //For computing the different stream lengths
+  private int lgMinSL;
+  private int lgMaxSL;
+  private int ppoSL;
+
+  private double slope;
+
+  //Target sketch configuration & error analysis
+  private int reqK;
+  private boolean hra; //high rank accuracy
+  private Criteria criterion;
+
+  //DERIVED & GLOBALS
+  private ReqSketch reqSk;
+  //private KllFloatsSketch kllSk;
+
+  private final String[] columnLabels = {"PP", "SL", "Trials", "ReqBytes", 
"nS/u" };
+  private final String sFmt =  "%2s\t%2s\t%6s\t%8s\t%4s\n";
+  private final String dFmt =  "%,6d\t%,12d\t%,12d\t%,12d\t%,12.6f\n";
+
+  private void extractProperties() {
+    //trials config
+    lgMinT = Integer.parseInt(prop.mustGet("LgMinT"));
+    lgMaxT = Integer.parseInt(prop.mustGet("LgMaxT"));
+    lgMinBpSL = Integer.parseInt(prop.mustGet("LgMinBpSL"));
+    lgMaxBpSL = Integer.parseInt(prop.mustGet("LgMaxBpSL"));
+    //stream length
+    lgMinSL = Integer.parseInt(prop.mustGet("LgMinSL"));
+    lgMaxSL = Integer.parseInt(prop.mustGet("LgMaxSL"));
+    ppoSL = Integer.parseInt(prop.mustGet("PpoSL"));
+
+    //Target sketch config
+    reqK = Integer.parseInt(prop.mustGet("ReqK"));
+    hra = Boolean.parseBoolean(prop.mustGet("HRA"));
+    criterion = Criteria.valueOf(prop.mustGet("Criterion"));
+  }
+
+  void configureCommon() {
+    slope = (double) (lgMaxT - lgMinT) / (lgMinBpSL - lgMaxBpSL);
+  }
+
+  void configureSketch() {
+    final ReqSketchBuilder bldr = ReqSketch.builder();
+    bldr.setK(reqK).setHighRankAccuracy(hra);
+    reqSk = bldr.build();
+    reqSk.setCriterion(criterion);
+  }
+
+//JobProfile interface
+  @Override
+  public void start(final Job job) {
+    this.job = job;
+    prop = job.getProperties();
+    extractProperties();
+    configureCommon();
+    configureSketch();
+    doTrials();
+  }
+
+  @Override
+  public void shutdown() {}
+
+  @Override
+  public void cleanup() {}
+  //end JobProfile
+
+  /**
+   * Traverses all the axis plot points and performs trials(sl) at each point
+   * and outputs a row per axis plot point.
+   */
+  private void doTrials() {
+    final int maxSL = 1 << lgMaxSL;
+    final int minSL = 1 << lgMinSL;
+    int lastSL = 0;
+    job.printf(sFmt, (Object[]) columnLabels); //Header
+    int pp = 1;
+    while (lastSL < maxSL) { //Trials for each plotPoint on X-axis, and one 
row on output
+      final int nextSL = lastSL == 0 ? minSL : pwr2LawNext(ppoSL, lastSL);
+      lastSL = nextSL;
+      final int trials = getNumTrials(nextSL);
+
+      double sumUpdateTimePerItem_nS = 0;
+      for (int t = 0; t < trials; t++) {
+        sumUpdateTimePerItem_nS += doTrial(nextSL);
+      }
+      final double meanUpdateTimePerItem_nS = sumUpdateTimePerItem_nS / trials;
+      final int bytes = reqSk.getSerializationBytes();
+      job.printf(dFmt, pp, nextSL, trials, bytes, meanUpdateTimePerItem_nS);
+      pp++;
+    }
+  }
+
+  /**
+   * Return the average update time per item for this trial
+   * @param streamLen the streamLength for this trial
+   * @return the average update time per item for this trial
+   */
+  private double doTrial(final int streamLen) {
+    reqSk.reset();
+    final long startUpdateTime_nS = System.nanoTime();
+
+    for (int i = 0; i < streamLen; i++) {
+      reqSk.update(i);
+    }
+    final long updateTime_nS = System.nanoTime() - startUpdateTime_nS;
+    return (double) updateTime_nS / streamLen;
+  }
+
+  /**
+   * Computes the number of trials for a given current stream length for a
+   * trial set. This is used in speed trials and decreases the number of trials
+   * as the stream length increases.
+   *
+   * @param curSL the given current stream length for a trial set.
+   * @return the number of trials for a given current stream length for a
+   * trial set.
+   */
+  private int getNumTrials(final int curSL) {
+    final int minBpSL = 1 << lgMinBpSL;
+    final int maxBpSL = 1 << lgMaxBpSL;
+    final int maxT = 1 << lgMaxT;
+    final int minT = 1 << lgMinT;
+    if (lgMinT == lgMaxT || curSL <= minBpSL) {
+      return maxT;
+    }
+    if (curSL >= maxBpSL) {
+      return minT;
+    }
+    final double lgCurU = log(curSL) / LN2;
+    final double lgTrials = slope * (lgCurU - lgMinBpSL) + lgMaxT;
+    return (int) pow(2.0, lgTrials);
+  }
+
+}
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/StreamMaker.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/StreamMaker.java
new file mode 100644
index 0000000..2c2cf77
--- /dev/null
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/StreamMaker.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.datasketches.characterization.quantiles;
+
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.FlipFlop;
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.Random;
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.Reversed;
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.Sorted;
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.Sqrt;
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.Zoomin;
+import static 
org.apache.datasketches.characterization.quantiles.StreamMaker.Pattern.Zoomout;
+
+import org.apache.datasketches.characterization.Shuffle;
+import org.testng.annotations.Test;
+
+/**
+ * @author Lee Rhodes
+ */
+public class StreamMaker {
+  public enum Pattern { Sorted, Reversed, Zoomin, Zoomout, Random, Sqrt, 
FlipFlop,
+    Clustered, ClusteredZoomin }
+  public float min = 0;
+  public float max = 0;
+
+  public float[] makeStream(int n, Pattern pattern, int offset) {
+    float[] arr = new float[n];
+    min = offset;
+    max = n - 1 + offset;
+    switch(pattern) {
+      case Sorted: {
+        for (int i = 0; i < n; i++) { arr[i] = i + offset; }
+        break;
+      }
+      case Reversed: {
+        for (int i = 0; i < n; i++) { arr[n - 1 - i] = i + offset; }
+        break;
+      }
+      case Zoomin: {
+        for (int i = 0, j = 0; i < n; i++) {
+          if ((i & 1) > 0) { arr[i] = n - j - 1 + offset; j++; } //odd
+          else { arr[i] = j + offset; }
+        }
+        break;
+      }
+      case Zoomout: {
+        for (int i = 0, j = 0; i < n; i++) {
+          if ((i & 1) > 0) { arr[n - 1 - i] = n - j - 1 + offset; j++; } //odd
+          else { arr[n - 1 - i] = j + offset; }
+        }
+        break;
+      }
+      case Random: {
+        for (int i = 0; i < n; i++) { arr[i] = i + offset; }
+        Shuffle.shuffle(arr);
+        break;
+      }
+      case Sqrt: {
+        int idx = 0;
+        int t = (int)Math.sqrt(2 * n);
+        int item = 0;
+        int initialItem = 0;
+        int initialSkip = 1;
+        for (int i = 0; i < t; i++) {
+          item = initialItem;
+          int skip = initialSkip;
+          for (int j = 0; j < t - i; j++) {
+            if (idx > n - 1) { break; }
+            arr[idx++] = item + offset;
+            item += skip;
+            skip += 1;
+          }
+          if (idx > n - 1) { break; }
+          initialSkip += 1;
+          initialItem += initialSkip;
+        }
+        break;
+      }
+      case FlipFlop: {
+        FlipFlopStream ffs = new FlipFlopStream(n, offset);
+        ffs.flipFlop(1, 1, n * 2 / 5);
+        int m = n / 5;
+        ffs.flipFlop(m, 1, m);
+        ffs.flipFlop(1, m, m);
+        ffs.flipFlop(1, 1, n);
+        arr = ffs.getArray();
+        break;
+      }
+      case Clustered: {
+        break;
+      }
+      case ClusteredZoomin: {
+        break;
+      }
+    }
+    return arr;
+  }
+
+  public void printStream(int n, Pattern order, int offset) {
+    float[] stream = makeStream(n, order, offset);
+    println(order + " n:" + n + " offset: " + offset);
+    for (int i = 0; i < stream.length; i++) {
+      if (i != 0 && i % 21 == 0) { println(""); }
+      print(stream[i] + " ");
+    }
+    println("");
+  }
+
+  @Test
+  public void checkStreamMaker() {
+    printStream(20, Sorted, 0);
+    printStream(20, Reversed, 0);
+    printStream(20, Zoomin, 0);
+    printStream(21, Zoomin, 1);
+    printStream(20, Zoomout, 0);
+    printStream(21, Zoomout, 1);
+    printStream(21, Random, 0);
+    printStream(21, Random, 1);
+    printStream(20, Sqrt, 0);
+    printStream(20, Sqrt, 1);
+    printStream(21, Sqrt, 0);
+    printStream(21, Sqrt, 1);
+    printStream(71, FlipFlop, 0);
+    printStream(71, FlipFlop, 1);
+  }
+
+  static void print(Object o) { System.out.print(o.toString()); }
+
+  static void println(Object o) { System.out.println(o.toString()); }
+}
diff --git 
a/src/test/java/org/apache/datasketches/characterization/quantiles/TrueRanks.java
 
b/src/test/java/org/apache/datasketches/characterization/quantiles/TrueRanks.java
new file mode 100644
index 0000000..f725f22
--- /dev/null
+++ 
b/src/test/java/org/apache/datasketches/characterization/quantiles/TrueRanks.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.datasketches.characterization.quantiles;
+
+import java.util.Arrays;
+
+import org.apache.datasketches.BinarySearch;
+import org.apache.datasketches.characterization.Shuffle;
+import org.testng.annotations.Test;
+
+/**
+ * Given an array of values, these methods compute the true rank (mass) of
+ * each value of the array based on the comparison criterion.
+ * The mass or rank of each value is the fractional number of elements of the 
array that satisfy
+ * the criterion.
+ *
+ * @author Lee Rhodes
+ */
+public class TrueRanks {
+  private static final String LS = System.getProperty("line.separator");
+  private boolean ltEq;
+  private int length;
+  private float[] stream;
+  private float[] sortedStream;
+  private int[] sortedAbsRanks;
+  private int[] streamAbsRanks; //??
+
+  TrueRanks() { } //for TestNG
+
+  public TrueRanks(final float[] stream, final boolean ltEq) {
+    this.stream = stream;
+    this.ltEq = ltEq;
+    compute();
+  }
+
+  public float getMinValue() { return sortedStream[0]; }
+
+  public float getMaxValue() { return sortedStream[length - 1]; }
+
+  public int getMinAbsRank() { return sortedAbsRanks[0]; }
+
+  public int getMaxAbsRank() { return sortedAbsRanks[length - 1]; }
+
+  public float[] getStream() { return stream; }
+
+  public float[] getSortedStream() { return sortedStream; }
+
+  public int[] getSortedAbsRanks() { return sortedAbsRanks; }
+
+  public int[] getStreamAbsRanks() { return streamAbsRanks; }
+
+  public double[] getSortedRelRanks() {
+    return relativeRank(sortedAbsRanks);
+  }
+
+  public double[] getStreamRelRanks() {
+    return relativeRank(streamAbsRanks);
+  }
+
+  public int getAbsRank(final float v) {
+    int idx = BinarySearch.find(sortedStream, 0, length - 1, v);
+    return sortedAbsRanks[idx];
+  }
+
+  /**
+   * Compute Absolute Rank.
+   */
+  private void compute() {
+    length = stream.length;
+    sortedStream = stream.clone();
+    Arrays.sort(sortedStream);
+    sortedAbsRanks = new int[length];
+    if (ltEq) { //LE
+      sortedAbsRanks[length - 1] = length;
+      int i = length - 2;
+      while (i >= 0) {
+        if (sortedStream[i] == sortedStream[i + 1]) { sortedAbsRanks[i] = 
sortedAbsRanks[i + 1]; }
+        else { sortedAbsRanks[i] = i + 1; }
+        i--;
+      }
+    } else { // LT
+      sortedAbsRanks[0] = 0;
+      int i = 1;
+      while (i < length) {
+        if (sortedStream[i - 1] == sortedStream[i]) { sortedAbsRanks[i] = 
sortedAbsRanks[i - 1]; }
+        else { sortedAbsRanks[i] = i; }
+        i++;
+      }
+    }
+    streamAbsRanks = new int[length]; //put the ranks in values order
+    for (int j = 0; j < length; j++) {
+      final int idx = BinarySearch.find(sortedStream, 0, length - 1, 
stream[j]);
+      streamAbsRanks[j] = sortedAbsRanks[idx];
+    }
+  }
+
+  /**
+   * Converts an absolute rank array to a relative rank array.
+   * @param absRankArr the absolute rank array to be converted.
+   * @return the relative rank array.
+   */
+  public static double[] relativeRank(final int[] absRankArr) {
+    int length = absRankArr.length;
+    double[] relRank = new double[length];
+    for (int i = 0; i < length; i++) { relRank[i] = (double)absRankArr[i] / 
length; }
+    return relRank;
+  }
+
+  @Test
+  public void checkRanks() {
+    final float[] vArr = { 5, 5, 5, 6, 6, 6, 7, 8, 8, 8 };
+    checkRanksImpl(vArr);
+    println(LS + "SHUFFLED:");
+    Shuffle.shuffle(vArr);
+    checkRanksImpl(vArr);
+  }
+
+  private static void checkRanksImpl(final float[] vArr) {
+    StringBuilder sb = new StringBuilder();
+    String ffmt  = "%5.1f ";
+    String dfmt    = "%5d ";
+    TrueRanks trueRanks;
+
+    int N = vArr.length;
+    sb.append("Values:").append(LS);
+    for (int i = 0; i < N; i++) { sb.append(String.format(ffmt, vArr[i])); }
+    sb.append(LS);
+
+    trueRanks = new TrueRanks(vArr, false);
+    sb.append("LT Abs Ranks:").append(LS);
+    int[] absArr = trueRanks.getStreamAbsRanks();
+    for (int i = 0; i < N; i++) { sb.append(String.format(dfmt, absArr[i])); }
+    sb.append(LS);
+    sb.append("LT Rel Ranks:").append(LS);
+    double[] relArr = relativeRank(absArr);
+    for (int i = 0; i < N; i++) { sb.append(String.format(ffmt, relArr[i])); }
+    sb.append(LS);
+
+    trueRanks = new TrueRanks(vArr, true);
+    sb.append("LE Abs Ranks:").append(LS);
+    absArr = trueRanks.getStreamAbsRanks();
+    for (int i = 0; i < N; i++) { sb.append(String.format(dfmt, absArr[i])); }
+    sb.append(LS);
+    sb.append("LE Rel Ranks:").append(LS);
+    relArr = relativeRank(absArr);
+    for (int i = 0; i < N; i++) { sb.append(String.format(ffmt, relArr[i])); }
+    sb.append(LS);
+    println(sb.toString());
+  }
+
+  private static void println(Object o) {
+    System.out.println(o.toString());
+  }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to