| 309 | } |
| 310 | |
| 311 | @Override |
| 312 | public void train(RegressionDataSet dataSet, ExecutorService threadPool) |
| 313 | { |
| 314 | try |
| 315 | { |
| 316 | |
| 317 | int workSize = iterations/SystemInfo.LogicalCores; |
| 318 | int leftOver = iterations%SystemInfo.LogicalCores; |
| 319 | |
| 320 | List<Future<RANSACWorker>> futures = new ArrayList<Future<RANSACWorker>>(SystemInfo.LogicalCores+1); |
| 321 | if(leftOver != 0) |
| 322 | futures.add(threadPool.submit(new RANSACWorker(baseRegressor, leftOver, dataSet))); |
| 323 | for(int i = 0; i < SystemInfo.LogicalCores; i++) |
| 324 | futures.add(threadPool.submit(new RANSACWorker(baseRegressor, workSize, dataSet))); |
| 325 | |
| 326 | PriorityQueue<RANSACWorker> results = new PriorityQueue<RANSACWorker>(SystemInfo.LogicalCores+1); |
| 327 | |
| 328 | for( Future<RANSACWorker> futureWorker : futures ) |
| 329 | results.add(futureWorker.get()); |
| 330 | |
| 331 | RANSACWorker bestResult = results.peek(); |
| 332 | |
| 333 | modelError = bestResult.bestError; |
| 334 | if(Double.isInfinite(modelError)) |
| 335 | throw new FailedToFitException("Model could not be fit, inlier set never reach minimum size"); |
| 336 | baseRegressor = bestResult.bestModel; |
| 337 | consensusSet = bestResult.bestConsensusSet; |
| 338 | |
| 339 | |
| 340 | } |
| 341 | catch (InterruptedException ex) |
| 342 | { |
| 343 | Logger.getLogger(RANSAC.class.getName()).log(Level.SEVERE, null, ex); |
| 344 | throw new FailedToFitException(ex); |
| 345 | } |
| 346 | catch (ExecutionException ex) |
| 347 | { |
| 348 | Logger.getLogger(RANSAC.class.getName()).log(Level.SEVERE, null, ex); |
| 349 | throw new FailedToFitException(ex); |
| 350 | } |
| 351 | |
| 352 | } |
| 353 | |
| 354 | @Override |
| 355 | public void train(RegressionDataSet dataSet) |