Skip to content

Commit 363f28b

Browse files
authored
Extracted dom_size and param value from icn construction (#19)
1 parent f5f7665 commit 363f28b

File tree

9 files changed

+104
-98
lines changed

9 files changed

+104
-98
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "CompositionalNetworks"
22
uuid = "4b67e4b5-442d-4ef5-b760-3f5df3a57537"
33
authors = ["Jean-François Baffier"]
4-
version = "0.1.0"
4+
version = "0.1.1"
55

66
[deps]
77
ConstraintDomains = "5800fd60-8556-4464-8d61-84ebf7a0bedb"

src/comparison.jl

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,69 @@
22
_co_identity(x::Number)
33
Identity function. Already defined in Julia as `identity`, specialized for scalars in the `comparison` layer.
44
"""
5-
_co_identity(x) = identity(x)
5+
_co_identity(x; param=nothing, dom_size=0, nvars=0) = identity(x)
66

77
"""
88
_co_abs_diff_val_param(x, param)
99
Return the absolute difference between `x` and `param`.
1010
"""
11-
_co_abs_diff_val_param(x, param) = abs(x - param)
11+
_co_abs_diff_val_param(x; param, dom_size=0, nvars=0) = abs(x - param)
1212

1313
"""
1414
_co_val_minus_param(x, param)
1515
_co_param_minus_val(x, param)
1616
Return the difference `x - param` (resp. `param - x`) if positive, `0.0` otherwise.
1717
"""
18-
_co_val_minus_param(x, param) = max(0.0, x - param)
19-
_co_param_minus_val(x, param) = max(0.0, param - x)
18+
_co_val_minus_param(x; param, dom_size=0, nvars=0) = max(0.0, x - param)
19+
_co_param_minus_val(x; param, dom_size=0, nvars=0) = max(0.0, param - x)
2020

2121
"""
2222
_co_euclidian_param(x, param, ds)
2323
_co_euclidian(x, ds)
2424
Compute an euclidian norm with domain size `ds`, possibly weigthed by `param`, on a scalar.
2525
"""
26-
_co_euclidian_param(x, param, ds) = x == param ? 0.0 : (1.0 + abs(x - param) \ ds)
27-
_co_euclidian(x, ds) = _co_euclidian_param(x, 0.0, ds)
26+
function _co_euclidian_param(x; param, dom_size, nvars=0)
27+
return x == param ? 0.0 : (1.0 + abs(x - param) \ dom_size)
28+
end
29+
function _co_euclidian(x; param=nothing, dom_size, nvars=0)
30+
return _co_euclidian_param(x; param=0.0, dom_size=dom_size)
31+
end
2832

2933
"""
3034
_co_abs_diff_val_vars(x, nvars)
3135
Return the absolute difference between `x` and the number of variables `nvars`.
3236
"""
33-
_co_abs_diff_val_vars(x, nvars) = abs(x - nvars)
37+
_co_abs_diff_val_vars(x; param=nothing, dom_size=0, nvars) = abs(x - nvars)
3438

3539
"""
3640
_co_val_minus_vars(x, nvars)
3741
_co_vars_minus_val(x, nvars)
3842
Return the difference `x - nvars` (resp. `nvars - x`) if positive, `0.0` otherwise, where `nvars` denotes the numbers of variables.
3943
"""
40-
_co_val_minus_vars(x, nvars) = _co_val_minus_param(x, nvars)
41-
_co_vars_minus_val(x, nvars) = _co_param_minus_val(x, nvars)
44+
_co_val_minus_vars(x; param=nothing, dom_size=0, nvars) = _co_val_minus_param(x; param=nvars)
45+
_co_vars_minus_val(x; param=nothing, dom_size=0, nvars) = _co_param_minus_val(x; param=nvars)
4246

4347
"""
4448
comparison_layer(nvars, dom_size, param = nothing)
4549
Generate the layer of transformations functions of the ICN. Iff `param` value is set, also includes all the parametric transformation with that value.
4650
"""
47-
function comparison_layer(nvars, dom_size, param = nothing)
48-
comparisons = LittleDict{Symbol, Function}(
51+
function comparison_layer(param=false)
52+
comparisons = LittleDict{Symbol,Function}(
4953
:identity => _co_identity,
50-
:euclidian => (x -> _co_euclidian(x, dom_size)),
51-
:abs_diff_val_vars => (x -> _co_abs_diff_val_vars(x, nvars)),
52-
:val_minus_vars => (x -> _co_val_minus_vars(x, nvars)),
53-
:vars_minus_val => (x -> _co_vars_minus_val(x, nvars)),
54+
:euclidian => _co_euclidian,
55+
:abs_diff_val_vars => _co_abs_diff_val_vars,
56+
:val_minus_vars => _co_val_minus_vars,
57+
:vars_minus_val => _co_vars_minus_val,
5458
)
5559

56-
if !isnothing(param)
57-
comparisons_param = LittleDict{Symbol, Function}(
58-
:abs_diff_val_param => (x -> _co_abs_diff_val_param(x, param)),
59-
:val_minus_param => (x -> _co_val_minus_param(x, param)),
60-
:param_minus_val => (x -> _co_param_minus_val(x, param)),
61-
:euclidian_param => (x -> _co_euclidian_param(x, param, dom_size)),
60+
if param
61+
comparisons_param = LittleDict{Symbol,Function}(
62+
:abs_diff_val_param => _co_abs_diff_val_param,
63+
:val_minus_param => _co_val_minus_param,
64+
:param_minus_val => _co_param_minus_val,
65+
:euclidian_param => _co_euclidian_param,
6266
)
63-
comparisons = LittleDict{Symbol, Function}(union(comparisons, comparisons_param))
67+
comparisons = LittleDict{Symbol,Function}(union(comparisons, comparisons_param))
6468
end
6569

6670
return Layer(comparisons, true)

src/genetic.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ end
1212
_loss(X, X_sols, icn, weigths, metric)
1313
Compute the loss of `icn`.
1414
"""
15-
function _loss(X, X_sols, icn, weigths, metric)
15+
function _loss(X, X_sols, icn, weigths, metric, dom_size, param)
1616
f = compose(icn, weigths)
17-
return sum(x -> abs(f(x) - metric(x, X_sols)), X) + regularization(icn)
17+
return (sum(x -> abs(f(x; param = param, dom_size = dom_size) - metric(x, X_sols)), X) + regularization(icn))
1818
end
1919

2020
"""
2121
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)
2222
Optimize and set the weigths of an ICN with a given set of configuration `X` and solutions `X_sols`.
2323
"""
24-
function _optimize!(icn, X, X_sols; metric=hamming, pop_size=200, iter=100)
25-
fitness = weigths -> _loss(X, X_sols, icn, weigths, metric)
24+
function _optimize!(icn, X, X_sols, dom_size, param=nothing; metric=hamming, pop_size=200, iter=100)
25+
fitness = weigths -> _loss(X, X_sols, icn, weigths, metric, dom_size, param)
2626

2727
_icn_ga = GA(
2828
populationSize=pop_size,
@@ -44,12 +44,14 @@ end
4444
Optimize and set the weigths of an ICN with a given set of configuration `X` and solutions `X_sols`. The best weigths among `global_iter` will be set.
4545
"""
4646

47-
function optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)
47+
function optimize!(icn, X, X_sols, global_iter, local_iter, dom_size, param=nothing; metric=hamming, popSize=100)
4848
results = Dictionary{BitVector,Int}()
4949
@info "Starting optimization of weights"
5050
for i in 1:global_iter
5151
@info "Iteration $i"
52-
_optimize!(icn, X, X_sols; iter = local_iter, metric = metric, pop_size = popSize)
52+
_optimize!(icn, X, X_sols, dom_size, param;
53+
iter=local_iter, metric=metric, pop_size=popSize
54+
)
5355
_incsert!(results, _weigths(icn))
5456
end
5557
best = rand(findall(x -> x == maximum(results), results))

src/icn.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ mutable struct ICN
1616
comparison::Layer
1717
weigths::BitVector
1818

19-
function ICN(; nvars, dom_size,
20-
param=nothing,
19+
function ICN(;
20+
param=false,
2121
tr_layer=transformation_layer(param),
2222
ar_layer=arithmetic_layer(),
2323
ag_layer=aggregation_layer(),
24-
co_layer=comparison_layer(nvars, dom_size, param),
24+
co_layer=comparison_layer(param),
2525
)
2626
w = _generate_weights([tr_layer, ar_layer, ag_layer, co_layer])
2727
new(tr_layer, ar_layer, ag_layer, co_layer, w)
@@ -91,7 +91,7 @@ _generate_weights(icn::ICN) = _generate_weights(_layers(icn))
9191
Internal function called by `compose` and `show_composition`.
9292
"""
9393
function _compose(icn::ICN)
94-
!_is_viable(icn) && (return (_ -> typemax(Float64)), [])
94+
!_is_viable(icn) && (return ((x; param=nothing, dom_size=0) -> typemax(Float64)), [])
9595

9696
funcs = Vector{Vector{Function}}()
9797
symbols = Vector{Vector{Symbol}}()
@@ -124,7 +124,7 @@ function _compose(icn::ICN)
124124
end
125125

126126
l = length(funcs[1])
127-
composition = x -> fill(x, l) .|> funcs[1] |> funcs[2][1] |> funcs[3][1] |> funcs[4][1]
127+
composition = (x; param=nothing, dom_size) -> fill(x, l) .|> map(f -> (y -> f(y; param=param)), funcs[1]) |> funcs[2][1] |> funcs[3][1] |> (y -> funcs[4][1](y; param=param, dom_size=dom_size, nvars=length(x)))
128128
return composition, symbols
129129
end
130130

@@ -133,20 +133,20 @@ end
133133
compose(icn, weights)
134134
Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If `weights` are given, will assign to `icn`.
135135
"""
136-
function compose(icn::ICN; action = :composition)
136+
function compose(icn::ICN; action=:composition)
137137
return action == :symbols ? _compose(icn)[2] : _compose(icn)[1]
138138
end
139-
function compose(icn, weigths; action = :composition)
139+
function compose(icn, weigths; action=:composition)
140140
_weigths!(icn, weigths)
141-
compose(icn; action = action)
141+
compose(icn; action=action)
142142
end
143143

144144
"""
145145
show_composition(icn)
146146
Return the composition (weights) of an ICN.
147147
"""
148148
function show_composition(icn)
149-
symbs = compose(icn, action = :symbols)
149+
symbs = compose(icn, action=:symbols)
150150
aux = map(s -> _reduce_symbols(s, ", ", length(s) > 1), symbs)
151151
return _reduce_symbols(aux, "", false)
152152
end

src/learn.jl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ end
3737
)
3838
Create an ICN, optimize it, and return its composition.
3939
"""
40-
function learn_compose(X, X_sols; nvars, dom_size, param=nothing,
40+
function learn_compose(X, X_sols, dom_size, param=nothing;
4141
global_iter=10, local_iter=100, metric=hamming, popSize=200,
4242
action=:composition
4343
)
44-
icn = ICN(nvars=nvars, dom_size=dom_size, param=param)
45-
optimize!(icn, X, X_sols, global_iter, local_iter; metric=metric, popSize=200)
44+
icn = ICN(param=!isnothing(param))
45+
optimize!(icn, X, X_sols, global_iter, local_iter, dom_size, param; metric=metric, popSize=200)
4646
@info show_composition(icn)
4747

4848
return compose(icn, action=action)
@@ -52,13 +52,12 @@ function explore_learn_compose(concept; domains, param=nothing,
5252
search=:complete, global_iter=10, local_iter=100, metric=hamming, popSize=200,
5353
action=:composition,
5454
)
55+
dom_size = maximum(_length, domains)
5556
if search == :complete
5657
X_sols, X = _complete_search_space(domains, concept)
5758
union!(X, X_sols)
58-
return learn_compose(X, X_sols;
59-
nvars=length(domains), dom_size=maximum(_length, domains),
60-
local_iter=local_iter, global_iter=global_iter, param=param,
61-
action=action)
59+
return learn_compose(X, X_sols, dom_size, param;
60+
local_iter=local_iter, global_iter=global_iter, action=action)
6261
end
6362
end
6463

@@ -67,10 +66,10 @@ function _compose_to_string(symbols, name)
6766
tr_length = length(symbols[1])
6867

6968
CN = "CompositionalNetworks."
70-
tr = _reduce_symbols(symbols[1], ", "; prefix = CN * "_tr_")
71-
ar = _reduce_symbols(symbols[2], ", ", false; prefix = CN * "_ar_")
72-
ag = _reduce_symbols(symbols[3], ", ", false; prefix = CN * "_ag_")
73-
co = _reduce_symbols(symbols[4], ", ", false; prefix = CN * "_co_")
69+
tr = _reduce_symbols(symbols[1], ", "; prefix=CN * "_tr_")
70+
ar = _reduce_symbols(symbols[2], ", ", false; prefix=CN * "_ar_")
71+
ag = _reduce_symbols(symbols[3], ", ", false; prefix=CN * "_ag_")
72+
co = _reduce_symbols(symbols[4], ", ", false; prefix=CN * "_co_")
7473

7574
julia_string = """
7675
$name = x -> fill(x, $tr_length) .|> $tr |> $ar |> $ag |> $co

src/transformation.jl

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
_tr_identity(x)
44
Identity function. Already defined in Julia as `identity`, specialized for vectors and scalars.
55
"""
6-
_tr_identity(x) = identity(x)
7-
_tr_identity(i, x) = identity(i)
6+
_tr_identity(x; param=nothing) = identity(x)
7+
_tr_identity(i, x; param=nothing) = identity(i)
88

99
"""
1010
_tr_count_eq(i, x)
1111
_tr_count_eq_right(i, x)
1212
_tr_count_eq_left(i, x)
1313
Count the number of elements equal to `x[i]` (optionally to the right/left of `x[i]`). Extended method to vector `x` are generated.
1414
"""
15-
_tr_count_eq(i, x) = count(y -> x[i] == y, x) - 1
16-
_tr_count_eq_right(i, x) = _tr_count_eq(1, @view x[i:end])
17-
_tr_count_eq_left(i, x) = _tr_count_eq(i, @view x[1:i])
15+
_tr_count_eq(i, x; param=nothing) = count(y -> x[i] == y, x) - 1
16+
_tr_count_eq_right(i, x; param=nothing) = _tr_count_eq(1, @view x[i:end])
17+
_tr_count_eq_left(i, x; param=nothing) = _tr_count_eq(i, @view x[1:i])
1818

1919
# Generating vetorized versions
2020
lazy(_tr_count_eq, _tr_count_eq_left, _tr_count_eq_right)
@@ -28,12 +28,12 @@ lazy(_tr_count_eq, _tr_count_eq_left, _tr_count_eq_right)
2828
_tr_count_l_right(i, x)
2929
Count the number of elements greater/lesser than `x[i]` (optionally to the left/right of `x[i]`). Extended method to vector with sig `(x)` are generated.
3030
"""
31-
_tr_count_greater(i, x) = count(y -> x[i] < y, x)
32-
_tr_count_lesser(i, x) = count(y -> x[i] > y, x)
33-
_tr_count_g_left(i, x) = _tr_count_greater(i, @view x[1:i])
34-
_tr_count_l_left(i, x) = _tr_count_lesser(i, @view x[1:i])
35-
_tr_count_g_right(i, x) = _tr_count_greater(1, @view x[i:end])
36-
_tr_count_l_right(i, x) = _tr_count_lesser(1, @view x[i:end])
31+
_tr_count_greater(i, x; param=nothing) = count(y -> x[i] < y, x)
32+
_tr_count_lesser(i, x; param=nothing) = count(y -> x[i] > y, x)
33+
_tr_count_g_left(i, x; param=nothing) = _tr_count_greater(i, @view x[1:i])
34+
_tr_count_l_left(i, x; param=nothing) = _tr_count_lesser(i, @view x[1:i])
35+
_tr_count_g_right(i, x; param=nothing) = _tr_count_greater(1, @view x[i:end])
36+
_tr_count_l_right(i, x; param=nothing) = _tr_count_lesser(1, @view x[i:end])
3737

3838
# Generating vetorized versions
3939
lazy(_tr_count_greater, _tr_count_g_left, _tr_count_g_right)
@@ -45,9 +45,9 @@ lazy(_tr_count_lesser, _tr_count_l_left, _tr_count_l_right)
4545
_tr_count_g_param(i, x, param)
4646
Count the number of elements equal to (resp. lesser/greater than) `x[i] + param`. Extended method to vector with sig `(x, param)` are generated.
4747
"""
48-
_tr_count_eq_param(i, x, param) = count(y -> y == x[i] + param, x)
49-
_tr_count_l_param(i, x, param) = count(y -> y < x[i] + param, x)
50-
_tr_count_g_param(i, x, param) = count(y -> y > x[i] + param, x)
48+
_tr_count_eq_param(i, x; param) = count(y -> y == x[i] + param, x)
49+
_tr_count_l_param(i, x; param) = count(y -> y < x[i] + param, x)
50+
_tr_count_g_param(i, x; param) = count(y -> y > x[i] + param, x)
5151

5252
# Generating vetorized versions
5353
lazy_param(_tr_count_eq_param, _tr_count_l_param, _tr_count_g_param)
@@ -56,7 +56,7 @@ lazy_param(_tr_count_eq_param, _tr_count_l_param, _tr_count_g_param)
5656
_tr_count_bounding_param(i, x, param)
5757
Count the number of elements bounded (not strictly) by `x[i]` and `x[i] + param`. An extended method to vector with sig `(x, param)` is generated.
5858
"""
59-
_tr_count_bounding_param(i, x, param) = count(y -> x[i] y x[i] + param, x)
59+
_tr_count_bounding_param(i, x; param) = count(y -> x[i] y x[i] + param, x)
6060

6161
# Generating vetorized versions
6262
lazy_param(_tr_count_bounding_param)
@@ -66,8 +66,8 @@ lazy_param(_tr_count_bounding_param)
6666
_tr_param_minus_val(i, x, param)
6767
Return the difference `x[i] - param` (resp. `param - x[i]`) if positive, `0.0` otherwise. Extended method to vector with sig `(x, param)` are generated.
6868
"""
69-
_tr_val_minus_param(i, x, param) = max(0, x[i] - param)
70-
_tr_param_minus_val(i, x, param) = max(0, param - x[i])
69+
_tr_val_minus_param(i, x; param) = max(0, x[i] - param)
70+
_tr_param_minus_val(i, x; param) = max(0, param - x[i])
7171

7272
# Generating vetorized versions
7373
lazy_param(_tr_val_minus_param, _tr_param_minus_val)
@@ -77,9 +77,9 @@ lazy_param(_tr_val_minus_param, _tr_param_minus_val)
7777
_tr_contiguous_vals_minus_rev(i, x)
7878
Return the difference `x[i] - x[i + 1]` (resp. `x[i + 1] - x[i]`) if positive, `0.0` otherwise. Extended method to vector with sig `(x)` are generated.
7979
"""
80-
_tr_contiguous_vals_minus(i, x) = length(x) == i ? 0 : _tr_val_minus_param(i, x, x[i + 1])
81-
function _tr_contiguous_vals_minus_rev(i, x)
82-
return length(x) == i ? 0 : _tr_param_minus_val(i, x, x[i + 1])
80+
_tr_contiguous_vals_minus(i, x; param=nothing) = length(x) == i ? 0 : _tr_val_minus_param(i, x; param=x[i + 1])
81+
function _tr_contiguous_vals_minus_rev(i, x; param=nothing)
82+
return length(x) == i ? 0 : _tr_param_minus_val(i, x; param=x[i + 1])
8383
end
8484
# Generating vetorized versions
8585
lazy(_tr_contiguous_vals_minus, _tr_contiguous_vals_minus_rev)
@@ -89,8 +89,8 @@ lazy(_tr_contiguous_vals_minus, _tr_contiguous_vals_minus_rev)
8989
transformation_layer(param = nothing)
9090
Generate the layer of transformations functions of the ICN. Iff `param` value is set, also includes all the parametric transformation with that value.
9191
"""
92-
function transformation_layer(param = nothing)
93-
transformations = LittleDict{Symbol, Function}(
92+
function transformation_layer(param=false)
93+
transformations = LittleDict{Symbol,Function}(
9494
:identity => _tr_identity,
9595
:count_eq => _tr_count_eq,
9696
:count_eq_left => _tr_count_eq_left,
@@ -105,14 +105,14 @@ function transformation_layer(param = nothing)
105105
:contiguous_vals_minus_rev => _tr_contiguous_vals_minus_rev,
106106
)
107107

108-
if !isnothing(param)
109-
transformations_param = LittleDict{Symbol, Function}(
110-
:count_eq_param => ((x...) -> _tr_count_eq_param(x..., param)),
111-
:count_l_param => ((x...) -> _tr_count_l_param(x..., param)),
112-
:count_g_param => ((x...) -> _tr_count_g_param(x..., param)),
113-
:count_bounding_param => ((x...) -> _tr_count_bounding_param(x..., param)),
114-
:val_minus_param => ((x...) -> _tr_val_minus_param(x..., param)),
115-
:param_minus_val => ((x...) -> _tr_param_minus_val(x..., param)),
108+
if param
109+
transformations_param = LittleDict{Symbol,Function}(
110+
:count_eq_param => _tr_count_eq_param,
111+
:count_l_param => _tr_count_l_param,
112+
:count_g_param => _tr_count_g_param,
113+
:count_bounding_param => _tr_count_bounding_param,
114+
:val_minus_param => _tr_val_minus_param,
115+
:param_minus_val => _tr_param_minus_val,
116116
)
117117
transformations = LittleDict(union(transformations, transformations_param))
118118
end

0 commit comments

Comments
 (0)