Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sublime.score_selector #241

Closed
brupelo opened this issue Mar 10, 2019 · 5 comments
Closed

sublime.score_selector #241

brupelo opened this issue Mar 10, 2019 · 5 comments

Comments

@brupelo
Copy link

brupelo commented Mar 10, 2019

Syntect uses a floating point algorithm for scoring while Sublime uses an integer one.

Probably sublime uses u64 datatypes for scoring, ie: 2^64 = 18446744073709551616

I've tried to analize the general behaviour of Sublime's by doing some simple tests:

Case1

sublime.score_selector("a "*0, "a "*0)        = 1
sublime.score_selector("a "*1, "a "*1)        = 8
sublime.score_selector("a "*2, "a "*2)        = 72
sublime.score_selector("a "*3, "a "*3)        = 584
sublime.score_selector("a "*4, "a "*4)        = 4680
sublime.score_selector("a "*5, "a "*5)        = 37448
sublime.score_selector("a "*6, "a "*6)        = 299592
sublime.score_selector("a "*7, "a "*7)        = 2396744
sublime.score_selector("a "*8, "a "*8)        = 19173960
sublime.score_selector("a "*9, "a "*9)        = 153391688
sublime.score_selector("a "*10, "a "*10)      = 1227133512
sublime.score_selector("a "*11, "a "*11)      = 9817068104
sublime.score_selector("a "*12, "a "*12)      = 78536544840
sublime.score_selector("a "*13, "a "*13)      = 628292358728
sublime.score_selector("a "*14, "a "*14)      = 5026338869832
sublime.score_selector("a "*15, "a "*15)      = 40210710958664
sublime.score_selector("a "*16, "a "*16)      = 321685687669320
sublime.score_selector("a "*17, "a "*17)      = 2573485501354568
sublime.score_selector("a "*18, "a "*18)      = 20587884010836552
sublime.score_selector("a "*19, "a "*19)      = 164703072086692424
sublime.score_selector("a "*20, "a "*20)      = 1317624576693539400
sublime.score_selector("a "*21, "a "*21)      = 2470546081300386376
sublime.score_selector("a "*22, "a "*22)      = 3623467585907233352
sublime.score_selector("a "*23, "a "*23)      = 4776389090514080328
sublime.score_selector("a "*24, "a "*24)      = 5929310595120927304
sublime.score_selector("a "*25, "a "*25)      = 7082232099727774280
sublime.score_selector("a "*26, "a "*26)      = 8235153604334621256
sublime.score_selector("a "*27, "a "*27)      = 9388075108941468232
sublime.score_selector("a "*28, "a "*28)      = 10540996613548315208
sublime.score_selector("a "*29, "a "*29)      = 11693918118155162184
sublime.score_selector("a "*30, "a "*30)      = 12846839622762009160
sublime.score_selector("a "*31, "a "*31)      = 13999761127368856136
sublime.score_selector("a "*32, "a "*32)      = 15152682631975703112
sublime.score_selector("a "*33, "a "*33)      = 16305604136582550088
sublime.score_selector("a "*34, "a "*34)      = 17458525641189397064
sublime.score_selector("a "*35, "a "*35)      = 164703072086692424
sublime.score_selector("a "*36, "a "*36)      = 1317624576693539400
sublime.score_selector("a "*37, "a "*37)      = 2470546081300386376
sublime.score_selector("a "*38, "a "*38)      = 3623467585907233352
sublime.score_selector("a "*39, "a "*39)      = 4776389090514080328
sublime.score_selector("a "*40, "a "*40)      = 5929310595120927304
sublime.score_selector("a "*41, "a "*41)      = 7082232099727774280
sublime.score_selector("a "*42, "a "*42)      = 8235153604334621256
sublime.score_selector("a "*43, "a "*43)      = 9388075108941468232
sublime.score_selector("a "*44, "a "*44)      = 10540996613548315208
sublime.score_selector("a "*45, "a "*45)      = 11693918118155162184
sublime.score_selector("a "*46, "a "*46)      = 12846839622762009160
sublime.score_selector("a "*47, "a "*47)      = 13999761127368856136
sublime.score_selector("a "*48, "a "*48)      = 15152682631975703112
sublime.score_selector("a "*49, "a "*49)      = 16305604136582550088
sublime.score_selector("a "*50, "a "*50)      = 17458525641189397064
sublime.score_selector("a "*51, "a "*51)      = 164703072086692424
sublime.score_selector("a "*52, "a "*52)      = 1317624576693539400
sublime.score_selector("a "*53, "a "*53)      = 2470546081300386376
sublime.score_selector("a "*54, "a "*54)      = 3623467585907233352
sublime.score_selector("a "*55, "a "*55)      = 4776389090514080328
sublime.score_selector("a "*56, "a "*56)      = 5929310595120927304
sublime.score_selector("a "*57, "a "*57)      = 7082232099727774280
sublime.score_selector("a "*58, "a "*58)      = 8235153604334621256
sublime.score_selector("a "*59, "a "*59)      = 9388075108941468232
sublime.score_selector("a "*60, "a "*60)      = 10540996613548315208
sublime.score_selector("a "*61, "a "*61)      = 11693918118155162184
sublime.score_selector("a "*62, "a "*62)      = 12846839622762009160
sublime.score_selector("a "*63, "a "*63)      = 13999761127368856136
sublime.score_selector("a "*64, "a "*64)      = 15152682631975703112
sublime.score_selector("a "*65, "a "*65)      = 16305604136582550088
sublime.score_selector("a "*66, "a "*66)      = 17458525641189397064
sublime.score_selector("a "*67, "a "*67)      = 164703072086692424
sublime.score_selector("a "*68, "a "*68)      = 1317624576693539400
sublime.score_selector("a "*69, "a "*69)      = 2470546081300386376
sublime.score_selector("a "*70, "a "*70)      = 3623467585907233352
sublime.score_selector("a "*71, "a "*71)      = 4776389090514080328
sublime.score_selector("a "*72, "a "*72)      = 5929310595120927304
sublime.score_selector("a "*73, "a "*73)      = 7082232099727774280
sublime.score_selector("a "*74, "a "*74)      = 8235153604334621256
sublime.score_selector("a "*75, "a "*75)      = 9388075108941468232
sublime.score_selector("a "*76, "a "*76)      = 10540996613548315208
sublime.score_selector("a "*77, "a "*77)      = 11693918118155162184
sublime.score_selector("a "*78, "a "*78)      = 12846839622762009160
sublime.score_selector("a "*79, "a "*79)      = 13999761127368856136
sublime.score_selector("a "*80, "a "*80)      = 15152682631975703112
sublime.score_selector("a "*81, "a "*81)      = 16305604136582550088
sublime.score_selector("a "*82, "a "*82)      = 17458525641189397064
sublime.score_selector("a "*83, "a "*83)      = 164703072086692424
sublime.score_selector("a "*84, "a "*84)      = 1317624576693539400
sublime.score_selector("a "*85, "a "*85)      = 2470546081300386376
sublime.score_selector("a "*86, "a "*86)      = 3623467585907233352
sublime.score_selector("a "*87, "a "*87)      = 4776389090514080328
sublime.score_selector("a "*88, "a "*88)      = 5929310595120927304
sublime.score_selector("a "*89, "a "*89)      = 7082232099727774280
sublime.score_selector("a "*90, "a "*90)      = 8235153604334621256
sublime.score_selector("a "*91, "a "*91)      = 9388075108941468232
sublime.score_selector("a "*92, "a "*92)      = 10540996613548315208
sublime.score_selector("a "*93, "a "*93)      = 11693918118155162184
sublime.score_selector("a "*94, "a "*94)      = 12846839622762009160
sublime.score_selector("a "*95, "a "*95)      = 13999761127368856136
sublime.score_selector("a "*96, "a "*96)      = 15152682631975703112
sublime.score_selector("a "*97, "a "*97)      = 16305604136582550088
sublime.score_selector("a "*98, "a "*98)      = 17458525641189397064
sublime.score_selector("a "*99, "a "*99)      = 164703072086692424
sublime.score_selector("a "*100, "a "*100)    = 1317624576693539400
sublime.score_selector("a "*101, "a "*101)    = 2470546081300386376
sublime.score_selector("a "*102, "a "*102)    = 3623467585907233352
sublime.score_selector("a "*103, "a "*103)    = 4776389090514080328
sublime.score_selector("a "*104, "a "*104)    = 5929310595120927304
sublime.score_selector("a "*105, "a "*105)    = 7082232099727774280
sublime.score_selector("a "*106, "a "*106)    = 8235153604334621256
sublime.score_selector("a "*107, "a "*107)    = 9388075108941468232
sublime.score_selector("a "*108, "a "*108)    = 10540996613548315208
sublime.score_selector("a "*109, "a "*109)    = 11693918118155162184
sublime.score_selector("a "*110, "a "*110)    = 12846839622762009160
sublime.score_selector("a "*111, "a "*111)    = 13999761127368856136
sublime.score_selector("a "*112, "a "*112)    = 15152682631975703112
sublime.score_selector("a "*113, "a "*113)    = 16305604136582550088
sublime.score_selector("a "*114, "a "*114)    = 17458525641189397064
sublime.score_selector("a "*115, "a "*115)    = 164703072086692424
sublime.score_selector("a "*116, "a "*116)    = 1317624576693539400
sublime.score_selector("a "*117, "a "*117)    = 2470546081300386376
sublime.score_selector("a "*118, "a "*118)    = 3623467585907233352
sublime.score_selector("a "*119, "a "*119)    = 4776389090514080328
sublime.score_selector("a "*120, "a "*120)    = 5929310595120927304
sublime.score_selector("a "*121, "a "*121)    = 7082232099727774280
sublime.score_selector("a "*122, "a "*122)    = 8235153604334621256
sublime.score_selector("a "*123, "a "*123)    = 9388075108941468232
sublime.score_selector("a "*124, "a "*124)    = 10540996613548315208
sublime.score_selector("a "*125, "a "*125)    = 11693918118155162184
sublime.score_selector("a "*126, "a "*126)    = 12846839622762009160
sublime.score_selector("a "*127, "a "*127)    = 13999761127368856136
sublime.score_selector("a "*128, "a "*128)    = 15152682631975703112
sublime.score_selector("a "*129, "a "*129)    = 1

