G'MIC Challenge: Fuzzy Matching

Some months ago, I did release a command name rep_sug_arg, and the cli documentation is as followed:

  rep_sug_args:
      inp,_sep,_return_all_arg={ 0=false | 1=true},0.5>=_int_score_threshold<=3,
        arg0,arg1,...

    Suggest arguments given input using Damerau-Levenshtein Distance algorithm.

    Returns '01e0' on exact match.
    Returns '00e0' if no close match is found.

    Note: For '00e0' and '01e0'. They're intended to be that way to avoid
    conflict with 0 or 1. So, keep in mind these are meant to be treated as
    vector to be validated.

    Returns suggestion when close matches are found.

    Errors when no valid input for argN is found.

    Default values: 'sep=','_return_all_arg=1','_int_score_threshold=2'

Why did I implement this? I realized that some commands rely on exact text inputs instead of numbers, and typos are possible. So, making would allow me to implement a feature on commands to allow users to see possible arguments that matches their intended argument. And it feels the commands are more usable when I am seeing suggestions.

However, it turns out, it’s a tricky problem. As you can see, fuzzy matching on +pal shows this?

C:\Windows\System32>gmic +pal aap_radiant
[gmic]./ Start G'MIC interpreter (v.3.7.3).
ERROR: Invalid value 'app_radiant'. No close match found!

  pal:
      0<="palette_id"<=384 |
      *,_name_pals_as_id={ 0=use_full_name | 1=use_id_name }

But, there is a perceptually close match, from the human perspective:

+pal 228 = +pal aap_radiant_xv -- AAP-RadiantXV by Adigun A. Polack

Maybe, the distance of <3 cause this error to show up. But, also, there’s the possibility that my fuzzy matching algorithm needs more refinement.

Also, in this case:

C:\Windows\System32>gmic +pal cga0
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'cga0'. Did you mean one of (case-insensitive): cga,cga10,cga20,cga00,cga01,vga?

You can see that my algorithm works.

Progress #1:

I thought of a idea to implement subset fuzzy matching. It expanded result search, and even fixes the earlier bug:

C:\Windows\System32>gmic +pal cga0
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'cga0'. Did you mean one of (case-insensitive): cga00,cga01,cga11,cga,cga21,cga20,cgarne,cga10,vga,crayola?

C:\Windows\System32>gmic +pal app_radiant
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'app_radiant'. Did you mean one of (case-insensitive): aap_radiant_xv?

The solution was simple, I added these lines under the score processing part:

	if whd#$input2>$WHDi1 # Check subset instead to solved missed cases of full score analysis
		+resize[$input2] $WHDi1,1,1,1,-1
		temp_score=${-_$0_score[$input1,-1]}
		score={min($score,$temp_score)}
		rm.
	fi

When the test string is longer than input string, then it only checks a substring instead. Yes, this adds to calculation, but it doesn’t matter as the purpose is to make error messages useful.

However, even with restriction, I run into this:

C:\Windows\System32>gmic +pal mac8
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'mac8'. Did you mean one of (case-insensitive): mac_8_bit,mac2,maw,material_design,marsh_madness,makecode_arcade,matriax8c,magic_waters,marshmellow,amiga7800,amstrad_cpc,ocaso,amiga2600_pal,amiga2600_ntsc,amiga7800_mess,amiga2600_secam?

EDIT 2:

Made some improvement. I made it more strict, but also, made sure prefix equality counts too.

New result:

C:\Windows\System32>gmic +pal aap
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'aap'. Did you mean one of (case-insensitive): aap_dga16,aap128,aap_majesty_xvii,aap_radiant_xv,aap16,aap12,aap96,aap64,paper8,japanese_woodblock,apple?

C:\Windows\System32>gmic +pal mac8
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'mac8'. Did you mean one of (case-insensitive): mac_8_bit,mac2?

C:\Windows\System32>gmic +pal c64
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'c64'. Did you mean one of (case-insensitive): c64_colodore,c64_pepto?


C:\Windows\System32>gmic +pal bga
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'bga'. Did you mean one of (case-insensitive): cga01,cga11,cga10,cga20,vga,cga21,cgarne,brash_pink,black_cherry,cga00,cga,gbg?


C:\Windows\System32>gmic +pal amiga
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'amiga'. Did you mean one of (case-insensitive): amiga7800,amiga2600_secam,amiga7800_mess,amiga2600_ntsc,amiga2600_pal?

Note: ChatGPT points me to length normalization:

normalized_score = score / max(len(input), len(candidate))

Also problem case here:

C:\Windows\System32>gmic +pal rqb
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic] *** Error in ./ *** Invalid value 'rqb'. Did you mean one of (case-insensitive): rube_goldberg,rabbit,rgb,rgbcmy?

More update.

I managed to update my fuzzy matching command to allow blending between 2 classical fuzzy matching algorithm. This way, I can fine-tune the fuzzy matching. It has a built-in debugger, so that you can fine-tune it.

