- Timestamp:
- 07/18/13 23:52:25 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
java/main/src/main/java/com/framsticks/test/PrimeExperiment.java
r102 r103 1 1 package com.framsticks.test; 2 3 import java.util.Iterator; 4 import java.util.LinkedList; 5 import java.util.List; 2 6 3 7 import org.apache.logging.log4j.Logger; 4 8 import org.apache.logging.log4j.LogManager; 5 9 10 import com.framsticks.core.ValueChange; 6 11 import com.framsticks.experiment.Experiment; 7 12 import com.framsticks.experiment.WorkPackageLogic; 13 import com.framsticks.params.EventListener; 14 import com.framsticks.params.EventListeners; 8 15 import com.framsticks.params.annotations.FramsClassAnnotation; 9 16 import com.framsticks.params.annotations.ParamAnnotation; 17 import com.framsticks.test.prime.ExpParams; 10 18 import com.framsticks.test.prime.PrimePackage; 19 import com.framsticks.util.FramsticksException; 11 20 import com.framsticks.util.dispatching.Future; 12 21 … … 18 27 public final WorkPackageLogic<PrimePackage> workPackageLogic; 19 28 20 protected int maxNumber = 3000; 29 final PrimePackage task = new PrimePackage(); 30 21 31 protected int step = 100; 22 protected int numberCounter = 1; 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<>(); 23 38 24 39 /** … … 28 43 setExpdef("prime"); 29 44 30 workPackageLogic = new WorkPackageLogic<PrimePackage>(this) { 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) { 31 50 32 51 @Override 33 52 protected void generateNextPackage(Future<PrimePackage> future) { 34 53 assert isActive(); 35 PrimePackage wp = new PrimePackage(); 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 } 36 59 37 log.debug("generated package: {}", wp); 38 wp.params.from_number = numberCounter; 39 numberCounter += step; 40 wp.params.to_number = numberCounter - 1; 41 wp.state.current_number = wp.params.from_number; 42 wp.state.getResultList().clear(); 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()); 43 65 44 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); 45 88 } 46 89 }; 47 90 } 48 91 49 protected void processFile() { 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); 50 154 } 51 155
Note: See TracChangeset
for help on using the changeset viewer.