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

expression compiler; fix stackmap frame generation issue #359

Closed crowlogic closed 5 months ago

crowlogic commented 5 months ago
java.lang.VerifyError: Instruction type does not match stack map
Exception Details:
  Location:
    nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.evaluate(Ljava/lang/Object;IILjava/lang/Object;)Ljava/lang/Object; @70: aload_0
  Reason:
    Current frame's stack size doesn't match stackmap.
  Current Frame:
    bci: @70
    flags: { }
    locals: { 'nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq', 'java/lang/Object', integer, integer, 'java/lang/Object' }
    stack: { 'arb/Real' }
  Stackmap Frame:
    bci: @70
    flags: { }
    locals: { 'nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq', 'java/lang/Object', integer, integer, 'java/lang/Object' }
    stack: { }
  Bytecode:
    0000000: 2ab4 000e 9a00 072a b600 122a b400 162b
    0000010: c000 181d 2ab4 001b b600 212a b400 252b
    0000020: c000 18b5 002a 2ab4 002d b600 3157 2ab4
    0000030: 0034 2ab4 0037 b600 3b57 2ab4 003e 2ab4
    0000040: 0041 b600 3b57 2ab4 002d 2ab4 0025 2ab4
    0000050: 0034 1d2a b400 44b9 0047 0400 c000 1d1d
    0000060: b600 4b57 2ab4 0034 b600 4f2a b400 3eb6
    0000070: 0053 9eff d42a b400 2d1d 2ab4 0056 b600
    0000080: 592b c000 181d 2ab4 005c b600 602a b400
    0000090: 642b c000 18b5 0066 2ab4 0069 b600 3157
    00000a0: 2ab4 0034 2ab4 0037 b600 3b57 2ab4 006c
    00000b0: 2ab4 006f b600 3b57 2ab4 0069 2ab4 0064
    00000c0: 2ab4 0034 1d2a b400 72b9 0047 0400 c000
    00000d0: 1d1d b600 4b57 2ab4 0034 b600 4f2a b400
    00000e0: 6cb6 0053 9eff d42a b400 691d 2ab4 0075
    00000f0: b600 761d 1904 c000 1db6 0079 b0       
  Stackmap Table:
    same_frame(@11)
    same_frame(@70)
    same_locals_1_stack_item_extended(@184,Object[#29])

    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/arb.expressions.Expression.constructNewInstance(Expression.java:1164)
    at arb4j/arb.expressions.Expression.instantiate(Expression.java:1152)
    at arb4j/arb.expressions.Expression.instantiate(Expression.java:164)
    at arb4j/arb.functions.Function.express(Function.java:162)
    at arb4j/arb.functions.polynomials.HypergeometricPolynomialTest.testSummand(HypergeometricPolynomialTest.java:85)
    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)
crowlogic commented 5 months ago

HypergeometricPolynomialTest.testSummand

Generating n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q})

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.Real,
                          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.Real,
                          operation=mul,
                          right=Πα[k]₍ₙ₎{k=1…p},
                          right.type=class arb.Real,
                          resultType=class arb.Real )

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

Variable.generate( this=z, resultType=class arb.Real)
Variable.generate( this=n, resultType=class arb.Integer)
NaryMultiplication.assignFieldNames(resultType=class arb.Real,
                                    factorFunctionFieldName=factorℝ1,
                                    factorValueFieldName=valueℝ1)

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

Generating k➔α[k]₍ₙ₎

BinaryOperation.generate( this=α[k]⋰n,
                          left=α[k],
                          left.type=class arb.Real,
                          operation=ascendingFactorial,
                          right=n,
                          right.type=class arb.Integer,
                          resultType=class arb.Real )

Variable.generate( this=α[k], resultType=class arb.Real)
Variable.generate( this=k, resultType=class arb.Integer)
Variable.generate( this=n, resultType=class arb.Integer)
NaryMultiplication.propagateInputToFactorClass( factorFunctionFieldName=factorℝ1,
                                                independentVariableNode=n,
                                                independentVariableNode.type=class arb.Integer)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

Variable.generate( this=p, resultType=class arb.Integer)
NaryMultiplication.designateLabel( label=L1601292138,
                                   addTypeToStackMap=false)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

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)
NaryMultiplication.assignFieldNames(resultType=class arb.Real,
                                    factorFunctionFieldName=factorℝ2,
                                    factorValueFieldName=valueℝ2)

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

Generating k➔β[k]₍ₙ₎

BinaryOperation.generate( this=β[k]⋰n,
                          left=β[k],
                          left.type=class arb.Real,
                          operation=ascendingFactorial,
                          right=n,
                          right.type=class arb.Integer,
                          resultType=class arb.Real )

