GSoC 2019: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ Π·Π° бипартитСност ΠΈ ΠΌΠΎΠ½Π°Π΄Π½ΠΈ трансформатори

ΠœΠΈΠ½Π°Ρ‚ΠΎΡ‚ΠΎ Π»Π΅Ρ‚ΠΎ учСствував Π²ΠΎ Google Summer of Code - ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° студСнти ΠΎΠ΄ Google. БСкоја Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΈΠ·Π±ΠΈΡ€Π°Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ со ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ ΠΎΠ΄ Ρ‚Π°ΠΊΠ²ΠΈ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊΠΎ Boost.org ΠΈ Π€ΠΎΠ½Π΄Π°Ρ†ΠΈΡ˜Π° Линукс. Google Π³ΠΈ ΠΏΠΎΠΊΠ°Π½ΡƒΠ²Π° студСнтитС ΠΎΠ΄ Ρ†Π΅Π»ΠΈΠΎΡ‚ свСт Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π½Π° ΠΎΠ²ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ. 

Како учСсник Π½Π° Google Summer of Code 2019, Π½Π°ΠΏΡ€Π°Π²ΠΈΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Алги со ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Haskell.org, кој Π³ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π° Ρ˜Π°Π·ΠΈΠΊΠΎΡ‚ Π₯аскСл - Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°Ρ˜ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈ програмски Ρ˜Π°Π·ΠΈΡ†ΠΈ. Алга Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° која прСтставува Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ ΠΏΡ€Π΅Ρ‚ΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π·Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ Π²ΠΎ Π₯аскСл. Π‘Π΅ користи, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ сСмантички β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Github која Π³Ρ€Π°Π΄ΠΈ сСмантички Π΄Ρ€Π²Ρ˜Π°, Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ Π·Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΈ зависност Π²Ρ€Π· основа Π½Π° ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ спорСдува. ΠœΠΎΡ˜ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ бСшС Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ Π±Π΅Π·Π±Π΅Π΄Π½Π° прСтстава Π·Π° Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π½ΠΈΡ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° Ρ‚Π°Π° Ρ€Π΅ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°. 

Π’ΠΎ овој пост ќС Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° ΠΌΠΎΡ˜Π°Ρ‚Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ Π·Π° Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π΅Ρ‚ Π²ΠΎ Π₯аскСл. Иако Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚ Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°Ρ˜ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ‚Π΅, Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ прСкрасно ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ стил ΠΌΠΈ ΠΎΠ΄Π·Π΅Π΄Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ° ΠΈ Π±Π°Ρ€Π°ΡˆΠ΅ доста Ρ€Π°Π±ΠΎΡ‚Π°. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, сС Ρ€Π΅ΡˆΠΈΠ² Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° со трансформатори Π½Π° ΠΌΠΎΠ½Π°Π΄ΠΈ. 

GSoC 2019: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ Π·Π° бипартитСност ΠΈ ΠΌΠΎΠ½Π°Π΄Π½ΠΈ трансформатори

Изјава

Јас сС Π²ΠΈΠΊΠ°ΠΌ Π’Π°ΡΠΈΠ»ΠΈΡ˜ АлфСров, студСнт сум Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚Π° Π³ΠΎΠ΄ΠΈΠ½Π° Π²ΠΎ Π‘Π°Π½ΠΊΡ‚ ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³ HSE. ΠŸΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ Π²ΠΎ Π±Π»ΠΎΠ³ΠΎΡ‚ напишав Π·Π° ΠΌΠΎΡ˜ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ ΠΈ Π·Π° ΠΏΠ°Ρ‚ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π΄ΠΎ Π—ΡƒΡ€ΠΈΠ₯Π°Ρ†. Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² сум Π½Π° ΡΡ‚Π°ΠΆΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Π£Π½ΠΈΠ²Π΅Ρ€Π·ΠΈΡ‚Π΅Ρ‚ΠΎΡ‚ Π²ΠΎ Π‘Π΅Ρ€Π³Π΅Π½ Π²ΠΎ ΠΠΎΡ€Π²Π΅ΡˆΠΊΠ°, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΠΌ Π½Π° пристапи ΠΊΠΎΠ½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ Бписок Π·Π° боСњС. ΠœΠΎΠΈΡ‚Π΅ интСрСси Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Π°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅.

Π—Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚

ΠΏΡ€Π΅Π΄Π³ΠΎΠ²ΠΎΡ€ΠΎΡ‚

