blob: e9e62ef6ad2049989c8587528cd1268e1f9bdbc7 [file] [log] [blame]
/*------------------------------------------------------------------------------
-
- Copyright (c) 2015-2016 University of Padova, ITALY - Intecs SpA
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v2.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v20.html
-
- Contributors:
-
- Alessandro Zovi azovi@math.unipd.it
- Stefano Puri stefano.puri@intecs.it
- Laura Baracchi laura.baracchi@intecs.it
- Nicholas Pacini nicholas.pacini@intecs.it
-
- Initial API and implementation and/or initial documentation
------------------------------------------------------------------------------*/package org.polarsys.chess.multicore.partitioning;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* The Class RUNReduction.
*/
public class RUNReduction implements BinPacker {
/** The level. */
//private final boolean DECREASING_ORDERING = true;
int level = -1;
/* (non-Javadoc)
* @see org.polarsys.chess.multicore.partitioning.BinPacker#pack(java.util.List, java.util.List)
*/
@Override
public Map<Bin, List<Task>> pack(List<Bin> bins, List<Task> tasks) {
level++;
Map<Bin, List<Task>> toReturn = new Hashtable<Bin, List<Task>> ();
if(tasks.size()==1){
//toReturn.put(new Bin(new Integer(tasks.get(0).getId())), tasks);
Bin theBin = new Bin(0);
theBin.setLevel(level);
toReturn.put(theBin, tasks);
return toReturn;
}
for(Task task : tasks)
task.switchToDual();
// Object[] allTasks = tasks.toArray();
// for(int taskIndex = 0; taskIndex < allTasks.length; taskIndex++)
// ((Task)allTasks[taskIndex]).switchToDual();
Map<Bin, List<Task>> result =
BinPackerFactory.getBinPacker(org.polarsys.chess.multicore.partitioning.Heuristic.WORST_FIT).pack(new ArrayList<Bin>(), tasks);
Set<Bin> keys = result.keySet();
ArrayList<Task> supertasks = new ArrayList<Task>();
for(Bin bin : keys){
bin.setLevel(level);
toReturn.put(bin, result.get(bin));
supertasks.add(new Task(bin.getId().toString(), bin.getCapacity()));
}
toReturn.putAll(pack(null, supertasks));// recursive call on the level above
return toReturn;
//return toReturn;
}
}