crowlogic / arb4j

arb4j is a Java API for the arbitrary precision ball arithmetic library found at http://arblib.org
Other
1 stars 0 forks source link

nullary->realPolynomial hypergeometric function: nested function binary function not casting from Real to RealPolynomial correctly #364

Closed crowlogic closed 5 months ago

crowlogic commented 5 months ago
java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    factorℝ2.evaluate(Ljava/lang/Object;IILjava/lang/Object;)Ljava/lang/Object; @27: invokevirtual
  Reason:
    Type 'arb/RealPolynomial' (current frame, stack[1]) is not assignable to 'arb/Real'
  Current Frame:
    bci: @27
    flags: { }
    locals: { 'factorℝ2', 'java/lang/Object', integer, integer, 'java/lang/Object' }
    stack: { 'arb/Real', 'arb/RealPolynomial' }
  Bytecode:
    0000000: 2ab4 000e 9a00 072a b600 122a b400 162b
    0000010: c000 18b6 001e 1904 c000 20b6 0024 1d19
    0000020: 04c0 001a b600 28b0                    
  Stackmap Table:
    same_frame(@11)

    at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3549)
    at java.base/java.lang.Class.getConstructor0(Class.java:3754)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2930)
    at arb4j@0.89/arb.expressions.Expression.constructNewInstance(Expression.java:578)
    at arb4j@0.89/arb.expressions.Expression.instantiate(Expression.java:1267)
    at arb4j@0.89/arb.expressions.nodes.nary.NAryOperation.registerFactorSubexpressionInstance(NAryOperation.java:674)
    at arb4j@0.89/arb.expressions.nodes.nary.NAryOperation.generateFactorClass(NAryOperation.java:362)
    at arb4j@0.89/arb.expressions.nodes.nary.NAryOperation.generate(NAryOperation.java:303)
    at arb4j@0.89/arb.expressions.nodes.binary.BinaryOperation.generate(BinaryOperation.java:148)
    at arb4j@0.89/arb.expressions.nodes.binary.BinaryOperation.generate(BinaryOperation.java:146)
    at arb4j@0.89/arb.expressions.Expression.generateEvaluationMethod(Expression.java:1030)
    at arb4j@0.89/arb.expressions.Expression.compile(Expression.java:532)
    at arb4j@0.89/arb.expressions.Compiler.express(Compiler.java:143)
    at arb4j@0.89/arb.expressions.nodes.nary.NAryOperation.generateFactorClass(NAryOperation.java:353)
    at arb4j@0.89/arb.expressions.nodes.nary.NAryOperation.generate(NAryOperation.java:303)
    at arb4j@0.89/arb.expressions.Expression.generateEvaluationMethod(Expression.java:1030)
    at arb4j@0.89/arb.expressions.Expression.compile(Expression.java:532)
    at arb4j@0.89/arb.expressions.Compiler.express(Compiler.java:143)
    at arb4j@0.89/arb.expressions.Compiler.express(Compiler.java:157)
    at arb4j@0.89/arb.expressions.Compiler.express(Compiler.java:109)
    at arb4j@0.89/arb.expressions.Expression.compile(Expression.java:218)
    at arb4j@0.89/arb.expressions.Expression.instantiate(Expression.java:165)
    at arb4j@0.89/arb.functions.real.RealPolynomialNullaryFunction.express(RealPolynomialNullaryFunction.java:20)
    at arb4j@0.89/arb.functions.polynomials.HypergeometricPolynomial.<init>(HypergeometricPolynomial.java:53)
    at arb4j@0.89/arb.functions.polynomials.HypergeometricPolynomialTest.testSum(HypergeometricPolynomialTest.java:73)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at junit@4.13.2/junit.framework.TestCase.runTest(TestCase.java:177)
    at junit@4.13.2/junit.framework.TestCase.runBare(TestCase.java:142)
    at junit@4.13.2/junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit@4.13.2/junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit@4.13.2/junit.framework.TestResult.run(TestResult.java:125)
    at junit@4.13.2/junit.framework.TestCase.run(TestCase.java:130)
    at junit@4.13.2/junit.framework.TestSuite.runTest(TestSuite.java:241)
    at junit@4.13.2/junit.framework.TestSuite.run(TestSuite.java:236)
    at junit@4.13.2/org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:93)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
  public arb.Real evaluate(arb.Integer, int, int, arb.Real);
    descriptor: (Ljava/lang/Object;IILjava/lang/Object;)Ljava/lang/Object;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=4, locals=5, args_size=5
         0: aload_0
         1: getfield      #14                 // Field isInitialized:Z
         4: ifne          11
         7: aload_0
         8: invokevirtual #18                 // Method initialize:()V
        11: aload_0
        12: getfield      #22                 // Field α:Larb/Real;
        15: aload_1
        16: checkcast     #24                 // class arb/Integer
        19: invokevirtual #30                 // Method arb/Real.get:(Larb/Integer;)Larb/Real;
        22: aload         4
        24: checkcast     #32                 // class arb/RealPolynomial
        27: invokevirtual #36                 // Method arb/Real.identity:()Larb/Real;
        30: iload_3
        31: aload         4
        33: checkcast     #26                 // class arb/Real
        36: invokevirtual #40                 // Method arb/Real.ascendingFactorial:(Larb/Real;ILarb/Real;)Larb/Real;
        39: areturn
      StackMapTable: number_of_entries = 1
        frame_type = 11 /* same */
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      40     0  this   Lfactorℝ2;
            0      40     1    in   Larb/Integer;
            0      40     2 order   I
            0      40     3  bits   I
            0      40     4 result   Larb/Real;
    Signature: #10                          // (Larb/Integer;IILarb/Real;)Larb/Real;
