예제 #1
0
  private void assertInvariants(Value value) {
    Domain domain = value.getDomain();
    assertNotNull(domain);

    Object objValue = value.getObject();

    domain.inDomain(objValue);

    if (domain.isIntegral()) {
      assertEquals(value.getInt(), value.getDouble(), 0.0);
      assertEquals(value.getInt(), objValue);
    }
    if (domain.isReal()) {
      assertEquals(value.getDouble(), objValue);
    }

    if (objValue instanceof Number) {
      Number number = (Number) objValue;

      assertEquals(number.intValue(), value.getInt());
      assertEquals(number.doubleValue(), value.getDouble(), 0.0);
      assertEquals(number.doubleValue() != 0.0, value.getBoolean());
    } else if (objValue instanceof Boolean) {
      Boolean bool = (Boolean) objValue;
      assertEquals(bool, value.getBoolean());
      assertEquals(bool, value.getInt() == 1);
      assertEquals(bool, value.getDouble() == 1.0);
    }

    Value value2 = value.clone();
    assertNotSame(value, value2);
    assertSame(value.getClass(), value2.getClass());
    assertEquals(value.getObject(), value2.getObject());
    assertEquals(value.getIndex(), value2.getIndex());
    assertTrue(value.valueEquals(value2));

    Value value3 = Value.create(domain);
    assertEquals(value.getClass(), value3.getClass());
    value3.setFrom(value);
    assertTrue(value3.valueEquals(value));
    assertEquals(objValue, value3.getObject());
    assertEquals(value.getIndex(), value3.getIndex());

    Value value4 = Value.create(domain, objValue);
    assertEquals(objValue, value4.getObject());
    assertEquals(value.getIndex(), value4.getIndex());
  }
 @Override
 public final void evalDeterministic(Value[] arguments) {
   // Allow one constant input
   final Value arg1Value = arguments[1];
   final Value arg2Value = arguments[2];
   final Object arg1 = requireNonNull(arg1Value.getObject());
   final Object arg2 = requireNonNull(arg2Value.getObject());
   final FiniteFieldNumber input1 =
       (arg1 instanceof FiniteFieldNumber)
           ? (FiniteFieldNumber) arg1
           : ((FiniteFieldNumber) arg2).cloneWithNewValue(arg1Value.getInt());
   final FiniteFieldNumber input2 =
       (arg2 instanceof FiniteFieldNumber)
           ? (FiniteFieldNumber) arg2
           : ((FiniteFieldNumber) arg1).cloneWithNewValue(arg2Value.getInt());
   if (!input1.isCompatible(input2))
     throw new DimpleException("Primitive polynomials must match.");
   arguments[0].setFiniteField(finiteFieldProduct(input1, input2)); // Replace the output value
 }
  @Override
  public final double evalEnergy(Value[] arguments) {
    // Allow one constant input
    final FiniteFieldNumber result = requireNonNull((FiniteFieldNumber) arguments[0].getObject());
    final Value arg1 = arguments[1];
    final FiniteFieldNumber input1 =
        (arg1 instanceof FiniteFieldValue)
            ? arg1.getFiniteField()
            : result.cloneWithNewValue(arg1.getInt());
    final Value arg2 = arguments[2];
    final FiniteFieldNumber input2 =
        (arg2 instanceof FiniteFieldValue)
            ? arg2.getFiniteField()
            : result.cloneWithNewValue(arg2.getInt());

    if (!result.isCompatible(input1) || !result.isCompatible(input2))
      throw new DimpleException("Primitive polynomials must match.");

    final FiniteFieldNumber computedResult = finiteFieldProduct(input1, input2);

    return (computedResult.isEqual(result)) ? 0 : Double.POSITIVE_INFINITY;
  }