C:\Windows\System32>gmic _SCORE_DEBUG=1 rep_sug_args aap,,1,70%,97.5%,1,1,${-_pal_ids}
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic]./ Set global variable '_SCORE_DEBUG=1'.
[gmic]./ Debugging scores!
[gmic]./ aap vs aap16: 86% (Passed Threshold of 70%!)
[gmic]./ aap vs aap64: 86% (Passed Threshold of 70%!)
[gmic]./ aap vs aap12: 86% (Passed Threshold of 70%!)
[gmic]./ aap vs aap96: 86% (Passed Threshold of 70%!)
[gmic]./ aap vs aap128: 82.5% (Passed Threshold of 70%!)
[gmic]./ aap vs aap_dga16: 76.667% (Passed Threshold of 70%!)
[gmic]./ aap vs amstrad_cpc: 74.545% (Passed Threshold of 70%!)
[gmic]./ aap vs amiga2600_pal: 73.077% (Passed Threshold of 70%!)
[gmic]./ aap vs sahara_pastell: 72.5% (Passed Threshold of 70%!)
[gmic]./ aap vs aap_radiant_xv: 72.5% (Passed Threshold of 70%!)
[gmic]./ aap vs luap: 71.667% (Passed Threshold of 70%!)
[gmic]./ aap vs aap_majesty_xvii: 71.562% (Passed Threshold of 70%!)
[gmic]./ aap vs playpal: 68.81%
[gmic]./ aap vs atari: 68.167%
[gmic]./ aap vs apple: 68.167%
[gmic]./ aap vs arcade: 65.833%
[gmic]./ aap vs cabana: 65.833%
[gmic]./ aap vs kawaii: 65.833%
[gmic]./ aap vs aurora: 65.417%
[gmic]./ aap vs daruda: 65.417%
[gmic]./ aap vs tritanopia: 64.417%
[gmic]./ aap vs faraway: 64.167%
[gmic]./ aap vs crayola: 63.81%
[gmic]./ aap vs apricot: 63.81%
[gmic]./ aap vs trirampo: 62.917%
[gmic]./ aap vs pastel_irena: 62.5%
[gmic]./ aap vs spacey_easter: 62.051%
[gmic]./ aap vs amiga7800: 61.944%
[gmic]./ aap vs fantasy24: 61.944%
[gmic]./ aap vs fantasy16: 61.944%
[gmic]./ aap vs graveyard: 61.944%
[gmic]./ aap vs matriax8c: 61.944%
[gmic]./ aap vs todayland: 61.944%
[gmic]./ aap vs sam_coupe: 61.944%
[gmic]./ aap vs hydrangea: 61.667%
[gmic]./ aap vs nostalgia: 61.667%
[gmic]./ aap vs brash_pink: 61.167%
[gmic]./ aap vs dream_haze: 61.167%
[gmic]./ aap vs gb_andrade: 61.167%
[gmic]./ aap vs starmancer: 61.167%
[gmic]./ aap vs ms_legacy_paint: 61%
[gmic]./ aap vs pastel_and_darks: 60.573%
[gmic]./ aap vs linearbasic: 60.53%
[gmic]./ aap vs ocean_glass: 60.53%
[gmic]./ aap vs human_faces: 60.53%
[gmic]./ aap vs autum_villan: 60%
[gmic]./ aap vs shallowmarsh: 60%
[gmic]./ aap vs lago_nenufar: 60%
[gmic]./ aap vs magic_waters: 60%
[gmic]./ aap vs galaxy_flame: 60%
[gmic]./ aap vs petite_8_afterdark: 59.861%
[gmic]./ aap vs japanese_woodblock: 59.861%
[gmic]./ aap vs gb_nostalgia: 59.792%
[gmic]./ aap vs marsh_madness: 59.551%
[gmic]./ aap vs gb_grapefruit: 59.551%
[gmic]./ aap vs xaiue_radiant: 59.551%
[gmic]./ aap vs pastel_starlitsunset: 59.292%
[gmic]./ aap vs amiga7800_mess: 59.167%
[gmic]./ aap vs amiga2600_ntsc: 59.167%
[gmic]./ aap vs makecode_arcade: 58.833%
[gmic]./ aap vs midnight_ablaze: 58.833%
[gmic]./ aap vs amiga2600_secam: 58.833%
[gmic]./ aap vs material_design: 58.833%
[gmic]./ aap vs boltbait_matrix: 58.833%
[gmic]./ aap vs voltage_warning: 58.833%
[gmic]./ aap vs enchanted_purple: 58.542%
[gmic]./ aap vs boltbait_rainbow: 58.542%
[gmic]./ aap vs fate_and_destiny: 58.542%
[gmic]./ aap vs thehamster_rainbow: 58.056%
[gmic]./ aap vs tranquil_fantasy_23: 57.851%
[gmic]./ aap vs maw: 55%
[gmic]./ aap vs oak: 55%
[gmic]./ aap vs jmp: 55%
[gmic]./ aap vs arq: 55%
[gmic]./ aap vs cga: 54.167%
[gmic]./ aap vs vga: 54.167%
[gmic]./ aap vs atom: 52.083%
[gmic]./ aap vs gzxp: 52.083%
[gmic]./ aap vs mac2: 52.083%
[gmic]./ aap vs calm: 52.083%
[gmic]./ aap vs acid: 52.083%
[gmic]./ aap vs arch: 52.083%
[gmic]./ aap vs hal4: 52.083%
[gmic]./ aap vs arne: 52.083%
[gmic]./ aap vs cade: 52.083%
[gmic]./ aap vs cave: 52.083%
[gmic]./ aap vs nopal: 51.417%
[gmic]./ aap vs polar: 50.333%
[gmic]./ aap vs ocaso: 50.333%
[gmic]./ aap vs regal: 50.333%
[gmic]./ aap vs sandy: 50.333%
[gmic]./ aap vs 15pdx: 50.333%
[gmic]./ aap vs cga21: 50.333%
[gmic]./ aap vs tango: 50.333%
[gmic]./ aap vs cga10: 50.333%
[gmic]./ aap vs royal: 50.333%
[gmic]./ aap vs taffy: 50.333%
[gmic]./ aap vs cdbac: 50.333%
[gmic]./ aap vs abyss: 50.333%
[gmic]./ aap vs xaiue: 50.333%
[gmic]./ aap vs cga01: 50.333%
[gmic]./ aap vs cga20: 50.333%
[gmic]./ aap vs 20pdx: 50.333%
[gmic]./ aap vs cga00: 50.333%
[gmic]./ aap vs ms_xp: 50.333%
[gmic]./ aap vs cga11: 50.333%
[gmic]./ aap vs fairy: 50.333%
[gmic]./ aap vs anb16: 50.333%
[gmic]./ aap vs tfp39: 50.333%
[gmic]./ aap vs 24pdx: 50.333%
[gmic]./ aap vs spicy: 49.833%
[gmic]./ aap vs fleja: 49.833%
[gmic]./ aap vs vista: 49.833%
[gmic]./ aap vs paper8: 49.583%
[gmic]./ aap vs superb: 49.167%
[gmic]./ aap vs mojave: 49.167%
[gmic]./ aap vs star29: 49.167%
[gmic]./ aap vs finlal: 49.167%
[gmic]./ aap vs aerugo: 49.167%
[gmic]./ aap vs clumpy: 49.167%
[gmic]./ aap vs europa: 49.167%
[gmic]./ aap vs oekaki: 49.167%
[gmic]./ aap vs chip16: 49.167%
[gmic]./ aap vs easter: 49.167%
[gmic]./ aap vs star34: 49.167%
[gmic]./ aap vs naji16: 49.167%
[gmic]./ aap vs rabbit: 49.167%
[gmic]./ aap vs pastry: 49.167%
[gmic]./ aap vs peachy: 49.167%
[gmic]./ aap vs island: 49.167%
[gmic]./ aap vs cgarne: 49.167%
[gmic]./ aap vs calder: 49.167%
[gmic]./ aap vs nature: 49.167%
[gmic]./ aap vs lospec: 49.167%
[gmic]./ aap vs nauris: 49.167%
[gmic]./ aap vs pear36: 49.167%
[gmic]./ aap vs arthoe: 49.167%
[gmic]./ aap vs rbypgo: 49.167%
[gmic]./ aap vs itatsi: 49.167%
[gmic]./ aap vs cpcboy: 48.75%
[gmic]./ aap vs pollen: 48.75%
[gmic]./ aap vs spec12: 48.75%
[gmic]./ aap vs drz15a: 48.75%
[gmic]./ aap vs tsunami: 48.333%
[gmic]./ aap vs gb_easy: 48.333%
[gmic]./ aap vs gb_gray: 48.333%
[gmic]./ aap vs inkpink: 48.333%
[gmic]./ aap vs intacto: 48.333%
[gmic]./ aap vs stratus: 48.333%
[gmic]./ aap vs battery: 48.333%
[gmic]./ aap vs cyclope: 48.333%
[gmic]./ aap vs flat_ui: 48.333%
[gmic]./ aap vs gb_arne: 48.333%
[gmic]./ aap vs punolit: 47.976%
[gmic]./ aap vs moderna: 47.976%
[gmic]./ aap vs equpix15: 47.708%
[gmic]./ aap vs retrocal: 47.708%
[gmic]./ aap vs dynamite: 47.708%
[gmic]./ aap vs jerrypie: 47.708%
[gmic]./ aap vs autum_15: 47.708%
[gmic]./ aap vs woodwalk: 47.708%
[gmic]./ aap vs famicube: 47.708%
[gmic]./ aap vs lavender: 47.708%
[gmic]./ aap vs petite_8: 47.396%
[gmic]./ aap vs optimism: 47.396%
[gmic]./ aap vs chocolate: 47.222%
[gmic]./ aap vs halloween: 47.222%
[gmic]./ aap vs christmas: 47.222%
[gmic]./ aap vs chromatic: 47.222%
[gmic]./ aap vs antiquity: 47.222%
[gmic]./ aap vs franzston: 47.222%
[gmic]./ aap vs milkshake: 47.222%
[gmic]./ aap vs frostical: 47.222%
[gmic]./ aap vs mac_8_bit: 47.222%
[gmic]./ aap vs c64_pepto: 47.222%
[gmic]./ aap vs piet_code: 46.944%
[gmic]./ aap vs industrial: 46.833%
[gmic]./ aap vs virtualboy: 46.833%
[gmic]./ aap vs muted_ally: 46.833%
[gmic]./ aap vs fairy_dust: 46.833%
[gmic]./ aap vs hocuspocus: 46.833%
[gmic]./ aap vs cretaceous: 46.833%
[gmic]./ aap vs interstate: 46.833%
[gmic]./ aap vs downgraded: 46.833%
[gmic]./ aap vs vinelinear: 46.833%
[gmic]./ aap vs steamlords: 46.833%
[gmic]./ aap vs pink_green: 46.583%
[gmic]./ aap vs superfuture: 46.515%
[gmic]./ aap vs autochrome3: 46.515%
[gmic]./ aap vs dead_weight: 46.515%
[gmic]./ aap vs sea_of_fire: 46.515%
[gmic]./ aap vs marshmellow: 46.515%
[gmic]./ aap vs golden_wall: 46.515%
[gmic]./ aap vs arctic_dust: 46.515%
[gmic]./ aap vs lilac_skies: 46.515%
[gmic]./ aap vs autochrome5: 46.515%
[gmic]./ aap vs gb_kirokaze: 46.515%
[gmic]./ aap vs copper_tech: 46.515%
[gmic]./ aap vs tropical: 46.354%
[gmic]./ aap vs gb_space: 46.354%
[gmic]./ aap vs moon_crystal: 46.25%
[gmic]./ aap vs gb_blackzone: 46.25%
[gmic]./ aap vs autumn_chill: 46.25%
[gmic]./ aap vs gb_ice_cream: 46.25%
[gmic]./ aap vs deuterospill: 46.25%
[gmic]./ aap vs illumination: 46.25%
[gmic]./ aap vs gb_default_2: 46.25%
[gmic]./ aap vs gb_default_1: 46.25%
[gmic]./ aap vs black_cherry: 46.25%
[gmic]./ aap vs fzt_ethereal: 46.25%
[gmic]./ aap vs ladybug_reds: 46.25%
[gmic]./ aap vs berry_nebula: 46.042%
[gmic]./ aap vs ephemera: 46.042%
[gmic]./ aap vs violet_dreams: 46.026%
[gmic]./ aap vs fornax_void_1: 46.026%
[gmic]./ aap vs fornax_void_2: 46.026%
[gmic]./ aap vs simple_jpc_16: 46.026%
[gmic]./ aap vs gb_harsh_green: 45.833%
[gmic]./ aap vs the_roarin_80s: 45.833%
[gmic]./ aap vs brightness_gpy: 45.833%
[gmic]./ aap vs pineapple: 45.694%
[gmic]./ aap vs broken_facility: 45.667%
[gmic]./ aap vs autum_15_yellow: 45.667%
[gmic]./ aap vs pink_neon_sign: 45.655%
[gmic]./ aap vs deep_maze: 45.417%
[gmic]./ aap vs supernova: 45.417%
[gmic]./ aap vs pixelwave: 45.417%
[gmic]./ aap vs winter_wonderland: 45.392%
[gmic]./ aap vs st_8_red_and_blue: 45.392%
[gmic]./ aap vs electronic_crayon: 45.392%
[gmic]./ aap vs psygnosia: 45.139%
[gmic]./ aap vs pxls_space: 44.667%
[gmic]./ aap vs gb_platinum: 44.053%
[gmic]./ aap vs deluxe_paint: 43.542%
[gmic]./ aap vs cryptic_ocean: 43.109%
[gmic]./ aap vs gb_purple_dawn: 42.738%
[gmic]./ aap vs hotel_paintings: 42.417%
[gmic]./ aap vs reddit_place_2022: 41.887%
[gmic]./ aap vs hollow: 0%
[gmic]./ aap vs edg64: 0%
[gmic]./ aap vs edg36: 0%
[gmic]./ aap vs blk36: 0%
[gmic]./ aap vs blkneo: 0%
[gmic]./ aap vs juicy56: 0%
[gmic]./ aap vs koni: 0%
[gmic]./ aap vs legowiki: 0%
[gmic]./ aap vs juicy32: 0%
[gmic]./ aap vs lego2021: 0%
[gmic]./ aap vs brightwinter2: 0%
[gmic]./ aap vs gb_cyber: 0%
[gmic]./ aap vs gb_wish: 0%
[gmic]./ aap vs brightwinter1: 0%
[gmic]./ aap vs 0xdb: 0%
[gmic]./ aap vs dimwid23: 0%
[gmic]./ aap vs scrj_xxxvi: 0%
[gmic]./ aap vs gb_forest: 0%
[gmic]./ aap vs gb_light_green: 0%
[gmic]./ aap vs juicy: 0%
[gmic]./ aap vs llll: 0%
[gmic]./ aap vs dinoknight: 0%
[gmic]./ aap vs cherrymelon: 0%
[gmic]./ aap vs bubblegum: 0%
[gmic]./ aap vs indecision: 0%
[gmic]./ aap vs gb_red_blue: 0%
[gmic]./ aap vs gb_gold: 0%
[gmic]./ aap vs gb_choco: 0%
[gmic]./ aap vs journey: 0%
[gmic]./ aap vs edg32: 0%
[gmic]./ aap vs win95: 0%
[gmic]./ aap vs zx: 0%
[gmic]./ aap vs gnome: 0%
[gmic]./ aap vs gbg: 0%
[gmic]./ aap vs zenit: 0%
[gmic]./ aap vs uzebox: 0%
[gmic]./ aap vs mo5: 0%
[gmic]./ aap vs trs80: 0%
[gmic]./ aap vs srb2: 0%
[gmic]./ aap vs duel: 0%
[gmic]./ aap vs piet: 0%
[gmic]./ aap vs bw_rgb: 0%
[gmic]./ aap vs b_rgb: 0%
[gmic]./ aap vs hsv: 0%
[gmic]./ aap vs rgb: 0%
[gmic]./ aap vs 1bitrgb: 0%
[gmic]./ aap vs rgbcmy: 0%
[gmic]./ aap vs w_cmyk: 0%
[gmic]./ aap vs cmyk: 0%
[gmic]./ aap vs cmy: 0%
[gmic]./ aap vs db_iso22: 0%
[gmic]./ aap vs db32: 0%
[gmic]./ aap vs db16: 0%
[gmic]./ aap vs db8: 0%
[gmic]./ aap vs cheerful: 0%
[gmic]./ aap vs edg16: 0%
[gmic]./ aap vs edg8: 0%
[gmic]./ aap vs edg4: 0%
[gmic]./ aap vs bw: 0%
[gmic]./ aap vs dimwid17: 0%
[gmic]./ aap vs kens16: 0%
[gmic]./ aap vs msx: 0%
[gmic]./ aap vs nes: 0%
[gmic]./ aap vs pico: 0%
[gmic]./ aap vs risc: 0%
[gmic]./ aap vs c64_colodore: 0%
[gmic]./ aap vs com_vic_20: 0%
[gmic]./ aap vs colecovision: 0%
[gmic]./ aap vs kens54: 0%
[gmic]./ aap vs kens32: 0%
[gmic]./ aap vs funky: 0%
[gmic]./ aap vs generic_8: 0%
[gmic]./ aap vs boomboom: 0%
[gmic]./ aap vs nyx: 0%
[gmic]./ aap vs nt1h: 0%
[gmic]./ aap vs firestorm: 0%
[gmic]./ aap vs borkfest: 0%
[gmic]./ aap vs nineties_nine: 0%
[gmic]./ aap vs rust: 0%
[gmic]./ aap vs rube_goldberg: 0%
[gmic]./ aap vs sheltzy: 0%
[gmic]./ aap vs sunset_red: 0%
[gmic]./ aap vs jewel: 0%
[gmic]./ aap vs greyt_bit: 0%
[gmic]./ aap vs wyrm: 0%
[gmic]./ aap vs oil: 0%
[gmic]./ aap vs yume_nikki: 0%
[gmic]./ aap vs soft_demon: 0%
[gmic]./ aap vs sgm: 0%
[gmic]./ aap vs syz15: 0%
[gmic]./ aap vs sy17: 0%
[gmic]./ aap vs neon: 0%
[gmic]./ aap vs fluffy: 0%
[gmic]./ aap vs ykb: 0%
[gmic]./ aap vs lost_century: 0%
[gmic]./ aap vs murder_mystery: 0%
[gmic]./ aap vs tui15: 0%
[gmic]./ aap vs vinik: 0%
[gmic]./ aap vs cool_bone: 0%
[gmic]./ aap vs fuzzy: 0%
[gmic]./ aap vs blessing: 0%
[gmic]./ aap vs mushroom: 0%
[gmic]./ aap vs on70: 0%
[gmic]./ aap vs rose_moss_8: 0%
[gmic]./ aap vs kule: 0%
[gmic]./ aap vs ink: 0%
[gmic]./ aap vs tinyfolks: 0%
[gmic]./ aap vs old_gold: 0%
[gmic]./ aap vs eggy: 0%
[gmic]./ aap vs moon_squid: 0%
[gmic]./ aap vs sweetie16: 0%
[gmic]./ aap vs clouds_sunset: 0%
[gmic]./ aap vs sunshine: 0%
[gmic]./ aap vs eulbink: 0%
[gmic]./ aap vs enos: 0%
[gmic]./ aap vs sky: 0%
[gmic]./ aap vs shido: 0%
[gmic]./ aap vs vivid: 0%
[gmic]./ aap vs softy: 0%
[gmic]./ aap vs gb_suburb: 0%
[gmic]./ aap vs gb_crimson: 0%
[gmic]./ aap vs gb_didi: 0%
[gmic]./ aap vs gb_dirty: 0%
[gmic]./ aap vs new_worlds: 0%
[gmic]./ aap vs slso_clr17: 0%
[gmic]./ aap vs rosy42: 0%
[gmic]./ aap vs resurrect: 0%
[gmic]./ aap vs gb_blue: 0%
[gmic]./ aap vs h2o: 0%
[gmic]./ aap vs still_life: 0%
[gmic]./ aap vs bluemold: 0%
[gmic]./ aap vs moss: 0%
[gmic]./ aap vs moon39: 0%
[gmic]./ aap vs crimso11: 0%
[gmic]./ aap vs cthul: 0%
[gmic]./ aap vs s1_6: 0%
[gmic]./ aap vs moonlight: 0%
[gmic]./ aap vs toxic_slime: 0%
[gmic]./ aap vs cheese: 0%
[gmic]./ aap vs undertones: 0%
[gmic]./ aap vs grixel: 0%
[gmic]./ aap vs sunflower: 0%
[gmic]./ aap vs zughy: 0%
[gmic]./ aap vs lush_green: 0%
[gmic]./ aap vs night: 0%
[gmic]./ aap vs voodo: 0%
[gmic]./ aap vs oxyd: 0%
[gmic]./ Exit debug, and quit interpreter!
C:\Windows\System32>gmic _SCORE_DEBUG=1 rep_sug_args cga0,,1,70%,97.5%,1,1,${-_pal_ids}
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic]./ Set global variable '_SCORE_DEBUG=1'.
[gmic]./ Debugging scores!
[gmic]./ cga0 vs cga01: 93% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cga20: 93% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cga00: 93% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cga10: 93% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cga: 91.25% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cga11: 77.875% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cga21: 77.875% (Passed Threshold of 70%!)
[gmic]./ cga0 vs cgarne: 74.375% (Passed Threshold of 70%!)
[gmic]./ cga0 vs vga: 71.667% (Passed Threshold of 70%!)
[gmic]./ cga0 vs amiga2600_ntsc: 66.696%
[gmic]./ cga0 vs amiga2600_secam: 66.042%
[gmic]./ cga0 vs cade: 65.625%
[gmic]./ cga0 vs calm: 65.625%
[gmic]./ cga0 vs cave: 65.625%
[gmic]./ cga0 vs cdbac: 62.75%
[gmic]./ cga0 vs regal: 62.75%
[gmic]./ cga0 vs ocaso: 62.25%
[gmic]./ cga0 vs cabana: 60.417%
[gmic]./ cga0 vs calder: 60%
[gmic]./ cga0 vs gb_gray: 58.75%
[gmic]./ cga0 vs crayola: 58.75%
[gmic]./ cga0 vs gb_space: 58.542%
[gmic]./ cga0 vs gb_arne: 58.393%
[gmic]./ cga0 vs gb_easy: 58.393%
[gmic]./ cga0 vs amiga7800: 57.708%
[gmic]./ cga0 vs lego2021: 57.5%
[gmic]./ cga0 vs tropical: 57.187%
[gmic]./ cga0 vs retrocal: 57.187%
[gmic]./ cga0 vs chocolate: 56.528%
[gmic]./ cga0 vs christmas: 56.528%
[gmic]./ cga0 vs chromatic: 56.528%
[gmic]./ cga0 vs psygnosia: 56.25%
[gmic]./ cga0 vs graveyard: 56.25%
[gmic]./ cga0 vs frostical: 56.25%
[gmic]./ cga0 vs cretaceous: 55.75%
[gmic]./ cga0 vs downgraded: 55.75%
[gmic]./ cga0 vs com_vic_20: 55.75%
[gmic]./ cga0 vs ocean_glass: 55.587%
[gmic]./ cga0 vs gb_andrade: 55.5%
[gmic]./ cga0 vs gb_kirokaze: 54.886%
[gmic]./ cga0 vs golden_wall: 54.886%
[gmic]./ cga0 vs gb_platinum: 54.886%
[gmic]./ cga0 vs gb_ice_cream: 54.583%
[gmic]./ cga0 vs moon_crystal: 54.583%
[gmic]./ cga0 vs magic_waters: 54.583%
[gmic]./ cga0 vs gb_default_2: 54.375%
[gmic]./ cga0 vs gb_nostalgia: 54.375%
[gmic]./ cga0 vs gb_default_1: 54.375%
[gmic]./ cga0 vs galaxy_flame: 54.375%
[gmic]./ cga0 vs gb_blackzone: 54.375%
[gmic]./ cga0 vs cryptic_ocean: 54.135%
[gmic]./ cga0 vs gb_grapefruit: 54.135%
[gmic]./ cga0 vs amiga2600_pal: 54.119%
[gmic]./ cga0 vs the_roarin_80s: 53.75%
[gmic]./ cga0 vs gb_purple_dawn: 53.571%
[gmic]./ cga0 vs gb_harsh_green: 53.571%
[gmic]./ cga0 vs amiga7800_mess: 53.542%
[gmic]./ cga0 vs midnight_ablaze: 53.417%
[gmic]./ cga0 vs enchanted_purple: 53.125%
[gmic]./ cga0 vs ms_legacy_paint: 52.875%
[gmic]./ cga0 vs electronic_crayon: 52.868%
[gmic]./ cga0 vs cmy: 52.083%
[gmic]./ cga0 vs gbg: 52.083%
[gmic]./ cga0 vs rgb: 52.083%
[gmic]./ cga0 vs maw: 52.083%
[gmic]./ cga0 vs oak: 52.083%
[gmic]./ cga0 vs sgm: 52.083%
[gmic]./ cga0 vs reddit_place_2022: 52.071%
[gmic]./ cga0 vs cmyk: 49.375%
[gmic]./ cga0 vs eggy: 49.375%
[gmic]./ cga0 vs on70: 49.375%
[gmic]./ cga0 vs luap: 49.375%
[gmic]./ cga0 vs pico: 48.75%
[gmic]./ cga0 vs acid: 48.75%
[gmic]./ cga0 vs hal4: 48.75%
[gmic]./ cga0 vs gzxp: 48.75%
[gmic]./ cga0 vs risc: 48.75%
[gmic]./ cga0 vs arch: 48.75%
[gmic]./ cga0 vs edg8: 48.75%
[gmic]./ cga0 vs edg4: 48.75%
[gmic]./ cga0 vs mac2: 48.75%
[gmic]./ cga0 vs polar: 47.625%
[gmic]./ cga0 vs cthul: 47.625%
[gmic]./ cga0 vs zughy: 47.625%
[gmic]./ cga0 vs nopal: 47.625%
[gmic]./ cga0 vs atari: 47.625%
[gmic]./ cga0 vs edg32: 47.625%
[gmic]./ cga0 vs night: 47.625%
[gmic]./ cga0 vs trs80: 47.625%
[gmic]./ cga0 vs royal: 47.625%
[gmic]./ cga0 vs edg36: 47.625%
[gmic]./ cga0 vs edg16: 47.625%
[gmic]./ cga0 vs edg64: 47.625%
[gmic]./ cga0 vs fairy: 47.125%
[gmic]./ cga0 vs xaiue: 47.125%
[gmic]./ cga0 vs sandy: 47.125%
[gmic]./ cga0 vs gnome: 47.125%
[gmic]./ cga0 vs b_rgb: 47.125%
[gmic]./ cga0 vs vista: 47.125%
[gmic]./ cga0 vs aap12: 47.125%
[gmic]./ cga0 vs aap16: 47.125%
[gmic]./ cga0 vs aap64: 47.125%
[gmic]./ cga0 vs aap96: 47.125%
[gmic]./ cga0 vs taffy: 47.125%
[gmic]./ cga0 vs spicy: 47.125%
[gmic]./ cga0 vs fleja: 47.125%
[gmic]./ cga0 vs juicy: 47.125%
[gmic]./ cga0 vs finlal: 46.458%
[gmic]./ cga0 vs chip16: 46.458%
[gmic]./ cga0 vs w_cmyk: 46.458%
[gmic]./ cga0 vs cpcboy: 46.458%
[gmic]./ cga0 vs itatsi: 46.458%
[gmic]./ cga0 vs oekaki: 46.458%
[gmic]./ cga0 vs island: 46.458%
[gmic]./ cga0 vs cheese: 46.458%
[gmic]./ cga0 vs clumpy: 46.458%
[gmic]./ cga0 vs star29: 46.458%
[gmic]./ cga0 vs pear36: 46.458%
[gmic]./ cga0 vs kawaii: 46.458%
[gmic]./ cga0 vs star34: 46.458%
[gmic]./ cga0 vs mojave: 46.458%
[gmic]./ cga0 vs arthoe: 46.042%
[gmic]./ cga0 vs grixel: 46.042%
[gmic]./ cga0 vs paper8: 46.042%
[gmic]./ cga0 vs drz15a: 46.042%
[gmic]./ cga0 vs aurora: 46.042%
[gmic]./ cga0 vs bw_rgb: 46.042%
[gmic]./ cga0 vs europa: 46.042%
[gmic]./ cga0 vs nature: 46.042%
[gmic]./ cga0 vs rbypgo: 46.042%
[gmic]./ cga0 vs nauris: 46.042%
[gmic]./ cga0 vs spec12: 46.042%
[gmic]./ cga0 vs daruda: 46.042%
[gmic]./ cga0 vs aap128: 46.042%
[gmic]./ cga0 vs rabbit: 46.042%
[gmic]./ cga0 vs naji16: 46.042%
[gmic]./ cga0 vs easter: 46.042%
[gmic]./ cga0 vs pastry: 46.042%
[gmic]./ cga0 vs lospec: 46.042%
[gmic]./ cga0 vs cyclope: 45.625%
[gmic]./ cga0 vs gb_gold: 45.625%
[gmic]./ cga0 vs stratus: 45.625%
[gmic]./ cga0 vs faraway: 45.625%
[gmic]./ cga0 vs juicy32: 45.625%
[gmic]./ cga0 vs juicy56: 45.625%
[gmic]./ cga0 vs tsunami: 45.625%
[gmic]./ cga0 vs flat_ui: 45.625%
[gmic]./ cga0 vs playpal: 45.625%
[gmic]./ cga0 vs tango: 45.5%
[gmic]./ cga0 vs moderna: 45.268%
[gmic]./ cga0 vs gb_didi: 45.268%
[gmic]./ cga0 vs 1bitrgb: 45.268%
[gmic]./ cga0 vs gb_wish: 45.268%
[gmic]./ cga0 vs gb_blue: 45.268%
[gmic]./ cga0 vs battery: 45.268%
[gmic]./ cga0 vs cheerful: 45%
[gmic]./ cga0 vs legowiki: 45%
[gmic]./ cga0 vs woodwalk: 45%
[gmic]./ cga0 vs old_gold: 45%
[gmic]./ cga0 vs trirampo: 45%
[gmic]./ cga0 vs dynamite: 45%
[gmic]./ cga0 vs crimso11: 45%
[gmic]./ cga0 vs ephemera: 44.688%
[gmic]./ cga0 vs autum_15: 44.688%
[gmic]./ cga0 vs gb_dirty: 44.688%
[gmic]./ cga0 vs lavender: 44.688%
[gmic]./ cga0 vs blessing: 44.688%
[gmic]./ cga0 vs pixelwave: 44.514%
[gmic]./ cga0 vs piet_code: 44.514%
[gmic]./ cga0 vs cool_bone: 44.514%
[gmic]./ cga0 vs moonlight: 44.514%
[gmic]./ cga0 vs fantasy16: 44.514%
[gmic]./ cga0 vs deep_maze: 44.514%
[gmic]./ cga0 vs todayland: 44.514%
[gmic]./ cga0 vs c64_pepto: 44.514%
[gmic]./ cga0 vs franzston: 44.514%
[gmic]./ cga0 vs pineapple: 44.514%
[gmic]./ cga0 vs milkshake: 44.514%
[gmic]./ cga0 vs fantasy24: 44.514%
[gmic]./ cga0 vs bubblegum: 44.514%
[gmic]./ cga0 vs supernova: 44.236%
[gmic]./ cga0 vs gb_forest: 44.236%
[gmic]./ cga0 vs gb_suburb: 44.236%
[gmic]./ cga0 vs halloween: 44.236%
[gmic]./ cga0 vs greyt_bit: 44.236%
[gmic]./ cga0 vs resurrect: 44.236%
[gmic]./ cga0 vs antiquity: 44.236%
[gmic]./ cga0 vs dream_haze: 44.125%
[gmic]./ cga0 vs indecision: 44.125%
[gmic]./ cga0 vs pink_green: 44.125%
[gmic]./ cga0 vs vinelinear: 44.125%
[gmic]./ cga0 vs steamlords: 44.125%
[gmic]./ cga0 vs dinoknight: 44.125%
[gmic]./ cga0 vs tritanopia: 44.125%
[gmic]./ cga0 vs virtualboy: 44.125%
[gmic]./ cga0 vs industrial: 44.125%
[gmic]./ cga0 vs hocuspocus: 44.125%
[gmic]./ cga0 vs muted_ally: 44.125%
[gmic]./ cga0 vs slso_clr17: 44.125%
[gmic]./ cga0 vs lush_green: 44.125%
[gmic]./ cga0 vs interstate: 44.125%
[gmic]./ cga0 vs scrj_xxxvi: 44.125%
[gmic]./ cga0 vs brash_pink: 44.125%
[gmic]./ cga0 vs fairy_dust: 43.875%
[gmic]./ cga0 vs sea_of_fire: 43.807%
[gmic]./ cga0 vs copper_tech: 43.807%
[gmic]./ cga0 vs cherrymelon: 43.807%
[gmic]./ cga0 vs toxic_slime: 43.807%
[gmic]./ cga0 vs peachy: 43.75%
[gmic]./ cga0 vs rgbcmy: 43.75%
[gmic]./ cga0 vs arcade: 43.75%
[gmic]./ cga0 vs gb_red_blue: 43.58%
[gmic]./ cga0 vs marshmellow: 43.58%
[gmic]./ cga0 vs shallowmarsh: 43.542%
[gmic]./ cga0 vs deluxe_paint: 43.542%
[gmic]./ cga0 vs lost_century: 43.542%
[gmic]./ cga0 vs autum_villan: 43.542%
[gmic]./ cga0 vs c64_colodore: 43.542%
[gmic]./ cga0 vs colecovision: 43.542%
[gmic]./ cga0 vs fzt_ethereal: 43.542%
[gmic]./ cga0 vs illumination: 43.542%
[gmic]./ cga0 vs aerugo: 43.333%
[gmic]./ cga0 vs berry_nebula: 43.333%
[gmic]./ cga0 vs pastel_irena: 43.333%
[gmic]./ cga0 vs xaiue_radiant: 43.317%
[gmic]./ cga0 vs marsh_madness: 43.317%
[gmic]./ cga0 vs fornax_void_2: 43.317%
[gmic]./ cga0 vs fornax_void_1: 43.317%
[gmic]./ cga0 vs clouds_sunset: 43.317%
[gmic]./ cga0 vs brightwinter2: 43.317%
[gmic]./ cga0 vs brightwinter1: 43.317%
[gmic]./ cga0 vs simple_jpc_16: 43.317%
[gmic]./ cga0 vs rube_goldberg: 43.317%
[gmic]./ cga0 vs violet_dreams: 43.317%
[gmic]./ cga0 vs gb_light_green: 43.125%
[gmic]./ cga0 vs brightness_gpy: 43.125%
[gmic]./ cga0 vs sahara_pastell: 43.125%
[gmic]./ cga0 vs aap_radiant_xv: 43.125%
[gmic]./ cga0 vs boltbait_matrix: 42.958%
[gmic]./ cga0 vs pink_neon_sign: 42.946%
[gmic]./ cga0 vs aap_majesty_xvii: 42.812%
[gmic]./ cga0 vs pastel_and_darks: 42.812%
[gmic]./ cga0 vs boltbait_rainbow: 42.812%
[gmic]./ cga0 vs fate_and_destiny: 42.812%
[gmic]./ cga0 vs autum_15_yellow: 42.792%
[gmic]./ cga0 vs winter_wonderland: 42.684%
[gmic]./ cga0 vs st_8_red_and_blue: 42.684%
[gmic]./ cga0 vs thehamster_rainbow: 42.569%
[gmic]./ cga0 vs petite_8_afterdark: 42.569%
[gmic]./ cga0 vs tranquil_fantasy_23: 42.467%
[gmic]./ cga0 vs pastel_starlitsunset: 42.375%
[gmic]./ cga0 vs intacto: 42.143%
[gmic]./ cga0 vs apricot: 41.786%
[gmic]./ cga0 vs gb_cyber: 40.938%
[gmic]./ cga0 vs famicube: 40.938%
[gmic]./ cga0 vs gb_choco: 40.938%
[gmic]./ cga0 vs aap_dga16: 40.278%
[gmic]./ cga0 vs hydrangea: 40%
[gmic]./ cga0 vs nostalgia: 40%
[gmic]./ cga0 vs matriax8c: 40%
[gmic]./ cga0 vs sam_coupe: 40%
[gmic]./ cga0 vs mac_8_bit: 40%
[gmic]./ cga0 vs generic_8: 39.722%
[gmic]./ cga0 vs starmancer: 39.25%
[gmic]./ cga0 vs pxls_space: 39.25%
[gmic]./ cga0 vs gb_crimson: 39.25%
[gmic]./ cga0 vs dead_weight: 38.636%
[gmic]./ cga0 vs arctic_dust: 38.636%
[gmic]./ cga0 vs amstrad_cpc: 38.636%
[gmic]./ cga0 vs linearbasic: 38.636%
[gmic]./ cga0 vs autochrome5: 38.636%
[gmic]./ cga0 vs human_faces: 38.636%
[gmic]./ cga0 vs autochrome3: 38.636%
[gmic]./ cga0 vs lilac_skies: 38.636%
[gmic]./ cga0 vs lago_nenufar: 38.333%
[gmic]./ cga0 vs autumn_chill: 38.125%
[gmic]./ cga0 vs ladybug_reds: 38.125%
[gmic]./ cga0 vs black_cherry: 38.125%
[gmic]./ cga0 vs spacey_easter: 37.885%
[gmic]./ cga0 vs voltage_warning: 37.167%
[gmic]./ cga0 vs makecode_arcade: 37.167%
[gmic]./ cga0 vs material_design: 37%
[gmic]./ cga0 vs broken_facility: 37%
[gmic]./ cga0 vs hotel_paintings: 37%
[gmic]./ cga0 vs japanese_woodblock: 36.25%
[gmic]./ cga0 vs journey: 0%
[gmic]./ cga0 vs jmp: 0%
[gmic]./ cga0 vs 0xdb: 0%
[gmic]./ cga0 vs blk36: 0%
[gmic]./ cga0 vs atom: 0%
[gmic]./ cga0 vs blkneo: 0%
[gmic]./ cga0 vs arq: 0%
[gmic]./ cga0 vs llll: 0%
[gmic]./ cga0 vs new_worlds: 0%
[gmic]./ cga0 vs optimism: 0%
[gmic]./ cga0 vs vivid: 0%
[gmic]./ cga0 vs shido: 0%
[gmic]./ cga0 vs enos: 0%
[gmic]./ cga0 vs superb: 0%
[gmic]./ cga0 vs nes: 0%
[gmic]./ cga0 vs rosy42: 0%
[gmic]./ cga0 vs softy: 0%
[gmic]./ cga0 vs apple: 0%
[gmic]./ cga0 vs superfuture: 0%
[gmic]./ cga0 vs sunshine: 0%
[gmic]./ cga0 vs sweetie16: 0%
[gmic]./ cga0 vs koni: 0%
[gmic]./ cga0 vs uzebox: 0%
[gmic]./ cga0 vs kens16: 0%
[gmic]./ cga0 vs kens32: 0%
[gmic]./ cga0 vs kens54: 0%
[gmic]./ cga0 vs db8: 0%
[gmic]./ cga0 vs db16: 0%
[gmic]./ cga0 vs zenit: 0%
[gmic]./ cga0 vs hsv: 0%
[gmic]./ cga0 vs duel: 0%
[gmic]./ cga0 vs piet: 0%
[gmic]./ cga0 vs srb2: 0%
[gmic]./ cga0 vs ms_xp: 0%
[gmic]./ cga0 vs db32: 0%
[gmic]./ cga0 vs 15pdx: 0%
[gmic]./ cga0 vs 20pdx: 0%
[gmic]./ cga0 vs 24pdx: 0%
[gmic]./ cga0 vs bw: 0%
[gmic]./ cga0 vs msx: 0%
[gmic]./ cga0 vs tfp39: 0%
[gmic]./ cga0 vs zx: 0%
[gmic]./ cga0 vs win95: 0%
[gmic]./ cga0 vs db_iso22: 0%
[gmic]./ cga0 vs dimwid17: 0%
[gmic]./ cga0 vs dimwid23: 0%
[gmic]./ cga0 vs mo5: 0%
[gmic]./ cga0 vs undertones: 0%
[gmic]./ cga0 vs firestorm: 0%
[gmic]./ cga0 vs borkfest: 0%
[gmic]./ cga0 vs rust: 0%
[gmic]./ cga0 vs nyx: 0%
[gmic]./ cga0 vs oil: 0%
[gmic]./ cga0 vs soft_demon: 0%
[gmic]./ cga0 vs petite_8: 0%
[gmic]./ cga0 vs vinik: 0%
[gmic]./ cga0 vs ykb: 0%
[gmic]./ cga0 vs deuterospill: 0%
[gmic]./ cga0 vs ink: 0%
[gmic]./ cga0 vs tinyfolks: 0%
[gmic]./ cga0 vs rose_moss_8: 0%
[gmic]./ cga0 vs abyss: 0%
[gmic]./ cga0 vs moon39: 0%
[gmic]./ cga0 vs h2o: 0%
[gmic]./ cga0 vs oxyd: 0%
[gmic]./ cga0 vs bluemold: 0%
[gmic]./ cga0 vs moss: 0%
[gmic]./ cga0 vs s1_6: 0%
[gmic]./ cga0 vs moon_squid: 0%
[gmic]./ cga0 vs eulbink: 0%
[gmic]./ cga0 vs sunset_red: 0%
[gmic]./ cga0 vs inkpink: 0%
[gmic]./ cga0 vs sky: 0%
[gmic]./ cga0 vs sunflower: 0%
[gmic]./ cga0 vs wyrm: 0%
[gmic]./ cga0 vs yume_nikki: 0%
[gmic]./ cga0 vs boomboom: 0%
[gmic]./ cga0 vs funky: 0%
[gmic]./ cga0 vs nt1h: 0%
[gmic]./ cga0 vs jerrypie: 0%
[gmic]./ cga0 vs sheltzy: 0%
[gmic]./ cga0 vs equpix15: 0%
[gmic]./ cga0 vs hollow: 0%
[gmic]./ cga0 vs voodo: 0%
[gmic]./ cga0 vs still_life: 0%
[gmic]./ cga0 vs jewel: 0%
[gmic]./ cga0 vs arne: 0%
[gmic]./ cga0 vs fluffy: 0%
[gmic]./ cga0 vs neon: 0%
[gmic]./ cga0 vs sy17: 0%
[gmic]./ cga0 vs syz15: 0%
[gmic]./ cga0 vs tui15: 0%
[gmic]./ cga0 vs murder_mystery: 0%
[gmic]./ cga0 vs kule: 0%
[gmic]./ cga0 vs nineties_nine: 0%
[gmic]./ cga0 vs anb16: 0%
[gmic]./ cga0 vs punolit: 0%
[gmic]./ cga0 vs mushroom: 0%
[gmic]./ cga0 vs fuzzy: 0%
[gmic]./ cga0 vs pollen: 0%
[gmic]./ Exit debug, and quit interpreter!