crowlogic commented 5 months ago
import arb.Integer;
import arb.Real;
import arb.RealPolynomial;
import arb.functions.Function;

public class factorℝ2 implements Function<Integer, Real> {
   private boolean isInitialized;
   public Integer n;
   public Integer p;
   public Integer q;
   public Real α;
   public Real β;
   public Integer N;

   public Real evaluate(Integer in, int order, int bits, Real result) {
      if (!isInitialized) {
         initialize();
      }

      return α.get(in).ascendingFactorial((result).identity(), bits, result);
   }

   public void initialize() {
      if (isInitialized) {
         throw new AssertionError("Already initialized");
      } else if (α == null) {
         throw new AssertionError("α is null");
      } else {
         isInitialized = true;
      }
   }
}

factorR1 should not be not be a function from Integer to Real but a function from Integer to RealPolynomial.. or if its not its caller should know that it didnt cast and do it .. most likely spot to check is BinaryOperation.generate

[crow@c15 20240322-07:33:45AM]~/a$ decompile F.class
INFO:  JVM info: Oracle Corporation - 21.0.2 - 21.0.2+13-LTS-58
INFO:  Scanning classes from file F.class
INFO:  Loading Class: F from file F.class
INFO:  Preprocessing class F
INFO:  ... done
INFO:  Decompiling class F
INFO:  ... done
import arb.Integer;
import arb.Real;
import arb.RealPolynomial;
import arb.functions.real.RealPolynomialNullaryFunction;

public class F implements RealPolynomialNullaryFunction {
   private boolean isInitialized;
   Integer c1;
   public Integer p;
   public Integer q;
   public Real α;
   public Real β;
   public Integer N;
   public Real valueℝ1;
   public Integer n;
   public Real sumℝ1;
   public Integer endIndexℤ3;
   public final factorℝ1 factorℝ1 = new factorℝ1();

   public RealPolynomial evaluate(Void in, int order, int bits, RealPolynomial result) {
      if (!isInitialized) {
         initialize();
      }

      sumℝ1.additiveIdentity();
      n.set(c1);
      endIndexℤ3.set(N);

      do {
         sumℝ1.add(factorℝ1.evaluate(n, bits, valueℝ1), bits);
      } while(n.increment().compareTo(endIndexℤ3) <= 0);

      return (result).set(sumℝ1);
   }

   public F() {
      c1 = new Integer("0");
      valueℝ1 = new Real();
      n = new Integer();
      sumℝ1 = new Real();
      endIndexℤ3 = new Integer();
   }

   public void initialize() {
      if (isInitialized) {
         throw new AssertionError("Already initialized");
      } else if (N == null) {
         throw new AssertionError("N is null");
      } else {
         factorℝ1.p = p;
         factorℝ1.q = q;
         factorℝ1.α = α;
         factorℝ1.β = β;
         factorℝ1.N = N;
         isInitialized = true;
      }
   }