Solution1:

8
8 + 64
8 + 64 + 512
...
8^1+8^2 + 8^3+ ... + 8^n

Case 2

sublime.score_selector("a.a "*0, "a.a "*0)    = 1
sublime.score_selector("a.a "*1, "a.a "*1)    = 16
sublime.score_selector("a.a "*2, "a.a "*2)    = 144
sublime.score_selector("a.a "*3, "a.a "*3)    = 1168
sublime.score_selector("a.a "*4, "a.a "*4)    = 9360
sublime.score_selector("a.a "*5, "a.a "*5)    = 74896
sublime.score_selector("a.a "*6, "a.a "*6)    = 599184
sublime.score_selector("a.a "*7, "a.a "*7)    = 4793488
sublime.score_selector("a.a "*8, "a.a "*8)    = 38347920
sublime.score_selector("a.a "*9, "a.a "*9)    = 306783376
sublime.score_selector("a.a "*10, "a.a "*10)  = 2454267024
sublime.score_selector("a.a "*11, "a.a "*11)  = 19634136208
sublime.score_selector("a.a "*12, "a.a "*12)  = 157073089680
sublime.score_selector("a.a "*13, "a.a "*13)  = 1256584717456
sublime.score_selector("a.a "*14, "a.a "*14)  = 10052677739664
sublime.score_selector("a.a "*15, "a.a "*15)  = 80421421917328
sublime.score_selector("a.a "*16, "a.a "*16)  = 643371375338640
sublime.score_selector("a.a "*17, "a.a "*17)  = 5146971002709136
sublime.score_selector("a.a "*18, "a.a "*18)  = 41175768021673104
sublime.score_selector("a.a "*19, "a.a "*19)  = 329406144173384848
sublime.score_selector("a.a "*20, "a.a "*20)  = 2635249153387078800
sublime.score_selector("a.a "*21, "a.a "*21)  = 4941092162600772752
sublime.score_selector("a.a "*22, "a.a "*22)  = 7246935171814466704
sublime.score_selector("a.a "*23, "a.a "*23)  = 9552778181028160656
sublime.score_selector("a.a "*24, "a.a "*24)  = 11858621190241854608
sublime.score_selector("a.a "*25, "a.a "*25)  = 14164464199455548560
sublime.score_selector("a.a "*26, "a.a "*26)  = 16470307208669242512
sublime.score_selector("a.a "*27, "a.a "*27)  = 329406144173384848
sublime.score_selector("a.a "*28, "a.a "*28)  = 2635249153387078800
sublime.score_selector("a.a "*29, "a.a "*29)  = 4941092162600772752
sublime.score_selector("a.a "*30, "a.a "*30)  = 7246935171814466704
sublime.score_selector("a.a "*31, "a.a "*31)  = 9552778181028160656
sublime.score_selector("a.a "*32, "a.a "*32)  = 11858621190241854608
sublime.score_selector("a.a "*33, "a.a "*33)  = 14164464199455548560
sublime.score_selector("a.a "*34, "a.a "*34)  = 16470307208669242512
sublime.score_selector("a.a "*35, "a.a "*35)  = 329406144173384848
sublime.score_selector("a.a "*36, "a.a "*36)  = 2635249153387078800
sublime.score_selector("a.a "*37, "a.a "*37)  = 4941092162600772752
sublime.score_selector("a.a "*38, "a.a "*38)  = 7246935171814466704
sublime.score_selector("a.a "*39, "a.a "*39)  = 9552778181028160656
sublime.score_selector("a.a "*40, "a.a "*40)  = 11858621190241854608
sublime.score_selector("a.a "*41, "a.a "*41)  = 14164464199455548560
sublime.score_selector("a.a "*42, "a.a "*42)  = 16470307208669242512
sublime.score_selector("a.a "*43, "a.a "*43)  = 329406144173384848
sublime.score_selector("a.a "*44, "a.a "*44)  = 2635249153387078800
sublime.score_selector("a.a "*45, "a.a "*45)  = 4941092162600772752
sublime.score_selector("a.a "*46, "a.a "*46)  = 7246935171814466704
sublime.score_selector("a.a "*47, "a.a "*47)  = 9552778181028160656
sublime.score_selector("a.a "*48, "a.a "*48)  = 11858621190241854608
sublime.score_selector("a.a "*49, "a.a "*49)  = 14164464199455548560
sublime.score_selector("a.a "*50, "a.a "*50)  = 16470307208669242512
sublime.score_selector("a.a "*51, "a.a "*51)  = 329406144173384848
sublime.score_selector("a.a "*52, "a.a "*52)  = 2635249153387078800
sublime.score_selector("a.a "*53, "a.a "*53)  = 4941092162600772752
sublime.score_selector("a.a "*54, "a.a "*54)  = 7246935171814466704
sublime.score_selector("a.a "*55, "a.a "*55)  = 9552778181028160656
sublime.score_selector("a.a "*56, "a.a "*56)  = 11858621190241854608
sublime.score_selector("a.a "*57, "a.a "*57)  = 14164464199455548560
sublime.score_selector("a.a "*58, "a.a "*58)  = 16470307208669242512
sublime.score_selector("a.a "*59, "a.a "*59)  = 329406144173384848
sublime.score_selector("a.a "*60, "a.a "*60)  = 2635249153387078800
sublime.score_selector("a.a "*61, "a.a "*61)  = 4941092162600772752
sublime.score_selector("a.a "*62, "a.a "*62)  = 7246935171814466704
sublime.score_selector("a.a "*63, "a.a "*63)  = 9552778181028160656
sublime.score_selector("a.a "*64, "a.a "*64)  = 11858621190241854608
sublime.score_selector("a.a "*65, "a.a "*65)  = 14164464199455548560
sublime.score_selector("a.a "*66, "a.a "*66)  = 16470307208669242512
sublime.score_selector("a.a "*67, "a.a "*67)  = 329406144173384848
sublime.score_selector("a.a "*68, "a.a "*68)  = 2635249153387078800
sublime.score_selector("a.a "*69, "a.a "*69)  = 4941092162600772752
sublime.score_selector("a.a "*70, "a.a "*70)  = 7246935171814466704
sublime.score_selector("a.a "*71, "a.a "*71)  = 9552778181028160656
sublime.score_selector("a.a "*72, "a.a "*72)  = 11858621190241854608
sublime.score_selector("a.a "*73, "a.a "*73)  = 14164464199455548560
sublime.score_selector("a.a "*74, "a.a "*74)  = 16470307208669242512
sublime.score_selector("a.a "*75, "a.a "*75)  = 329406144173384848
sublime.score_selector("a.a "*76, "a.a "*76)  = 2635249153387078800
sublime.score_selector("a.a "*77, "a.a "*77)  = 4941092162600772752
sublime.score_selector("a.a "*78, "a.a "*78)  = 7246935171814466704
sublime.score_selector("a.a "*79, "a.a "*79)  = 9552778181028160656
sublime.score_selector("a.a "*80, "a.a "*80)  = 11858621190241854608
sublime.score_selector("a.a "*81, "a.a "*81)  = 14164464199455548560
sublime.score_selector("a.a "*82, "a.a "*82)  = 16470307208669242512
sublime.score_selector("a.a "*83, "a.a "*83)  = 329406144173384848
sublime.score_selector("a.a "*84, "a.a "*84)  = 2635249153387078800
sublime.score_selector("a.a "*85, "a.a "*85)  = 4941092162600772752
sublime.score_selector("a.a "*86, "a.a "*86)  = 1

