source: java/main/src/main/java/com/framsticks/test/PrimeExperiment.java @ 107

Last change on this file since 107 was 107, checked in by psniegowski, 11 years ago

HIGHLIGHTS:

  • add SimultorProviders? hierarchy
  • start Framsticks server over SSH
  • FJF compatible with Framsticks 4.0rc3
  • reading and writing of standard.expt
  • a proof-of-concept implementation of StandardExperiment?

CHANGELOG:
Optionally return FreeAccess? from registry.

Add SimulatorRange?.

StandardExperiment? with genotypes circulation.

Automate registration around StandardState?.

More improvements to StandardExperiment?.

Skeleton version of StandardExperiment?.

Test saving of StandardState?.

Standard experiment state is being loaded.

More development towards StandardState? reading.

Work on reading standard experiment state.

Add classes for standard experiment.

Update example standard.expt

Add FreeAccess? and FreeObject?.

Made compatible with version 4.0rc3

Change deserialization policy.

Improve SSH support.

Working running simulator over SSH.

Fix joining bug in Experiment.

Working version of SimulatorRunner?.

Add more SimulatorProviders?.

Working PrimeExperimentTest? with 4.0rc3

Add references to deserialization.

Add OpaqueObject? and it's serialization.

Add deserialization of dictionaries.

Partial implementation of deserialization.

Add more tests for deserialization.

Prepare tests for deserialization.

Add proper result to prime experiment test.

Minor fixes to simulators providers.

Draft version of SimulatorProvider?.

Add SimulatorProvider? interface.

File size: 4.5 KB
Line 
1package com.framsticks.test;
2
3import java.util.Iterator;
4import java.util.LinkedList;
5import java.util.List;
6
7import org.apache.logging.log4j.Logger;
8import org.apache.logging.log4j.LogManager;
9
10import com.framsticks.experiment.Experiment;
11import com.framsticks.experiment.WorkPackageLogic;
12import com.framsticks.params.EventListener;
13import com.framsticks.params.EventListeners;
14import com.framsticks.params.annotations.FramsClassAnnotation;
15import com.framsticks.params.annotations.ParamAnnotation;
16import com.framsticks.params.types.ProcedureParam;
17import com.framsticks.structure.messages.ValueChange;
18import com.framsticks.test.prime.ExpParams;
19import com.framsticks.test.prime.PrimePackage;
20import com.framsticks.util.FramsticksException;
21import com.framsticks.util.dispatching.FutureHandler;
22
23@FramsClassAnnotation
24public class PrimeExperiment extends Experiment {
25        private static final Logger log = LogManager.getLogger(PrimeExperiment.class);
26
27        @ParamAnnotation
28        public final WorkPackageLogic<PrimePackage> workPackageLogic;
29
30        final PrimePackage task = new PrimePackage();
31
32        protected int step = 500;
33
34        protected int nextWaitNumber = 1;
35        protected List<PrimePackage> waitingPackages = new LinkedList<>();
36        // protected List<Integer> primes = new LinkedList<>();
37
38        protected final EventListeners<ValueChange> primesListeners = new EventListeners<>();
39
40        /**
41         *
42         */
43        public PrimeExperiment() {
44                setExpdef("prime");
45
46                // task.params.from_number = 1;
47                task.params.to_number = 10000;
48                task.state.current_number = 1;
49
50                workPackageLogic = new WorkPackageLogic<PrimePackage>(this, PrimePackage.class) {
51
52                        @Override
53                        protected void generateNextPackage(FutureHandler<PrimePackage> future) {
54                                assert isActive();
55                                if (task.state.current_number > task.params.to_number) {
56                                        log.debug("no more packages in range left");
57                                        future.pass(null);
58                                        return;
59                                }
60
61                                PrimePackage wp = PrimePackage.compose(task.state.current_number, Math.min(task.params.to_number, task.state.current_number + step - 1));
62
63                                task.state.current_number += step;
64
65                                log.debug("generated package: {}", wp.getShortDescription());
66
67                                future.pass(wp);
68                        }
69
70                        @Override
71                        protected void returnPackage(PrimePackage result) {
72                                log.debug("returned package: {}", result);
73
74                                if (tryAddResult(result)) {
75                                        while (tryMergeWaitingPackages()) {
76                                        }
77                                } else if (result.params.from_number > nextWaitNumber) {
78                                        waitingPackages.add(result);
79                                }
80
81                                try {
82                                        isComplete();
83                                } catch (FramsticksException e) {
84                                        log.debug("experiment is not done yet: {}", e.getShortMessage(new StringBuilder()));
85                                        return;
86                                }
87                                log.info("experiment is done, {} primes found", getPrimes().size());
88                                log.debug("primes: {}", getPrimes());
89                                interruptJoinable();
90                        }
91                };
92        }
93
94        public List<Integer> getPrimes() {
95                return task.state.getResultList();
96        }
97
98        protected boolean tryAddResult(PrimePackage result) {
99                if (result.params.from_number > nextWaitNumber) {
100                        return false;
101                }
102                if (result.params.from_number < nextWaitNumber) {
103                        throw new FramsticksException().msg("duplicate result").arg("result", result);
104                }
105
106                getPrimes().addAll(result.state.getResultList());
107                nextWaitNumber = result.params.to_number + 1;
108
109                primesListeners.actionForAll(new ValueChange(getDescription()));
110
111                return true;
112        }
113
114        protected boolean tryMergeWaitingPackages() {
115                Iterator<PrimePackage> i = waitingPackages.iterator();
116                while (i.hasNext()) {
117                        if (tryAddResult(i.next())) {
118                                i.remove();
119                                return true;
120                        }
121                }
122                return false;
123        }
124
125        protected void isComplete() {
126                if (nextWaitNumber - 1 != task.params.to_number) {
127                        throw new FramsticksException().msg("not ready yet").arg("done to", nextWaitNumber - 1);
128                }
129        }
130
131        /**
132         * @return the maxNumber
133         */
134        @ParamAnnotation
135        public int getMaxNumber() {
136                return task.params.to_number;
137        }
138
139        /**
140         * @param maxNumber the maxNumber to set
141         */
142        @ParamAnnotation
143        public void setMaxNumber(int maxNumber) {
144                task.params.to_number = maxNumber;
145        }
146
147        @ParamAnnotation
148        public String getDescription() {
149                return getPrimes().size() + " found in range " + new ExpParams(task.params.from_number, nextWaitNumber - 1);
150        }
151
152        @ParamAnnotation(id = "description_changed")
153        public void addPrimesListener(EventListener<ValueChange> listener) {
154                primesListeners.add(listener);
155        }
156
157        @ParamAnnotation(id = "description_changed")
158        public void removePrimesListener(EventListener<ValueChange> listener) {
159                primesListeners.remove(listener);
160        }
161
162        @ParamAnnotation(paramType = ProcedureParam.class)
163        public PrimePackage experimentNetsave() {
164                return task;
165        }
166
167}
Note: See TracBrowser for help on using the repository browser.