I think I can leave it like this. I’m pretty happy with this.

Forgot to mention, the whole idea is based on this - GitHub - xreeple/winklestein: Winklestein is a hybrid string similarity algorithm that combines Levenshtein Distance and Jaro–Winkler Similarity to provide accurate, robust, and tunable similarity scoring for short and medium-length text inputs. · GitHub

Actually, I improved the fuzzy algorithm of mine by allowing an alt variant of jaro-winkler. In addition, I added prefix boost.

See the improvement:

C:\Windows\System32>gmic _EXAM_SIM=1 rep_sug_args aap,,0,66.66%,-97.5%,1,10%,0,${-_pal_ids} e ${}
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic]./ Set global variable '_EXAM_SIM=1'.
[gmic]./ ~ Debugged score result ~
[gmic]./ aap vs aap64: 87.4% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap96: 87.4% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap12: 87.4% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap16: 87.4% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap128: 84.25% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap_dga16: 79% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap_radiant_xv: 75.25% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs aap_majesty_xvii: 74.41% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs apple: 68.02% (Passed similarity threshold of 66.66%)
[gmic]./ aap vs luap: 64.5%
[gmic]./ aap vs apricot: 59.1%
[gmic]./ aap vs pastel_and_darks: 57.85%
[gmic]./ aap vs pastel_starlitsunset: 56.7%
C:\Windows\System32>gmic _EXAM_SIM=1 rep_sug_args cga0,,0,66.66%,-97.5%,1,10%,0,${-_pal_ids} e ${}
[gmic]./ Start G'MIC interpreter (v.3.7.3).
[gmic]./ Set global variable '_EXAM_SIM=1'.
[gmic]./ ~ Debugged score result ~
[gmic]./ cga0 vs cga00: 93.7% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cga01: 93.7% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cga20: 89.7% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cga10: 89.7% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cga: 88.13% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cga21: 76.09% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cga11: 76.09% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs cgarne: 72.94% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs vga: 69.5% (Passed similarity threshold of 66.66%)
[gmic]./ cga0 vs calm: 60.06%
[gmic]./ cga0 vs cave: 60.06%
[gmic]./ cga0 vs cade: 60.06%

