Kirjoittaja Aihe: Pallot ja kädet pallomereksi  (Luettu 4893 kertaa)

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Pallot ja kädet pallomereksi
« : 20.06.23 - klo:13.32 »
Noin 5 vuotta sitten jäi yhden ohjelman kehitys kesken sattuneista syistä. Siinä on pallot ja kädet -mallilla sanottuna joukko palloja, joilla on eri määriä käsiä pituudeltaan 0 - 3. Käden pituus 0 tarkoittaa, että toinen pallo on samassa klusterissa. Käden pituus 1 tarkoittaa, että toinen pallo on ensimmäisen vieruskaverina (etäisyydellä 1). Käden pituus 2 tarkoittaa sitä, että välissä on yksi pallo, johon alkuperäisestä pallosta on etäisyys 1 ja siitä välissä olevasta pallosta on etäisyys 1 kohdepalloon. Näin syntyy palloverkosto pallojen klustereista.
 Klustereiden välimatka on aina 1, jotta pallomeri on ristiriidaton. Verkostoon tuodaan aina yksi pallo lisää ja sillä on niitä käsiä. Pallo liitetään verkkoon edellämainituilla säännöillä. Verkostoon (pallomereen) voi toki jäädä jonnekin pallo, jolla on kahden tai kolmen yksikön yksikön käsi vailla kohdepalloa. Sellainen jää odottamaan uutta pallolisäystä verkostoon. Yhden yksikön etäisyys ilman kohdepalloa on kuitenkin kiinni verkostossa sen yhden yhteyden kautta. Toivottavasti tämä kuvaus oli kyllin selkeä. Tätä geneeristä mallinnusta voi käyttää moneen sovellukseen. Minulle tulee muutama muukin sovellus mieleen kuin se, josta tämä on peräisin.

Jos tällaisesta on olemassa ohjelmoinnin suunnittelumalli, niin kertokaa! Jos onnsitun ratkaisemaan tuon, yksi harrasteryhmä saanee mukavan ja tehokkaan työkalun. Se tekee sekunnissa sen työn, johon ihmiseltä menee tyypillisesti monta tuntia. Ja monesti sen verran, että viisas ihminen jättää tekemättä homman.

Tässä on yksi kuva: Pallomeri. (Ihmisen mitokondrion dna-haploryhmän mutaatioiden klusterit ja näytteiden vanhimmat tunnetut äitilinjan äidit)

Opetellessani Pythonia tein tietorakenteet tupletteina. Siitä oli iso etu kun python tallensi koko verkon yhdellä käskyllä JSON-muotoiseksi tiedostoksi. Sitten kun vaihdoin tietorakenteet olio-ohjelmoinnin luokiksi, niin sepä ei enää mennytkään automaattisesti. Tämä ei tuohon mallinnukseen kuulu, mutta kerronpa vain.
« Viimeksi muokattu: 20.06.23 - klo:13.57 kirjoittanut ilkant »

nm

  • Käyttäjä
  • Viestejä: 16424
    • Profiili
Vs: Pallot ja kädet pallomereksi
« Vastaus #1 : 20.06.23 - klo:13.56 »
Kuulostaa suuntaamattomalta graafilta (eli verkolta), jossa kaarilla ei ole painoja. Mitä haluat ratkaista mallin avulla?

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Vs: Pallot ja kädet pallomereksi
« Vastaus #2 : 20.06.23 - klo:14.02 »
Kuulostaa suuntaamattomalta graafilta (eli verkolta), jossa kaarilla ei ole painoja. Mitä haluat ratkaista mallin avulla?

Oikein olet ymmärtänyt. Nuo pitävät paikkansa. Nyt siis kysymys on siinä, että kun on yksi tai useampi näyte datana, jossa on noita käsiä epälukuisa määrä. Niistä pitäisi luoda tuo verkosto. Olen tehnyt sen aika pitkälle, mutta kun yhden pallon (näytteen) käsi voi täsmätä useampaan toiseen palloon pituutensa mukaan (0 - 3), niin vaatisi aika paljon koodausta, jotta osaisi valita sen oikean. Toisin sanoen, tulisi yksikäsitteisiä uniikkeja klustereita. Jotain tuollaista. Koodit on GitHubissa. Ehkä olen tehnyt monimutkaisia ohjelmarakenteita, jotka olisi helppoja suunnittelumallissa. Ei tämän tarvitse ratketa tänä päivänä.

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Vs: Pallot ja kädet pallomereksi
« Vastaus #3 : 20.06.23 - klo:14.11 »
Kuulostaa suuntaamattomalta graafilta (eli verkolta), jossa kaarilla ei ole painoja. Mitä haluat ratkaista mallin avulla?