Π‘Ρ‚ΡƒΠ΄Π΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΊΠΎΠΈ учСствуваат Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° силно сС ΠΎΡ…Ρ€Π°Π±Ρ€ΡƒΠ²Π°Π°Ρ‚ Π΄Π° Π±Π»ΠΎΠ³ΠΈΡ€Π°Π°Ρ‚. Ми обСзбСдија ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π·Π° Π±Π»ΠΎΠ³ΠΎΡ‚ Π›Π΅Ρ‚ΠΎ Π½Π° Π₯аскСл. Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π΅ ΠΏΡ€Π΅Π²ΠΎΠ΄ Π§Π»Π΅Π½, напишана ΠΎΠ΄ ΠΌΠ΅Π½Π΅ Ρ‚Π°ΠΌΡƒ Π²ΠΎ Ρ˜ΡƒΠ»ΠΈ Π½Π° англиски јазик, со ΠΊΡ€Π°Ρ‚ΠΎΠΊ ΠΏΡ€Π΅Π΄Π³ΠΎΠ²ΠΎΡ€. 

МоТС Π΄Π° сС најдС Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ со Π΄ΠΎΡ‚ΠΈΡ‡Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Ρ‚ΡƒΠΊΠ°.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ Π·Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΠ΄ ΠΌΠΎΡ˜Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° (Π½Π° англиски) Ρ‚ΡƒΠΊΠ°.

Овој пост Π΅ Π½Π°ΠΌΠ΅Π½Π΅Ρ‚ Π΄Π° Π³ΠΎ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΎΡ‚ со основнитС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΈ Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅, ΠΈΠ°ΠΊΠΎ ќС сС ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° сС потсСтам Π½Π° ситС ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π΅Π½ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈ ΠΊΠΎΠ³Π° ќС дојдС Π²Ρ€Π΅ΠΌΠ΅.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ Π·Π° двостраност 

Алгоритам Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ Π·Π° Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π΅Ρ‚ ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС Π΄Π°Π²Π° Π²ΠΎ курсот Π·Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ ΠΊΠ°ΠΊΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΈΡ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ. НСговата идСја Π΅ јасна: ΠΏΡ€Π²ΠΎ Π½Π΅ΠΊΠ°ΠΊΠΎ ставамС Ρ‚Π΅ΠΌΠΈΡšΠ° Π²ΠΎ Π»Π΅Π²ΠΈΠΎΡ‚ ΠΈΠ»ΠΈ дСсниот Π΄Π΅Π», Π° ΠΊΠΎΠ³Π° ќС сС најдС ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅Π½ Ρ€Π°Π±, Ρ‚Π²Ρ€Π΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΡ‚ Π½Π΅ Π΅ Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π΅Π½.

ΠœΠ°Π»ΠΊΡƒ повСќС Π΄Π΅Ρ‚Π°Π»ΠΈ: ΠΏΡ€Π²ΠΎ ставивмС Π½Π΅ΠΊΠΎΠ΅ Ρ‚Π΅ΠΌΠ΅ Π²ΠΎ Π»Π΅Π²ΠΈΠΎΡ‚ Π΄Π΅Π». ΠžΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ, ситС сосСди Π½Π° ΠΎΠ²Π° Ρ‚Π΅ΠΌΠ΅ ΠΌΠΎΡ€Π° Π΄Π° Π»Π΅ΠΆΠ°Ρ‚ Π²ΠΎ дСсниот лобус. ΠŸΠΎΠ½Π°Ρ‚Π°ΠΌΡƒ, ситС сосСди Π½Π° сосСдитС Π½Π° ΠΎΠ²Π° Ρ‚Π΅ΠΌΠ΅ ΠΌΠΎΡ€Π° Π΄Π° Π»Π΅ΠΆΠ°Ρ‚ Π²ΠΎ Π»Π΅Π²ΠΈΠΎΡ‚ лобус ΠΈΡ‚Π½. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π°ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΠΌΠ΅ Π°ΠΊΡ†ΠΈΠΈ Π½Π° Ρ‚Π΅ΠΌΠΈΡšΠ° сè Π΄ΠΎΠ΄Π΅ΠΊΠ° сè ΡƒΡˆΡ‚Π΅ ΠΈΠΌΠ° Ρ‚Π΅ΠΌΠΈΡšΠ° Π²ΠΎ ΠΏΠΎΠ²Ρ€Π·Π°Π½Π°Ρ‚Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π° Ρ‚Π΅ΠΌΠ΅Ρ‚ΠΎ со која Π·Π°ΠΏΠΎΡ‡Π½Π°Π²ΠΌΠ΅ ΠΈ Π½Π° ΠΊΠΎΠΈ Π½Π΅ смС Π΄ΠΎΠ΄Π΅Π»ΠΈΠ»Π΅ сосСди. ΠŸΠΎΡ‚ΠΎΠ° Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ²Π° Π΄Π΅Ρ˜ΡΡ‚Π²ΠΎ Π·Π° ситС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ.