Isn’t this amazing?

aap vs pastel_and_darks: 57.85%
aap vs pastel_starlitsunset: 56.7%

How can this be? Because of “pa” in “pastel”? Maybe it should check the difference in number of characters too? Or maybe I’m missing something.
Or was it your previous code?

It’s because Jaro-Winkler algorithm places emphasis on prefix of string, and the 10% prefix boost I added which places even more emphasis on prefix. I don’t plan on overengineering though. The reason I created this command is to add features to some of my command to tell users which arguments is valid if they mis-typoed. It’s very configurable and fast now, which is all that matters.

Not yet pushed to gmic-community.

Ok, I see. I suppose you’re not going to suggest a whole list anyway? At least not past 66% similarity?
Anyway, that’s cool.

Yep. That how it works.

This is for pal command. If you mistyped cga* argument. It’ll return all the ones with 66.66%+ similarity. The rest are discarded.

C:\Windows\System32>gmic rep_sug_args cga0,,1,66.66%,-97.5%,1,10%,0,${-_pal_ids} e ${}
[gmic]./ Start G'MIC interpreter (v.3.7.3).
cga00,cga01,cga10,cga20,cga,cga21,cga11,cgarne,vga
[gmic]./ End G'MIC interpreter
1 Like

@prawnsushi This new command is now here. Feel free to use it in your error messages or just try it out as a basic search engine.

