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

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

HIGHLIGHTS:

  • add auto loading and saving algorithms between

frams files format and Java classes

  • respect ValueChange? events in GUI (do not reload object)
  • support results of procedures in Java server
  • make Experiment automatically convert between frams file and NetFile? object
  • add MessageLogger? (compatible with original frams server messages)
  • WorkPackageLogic? now validates results, is able to discard them, reschedule

whole package, or only uncomputed remainder

CHANGELOG:
Show just a short description in PrimeExperiment?.

Add primes_changed event to the PrimeExperiment?.

Make WorkPackageLogic? robust to frams server returning invalid results.

Add MessageLogger? to logics.

Add NetFile? interface. Support Messages from server.

Minor changes to connections.

Merge results in the PrimeExperiment?.

More netload class->file conversion to Simulator.

Move netsave parsing to Simulator.

Fix bug with inverted ordering of events firing in Experiment.

Minor changes.

Minor logging changes.

Use AccessOperations?.convert in NetLoadSaveLogic?

NetLoadSaveLogic? now encloses the conversion.

Use more generic AccessOperations? saveAll and loadAll in PrimePackage?.

Add Result class for enclosing of call invocations' results.

Improve feature request handling in Connections.

Use AccessOperations?.convert in RemoteTree? events parsing.

Minor change.

Add some information params to Java server root and CLI objects.

A draft implementation of loadAll algorithm.

That algorithm tries to load objects into a tree structure.

Add AccessOperationsTest? test.

Develop WorkPackageLogic?.

  • add state tracking fields
  • add work package generation

Add utility class SimplePrimitive?.

Meant for Java backend classes, enclose a single primitive value
and set of listeners.

Improve primitive value refresh in GUI.

When ValueChange? found in called event, do not reload whole
object, but only update GUI (no communication is performed).

Use ValueChange? in the TestClass? test.

Minor changes.

Sending all packages in PrimeExperiment? to the frams servers.

Develop AccessOperations?.loadComposites().

Remove addAccess from MultiParamLoader? interface.

There is now no default AccessProvider? in MultiParamLoader?.
User must explicitely set AccessStash? or Registry.

Improve saving algorithms in AccessOperations?.

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