@mark1russell7/packing 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { DEFAULT_TOLERANCE, EPS, RECORD_EPS, boundsOf, boundsOf as boundsOf$1, checkInput, marginSides, rectInRegion, regionHitsRect, translate, turnBox, turnPoint, turnPort, turnRegion } from "@mark1russell7/layout-contract";
1
+ import { DEFAULT_TOLERANCE, EPS, RECORD_EPS, boundsOf, boundsOf as boundsOf$1, checkInput, marginSides, pickMoves, portfolio, rectInRegion, regionHitsRect, translate, turnBox, turnPoint, turnPort, turnRegion } from "@mark1russell7/layout-contract";
2
2
  // src/vector.ts
3
3
  /** A mutable two-dimensional vector. */
4
4
  var Vector = class Vector {
@@ -2559,6 +2559,14 @@ function hashInput(file) {
2559
2559
  const { hash: _hash, ...rest } = file;
2560
2560
  return sha256Hex(canonicalJson(rest)).slice(0, 16);
2561
2561
  }
2562
+ /**
2563
+ * This function gives the `outputHash` of an output. It is the first 16 hex characters of the SHA-256 of the canonical form of
2564
+ * its placements, sorted by id. The canonical form rounds each number with `round3`. Thus the order of the list does not count.
2565
+ * The records of the benchmark and the key of `packPortfolio` use it. It is not `outputHash` of the contract, which uses a grid.
2566
+ */
2567
+ function outputHash(output) {
2568
+ return sha256Hex(canonicalJson(output.placements.toSorted((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0))).slice(0, 16);
2569
+ }
2562
2570
  /** This function gives the scale of a count: the nearest of 1, 10, 100, 1000 and 10000 on a log scale. The count 0 gives `1`. */
2563
2571
  function countCell(count) {
2564
2572
  if (count <= 3) return "1";
@@ -3546,32 +3554,2222 @@ function toRects(output, rects, outer) {
3546
3554
  }
3547
3555
  return outer;
3548
3556
  }
3549
- // src/registry.ts
3550
- /** Each strategy of the package. The benchmark starts each one on each input of the corpus. */
3551
- const strategies = Object.freeze([
3552
- rows,
3553
- skyline,
3554
- shelf,
3555
- push,
3556
- maxrects
3557
- ]);
3558
- /** This function gives the strategy with an id. It throws a `RangeError` for an id that the registry does not have. */
3559
- function strategy(id) {
3560
- const found = strategies.find((s) => s.id === id);
3561
- if (found === void 0) throw new RangeError(`The registry has no strategy "${id}".`);
3562
- return found;
3557
+ // src/portfolio-sets.ts
3558
+ /** The table of the per-cell portfolio: the sets of 1, 2 and 3 members of each cell, with their training scores. The run 40652567756 gives it. */
3559
+ const PORTFOLIO_SETS = {
3560
+ "source": {
3561
+ "corpus": "pack-screen-v1",
3562
+ "run": "40652567756",
3563
+ "commit": "f6a489b",
3564
+ "inputs": 1305,
3565
+ "frameMs": 50
3566
+ },
3567
+ "entries": {
3568
+ "rows": {
3569
+ "id": "rows",
3570
+ "strategy": "rows"
3571
+ },
3572
+ "skyline": {
3573
+ "id": "skyline",
3574
+ "strategy": "skyline"
3575
+ },
3576
+ "shelf": {
3577
+ "id": "shelf",
3578
+ "strategy": "shelf"
3579
+ },
3580
+ "shelf-next": {
3581
+ "id": "shelf-next",
3582
+ "strategy": "shelf",
3583
+ "options": {
3584
+ "fit": "next",
3585
+ "sortOrder": "height-desc"
3586
+ }
3587
+ },
3588
+ "shelf-first": {
3589
+ "id": "shelf-first",
3590
+ "strategy": "shelf",
3591
+ "options": {
3592
+ "fit": "first",
3593
+ "sortOrder": "height-desc"
3594
+ }
3595
+ },
3596
+ "shelf-best": {
3597
+ "id": "shelf-best",
3598
+ "strategy": "shelf",
3599
+ "options": {
3600
+ "fit": "best",
3601
+ "sortOrder": "height-desc"
3602
+ }
3603
+ },
3604
+ "maxrects-bssf": {
3605
+ "id": "maxrects-bssf",
3606
+ "strategy": "maxrects",
3607
+ "options": { "rule": "bssf" }
3608
+ },
3609
+ "maxrects-blsf": {
3610
+ "id": "maxrects-blsf",
3611
+ "strategy": "maxrects",
3612
+ "options": { "rule": "blsf" }
3613
+ },
3614
+ "maxrects-baf": {
3615
+ "id": "maxrects-baf",
3616
+ "strategy": "maxrects",
3617
+ "options": { "rule": "baf" }
3618
+ },
3619
+ "maxrects-bl": {
3620
+ "id": "maxrects-bl",
3621
+ "strategy": "maxrects",
3622
+ "options": { "rule": "bl" }
3623
+ },
3624
+ "maxrects-cp": {
3625
+ "id": "maxrects-cp",
3626
+ "strategy": "maxrects",
3627
+ "options": { "rule": "cp" }
3628
+ }
3629
+ },
3630
+ "all": {
3631
+ "inputs": 1305,
3632
+ "thin": false,
3633
+ "sets": {
3634
+ "1": ["maxrects-bl"],
3635
+ "2": ["maxrects-bl", "shelf-best"],
3636
+ "3": [
3637
+ "maxrects-bl",
3638
+ "shelf-best",
3639
+ "maxrects-cp"
3640
+ ]
3641
+ },
3642
+ "train": {
3643
+ "1": {
3644
+ "inputs": 1305,
3645
+ "hardRegret": 0,
3646
+ "excessAreaRegret": .001,
3647
+ "fillRegret": .02,
3648
+ "wins": 838,
3649
+ "winShare": .642,
3650
+ "msMean": 4.92
3651
+ },
3652
+ "2": {
3653
+ "inputs": 1305,
3654
+ "hardRegret": 0,
3655
+ "excessAreaRegret": .001,
3656
+ "fillRegret": .011,
3657
+ "wins": 1033,
3658
+ "winShare": .792,
3659
+ "msMean": 9.582
3660
+ },
3661
+ "3": {
3662
+ "inputs": 1305,
3663
+ "hardRegret": 0,
3664
+ "excessAreaRegret": 0,
3665
+ "fillRegret": .006,
3666
+ "wins": 1126,
3667
+ "winShare": .863,
3668
+ "msMean": 22.228
3669
+ }
3670
+ },
3671
+ "prefixMedianMs": {
3672
+ "1": 1.015,
3673
+ "2": 2.004,
3674
+ "3": 3.074
3675
+ },
3676
+ "defaultMembers": 3
3677
+ },
3678
+ "shapes": {
3679
+ "circle": {
3680
+ "inputs": 210,
3681
+ "thin": false,
3682
+ "sets": {
3683
+ "1": ["maxrects-bl"],
3684
+ "2": ["maxrects-bl", "maxrects-cp"],
3685
+ "3": [
3686
+ "maxrects-bl",
3687
+ "maxrects-cp",
3688
+ "skyline"
3689
+ ]
3690
+ },
3691
+ "train": {
3692
+ "1": {
3693
+ "inputs": 210,
3694
+ "hardRegret": 0,
3695
+ "excessAreaRegret": .002,
3696
+ "fillRegret": .015,
3697
+ "wins": 140,
3698
+ "winShare": .667,
3699
+ "msMean": 10.026
3700
+ },
3701
+ "2": {
3702
+ "inputs": 210,
3703
+ "hardRegret": 0,
3704
+ "excessAreaRegret": 0,
3705
+ "fillRegret": .006,
3706
+ "wins": 162,
3707
+ "winShare": .771,
3708
+ "msMean": 35.829
3709
+ },
3710
+ "3": {
3711
+ "inputs": 210,
3712
+ "hardRegret": 0,
3713
+ "excessAreaRegret": 0,
3714
+ "fillRegret": .003,
3715
+ "wins": 184,
3716
+ "winShare": .876,
3717
+ "msMean": 46.593
3718
+ }
3719
+ },
3720
+ "prefixMedianMs": {
3721
+ "1": 3.441,
3722
+ "2": 7.24,
3723
+ "3": 10.252
3724
+ },
3725
+ "defaultMembers": 3
3726
+ },
3727
+ "convex": {
3728
+ "inputs": 210,
3729
+ "thin": false,
3730
+ "sets": {
3731
+ "1": ["maxrects-bl"],
3732
+ "2": ["maxrects-bl", "shelf-best"],
3733
+ "3": [
3734
+ "maxrects-bl",
3735
+ "shelf-best",
3736
+ "maxrects-cp"
3737
+ ]
3738
+ },
3739
+ "train": {
3740
+ "1": {
3741
+ "inputs": 210,
3742
+ "hardRegret": 0,
3743
+ "excessAreaRegret": .002,
3744
+ "fillRegret": .015,
3745
+ "wins": 134,
3746
+ "winShare": .638,
3747
+ "msMean": 6.123
3748
+ },
3749
+ "2": {
3750
+ "inputs": 210,
3751
+ "hardRegret": 0,
3752
+ "excessAreaRegret": .002,
3753
+ "fillRegret": .004,
3754
+ "wins": 188,
3755
+ "winShare": .895,
3756
+ "msMean": 11.606
3757
+ },
3758
+ "3": {
3759
+ "inputs": 210,
3760
+ "hardRegret": 0,
3761
+ "excessAreaRegret": .001,
3762
+ "fillRegret": .002,
3763
+ "wins": 197,
3764
+ "winShare": .938,
3765
+ "msMean": 26.072
3766
+ }
3767
+ },
3768
+ "prefixMedianMs": {
3769
+ "1": 2.133,
3770
+ "2": 3.31,
3771
+ "3": 7.783
3772
+ },
3773
+ "defaultMembers": 3
3774
+ },
3775
+ "ellipse": {
3776
+ "inputs": 210,
3777
+ "thin": false,
3778
+ "sets": {
3779
+ "1": ["maxrects-bl"],
3780
+ "2": ["maxrects-bl", "maxrects-cp"],
3781
+ "3": [
3782
+ "maxrects-bl",
3783
+ "maxrects-cp",
3784
+ "skyline"
3785
+ ]
3786
+ },
3787
+ "train": {
3788
+ "1": {
3789
+ "inputs": 210,
3790
+ "hardRegret": 0,
3791
+ "excessAreaRegret": 0,
3792
+ "fillRegret": .024,
3793
+ "wins": 138,
3794
+ "winShare": .657,
3795
+ "msMean": 9.772
3796
+ },
3797
+ "2": {
3798
+ "inputs": 210,
3799
+ "hardRegret": 0,
3800
+ "excessAreaRegret": 0,
3801
+ "fillRegret": .008,
3802
+ "wins": 162,
3803
+ "winShare": .771,
3804
+ "msMean": 34.101
3805
+ },
3806
+ "3": {
3807
+ "inputs": 210,
3808
+ "hardRegret": 0,
3809
+ "excessAreaRegret": 0,
3810
+ "fillRegret": .005,
3811
+ "wins": 184,
3812
+ "winShare": .876,
3813
+ "msMean": 49.128
3814
+ }
3815
+ },
3816
+ "prefixMedianMs": {
3817
+ "1": 3.553,
3818
+ "2": 7.079,
3819
+ "3": 11.095
3820
+ },
3821
+ "defaultMembers": 3
3822
+ },
3823
+ "holes": {
3824
+ "inputs": 210,
3825
+ "thin": false,
3826
+ "sets": {
3827
+ "1": ["maxrects-bl"],
3828
+ "2": ["maxrects-bl", "shelf-first"],
3829
+ "3": [
3830
+ "maxrects-bl",
3831
+ "shelf-first",
3832
+ "maxrects-cp"
3833
+ ]
3834
+ },
3835
+ "train": {
3836
+ "1": {
3837
+ "inputs": 210,
3838
+ "hardRegret": 0,
3839
+ "excessAreaRegret": .001,
3840
+ "fillRegret": .016,
3841
+ "wins": 131,
3842
+ "winShare": .624,
3843
+ "msMean": 2.009
3844
+ },
3845
+ "2": {
3846
+ "inputs": 210,
3847
+ "hardRegret": 0,
3848
+ "excessAreaRegret": .001,
3849
+ "fillRegret": .011,
3850
+ "wins": 163,
3851
+ "winShare": .776,
3852
+ "msMean": 8.29
3853
+ },
3854
+ "3": {
3855
+ "inputs": 210,
3856
+ "hardRegret": 0,
3857
+ "excessAreaRegret": 0,
3858
+ "fillRegret": .005,
3859
+ "wins": 183,
3860
+ "winShare": .871,
3861
+ "msMean": 13.146
3862
+ }
3863
+ },
3864
+ "prefixMedianMs": {
3865
+ "1": .755,
3866
+ "2": 1.626,
3867
+ "3": 2.455
3868
+ },
3869
+ "defaultMembers": 3
3870
+ },
3871
+ "polygon": {
3872
+ "inputs": 210,
3873
+ "thin": false,
3874
+ "sets": {
3875
+ "1": ["maxrects-bl"],
3876
+ "2": ["maxrects-bl", "shelf-best"],
3877
+ "3": [
3878
+ "maxrects-bl",
3879
+ "shelf-best",
3880
+ "maxrects-blsf"
3881
+ ]
3882
+ },
3883
+ "train": {
3884
+ "1": {
3885
+ "inputs": 210,
3886
+ "hardRegret": 0,
3887
+ "excessAreaRegret": 0,
3888
+ "fillRegret": .03,
3889
+ "wins": 130,
3890
+ "winShare": .619,
3891
+ "msMean": 1.663
3892
+ },
3893
+ "2": {
3894
+ "inputs": 210,
3895
+ "hardRegret": 0,
3896
+ "excessAreaRegret": 0,
3897
+ "fillRegret": .012,
3898
+ "wins": 180,
3899
+ "winShare": .857,
3900
+ "msMean": 7.39
3901
+ },
3902
+ "3": {
3903
+ "inputs": 210,
3904
+ "hardRegret": 0,
3905
+ "excessAreaRegret": 0,
3906
+ "fillRegret": .004,
3907
+ "wins": 193,
3908
+ "winShare": .919,
3909
+ "msMean": 8.701
3910
+ }
3911
+ },
3912
+ "prefixMedianMs": {
3913
+ "1": .477,
3914
+ "2": 1.176,
3915
+ "3": 1.636
3916
+ },
3917
+ "defaultMembers": 3
3918
+ },
3919
+ "rect": {
3920
+ "inputs": 255,
3921
+ "thin": false,
3922
+ "sets": {
3923
+ "1": ["maxrects-bl"],
3924
+ "2": ["maxrects-bl", "shelf-best"],
3925
+ "3": [
3926
+ "maxrects-bl",
3927
+ "shelf-best",
3928
+ "maxrects-blsf"
3929
+ ]
3930
+ },
3931
+ "train": {
3932
+ "1": {
3933
+ "inputs": 255,
3934
+ "hardRegret": 0,
3935
+ "excessAreaRegret": 0,
3936
+ "fillRegret": .019,
3937
+ "wins": 165,
3938
+ "winShare": .647,
3939
+ "msMean": .808
3940
+ },
3941
+ "2": {
3942
+ "inputs": 255,
3943
+ "hardRegret": 0,
3944
+ "excessAreaRegret": 0,
3945
+ "fillRegret": .007,
3946
+ "wins": 212,
3947
+ "winShare": .831,
3948
+ "msMean": 2.807
3949
+ },
3950
+ "3": {
3951
+ "inputs": 255,
3952
+ "hardRegret": 0,
3953
+ "excessAreaRegret": 0,
3954
+ "fillRegret": .003,
3955
+ "wins": 225,
3956
+ "winShare": .882,
3957
+ "msMean": 3.514
3958
+ }
3959
+ },
3960
+ "prefixMedianMs": {
3961
+ "1": .094,
3962
+ "2": .426,
3963
+ "3": .582
3964
+ },
3965
+ "defaultMembers": 3
3966
+ }
3967
+ },
3968
+ "cells": {
3969
+ "circle/10/heavyTail": {
3970
+ "inputs": 35,
3971
+ "thin": false,
3972
+ "sets": {
3973
+ "1": ["maxrects-cp"],
3974
+ "2": ["maxrects-cp", "maxrects-bl"],
3975
+ "3": [
3976
+ "maxrects-cp",
3977
+ "maxrects-bl",
3978
+ "skyline"
3979
+ ]
3980
+ },
3981
+ "train": {
3982
+ "1": {
3983
+ "inputs": 35,
3984
+ "hardRegret": 0,
3985
+ "excessAreaRegret": .004,
3986
+ "fillRegret": .073,
3987
+ "wins": 10,
3988
+ "winShare": .286,
3989
+ "msMean": .886
3990
+ },
3991
+ "2": {
3992
+ "inputs": 35,
3993
+ "hardRegret": 0,
3994
+ "excessAreaRegret": 0,
3995
+ "fillRegret": .014,
3996
+ "wins": 20,
3997
+ "winShare": .571,
3998
+ "msMean": 1.82
3999
+ },
4000
+ "3": {
4001
+ "inputs": 35,
4002
+ "hardRegret": 0,
4003
+ "excessAreaRegret": 0,
4004
+ "fillRegret": .01,
4005
+ "wins": 28,
4006
+ "winShare": .8,
4007
+ "msMean": 2.277
4008
+ }
4009
+ },
4010
+ "prefixMedianMs": {
4011
+ "1": .938,
4012
+ "2": 1.86,
4013
+ "3": 2.105
4014
+ },
4015
+ "defaultMembers": 3
4016
+ },
4017
+ "circle/10/uniform": {
4018
+ "inputs": 35,
4019
+ "thin": false,
4020
+ "sets": {
4021
+ "1": ["maxrects-bl"],
4022
+ "2": ["maxrects-bl", "skyline"],
4023
+ "3": [
4024
+ "maxrects-bl",
4025
+ "skyline",
4026
+ "maxrects-cp"
4027
+ ]
4028
+ },
4029
+ "train": {
4030
+ "1": {
4031
+ "inputs": 35,
4032
+ "hardRegret": 0,
4033
+ "excessAreaRegret": 0,
4034
+ "fillRegret": .025,
4035
+ "wins": 14,
4036
+ "winShare": .4,
4037
+ "msMean": 1.028
4038
+ },
4039
+ "2": {
4040
+ "inputs": 35,
4041
+ "hardRegret": 0,
4042
+ "excessAreaRegret": 0,
4043
+ "fillRegret": .009,
4044
+ "wins": 28,
4045
+ "winShare": .8,
4046
+ "msMean": 1.317
4047
+ },
4048
+ "3": {
4049
+ "inputs": 35,
4050
+ "hardRegret": 0,
4051
+ "excessAreaRegret": 0,
4052
+ "fillRegret": .007,
4053
+ "wins": 32,
4054
+ "winShare": .914,
4055
+ "msMean": 2.411
4056
+ }
4057
+ },
4058
+ "prefixMedianMs": {
4059
+ "1": .971,
4060
+ "2": 1.237,
4061
+ "3": 2.388
4062
+ },
4063
+ "defaultMembers": 3
4064
+ },
4065
+ "circle/100/heavyTail": {
4066
+ "inputs": 35,
4067
+ "thin": false,
4068
+ "sets": {
4069
+ "1": ["maxrects-bl"],
4070
+ "2": ["maxrects-bl", "maxrects-bssf"],
4071
+ "3": [
4072
+ "maxrects-bl",
4073
+ "maxrects-bssf",
4074
+ "maxrects-cp"
4075
+ ]
4076
+ },
4077
+ "train": {
4078
+ "1": {
4079
+ "inputs": 35,
4080
+ "hardRegret": 0,
4081
+ "excessAreaRegret": .001,
4082
+ "fillRegret": .004,
4083
+ "wins": 26,
4084
+ "winShare": .743,
4085
+ "msMean": 3.076
4086
+ },
4087
+ "2": {
4088
+ "inputs": 35,
4089
+ "hardRegret": 0,
4090
+ "excessAreaRegret": 0,
4091
+ "fillRegret": .004,
4092
+ "wins": 30,
4093
+ "winShare": .857,
4094
+ "msMean": 5.932
4095
+ },
4096
+ "3": {
4097
+ "inputs": 35,
4098
+ "hardRegret": 0,
4099
+ "excessAreaRegret": 0,
4100
+ "fillRegret": .001,
4101
+ "wins": 33,
4102
+ "winShare": .943,
4103
+ "msMean": 8.775
4104
+ }
4105
+ },
4106
+ "prefixMedianMs": {
4107
+ "1": 2.837,
4108
+ "2": 5.774,
4109
+ "3": 8.149
4110
+ },
4111
+ "defaultMembers": 3
4112
+ },
4113
+ "circle/100/uniform": {
4114
+ "inputs": 35,
4115
+ "thin": false,
4116
+ "sets": {
4117
+ "1": ["maxrects-bl"],
4118
+ "2": ["maxrects-bl", "maxrects-cp"],
4119
+ "3": ["maxrects-bl", "maxrects-cp"]
4120
+ },
4121
+ "train": {
4122
+ "1": {
4123
+ "inputs": 35,
4124
+ "hardRegret": 0,
4125
+ "excessAreaRegret": 0,
4126
+ "fillRegret": .005,
4127
+ "wins": 30,
4128
+ "winShare": .857,
4129
+ "msMean": 4.611
4130
+ },
4131
+ "2": {
4132
+ "inputs": 35,
4133
+ "hardRegret": 0,
4134
+ "excessAreaRegret": 0,
4135
+ "fillRegret": 0,
4136
+ "wins": 35,
4137
+ "winShare": 1,
4138
+ "msMean": 14.686
4139
+ },
4140
+ "3": {
4141
+ "inputs": 35,
4142
+ "hardRegret": 0,
4143
+ "excessAreaRegret": 0,
4144
+ "fillRegret": 0,
4145
+ "wins": 35,
4146
+ "winShare": 1,
4147
+ "msMean": 14.686
4148
+ }
4149
+ },
4150
+ "prefixMedianMs": {
4151
+ "1": 4.648,
4152
+ "2": 14.826,
4153
+ "3": 14.826
4154
+ },
4155
+ "defaultMembers": 2
4156
+ },
4157
+ "circle/1k/heavyTail": {
4158
+ "inputs": 35,
4159
+ "thin": false,
4160
+ "sets": {
4161
+ "1": ["maxrects-bssf"],
4162
+ "2": ["maxrects-bssf", "maxrects-blsf"],
4163
+ "3": [
4164
+ "maxrects-bssf",
4165
+ "maxrects-blsf",
4166
+ "maxrects-bl"
4167
+ ]
4168
+ },
4169
+ "train": {
4170
+ "1": {
4171
+ "inputs": 35,
4172
+ "hardRegret": 0,
4173
+ "excessAreaRegret": 0,
4174
+ "fillRegret": .002,
4175
+ "wins": 33,
4176
+ "winShare": .943,
4177
+ "msMean": 6.063
4178
+ },
4179
+ "2": {
4180
+ "inputs": 35,
4181
+ "hardRegret": 0,
4182
+ "excessAreaRegret": 0,
4183
+ "fillRegret": .002,
4184
+ "wins": 34,
4185
+ "winShare": .971,
4186
+ "msMean": 11.397
4187
+ },
4188
+ "3": {
4189
+ "inputs": 35,
4190
+ "hardRegret": 0,
4191
+ "excessAreaRegret": 0,
4192
+ "fillRegret": 0,
4193
+ "wins": 35,
4194
+ "winShare": 1,
4195
+ "msMean": 17.653
4196
+ }
4197
+ },
4198
+ "prefixMedianMs": {
4199
+ "1": 5.498,
4200
+ "2": 9.771,
4201
+ "3": 14.704
4202
+ },
4203
+ "defaultMembers": 3
4204
+ },
4205
+ "circle/1k/uniform": {
4206
+ "inputs": 35,
4207
+ "thin": false,
4208
+ "sets": {
4209
+ "1": ["maxrects-bl"],
4210
+ "2": ["maxrects-bl", "shelf-best"],
4211
+ "3": ["maxrects-bl", "shelf-best"]
4212
+ },
4213
+ "train": {
4214
+ "1": {
4215
+ "inputs": 35,
4216
+ "hardRegret": 0,
4217
+ "excessAreaRegret": 0,
4218
+ "fillRegret": .001,
4219
+ "wins": 31,
4220
+ "winShare": .886,
4221
+ "msMean": 44.25
4222
+ },
4223
+ "2": {
4224
+ "inputs": 35,
4225
+ "hardRegret": 0,
4226
+ "excessAreaRegret": 0,
4227
+ "fillRegret": 0,
4228
+ "wins": 35,
4229
+ "winShare": 1,
4230
+ "msMean": 56.133
4231
+ },
4232
+ "3": {
4233
+ "inputs": 35,
4234
+ "hardRegret": 0,
4235
+ "excessAreaRegret": 0,
4236
+ "fillRegret": 0,
4237
+ "wins": 35,
4238
+ "winShare": 1,
4239
+ "msMean": 56.133
4240
+ }
4241
+ },
4242
+ "prefixMedianMs": {
4243
+ "1": 46.745,
4244
+ "2": 58.961,
4245
+ "3": 58.961
4246
+ },
4247
+ "defaultMembers": 1
4248
+ },
4249
+ "convex/10/heavyTail": {
4250
+ "inputs": 35,
4251
+ "thin": false,
4252
+ "sets": {
4253
+ "1": ["maxrects-cp"],
4254
+ "2": ["maxrects-cp", "maxrects-baf"],
4255
+ "3": [
4256
+ "maxrects-cp",
4257
+ "maxrects-baf",
4258
+ "maxrects-bl"
4259
+ ]
4260
+ },
4261
+ "train": {
4262
+ "1": {
4263
+ "inputs": 35,
4264
+ "hardRegret": 0,
4265
+ "excessAreaRegret": .007,
4266
+ "fillRegret": .208,
4267
+ "wins": 5,
4268
+ "winShare": .143,
4269
+ "msMean": .577
4270
+ },
4271
+ "2": {
4272
+ "inputs": 35,
4273
+ "hardRegret": 0,
4274
+ "excessAreaRegret": .001,
4275
+ "fillRegret": .143,
4276
+ "wins": 7,
4277
+ "winShare": .2,
4278
+ "msMean": 1.46
4279
+ },
4280
+ "3": {
4281
+ "inputs": 35,
4282
+ "hardRegret": 0,
4283
+ "excessAreaRegret": 0,
4284
+ "fillRegret": .016,
4285
+ "wins": 26,
4286
+ "winShare": .743,
4287
+ "msMean": 2.184
4288
+ }
4289
+ },
4290
+ "prefixMedianMs": {
4291
+ "1": .513,
4292
+ "2": 1.303,
4293
+ "3": 1.931
4294
+ },
4295
+ "defaultMembers": 3
4296
+ },
4297
+ "convex/10/uniform": {
4298
+ "inputs": 35,
4299
+ "thin": false,
4300
+ "sets": {
4301
+ "1": ["maxrects-bl"],
4302
+ "2": ["maxrects-bl", "maxrects-cp"],
4303
+ "3": [
4304
+ "maxrects-bl",
4305
+ "maxrects-cp",
4306
+ "maxrects-bssf"
4307
+ ]
4308
+ },
4309
+ "train": {
4310
+ "1": {
4311
+ "inputs": 35,
4312
+ "hardRegret": 0,
4313
+ "excessAreaRegret": 0,
4314
+ "fillRegret": .012,
4315
+ "wins": 26,
4316
+ "winShare": .743,
4317
+ "msMean": .786
4318
+ },
4319
+ "2": {
4320
+ "inputs": 35,
4321
+ "hardRegret": 0,
4322
+ "excessAreaRegret": 0,
4323
+ "fillRegret": .005,
4324
+ "wins": 30,
4325
+ "winShare": .857,
4326
+ "msMean": 1.482
4327
+ },
4328
+ "3": {
4329
+ "inputs": 35,
4330
+ "hardRegret": 0,
4331
+ "excessAreaRegret": 0,
4332
+ "fillRegret": .002,
4333
+ "wins": 32,
4334
+ "winShare": .914,
4335
+ "msMean": 2.348
4336
+ }
4337
+ },
4338
+ "prefixMedianMs": {
4339
+ "1": .71,
4340
+ "2": 1.316,
4341
+ "3": 2.22
4342
+ },
4343
+ "defaultMembers": 3
4344
+ },
4345
+ "convex/100/heavyTail": {
4346
+ "inputs": 35,
4347
+ "thin": false,
4348
+ "sets": {
4349
+ "1": ["maxrects-bl"],
4350
+ "2": ["maxrects-bl", "maxrects-cp"],
4351
+ "3": [
4352
+ "maxrects-bl",
4353
+ "maxrects-cp",
4354
+ "maxrects-bssf"
4355
+ ]
4356
+ },
4357
+ "train": {
4358
+ "1": {
4359
+ "inputs": 35,
4360
+ "hardRegret": 0,
4361
+ "excessAreaRegret": 0,
4362
+ "fillRegret": .001,
4363
+ "wins": 32,
4364
+ "winShare": .914,
4365
+ "msMean": 2.416
4366
+ },
4367
+ "2": {
4368
+ "inputs": 35,
4369
+ "hardRegret": 0,
4370
+ "excessAreaRegret": 0,
4371
+ "fillRegret": 0,
4372
+ "wins": 34,
4373
+ "winShare": .971,
4374
+ "msMean": 5.037
4375
+ },
4376
+ "3": {
4377
+ "inputs": 35,
4378
+ "hardRegret": 0,
4379
+ "excessAreaRegret": 0,
4380
+ "fillRegret": 0,
4381
+ "wins": 35,
4382
+ "winShare": 1,
4383
+ "msMean": 7.013
4384
+ }
4385
+ },
4386
+ "prefixMedianMs": {
4387
+ "1": 2.083,
4388
+ "2": 4.342,
4389
+ "3": 5.664
4390
+ },
4391
+ "defaultMembers": 3
4392
+ },
4393
+ "convex/100/uniform": {
4394
+ "inputs": 35,
4395
+ "thin": false,
4396
+ "sets": {
4397
+ "1": ["maxrects-bl"],
4398
+ "2": ["maxrects-bl", "shelf"],
4399
+ "3": [
4400
+ "maxrects-bl",
4401
+ "shelf",
4402
+ "shelf-first"
4403
+ ]
4404
+ },
4405
+ "train": {
4406
+ "1": {
4407
+ "inputs": 35,
4408
+ "hardRegret": 0,
4409
+ "excessAreaRegret": 0,
4410
+ "fillRegret": .007,
4411
+ "wins": 21,
4412
+ "winShare": .6,
4413
+ "msMean": 3.347
4414
+ },
4415
+ "2": {
4416
+ "inputs": 35,
4417
+ "hardRegret": 0,
4418
+ "excessAreaRegret": 0,
4419
+ "fillRegret": .001,
4420
+ "wins": 33,
4421
+ "winShare": .943,
4422
+ "msMean": 3.533
4423
+ },
4424
+ "3": {
4425
+ "inputs": 35,
4426
+ "hardRegret": 0,
4427
+ "excessAreaRegret": 0,
4428
+ "fillRegret": .001,
4429
+ "wins": 34,
4430
+ "winShare": .971,
4431
+ "msMean": 4.004
4432
+ }
4433
+ },
4434
+ "prefixMedianMs": {
4435
+ "1": 3.337,
4436
+ "2": 3.513,
4437
+ "3": 3.956
4438
+ },
4439
+ "defaultMembers": 3
4440
+ },
4441
+ "convex/1k/heavyTail": {
4442
+ "inputs": 35,
4443
+ "thin": false,
4444
+ "sets": {
4445
+ "1": ["maxrects-cp"],
4446
+ "2": ["maxrects-cp"],
4447
+ "3": ["maxrects-cp"]
4448
+ },
4449
+ "train": {
4450
+ "1": {
4451
+ "inputs": 35,
4452
+ "hardRegret": 0,
4453
+ "excessAreaRegret": -.001,
4454
+ "fillRegret": -.001,
4455
+ "wins": 35,
4456
+ "winShare": 1,
4457
+ "msMean": 3.71
4458
+ },
4459
+ "2": {
4460
+ "inputs": 35,
4461
+ "hardRegret": 0,
4462
+ "excessAreaRegret": -.001,
4463
+ "fillRegret": -.001,
4464
+ "wins": 35,
4465
+ "winShare": 1,
4466
+ "msMean": 3.71
4467
+ },
4468
+ "3": {
4469
+ "inputs": 35,
4470
+ "hardRegret": 0,
4471
+ "excessAreaRegret": -.001,
4472
+ "fillRegret": -.001,
4473
+ "wins": 35,
4474
+ "winShare": 1,
4475
+ "msMean": 3.71
4476
+ }
4477
+ },
4478
+ "prefixMedianMs": {
4479
+ "1": 2.383,
4480
+ "2": 2.383,
4481
+ "3": 2.383
4482
+ },
4483
+ "defaultMembers": 1
4484
+ },
4485
+ "convex/1k/uniform": {
4486
+ "inputs": 35,
4487
+ "thin": false,
4488
+ "sets": {
4489
+ "1": ["shelf-best"],
4490
+ "2": ["shelf-best"],
4491
+ "3": ["shelf-best"]
4492
+ },
4493
+ "train": {
4494
+ "1": {
4495
+ "inputs": 35,
4496
+ "hardRegret": 0,
4497
+ "excessAreaRegret": 0,
4498
+ "fillRegret": .001,
4499
+ "wins": 35,
4500
+ "winShare": 1,
4501
+ "msMean": 19.138
4502
+ },
4503
+ "2": {
4504
+ "inputs": 35,
4505
+ "hardRegret": 0,
4506
+ "excessAreaRegret": 0,
4507
+ "fillRegret": .001,
4508
+ "wins": 35,
4509
+ "winShare": 1,
4510
+ "msMean": 19.138
4511
+ },
4512
+ "3": {
4513
+ "inputs": 35,
4514
+ "hardRegret": 0,
4515
+ "excessAreaRegret": 0,
4516
+ "fillRegret": .001,
4517
+ "wins": 35,
4518
+ "winShare": 1,
4519
+ "msMean": 19.138
4520
+ }
4521
+ },
4522
+ "prefixMedianMs": {
4523
+ "1": 18.965,
4524
+ "2": 18.965,
4525
+ "3": 18.965
4526
+ },
4527
+ "defaultMembers": 1
4528
+ },
4529
+ "ellipse/10/heavyTail": {
4530
+ "inputs": 35,
4531
+ "thin": false,
4532
+ "sets": {
4533
+ "1": ["maxrects-cp"],
4534
+ "2": ["maxrects-cp", "skyline"],
4535
+ "3": [
4536
+ "maxrects-cp",
4537
+ "skyline",
4538
+ "shelf"
4539
+ ]
4540
+ },
4541
+ "train": {
4542
+ "1": {
4543
+ "inputs": 35,
4544
+ "hardRegret": 0,
4545
+ "excessAreaRegret": .005,
4546
+ "fillRegret": .061,
4547
+ "wins": 12,
4548
+ "winShare": .343,
4549
+ "msMean": .896
4550
+ },
4551
+ "2": {
4552
+ "inputs": 35,
4553
+ "hardRegret": 0,
4554
+ "excessAreaRegret": .001,
4555
+ "fillRegret": .026,
4556
+ "wins": 19,
4557
+ "winShare": .543,
4558
+ "msMean": 1.675
4559
+ },
4560
+ "3": {
4561
+ "inputs": 35,
4562
+ "hardRegret": 0,
4563
+ "excessAreaRegret": .001,
4564
+ "fillRegret": .016,
4565
+ "wins": 23,
4566
+ "winShare": .657,
4567
+ "msMean": 1.684
4568
+ }
4569
+ },
4570
+ "prefixMedianMs": {
4571
+ "1": .815,
4572
+ "2": 1.348,
4573
+ "3": 1.356
4574
+ },
4575
+ "defaultMembers": 3
4576
+ },
4577
+ "ellipse/10/uniform": {
4578
+ "inputs": 35,
4579
+ "thin": false,
4580
+ "sets": {
4581
+ "1": ["skyline"],
4582
+ "2": ["skyline", "maxrects-cp"],
4583
+ "3": [
4584
+ "skyline",
4585
+ "maxrects-cp",
4586
+ "maxrects-bl"
4587
+ ]
4588
+ },
4589
+ "train": {
4590
+ "1": {
4591
+ "inputs": 35,
4592
+ "hardRegret": 0,
4593
+ "excessAreaRegret": .003,
4594
+ "fillRegret": .059,
4595
+ "wins": 16,
4596
+ "winShare": .457,
4597
+ "msMean": .362
4598
+ },
4599
+ "2": {
4600
+ "inputs": 35,
4601
+ "hardRegret": 0,
4602
+ "excessAreaRegret": 0,
4603
+ "fillRegret": .021,
4604
+ "wins": 25,
4605
+ "winShare": .714,
4606
+ "msMean": 1.407
4607
+ },
4608
+ "3": {
4609
+ "inputs": 35,
4610
+ "hardRegret": 0,
4611
+ "excessAreaRegret": 0,
4612
+ "fillRegret": .005,
4613
+ "wins": 33,
4614
+ "winShare": .943,
4615
+ "msMean": 2.39
4616
+ }
4617
+ },
4618
+ "prefixMedianMs": {
4619
+ "1": .272,
4620
+ "2": 1.286,
4621
+ "3": 2.153
4622
+ },
4623
+ "defaultMembers": 3
4624
+ },
4625
+ "ellipse/100/heavyTail": {
4626
+ "inputs": 35,
4627
+ "thin": false,
4628
+ "sets": {
4629
+ "1": ["maxrects-bl"],
4630
+ "2": ["maxrects-bl", "maxrects-bssf"],
4631
+ "3": [
4632
+ "maxrects-bl",
4633
+ "maxrects-bssf",
4634
+ "maxrects-baf"
4635
+ ]
4636
+ },
4637
+ "train": {
4638
+ "1": {
4639
+ "inputs": 35,
4640
+ "hardRegret": 0,
4641
+ "excessAreaRegret": .001,
4642
+ "fillRegret": .003,
4643
+ "wins": 27,
4644
+ "winShare": .771,
4645
+ "msMean": 3.074
4646
+ },
4647
+ "2": {
4648
+ "inputs": 35,
4649
+ "hardRegret": 0,
4650
+ "excessAreaRegret": 0,
4651
+ "fillRegret": .003,
4652
+ "wins": 32,
4653
+ "winShare": .914,
4654
+ "msMean": 5.854
4655
+ },
4656
+ "3": {
4657
+ "inputs": 35,
4658
+ "hardRegret": 0,
4659
+ "excessAreaRegret": 0,
4660
+ "fillRegret": .002,
4661
+ "wins": 33,
4662
+ "winShare": .943,
4663
+ "msMean": 8.393
4664
+ }
4665
+ },
4666
+ "prefixMedianMs": {
4667
+ "1": 2.802,
4668
+ "2": 5.274,
4669
+ "3": 7.336
4670
+ },
4671
+ "defaultMembers": 3
4672
+ },
4673
+ "ellipse/100/uniform": {
4674
+ "inputs": 35,
4675
+ "thin": false,
4676
+ "sets": {
4677
+ "1": ["maxrects-bl"],
4678
+ "2": ["maxrects-bl", "skyline"],
4679
+ "3": [
4680
+ "maxrects-bl",
4681
+ "skyline",
4682
+ "maxrects-cp"
4683
+ ]
4684
+ },
4685
+ "train": {
4686
+ "1": {
4687
+ "inputs": 35,
4688
+ "hardRegret": 0,
4689
+ "excessAreaRegret": 0,
4690
+ "fillRegret": .002,
4691
+ "wins": 30,
4692
+ "winShare": .857,
4693
+ "msMean": 5.351
4694
+ },
4695
+ "2": {
4696
+ "inputs": 35,
4697
+ "hardRegret": 0,
4698
+ "excessAreaRegret": 0,
4699
+ "fillRegret": .001,
4700
+ "wins": 34,
4701
+ "winShare": .971,
4702
+ "msMean": 7.226
4703
+ },
4704
+ "3": {
4705
+ "inputs": 35,
4706
+ "hardRegret": 0,
4707
+ "excessAreaRegret": 0,
4708
+ "fillRegret": 0,
4709
+ "wins": 35,
4710
+ "winShare": 1,
4711
+ "msMean": 17.469
4712
+ }
4713
+ },
4714
+ "prefixMedianMs": {
4715
+ "1": 5.179,
4716
+ "2": 7.083,
4717
+ "3": 17.026
4718
+ },
4719
+ "defaultMembers": 3
4720
+ },
4721
+ "ellipse/1k/heavyTail": {
4722
+ "inputs": 35,
4723
+ "thin": false,
4724
+ "sets": {
4725
+ "1": ["maxrects-bssf"],
4726
+ "2": ["maxrects-bssf", "maxrects-baf"],
4727
+ "3": [
4728
+ "maxrects-bssf",
4729
+ "maxrects-baf",
4730
+ "maxrects-cp"
4731
+ ]
4732
+ },
4733
+ "train": {
4734
+ "1": {
4735
+ "inputs": 35,
4736
+ "hardRegret": 0,
4737
+ "excessAreaRegret": 0,
4738
+ "fillRegret": .003,
4739
+ "wins": 30,
4740
+ "winShare": .857,
4741
+ "msMean": 5.533
4742
+ },
4743
+ "2": {
4744
+ "inputs": 35,
4745
+ "hardRegret": 0,
4746
+ "excessAreaRegret": 0,
4747
+ "fillRegret": .002,
4748
+ "wins": 32,
4749
+ "winShare": .914,
4750
+ "msMean": 11.173
4751
+ },
4752
+ "3": {
4753
+ "inputs": 35,
4754
+ "hardRegret": 0,
4755
+ "excessAreaRegret": 0,
4756
+ "fillRegret": .002,
4757
+ "wins": 33,
4758
+ "winShare": .943,
4759
+ "msMean": 16.218
4760
+ }
4761
+ },
4762
+ "prefixMedianMs": {
4763
+ "1": 5.067,
4764
+ "2": 9.708,
4765
+ "3": 13.112
4766
+ },
4767
+ "defaultMembers": 3
4768
+ },
4769
+ "ellipse/1k/uniform": {
4770
+ "inputs": 35,
4771
+ "thin": false,
4772
+ "sets": {
4773
+ "1": ["maxrects-bl"],
4774
+ "2": ["maxrects-bl"],
4775
+ "3": ["maxrects-bl"]
4776
+ },
4777
+ "train": {
4778
+ "1": {
4779
+ "inputs": 35,
4780
+ "hardRegret": 0,
4781
+ "excessAreaRegret": 0,
4782
+ "fillRegret": 0,
4783
+ "wins": 35,
4784
+ "winShare": 1,
4785
+ "msMean": 42.562
4786
+ },
4787
+ "2": {
4788
+ "inputs": 35,
4789
+ "hardRegret": 0,
4790
+ "excessAreaRegret": 0,
4791
+ "fillRegret": 0,
4792
+ "wins": 35,
4793
+ "winShare": 1,
4794
+ "msMean": 42.562
4795
+ },
4796
+ "3": {
4797
+ "inputs": 35,
4798
+ "hardRegret": 0,
4799
+ "excessAreaRegret": 0,
4800
+ "fillRegret": 0,
4801
+ "wins": 35,
4802
+ "winShare": 1,
4803
+ "msMean": 42.562
4804
+ }
4805
+ },
4806
+ "prefixMedianMs": {
4807
+ "1": 43.159,
4808
+ "2": 43.159,
4809
+ "3": 43.159
4810
+ },
4811
+ "defaultMembers": 1
4812
+ },
4813
+ "holes/10/heavyTail": {
4814
+ "inputs": 35,
4815
+ "thin": false,
4816
+ "sets": {
4817
+ "1": ["maxrects-bl"],
4818
+ "2": ["maxrects-bl", "maxrects-cp"],
4819
+ "3": [
4820
+ "maxrects-bl",
4821
+ "maxrects-cp",
4822
+ "maxrects-blsf"
4823
+ ]
4824
+ },
4825
+ "train": {
4826
+ "1": {
4827
+ "inputs": 35,
4828
+ "hardRegret": 0,
4829
+ "excessAreaRegret": .001,
4830
+ "fillRegret": .05,
4831
+ "wins": 19,
4832
+ "winShare": .543,
4833
+ "msMean": .392
4834
+ },
4835
+ "2": {
4836
+ "inputs": 35,
4837
+ "hardRegret": 0,
4838
+ "excessAreaRegret": 0,
4839
+ "fillRegret": .019,
4840
+ "wins": 26,
4841
+ "winShare": .743,
4842
+ "msMean": .671
4843
+ },
4844
+ "3": {
4845
+ "inputs": 35,
4846
+ "hardRegret": 0,
4847
+ "excessAreaRegret": 0,
4848
+ "fillRegret": .01,
4849
+ "wins": 30,
4850
+ "winShare": .857,
4851
+ "msMean": 1.068
4852
+ }
4853
+ },
4854
+ "prefixMedianMs": {
4855
+ "1": .377,
4856
+ "2": .652,
4857
+ "3": 1.036
4858
+ },
4859
+ "defaultMembers": 3
4860
+ },
4861
+ "holes/10/uniform": {
4862
+ "inputs": 35,
4863
+ "thin": false,
4864
+ "sets": {
4865
+ "1": ["maxrects-bl"],
4866
+ "2": ["maxrects-bl", "maxrects-baf"],
4867
+ "3": [
4868
+ "maxrects-bl",
4869
+ "maxrects-baf",
4870
+ "shelf-best"
4871
+ ]
4872
+ },
4873
+ "train": {
4874
+ "1": {
4875
+ "inputs": 35,
4876
+ "hardRegret": 0,
4877
+ "excessAreaRegret": 0,
4878
+ "fillRegret": .014,
4879
+ "wins": 23,
4880
+ "winShare": .657,
4881
+ "msMean": .4
4882
+ },
4883
+ "2": {
4884
+ "inputs": 35,
4885
+ "hardRegret": 0,
4886
+ "excessAreaRegret": 0,
4887
+ "fillRegret": .007,
4888
+ "wins": 27,
4889
+ "winShare": .771,
4890
+ "msMean": .951
4891
+ },
4892
+ "3": {
4893
+ "inputs": 35,
4894
+ "hardRegret": 0,
4895
+ "excessAreaRegret": 0,
4896
+ "fillRegret": .006,
4897
+ "wins": 30,
4898
+ "winShare": .857,
4899
+ "msMean": 1.115
4900
+ }
4901
+ },
4902
+ "prefixMedianMs": {
4903
+ "1": .391,
4904
+ "2": .912,
4905
+ "3": 1.024
4906
+ },
4907
+ "defaultMembers": 3
4908
+ },
4909
+ "holes/100/heavyTail": {
4910
+ "inputs": 35,
4911
+ "thin": false,
4912
+ "sets": {
4913
+ "1": ["maxrects-bl"],
4914
+ "2": ["maxrects-bl", "maxrects-cp"],
4915
+ "3": [
4916
+ "maxrects-bl",
4917
+ "maxrects-cp",
4918
+ "maxrects-bssf"
4919
+ ]
4920
+ },
4921
+ "train": {
4922
+ "1": {
4923
+ "inputs": 35,
4924
+ "hardRegret": 0,
4925
+ "excessAreaRegret": .003,
4926
+ "fillRegret": .005,
4927
+ "wins": 20,
4928
+ "winShare": .571,
4929
+ "msMean": .636
4930
+ },
4931
+ "2": {
4932
+ "inputs": 35,
4933
+ "hardRegret": 0,
4934
+ "excessAreaRegret": .001,
4935
+ "fillRegret": .002,
4936
+ "wins": 30,
4937
+ "winShare": .857,
4938
+ "msMean": 1.13
4939
+ },
4940
+ "3": {
4941
+ "inputs": 35,
4942
+ "hardRegret": 0,
4943
+ "excessAreaRegret": 0,
4944
+ "fillRegret": 0,
4945
+ "wins": 35,
4946
+ "winShare": 1,
4947
+ "msMean": 1.869
4948
+ }
4949
+ },
4950
+ "prefixMedianMs": {
4951
+ "1": .599,
4952
+ "2": 1.068,
4953
+ "3": 1.804
4954
+ },
4955
+ "defaultMembers": 3
4956
+ },
4957
+ "holes/100/uniform": {
4958
+ "inputs": 35,
4959
+ "thin": false,
4960
+ "sets": {
4961
+ "1": ["maxrects-bl"],
4962
+ "2": ["maxrects-bl", "shelf-first"],
4963
+ "3": [
4964
+ "maxrects-bl",
4965
+ "shelf-first",
4966
+ "maxrects-bssf"
4967
+ ]
4968
+ },
4969
+ "train": {
4970
+ "1": {
4971
+ "inputs": 35,
4972
+ "hardRegret": 0,
4973
+ "excessAreaRegret": 0,
4974
+ "fillRegret": .004,
4975
+ "wins": 32,
4976
+ "winShare": .914,
4977
+ "msMean": .882
4978
+ },
4979
+ "2": {
4980
+ "inputs": 35,
4981
+ "hardRegret": 0,
4982
+ "excessAreaRegret": 0,
4983
+ "fillRegret": .002,
4984
+ "wins": 34,
4985
+ "winShare": .971,
4986
+ "msMean": 1.948
4987
+ },
4988
+ "3": {
4989
+ "inputs": 35,
4990
+ "hardRegret": 0,
4991
+ "excessAreaRegret": 0,
4992
+ "fillRegret": 0,
4993
+ "wins": 35,
4994
+ "winShare": 1,
4995
+ "msMean": 3.03
4996
+ }
4997
+ },
4998
+ "prefixMedianMs": {
4999
+ "1": .837,
5000
+ "2": 1.942,
5001
+ "3": 3.011
5002
+ },
5003
+ "defaultMembers": 3
5004
+ },
5005
+ "holes/1k/heavyTail": {
5006
+ "inputs": 35,
5007
+ "thin": false,
5008
+ "sets": {
5009
+ "1": ["maxrects-cp"],
5010
+ "2": ["maxrects-cp"],
5011
+ "3": ["maxrects-cp"]
5012
+ },
5013
+ "train": {
5014
+ "1": {
5015
+ "inputs": 35,
5016
+ "hardRegret": 0,
5017
+ "excessAreaRegret": 0,
5018
+ "fillRegret": 0,
5019
+ "wins": 35,
5020
+ "winShare": 1,
5021
+ "msMean": 1.206
5022
+ },
5023
+ "2": {
5024
+ "inputs": 35,
5025
+ "hardRegret": 0,
5026
+ "excessAreaRegret": 0,
5027
+ "fillRegret": 0,
5028
+ "wins": 35,
5029
+ "winShare": 1,
5030
+ "msMean": 1.206
5031
+ },
5032
+ "3": {
5033
+ "inputs": 35,
5034
+ "hardRegret": 0,
5035
+ "excessAreaRegret": 0,
5036
+ "fillRegret": 0,
5037
+ "wins": 35,
5038
+ "winShare": 1,
5039
+ "msMean": 1.206
5040
+ }
5041
+ },
5042
+ "prefixMedianMs": {
5043
+ "1": 1.011,
5044
+ "2": 1.011,
5045
+ "3": 1.011
5046
+ },
5047
+ "defaultMembers": 1
5048
+ },
5049
+ "holes/1k/uniform": {
5050
+ "inputs": 35,
5051
+ "thin": false,
5052
+ "sets": {
5053
+ "1": ["shelf-first"],
5054
+ "2": ["shelf-first", "maxrects-bl"],
5055
+ "3": ["shelf-first", "maxrects-bl"]
5056
+ },
5057
+ "train": {
5058
+ "1": {
5059
+ "inputs": 35,
5060
+ "hardRegret": 0,
5061
+ "excessAreaRegret": 0,
5062
+ "fillRegret": .003,
5063
+ "wins": 30,
5064
+ "winShare": .857,
5065
+ "msMean": 28.492
5066
+ },
5067
+ "2": {
5068
+ "inputs": 35,
5069
+ "hardRegret": 0,
5070
+ "excessAreaRegret": 0,
5071
+ "fillRegret": -.002,
5072
+ "wins": 35,
5073
+ "winShare": 1,
5074
+ "msMean": 36.636
5075
+ },
5076
+ "3": {
5077
+ "inputs": 35,
5078
+ "hardRegret": 0,
5079
+ "excessAreaRegret": 0,
5080
+ "fillRegret": -.002,
5081
+ "wins": 35,
5082
+ "winShare": 1,
5083
+ "msMean": 36.636
5084
+ }
5085
+ },
5086
+ "prefixMedianMs": {
5087
+ "1": 29.151,
5088
+ "2": 37.4,
5089
+ "3": 37.4
5090
+ },
5091
+ "defaultMembers": 2
5092
+ },
5093
+ "polygon/10/heavyTail": {
5094
+ "inputs": 35,
5095
+ "thin": false,
5096
+ "sets": {
5097
+ "1": ["maxrects-bl"],
5098
+ "2": ["maxrects-bl", "maxrects-blsf"],
5099
+ "3": [
5100
+ "maxrects-bl",
5101
+ "maxrects-blsf",
5102
+ "shelf-best"
5103
+ ]
5104
+ },
5105
+ "train": {
5106
+ "1": {
5107
+ "inputs": 35,
5108
+ "hardRegret": 0,
5109
+ "excessAreaRegret": .001,
5110
+ "fillRegret": .08,
5111
+ "wins": 18,
5112
+ "winShare": .514,
5113
+ "msMean": .209
5114
+ },
5115
+ "2": {
5116
+ "inputs": 35,
5117
+ "hardRegret": 0,
5118
+ "excessAreaRegret": 0,
5119
+ "fillRegret": .034,
5120
+ "wins": 22,
5121
+ "winShare": .629,
5122
+ "msMean": .393
5123
+ },
5124
+ "3": {
5125
+ "inputs": 35,
5126
+ "hardRegret": 0,
5127
+ "excessAreaRegret": 0,
5128
+ "fillRegret": .013,
5129
+ "wins": 29,
5130
+ "winShare": .829,
5131
+ "msMean": .445
5132
+ }
5133
+ },
5134
+ "prefixMedianMs": {
5135
+ "1": .178,
5136
+ "2": .351,
5137
+ "3": .401
5138
+ },
5139
+ "defaultMembers": 3
5140
+ },
5141
+ "polygon/10/uniform": {
5142
+ "inputs": 35,
5143
+ "thin": false,
5144
+ "sets": {
5145
+ "1": ["maxrects-bl"],
5146
+ "2": ["maxrects-bl", "shelf-best"],
5147
+ "3": [
5148
+ "maxrects-bl",
5149
+ "shelf-best",
5150
+ "maxrects-blsf"
5151
+ ]
5152
+ },
5153
+ "train": {
5154
+ "1": {
5155
+ "inputs": 35,
5156
+ "hardRegret": 0,
5157
+ "excessAreaRegret": 0,
5158
+ "fillRegret": .04,
5159
+ "wins": 21,
5160
+ "winShare": .6,
5161
+ "msMean": .233
5162
+ },
5163
+ "2": {
5164
+ "inputs": 35,
5165
+ "hardRegret": 0,
5166
+ "excessAreaRegret": 0,
5167
+ "fillRegret": .009,
5168
+ "wins": 28,
5169
+ "winShare": .8,
5170
+ "msMean": .278
5171
+ },
5172
+ "3": {
5173
+ "inputs": 35,
5174
+ "hardRegret": 0,
5175
+ "excessAreaRegret": 0,
5176
+ "fillRegret": .008,
5177
+ "wins": 30,
5178
+ "winShare": .857,
5179
+ "msMean": .482
5180
+ }
5181
+ },
5182
+ "prefixMedianMs": {
5183
+ "1": .175,
5184
+ "2": .222,
5185
+ "3": .408
5186
+ },
5187
+ "defaultMembers": 3
5188
+ },
5189
+ "polygon/100/heavyTail": {
5190
+ "inputs": 35,
5191
+ "thin": false,
5192
+ "sets": {
5193
+ "1": ["maxrects-bl"],
5194
+ "2": ["maxrects-bl", "maxrects-cp"],
5195
+ "3": [
5196
+ "maxrects-bl",
5197
+ "maxrects-cp",
5198
+ "maxrects-bssf"
5199
+ ]
5200
+ },
5201
+ "train": {
5202
+ "1": {
5203
+ "inputs": 35,
5204
+ "hardRegret": 0,
5205
+ "excessAreaRegret": .001,
5206
+ "fillRegret": .002,
5207
+ "wins": 28,
5208
+ "winShare": .8,
5209
+ "msMean": .369
5210
+ },
5211
+ "2": {
5212
+ "inputs": 35,
5213
+ "hardRegret": 0,
5214
+ "excessAreaRegret": 0,
5215
+ "fillRegret": .001,
5216
+ "wins": 32,
5217
+ "winShare": .914,
5218
+ "msMean": .785
5219
+ },
5220
+ "3": {
5221
+ "inputs": 35,
5222
+ "hardRegret": 0,
5223
+ "excessAreaRegret": 0,
5224
+ "fillRegret": 0,
5225
+ "wins": 34,
5226
+ "winShare": .971,
5227
+ "msMean": 1.303
5228
+ }
5229
+ },
5230
+ "prefixMedianMs": {
5231
+ "1": .378,
5232
+ "2": .809,
5233
+ "3": 1.33
5234
+ },
5235
+ "defaultMembers": 3
5236
+ },
5237
+ "polygon/100/uniform": {
5238
+ "inputs": 35,
5239
+ "thin": false,
5240
+ "sets": {
5241
+ "1": ["maxrects-bl"],
5242
+ "2": ["maxrects-bl", "maxrects-blsf"],
5243
+ "3": [
5244
+ "maxrects-bl",
5245
+ "maxrects-blsf",
5246
+ "shelf-first"
5247
+ ]
5248
+ },
5249
+ "train": {
5250
+ "1": {
5251
+ "inputs": 35,
5252
+ "hardRegret": 0,
5253
+ "excessAreaRegret": 0,
5254
+ "fillRegret": .019,
5255
+ "wins": 26,
5256
+ "winShare": .743,
5257
+ "msMean": .552
5258
+ },
5259
+ "2": {
5260
+ "inputs": 35,
5261
+ "hardRegret": 0,
5262
+ "excessAreaRegret": 0,
5263
+ "fillRegret": .007,
5264
+ "wins": 29,
5265
+ "winShare": .829,
5266
+ "msMean": 1.036
5267
+ },
5268
+ "3": {
5269
+ "inputs": 35,
5270
+ "hardRegret": 0,
5271
+ "excessAreaRegret": 0,
5272
+ "fillRegret": 0,
5273
+ "wins": 35,
5274
+ "winShare": 1,
5275
+ "msMean": 1.406
5276
+ }
5277
+ },
5278
+ "prefixMedianMs": {
5279
+ "1": .519,
5280
+ "2": .989,
5281
+ "3": 1.357
5282
+ },
5283
+ "defaultMembers": 3
5284
+ },
5285
+ "polygon/1k/heavyTail": {
5286
+ "inputs": 35,
5287
+ "thin": false,
5288
+ "sets": {
5289
+ "1": ["maxrects-cp"],
5290
+ "2": ["maxrects-cp"],
5291
+ "3": ["maxrects-cp"]
5292
+ },
5293
+ "train": {
5294
+ "1": {
5295
+ "inputs": 35,
5296
+ "hardRegret": 0,
5297
+ "excessAreaRegret": 0,
5298
+ "fillRegret": 0,
5299
+ "wins": 35,
5300
+ "winShare": 1,
5301
+ "msMean": .981
5302
+ },
5303
+ "2": {
5304
+ "inputs": 35,
5305
+ "hardRegret": 0,
5306
+ "excessAreaRegret": 0,
5307
+ "fillRegret": 0,
5308
+ "wins": 35,
5309
+ "winShare": 1,
5310
+ "msMean": .981
5311
+ },
5312
+ "3": {
5313
+ "inputs": 35,
5314
+ "hardRegret": 0,
5315
+ "excessAreaRegret": 0,
5316
+ "fillRegret": 0,
5317
+ "wins": 35,
5318
+ "winShare": 1,
5319
+ "msMean": .981
5320
+ }
5321
+ },
5322
+ "prefixMedianMs": {
5323
+ "1": .769,
5324
+ "2": .769,
5325
+ "3": .769
5326
+ },
5327
+ "defaultMembers": 1
5328
+ },
5329
+ "polygon/1k/uniform": {
5330
+ "inputs": 35,
5331
+ "thin": false,
5332
+ "sets": {
5333
+ "1": ["shelf-first"],
5334
+ "2": ["shelf-first", "maxrects-blsf"],
5335
+ "3": [
5336
+ "shelf-first",
5337
+ "maxrects-blsf",
5338
+ "maxrects-bl"
5339
+ ]
5340
+ },
5341
+ "train": {
5342
+ "1": {
5343
+ "inputs": 35,
5344
+ "hardRegret": 0,
5345
+ "excessAreaRegret": 0,
5346
+ "fillRegret": .013,
5347
+ "wins": 31,
5348
+ "winShare": .886,
5349
+ "msMean": 11.31
5350
+ },
5351
+ "2": {
5352
+ "inputs": 35,
5353
+ "hardRegret": 0,
5354
+ "excessAreaRegret": 0,
5355
+ "fillRegret": -.001,
5356
+ "wins": 34,
5357
+ "winShare": .971,
5358
+ "msMean": 16.795
5359
+ },
5360
+ "3": {
5361
+ "inputs": 35,
5362
+ "hardRegret": 0,
5363
+ "excessAreaRegret": 0,
5364
+ "fillRegret": -.001,
5365
+ "wins": 35,
5366
+ "winShare": 1,
5367
+ "msMean": 24.24
5368
+ }
5369
+ },
5370
+ "prefixMedianMs": {
5371
+ "1": 10.381,
5372
+ "2": 16.052,
5373
+ "3": 23.567
5374
+ },
5375
+ "defaultMembers": 3
5376
+ },
5377
+ "rect/1/identical": {
5378
+ "inputs": 10,
5379
+ "thin": true
5380
+ },
5381
+ "rect/10/heavyTail": {
5382
+ "inputs": 40,
5383
+ "thin": false,
5384
+ "sets": {
5385
+ "1": ["maxrects-bl"],
5386
+ "2": ["maxrects-bl", "rows"],
5387
+ "3": [
5388
+ "maxrects-bl",
5389
+ "rows",
5390
+ "maxrects-blsf"
5391
+ ]
5392
+ },
5393
+ "train": {
5394
+ "1": {
5395
+ "inputs": 40,
5396
+ "hardRegret": 0,
5397
+ "excessAreaRegret": 0,
5398
+ "fillRegret": .049,
5399
+ "wins": 22,
5400
+ "winShare": .55,
5401
+ "msMean": .02
5402
+ },
5403
+ "2": {
5404
+ "inputs": 40,
5405
+ "hardRegret": 0,
5406
+ "excessAreaRegret": 0,
5407
+ "fillRegret": .013,
5408
+ "wins": 29,
5409
+ "winShare": .725,
5410
+ "msMean": .047
5411
+ },
5412
+ "3": {
5413
+ "inputs": 40,
5414
+ "hardRegret": 0,
5415
+ "excessAreaRegret": 0,
5416
+ "fillRegret": .007,
5417
+ "wins": 33,
5418
+ "winShare": .825,
5419
+ "msMean": .07
5420
+ }
5421
+ },
5422
+ "prefixMedianMs": {
5423
+ "1": .016,
5424
+ "2": .037,
5425
+ "3": .055
5426
+ },
5427
+ "defaultMembers": 3
5428
+ },
5429
+ "rect/10/identical": {
5430
+ "inputs": 5,
5431
+ "thin": true
5432
+ },
5433
+ "rect/10/uniform": {
5434
+ "inputs": 40,
5435
+ "thin": false,
5436
+ "sets": {
5437
+ "1": ["maxrects-bl"],
5438
+ "2": ["maxrects-bl", "shelf-next"],
5439
+ "3": [
5440
+ "maxrects-bl",
5441
+ "shelf-next",
5442
+ "maxrects-baf"
5443
+ ]
5444
+ },
5445
+ "train": {
5446
+ "1": {
5447
+ "inputs": 40,
5448
+ "hardRegret": 0,
5449
+ "excessAreaRegret": 0,
5450
+ "fillRegret": .035,
5451
+ "wins": 27,
5452
+ "winShare": .675,
5453
+ "msMean": .043
5454
+ },
5455
+ "2": {
5456
+ "inputs": 40,
5457
+ "hardRegret": 0,
5458
+ "excessAreaRegret": 0,
5459
+ "fillRegret": .016,
5460
+ "wins": 33,
5461
+ "winShare": .825,
5462
+ "msMean": .114
5463
+ },
5464
+ "3": {
5465
+ "inputs": 40,
5466
+ "hardRegret": 0,
5467
+ "excessAreaRegret": 0,
5468
+ "fillRegret": .001,
5469
+ "wins": 37,
5470
+ "winShare": .925,
5471
+ "msMean": .173
5472
+ }
5473
+ },
5474
+ "prefixMedianMs": {
5475
+ "1": .027,
5476
+ "2": .086,
5477
+ "3": .11
5478
+ },
5479
+ "defaultMembers": 3
5480
+ },
5481
+ "rect/100/heavyTail": {
5482
+ "inputs": 45,
5483
+ "thin": false,
5484
+ "sets": {
5485
+ "1": ["maxrects-bl"],
5486
+ "2": ["maxrects-bl", "maxrects-cp"],
5487
+ "3": [
5488
+ "maxrects-bl",
5489
+ "maxrects-cp",
5490
+ "maxrects-bssf"
5491
+ ]
5492
+ },
5493
+ "train": {
5494
+ "1": {
5495
+ "inputs": 45,
5496
+ "hardRegret": 0,
5497
+ "excessAreaRegret": .002,
5498
+ "fillRegret": .003,
5499
+ "wins": 30,
5500
+ "winShare": .667,
5501
+ "msMean": .097
5502
+ },
5503
+ "2": {
5504
+ "inputs": 45,
5505
+ "hardRegret": 0,
5506
+ "excessAreaRegret": .001,
5507
+ "fillRegret": .001,
5508
+ "wins": 38,
5509
+ "winShare": .844,
5510
+ "msMean": .208
5511
+ },
5512
+ "3": {
5513
+ "inputs": 45,
5514
+ "hardRegret": 0,
5515
+ "excessAreaRegret": 0,
5516
+ "fillRegret": .001,
5517
+ "wins": 42,
5518
+ "winShare": .933,
5519
+ "msMean": .351
5520
+ }
5521
+ },
5522
+ "prefixMedianMs": {
5523
+ "1": .083,
5524
+ "2": .15,
5525
+ "3": .349
5526
+ },
5527
+ "defaultMembers": 3
5528
+ },
5529
+ "rect/100/identical": {
5530
+ "inputs": 5,
5531
+ "thin": true
5532
+ },
5533
+ "rect/100/uniform": {
5534
+ "inputs": 40,
5535
+ "thin": false,
5536
+ "sets": {
5537
+ "1": ["maxrects-bl"],
5538
+ "2": ["maxrects-bl", "shelf-first"],
5539
+ "3": [
5540
+ "maxrects-bl",
5541
+ "shelf-first",
5542
+ "maxrects-blsf"
5543
+ ]
5544
+ },
5545
+ "train": {
5546
+ "1": {
5547
+ "inputs": 40,
5548
+ "hardRegret": 0,
5549
+ "excessAreaRegret": 0,
5550
+ "fillRegret": .006,
5551
+ "wins": 31,
5552
+ "winShare": .775,
5553
+ "msMean": .208
5554
+ },
5555
+ "2": {
5556
+ "inputs": 40,
5557
+ "hardRegret": 0,
5558
+ "excessAreaRegret": 0,
5559
+ "fillRegret": .001,
5560
+ "wins": 38,
5561
+ "winShare": .95,
5562
+ "msMean": .413
5563
+ },
5564
+ "3": {
5565
+ "inputs": 40,
5566
+ "hardRegret": 0,
5567
+ "excessAreaRegret": 0,
5568
+ "fillRegret": 0,
5569
+ "wins": 39,
5570
+ "winShare": .975,
5571
+ "msMean": .648
5572
+ }
5573
+ },
5574
+ "prefixMedianMs": {
5575
+ "1": .196,
5576
+ "2": .367,
5577
+ "3": .519
5578
+ },
5579
+ "defaultMembers": 3
5580
+ },
5581
+ "rect/1k/heavyTail": {
5582
+ "inputs": 35,
5583
+ "thin": false,
5584
+ "sets": {
5585
+ "1": ["maxrects-cp"],
5586
+ "2": ["maxrects-cp"],
5587
+ "3": ["maxrects-cp"]
5588
+ },
5589
+ "train": {
5590
+ "1": {
5591
+ "inputs": 35,
5592
+ "hardRegret": 0,
5593
+ "excessAreaRegret": 0,
5594
+ "fillRegret": 0,
5595
+ "wins": 35,
5596
+ "winShare": 1,
5597
+ "msMean": .679
5598
+ },
5599
+ "2": {
5600
+ "inputs": 35,
5601
+ "hardRegret": 0,
5602
+ "excessAreaRegret": 0,
5603
+ "fillRegret": 0,
5604
+ "wins": 35,
5605
+ "winShare": 1,
5606
+ "msMean": .679
5607
+ },
5608
+ "3": {
5609
+ "inputs": 35,
5610
+ "hardRegret": 0,
5611
+ "excessAreaRegret": 0,
5612
+ "fillRegret": 0,
5613
+ "wins": 35,
5614
+ "winShare": 1,
5615
+ "msMean": .679
5616
+ }
5617
+ },
5618
+ "prefixMedianMs": {
5619
+ "1": .554,
5620
+ "2": .554,
5621
+ "3": .554
5622
+ },
5623
+ "defaultMembers": 1
5624
+ },
5625
+ "rect/1k/uniform": {
5626
+ "inputs": 35,
5627
+ "thin": false,
5628
+ "sets": {
5629
+ "1": ["shelf-first"],
5630
+ "2": ["shelf-first", "maxrects-bl"],
5631
+ "3": ["shelf-first", "maxrects-bl"]
5632
+ },
5633
+ "train": {
5634
+ "1": {
5635
+ "inputs": 35,
5636
+ "hardRegret": 0,
5637
+ "excessAreaRegret": 0,
5638
+ "fillRegret": .004,
5639
+ "wins": 30,
5640
+ "winShare": .857,
5641
+ "msMean": 4.737
5642
+ },
5643
+ "2": {
5644
+ "inputs": 35,
5645
+ "hardRegret": 0,
5646
+ "excessAreaRegret": 0,
5647
+ "fillRegret": -.001,
5648
+ "wins": 35,
5649
+ "winShare": 1,
5650
+ "msMean": 9.299
5651
+ },
5652
+ "3": {
5653
+ "inputs": 35,
5654
+ "hardRegret": 0,
5655
+ "excessAreaRegret": 0,
5656
+ "fillRegret": -.001,
5657
+ "wins": 35,
5658
+ "winShare": 1,
5659
+ "msMean": 9.299
5660
+ }
5661
+ },
5662
+ "prefixMedianMs": {
5663
+ "1": 4.185,
5664
+ "2": 8.887,
5665
+ "3": 8.887
5666
+ },
5667
+ "defaultMembers": 2
5668
+ }
5669
+ }
5670
+ };
5671
+ // src/portfolio-cell.ts
5672
+ /**
5673
+ * The thresholds of the spread bands. The statistic is the standard deviation of the natural log of the linear size
5674
+ * `sqrt(w * h)` of each item.
5675
+ *
5676
+ * - Below `identical`, the band is `identical`.
5677
+ * - Below `uniform`, the band is `uniform`.
5678
+ * - At `uniform` or above, the band is `heavyTail`.
5679
+ *
5680
+ * On the seeds 1 to 7 of the generators of `pack-screen-v1`, the uniform sizes give 0.258 at most. The heavy-tail sizes give 0.278 at least.
5681
+ */
5682
+ const SPREAD_THRESHOLDS = Object.freeze({
5683
+ identical: .02,
5684
+ uniform: .27
5685
+ });
5686
+ /** A cell with fewer inputs than this count in the training records is thin. It uses the set of its container shape. */
5687
+ const THIN_INPUTS = 12;
5688
+ /**
5689
+ * The frame budget of the default member count, in milliseconds. The default count of a cell is the largest prefix of its
5690
+ * set of 3 that fits this budget. The prefix fits when its median summed member time on the CI records is this value or less.
5691
+ * The count is 1 or more at all times.
5692
+ * The default output thus does not depend on the clock: a time limit is only the opt-in option `budgetMs`.
5693
+ */
5694
+ const PORTFOLIO_FRAME_MS = 50;
5695
+ /** This function gives the key of a cell: `<shape>/<count>/<spread>`, for example `rect/100/uniform`. */
5696
+ function cellKey(cell) {
5697
+ return `${cell.shape}/${cell.count}/${cell.spread}`;
3563
5698
  }
3564
5699
  /**
3565
- * This function packs an input with the strategy of an id. The options go over the defaults of the strategy. The
3566
- * context gets `mulberry32` with the seed. The default seed is 0.
5700
+ * This function gives the spread statistic of an input: the standard deviation of the natural log of `sqrt(w * h)` of each item.
5701
+ * An item with no area does not count. Fewer than 2 items with an area give 0.
3567
5702
  */
3568
- function packWith(id, input, options, seed = 0) {
3569
- const s = strategy(id);
3570
- const merged = {
3571
- ...s.defaults,
3572
- ...options
5703
+ function spreadOf(input) {
5704
+ const logs = [];
5705
+ for (const item of input.items) {
5706
+ const area = item.w * item.h;
5707
+ if (area > 0 && Number.isFinite(area)) logs.push(Math.log(area) / 2);
5708
+ }
5709
+ if (logs.length < 2) return 0;
5710
+ const mean = logs.reduce((a, b) => a + b, 0) / logs.length;
5711
+ return Math.sqrt(logs.reduce((a, b) => a + (b - mean) ** 2, 0) / logs.length);
5712
+ }
5713
+ /** This function gives the band of a spread statistic by `SPREAD_THRESHOLDS`. */
5714
+ function spreadBand(spread) {
5715
+ if (spread < SPREAD_THRESHOLDS.identical) return "identical";
5716
+ return spread < SPREAD_THRESHOLDS.uniform ? "uniform" : "heavyTail";
5717
+ }
5718
+ /**
5719
+ * This function gives the cell of an input for the per-cell portfolio. The function reads only the input, not a corpus id.
5720
+ *
5721
+ * - `shape` is the `containerShape` of `cellOf`.
5722
+ * - `count` is `countCell` of the count of the items.
5723
+ * - `spread` is `spreadBand` of `spreadOf`.
5724
+ */
5725
+ function portfolioCell(input) {
5726
+ return {
5727
+ shape: cellOf(input).containerShape,
5728
+ count: countCell(input.items.length),
5729
+ spread: spreadBand(spreadOf(input))
3573
5730
  };
3574
- return s.pack(input, merged, createContext(seed));
5731
+ }
5732
+ /** This function gives the sets of an input from a table: the sets of its cell, or of its shape, or of all the inputs. */
5733
+ function portfolioSetOf(input, table = PORTFOLIO_SETS) {
5734
+ const cell = portfolioCell(input);
5735
+ const key = cellKey(cell);
5736
+ const own = table.cells[key];
5737
+ if (own?.sets !== void 0) return {
5738
+ key,
5739
+ source: "cell",
5740
+ sets: own
5741
+ };
5742
+ const shape = table.shapes[cell.shape];
5743
+ if (shape?.sets !== void 0) return {
5744
+ key,
5745
+ source: "shape",
5746
+ sets: shape
5747
+ };
5748
+ return {
5749
+ key,
5750
+ source: "default",
5751
+ sets: table.all
5752
+ };
5753
+ }
5754
+ /**
5755
+ * This function gives the `k` members of an input for `packPortfolio`. The members are the set of the cell of the input.
5756
+ * A thin cell or an unknown cell takes the set of its shape, or the set of all the inputs. The function throws a `RangeError` for a `k` other than 1, 2 or 3.
5757
+ */
5758
+ function portfolioMembers(input, k, table = PORTFOLIO_SETS) {
5759
+ if (k !== 1 && k !== 2 && k !== 3) throw new RangeError(`The size of a portfolio set is 1, 2 or 3, not ${k}.`);
5760
+ return portfolioSetOf(input, table).sets.sets[`${k}`].map((id) => {
5761
+ const e = table.entries[id];
5762
+ if (e === void 0) throw new RangeError(`The table of the portfolio sets has no entry "${id}".`);
5763
+ return { ...e };
5764
+ });
5765
+ }
5766
+ /**
5767
+ * This function gives the default member count of an input: `defaultMembers` of the sets of its cell, its shape or all the inputs.
5768
+ * With a `k`, the count is not more than `k`. A table without the count gives `k`, or 3 without a `k`.
5769
+ */
5770
+ function portfolioDefaultMembers(input, k, table = PORTFOLIO_SETS) {
5771
+ const count = portfolioSetOf(input, table).sets.defaultMembers ?? 3;
5772
+ return k === void 0 ? count : Math.min(count, k);
3575
5773
  }
3576
5774
  // src/check.ts
3577
5775
  /** This function tells if the insides of two boxes overlap by more than a tolerance on each axis. */
@@ -3692,6 +5890,191 @@ function checkHard(input, output, tolerance = DEFAULT_TOLERANCE, options = {}) {
3692
5890
  complete
3693
5891
  };
3694
5892
  }
5893
+ // src/portfolio.ts
5894
+ /** The id of the trace stage of `packPortfolio`. Its measure `move.pick` is 1 when the pick is not member 0. */
5895
+ const PORTFOLIO_STAGE = "portfolio";
5896
+ /**
5897
+ * The levels of the pick of `packPortfolio` and of the portfolio report of the benchmark, in order. Level 0 is `hard`.
5898
+ *
5899
+ * - `hard`: the count of hard breaks of `checkHard` with `exactContainer`. Lower is better, with the minimum effect 0.
5900
+ * - `pack.overflow.excessArea`: the overflow area above its bound. Lower is better.
5901
+ * - `pack.fill`: the fill of the hull. Higher is better.
5902
+ */
5903
+ const PORTFOLIO_LEVELS = Object.freeze([
5904
+ {
5905
+ id: "hard",
5906
+ spec: {
5907
+ direction: "lower",
5908
+ minEffect: 0
5909
+ }
5910
+ },
5911
+ {
5912
+ id: "pack.overflow.excessArea",
5913
+ spec: MEASURE_SPECS["pack.overflow.excessArea"]
5914
+ },
5915
+ {
5916
+ id: "pack.fill",
5917
+ spec: MEASURE_SPECS["pack.fill"]
5918
+ }
5919
+ ]);
5920
+ /** This function gives the count of the hard breaks of an output: the sum of `checkHard` with `exactContainer`. */
5921
+ function hardBreaks(input, output) {
5922
+ return Object.values(checkHard(input, output, void 0, { exactContainer: true })).reduce((sum, n) => sum + n, 0);
5923
+ }
5924
+ /**
5925
+ * This function makes an opt-in portfolio of strategies of the registry with `portfolio` of the contract.
5926
+ * Its `pick(input)` packs the input with each member and gives the output of the winner, its id and the trace.
5927
+ *
5928
+ * - A member is a strategy id, or a `PortfolioEntry` with options. The members run in the given order.
5929
+ * - `members` is a list, or a function of the input that gives the list. The strategy `portfolio` uses the function form.
5930
+ * - The key is the hard breaks, then `pack.overflow.excessArea`, then `pack.fill`. `PORTFOLIO_LEVELS` gives the specs.
5931
+ * - The hash of the key is `outputHash`. `selectBest` of the contract picks the winner.
5932
+ * - The output of the winner gets the trace stage `portfolio` with `move.pick` of `pickMoves`.
5933
+ * - The function throws a `RangeError` for an unknown strategy, an empty list and two members with the same id.
5934
+ * With the function form, `pick` throws this error for the list of an input.
5935
+ */
5936
+ function packPortfolio(members, options = {}) {
5937
+ const seed = options.seed ?? 0;
5938
+ const toMembers = (given) => given.map((m) => {
5939
+ const e = typeof m === "string" ? {
5940
+ id: m,
5941
+ strategy: m
5942
+ } : m;
5943
+ strategy(e.strategy);
5944
+ return {
5945
+ id: e.id,
5946
+ run: (input) => packWith(e.strategy, input, e.options, seed)
5947
+ };
5948
+ });
5949
+ const list = typeof members === "function" ? (input) => toMembers(members(input)) : toMembers(members);
5950
+ const cache = /* @__PURE__ */ new WeakMap();
5951
+ const measured = (input, output) => {
5952
+ let m = cache.get(output);
5953
+ if (m === void 0) {
5954
+ m = measure(input, output);
5955
+ cache.set(output, m);
5956
+ }
5957
+ return m;
5958
+ };
5959
+ const key = {
5960
+ hard: hardBreaks,
5961
+ levels: PORTFOLIO_LEVELS.slice(1).map((level) => ({
5962
+ id: level.id,
5963
+ spec: level.spec,
5964
+ value: (input, output) => measured(input, output)[level.id]
5965
+ })),
5966
+ hash: outputHash
5967
+ };
5968
+ const limits = {
5969
+ ...options.budgetMs !== void 0 ? { budgetMs: options.budgetMs } : {},
5970
+ ...options.maxMembers !== void 0 ? { maxMembers: options.maxMembers } : {},
5971
+ ...options.now !== void 0 ? { now: options.now } : {}
5972
+ };
5973
+ const inner = portfolio(options.id ?? "portfolio", list, key, limits);
5974
+ const pick = (input) => {
5975
+ const got = inner.pick(input);
5976
+ const stage = {
5977
+ id: PORTFOLIO_STAGE,
5978
+ measures: { "move.pick": pickMoves(got.trace).pick }
5979
+ };
5980
+ return {
5981
+ ...got,
5982
+ output: {
5983
+ ...got.output,
5984
+ trace: [...got.output.trace ?? [], stage]
5985
+ }
5986
+ };
5987
+ };
5988
+ return {
5989
+ id: inner.id,
5990
+ pick,
5991
+ run: (input) => pick(input).output
5992
+ };
5993
+ }
5994
+ // src/portfolio-strategy.ts
5995
+ /** The single strategies that the members of the table use */
5996
+ const SINGLES = [
5997
+ rows,
5998
+ skyline,
5999
+ shelf,
6000
+ push,
6001
+ maxrects
6002
+ ];
6003
+ /** This function gives the union of the supports of the strategies of the members of the table. */
6004
+ function unionSupports() {
6005
+ const used = new Set(Object.values(PORTFOLIO_SETS.entries).map((e) => e.strategy));
6006
+ const out = {};
6007
+ for (const s of SINGLES.filter((x) => used.has(x.id))) for (const [dim, values] of Object.entries(s.supports)) {
6008
+ const list = out[dim] ??= [];
6009
+ for (const v of values) if (!list.includes(v)) list.push(v);
6010
+ }
6011
+ return out;
6012
+ }
6013
+ /**
6014
+ * The strategy `portfolio`: `packPortfolio` with the function form `(input) => portfolioMembers(input, k)`. The seed of the context
6015
+ * goes to each member. Its supports are the union of the supports of the members.
6016
+ *
6017
+ * - Without `k` and `maxMembers`, the members are the set of 3 of the cell, and `maxMembers` is `defaultMembers` of the cell.
6018
+ * The default output thus does not depend on the clock.
6019
+ * - A member that does not support the cell of an input throws, and it does not win. When each member throws, the strategy throws the first error.
6020
+ * - The option `budgetMs` goes to `portfolio` of the contract. The first member always runs.
6021
+ * - The strategy throws a `RangeError` for a `k` other than 2 or 3.
6022
+ */
6023
+ const portfolioStrategy = {
6024
+ id: "portfolio",
6025
+ family: "portfolio",
6026
+ catalog: [],
6027
+ supports: unionSupports(),
6028
+ defaults: {},
6029
+ deterministic: true,
6030
+ pack(input, options, context) {
6031
+ const { k, maxMembers, budgetMs } = options;
6032
+ if (k !== void 0 && k !== 2 && k !== 3) throw new RangeError(`The option k of the strategy portfolio is 2 or 3, not ${String(k)}.`);
6033
+ const size = k ?? 3;
6034
+ const count = maxMembers ?? (k === void 0 ? portfolioDefaultMembers(input) : void 0);
6035
+ const limits = {
6036
+ ...count === void 0 ? {} : { maxMembers: count },
6037
+ ...budgetMs === void 0 ? {} : { budgetMs }
6038
+ };
6039
+ return packPortfolio((x) => portfolioMembers(x, size), {
6040
+ id: k === void 0 ? "portfolio" : `portfolio-k${k}`,
6041
+ seed: context.seed,
6042
+ ...limits
6043
+ }).run(input);
6044
+ }
6045
+ };
6046
+ // src/registry.ts
6047
+ /** Each single strategy of the package. The benchmark starts each one on each input of the corpus. */
6048
+ const strategies = Object.freeze([
6049
+ rows,
6050
+ skyline,
6051
+ shelf,
6052
+ push,
6053
+ maxrects
6054
+ ]);
6055
+ /**
6056
+ * The composite strategies of the registry: each one packs an input with other strategies. They are not in `strategies`.
6057
+ * Since 0.2.7, the list has `portfolio` of roadmap item k20.
6058
+ */
6059
+ const composites = Object.freeze([portfolioStrategy]);
6060
+ /** This function gives the strategy with an id, also a composite strategy. It throws a `RangeError` for an id that the registry does not have. */
6061
+ function strategy(id) {
6062
+ const found = strategies.find((s) => s.id === id) ?? composites.find((s) => s.id === id);
6063
+ if (found === void 0) throw new RangeError(`The registry has no strategy "${id}".`);
6064
+ return found;
6065
+ }
6066
+ /**
6067
+ * This function packs an input with the strategy of an id. The options go over the defaults of the strategy. The
6068
+ * context gets `mulberry32` with the seed. The default seed is 0.
6069
+ */
6070
+ function packWith(id, input, options, seed = 0) {
6071
+ const s = strategy(id);
6072
+ const merged = {
6073
+ ...s.defaults,
6074
+ ...options
6075
+ };
6076
+ return s.pack(input, merged, createContext(seed));
6077
+ }
3695
6078
  // src/generators.ts
3696
6079
  /** The largest count of boxes that a generator makes. */
3697
6080
  const MAX_COUNT = 1e5;
@@ -4606,6 +6989,6 @@ function corpus(name, specs) {
4606
6989
  inputs
4607
6990
  };
4608
6991
  }
4609
- export { DEFAULT_TOLERANCE, EPS, MAXRECTS_BANDS, MAXRECTS_RULES, MEASURE_SPECS, RECORD_EPS, Rect, SHELF_FITS, SORT_ORDERS, UnsupportedCell, Vector, aspectError, assertSupported, canonicalJson, cards, cellOf, checkHard, checkInput, compareRects, corpus, countCell, createContext, dashboard, edgeCases, fnv1a32, freeSpace, fromRects, gallery, generator, generators, hashInput, isDeterministic, logSweep, lowestWindow, marginOf, maxrects, measure, measureChange, medianRatio, mulberry32, pack, packFree, packMaxRects, packRows, packShelf, packSkyline, packWith, packingMetrics, pairedRatio, push, pushCascade, quantile, rectGrid, rectScattered, round3, roundMeasures, rows, shelf, skyline, strategies, strategy, supportsCell, tailShare, toPackInput, toRects, turnItem, turnPoint, turnPort, turnRegion, unsupportedOf, wordCloud };
6992
+ export { DEFAULT_TOLERANCE, EPS, MAXRECTS_BANDS, MAXRECTS_RULES, MEASURE_SPECS, PORTFOLIO_FRAME_MS, PORTFOLIO_LEVELS, PORTFOLIO_SETS, PORTFOLIO_STAGE, RECORD_EPS, Rect, SHELF_FITS, SORT_ORDERS, SPREAD_THRESHOLDS, THIN_INPUTS, UnsupportedCell, Vector, aspectError, assertSupported, canonicalJson, cards, cellKey, cellOf, checkHard, checkInput, compareRects, composites, corpus, countCell, createContext, dashboard, edgeCases, fnv1a32, freeSpace, fromRects, gallery, generator, generators, hardBreaks, hashInput, isDeterministic, logSweep, lowestWindow, marginOf, maxrects, measure, measureChange, medianRatio, mulberry32, outputHash, pack, packFree, packMaxRects, packPortfolio, packRows, packShelf, packSkyline, packWith, packingMetrics, pairedRatio, portfolioCell, portfolioDefaultMembers, portfolioMembers, portfolioSetOf, portfolioStrategy, push, pushCascade, quantile, rectGrid, rectScattered, round3, roundMeasures, rows, shelf, skyline, spreadBand, spreadOf, strategies, strategy, supportsCell, tailShare, toPackInput, toRects, turnItem, turnPoint, turnPort, turnRegion, unsupportedOf, wordCloud };
4610
6993
 
4611
6994
  //# sourceMappingURL=index.js.map