{"id":50830555,"url":"https://github.com/cuberhaus/pracpro2","last_synced_at":"2026-06-13T22:30:43.876Z","repository":{"id":141371653,"uuid":"260757899","full_name":"cuberhaus/pracpro2","owner":"cuberhaus","description":"Pro2 course project (FIB-UPC): species clustering by gene-sequence similarity using WPGMA hierarchical clustering, with a Rust backend and visualization.","archived":false,"fork":false,"pushed_at":"2026-06-09T07:55:07.000Z","size":61867,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-09T09:27:55.685Z","etag":null,"topics":["algorithms","bioinformatics","clustering","cpp","rust","upc","wpgma"],"latest_commit_sha":null,"homepage":"https://polcasacubertagil.com/demos/pro2","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cuberhaus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-05-02T19:15:07.000Z","updated_at":"2026-06-09T07:55:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"06f31291-6bc9-454b-a96b-1869bad30f80","html_url":"https://github.com/cuberhaus/pracpro2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cuberhaus/pracpro2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuberhaus%2Fpracpro2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuberhaus%2Fpracpro2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuberhaus%2Fpracpro2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuberhaus%2Fpracpro2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cuberhaus","download_url":"https://codeload.github.com/cuberhaus/pracpro2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuberhaus%2Fpracpro2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34303279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithms","bioinformatics","clustering","cpp","rust","upc","wpgma"],"created_at":"2026-06-13T22:30:43.048Z","updated_at":"2026-06-13T22:30:43.862Z","avatar_url":"https://github.com/cuberhaus.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"**Nombre del Proyecto:** Práctica PRO2 Primavera 2020  \nVersión: 1.0  \nLenguaje i Versión: C++ 17  \nEl programa principal se encuentra en el módulo program.cc.\nPara Almacenar y tratar los datos descritos en el enunciado de la práctica,\nusaremos el módulo especie para representar las especies son sus\nidentificadores y genes, el módulo cjt_especies para representar un conjunto\nde especies donde almacenaremos las distancias entre especies i el conjunto.\nPara los clusters usaremos el módulo cluster i el módulo cjt_clusters para\nalmacenar un conjunto de estos.\n\n**Funciones:**\n  1. _crea_especie:_ Crea una especie con el identificador y gen (dos strings) dados. Escribe un mensaje de error si ya existe una especie con el mismo identificador. La especie creada, si no hay error, se agrega al conjunto de especies.\n  2. _obtener_gen:_ Dado un identificador de especie, imprime el gen asociado a la especie. Escribe un mensaje de error si no existe una especie con el identificador dado.\n  3. _distancia:_ Dados dos identificadores de especies, imprime la distancia entre las dos especies. Se escribe un mensaje de error si alguna de las dos especies cuyos identificadores se dan no existen.\n  4. _elimina_especie:_ Dado el identificador de una especie e la elimina del conjunto de especies. Escribe un mensaje de error si la especie con el identificador dado no existe.\n  5. _existe_especie:_ Dado el identificador de una especie e imprime una indicación de si dicha especie existe.\n  6. _lee_cjt_especies:_ Lee del canal estándar de entrada un entero n ≥ 0 y a continuación una secuencia de n especies. Las n especies dadas tienen identificadores distintos entre sí. Los contenidos previos del conjunto de especies se descartan  y las n especies leídas se agregan al conjunto de especies.\n  7. _imprime_cjt_especies:_ Imprime en el canal estándar de salida el conjunto de especies.\n  8. _tabla_distancias:_ Imprime la tabla de distancias entre cada par de especies del conjunto de especies.\n  9. _inicializa_clusters:_ Inicializa el conjunto de clústers con el conjunto de especies en el estado en el que esté en ese momento, e imprime la tabla de distancias entre clústers. Al imprimir la tabla de distancias se usarán los identificadores de los clústers para indexar filas y columnas.\n  10. _ejecuta_paso_wpgma:_ ejecuta un paso del algoritmo WPGMA (fusiona los dos clústers a menor distancia en uno nuevo) e imprime la tabla de distancias entre clústers resultante. Al imprimir la tabla de distancias se usarán los identificadores de los clústers para indexar filas y columnas. En caso de que el número de clústers del conjunto sea menor o igual que uno solamente se debe imprimir un mensaje de error.\n  11. _imprime_cluster:_ dado un identificador α, imprime el clúster con el identificador dado, o un error si no existe un clúster con dicho identificador en el conjunto de clústers.\n  12. _imprime_arbol_filogenetico:_ imprime el árbol filogenético para el conjunto deespecies actual; dicho árbol es el clúster que agrupa todas las especies, resultante de aplicar el algoritmo WPGMA. El contenido del conjunto de clústers previo se descarta y se reinicializa con el conjunto de especies en el estado en el que esté en ese momento, para a continuación aplicar el algoritmo. El conjunto de clústers final es el que queda después de aplicar el algoritmo.\n  Se imprimirá la estructura arborescente del clúster con los identificadores de los clústers (raíces de los subárboles) y la distancia entre cada clúster y sus hojas descendientes.\n  13. _fin:_ finaliza la ejecución del programa.\n\n---\n\n## Compilación y Ejecución\n\nEl proyecto incluye un `Makefile` para gestionar la compilación del código C++ (estándar C++11).\n\nPara compilar el proyecto y generar el ejecutable `program.exe`:\n```bash\nmake\n```\n\nPara limpiar los archivos objeto y ejecutables generados:\n```bash\nmake clean\n```\n\nPara ejecutar el programa de forma manual:\n```bash\n./program.exe\n```\n\n---\n\n## Testeo (Jocs de Prova)\n\nLa carpeta `jocs_de_prova` contiene juegos de prueba para validar el correcto funcionamiento del algoritmo WPGMA y la gestión de especies.\n\n### Cómo ejecutar los tests manualmente\n\n1. **Compilar el programa**: Asegúrate de haber ejecutado `make`.\n2. **Ejecutar con redirección**: Usa los archivos de entrada (`.txt` o `.input`) y redirige la salida a un archivo temporal.\n   ```bash\n   ./program.exe \u003c jocs_de_prova/entrada.txt \u003e mi_salida.txt\n   ```\n3. **Comparar resultados**: Usa el comando `diff` para comparar tu salida con la salida correcta esperada.\n   ```bash\n   diff mi_salida.txt jocs_de_prova/correct.txt\n   ```\n   Si el comando no devuelve nada, significa que la salida es idéntica y el test ha pasado correctamente.\n\n### Generación de documentación\nPuedes generar la documentación técnica en HTML y LaTeX usando Doxygen:\n```bash\nmake html\n```\nLa documentación se generará en las carpetas `html/` y `latex/`.\n\n---\n\n## Web App\n\nAn interactive web frontend for the WPGMA clustering algorithm: input species with gene sequences and watch the algorithm merge clusters step by step into a dendrogram.\n\n**Stack:** Vue 3 (CDN) + D3.js dendrogram + Rust/Axum backend wrapping the compiled C++ engine\n\n### Quick Start\n\n```bash\n# Docker (recommended)\ndocker build -t pracpro2 . \u0026\u0026 docker run -p 8000:8000 pracpro2\n# http://localhost:8000\n\n# Dev mode (requires compiled program.exe + Rust toolchain)\nmake dev    # compiles C++, then runs Axum dev server on :8000\n```\n\n### Features\n\n- Add/remove species with gene sequences through an interactive form\n- Step-by-step WPGMA execution with animated D3.js dendrogram visualization\n- Distance matrix display updated after each merge step\n- Full phylogenetic tree generation from current species set\n\n### Web Structure\n\n```\nweb/\n├── static/\n│   ├── index.html     # Vue 3 + D3.js single-page app\n│   ├── app.js         # Vue application logic\n│   └── style.css      # Dark theme CSS\n└── backend/\n    ├── Cargo.toml     # Rust dependencies (axum, tokio, tower-http, serde)\n    └── src/\n        └── main.rs    # Axum server wrapping C++ program.exe via stdin/stdout\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuberhaus%2Fpracpro2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcuberhaus%2Fpracpro2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuberhaus%2Fpracpro2/lists"}