Ако постои Ρ€Π°Π± ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Ρ‚Π΅ΠΌΠΈΡšΠ°Ρ‚Π° ΡˆΡ‚ΠΎ спаѓаат Π²ΠΎ истата ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡ˜Π°, Π½Π΅ Π΅ Ρ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС најдС Π½Π΅ΠΏΠ°Ρ€Π΅Π½ циклус Π²ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΡ‚, ΡˆΡ‚ΠΎ Π΅ Π½Π°ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎ (ΠΈ сосСма ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ) Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎ Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π½ΠΈΠΎΡ‚ Π³Ρ€Π°Ρ„. Π’ΠΎ спротивно, ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡ˜Π°, ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΡ‚ Π΅ Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚.

Π’ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΎ, овој Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΏΡ€Π²ΠΎ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ ΠΈΠ»ΠΈ длабинско ΠΏΡ€Π²ΠΎ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅. Π’ΠΎ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ Ρ˜Π°Π·ΠΈΡ†ΠΈ, ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π²ΠΎ мСсто ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС користи бидСјќи Π΅ ΠΌΠ°Π»ΠΊΡƒ поСдноставно ΠΈ Π½Π΅ Π±Π°Ρ€Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ структури Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΈΠ·Π±Ρ€Π°Π² ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½Π° бидСјќи Π΅ ΠΏΠΎΡ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ.

Π’Π°ΠΊΠ°, дојдовмС Π΄ΠΎ слСдната шСма. Π“ΠΈ ΠΏΠΎΠΌΠΈΠ½ΡƒΠ²Π°ΠΌΠ΅ Ρ‚Π΅ΠΌΠΈΡšΠ°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€Π²ΠΎ Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½Π° ΠΈ ΠΈΠΌ Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΠΌΠ΅ Π°ΠΊΡ†ΠΈΠΈ, ΠΌΠ΅Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΡΠΏΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π΄ΠΎΠ΄Π΅ΠΊΠ° сС Π΄Π²ΠΈΠΆΠΈΠΌΠ΅ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚. Ако сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΠΈΠΌΠ΅ ΡƒΠ΄Π΅Π» Π½Π° Ρ‚Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠ΅ вСќС ΠΈΠΌΠ° Π΄ΠΎΠ΄Π΅Π»Π΅Π½ Π΄Π΅Π», ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΡ‚ Π½Π΅ Π΅ Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π΅Π½. Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ ΠΊΠΎΠ³Π° Π½Π° ситС Ρ‚Π΅ΠΌΠΈΡšΠ° ΠΈΠΌ Π΅ Π΄ΠΎΠ΄Π΅Π»Π΅Π½ Π΄Π΅Π» ΠΈ Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ситС Ρ€Π°Π±ΠΎΠ²ΠΈ, ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΠ±Ρ€Π° ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡ˜Π°.

Чистота Π½Π° прСсмСткитС

Π’ΠΎ Π₯аскСл прСтпоставувамС Π΄Π΅ΠΊΠ° ситС прСсмСтки сС чисти. ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, Π°ΠΊΠΎ навистина бСшС Ρ‚Π°ΠΊΠ°, нСмашС Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° испСчатимС Π½ΠΈΡˆΡ‚ΠΎ Π½Π° Π΅ΠΊΡ€Π°Π½ΠΎΡ‚. Π’ΠΎΠΎΠΏΡˆΡ‚ΠΎ, чист прСсмСткитС сС Ρ‚ΠΎΠ»ΠΊΡƒ ΠΌΡ€Π·Π»ΠΈΠ²ΠΈ ΡˆΡ‚ΠΎ Π½Π΅ΠΌΠ° Π½ΠΈΡ‚Ρƒ Π΅Π΄Π½Π° чисти ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π΄Π° сС прСсмСта Π½Π΅ΡˆΡ‚ΠΎ. Π‘ΠΈΡ‚Π΅ прСсмСтки ΡˆΡ‚ΠΎ сС случуваат Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π΅ΠΊΠ°ΠΊΠΎ сС ΠΏΡ€ΠΈΠ½ΡƒΠ΄Π΅Π½ΠΈ "нСчист" ΠΌΠΎΠ½Π°Π΄Π° IO.

