Open BPJandree opened 9 months ago
The OP given c++ example seems a valid starting point for using Rcpp.
Two routes have been explored to get the example to work from the geodms build environment:
From these two attempts it turns out that Rcpp requires the same build toolchain in which R is build. This is also stated by the author of Rcpp in paragraph 2.9:
Furthermore, Rcpp requires c++ standard library version << 17 as the std::unary_function is removed from version 17 onwards, this can easily be circumvented however.
I'm not a full blown c++ expert but here's a thought from my end (and I may be wrong)
Pros:
Cons:
Pros:
Cons:
If you can make integration work without needing to fixate on a specific version of Rcpp or R, and custom modifications aren't required to interact with geoDMS, I suggest opting for Rcpp binaries from CRAN. The argument concerning overhead and maintenance takes probably weights strongly given the relatively small size of the geoDMS community. Also geoDMS is not really intended for light-weight real-time applications that you want to run with little dead-weight code as possible. The CRAN files should also simplifies the setup process and make the overall task easier. Finally, the continuous and rapid advancements in AI/ML are reflected by the frequent release of new R packages, a compelling reason for this integration is the opportunity to tap into these developments within the R community.
We kunnen het linken aan Rcpp en het in geheugen door geven van de matrix X en vector y overslaan als we die ook door de GeoDms in een file opslaan en via ShellExecute of CMD R aanroepen met een script-naam waarbij filename worden doorgegeven:
Dit vereist enkel het kunnen starten van R via de bestaande Exec functie, en behoeft wat aandacht mb.t. synchronisatie (volgorde) van rekenvoorwerk, data schrijfwerk, Exec uitvoeren, en resultaten lezen en verder verwerken in GeoDms.
Deze route lijkt me veel makkelijker dan linken, want kan met huidige GeoDms en toolchain; installatie (van R) laten we dan aan gebruikers over; bestaande functionaliteit en de overhead van GeoDms-memory -> file-format -> R-memory is tegenwoordig beperkter dan in de tijd van disk-drives en gebrek aan memory-caches.
Aandachtspunten en beslispunten:
Het synchronisatie issue is zeker opgelost als eea vanuit een batch file (.bat of .cmd) in stappen wordt aangestuurd:
EstimateModel.cmd:
ApplyModel.cmd:
Hi Maarten!
Ik sprak Chris en Eric eerder vandaag. Momenteel is het zo dat die suitability maps gegenereerd worden door tamelijk inflexibele parametrische formules van het type
Dit wordt direct in geoDMS ingeprogrammeerd en
b1
enb2
worden dan hardcoded ingevoerd.Het zou handig zijn als geoDMS bepaalde berekeningen in een R (of Python) environment kan laten doen en de uitkomsten dan terug kan halen naar de geoDMS environment. Dit maakt het volgende dan mogelijk:
waar X een matrix is
(hoogte, afstandTot)
enRmodel()
een wrapper is om een R functie. In R zijn alle modellen (lineaire regressie, logit, Random Forest, Neural Networks, XGBoost etc etc) allemaal gestandardizeerd en kan je er het volgende mee:model_obect
kan daarmee van alles zijn.kijk maar naar de volgende code:
bovendien kun je die R modellen op je disk opslaan. Er is daar een functie voor
saveRDS(object)
dat serialized het object en slaat dat op. Je kan dan de volgende code gebruiken in een lege R sessie:Dit zou niet zo moeilijk moeten zijn. I k geloof dat jij ooit zei dat geoDMS in c++ is geschreven? Deze integratie is goed uitgewerkt: https://www.rcpp.org/
dit zou moeten werken:
Het enige wat dus nodig is, is een functie die een data matrix
X
en een bestandslocatiefile
in geoDMS naar een R functie stuurt die danmodel<-readRDS(file)
doet om een model te laden, en vervolgenspredict(model, newdata=X)
doet om de schattingen te genereren die terug naar geoDMS moeten.Cheers