@ -0,0 +1,2 @@ | |||||
.RData | |||||
.Rhistory |
@ -0,0 +1,11 @@ | |||||
sum1 <- function(m) { | |||||
res = 0 | |||||
for(i in 1:dim(m)[1]) { | |||||
for(j in 1:dim(m)[2]) { | |||||
res <- res + m[i,j] | |||||
} | |||||
} | |||||
return(res) | |||||
} |
@ -0,0 +1,10 @@ | |||||
sum2 <- function(m) { | |||||
res = .C("sum2" | |||||
,mtrx=as.double(m) | |||||
,m=as.integer(dim(m)[1]) | |||||
,n=as.integer(dim(m)[2]) | |||||
,res=as.double(0) | |||||
) | |||||
return(res$res) | |||||
} |
@ -0,0 +1,13 @@ | |||||
#include <R.h> | |||||
void sum2(double* mtrx, int* m, int* n, double* res) | |||||
{ | |||||
*res = 0; | |||||
for(int i=0; i < *n; i++) | |||||
{ | |||||
for(int j=0; j < *m; j++) { | |||||
*res += mtrx[j * (*n) + i]; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,9 @@ | |||||
# test1.R | |||||
x <- c(1,2,5,7) | |||||
mx <- mean(x) # Mittelwert berechnen | |||||
sx <- sd(x) # Standardabweichung berechnen | |||||
cat("x = ", x, "\n") | |||||
cat("Mittelwert = ", mx, "\n") | |||||
cat("Standardabweichung = ", sx, "\n") |
@ -0,0 +1,20 @@ | |||||
source("sum1.R") | |||||
source("sum2.R") | |||||
dyn.load("sum2.so") | |||||
comp_sum_funcs <- function(sizes){ | |||||
msizes = c() | |||||
times_1 = c() | |||||
times_2 = c() | |||||
for(i in sizes) { | |||||
m <- matrix(rnorm(i^2), i) | |||||
times_1 = append(times_1, summary(system.time(sum1(m)))[1]) | |||||
times_2 = append(times_2, summary(system.time(sum2(m)))[1]) | |||||
msizes = append(msizes, i) | |||||
} | |||||
return(data.frame(size=msizes, sum_1 = times_1, sum_2 = times_2)) | |||||
} | |||||
@ -0,0 +1,9 @@ | |||||
Package: twosums | |||||
Type: Package | |||||
Title: What the package does (short line) | |||||
Version: 1.0 | |||||
Date: 2021-05-12 | |||||
Author: Who wrote it | |||||
Maintainer: Who to complain to <yourfault@somewhere.net> | |||||
Description: More about what it does (maybe more than one line) | |||||
License: What license is it under? |
@ -0,0 +1 @@ | |||||
export("sum1", "sum2") |
@ -0,0 +1,12 @@ | |||||
sum1 <- | |||||
function(m) { | |||||
res = 0 | |||||
for(i in 1:dim(m)[1]) { | |||||
for(j in 1:dim(m)[2]) { | |||||
res <- res + m[i,j] | |||||
} | |||||
} | |||||
return(res) | |||||
} |
@ -0,0 +1,11 @@ | |||||
sum2 <- | |||||
function(m) { | |||||
res = .C("sum2" | |||||
,mtrx=as.double(m) | |||||
,m=as.integer(dim(m)[1]) | |||||
,n=as.integer(dim(m)[2]) | |||||
,res=as.double(0) | |||||
) | |||||
return(res$res) | |||||
} |
@ -0,0 +1,10 @@ | |||||
* Edit the help file skeletons in 'man', possibly combining help files | |||||
for multiple functions. | |||||
* Edit the exports in 'NAMESPACE', and add necessary imports. | |||||
* Put any C/C++/Fortran code in 'src'. | |||||
* If you have compiled code, add a useDynLib() directive to | |||||
'NAMESPACE'. | |||||
* Run R CMD build to build the package tarball. | |||||
* Run R CMD check to check the package tarball. | |||||
Read "Writing R Extensions" for more information. |
@ -0,0 +1,69 @@ | |||||
\name{sum1} | |||||
\alias{sum1} | |||||
%- Also NEED an '\alias' for EACH other topic documented here. | |||||
\title{ | |||||
%% ~~function to do ... ~~ | |||||
} | |||||
\description{ | |||||
%% ~~ A concise (1-5 lines) description of what the function does. ~~ | |||||
} | |||||
\usage{ | |||||
sum1(m) | |||||
} | |||||
%- maybe also 'usage' for other objects documented here. | |||||
\arguments{ | |||||
\item{m}{ | |||||
%% ~~Describe \code{m} here~~ | |||||
} | |||||
} | |||||
\details{ | |||||
%% ~~ If necessary, more details than the description above ~~ | |||||
} | |||||
\value{ | |||||
%% ~Describe the value returned | |||||
%% If it is a LIST, use | |||||
%% \item{comp1 }{Description of 'comp1'} | |||||
%% \item{comp2 }{Description of 'comp2'} | |||||
%% ... | |||||
} | |||||
\references{ | |||||
%% ~put references to the literature/web site here ~ | |||||
} | |||||
\author{ | |||||
%% ~~who you are~~ | |||||
} | |||||
\note{ | |||||
%% ~~further notes~~ | |||||
} | |||||
%% ~Make other sections like Warning with \section{Warning }{....} ~ | |||||
\seealso{ | |||||
%% ~~objects to See Also as \code{\link{help}}, ~~~ | |||||
} | |||||
\examples{ | |||||
##---- Should be DIRECTLY executable !! ---- | |||||
##-- ==> Define data, use random, | |||||
##-- or do help(data=index) for the standard data sets. | |||||
## The function is currently defined as | |||||
function (m) | |||||
{ | |||||
res = 0 | |||||
for (i in 1:dim(m)[1]) { | |||||
for (j in 1:dim(m)[2]) { | |||||
res <- res + m[i, j] | |||||
} | |||||
} | |||||
return(res) | |||||
} | |||||
} | |||||
% Add one or more standard keywords, see file 'KEYWORDS' in the | |||||
% R documentation directory (show via RShowDoc("KEYWORDS")): | |||||
% \keyword{ ~kwd1 } | |||||
% \keyword{ ~kwd2 } | |||||
% Use only one keyword per line. | |||||
% For non-standard keywords, use \concept instead of \keyword: | |||||
% \concept{ ~cpt1 } | |||||
% \concept{ ~cpt2 } | |||||
% Use only one concept per line. |
@ -0,0 +1,65 @@ | |||||
\name{sum2} | |||||
\alias{sum2} | |||||
%- Also NEED an '\alias' for EACH other topic documented here. | |||||
\title{ | |||||
%% ~~function to do ... ~~ | |||||
} | |||||
\description{ | |||||
%% ~~ A concise (1-5 lines) description of what the function does. ~~ | |||||
} | |||||
\usage{ | |||||
sum2(m) | |||||
} | |||||
%- maybe also 'usage' for other objects documented here. | |||||
\arguments{ | |||||
\item{m}{ | |||||
%% ~~Describe \code{m} here~~ | |||||
} | |||||
} | |||||
\details{ | |||||
%% ~~ If necessary, more details than the description above ~~ | |||||
} | |||||
\value{ | |||||
%% ~Describe the value returned | |||||
%% If it is a LIST, use | |||||
%% \item{comp1 }{Description of 'comp1'} | |||||
%% \item{comp2 }{Description of 'comp2'} | |||||
%% ... | |||||
} | |||||
\references{ | |||||
%% ~put references to the literature/web site here ~ | |||||
} | |||||
\author{ | |||||
%% ~~who you are~~ | |||||
} | |||||
\note{ | |||||
%% ~~further notes~~ | |||||
} | |||||
%% ~Make other sections like Warning with \section{Warning }{....} ~ | |||||
\seealso{ | |||||
%% ~~objects to See Also as \code{\link{help}}, ~~~ | |||||
} | |||||
\examples{ | |||||
##---- Should be DIRECTLY executable !! ---- | |||||
##-- ==> Define data, use random, | |||||
##-- or do help(data=index) for the standard data sets. | |||||
## The function is currently defined as | |||||
function (m) | |||||
{ | |||||
res = .C("sum2", mtrx = as.double(m), m = as.integer(dim(m)[1]), | |||||
n = as.integer(dim(m)[2]), res = as.double(0)) | |||||
return(res$res) | |||||
} | |||||
} | |||||
% Add one or more standard keywords, see file 'KEYWORDS' in the | |||||
% R documentation directory (show via RShowDoc("KEYWORDS")): | |||||
% \keyword{ ~kwd1 } | |||||
% \keyword{ ~kwd2 } | |||||
% Use only one keyword per line. | |||||
% For non-standard keywords, use \concept instead of \keyword: | |||||
% \concept{ ~cpt1 } | |||||
% \concept{ ~cpt2 } | |||||
% Use only one concept per line. |
@ -0,0 +1,36 @@ | |||||
\name{twosums-package} | |||||
\alias{twosums-package} | |||||
\alias{twosums} | |||||
\docType{package} | |||||
\title{ | |||||
\packageTitle{twosums} | |||||
} | |||||
\description{ | |||||
\packageDescription{twosums} | |||||
} | |||||
\details{ | |||||
The DESCRIPTION file: | |||||
\packageDESCRIPTION{twosums} | |||||
\packageIndices{twosums} | |||||
~~ An overview of how to use the package, including the most important ~~ | |||||
~~ functions ~~ | |||||
} | |||||
\author{ | |||||
\packageAuthor{twosums} | |||||
Maintainer: \packageMaintainer{twosums} | |||||
} | |||||
\references{ | |||||
~~ Literature or other references for background information ~~ | |||||
} | |||||
~~ Optionally other standard keywords, one per line, from file KEYWORDS in ~~ | |||||
~~ the R documentation directory ~~ | |||||
\keyword{ package } | |||||
\seealso{ | |||||
~~ Optional links to other man pages, e.g. ~~ | |||||
~~ \code{\link[<pkg>:<pkg>-package]{<pkg>}} ~~ | |||||
} | |||||
\examples{ | |||||
~~ simple examples of the most important functions ~~ | |||||
} |
@ -0,0 +1,13 @@ | |||||
#include <R.h> | |||||
void sum2(double* mtrx, int* m, int* n, double* res) | |||||
{ | |||||
*res = 0; | |||||
for(int i=0; i < *n; i++) | |||||
{ | |||||
for(int j=0; j < *m; j++) { | |||||
*res += mtrx[j * (*n) + i]; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,126 @@ | |||||
library(ggplot2) | |||||
library(gganimate) | |||||
library(patchwork) | |||||
gradient <- function(f, x, d){ | |||||
return((f(x + d) - f(x - d)) / (2*d)) | |||||
} | |||||
gradient.ascent.move <- function(f, x, d, mu){ | |||||
return(x + mu * gradient(f, x, d)) | |||||
} | |||||
func.g <- function(x) x | |||||
func.k <- function(x) sin(x) | |||||
func.h <- function(x) x * sin(x) | |||||
func.l <- function(x) 2 + cos(x) + sin(2*x) | |||||
gradient.ascent.iterate <- function(f, x, d, mu, n){ | |||||
if(n == 1) { | |||||
return(gradient.ascent.move(f, x, d, mu)) | |||||
} | |||||
return(gradient.ascent.niter(f | |||||
,gradient.descent.move(f, x, d, mu) | |||||
,d | |||||
,mu | |||||
,n-1 | |||||
)) | |||||
} | |||||
gradient.ascent.iterverb <- function(f, x, d, mu, n, xs=numeric()){ | |||||
next_x <- gradient.ascent.move(f, x, d, mu) | |||||
xs[length(xs)+1] <- next_x | |||||
if(n == 1) { | |||||
return(xs) | |||||
} | |||||
return(gradient.ascent.iterverb(f, next_x, d, mu, n-1, xs)) | |||||
} | |||||
trace.ascent <- function(f, x, d, eta, n, xs) { | |||||
df_dc = data.frame(x=numeric() | |||||
,y=numeric() | |||||
,i=integer() | |||||
,start_x=character() | |||||
,eta=numeric()) | |||||
for(start in x) { | |||||
for(e in eta) { | |||||
first_it <- TRUE | |||||
if(first_it == TRUE) { | |||||
df_dc <- rbind(df_dc, data.frame(x=c(start) | |||||
,y=c(f(start)) | |||||
,i=c(0) | |||||
,start_x=c(as.character(start)) | |||||
,eta=c(e) | |||||
)) | |||||
first_it <- FALSE | |||||
} | |||||
xf <- gradient.ascent.iterverb(f, start, d, e, n) | |||||
df_dc <- rbind(df_dc, data.frame(x=xf | |||||
,y=f(xf) | |||||
,i=1:length(xf) | |||||
,start_x=rep(as.character(start), length(xf)) | |||||
,eta=e) | |||||
) | |||||
} | |||||
} | |||||
return(df_dc) | |||||
} | |||||
plot.ascent <- function(f, x, d, eta, n, xs) { | |||||
df_dc = trace.ascent(f, x, d, eta, n, xs) | |||||
func_str = deparse(substitute(f)) | |||||
df_f <- data.frame(x=xs, y=f(xs)) | |||||
p1 <- ggplot(df_f, aes(x=x, y=y)) + | |||||
geom_line() + | |||||
geom_point(aes(colour=start_x | |||||
,size=i | |||||
) | |||||
,data=df_dc) + | |||||
labs(size="iteration" | |||||
,alpha="iteration" | |||||
,color="start x" | |||||
,y=sprintf("%s(x)", func_str)) + | |||||
facet_grid(eta ~ ., labeller=label_both) | |||||
p2 <- ggplot(df_dc, aes(x=i, y=y)) + | |||||
geom_line(aes(colour=start_x), show.legend=FALSE) + | |||||
labs(x="iteration" | |||||
,y=sprintf("%s(x)", func_str)) + | |||||
facet_grid(eta ~ ., labeller=label_both) | |||||
p <- (p1 | p2) + | |||||
plot_annotation(title=sprintf("function: %s", func_str)) + | |||||
plot_layout(guides="collect" | |||||
,widths=10 | |||||
,heights=2) | |||||
return(p) | |||||
} | |||||
animate.ascent <- function(f, x, d, eta, n, xs) { | |||||
df_dc = trace.ascent(f, x, d, eta, n, xs) | |||||
func_str <- deparse(substitute(f)) | |||||
df_f <- data.frame(x=xs, y=f(xs)) | |||||
p <- ggplot(df_f, aes(x=x, y=y)) + | |||||
geom_line() + | |||||
geom_point(aes(colour=start_x), size=2.5, data=df_dc) + | |||||
labs(color="start x", y=sprintf("%s(x)", func_str)) + | |||||
facet_grid(eta ~ ., labeller=label_both) + | |||||
ggtitle(sprintf("function: %s", func_str)) | |||||
anim <- p + transition_reveal(i) | |||||
return(anim) | |||||
} |
@ -0,0 +1,124 @@ | |||||
library(ggplot2) | |||||
func.g <- function(x) x | |||||
func.k <- function(x) sin(x) | |||||
func.h <- function(x) x * sin(x) | |||||
func.l <- function(x) 2 + cos(x) + sin(2*x) | |||||
delta.const <- function(x) { | |||||
return(function() x) | |||||
} | |||||
delta.gaus <- function() { | |||||
return(rnorm(1)) | |||||
} | |||||
ea.init_population <- function(range, size, rand_gen) { | |||||
return(rand_gen(size) * (range[2] - range[1]) + range[1]) | |||||
} | |||||
ea.trace <- function(range, delta, population_size, fit_func, iterations) { | |||||
population <- ea.init_population(range, population_size, runif) | |||||
df <- data.frame(i=integer() | |||||
,max=numeric() | |||||
,median=numeric() | |||||
,min=numeric()) | |||||
for(i in 1:iterations) { | |||||
population <- ea.iterate(delta, population, fit_func) | |||||
df[nrow(df) + 1,] <- c(i | |||||
,population[1] | |||||
,population[length(population) %/% 2] | |||||
,population[length(population)] | |||||
) | |||||
} | |||||
df["max_val"] <- fit_func(df$max) | |||||
df["median_val"] <- fit_func(df$median) | |||||
df["min_val"] <- fit_func(df$min) | |||||
res <- list(population, df) | |||||
names(res) <- c("population", "df_tr") | |||||
return(res) | |||||
} | |||||
ea.traces <- function(range, deltas, population_size, fit_funcs, iterations) { | |||||
df <- data.frame(i=integer() | |||||
,max=numeric() | |||||
,median=numeric() | |||||
,min=numeric() | |||||
,delta_func=character() | |||||
,delta=numeric() | |||||
,fit_func=character()) | |||||
for(delta_func in names(deltas)) { | |||||
delta <- deltas[delta_func] | |||||
for(fit_name in names(fit_funcs)) { | |||||
fit <- fit_funcs[fit_name] | |||||
tmp_df <- ea.trace(range, delta, population_size, fit, iterations)$df_tr | |||||
tmp_df["delta_func"] <- delta_func | |||||
if(delta_func == "delta.gaus") { | |||||
tmp_df["delta"] <- NA | |||||
} else { | |||||
tmp_df["delta"] <- delta() | |||||
} | |||||
tmp_df["fit_func"] <- fit_name | |||||
df <- rbind(df, tmp_df) | |||||
} | |||||
} | |||||
return(df) | |||||
} | |||||
ea.plot <- function(range, delta, population_size, fit_func, iterations) { | |||||
res <- ea.trace(range, delta, population_size, fit_func, iterations) | |||||
df_vals <- melt(res$df_tr[c("i", "min_val", "median_val", "max_val")], id.vars="i") | |||||
p <- ggplot(data=df_vals, aes(x=i)) + | |||||
geom_line(aes(y=value, linetype=variable)) | |||||
return(p) | |||||
} | |||||
ea.run <- function(range, delta, population_size, fit_func, iterations) { | |||||
population <- ea.init_population(range, population_size, runif) | |||||
for(i in 1:iterations) { | |||||
population <- ea.iterate(delta, population, fit_func) | |||||
} | |||||
return(population) | |||||
} | |||||
ea.iterate <- function(delta, population, fit_func) { | |||||
children <- c() | |||||
for(individual in population) { | |||||
children <- append(children, ea.mutate(individual, delta)) | |||||
} | |||||
population <- append(population, children) | |||||
return(ea.select(population, fit_func)) | |||||
} | |||||
ea.mutate <- function(individual, delta) { | |||||
sign <- sample(c(-1,1), 1) | |||||
return(individual + sign * delta()) | |||||
} | |||||
ea.select <- function(population, fit_func) { | |||||
sorted_popul <- population[order(sapply(population, fit_func), decreasing=TRUE)] | |||||
return(sorted_popul[1 : (length(sorted_popul) %/% 2)]) | |||||
} |
@ -0,0 +1,125 @@ | |||||
library(ggplot2) | |||||
func.g <- function(x) x | |||||
func.k <- function(x) sin(x) | |||||
func.h <- function(x) x * sin(x) | |||||
func.l <- function(x) 2 + cos(x) + sin(2*x) | |||||
delta.const <- function(x) { | |||||
return(function() x) | |||||
} | |||||
delta.gaus <- function() { | |||||
return(rnorm(1)) | |||||
} | |||||
ea.init_population <- function(range, size, rand_gen) { | |||||
return(rand_gen(size) * (range[2] - range[1]) + range[1]) | |||||
} | |||||
ea.trace <- function(range, delta, population_size, fit_func, iterations) { | |||||
population <- ea.init_population(range, population_size, runif) | |||||
df <- data.frame(i=integer() | |||||
,max=numeric() | |||||
,median=numeric() | |||||
,min=numeric()) | |||||
for(i in 1:iterations) { | |||||
population <- ea.iterate(delta, population, fit_func) | |||||
df[nrow(df) + 1,] <- c(i | |||||
,population[1] | |||||
,population[length(population) %/% 2] | |||||
,population[length(population)] | |||||
) | |||||
} | |||||
df["max_val"] <- fit_func(df$max) | |||||
df["median_val"] <- fit_func(df$median) | |||||
df["min_val"] <- fit_func(df$min) | |||||
res <- list(population, df) | |||||
names(res) <- c("population", "df_tr") | |||||
return(res) | |||||
} | |||||
ea.traces <- function(range, deltas, population_size, fit_funcs, iterations) { | |||||
df <- data.frame(i=integer() | |||||
,max=numeric() | |||||
,median=numeric() | |||||
,min=numeric() | |||||
,delta_func=character() | |||||
,delta=numeric() | |||||
,fit_func=character()) | |||||
for(delta_func in names(deltas)) { | |||||
delta <- deltas[[delta_func]] | |||||
for(fit_name in names(fit_funcs)) { | |||||
fit <- fit_funcs[[fit_name]] | |||||
print(delta_func) | |||||
tmp_df <- ea.trace(range, delta, population_size, fit, iterations)$df_tr | |||||
tmp_df["delta_func"] <- delta_func | |||||
if(delta_func == "delta.gaus") { | |||||
tmp_df["delta"] <- NA | |||||
} else { | |||||
tmp_df["delta"] <- delta() | |||||
} | |||||
tmp_df["fit_func"] <- fit_name | |||||
df <- rbind(df, tmp_df) | |||||
} | |||||
} | |||||
return(df) | |||||
} | |||||
ea.plot <- function(range, delta, population_size, fit_func, iterations) { | |||||
res <- ea.trace(range, delta, population_size, fit_func, iterations) | |||||
df_vals <- melt(res$df_tr[c("i", "min_val", "median_val", "max_val")], id.vars="i") | |||||
p <- ggplot(data=df_vals, aes(x=i)) + | |||||
geom_line(aes(y=value, linetype=variable)) | |||||
return(p) | |||||
} | |||||
ea.run <- function(range, delta, population_size, fit_func, iterations) { | |||||
population <- ea.init_population(range, population_size, runif) | |||||
for(i in 1:iterations) { | |||||
population <- ea.iterate(delta, population, fit_func) | |||||
} | |||||
return(population) | |||||
} | |||||
ea.iterate <- function(delta, population, fit_func) { | |||||
children <- c() | |||||
for(individual in population) { | |||||
children <- append(children, ea.mutate(individual, delta)) | |||||
} | |||||
population <- append(population, children) | |||||
return(ea.select(population, fit_func)) | |||||
} | |||||
ea.mutate <- function(individual, delta) { | |||||
sign <- sample(c(-1,1), 1) | |||||
return(individual + sign * delta()) | |||||
} | |||||
ea.select <- function(population, fit_func) { | |||||
sorted_popul <- population[order(sapply(population, fit_func), decreasing=TRUE)] | |||||
return(sorted_popul[1 : (length(sorted_popul) %/% 2)]) | |||||
} |