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

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

HIGHLIGHTS:

  • import refactorization: move Tree, Path, etc.

from core to structure package

  • initial serialization implementation
  • improve PrimeExperiment? test
  • many organizational changes and convenience improvements

CHANGELOG:
Make registry in AbstractTree? final.

Move most classes from core to structure package.

Minor changes.

Switch names of Future and FutureHandler?.

Rename ExceptionResultHandler? to ExceptionHandler?.

Rename ExceptionHandler? to ExceptionDispatcherHandler?.

Fix bug in ParamCandidate? cache.

Add missing synchronization to the BufferedDispatcher?.

Develop @Serialized support.

Rework serialization further.

Add serialization/deserialization interface to ValueParam?.

Move getStorageType and isNumeric from Param down to params hierarchy.

Minor changes.

Improve param type induction.

Add TestSerializedClass? for testing new serialization.

Add info files gor GenePool? and Population.

Add standard.expt exemplary netfile.

Add type name field to PropertiesObject?.

Use PropertiesObject? for PropertiesAccess? instead of ordinary map.

Hide getFramsClass is several more places.

More unification accross FramsClass?, Access and Path.

Add ParamCollection?.

Simplify interface for getting params from FramsClass?, Access
or Path.

Make Access.call() interface variadic.

Add arguments(args) convenience wrapper around new Object[] {args}.

Upgrade to apache.commons.lang version 3.1

Minor improvement with Response constructors.

Develop proper result printing in ClientAtServer?.

Add experimentNetsave to PrimeExperiment?.

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 = 100;
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 = 1000;
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                        }
90                };
91        }
92
93        public List<Integer> getPrimes() {
94                return task.state.getResultList();
95        }
96
97        protected boolean tryAddResult(PrimePackage result) {
98                if (result.params.from_number > nextWaitNumber) {
99                        return false;
100                }
101                if (result.params.from_number < nextWaitNumber) {
102                        throw new FramsticksException().msg("duplicate result").arg("result", result);
103                }
104
105                getPrimes().addAll(result.state.getResultList());
106                nextWaitNumber = result.params.to_number + 1;
107
108                primesListeners.actionForAll(new ValueChange(getDescription()));
109
110                return true;
111        }
112
113        protected boolean tryMergeWaitingPackages() {
114                Iterator<PrimePackage> i = waitingPackages.iterator();
115                while (i.hasNext()) {
116                        if (tryAddResult(i.next())) {
117                                i.remove();
118                                return true;
119                        }
120                }
121                return false;
122        }
123
124        protected void isComplete() {
125                if (nextWaitNumber - 1 != task.params.to_number) {
126                        throw new FramsticksException().msg("not ready yet").arg("done to", nextWaitNumber - 1);
127                }
128        }
129
130        /**
131         * @return the maxNumber
132         */
133        @ParamAnnotation
134        public int getMaxNumber() {
135                return task.params.to_number;
136        }
137
138        /**
139         * @param maxNumber the maxNumber to set
140         */
141        @ParamAnnotation
142        public void setMaxNumber(int maxNumber) {
143                task.params.to_number = maxNumber;
144        }
145
146        @ParamAnnotation
147        public String getDescription() {
148                return getPrimes().size() + " found in range " + new ExpParams(task.params.from_number, nextWaitNumber - 1);
149        }
150
151        @ParamAnnotation(id = "description_changed")
152        public void addPrimesListener(EventListener<ValueChange> listener) {
153                primesListeners.add(listener);
154        }
155
156        @ParamAnnotation(id = "description_changed")
157        public void removePrimesListener(EventListener<ValueChange> listener) {
158                primesListeners.remove(listener);
159        }
160
161        @ParamAnnotation(paramType = ProcedureParam.class)
162        public PrimePackage experimentNetsave() {
163                return task;
164        }
165
166}
Note: See TracBrowser for help on using the repository browser.