/**
 * 
 */
package is2.data;

import is2.util.DB;

/**
 * @author Dr. Bernd Bohnet, 30.10.2010
 *  
 * This class computes the mapping of features to the weight vector.
 */
final public class D6 extends DX {
	private long shift;
	private long h;
	

	private final Long2IntInterface _li; 
	public D6(Long2IntInterface li) {
		_li=li;
	}

	boolean fixed =false;
	
	public void fix() {
		
		if (fixed) {
			DB.println("warning: already fixed");
		//	return;
		}
		
		long t0= 1, t1=a0, t2=t1*a1, t3=t2*a2,t4=t3*a3, t5=t4*a4,t6=t5*a5, t7=t6*a6, t8=t7*a7, t9=t8*a8;
		
	
		
		
		a0=t0;a1=t1;a2=t2;a3=t3;a4=t4;a5=t5;a6=t6;a7=t7;a8=t8; a9=t9;
	
		fixed=true;
	}
	


	final public void clean() {
		v0=0;v1=0;v2=0;v3=0;v4=0;v5=0;v6=0;v7=0;v8=0;
		shift=0;h=0;
	}
	
	final public  void cz3(){
		if (v0<0||v1<0||v2<0) {  h=-1;return;}
		
		h= v0+v1*a1+v2*a2;
		shift =a3;
	}

	final public  long c3(){
		if (v0<0||v1<0||v2<0) {  h=-1;return h;}
		
		h= v0+v1*a1+v2*a2;
		shift =a3;
		return h;
	}
	
	final public void cz4(){		
		if (v0<0||v1<0||v2<0||v3<0) {h=-1;return;}
		
		h =v0+v1*a1+v2*a2+v3*a3;
		shift =a4;		
	}

	final public long c4(){		
		if (v0<0||v1<0||v2<0||v3<0) {h=-1;return h;}
		
		h =v0+v1*a1+v2*a2+v3*a3;
		shift =a4;		
		return h;
	}
	

	final public void cz5(){
		
		if (v0<0||v1<0||v2<0||v3<0||v4<0) {h=-1;return;}
		
		h =v0+v1*a1+v2*a2+v3*a3+v4*a4;
		shift=a5;

	}

	final public long c5(){
		
		if (v0<0||v1<0||v2<0||v3<0||v4<0) {h=-1;return h;}
		
		h =v0+v1*a1+v2*a2+v3*a3+v4*a4;
		shift=a5;
		return h;
	}
	

	final public void cz6(){

		if (v0<0||v1<0||v2<0||v3<0||v4<0||v5<0) {h=-1; return;}

		h =v0+v1*a1+v2*a2+v3*a3 +v4*a4+v5*a5;
		shift=a6;
	}

	final public long c6(){

		if (v0<0||v1<0||v2<0||v3<0||v4<0||v5<0) {h=-1; return h;}

		h =v0+v1*a1+v2*a2+v3*a3 +v4*a4+v5*a5;
		shift=a6;
		return h;
	}


	final public long cs(int b, int v) {
		if (h<0) {h=-1;	 return h;}
		
		h += v*shift;
		shift *=b;
		return h;

	}

	final public void csa(int b, int v, IFV f) {
		if (h<0) {h=-1;	return;}

		h += v*shift;
		shift *=b;
		f.add(_li.l2i(h));
	}

	final public long csa(int b, int v) {
		if (h<0) {h=-1;	return-1; }

		h += v*shift;
		shift *=b;
		return h;
	}

	public final long getVal(){
		return h;
	}
	
	public final void map(IFV f, long l){
		if (l>0) f.add(this._li.l2i(l));
	}
	
	/**
	 * @param f
	 */
	final public void add(IFV f) {
		f.add(_li.l2i(h));
	}

	final public void cz7() {
		if (v0<0||v1<0||v2<0||v3<0||v4<0||v5<0||v6<0) {h=-1; return;}

		h =v0+v1*a1+v2*a2+v3*a3 +v4*a4+v5*a5+v6*a6;
		shift=a7;
		
	}

	final public long c7() {
		if (v0<0||v1<0||v2<0||v3<0||v4<0||v5<0||v6<0) {h=-1; return h;}

		h =v0+v1*a1+v2*a2+v3*a3 +v4*a4+v5*a5+v6*a6;
		shift=a7;
		return h;
	}

	/**
	 * 
	 */
	final public void cz8() {
		if (v0<0||v1<0||v2<0||v3<0||v4<0||v5<0||v6<0||v7<0) {h=-1; return;}

		h =v0+v1*a1+v2*a2+v3*a3 +v4*a4+v5*a5+v6*a6+v7*a7;
		shift=a8;
	}



	/* (non-Javadoc)
	 * @see is2.data.DX#computeLabeValue(short, short)
	 */
	@Override
	public int computeLabeValue(int label, int shift) {
		return label*shift;
	}


	


}