Solution2

8+8
8+8 + 64+64
8+8 + 64+64 + 512+512
8+8 + 64+64 + 4096+4096
...
8^1+8^1 + 8^2+8^2 + ... 8^n+8^n

Case3

sublime.score_selector("a.a.a "*0, "a.a.a "*0) = 1
sublime.score_selector("a.a.a "*1, "a.a.a "*1) = 24
sublime.score_selector("a.a.a "*2, "a.a.a "*2) = 216
sublime.score_selector("a.a.a "*3, "a.a.a "*3) = 1752
sublime.score_selector("a.a.a "*4, "a.a.a "*4) = 14040
sublime.score_selector("a.a.a "*5, "a.a.a "*5) = 112344
sublime.score_selector("a.a.a "*6, "a.a.a "*6) = 898776
sublime.score_selector("a.a.a "*7, "a.a.a "*7) = 7190232
sublime.score_selector("a.a.a "*8, "a.a.a "*8) = 57521880
sublime.score_selector("a.a.a "*9, "a.a.a "*9) = 460175064
sublime.score_selector("a.a.a "*10, "a.a.a "*10) = 3681400536
sublime.score_selector("a.a.a "*11, "a.a.a "*11) = 29451204312
sublime.score_selector("a.a.a "*12, "a.a.a "*12) = 235609634520
sublime.score_selector("a.a.a "*13, "a.a.a "*13) = 1884877076184
sublime.score_selector("a.a.a "*14, "a.a.a "*14) = 15079016609496
sublime.score_selector("a.a.a "*15, "a.a.a "*15) = 120632132875992
sublime.score_selector("a.a.a "*16, "a.a.a "*16) = 965057063007960
sublime.score_selector("a.a.a "*17, "a.a.a "*17) = 7720456504063704
sublime.score_selector("a.a.a "*18, "a.a.a "*18) = 61763652032509656
sublime.score_selector("a.a.a "*19, "a.a.a "*19) = 494109216260077272
sublime.score_selector("a.a.a "*20, "a.a.a "*20) = 3952873730080618200
sublime.score_selector("a.a.a "*21, "a.a.a "*21) = 7411638243901159128
sublime.score_selector("a.a.a "*22, "a.a.a "*22) = 10870402757721700056
sublime.score_selector("a.a.a "*23, "a.a.a "*23) = 14329167271542240984
sublime.score_selector("a.a.a "*24, "a.a.a "*24) = 17787931785362781912
sublime.score_selector("a.a.a "*25, "a.a.a "*25) = 2799952225473771224
sublime.score_selector("a.a.a "*26, "a.a.a "*26) = 6258716739294312152
sublime.score_selector("a.a.a "*27, "a.a.a "*27) = 9717481253114853080
sublime.score_selector("a.a.a "*28, "a.a.a "*28) = 13176245766935394008
sublime.score_selector("a.a.a "*29, "a.a.a "*29) = 16635010280755934936
sublime.score_selector("a.a.a "*30, "a.a.a "*30) = 1647030720866924248
sublime.score_selector("a.a.a "*31, "a.a.a "*31) = 5105795234687465176
sublime.score_selector("a.a.a "*32, "a.a.a "*32) = 8564559748508006104
sublime.score_selector("a.a.a "*33, "a.a.a "*33) = 12023324262328547032
sublime.score_selector("a.a.a "*34, "a.a.a "*34) = 15482088776149087960
sublime.score_selector("a.a.a "*35, "a.a.a "*35) = 494109216260077272
sublime.score_selector("a.a.a "*36, "a.a.a "*36) = 3952873730080618200
sublime.score_selector("a.a.a "*37, "a.a.a "*37) = 7411638243901159128
sublime.score_selector("a.a.a "*38, "a.a.a "*38) = 10870402757721700056
sublime.score_selector("a.a.a "*39, "a.a.a "*39) = 14329167271542240984
sublime.score_selector("a.a.a "*40, "a.a.a "*40) = 17787931785362781912
sublime.score_selector("a.a.a "*41, "a.a.a "*41) = 2799952225473771224
sublime.score_selector("a.a.a "*42, "a.a.a "*42) = 6258716739294312152
sublime.score_selector("a.a.a "*43, "a.a.a "*43) = 9717481253114853080
sublime.score_selector("a.a.a "*44, "a.a.a "*44) = 13176245766935394008
sublime.score_selector("a.a.a "*45, "a.a.a "*45) = 16635010280755934936
sublime.score_selector("a.a.a "*46, "a.a.a "*46) = 1647030720866924248
sublime.score_selector("a.a.a "*47, "a.a.a "*47) = 5105795234687465176
sublime.score_selector("a.a.a "*48, "a.a.a "*48) = 8564559748508006104
sublime.score_selector("a.a.a "*49, "a.a.a "*49) = 12023324262328547032
sublime.score_selector("a.a.a "*50, "a.a.a "*50) = 15482088776149087960
sublime.score_selector("a.a.a "*51, "a.a.a "*51) = 494109216260077272
sublime.score_selector("a.a.a "*52, "a.a.a "*52) = 3952873730080618200
sublime.score_selector("a.a.a "*53, "a.a.a "*53) = 7411638243901159128
sublime.score_selector("a.a.a "*54, "a.a.a "*54) = 10870402757721700056
sublime.score_selector("a.a.a "*55, "a.a.a "*55) = 14329167271542240984
sublime.score_selector("a.a.a "*56, "a.a.a "*56) = 17787931785362781912
sublime.score_selector("a.a.a "*57, "a.a.a "*57) = 2799952225473771224
sublime.score_selector("a.a.a "*58, "a.a.a "*58) = 6258716739294312152
sublime.score_selector("a.a.a "*59, "a.a.a "*59) = 9717481253114853080
sublime.score_selector("a.a.a "*60, "a.a.a "*60) = 13176245766935394008
sublime.score_selector("a.a.a "*61, "a.a.a "*61) = 16635010280755934936
sublime.score_selector("a.a.a "*62, "a.a.a "*62) = 1647030720866924248
sublime.score_selector("a.a.a "*63, "a.a.a "*63) = 5105795234687465176
sublime.score_selector("a.a.a "*64, "a.a.a "*64) = 8564559748508006104
sublime.score_selector("a.a.a "*65, "a.a.a "*65) = 1