Variable.generate( this=β[k], resultType=class arb.Real)
Variable.generate( this=k, resultType=class arb.Integer)
Variable.generate( this=n, resultType=class arb.Integer)
NaryMultiplication.propagateInputToFactorClass( factorFunctionFieldName=factorℝ2,
                                                independentVariableNode=n,
                                                independentVariableNode.type=class arb.Integer)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

Variable.generate( this=q, resultType=class arb.Integer)
NaryMultiplication.designateLabel( label=L1218593486,
                                   addTypeToStackMap=true)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;
--- HypergeometricPolynomialTestTestSummand.text.nogood 2024-03-18 19:37:53.523739785 -0500
+++ HypergeometricPolynomialTestTestSummand.text.good   2024-03-18 19:37:23.851964574 -0500
@@ -107,7 +107,7 @@
     INVOKEVIRTUAL arb/Integer.set (Larb/Integer;)Larb/Integer;
     POP
    L2
-   FRAME SAME
+   FRAME SAME1 arb/Real
     ALOAD 0
     GETFIELD nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.prodℝ1 : Larb/Real;
     ALOAD 0
@@ -163,7 +163,7 @@
     INVOKEVIRTUAL arb/Integer.set (Larb/Integer;)Larb/Integer;
     POP
    L3
-   FRAME SAME1 arb/Real
+   FRAME FULL [nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq java/lang/Object I I java/lang/Object] [arb/Real arb/Integer]
     ALOAD 0
     GETFIELD nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.prodℝ2 : Larb/Real;
     ALOAD 0
@@ -202,8 +202,8 @@
     LOCALVARIABLE order I L0 L4 2
     LOCALVARIABLE bits I L0 L4 3
     LOCALVARIABLE result Larb/Real; L0 L4 4
-    MAXSTACK = 10
-    MAXLOCALS = 10
+    MAXSTACK = 7
+    MAXLOCALS = 5

   // access flags 0x1
   public <init>()V
@@ -281,8 +281,8 @@
     INVOKESPECIAL arb/Real.<init> ()V
     PUTFIELD nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.ℝ3 : Larb/Real;
     RETURN
-    MAXSTACK = 10
-    MAXLOCALS = 10
+    MAXSTACK = 4
+    MAXLOCALS = 1

   // access flags 0x1
   public initialize()V
@@ -382,8 +382,8 @@
     ICONST_1
     PUTFIELD nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.isInitialized : Z
     RETURN
-    MAXSTACK = 10
-    MAXLOCALS = 10
+    MAXSTACK = 4
+    MAXLOCALS = 1

   // access flags 0x1
   public close()V
@@ -424,6 +424,6 @@
     GETFIELD nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.ℝ3 : Larb/Real;
     INVOKEVIRTUAL arb/Real.close ()V
     RETURN
-    MAXSTACK = 10
-    MAXLOCALS = 10
+    MAXSTACK = 1
+    MAXLOCALS = 1
 }
crowlogic commented 5 months ago

aload_0 at bytecode index 70

  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=10, locals=10, 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 z:Larb/Real;
        15: aload_1
        16: checkcast     #24                 // class arb/Integer
        19: iload_3
        20: aload_0
        21: getfield      #27                 // Field ℝ1:Larb/Real;
        24: invokevirtual #33                 // Method arb/Real.pow:(Larb/Integer;ILarb/Real;)Larb/Real;
        27: aload_0
        28: getfield      #37                 // Field factorℝ1:Lfactorℝ1;
        31: aload_1
        32: checkcast     #24                 // class arb/Integer
        35: putfield      #42                 // Field factorℝ1.n:Larb/Integer;
        38: aload_0
        39: getfield      #45                 // Field prodℝ1:Larb/Real;
        42: invokevirtual #49                 // Method arb/Real.multiplicativeIdentity:()Larb/Real;
        45: pop
        46: aload_0
        47: getfield      #52                 // Field k:Larb/Integer;
        50: aload_0
        51: getfield      #55                 // Field c1:Larb/Integer;
        54: invokevirtual #59                 // Method arb/Integer.set:(Larb/Integer;)Larb/Integer;
        57: pop
        58: aload_0
        59: getfield      #62                 // Field endIndexℤ1:Larb/Integer;
        62: aload_0
        63: getfield      #65                 // Field p:Larb/Integer;
        66: invokevirtual #59                 // Method arb/Integer.set:(Larb/Integer;)Larb/Integer;
        69: pop
        70: aload_0
        71: getfield      #45                 // Field prodℝ1:Larb/Real;
        74: aload_0
        75: getfield      #37                 // Field factorℝ1:Lfactorℝ1;
        78: aload_0
        79: getfield      #52                 // Field k:Larb/Integer;
        82: iload_3
        83: aload_0
        84: getfield      #68                 // Field valueℝ1:Larb/Real;
