summaryrefslogtreecommitdiff
path: root/src/genome/genome.js
blob: 8e0c9f08536dfd322ba1658dd3b4f4e6cf3e7d3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
'use strict';


export const mutation_type = Object.freeze({
  none: 'none',
  source: 'source',
  sink: 'sink',
  weight: 'weight',
});


function positive(x) {
  if (x < 0) { 
    return 0; 
  } else {
    return x;
  }
}


export function mutate(gene, type, value) {
  const [ source, sink, weight ] = gene;

  switch(type) {
    case mutation_type.none:
      return [...gene];

    case mutation_type.source:
      if (value <= 0.5) {
        return [ positive(source-1), sink, weight ];
      } else {
        return [ source+1, sink, weight ];
      }

    case mutation_type.sink:
      if (value <= 0.5) {
        return [ source, positive(sink-1), weight ];
      } else {
        return [ source, sink+1, weight ];
      }

    case mutation_type.weight:
      const w = (8*value) - 4;
      return [ source, sink, w ];

    default:
      throw new Error(`unknown mutation type: '${type}'`);
  };
}