Python cuda port - #2
Open
SebastianGruza wants to merge 39 commits into
Open
Conversation
Port TspSolver Java/Aparapi -> Python/CUDA. Cel: jakosc >= oryginalu dla n>3000. - tsp_io.py: loader TSPLIB EUC_2D + full.txd (miasta PL), macierz int32 (zaokraglenie nint wg TSPLIB), NN init, tour_len. Zwalidowane na berlin52/kroA100/pcb3038. - README: architektura (persistent cooperative kernel + grid.sync, hybryda Numba/CUDA-C), shim CUDA_HOME dla toolkitu Debiana. Fundament zwalidowany: Numba cooperative groups grid.sync dziala na RTX 3090. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Walidacja berlin52: tour_len GPU==CPU (8980); 2-opt poprawia trase, permutacja zachowana, 21M iter/s. Increment silnika (PRNG+odleglosci+chirurgia trasy). Jakosc do domkniecia pelnym memetykiem. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…kroA100 Persistent cooperative kernel: caly bieg w jednym launchu, bariera epoki = grid.sync (cooperative groups). Per watek = wyspa ILS: pelny 2-opt do lok. optimum -> akceptacja ILS -> double-bridge; migracja miedzy wyspami (adopcja best sasiada) przez grid.sync. CPU tylko odpala + czyta best (realizacja wymogu: sync tylko na GPU). Walidacja: berlin52=7542 (0.000%), kroA100=21282 (0.000%). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2-opt na K najblizszych sasiadach + tablica pozycji + pruning => O(n*K)/sweep zamiast O(n^2). Odblokowuje duze n. Male nadal w optimum (berlin52/kroA100 0.000%, szybciej); pcb3038 liczy sie w ~11s (100 epok, gap 11% - do domkniecia Or-opt+budzetem). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
local_search = naprzemiennie 2-opt <-> Or-opt (relokacja 1 miasta obok bliskiego sasiada, tablica pozycji, perm zachowana). Male nadal 0.000%; pcb3038 z 11.16% na 4.45% (perm_ok). Koszt: relokacja O(n) shift (do optymalizacji linked-list/cap). Do celu 2.5% brakuje budzetu czasu + ew. 3-opt/OX. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Struktura jak oryginal: pm osobnikow/wyspa, OX crossover + selekcja elitarna (dziecko wypiera najslabszego), C kolonii z migracja w obrebie kolonii (race-free: bufor migranta + 2 fazy grid.sync). Lokalnie 2-opt<->Or-opt + double-bridge. Male 0.000% (perm_ok); pcb3038 4.246% (bije ILS 4.45%) ale 303s/40 epok. Dalej: grzebanie w mutacjach/perf (skip re-LS rodzicow, O(1) relokacja) + budzet -> <=2.5%. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rodzice sa juz w lok. optimum (LS jako dzieci/init) => nie re-LS-ujemy co epoke. LS tylko dzieci OX + perturbowany najslabszy. pcb3038: 4.25%->4.06% i szybciej (303s->259s/40 epok). Male 0.000% (perm_ok). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
load_tsplib zwraca EDGE_WEIGHT_TYPE; dist_matrix liczy GEO (geo TSPLIB) i ATT (pseudo-eukl) obok EUC_2D. Odblokowuje benchmark gr*/att*. Walidacja gr431 (GEO): 171416 vs opt 171414 = 0.001% (perm_ok). berlin52 EUC nadal 0.000%. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ginal Kluczowa dzwignia: T=256 marnuje 3090 (10k rdzeni bezczynnych). Wiecej wysp jest niemal darmowe czasowo dla n<~1000 i mocno poprawia jakosc. T=4096 pm=4 = 16384 osobnikow (vs 2048 w oryginale) => gr431 gap 0.000% (dokladne optimum) w 84.6s vs oryginal 0.64% w 212s. Domyslne T 256->2048. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…iej) pr1002 EUC opt 259045: T=2048 ge=150 -> 1.071% w 172s (oryginal 1.19% w 817s). T=4096 gorsze (1.545%) - przy n>=1000 GPU sie nasyca, epoki rzadza nad wyspami => nastepny lever to szybszy LS (dont-look bits). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
reverse [i+1..j]+[j+1..k], nowe krawedzie a-c,b-e,d-f; c w sasiadach(a), e w sasiadach(b), pruning a-c. Wpiete 2-opt<->Or-opt<->3-opt. gr431 T=4096 ge=100: 0.033%->0.001% ~ten sam czas (near-opt w ~60% epok). kroA100 0.000% perm_ok. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Postep portu: caly bieg ewolucyjny na GPU (persistent cooperative kernel, grid.sync per epoke, zero round-tripow CPU), neighbor-list 2/3-opt+Or-opt, ~16k osobnikow vs 2k. Benchmark RTX3090: gr431 0.000%/85s (vs 0.64%/212s), pr1002 0.191%/328s (vs 1.19%/817s) - bije oryginal jakosciowo i czasowo. Port rozwijany z Claude (Fable 5) w Claude Code. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…cja use_merge Jak w oryginale: w 4 oknach wokol progow 0.25/0.5/0.75/0.9 budzetu migracja staje sie GLOBALNA (miesza kolonie), poza oknami intra-colony (re-dywergencja). Race-free (bufor migranta + 2 fazy grid.sync). A/B pr1002 ge=300: merge=1 0.173% vs merge=0 0.191% (maly plus na trudnej instancji, marginalnie szybciej); gr431 neutralny/szum. Default-off, przelacznik. Jedno ziarno - do potwierdzenia multi-seed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… tabu) Analog kary tabu ×1.004 z oryginalu: osobnik starszy niz prog (30 gen) dostaje +0.4% do dlugosci EFEKTYWNEJ w selekcji => latwiej go wyprzec = dywersyfikacja/ucieczka z lok. optimum. Best-ever per wyspa (gbest/gbest_route) sledzony osobno i ODPORNY na kare => wynik nigdy nie gubi prawdziwego najlepszego. Przelacznik use_tabu do A/B. Male 0.000% perm_ok (tabu 0 i 1). T=8192 wypelnia GPU: 250-297W/100%util. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…zego wyniki wzrosly Tabela porownawcza (sync/local-search/populacja/migracja/selekcja/tabu/integralnosc/init) + sekcja why it improved: brak round-tripow CPU (grid.sync), neighbor-list LS (mocniejsze optima + skala n>3000), wiecej wysp (fill GPU 200W->290W). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ge/tabu, uruchamianie, wyniki) — PL Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nkrementalny) Instancje 2k+ malejaco po n; staly ge per instancja (budzet kilkukrotnie < oryginal); wynik dopisywany do CSV PO KAZDEJ instancji (podglad w trakcie); odporny na bledy (porazka jednej nie zatrzymuje reszty). Config przez ENV: T/GE/MERGE/TABU/OUT. Szac. T=8192 ge=80: ~4h total (~6x < ~22h oryginalu). gr9882: plik z uwaterloo (EUC_2D) - do weryfikacji vs plik Sebastiana. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
solve_ga liczy w kawalkach z resume na tych samych tablicach GPU (dane nie ruszaja CPU); po kazdym kawalku wypisuje epoki X/total + best-so-far. Kernel: flaga resume (init tylko w 1. kawalku), okna merge liczone GLOBALNIE (epoch_offset+total_epochs). Batch: CHUNK env, verbose. Walidacja: kroA100 chunk=50 -> 0.000% perm_ok (resume poprawny), batch d2103 e2e + CSV. A/B tabu: 1.319% vs 1.458% -> TABU=1 pomaga. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…budzet) merge pr1002 0.191->0.173%; tabu pcb3038 1.458->1.319% (ge=300, T=8192). Obie dzwignie maly spojny zysk na duzych n, default off, przelaczniki. pcb3038 1.32% vs 2.5-3.1% oryginalu. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ik init_mode A/B gr9882 (T=2048 ge=20): random 7.985%/1226s vs kicks 7.953%/899s -> jakosc neutralna, ale KICKS 27% szybciej (LS zbiega szybciej ze startow blisko-NN niz z losowych permutacji). Male bez szkody (gr431 0.295%). Resume potwierdzony OK (single==chunked bit-w-bit). gr9882 slaby to problem BUDZETU (oryginal daje mu 7h), nie algorytmu. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ent + long-edge 1) UNIKALNOŚĆ (insight Sebastiana): histogram długości per kolonia (atomowy, grid.sync), kara duplikatu w selekcji (length-recurrence tabu) + metryka uniq%. Zapobiega przedwczesnej zbieżności kolonii. 2) ADAPTACYJNE K zależne od n: k1=max(5,n//600) k2=max(10,n//300) k3=max(15,n//200), plynny podwojny smoothstep (cubic ease) k1->k2 plateau ->k3. A/B rl5934: adaptive 2.645% vs fixed-K20 2.826% (coarse-to-fine wygrywa). 3) RODZINA RELOKACJI KNN-guided: Or-2/Or-3/segment (forward obok KNN(a) + reversed obok KNN(z)) + long_edge_relocation (naprawa ~15 najdluzszych krawedzi). Walidacja: kroA100 0.000% perm_ok, gr431 0.030% perm_ok. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…all-detekcji Hybryda (2/3-opt->relokacje@60 RAZEM, K+20%): rl5934 2.246%, fnl4461 2.554% (przewaga -0.6/-0.5pp vs klasyk, generalizuje). OX long-edge/mix50/greedy-edge = szum przy silnym LS. Metryki ultra-fast: uniq%/cv% wyprzedzaja stall ~30 epok, auto-skaluja prog per instancja (fnl4461 knee ~2x wczesniej). ls_mode=3, ox_mode, ox_topk, metrics= dodane. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fine-grained ladder (atomowe ruchy, trigger deceleracji recent/peak, ls_mode=9 bitmaska ops). Reorder high-value-first: rl5934 2.131% (bije hybryde 2.246%, OX 2.169%, Java 2.17%) bez strojenia. Bandyta: rollout kandydatow per eskalacja + log (stan,ruch,burst,dt,reward) do SQLite -> offline order discovery. Snapshot/restore device+RNG. Przetestowane kroA100 perm_ok. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DISCOVERY.md: drabina eskalacji, trigger deceleracji, early-stop, bandyta (reward=burst/czas, null-action stay), tabu inkumbenta, operatory (+swap/segvar z Javy), schemat bazy (co i po co), model docelowy MDP+DP+MLP (czemu nie MC/HMM, czemu nie uczony enkoder na 36 instancjach). Narzedzia: disc_web (serwer WWW live), disc_peek, disc_agg. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…tabu-aware early-stop memetic_ga: tabu inkumbenta (per wyspa, rosnaca kara, gbest immune); log 26 kol ladder_trials (state_ox, phase_uniq/cv/gbstall/gbstall_max, cum_t, feat_skew/kurt/far + spatial clark/gridcv/ aspect/tight) + ladder_runs (terminated_by/final_step/final_best/total_time); early-stop sprzezony z wyczerpaniem tabu; operatory swap/segvar z Javy. Zwalidowane kroA100 perm_ok, 26/16 kol, 0 NULL. DISCOVERY.md zaktualizowany. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Prosta multiplikatywna kara x1.004 na inkumbenta (rlen==gbest wyspy, gbstall>best_tabu) — samoregulujaca: wypiera best tylko gdy populacja zbiegla <0.4% od niego. Rosnaca kara agresywnie wypierala jedynego best -> dryf populacji, zerowy sygnal discovery, gorsza jakosc. x1.004 bije jakosciowo (pr439 0.061% vs 0.121% bez tabu) i zachowuje sygnal operatorow. Usunieta reinjekcja. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…m ge) W chunkowanej drabinie (chunk=5 < migrate_every=10) do_mig=(ge+1)%migrate_every uzywalo LOKALNEGO ge (0-4) => migracja/merge NIGDY nie odpalaly. Fix: gge (globalne) + force_merge wymusza do_mig (kandydat merge w trialu faktycznie merge-uje). Efekt: cross-island diversity wraca, pr439 osiaga OPTIMUM (107217 vs 107282), merge != stay (bylo identyczne 100%). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…now pozwala) Merge miesza kolonie => kolejny merge od razu nic nie wnosi/psuje swieza roznorodnosc. Po wygranej merge merge_cd=2, filtr merge z kandydatow przez 2 eskalacje. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rly-stop Za wczesny early-stop ubijal bieg zanim dodano mocne operatory (3-opt/LE) => gorszy wynik (pcb442 0.360% zamiast <0.2%). Fix: (1) stay nie wygrywa dopoki ops!=252 (przy zerowych burstach enumeracja dodaje operatory 3opt->Or2->Or3->LE->swap->segvar), (2) early-stop tylko gdy ops==252 (terminal). Efekt: pcb442 0.028% (bije Aparapi 0.315%, v2 0.197%), ladder przechodzi wszystkie operatory. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…koncepcja) 10 problemow z sesji: trigger na roznorodnosc (laguje), gruboziarnista drabina, mismatch trialu, reward=burst/czas, null-action stay, tabu agresywne (x1.004 fix), migracja martwa w chunkach, merge cooldown, early-stop przed operatorami, zwietrzaly pyc. Kazdy: problem/diagnoza/fix/efekt + meta-wnioski. Pomiary: pr439 optimum, pcb442 0.028%, rl5934 bije Jave. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…znosc instancji (kNN inverse-density) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…JSON, pauza w tle, flash na poprawie Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e, memetic, ladder, GA) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… GNN) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e log-uniform n 400-15000) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…CV, hit/recall/regret) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…l dlugosci przy ulamkowych wsp. -> d493 wychodzil 1 ponizej opt) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.