/export/starexec/sandbox2/solver/bin/starexec_run_complexity /export/starexec/sandbox2/benchmark/theBenchmark.koat /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- WORST_CASE(Omega(n^1), O(n^1)) proof of /export/starexec/sandbox2/benchmark/theBenchmark.koat # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty The runtime complexity of the given CpxIntTrs could be proven to be BOUNDS(n^1, max(6 + 2 * Arg_0, 6) + max(1, 1 + 2 * Arg_0) + nat(Arg_0)). (0) CpxIntTrs (1) Koat2 Proof [FINISHED, 822 ms] (2) BOUNDS(1, max(6 + 2 * Arg_0, 6) + max(1, 1 + 2 * Arg_0) + nat(Arg_0)) (3) Loat Proof [FINISHED, 710 ms] (4) BOUNDS(n^1, INF) ---------------------------------------- (0) Obligation: Complexity Int TRS consisting of the following rules: evalspeedpldi2start(A, B, C) -> Com_1(evalspeedpldi2entryin(A, B, C)) :|: TRUE evalspeedpldi2entryin(A, B, C) -> Com_1(evalspeedpldi2bb5in(B, 0, A)) :|: A >= 0 && B >= 1 evalspeedpldi2entryin(A, B, C) -> Com_1(evalspeedpldi2returnin(A, B, C)) :|: 0 >= A + 1 evalspeedpldi2entryin(A, B, C) -> Com_1(evalspeedpldi2returnin(A, B, C)) :|: 0 >= B evalspeedpldi2bb5in(A, B, C) -> Com_1(evalspeedpldi2bb2in(A, B, C)) :|: C >= 1 evalspeedpldi2bb5in(A, B, C) -> Com_1(evalspeedpldi2returnin(A, B, C)) :|: 0 >= C evalspeedpldi2bb2in(A, B, C) -> Com_1(evalspeedpldi2bb3in(A, B, C)) :|: A >= B + 1 evalspeedpldi2bb2in(A, B, C) -> Com_1(evalspeedpldi2bb5in(A, 0, C)) :|: B >= A evalspeedpldi2bb3in(A, B, C) -> Com_1(evalspeedpldi2bb5in(A, B + 1, C - 1)) :|: TRUE evalspeedpldi2returnin(A, B, C) -> Com_1(evalspeedpldi2stop(A, B, C)) :|: TRUE The start-symbols are:[evalspeedpldi2start_3] ---------------------------------------- (1) Koat2 Proof (FINISHED) YES( ?, 6+2*max([0, Arg_0])+max([1, 1+2*Arg_0])+max([0, Arg_0]) {O(n)}) Initial Complexity Problem: Start: evalspeedpldi2start Program_Vars: Arg_0, Arg_1, Arg_2 Temp_Vars: Locations: evalspeedpldi2bb2in, evalspeedpldi2bb3in, evalspeedpldi2bb5in, evalspeedpldi2entryin, evalspeedpldi2returnin, evalspeedpldi2start, evalspeedpldi2stop Transitions: evalspeedpldi2bb2in(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2bb3in(Arg_0,Arg_1,Arg_2):|:1 <= Arg_2 && 1 <= Arg_1+Arg_2 && 2 <= Arg_0+Arg_2 && 0 <= Arg_1 && 1 <= Arg_0+Arg_1 && 1 <= Arg_0 && Arg_1+1 <= Arg_0 evalspeedpldi2bb2in(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2bb5in(Arg_0,0,Arg_2):|:1 <= Arg_2 && 1 <= Arg_1+Arg_2 && 2 <= Arg_0+Arg_2 && 0 <= Arg_1 && 1 <= Arg_0+Arg_1 && 1 <= Arg_0 && Arg_0 <= Arg_1 evalspeedpldi2bb3in(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2bb5in(Arg_0,Arg_1+1,Arg_2-1):|:1 <= Arg_2 && 1 <= Arg_1+Arg_2 && 2 <= Arg_0+Arg_2 && 1+Arg_1 <= Arg_0 && 0 <= Arg_1 && 1 <= Arg_0+Arg_1 && 1 <= Arg_0 evalspeedpldi2bb5in(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2bb2in(Arg_0,Arg_1,Arg_2):|:0 <= Arg_2 && 0 <= Arg_1+Arg_2 && 1 <= Arg_0+Arg_2 && 0 <= Arg_1 && 1 <= Arg_0+Arg_1 && 1 <= Arg_0 && 1 <= Arg_2 evalspeedpldi2bb5in(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2returnin(Arg_0,Arg_1,Arg_2):|:0 <= Arg_2 && 0 <= Arg_1+Arg_2 && 1 <= Arg_0+Arg_2 && 0 <= Arg_1 && 1 <= Arg_0+Arg_1 && 1 <= Arg_0 && Arg_2 <= 0 evalspeedpldi2entryin(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2bb5in(Arg_1,0,Arg_0):|:0 <= Arg_0 && 1 <= Arg_1 evalspeedpldi2entryin(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2returnin(Arg_0,Arg_1,Arg_2):|:Arg_0+1 <= 0 evalspeedpldi2entryin(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2returnin(Arg_0,Arg_1,Arg_2):|:Arg_1 <= 0 evalspeedpldi2returnin(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2stop(Arg_0,Arg_1,Arg_2):|: evalspeedpldi2start(Arg_0,Arg_1,Arg_2) -> evalspeedpldi2entryin(Arg_0,Arg_1,Arg_2):|: Timebounds: Overall timebound: 6+2*max([0, Arg_0])+max([1, 1+2*Arg_0])+max([0, Arg_0]) {O(n)} 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in: max([0, Arg_0]) {O(n)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in: max([0, Arg_0]) {O(n)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in: max([0, Arg_0]) {O(n)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in: max([1, 1+2*Arg_0]) {O(n)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin: 1 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in: 1 {O(1)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin: 1 {O(1)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin: 1 {O(1)} 9: evalspeedpldi2returnin->evalspeedpldi2stop: 1 {O(1)} 0: evalspeedpldi2start->evalspeedpldi2entryin: 1 {O(1)} Costbounds: Overall costbound: 6+2*max([0, Arg_0])+max([1, 1+2*Arg_0])+max([0, Arg_0]) {O(n)} 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in: max([0, Arg_0]) {O(n)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in: max([0, Arg_0]) {O(n)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in: max([0, Arg_0]) {O(n)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in: max([1, 1+2*Arg_0]) {O(n)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin: 1 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in: 1 {O(1)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin: 1 {O(1)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin: 1 {O(1)} 9: evalspeedpldi2returnin->evalspeedpldi2stop: 1 {O(1)} 0: evalspeedpldi2start->evalspeedpldi2entryin: 1 {O(1)} Sizebounds: `Lower: 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in, Arg_0: 1 {O(1)} 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in, Arg_1: 0 {O(1)} 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in, Arg_2: 1 {O(1)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in, Arg_0: 1 {O(1)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in, Arg_1: 0 {O(1)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in, Arg_2: 1 {O(1)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in, Arg_0: 1 {O(1)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in, Arg_1: 1 {O(1)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in, Arg_2: 0 {O(1)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in, Arg_0: 1 {O(1)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in, Arg_1: 0 {O(1)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in, Arg_2: 1 {O(1)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin, Arg_0: 1 {O(1)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin, Arg_1: 0 {O(1)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin, Arg_2: 0 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in, Arg_0: 1 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in, Arg_1: 0 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in, Arg_2: 0 {O(1)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_0: Arg_0 {O(n)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_1: Arg_1 {O(n)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_2: Arg_2 {O(n)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_0: Arg_0 {O(n)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_1: Arg_1 {O(n)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_2: Arg_2 {O(n)} 9: evalspeedpldi2returnin->evalspeedpldi2stop, Arg_0: min([1, Arg_0]) {O(n)} 9: evalspeedpldi2returnin->evalspeedpldi2stop, Arg_1: min([0, Arg_1]) {O(n)} 9: evalspeedpldi2returnin->evalspeedpldi2stop, Arg_2: min([0, Arg_2]) {O(n)} 0: evalspeedpldi2start->evalspeedpldi2entryin, Arg_0: Arg_0 {O(n)} 0: evalspeedpldi2start->evalspeedpldi2entryin, Arg_1: Arg_1 {O(n)} 0: evalspeedpldi2start->evalspeedpldi2entryin, Arg_2: Arg_2 {O(n)} `Upper: 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in, Arg_0: Arg_1 {O(n)} 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in, Arg_1: max([0, Arg_0]) {O(n)} 6: evalspeedpldi2bb2in->evalspeedpldi2bb3in, Arg_2: Arg_0 {O(n)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in, Arg_0: Arg_1 {O(n)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in, Arg_1: 0 {O(1)} 7: evalspeedpldi2bb2in->evalspeedpldi2bb5in, Arg_2: Arg_0 {O(n)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in, Arg_0: Arg_1 {O(n)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in, Arg_1: max([0, Arg_0]) {O(n)} 8: evalspeedpldi2bb3in->evalspeedpldi2bb5in, Arg_2: Arg_0 {O(n)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in, Arg_0: Arg_1 {O(n)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in, Arg_1: max([0, Arg_0]) {O(n)} 4: evalspeedpldi2bb5in->evalspeedpldi2bb2in, Arg_2: Arg_0 {O(n)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin, Arg_0: Arg_1 {O(n)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin, Arg_1: max([0, Arg_0]) {O(n)} 5: evalspeedpldi2bb5in->evalspeedpldi2returnin, Arg_2: 0 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in, Arg_0: Arg_1 {O(n)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in, Arg_1: 0 {O(1)} 1: evalspeedpldi2entryin->evalspeedpldi2bb5in, Arg_2: Arg_0 {O(n)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_0: -1 {O(1)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_1: Arg_1 {O(n)} 2: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_2: Arg_2 {O(n)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_0: Arg_0 {O(n)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_1: 0 {O(1)} 3: evalspeedpldi2entryin->evalspeedpldi2returnin, Arg_2: Arg_2 {O(n)} 9: evalspeedpldi2returnin->evalspeedpldi2stop, Arg_0: max([-1, max([Arg_1, Arg_0])]) {O(n)} 9: evalspeedpldi2returnin->evalspeedpldi2stop, Arg_1: max([0, max([Arg_0, Arg_1])]) {O(n)} 9: evalspeedpldi2returnin->evalspeedpldi2stop, Arg_2: max([0, Arg_2]) {O(n)} 0: evalspeedpldi2start->evalspeedpldi2entryin, Arg_0: Arg_0 {O(n)} 0: evalspeedpldi2start->evalspeedpldi2entryin, Arg_1: Arg_1 {O(n)} 0: evalspeedpldi2start->evalspeedpldi2entryin, Arg_2: Arg_2 {O(n)} ---------------------------------------- (2) BOUNDS(1, max(6 + 2 * Arg_0, 6) + max(1, 1 + 2 * Arg_0) + nat(Arg_0)) ---------------------------------------- (3) Loat Proof (FINISHED) ### Pre-processing the ITS problem ### Initial linear ITS problem Start location: evalspeedpldi2start 0: evalspeedpldi2start -> evalspeedpldi2entryin : [], cost: 1 1: evalspeedpldi2entryin -> evalspeedpldi2bb5in : A'=B, B'=0, C'=A, [ A>=0 && B>=1 ], cost: 1 2: evalspeedpldi2entryin -> evalspeedpldi2returnin : [ 0>=1+A ], cost: 1 3: evalspeedpldi2entryin -> evalspeedpldi2returnin : [ 0>=B ], cost: 1 4: evalspeedpldi2bb5in -> evalspeedpldi2bb2in : [ C>=1 ], cost: 1 5: evalspeedpldi2bb5in -> evalspeedpldi2returnin : [ 0>=C ], cost: 1 6: evalspeedpldi2bb2in -> evalspeedpldi2bb3in : [ A>=1+B ], cost: 1 7: evalspeedpldi2bb2in -> evalspeedpldi2bb5in : B'=0, [ B>=A ], cost: 1 8: evalspeedpldi2bb3in -> evalspeedpldi2bb5in : B'=1+B, C'=-1+C, [], cost: 1 9: evalspeedpldi2returnin -> evalspeedpldi2stop : [], cost: 1 Removed unreachable and leaf rules: Start location: evalspeedpldi2start 0: evalspeedpldi2start -> evalspeedpldi2entryin : [], cost: 1 1: evalspeedpldi2entryin -> evalspeedpldi2bb5in : A'=B, B'=0, C'=A, [ A>=0 && B>=1 ], cost: 1 4: evalspeedpldi2bb5in -> evalspeedpldi2bb2in : [ C>=1 ], cost: 1 6: evalspeedpldi2bb2in -> evalspeedpldi2bb3in : [ A>=1+B ], cost: 1 7: evalspeedpldi2bb2in -> evalspeedpldi2bb5in : B'=0, [ B>=A ], cost: 1 8: evalspeedpldi2bb3in -> evalspeedpldi2bb5in : B'=1+B, C'=-1+C, [], cost: 1 ### Simplification by acceleration and chaining ### Eliminated locations (on linear paths): Start location: evalspeedpldi2start 10: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=0, C'=A, [ A>=0 && B>=1 ], cost: 2 4: evalspeedpldi2bb5in -> evalspeedpldi2bb2in : [ C>=1 ], cost: 1 7: evalspeedpldi2bb2in -> evalspeedpldi2bb5in : B'=0, [ B>=A ], cost: 1 11: evalspeedpldi2bb2in -> evalspeedpldi2bb5in : B'=1+B, C'=-1+C, [ A>=1+B ], cost: 2 Eliminated locations (on tree-shaped paths): Start location: evalspeedpldi2start 10: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=0, C'=A, [ A>=0 && B>=1 ], cost: 2 12: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=0, [ C>=1 && B>=A ], cost: 2 13: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=1+B, C'=-1+C, [ C>=1 && A>=1+B ], cost: 3 Accelerating simple loops of location 2. Accelerating the following rules: 12: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=0, [ C>=1 && B>=A ], cost: 2 13: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=1+B, C'=-1+C, [ C>=1 && A>=1+B ], cost: 3 Accelerated rule 12 with NONTERM (after strengthening guard), yielding the new rule 14. Accelerated rule 13 with backward acceleration, yielding the new rule 15. Accelerated rule 13 with backward acceleration, yielding the new rule 16. Removing the simple loops: 13. Accelerated all simple loops using metering functions (where possible): Start location: evalspeedpldi2start 10: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=0, C'=A, [ A>=0 && B>=1 ], cost: 2 12: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=0, [ C>=1 && B>=A ], cost: 2 14: evalspeedpldi2bb5in -> [7] : [ C>=1 && B>=A && 0>=A ], cost: INF 15: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=C+B, C'=0, [ C>=1 && A>=1+B && A>=C+B ], cost: 3*C 16: evalspeedpldi2bb5in -> evalspeedpldi2bb5in : B'=A, C'=C-A+B, [ C>=1 && A>=1+B && 1+C-A+B>=1 ], cost: 3*A-3*B Chained accelerated rules (with incoming rules): Start location: evalspeedpldi2start 10: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=0, C'=A, [ A>=0 && B>=1 ], cost: 2 17: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=A, C'=0, [ B>=1 && A>=1 && B>=A ], cost: 2+3*A 18: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, C'=A-B, [ B>=1 && A>=1 && 1+A-B>=1 ], cost: 2+3*B Removed unreachable locations (and leaf rules with constant cost): Start location: evalspeedpldi2start 17: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=A, C'=0, [ B>=1 && A>=1 && B>=A ], cost: 2+3*A 18: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, C'=A-B, [ B>=1 && A>=1 && 1+A-B>=1 ], cost: 2+3*B ### Computing asymptotic complexity ### Fully simplified ITS problem Start location: evalspeedpldi2start 17: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=A, C'=0, [ B>=1 && A>=1 && B>=A ], cost: 2+3*A 18: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, C'=A-B, [ B>=1 && A>=1 && 1+A-B>=1 ], cost: 2+3*B Computing asymptotic complexity for rule 17 Simplified the guard: 17: evalspeedpldi2start -> evalspeedpldi2bb5in : A'=B, B'=A, C'=0, [ A>=1 && B>=A ], cost: 2+3*A Solved the limit problem by the following transformations: Created initial limit problem: A (+/+!), 1-A+B (+/+!), 2+3*A (+) [not solved] removing all constraints (solved by SMT) resulting limit problem: [solved] applying transformation rule (C) using substitution {A==n,B==n} resulting limit problem: [solved] Solution: A / n B / n Resulting cost 2+3*n has complexity: Poly(n^1) Found new complexity Poly(n^1). Obtained the following overall complexity (w.r.t. the length of the input n): Complexity: Poly(n^1) Cpx degree: 1 Solved cost: 2+3*n Rule cost: 2+3*A Rule guard: [ A>=1 && B>=A ] WORST_CASE(Omega(n^1),?) ---------------------------------------- (4) BOUNDS(n^1, INF)