ΠœΠΎΠ½Π°Π΄ΠΈΡ‚Π΅ сС Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС прСтстават прСсмСткитС со Π΅Ρ„Π΅ΠΊΡ‚ΠΈ Π²ΠΎ Π₯аскСл. ΠžΠ±Ρ˜Π°ΡΠ½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎ Ρ‚ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π΅ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ опсСгот Π½Π° овој пост. Π”ΠΎΠ±Π°Ρ€ ΠΈ јасСн опис ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° Π½Π° англиски јазик Ρ‚ΡƒΠΊΠ°.

ОвдС сакам Π΄Π° истакнам Π΄Π΅ΠΊΠ° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ IO, сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ ΠΏΡ€Π΅ΠΊΡƒ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ магија, скоро ситС Π΄Ρ€ΡƒΠ³ΠΈ сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈ Π²ΠΎ софтвСр ΠΈ ситС прСсмСтки Π²ΠΎ Π½ΠΈΠ² сС чисти.

Има ΠΌΠ½ΠΎΠ³Ρƒ Π΅Ρ„Π΅ΠΊΡ‚ΠΈ ΠΈ сСкој ΠΈΠΌΠ° своја ΠΌΠΎΠ½Π°Π΄Π°. Ова Π΅ ΠΌΠ½ΠΎΠ³Ρƒ силна ΠΈ ΡƒΠ±Π°Π²Π° Ρ‚Π΅ΠΎΡ€ΠΈΡ˜Π°: ситС ΠΌΠΎΠ½Π°Π΄ΠΈ Π³ΠΎ спровСдуваат истиот ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ. ЌС Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° слСднитС Ρ‚Ρ€ΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈ:

  • Или ea Π΅ прСсмСтка која Π²Ρ€Π°ΡœΠ° врСдност ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ a ΠΈΠ»ΠΈ Ρ„Ρ€Π»Π° исклучок ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ e. ΠžΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ²Π°Π° ΠΌΠΎΠ½Π°Π΄Π° Π΅ ΠΌΠ½ΠΎΠ³Ρƒ слично Π½Π° ΡΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ со исклучоци Π²ΠΎ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ Ρ˜Π°Π·ΠΈΡ†ΠΈ: Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ„Π°Ρ‚Π°Ρ‚ ΠΈΠ»ΠΈ Π΄Π° сС прСнСсат. Π“Π»Π°Π²Π½Π°Ρ‚Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° Π΅ Π²ΠΎ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠ½Π°Π΄Π°Ρ‚Π° Π΅ цСлосно Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° Π²ΠΎ стандардната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²ΠΎ Π₯аскСл, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ Ρ˜Π°Π·ΠΈΡ†ΠΈ ΠΎΠ±ΠΈΡ‡Π½ΠΎ користат ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм.
  • Π‘ΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° sa Π΅ прСсмСтка која Π²Ρ€Π°ΡœΠ° врСдност ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ a ΠΈ ΠΈΠΌΠ° пристап Π΄ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ s.
  • МоТСби Π°. ΠœΠΎΠ½Π°Π΄Π°Ρ‚Π° МоТСби ΠΈΠ·Ρ€Π°Π·ΡƒΠ²Π° ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅ Π²ΠΎ сСкоС Π²Ρ€Π΅ΠΌΠ΅ со Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π° ΠΠΈΡˆΡ‚ΠΎ. Π‘Π΅ΠΏΠ°ΠΊ, ќС Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° класата MonadPlus Π·Π° Ρ‚ΠΈΠΏΠΎΡ‚ Maybe, која Π³ΠΎ ΠΈΠ·Ρ€Π°Π·ΡƒΠ²Π° спротивниот Π΅Ρ„Π΅ΠΊΡ‚: Ρ‚ΠΎΠ° Π΅ прСсмСтка ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅ Π²ΠΎ сСкоС Π²Ρ€Π΅ΠΌΠ΅ со Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° врСдност.

Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚

