view src/alice/test/codesegment/local/bitonicsort/EvenPhase.java @ 165:4fd7d0caf7e3 working

add no recursive type quick sort
author sugi
date Thu, 13 Dec 2012 17:26:05 +0900
parents 9c28131e814f
children a3f7f25f884b
line wrap: on
line source

package alice.test.codesegment.local.bitonicsort;

import alice.codesegment.CodeSegment;
import alice.datasegment.CommandType;
import alice.datasegment.Receiver;

public class EvenPhase extends CodeSegment{
	private Receiver info0 = ids.create(CommandType.PEEK); // range
	private Receiver info1; 							   // Array1
	private Receiver info2; 							   // Array2
	private Receiver info3 = ids.create(CommandType.PEEK); // block_num
	private Receiver info4 = ids.create(CommandType.PEEK); // last_block_num
	private Receiver info5 = ids.create(CommandType.PEEK); // sort_count
	private Receiver info6 = ids.create(CommandType.TAKE); // count
	
	public EvenPhase(String key0 ,String key1 ,int index,String key6){
		info0.setKey(key0);
		info1 = ids.create(CommandType.TAKE);
		info1.setKey("local",key1,index);
		info3.setKey("block_num");
		info4.setKey("last_block_num");
		info5.setKey("sort_count");
		info6.setKey(key6);
	}
	
	public EvenPhase(String key0,String key1,String key2,int index,String key6){
		info0.setKey(key0);
		info1 = ids.create(CommandType.TAKE);
		info1.setKey("local",key1,index);
		info2 = ids.create(CommandType.TAKE);
		info2.setKey("local",key2,index);
		info3.setKey("block_num");
		info4.setKey("last_block_num");
		info5.setKey("sort_count");
		info6.setKey(key6);
	}
	
	@Override
	public void run() {
		RangeInfo info = info0.asClass(RangeInfo.class);
		int sort_count = info5.asInteger();
		int count = info6.asInteger();
		
		if (info2==null){
			DataList list = info1.asClass(DataList.class);
			if (count > sort_count){
				ods.update("local", "array"+info.range, list);
				return;
			}
			ods.put("local", info.range+"f", "dummy");
			ods.put("local", info.range+"b", list);
			//System.out.println("next Odd "+info.range+" "+info.range+"b"+" "+(info.range+1)+"f");
			new OddPhase(info0.key,info.range+"b",(info.range+1)+"f",count,info6.key);
		} else {
			DataList list1 = info1.asClass(DataList.class);
			DataList list2 = info2.asClass(DataList.class);

			DataList list3 = new DataList();
			list3.table.addAll(list1.table);
			list3.table.addAll(list2.table);
			
			if (count > sort_count){
				ods.update("local", "array"+info.range, list3);
				return;
			}
			int block_num = info3.asInteger();
			long t1 = System.currentTimeMillis();
			Sort.quickSort(list3.table, 0, list3.table.size()-1);
			System.out.println(list2.table.size()+" : "+(System.currentTimeMillis()- t1));
			if (!info.lastFlag){
				ods.put("local", info.range+"f",
						list3.createDataList(0, block_num/2));
				ods.put("local", info.range+"b",
						list3.createDataList(block_num/2, block_num/2));
				//System.out.println("next Odd "+info.range+" "+ info.range+"b"+" "+(info.range+1)+"f");
				new OddPhase(info0.key,info.range+"b",(info.range+1)+"f",count,info6.key);
			} else {
				int last_block_num = info4.asInteger();
				ods.put("local", info.range+"f", 
						list3.createDataList(0, block_num/2));
				ods.put("local", info.range+"b", 
						list3.createDataList(block_num/2, last_block_num));
				//System.out.println("next Odd "+info.range+" "+ info.range+"b");
				new OddPhase(info0.key ,info.range+"b",count,info6.key);
			}

		}
		ods.update("local", info6.key, count+1);
	}
}