Tuo oli alunperin kokeilu, että muodostaako ne pallot ja kädet yksikäsitteisen verkoston. Tähän asti on tehnyt niin. 70 näytteen tiedot olen käsitellyt ja kaikki täsmää. Muutama sata kättä ja 70 palloa on muodostanut yksikäsitteisen verkoston. Tästä voisin päätellä (ei kuitenkaan tieteellisellä tarkkuudella), että ristiriitaista tietoa ei enää tuile. Tämä oli kokeilujeni ensimmäinen päämäärä.

Nyt sitten YFull (venäläinen dna-analyysejä tekevä toimija) on tehnyt vastaavanlaista jaottelua ja päätynyt ihan samanlaisiin klustereihin. Varmasti myös amerikkalainen (onkohan nykyään australialainen) FTDNA tekee vastaavalaisesti.

Vielä haluaisin tietää upstreamin, mistä dna on tullut. Se on ihan oma kysymyksensä, eikä ole tuon pallomeren kysymys. Pallomeri-ohjelmaa käyttäisin kymmeniin muihin mt-dna haploryhmiin. Sikäli kun saan dataa ihmisiltä. Se olisi toinen vaihe, joka saattaa jäädä toteutumatta. Kolmas vaihe on se, että laittaisin koodit jakoon avoimena lähdekoodina.
« Viimeksi muokattu: 20.06.23 - klo:14.37 kirjoittanut ilkant »

nm

  • Käyttäjä
  • Viestejä: 16424
    • Profiili
Vs: Pallot ja kädet pallomereksi
« Vastaus #4 : 21.06.23 - klo:14.21 »
Tässä on yksi kuva: Pallomeri. (Ihmisen mitokondrion dna-haploryhmän mutaatioiden klusterit ja näytteiden vanhimmat tunnetut äitilinjan äidit)

Nyt siis kysymys on siinä, että kun on yksi tai useampi näyte datana, jossa on noita käsiä epälukuisa määrä. Niistä pitäisi luoda tuo verkosto. Olen tehnyt sen aika pitkälle, mutta kun yhden pallon (näytteen) käsi voi täsmätä useampaan toiseen palloon pituutensa mukaan (0 - 3), niin vaatisi aika paljon koodausta, jotta osaisi valita sen oikean. Toisin sanoen, tulisi yksikäsitteisiä uniikkeja klustereita. Jotain tuollaista.

Ehkä tässä pääsisi paremmin eteenpäin, jos pystyisit jakamaan esimerkkitapauksen raakadatasta ja valmiista mallista, joka raakadatasta on muodostettu (vaikka ihan päättelemällä).


Opetellessani Pythonia tein tietorakenteet tupletteina. Siitä oli iso etu kun python tallensi koko verkon yhdellä käskyllä JSON-muotoiseksi tiedostoksi. Sitten kun vaihdoin tietorakenteet olio-ohjelmoinnin luokiksi, niin sepä ei enää mennytkään automaattisesti. Tämä ei tuohon mallinnukseen kuulu, mutta kerronpa vain.

Pydantic on hyvä ratkaisu tyypitettyjen oliomallien serialisointiin ja deserialisointiin mm. JSON-muotoon.

https://docs.pydantic.dev/latest/usage/exporting_models/

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Vs: Pallot ja kädet pallomereksi
« Vastaus #5 : 03.08.23 - klo:20.34 »
Sain äsken ihan uudenlaisen tavan ratkaista tuon ohjelmointiongelman. Vaikuttaa helpommalta. Tiedä sitten, tuleeko siinäkin vastaan yhä monimutkaisemmaksi meneviä ehtorakenteita vailla loppua. Tauko koodauksessa auttaa löytämään uusia ajatuksia. Pitää jossain vaiheessa alkaa muuntaa ajatuksia koodiksi. Tekoälylläkin voisi olla sanottavansa. Mutta luulen, että en osaisi ohjata tekoälyä löytämään ne ratkaisut tai siinä menisi yhtä paljon aikaa kuin perinteisessä koodauksessa.