ИмамС Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π“Ρ€Π°Ρ„ΠΈΠΊ a ΠΈ Bigraph ab, ΠΎΠ΄ ΠΊΠΎΠΈ ΠΏΡ€Π²ΠΈΠΎΡ‚ прСтставува Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ со Ρ‚Π΅ΠΌΠΈΡšΠ° ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ со врСдности ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ a, Π° Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ прСтставува Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π½ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ со Ρ‚Π΅ΠΌΠΈΡšΠ° ΠΎΠ΄ Π»Π΅Π²Π°Ρ‚Π° страна ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ со врСдности ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ a ΠΈ дСсно. - странични Ρ‚Π΅ΠΌΠΈΡšΠ° ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ со врСдности ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ b.

Ова Π½Π΅ сС Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Алга. Алга Π½Π΅ΠΌΠ° прСтстава Π·Π° нСнасочСни Π±ΠΈΠΏΠ°Ρ€Ρ‚ΠΈΡ‚Π½ΠΈ Π³Ρ€Π°Ρ„ΠΈΡ†ΠΈ. Π“ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ² Π²Π°ΠΊΠ²ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π·Π° Ρ˜Π°ΡΠ½ΠΎΡΡ‚.

ЌС Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ ΠΈ помошни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ со слСднитС потписи:

-- Бписок сосСдСй Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹.
neighbours :: Ord a => a -> Graph a -> [a]

-- ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π²ΡƒΠ΄ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ ΠΏΠΎ Π³Ρ€Π°Ρ„Ρƒ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹
-- Π²Ρ‹Π΄Π°ΡŽΡ‰Π΅ΠΉ Π΅Ρ‘ долю ΠΈ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΡƒ Π² Π½ΠΎΠ²ΠΎΠΉ Π΄ΠΎΠ»Π΅, игнорируя ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½Ρ‹Π΅ Ρ€Ρ‘Π±Ρ€Π°.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
                                         -> Graph a
                                         -> Bigraph b c

-- Бписок Π²Π΅Ρ€ΡˆΠΈΠ½ Π² Π³Ρ€Π°Ρ„Π΅
vertexList :: Ord a => Graph a -> [a]
Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ, выглядит Ρ‚Π°ΠΊ:

type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)

ЛСсно Π΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π΄Π΅ΠΊΠ° Π°ΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΡ€Π²ΠΎΡ‚ΠΎ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½Π° најдовмС ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅Π½ Ρ€Π°Π±, Π½Π΅ΠΏΠ°Ρ€Π½ΠΈΠΎΡ‚ циклус Π»Π΅ΠΆΠΈ Π½Π° Π²Ρ€Π²ΠΎΡ‚ Π½Π° Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½ΠΈΠΎΡ‚ оџак. Π’Π°ΠΊΠ°, Π·Π° Π΄Π° Π³ΠΎ Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅, Ρ‚Ρ€Π΅Π±Π° Π΄Π° отсСчСмС сè, ΠΎΠ΄ Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½ΠΈΠΎΡ‚ оџак Π΄ΠΎ ΠΏΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° послСдното Ρ‚Π΅ΠΌΠ΅.

НиС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ длабинско ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ со ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΡΠΎΡ†ΠΈΡ˜Π°Ρ‚ΠΈΠ²Π½Π° Π½ΠΈΠ·Π° ΠΎΠ΄ Π±Ρ€ΠΎΠ΅Π²ΠΈ Π½Π° Π°ΠΊΡ†ΠΈΠΈ Π·Π° сСкоС Ρ‚Π΅ΠΌΠ΅. ΠœΠ°Π³Π°Ρ†ΠΈΠ½ΠΎΡ‚ Π·Π° Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΡ˜Π° автоматски ќС сС ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π° ΠΏΡ€Π΅ΠΊΡƒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° класата Functor Π½Π° ΠΌΠΎΠ½Π°Π΄Π°Ρ‚Π° ΡˆΡ‚ΠΎ ја ΠΈΠ·Π±Ρ€Π°Π²ΠΌΠ΅: ќС Ρ‚Ρ€Π΅Π±Π° само Π΄Π° Π³ΠΈ ставимС ситС Ρ‚Π΅ΠΌΠΈΡšΠ° ΠΎΠ΄ ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π²ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ Π²Ρ€Π°Ρ‚Π΅Π½ ΠΎΠ΄ Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°.

