#include "Problem.h"
#include "Problemdef.h"
//#include <iostream>

BOP::BOP(int n, int a) : n(n), a(a)  {
	if (n !=2 && n != 4 && n != 10) throw "invalid dimension!";
}

int BOP::f1(IntVec const &x) {
	long long x0 = x[0]; // calculate with 64 bit
	x0 -= a;
	long long val = abs(x0);
	for (int i = 1; i < n; i++) {
		val += std::abs(x[i]);
		if (val >= INT32_MAX) return INT32_MAX; // clip to 32 bit value
	}
	return static_cast<int>(val);
}
int BOP::f2(IntVec const &x) {
	long long x0 = x[0]; // calculate with 64 bit
	x0 += a;
	long long val = abs(x0);
	for (int i = 1; i < n; i++) {
		val += std::abs(x[i]);
		if (val >= INT32_MAX) return INT32_MAX; // clip to 32 bit value
	}
	return static_cast<int>(val);
}


IntVec BOP::getX0(int xid) {
	if (xid < 0 || xid > 3) throw "invalid xid";
	if (xid == 0) {
		IntVec x;
		x.push_back(0);
		x.push_back(100 * a);
		for (int i = 2; i < n; i++) x.push_back(0);
		return x;
	}
	switch (n) {
	case 2:
		return xmat2[xid - 1];
		break;
	case 4:
		return xmat4[xid - 1];
		break;
	case 10:
		return xmat10[xid - 1];
		break;
	default:
		throw "invalid dim";
	}
}
