package jcgp.function; import java.util.ArrayList; import java.util.Arrays; import jcgp.exceptions.InvalidArgumentsException; import jcgp.population.Connection; public class BitwiseLogic extends FunctionSet { public BitwiseLogic() { name = "32-bit Logic"; functionList = new Function[]{ new And(), new Or(), new Not(), new Xor(), new Nand(), new Nor(), new Xnor()}; allowedFunctions = new ArrayList(Arrays.asList(functionList)); } public static class And extends Function { private int arity = 2; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int arg2 = ((int) connections[1].getValue()); int result = arg1 & arg2; return result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "AND"; } } public static class Or extends Function { private int arity = 2; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int arg2 = ((int) connections[1].getValue()); int result = arg1 | arg2; return result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "OR"; } } public static class Not extends Function { private int arity = 1; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int result = ~arg1; return result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "NOT"; } } public static class Xor extends Function { private int arity = 2; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int arg2 = ((int) connections[1].getValue()); int result = arg1 ^ arg2; return result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "XOR"; } } public static class Nand extends Function { private int arity = 2; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int arg2 = ((int) connections[1].getValue()); int result = arg1 & arg2; return ~result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "NAND"; } } public static class Nor extends Function { private int arity = 2; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int arg2 = ((int) connections[1].getValue()); int result = arg1 | arg2; return ~result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "NOR"; } } public static class Xnor extends Function { private int arity = 2; @Override public Object run(Connection... connections) { if (connections.length < arity) { throw new InvalidArgumentsException("Not enough connections were given."); } else { int arg1 = ((int) connections[0].getValue()); int arg2 = ((int) connections[1].getValue()); int result = arg1 ^ arg2; return ~result; } } @Override public int getArity() { return arity; } @Override public String getName() { return "XNOR"; } } }