view src/main/java/alice/test/codesegment/local/bitonicsort/SortPhase.java @ 547:e91a574b69de dispose

remove index
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Tue, 18 Aug 2015 16:15:17 +0900
parents 15eeb439830c
children
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 SortPhase extends CodeSegment{
    private Receiver info0 = ids.create(CommandType.PEEK); // range
    private Receiver info1 = ids.create(CommandType.TAKE); // Array1
    private Receiver info2 = ids.create(CommandType.TAKE); // Array2
    private Receiver info3 = ids.create(CommandType.PEEK); // sort_count
    private Receiver info4 = ids.create(CommandType.TAKE); // count


    public SortPhase(String key0, String key1, String key2, int index, String key4){
        info0.setKey(key0, this);
        info1.setKey(key1,this);
        info2.setKey(key2,this);
        info3.setKey("sort_count", this);
        info4.setKey(key4, this);
    }

    @Override
    public void run() {
        RangeInfo info = info0.asClass(RangeInfo.class);
        DataList list1 = info1.asClass(DataList.class);
        DataList list2 = info2.asClass(DataList.class);
        int sort_count = info3.asInteger();
        int count = info4.asInteger();

        int i = info.range;
        //System.out.println("CS"+i+" "+info1.key+" "+info2.key+" dataIndex "+info1.index +" count "+count);
        Sort.quickSort(list1);
        Sort.quickSort(list2);
        DataList.merge(list1,list2);

        if (count%2==0&&i==0){
            ods.flip(info1); // first block index is less than others. So put data twice.
        } else if (count%2==0&&info.lastFlag){
            ods.flip(info2); // Same reason
        }

        ods.flip(info1);
        ods.flip(info2);

        if (count%2==0&&info.lastFlag&&count+2<sort_count/2){
            new SortPhase(info0.key, info1.key, info2.key,count+2,info4.key);
            ods.update(info4.key, count+2);
        } else {
            String f = (count%2==1) ? SetInfo.array[2*i] : SetInfo.array[2*i+1];
            String b = (count%2==1) ? SetInfo.array[2*i+1] : SetInfo.array[2*i+2];

            new SortPhase(info0.key, f, b, count+1, info4.key);
            ods.update(info4.key, count+1);
        }


    }

}