@David_Tschumperle Thanks for the update fix!

I added a new feature for this command. I added Smith-Waterman algorithm as a option for increased fuzzy matching options. I think that’s pretty much it. I don’t think I can improve it, except maybe for execution time, but doubtful on execution part. Already does 30 ms at most for 5000 words, which is actually really good because that means one can implement a way to suggest variety of commands at once.

I had the same observation as @prawnsushi of the percentage oddity. Anyway, I wonder what David does for G’MIC suggestions. I also wonder whether G’MIC native commands and scripts could make a simpler, more efficient solution. Just musing.

It is a coincidence since I had been exploring a little fuzzy matching at work last month, where logged names for equivalent in-person and online courses had different but related text. Needed a relatively safe dedup to ensure participation counts were accurate.

1 Like

I don’t think that’s possible. The algorithm mainly merge arguments into 2 different images. Let’s say cat, dog, cat, heart,love,heart.

[0] → concatenated deduplicated words catdogheartlove
[1] → offset / size of word [0,3],[3,3],[6,5],[11,4]

And G’MIC relies on image processing. this means it’s probably the fastest you can get. Now, could there be better code with less knobs out there, yes. Multi-threading could also be a option, but I don’t think that’s needed since it does 5000 words in nearly 30 ms with just one thread. So, that’s basically similar to 34 FPS. With multi-threading, you can probably do similar time with with 50000 words.