ΠœΠΎΡ˜Π°Ρ‚Π° ΠΏΡ€Π²Π° идСја бСшС Π΄Π° ја користам ΠΌΠΎΠ½Π°Π΄Π°Ρ‚Π° Или, која сС Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° Π³ΠΈ спровСдува Ρ‚ΠΎΠΊΠΌΡƒ Π΅Ρ„Π΅ΠΊΡ‚ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Π½ΠΈ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ. ΠŸΡ€Π²Π°Ρ‚Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ ја напишав бСшС ΠΌΠ½ΠΎΠ³Ρƒ блиску Π΄ΠΎ ΠΎΠ²Π°Π° ΠΎΠΏΡ†ΠΈΡ˜Π°. Π’ΡΡƒΡˆΠ½ΠΎΡΡ‚, ΠΈΠΌΠ°Π² ΠΏΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π²ΠΎ Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ сС Ρ€Π΅ΡˆΠΈΠ² Π½Π° Π΄Ρ€ΡƒΠ³Π°.

ΠŸΡ€Π²ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°ΠΌΠ΅ Π°ΡΠΎΡ†ΠΈΡ˜Π°Ρ‚ΠΈΠ²Π½Π° Π½ΠΈΠ·Π° Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ Π½Π° Π°ΠΊΡ†ΠΈΠΈ - ΠΎΠ²Π° Π΅ Π½Π΅ΡˆΡ‚ΠΎ Π·Π° Π΄Ρ€ΠΆΠ°Π²Π°Ρ‚Π°. Π’Ρ‚ΠΎΡ€ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΡ€Π΅ΠΌΠ΅ ΠΊΠΎΠ³Π° ќС сС ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ Monad Π·Π° ΠΈΠ»ΠΈ, ΠΈΠ»ΠΈ MonadPlus Π·Π° МоТСби. Π“Π»Π°Π²Π½Π°Ρ‚Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° Π΅ Π²ΠΎ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Или ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Ρ€Π°Ρ‚ΠΈ врСдност Π°ΠΊΠΎ прСсмСтката Π½Π΅ Π΅ ΠΏΡ€Π΅ΠΊΠΈΠ½Π°Ρ‚Π°, Π° МоТСби Π²Ρ€Π°ΡœΠ° само ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΎΠ²Π° Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π½Π΅ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° посСбна врСдност Π·Π° успСх (Ρ‚Π°Π° Π΅ вСќС Π·Π°Ρ‡ΡƒΠ²Π°Π½Π° Π²ΠΎ State), ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ МоТСби. И Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ ΠΊΠΎΠ³Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ споимС Π΅Ρ„Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Π΄Π²Π΅ ΠΌΠΎΠ½Π°Π΄ΠΈ, Ρ‚ΠΈΠ΅ ΠΈΠ·Π»Π΅Π³ΡƒΠ²Π°Π°Ρ‚ монадски трансформатори, ΠΊΠΎΠΈ ΠΏΡ€Π΅Ρ†ΠΈΠ·Π½ΠΎ Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ ΠΎΠ²ΠΈΠ΅ Π΅Ρ„Π΅ΠΊΡ‚ΠΈ.

Π—ΠΎΡˆΡ‚ΠΎ ΠΈΠ·Π±Ρ€Π°Π² Ρ‚ΠΎΠ»ΠΊΡƒ слоТСн Ρ‚ΠΈΠΏ? Π”Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ. ΠŸΡ€Π²ΠΎ, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° сС ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° ΠΊΠ°ΠΊΠΎ ΠΌΠ½ΠΎΠ³Ρƒ слична Π½Π° ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ². Π’Ρ‚ΠΎΡ€ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°ΠΌΠ΅ со ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½Π°Ρ‚Π° врСдност Π²ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΊΠΎΠ³Π° сС Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ ΠΎΠ΄ Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΡ˜Π° Π·Π° Π΄Π° ја Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅ Π½Π΅ΠΏΠ°Ρ€Π½Π°Ρ‚Π° јамка, ΡˆΡ‚ΠΎ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ полСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π²ΠΎ ΠΌΠΎΠ½Π°Π΄Π°Ρ‚Π° МоТСби.

Π’Π°ΠΊΠ° ја Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΠΎΠ²Π°Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°.

{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}

data Part = LeftPart | RightPart

otherPart :: Part -> Part
otherPart LeftPart  = RightPart
otherPart RightPart = LeftPart

type PartMap a = Map.Map a Part
type OddCycle a = [a]

toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
                    LeftPart  -> Left  v
                    RightPart -> Right v

type PartMonad a = MaybeT (State (PartMap a)) [a]

detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
                     (Just c, _)  -> Left  $ oddCycle c
                     (Nothing, m) -> Right $ toBipartiteWith (toEither m) g
    where
        inVertex :: Part -> a -> PartMonad a
        inVertex p v = ((:) v) <$> do modify $ Map.insert v p
                                      let q = otherPart p
                                      msum [ onEdge q u | u <- neigbours v g ]

        {-# INLINE onEdge #-}
        onEdge :: Part -> a -> PartMonad a
        onEdge p v = do m <- get
                        case v `Map.lookup` m of
                             Nothing -> inVertex p v
                             Just q  -> do guard (q /= p)
                                           return [v]

        processVertex :: a -> PartMonad a
        processVertex v = do m <- get
                             guard (v `Map.notMember` m)
                             inVertex LeftPart v

        dfs :: PartMonad a
        dfs = msum [ processVertex v | v <- vertexList g ]

        oddCycle :: [a] -> [a]
        oddCycle c = tail (dropWhile ((/=) last c) c)

Π‘Π»ΠΎΠΊΠΎΡ‚ ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π΅ Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚. ЌС сС ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° објаснам ΡˆΡ‚ΠΎ сС случува Π²Π½Π°Ρ‚Ρ€Π΅.

  • inVertex Π΅ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π·Π° ΠΏΡ€Π² ΠΏΠ°Ρ‚ Π²ΠΎ Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½Π° ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π³ΠΎ посСтувамС Ρ‚Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΏΡ€Π² ΠΏΠ°Ρ‚. ОвдС Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΠΌΠ΅ Π±Ρ€ΠΎΡ˜ Π·Π° ΡΠΏΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΈ Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΠΌΠ΅ onEdge Π½Π° ситС сосСди. Ова Π΅ исто Ρ‚Π°ΠΊΠ° мСстото ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π³ΠΎ Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ стСкот Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ: Π°ΠΊΠΎ msum Π²Ρ€Π°Ρ‚ΠΈ врСдност, Π³ΠΎ Ρ‚ΡƒΡ€ΠΊΠ°ΠΌΠ΅ Ρ‚Π΅ΠΌΠ΅Ρ‚ΠΎ v Ρ‚Π°ΠΌΡƒ.
  • oneEdge Π΅ Π΄Π΅Π»ΠΎΡ‚ ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π³ΠΎ посСтувамС Ρ€Π°Π±ΠΎΡ‚. Π‘Π΅ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° Π΄Π²Π°ΠΏΠ°Ρ‚ΠΈ Π·Π° сСкој Ρ€Π°Π±. ОвдС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Ρ‚Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³Π°Ρ‚Π° страна Π΅ посСтСно, Π° Π°ΠΊΠΎ Π½Π΅ Π΅ посСтСно. Ако Π΅ посСтСно, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚ Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅Π½. Ако Π΅ Ρ‚Π°ΠΊΠ°, ја Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ врСдноста - самиот Π²Ρ€Π² Π½Π° Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½ΠΈΠΎΡ‚ оџак, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ситС Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚Π΅ΠΌΠΈΡšΠ° ќС Π±ΠΈΠ΄Π°Ρ‚ поставСни ΠΏΠΎ Π²Ρ€Π°ΡœΠ°ΡšΠ΅Ρ‚ΠΎ.
  • processVertex ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Π·Π° сСкоС Ρ‚Π΅ΠΌΠ΅ Π΄Π°Π»ΠΈ Π΅ посСтСно ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΠΎ Vertex Π½Π° Π½Π΅Π³ΠΎ Π°ΠΊΠΎ Π½Π΅.
  • dfs Ρ€Π°Π±ΠΎΡ‚ΠΈ processVertex Π½Π° ситС Ρ‚Π΅ΠΌΠΈΡšΠ°.

Воа С сС.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ˜Π° Π½Π° Π·Π±ΠΎΡ€ΠΎΡ‚ INLINE

Π—Π±ΠΎΡ€ΠΎΡ‚ INLINE Π½Π΅ бСшС Π²ΠΎ ΠΏΡ€Π²Π°Ρ‚Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚; Ρ‚ΠΎΡ˜ сС појави ΠΏΠΎΠ΄ΠΎΡ†Π½Π°. Кога сС ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° најдам ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°, ΠΎΡ‚ΠΊΡ€ΠΈΠ² Π΄Π΅ΠΊΠ° Π½Π΅-INLINE Π²Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ±Π°Π²Π½Π° Π½Π° Π½Π΅ΠΊΠΎΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ. Имајќи ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° сСмантички Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ исто, ΠΎΠ²Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠ΅ ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ. Π£ΡˆΡ‚Π΅ ΠΏΠΎΡ‡ΡƒΠ΄Π½ΠΎ, Π½Π° Π΄Ρ€ΡƒΠ³Π° машина со Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° GHC нСмашС Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅Π»Π½Π° Ρ€Π°Π·Π»ΠΈΠΊΠ°.

ΠžΡ‚ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Π² Π΅Π΄Π½Π° Π½Π΅Π΄Π΅Π»Π° Ρ‡ΠΈΡ‚Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ Π½Π° GHC Core, успСав Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΡ€Π°Π²Π°ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ со Π΅Π΄Π½Π° линија Сксплицитна INLINE. Π’ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ GHC 8.4.4 ΠΈ GHC 8.6.5, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΡ‚ прСстана Π΄Π° Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ° сам.

НС ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π² Π΄Π° Π½Π°ΠΈΠ΄Π°ΠΌ Π½Π° Ρ‚Π°ΠΊΠ²Π° Π½Π΅Ρ‡ΠΈΡΡ‚ΠΎΡ‚ΠΈΡ˜Π° Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π₯аскСл. Π‘Π΅ΠΏΠ°ΠΊ, Π΄ΡƒΡ€ΠΈ ΠΈ дСнСс, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ понСкогаш ΠΏΡ€Π°Π²Π°Ρ‚ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ наша Π·Π°Π΄Π°Ρ‡Π° Π΅ Π΄Π° ΠΈΠΌ Π΄Π°Π΄Π΅ΠΌΠ΅ совСти. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ²Π΄Π΅ Π·Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π²ΠΌΠ΅Ρ‚Π½Π°Ρ‚Π° Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π΅ Π²ΠΌΠ΅Ρ‚Π½Π°Ρ‚Π° Π²ΠΎ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π°, ΠΈ ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΄Π° ΠΌΡƒ Π΄Π°Π΄Π΅ΠΌΠ΅ Π½Π°Π²Π΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚.

Π¨Ρ‚ΠΎ сС случи слСдно?

ΠŸΠΎΡ‚ΠΎΠ° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚ Π₯ΠΎΠΏΠΊΡ€ΠΎΡ„Ρ‚-ΠšΠ°Ρ€ΠΏ со Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈ ΠΈ Ρ‚ΠΎΠ° бСшС ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Google Summer of Code, стСкнав ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ искуство Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅, ΡˆΡ‚ΠΎ Π½Π΅ само ΡˆΡ‚ΠΎ ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π° Π΄Π° добијам ΡΡ‚Π°ΠΆΠΈΡ€Π°ΡšΠ΅ Π½Π° ΡƒΠ»ΠΈΡ†Π°Ρ‚Π° ЈанС слСдното Π»Π΅Ρ‚ΠΎ (Π½Π΅ сум сигурСн ΠΊΠΎΠ»ΠΊΡƒ ΠΎΠ²Π° мСсто Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎ Π΄ΡƒΡ€ΠΈ ΠΈ ΠΌΠ΅Ρ“Ρƒ ΡƒΠΏΠ°Ρ‚Π΅Π½Π°Ρ‚Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ° Π½Π° Π₯Π°Π±Ρ€, Π½ΠΎ Ρ‚ΠΎΠ° Π΅ Π΅Π΄Π½ΠΎ ΠΎΠ΄ Ρ€Π΅Ρ‚ΠΊΠΈΡ‚Π΅ ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π»Π΅Ρ‚ΡƒΠ²Π°Ρ‚Π΅ Π·Π° Π΄Π° сС Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅), Π½ΠΎ исто Ρ‚Π°ΠΊΠ° ΠΌΠ΅ Π²ΠΎΠ²Π΅Π΄Π΅ Π²ΠΎ прСкрасниот свСт Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΎΠ²Π°Π° ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° Π²ΠΎ пракса, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΠ΄ ΠΌΠΎΠ΅Ρ‚ΠΎ искуство Π²ΠΎ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΡ‚Π΅ Ρ˜Π°Π·ΠΈΡ†ΠΈ.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€