crowlogic commented 5 months ago

further along.. now at

java.lang.VerifyError: Instruction type does not match stack map
Exception Details:
  Location:
    nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq.evaluate(Ljava/lang/Object;IILjava/lang/Object;)Ljava/lang/Object; @184: aload_0
  Reason:
    Current frame's stack size doesn't match stackmap.
  Current Frame:
    bci: @184
    flags: { }
    locals: { 'nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq', 'java/lang/Object', integer, integer, 'java/lang/Object' }
    stack: { 'arb/Real', 'arb/Integer' }
  Stackmap Frame:
    bci: @184
    flags: { }
    locals: { 'nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq', 'java/lang/Object', integer, integer, 'java/lang/Object' }
    stack: { 'arb/Real' }
  Bytecode:
    0000000: 2ab4 000e 9a00 072a b600 122a b400 162b
    0000010: c000 181d 2ab4 001b b600 212a b400 252b
    0000020: c000 18b5 002a 2ab4 002d b600 3157 2ab4
    0000030: 0034 2ab4 0037 b600 3b57 2ab4 003e 2ab4
    0000040: 0041 b600 3b57 2ab4 002d 2ab4 0025 2ab4
    0000050: 0034 1d2a b400 44b9 0047 0400 c000 1d1d
    0000060: b600 4b57 2ab4 0034 b600 4f2a b400 3eb6
    0000070: 0053 9eff d42a b400 2d1d 2ab4 0056 b600
    0000080: 592b c000 181d 2ab4 005c b600 602a b400
    0000090: 642b c000 18b5 0066 2ab4 0069 b600 3157
    00000a0: 2ab4 0034 2ab4 0037 b600 3b57 2ab4 006c
    00000b0: 2ab4 006f b600 3b57 2ab4 0069 2ab4 0064
    00000c0: 2ab4 0034 1d2a b400 72b9 0047 0400 c000
    00000d0: 1d1d b600 4b57 2ab4 0034 b600 4f2a b400
    00000e0: 6cb6 0053 9eff d42a b400 691d 2ab4 0075
    00000f0: b600 761d 1904 c000 1db6 0079 b0       
  Stackmap Table:
    same_frame(@11)
    same_locals_1_stack_item_frame(@70,Object[#29])
    same_locals_1_stack_item_extended(@184,Object[#29])

    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/arb.expressions.Expression.constructNewInstance(Expression.java:1245)
    at arb4j/arb.expressions.Expression.instantiate(Expression.java:1233)
    at arb4j/arb.expressions.Expression.instantiate(Expression.java:172)
    at arb4j/arb.functions.Function.express(Function.java:162)
    at arb4j/arb.functions.polynomials.HypergeometricPolynomialTest.testSummand(HypergeometricPolynomi
crowlogic commented 5 months ago
  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=10, locals=10, 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 z:Larb/Real;
        15: aload_1
        16: checkcast     #24                 // class arb/Integer
        19: iload_3
        20: aload_0
        21: getfield      #27                 // Field ℝ1:Larb/Real;
        24: invokevirtual #33                 // Method arb/Real.pow:(Larb/Integer;ILarb/Real;)Larb/Real;
        27: aload_0
        28: getfield      #37                 // Field factorℝ1:Lfactorℝ1;
        31: aload_1
        32: checkcast     #24                 // class arb/Integer
        35: putfield      #42                 // Field factorℝ1.n:Larb/Integer;
        38: aload_0
        39: getfield      #45                 // Field prodℝ1:Larb/Real;
        42: invokevirtual #49                 // Method arb/Real.multiplicativeIdentity:()Larb/Real;
        45: pop
        46: aload_0
        47: getfield      #52                 // Field k:Larb/Integer;
        50: aload_0
        51: getfield      #55                 // Field c1:Larb/Integer;
        54: invokevirtual #59                 // Method arb/Integer.set:(Larb/Integer;)Larb/Integer;
        57: pop
        58: aload_0
        59: getfield      #62                 // Field endIndexℤ1:Larb/Integer;
        62: aload_0
        63: getfield      #65                 // Field p:Larb/Integer;
        66: invokevirtual #59                 // Method arb/Integer.set:(Larb/Integer;)Larb/Integer;
        69: pop
        70: aload_0
        71: getfield      #45                 // Field prodℝ1:Larb/Real;
        74: aload_0
        75: getfield      #37                 // Field factorℝ1:Lfactorℝ1;
        78: aload_0
        79: getfield      #52                 // Field k:Larb/Integer;
        82: iload_3
        83: aload_0
        84: getfield      #68                 // Field valueℝ1:Larb/Real;
        87: invokeinterface #71,  4           // InterfaceMethod arb/functions/Function.evaluate:(Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object;
        92: checkcast     #29                 // class arb/Real
        95: iload_3
        96: invokevirtual #75                 // Method arb/Real.mul:(Larb/Real;I)Larb/Real;
        99: pop
       100: aload_0
       101: getfield      #52                 // Field k:Larb/Integer;
       104: invokevirtual #79                 // Method arb/Integer.increment:()Larb/Integer;
       107: aload_0
       108: getfield      #62                 // Field endIndexℤ1:Larb/Integer;
       111: invokevirtual #83                 // Method arb/Integer.compareTo:(Larb/Integer;)I
       114: ifle          70
       117: aload_0
       118: getfield      #45                 // Field prodℝ1:Larb/Real;
       121: iload_3
       122: aload_0
       123: getfield      #86                 // Field ℝ2:Larb/Real;
       126: invokevirtual #89                 // Method arb/Real.mul:(Larb/Real;ILarb/Real;)Larb/Real;
       129: aload_1
       130: checkcast     #24                 // class arb/Integer
       133: iload_3
       134: aload_0
       135: getfield      #92                 // Field ℤ1:Larb/Integer;
       138: invokevirtual #96                 // Method arb/Integer.factorial:(ILarb/Integer;)Larb/Integer;
       141: aload_0
       142: getfield      #100                // Field factorℝ2:Lfactorℝ2;
       145: aload_1
       146: checkcast     #24                 // class arb/Integer
       149: putfield      #102                // Field factorℝ2.n:Larb/Integer;
       152: aload_0
       153: getfield      #105                // Field prodℝ2:Larb/Real;
       156: invokevirtual #49                 // Method arb/Real.multiplicativeIdentity:()Larb/Real;
       159: pop
       160: aload_0
       161: getfield      #52                 // Field k:Larb/Integer;
       164: aload_0
       165: getfield      #55                 // Field c1:Larb/Integer;
       168: invokevirtual #59                 // Method arb/Integer.set:(Larb/Integer;)Larb/Integer;
       171: pop
       172: aload_0
       173: getfield      #108                // Field endIndexℤ2:Larb/Integer;
       176: aload_0
       177: getfield      #111                // Field q:Larb/Integer;
       180: invokevirtual #59                 // Method arb/Integer.set:(Larb/Integer;)Larb/Integer;
       183: pop
       184: aload_0
crowlogic commented 5 months ago
Generating n➔z^n*∏k➔α[k]₍ₙ₎{k=1…p}/(n!*∏k➔β[k]₍ₙ₎{k=1…q})

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.Real,
                          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.Real,
                          operation=mul,
                          right=Πα[k]₍ₙ₎{k=1…p},
                          right.type=class arb.Real,
                          resultType=class arb.Real )

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

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

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

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

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

Generating k➔α[k]₍ₙ₎

BinaryOperation.generate( this=α[k]⋰n,
                          left=α[k],
                          left.type=class arb.Real,
                          operation=ascendingFactorial,
                          right=n,
                          right.type=class arb.Integer,
                          resultType=class arb.Real )

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

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

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

NaryMultiplication.propagateInputToFactorClass( factorFunctionFieldName=factorℝ1,
                                                independentVariableNode=n,
                                                independentVariableNode.type=class arb.Integer)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

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

NaryMultiplication.designateLabel( label=L680576081,
                                   addTypeToStackMap=true)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

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)

NaryMultiplication.assignFieldNames(resultType=class arb.Real,
                                    factorFunctionFieldName=factorℝ2,
                                    factorValueFieldName=valueℝ2)

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

Generating k➔β[k]₍ₙ₎

BinaryOperation.generate( this=β[k]⋰n,
                          left=β[k],
                          left.type=class arb.Real,
                          operation=ascendingFactorial,
                          right=n,
                          right.type=class arb.Integer,
                          resultType=class arb.Real )

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

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

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

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

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;

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

NaryMultiplication.designateLabel( label=L453523494,
                                   addTypeToStackMap=true)

getField(functionClass=nzⁿTimesProdkαSubknWherekEquals1TopOvernBangTimesProdkβSubknWherekEquals1Toq,
         fieldName=k,
         fieldTypeSignature=Larb/Integer;
crowlogic commented 5 months ago

table the issue for now.. its a bit more complex than its worth dealing with for now given that automatic frame generation is preferably and this is a compile-time/initializing thing anyway its not like it HAS to be megafast even though it still is with the computeframes option turned on