Also, forgot a idea, there can also be math parser variant where you aren’t converting a lot of strings into image, but you’d run into a big issue of comma in some scenarios, but for this purpose, that can be ignored. That’ll shave only 4-5 ms per 385 words. Practically instantaneous for 50000 words. But, not worth the sacrifice for comma handling.

Efficiency may be the incorrect diction since you are quite good at it. I meant using PSNR or something familiar (which may not be a relevant shout out, but I hope you get what I mean).

I guess strategy is what I am getting at. Now, I have not read your code or am not aware of the algorithms which it is inspired by, so maybe this comes across as a non-issue.

aap vs pastel_and_darks: 57.85%
aap vs pastel_starlitsunset: 56.7%

Just looking at what prawn pointed out in isolation, it appears that the comparison algorithm does not factor distance of letters and nature of words all that well.

Take aap for example. Could be someone:

  1. Typing in a dyslexic manner {aap, apa, paa; app, pap, ppa}.
  2. Mistyping:
    a. On QWERTY, a could be a mistype of {q, w, s, x, z}
    b. Resulting from spelling errors or longer words.

For cases (1) and (2a), we can map the distance from an original position and proximity from typeable characters.

Case (2b) is harder in your case because we use abbreviations like aap. In my work example, I truncated longer words to ensure root words are captured. I also tokenized words so order of whole words (real or otherwise) does not matter; it is the content that matters. (In your case, you can still provide a dictionary “words” if they are known.)

Take the first example:

{aap, pastel_and_darks}

The two items can be a match because we have pas, which satisfies fuzzy criteria (1) and (2a). a and p are there, just in a different order, and s could have been an a with nimbler brain-finger coordination.

We also have to demerit the rest:

  1. For the longer text: tel_and_darks.
  2. For the word pastel being longer than aap, perhaps as a result of case (2b) if we are being fuzzy-generous.
1 Like

Hmm, you’re correct, but I’m not sure how to deal with this issue at all.

If you ever do read my code, most of the code worth looking at is within the giant eval block. Some notes if you do:

TL1=i(#pos_and_count_ind,ind,0,0,count_channel); # This is temporary size of second string.
L1_pos=i(#pos_and_count_ind,ind,0,0,pos_channel); # This refers to position of concatenated string image.

i[#input_word_ind,p]!=i[#str_col_ind,L1_pos+p] # You can see that input word is compared against word in list of words to compare again, determined by the position L1_pos+offset.

The algorithm is winklestein (Linear blend between Jaro-Winkler and Levenshtein algorithm) with prefix+Smith Waterman (linear blend) boost factor.