   public void close() {
      c1.close();
      valueℝ1.close();
      n.close();
      sumℝ1.close();
      endIndexℤ3.close();
   }
}
crowlogic commented 5 months ago

factor2 should be Integer->RealPolynomial not Integer.Real

crowlogic commented 5 months ago
resolveReference(reference=N)
Declaring N as a contextual variable of type class arb.Integer
Generating Σn➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q}){n=0…N}

Summation.assignFieldNames(resultType=class arb.Real,
                           factorFunctionFieldName=factorℝ1,
                           factorValueFieldName=valueℝ1)

Summation.generateFactorClass( expr=n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q}),resultType=class arb.Real)

resolveReference(reference=n)
Declaring n as the input node to Expression[expression=n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q}),
                      className=factorℝ1,
                      functionName=factorℝ1, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=z)
Checking if z is the indeterminant variable in a polynomial expression
resolveReference(reference=n)
Declaring n as the input node to Expression[expression=n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q}),
                      className=factorℝ1,
                      functionName=factorℝ1, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=p)
Declaring p as a contextual variable of type class arb.Integer
resolveReference(reference=n)
Declaring n as the input node to Expression[expression=n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q}),
                      className=factorℝ1,
                      functionName=factorℝ1, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=q)
Declaring q as a contextual variable of type class arb.Integer
Generating n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q})

resolveReference(reference=z)
Checking if z is the indeterminant variable in a polynomial expression
BinaryOperation.generate( this=(z^n)*Πα[k]₍ₙ₎{k=1…p}/n!*Πβ[k]₍ₙ₎{k=1…q},
                          left=(z^n)*Πα[k]₍ₙ₎{k=1…p},
                          left.type=class arb.RealPolynomial,
                          operation=div,
                          right=n!*Πβ[k]₍ₙ₎{k=1…q},
                          right.type=class arb.Real,
                          resultType=class arb.Real )

BinaryOperation.generate( this=(z^n)*Πα[k]₍ₙ₎{k=1…p},
                          left=z^n,
                          left.type=class arb.RealPolynomial,
                          operation=mul,
                          right=Πα[k]₍ₙ₎{k=1…p},
                          right.type=class arb.Real,
                          resultType=class arb.RealPolynomial )

BinaryOperation.generate( this=z^n,
                          left=z,
                          left.type=class arb.RealPolynomial,
                          operation=pow,
                          right=n,
                          right.type=class arb.Integer,
                          resultType=class arb.RealPolynomial )

Variable.generate( this=z, resultType=class arb.RealPolynomial)

Variable.generate( this=n, resultType=class arb.Integer)

loadFieldOntoStack P1 of type Larb/RealPolynomial;
NaryMultiplication.assignFieldNames(resultType=class arb.Real,
                                    factorFunctionFieldName=factorℝ2,
                                    factorValueFieldName=valueℝ2)

NaryMultiplication.generateFactorClass( expr=k➔α[k]₍ₙ₎,resultType=class arb.Real)

resolveReference(reference=k)
Declaring k as the input node to Expression[expression=k➔α[k]₍ₙ₎,
                      className=factorℝ2,
                      functionName=factorℝ2, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=k)
Declaring k as the input node to Expression[expression=k➔α[k]₍ₙ₎,
                      className=factorℝ2,
                      functionName=factorℝ2, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=α[k])
Declaring α[k] as a contextual variable of type class arb.Real
resolveReference(reference=n)
Checking if n is the indeterminant variable in a polynomial expression
Generating k➔α[k]₍ₙ₎

resolveReference(reference=n)
Checking if n is the indeterminant variable in a polynomial expression
BinaryOperation.generate( this=α[k]⋰n,
                          left=α[k],
                          left.type=class arb.Real,
                          operation=ascendingFactorial,
                          right=n,
                          right.type=class arb.RealPolynomial,
                          resultType=class arb.Real )

Variable.generate( this=α[k], resultType=class arb.Real)

loadFieldOntoStack α of type Larb/Real;
Variable.generate( this=k, resultType=class arb.Integer)

Variable.generate( this=n, resultType=class arb.RealPolynomial)