예제 #4
0
  @Test
  public void test() {
    //
    // Test creation
    //

    Domain domain = ObjectDomain.instance();
    Value value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());

    domain = DiscreteDomain.bit();
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(0, value.getInt());
    assertEquals(0, value.getIndex());
    assertEquals(0, value.getObject());
    assertTrue(value instanceof SimpleIntRangeValue);

    domain = DiscreteDomain.range(2, 5);
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(2, value.getInt());
    assertEquals(0, value.getIndex());
    assertTrue(value instanceof IntRangeValue);

    domain = DiscreteDomain.range(0, 4, 2);
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(0, value.getInt());
    assertEquals(0, value.getIndex());
    assertTrue(value instanceof IntRangeValue);

    domain = DiscreteDomain.create(1, 2, 3, 5, 8, 13);
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(1, value.getInt());
    assertEquals(0, value.getIndex());
    assertTrue(value instanceof GenericIntDiscreteValue);

    domain = DiscreteDomain.create(1, 2, 3.5);
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(1, value.getObject());
    assertEquals(0, value.getIndex());
    assertTrue(value instanceof GenericDiscreteValue);

    domain = RealDomain.unbounded();
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(0.0, value.getDouble(), 0.0);
    assertTrue(value instanceof RealValue);

    domain = RealJointDomain.create(2);
    value = Value.create(domain);
    assertInvariants(value);
    assertEquals(domain, value.getDomain());
    assertTrue(value instanceof RealJointValue);

    domain = IntDomain.unbounded();
    value = Value.create(domain);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertTrue(value instanceof IntValue);

    domain = DiscreteDomain.range(0, 9);
    value = Value.create(domain, 3);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(3, value.getInt());
    assertEquals(3, value.getIndex());

    domain = DiscreteDomain.range(-4, 4);
    value = Value.create(domain, 3);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(3, value.getInt());
    assertEquals(7, value.getIndex());

    domain = DiscreteDomain.range(0, 6, 3);
    value = Value.create(domain, 3);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(3, value.getInt());
    assertEquals(1, value.getIndex());

    domain = DiscreteDomain.create(1, 2, 3, 5);
    value = Value.create(domain, 3);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(3, value.getInt());
    assertEquals(2, value.getIndex());

    domain = DiscreteDomain.create("rabbit", 3, 4.2);
    value = Value.create(domain, 3);
    assertInvariants(value);
    assertSame(domain, value.getDomain());
    assertEquals(3, value.getInt());
    assertEquals(3, value.getObject());
    assertEquals(1, value.getIndex());

    value = Value.create(42);
    assertInvariants(value);
    assertSame(IntDomain.unbounded(), value.getDomain());
    assertEquals(42, value.getObject());
    assertEquals(42, value.getInt());

    value = Value.create((short) 42);
    assertInvariants(value);
    assertEquals(42, value.getObject());
    assertSame(IntDomain.unbounded(), value.getDomain());

    value = Value.create((byte) 42);
    assertInvariants(value);
    assertEquals(42, value.getObject());
    assertSame(IntDomain.unbounded(), value.getDomain());

    value = Value.create(42.0);
    assertInvariants(value);
    assertSame(RealDomain.unbounded(), value.getDomain());
    assertEquals(42.0, value.getObject());

    double[] array = new double[] {1.0, 3.0};
    value = Value.create(array);
    assertInvariants(value);
    assertEquals(RealJointDomain.create(2), value.getDomain());
    assertArrayEquals(array, (double[]) value.getObject(), 0.0);

    value = Value.create("foo");
    assertInvariants(value);
    assertSame(ObjectDomain.instance(), value.getDomain());
    assertEquals("foo", value.getObject());

    //
    // Test integral values
    //

    value = Value.create(42);
    assertEquals(42, value.getInt());
    assertEquals(-1, value.getIndex());
    value.setInt(23);
    expectThrow(DimpleException.class, value, "setIndex", 0);
    assertEquals(23, value.getInt());
    value.setDouble(1.6);
    assertEquals(2, value.getInt());
    assertEquals(2.0, value.getDouble(), 0.0);
    value.setObject(-40);
    assertEquals(-40, value.getInt());
    assertTrue(value.valueEquals(Value.create(-40.0)));
    assertFalse(value.valueEquals(Value.create(39)));
    assertInvariants(value);

    Domain digit = DiscreteDomain.range(0, 9);
    value = Value.create(digit, 3);
    assertEquals(3, value.getInt());
    assertEquals(3, value.getIndex());
    value.setInt(4);
    assertEquals(4, value.getInt());
    value.setDouble(5.2);
    assertEquals(5, value.getInt());
    assertTrue(value.valueEquals(Value.create(5)));
    value.setIndex(2);
    assertEquals(2, value.getIndex());
    assertEquals(2, value.getObject());
    assertInvariants(value);

    Domain oddDigits = DiscreteDomain.range(1, 9, 2);
    value = Value.create(oddDigits, 3);
    assertEquals(3, value.getInt());
    assertEquals(1, value.getIndex());
    value.setInt(5);
    assertEquals(5, value.getObject());
    assertEquals(2, value.getIndex());
    value.setIndex(0);
    assertEquals(0, value.getIndex());
    assertEquals(1, value.getInt());
    value.setObject(9);
    assertEquals(9.0, value.getDouble(), 0.0);
    assertEquals(4, value.getIndex());
    assertFalse(value.valueEquals(Value.create(10)));
    assertTrue(value.valueEquals(Value.create(9.1)));

    Domain primeDigits = DiscreteDomain.create(2, 3, 5, 7);
    value = Value.create(primeDigits, 5);
    assertEquals(5, value.getInt());
    value.setInt(2);
    assertEquals(2, value.getInt());
    assertEquals(0, value.getIndex());
    value.setIndex(3);
    assertEquals(3, value.getIndex());
    assertEquals(7, value.getInt());

    /*
     * Test generic discrete values
     */

    DiscreteDomain stooges = DiscreteDomain.create("moe", "joe", "curly");
    value = Value.create(stooges);
    assertEquals("moe", value.getObject());
    assertEquals(0, value.getIndex());
    assertInvariants(value);
    value.setObject("joe");
    assertEquals("joe", value.getObject());
    assertEquals(1, value.getIndex());
    value.setIndex(2);
    assertEquals("curly", value.getObject());
    assertEquals(2, value.getIndex());
    assertFalse(value.valueEquals(Value.create(stooges, "moe")));
    assertTrue(value.valueEquals(Value.create("curly")));
    value.setFrom(Value.create("joe"));
    assertEquals("joe", value.getObject());

    /*
     * Test real values
     */

    value = Value.create(3.14159);
    assertEquals(3.14159, value.getDouble(), 0.0);
    value.setInt(42);
    assertEquals(42.0, value.getDouble(), 0.0);
    value.setDouble(2.3);
    assertEquals(2.3, value.getDouble(), 0.0);
    value.setObject(-123.4);
    assertEquals(-123.4, value.getDouble(), 0.0);
    assertFalse(value.valueEquals(Value.create(-123.4002)));

    Domain halves = DiscreteDomain.range(0, 10, .5);
    value = Value.create(halves, 3);
    assertEquals(3, value.getInt());
    assertEquals(3, value.getDouble(), 0.0);
    assertEquals(6, value.getIndex());
    assertInvariants(value);
    value.setIndex(1);
    assertEquals(.5, value.getDouble(), 0.0);
    assertEquals(1, value.getIndex());

    Domain realDigits = DiscreteDomain.range(0.0, 9.0);
    value = Value.create(realDigits, 3);
    assertEquals(3, value.getInt());
    assertEquals(3, value.getIndex());
    assertInvariants(value);
    value.setIndex(5);
    assertEquals(5, value.getInt());

    Domain powersOfTwo = DiscreteDomain.create(.125, .25, .5, 1.0, 2.0, 4.0, 8.0);
    value = Value.create(powersOfTwo);
    assertEquals(.125, value.getDouble(), 0.0);
    assertInvariants(value);
    value.setIndex(2);
    assertEquals(.5, value.getDouble(), 0.0);
    value.setFrom(Value.create(.25));
    assertEquals(1, value.getIndex());
    value.setFrom(Value.create(DiscreteDomain.create(2.3, 4.0, 5.0), 4.0));
    assertEquals(4.0, value.getDouble(), 0.0);

    /*
     * Test object values
     */

    value = Value.create("foo");
    assertEquals("foo", value.getObject());
    expectThrow(DimpleException.class, value, "getInt");
    value.setInt(42);
    assertEquals(42, value.getObject());
    assertEquals(42, value.getInt());
    assertEquals(42.0, value.getDouble(), 0.0);
    value.setDouble(23.1);
    assertEquals(23.1, value.getObject());
    assertEquals(23, value.getInt());
    assertEquals(23.1, value.getDouble(), 0.0);

    value = Value.create((Domain) null);
    assertNull(value.getObject());
    assertSame(ObjectDomain.instance(), value.getDomain());

    /*
     *
     */
  }