Solution3

8+8+8
8+8+8 + 64+64+64
8+8+8 + 64+64+64 + 512+512+512
8+8+8 + 64+64+64 + 4096+4096+4096
...
8^1+8^1+8^1 + 8^2+8^2+8^2 + ... 8^n+8^n+8^n

So, for this particular sequences and if we consider the previous results we can extrapolate a more general solution that works for these type of simple scopes such as:

8^1+8^2 + 8^3+ ... + 8^n
8^1+8^1 + 8^2+8^2 + ... 8^n+8^n
8^1+8^1+8^1 + 8^2+8^2+8^2 + ... 8^n+8^n+8^n
...
**(8^1+...+8^1) + (8^2+...+8^2) +...+ (8^n+...+8^n)**

Of course, this doesn't explain how Sublime's score_selector works but it clearly shows that the algorithm itself must be contain really simple maths and string processing functions.

Any idea how it works behind the scenes?

@trishume
Copy link
Owner

Probably similar to how syntect's works just using a u64 for storage whereas I think syntect uses an f64. It's not important, I don't see any reason to replicate Sublime's values, the values are pretty meaningless only the order is important which should be the same as Sublime. Closing this issue.

@brupelo
Copy link
Author

brupelo commented Mar 10, 2019

Y, you've got a point there, definitely what's important here is the order... that said, one good rule of thumb when it comes to algorithm design is always trying to favour integer instead floating point arithmetic, which in many cases it'll be possible.