loadFieldOntoStack factorℝ2 of type Lfactorℝ2;
NaryMultiplication.propagateInputToFactorClass( factorFunctionFieldName=factorℝ2,
                                                independentVariableNode=n,
                                                independentVariableNode.type=class arb.Integer)

loadFieldOntoStack prodℝ1 of type Larb/Real;
getField(functionClass=factorℝ1,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

loadFieldOntoStack c1 of type Larb/Integer;
Variable.generate( this=p, resultType=class arb.Integer)

loadFieldOntoStack p of type Larb/Integer;
NaryMultiplication.designateLabel( label=L741669172,
                                   addTypeToStackMap=false)

getField(functionClass=factorℝ1,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

loadFieldOntoStack P2 of type Larb/RealPolynomial;
BinaryOperation.generate( this=n!*Πβ[k]₍ₙ₎{k=1…q},
                          left=n!,
                          left.type=class arb.Integer,
                          operation=mul,
                          right=Πβ[k]₍ₙ₎{k=1…q},
                          right.type=class arb.Real,
                          resultType=class arb.Real )

FunctionCall.generate: this=n! resultType=class arb.Integer

Variable.generate( this=n, resultType=class arb.Real)

loadFieldOntoStack ℤ1 of type Larb/Integer;
NaryMultiplication.assignFieldNames(resultType=class arb.Real,
                                    factorFunctionFieldName=factorℝ3,
                                    factorValueFieldName=valueℝ3)

NaryMultiplication.generateFactorClass( expr=k➔β[k]₍ₙ₎,resultType=class arb.Real)

resolveReference(reference=k)
Declaring k as the input node to Expression[expression=k➔β[k]₍ₙ₎,
                      className=factorℝ3,
                      functionName=factorℝ3, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=k)
Declaring k as the input node to Expression[expression=k➔β[k]₍ₙ₎,
                      className=factorℝ3,
                      functionName=factorℝ3, recursive=false, functionClass=interface arb.functions.Function] + from 
resolveReference(reference=β[k])
Declaring β[k] as a contextual variable of type class arb.Real
resolveReference(reference=n)
Checking if n is the indeterminant variable in a polynomial expression
Generating k➔β[k]₍ₙ₎

resolveReference(reference=n)
Checking if n is the indeterminant variable in a polynomial expression
BinaryOperation.generate( this=β[k]⋰n,
                          left=β[k],
                          left.type=class arb.Real,
                          operation=ascendingFactorial,
                          right=n,
                          right.type=class arb.RealPolynomial,
                          resultType=class arb.Real )

Variable.generate( this=β[k], resultType=class arb.Real)

loadFieldOntoStack β of type Larb/Real;
Variable.generate( this=k, resultType=class arb.Integer)

Variable.generate( this=n, resultType=class arb.RealPolynomial)

loadFieldOntoStack factorℝ3 of type Lfactorℝ3;
NaryMultiplication.propagateInputToFactorClass( factorFunctionFieldName=factorℝ3,
                                                independentVariableNode=n,
                                                independentVariableNode.type=class arb.Integer)

loadFieldOntoStack prodℝ2 of type Larb/Real;
getField(functionClass=factorℝ1,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

loadFieldOntoStack c1 of type Larb/Integer;
Variable.generate( this=q, resultType=class arb.Integer)

loadFieldOntoStack q of type Larb/Integer;
NaryMultiplication.designateLabel( label=L604125138,
                                   addTypeToStackMap=false)

getField(functionClass=factorℝ1,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

loadFieldOntoStack ℝ1 of type Larb/Real;
loadFieldOntoStack sumℝ1 of type Larb/Real;
getField(functionClass=F,
         fieldName=n,
         fieldTypeSignature=Larb/Integer;

loadFieldOntoStack c1 of type Larb/Integer;
Variable.generate( this=N, resultType=class arb.Integer)

loadFieldOntoStack N of type Larb/Integer;
Summation.designateLabel( label=L492079624,
                                   addTypeToStackMap=false)

getField(functionClass=F,
         fieldName=n,
         fieldTypeSignature=Larb/Integer;
crowlogic commented 5 months ago

generateFactorClass, Summation.generateFactorClass( expr=n➔z^n∏k➔α[k]₍ₙ₎{k=1…p}/(n!∏k➔β[k]₍ₙ₎{k=1…q}),resultType=class arb.Real) is the problem