source: java/main/src/main/java/com/framsticks/test/PrimeExperiment.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.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.