Untitled

 avatar
unknown
java
a year ago
6.0 kB
3
Indexable
package compress;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import dsl.*;
import ecg.Data;

public class Compress {

	public static final int BLOCK_SIZE = 10;

	public static Query<Integer, Integer> delta() {
		return new Query<Integer, Integer>() {
			private int previous;
			private int count;
			@Override
			public void start(Sink<Integer> sink) {
				this.previous = 0;
				this.count = 0;
			}

			@Override
			public void next(Integer item, Sink<Integer> sink) {
				count++;
				sink.next(item - previous);
				if(count%BLOCK_SIZE != 0)
					previous = item;
				else
					previous = 0;
			}

			@Override
			public void end(Sink<Integer> sink) {
				sink.end();
			}
		};
	}
	public static Query<Integer,Integer> deltaInv() {
		// TODO
		return new Query<>() {
			private int lastValue;
			private int count;
			@Override
			public void start(Sink<Integer> sink) {
				this.lastValue = 0;
				this.count = 0;
			}

			@Override
			public void next(Integer delta, Sink<Integer> sink) {
				//System.out.println(delta);
				count++;
				if(count%BLOCK_SIZE != 1)
					lastValue += delta;
				else
					lastValue = delta;
				System.out.println(lastValue);
				sink.next(lastValue);
			}

			@Override
			public void end(Sink<Integer> sink) {
				sink.end();
			}
		};
	}

	public static Query<Integer,Integer> zigzag() {
		// TODO
		return new Map<>(x -> (x << 1) ^ (x >> 31));
	}

	public static Query<Integer,Integer> zigzagInv() {
		// TODO
		return new Map<>(x -> (x >> 1) ^ -(x & 1));
	}

	public static Query<Integer,Integer> pack() {
		// TODO
		return new Query<>() {
			private int value;
			private int remainBits;
			private int needBits;
			private int header;
			private int count;
			List<Integer> list = new ArrayList<>();
			@Override
			public void start(Sink<Integer> sink) {
				this.value = 0;
				this.remainBits = 0;
				this.header = 0;
				this.count = 0;
			}

			@Override
			public void next(Integer item, Sink<Integer> sink) {
				count++;
				if (count%BLOCK_SIZE == 1) {
					list.add(item);
					//sink.next(item);
				}
				else {
					needBits = Integer.SIZE - Integer.numberOfLeadingZeros(item);
					if (remainBits < needBits || (header != 0 && needBits > header)) {
						if (value != 0) {
							//System.out.println(value);
							list.add(value);
							//sink.next(value);
						}
						value = needBits << 5;
						header = needBits;
						remainBits = 5 - header;
						value |= (item << (remainBits));
					} else {
						remainBits -= header;
						value |= (item << remainBits);
					}
				}
				if (count % BLOCK_SIZE == 0) {
					flush(sink);
				}
			}

			@Override
			public void end(Sink<Integer> sink) {
				sink.end();
			}

			private void flush(Sink<Integer> sink) {
				if (value != 0) {
					list.add(value);
					value = 0;
					remainBits = 0;
				}
				for (Integer val : list) {
					sink.next(val);
				}
				list.clear();
				count = 0;
				header = 0;
			}
		};
	}

	public static Query<Integer,Integer> unpack() {
		// TODO
		return new Query<Integer, Integer>() {
			private int header;
			private int value;
			private int count;
			List<Integer> list = new ArrayList<>();
			@Override
			public void start(Sink<Integer> sink) {
				this.count = 0;
				this.value = 0;
				this.header = 0;
			}

			@Override
			public void next(Integer item, Sink<Integer> sink) {
				//System.out.println("Unpack");
				if (list.size() == 0) {
					list.add(item);
					//System.out.println(item);
					count++;
				}
				else {
					header = item >> 5;
					value = item & ((1 << 6) - 1); // Mask to extract only the value part
					int totalBits = Integer.SIZE - Integer.numberOfLeadingZeros(value);
					while (value != 0) {
						// Extract leftmost x bits
						totalBits = Integer.SIZE - Integer.numberOfLeadingZeros(value);
						int leftXBits = value >> (totalBits - header);
						//System.out.println(leftXBits);
						// Print the leftmost x bits in binary form
						//System.out.println(leftXBits);
						list.add(leftXBits);
						//count++;
						// Update value by zeroing out the leftmost x bits
						value = value & (1 << (totalBits - header) - 1);
					}
				}
				if (list.size() == BLOCK_SIZE) {
					for (Integer ele : list) {
						sink.next(ele);
					}
					list.clear();
					value = 0;
					header = 0;
				}
			}

			@Override
			public void end(Sink<Integer> sink) {
				sink.end();
			}
		};

	}

	public static Query<Integer,Integer> compress() {
		// TODO
		return Q.pipeline(
				delta(),
				zigzag(),
				pack());
	}

	public static Query<Integer,Integer> decompress() {
		// TODO
		return Q.pipeline(
				unpack(),
				zigzagInv(),
				deltaInv());
	}

	public static void main(String[] args) {
		System.out.println("**********************************************");
		System.out.println("***** ToyDSL & Compression/Decompression *****");
		System.out.println("**********************************************");
		System.out.println();

		System.out.println("***** Compress *****");{
			// from range [0,2048) to [0,256)
			Query<Integer,Integer> q1 = Q.map(x -> x / 8);
			Query<Integer,Integer> q2 = compress();
			Query<Integer,Integer> q = Q.pipeline(q1, q2);
			Iterator<Integer> it = Data.ecgStream("BLOCK_SIZE0-all.csv");
			Q.execute(it, q, S.lastCount());
		}
		System.out.println();

		System.out.println("***** Compress & Decompress *****");{
			// from range [0,2048) to [0,256)
			Query<Integer,Integer> q1 = Q.map(x -> x / 8);
			Query<Integer,Integer> q2 = compress();
			Query<Integer,Integer> q3 = decompress();
			Query<Integer,Integer> q = Q.pipeline(q1, q2, q3);
			Iterator<Integer> it = Data.ecgStream("BLOCK_SIZE0-all.csv");
			Q.execute(it, q, S.lastCount());
		}
		System.out.println();
	}

}
Editor is loading...
Leave a Comment