From 88314e71f908efcfc38da3b800319c171a6ccceb Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Fri, 18 Apr 2014 09:08:41 +0100 Subject: Added parsers, did a bit of testing, switched to java8 --- src/jcgp/backend/function/BitwiseLogic.java | 337 ++++++++++++++++++++++------ 1 file changed, 269 insertions(+), 68 deletions(-) (limited to 'src/jcgp/backend/function/BitwiseLogic.java') diff --git a/src/jcgp/backend/function/BitwiseLogic.java b/src/jcgp/backend/function/BitwiseLogic.java index 5d47ff7..14f4488 100644 --- a/src/jcgp/backend/function/BitwiseLogic.java +++ b/src/jcgp/backend/function/BitwiseLogic.java @@ -1,6 +1,5 @@ package jcgp.backend.function; -import jcgp.backend.exceptions.InvalidArgumentsException; import jcgp.backend.population.Connection; public class BitwiseLogic extends FunctionSet { @@ -8,26 +7,155 @@ public class BitwiseLogic extends FunctionSet { public BitwiseLogic() { name = "32-bit Logic"; functionList = new Function[]{ + new ConstantZero(), + new ConstantOne(), + new WireA(), + new WireB(), + new NotA(), + new NotB(), new And(), - new Or(), - new Not(), - new Xor(), - new Nand(), + new AndNotA(), + new AndNotB(), new Nor(), - new Xnor()}; + new Xor(), + new Xnor(), + new Or(), + new OrNotA(), + new OrNotB(), + new Nand()}; + + // TODO muxes enableAll(); } + + public static class ConstantZero extends Function { + @Override + public Long run(Connection... connections) { + return new Long(0); + } + + @Override + public int getArity() { + return 0; + } + + @Override + public String getName() { + return "0"; + } + } + + public static class ConstantOne extends Function { + @Override + public Long run(Connection... connections) { + return new Long(Long.MAX_VALUE); + } + + @Override + public int getArity() { + return 0; + } + + @Override + public String getName() { + return "1"; + } + } + + public static class WireA extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + return ((Long) connections[0].getValue()).longValue(); + } + } + + @Override + public int getArity() { + return 2; + } + + @Override + public String getName() { + return "Wire A"; + } + } + + public static class WireB extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + return ((Long) connections[1].getValue()).longValue(); + } + } + + @Override + public int getArity() { + return 2; + } + + @Override + public String getName() { + return "Wire B"; + } + } + + public static class NotA extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + return ~((Long) connections[0].getValue()).longValue(); + } + } + + @Override + public int getArity() { + return 2; + } + + @Override + public String getName() { + return "Not A"; + } + } + + public static class NotB extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + return ~((Long) connections[1].getValue()).longValue(); + } + } + + @Override + public int getArity() { + return 2; + } + @Override + public String getName() { + return "Not B"; + } + } + public static class And extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 2) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int arg2 = ((int) connections[1].getValue()); - int result = arg1 & arg2; + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 & arg2; return result; } @@ -40,20 +168,20 @@ public class BitwiseLogic extends FunctionSet { @Override public String getName() { - return "AND"; + return "And"; } } - public static class Or extends Function { + public static class AndNotA extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 2) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int arg2 = ((int) connections[1].getValue()); - int result = arg1 | arg2; - + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = ~arg1 & arg2; + return result; } } @@ -65,43 +193,69 @@ public class BitwiseLogic extends FunctionSet { @Override public String getName() { - return "OR"; + return "And !A"; } } - - public static class Not extends Function { + + public static class AndNotB extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 1) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int result = ~arg1; - + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 & ~arg2; + return result; } } @Override public int getArity() { - return 1; + return 2; } @Override public String getName() { - return "NOT"; + return "And !B"; } } + + public static class Nor extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 | arg2; + return ~result; + } + } + + @Override + public int getArity() { + return 2; + } + + @Override + public String getName() { + return "Nor"; + } + } + public static class Xor extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 2) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int arg2 = ((int) connections[1].getValue()); - int result = arg1 ^ arg2; + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 ^ arg2; return result; } @@ -114,19 +268,19 @@ public class BitwiseLogic extends FunctionSet { @Override public String getName() { - return "XOR"; + return "Xor"; } } - - public static class Nand extends Function { + + public static class Xnor extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 2) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int arg2 = ((int) connections[1].getValue()); - int result = arg1 & arg2; + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 ^ arg2; return ~result; } @@ -139,21 +293,71 @@ public class BitwiseLogic extends FunctionSet { @Override public String getName() { - return "NAND"; + return "Xnor"; } } + + public static class Or extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 | arg2; - public static class Nor extends Function { + return result; + } + } + + @Override + public int getArity() { + return 2; + } + + @Override + public String getName() { + return "Or"; + } + } + + public static class OrNotA extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 2) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int arg2 = ((int) connections[1].getValue()); - int result = arg1 | arg2; + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = ~arg1 | arg2; - return ~result; + return result; + } + } + + @Override + public int getArity() { + return 2; + } + + @Override + public String getName() { + return "Or !A"; + } + } + + public static class OrNotB extends Function { + @Override + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); + } else { + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 | ~arg2; + + return result; } } @@ -164,19 +368,19 @@ public class BitwiseLogic extends FunctionSet { @Override public String getName() { - return "NOR"; + return "Or !B"; } } - public static class Xnor extends Function { + public static class Nand extends Function { @Override - public Object run(Connection... connections) { - if (connections.length < 2) { - throw new InvalidArgumentsException("Not enough connections were given."); + public Long run(Connection... connections) { + if (connections.length < getArity()) { + throw new IllegalArgumentException(getName() + " received " + connections.length + " connections but arity is " + getArity() + "."); } else { - int arg1 = ((int) connections[0].getValue()); - int arg2 = ((int) connections[1].getValue()); - int result = arg1 ^ arg2; + Long arg1 = ((Long) connections[0].getValue()); + Long arg2 = ((Long) connections[1].getValue()); + Long result = arg1 & arg2; return ~result; } @@ -189,10 +393,7 @@ public class BitwiseLogic extends FunctionSet { @Override public String getName() { - return "XNOR"; + return "Nand"; } } - - - } -- cgit v1.2.3