source: java/main/src/main/java/com/framsticks/standard/StandardExperiment.java @ 193

Last change on this file since 193 was 193, checked in by Maciej Komosinski, 10 years ago

Set svn:eol-style native for all textual files

  • Property svn:eol-style set to native
File size: 4.0 KB
Line 
1package com.framsticks.standard;
2
3import java.util.LinkedList;
4import java.util.List;
5import java.util.Random;
6import java.util.TimerTask;
7
8import com.framsticks.experiment.Experiment;
9import com.framsticks.experiment.Simulator;
10import com.framsticks.model.Genotype;
11import com.framsticks.params.Access;
12import com.framsticks.params.EventListener;
13import com.framsticks.params.Registry;
14import com.framsticks.params.annotations.FramsClassAnnotation;
15import com.framsticks.structure.messages.ListChange;
16import com.framsticks.util.dispatching.Dispatching;
17import com.framsticks.util.dispatching.Future;
18
19import org.apache.logging.log4j.Logger;
20import org.apache.logging.log4j.LogManager;
21
22@FramsClassAnnotation
23public class StandardExperiment extends Experiment {
24
25        private static final Logger log = LogManager.getLogger(StandardExperiment.class);
26
27        protected final Registry registry = new Registry();
28
29        protected List<Genotype> genotypes = new LinkedList<>();
30        protected Random random = new Random();
31
32        // @ParamAnnotation
33        // protected final NetLoadSaveLogic<StandardState> netLoadSaveLogic;
34
35        /**
36         *
37         */
38        public StandardExperiment() {
39
40                setExpdef("standard");
41                registry.registerAndBuild(StandardState.class);
42
43                addSimulatorsListener(new EventListener<ListChange>() {
44                        @Override
45                        public void action(final ListChange change) {
46                                assert isActive();
47                                final Simulator simulator = getSimulators().get(change.getIdentifier());
48                                if (change.getAction().equals(ListChange.Action.Add)) {
49                                        simulator.init();
50                                        return;
51                                }
52                                if (change.getAction().equals(ListChange.Action.Modify)) {
53                                        if (change.hasHint("ready")) {
54                                                log.debug("issuing netsave");
55
56                                                simulator.netsave(StandardState.class, new Future<StandardState>(StandardExperiment.this) {
57                                                        @Override
58                                                        protected void result(StandardState result) {
59                                                                assert isActive();
60                                                                assert result != null;
61                                                                processState(simulator, result);
62
63                                                                simulator.netload(result, new Future<Object>(StandardExperiment.this) {
64
65                                                                        @Override
66                                                                        protected void result(Object result) {
67                                                                                runSimulatorFor(simulator);
68                                                                        }
69                                                                });
70                                                        }
71                                                });
72                                        }
73
74                                        return;
75                                }
76
77                        }
78                });
79
80
81                // netLoadSaveLogic = new NetLoadSaveLogic<StandardState>(this, StandardState.class) {
82                //      @Override
83                //      public void netload(Simulator simulator, FutureHandler<StandardState> net) {
84                //              assert isActive();
85                //              // Dispatching.sleep(0.1);
86                //              net.pass(null);
87                //              // simulator.start();
88                //      }
89
90                //      @Override
91                //      public void netsave(Simulator simulator, StandardState net) {
92                //              assert isActive();
93                //              log.debug("saved state: {}", net);
94                //              runSimulatorFor(simulator);
95                //      }
96                // };
97
98        }
99
100        protected void processState(Simulator simulator, StandardState state) {
101                Access genePoolAccess = registry.bindAccessFor(state.genepools.get(0));
102                Access genotypesAccess = registry.bindAccessFor(genePoolAccess, "genotypes");
103                int count = genotypesAccess.getParamCount();
104                int toRemove = count / 10;
105
106                log.debug("processing state {} for simulator {} with {} genotypes", state, simulator, count);
107
108                List<Genotype> removed = new LinkedList<>();
109                for (int c = 0; c < toRemove; ++c) {
110                        int number = random.nextInt(genotypesAccess.getParamCount());
111                        Genotype genotype = genotypesAccess.get(number, Genotype.class);
112                        genotypesAccess.set(number, null);
113                        log.debug("removing {} from {}", genotype, simulator);
114                        removed.add(genotype);
115                }
116
117                int toAdd = toRemove;
118                if (toAdd > genotypes.size()) {
119                        toAdd = genotypes.size();
120                }
121                if (genotypes.size() > 100) {
122                        toAdd = genotypes.size() - 100;
123                }
124
125                for (int a = 0; (a < toAdd) && (!genotypes.isEmpty()); ++a) {
126                        Genotype genotype = genotypes.remove(0);
127                        log.debug("adding {} to {}", genotype, simulator);
128                        genotype.uid = null;
129                        genotypesAccess.set((String) null, genotype);
130                }
131                log.debug("state processed");
132                genotypes.addAll(removed);
133        }
134
135        protected void runSimulatorFor(final Simulator simulator) {
136                simulator.start();
137                Dispatching.getTimer().schedule(new TimerTask() {
138
139                        @Override
140                        public void run() {
141                                simulator.stop();
142                        }
143                }, 2000);
144        }
145}
Note: See TracBrowser for help on using the repository browser.