http://nicolas.limare.net/pro/notes/2014/12/12_arit_speed/

@trishume
Copy link
Owner

I used floating point for a reason, because it's more correct. Pretty sure it can handle more levels of nesting with reasonable accuracy than Sublime's method. It's also really fast and not the bottleneck, I do profile.

@brupelo
Copy link
Author

brupelo commented Mar 11, 2019

I see, in any case the main purpose of this thread was just to know if you knew how Sublime's worked, that's all. It seems you don't but you claim your method is more correct... why is that? On which cases you know for sure Sublime's will fail while yours won't?

That said, if your algo covers all cases and it's not a bottleneck then is fine, as for me as I always strive to find the best solutions for particular problems and figuring out how other's work is a good first step so I can compare between them. Unfortunately, I haven't been able to use the debugger to break in plugin_host.exe to see how methods such as this or others will work... Once a breakpoint in plugin_host is reached SublimeText will crash so it's definitely not easy to reverse engineer these algos

@trishume
Copy link
Owner

Pretty sure both my scheme and Sublime's use a scheme where the most significant digits represent the most significant scopes for the purpose of the matching, and then more digits mean deeper matching. You'll note that around 27 deep Sublime's algorithm overflows and starts returning incorrect values that are smaller than less-matchy scores.

By using floating point, I get an exponent mantissa representation that separately tracks the matching depth and only the most significant scopes. This is exactly what you want for most closely approximating fully correct behaviour. The most important thing is the depth, the exponent, and the most significant scopes at the top of the stack.

In practice only really weird cases will cause either algorithm to be incorrect, but mine degrades more gracefully.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants