/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.numbers.gamma;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

/**
 * Tests for {@link LogBeta}.
 */
public class LogBetaTest {
    private static final double[][] LOG_BETA_REF = {
        {0.125, 0.125, 2.750814190409515},
        {0.125, 0.25, 2.444366899981226},
        {0.125, 0.5, 2.230953804989556},
        {0.125, 1.0, 2.079441541679836},
        {0.125, 2.0, 1.961658506023452},
        {0.125, 3.0, 1.901033884207018},
        {0.125, 4.0, 1.860211889686763},
        {0.125, 5.0, 1.829440231020009},
        {0.125, 6.0, 1.804747618429637},
        {0.125, 7.0, 1.784128331226902},
        {0.125, 8.0, 1.766428754127501},
        {0.125, 9.0, 1.750924567591535},
        {0.125, 10.0, 1.7371312454592},
        {0.125, 1000.0, 1.156003642015969},
        {0.125, 1001.0, 1.155878649827818},
        {0.125, 10000.0, .8681312798751318},
        {0.25, 0.125, 2.444366899981226},
        {0.25, 0.25, 2.003680106471455},
        {0.25, 0.5, 1.657106516191482},
        {0.25, 1.0, 1.386294361119891},
        {0.25, 2.0, 1.163150809805681},
        {0.25, 3.0, 1.045367774149297},
        {0.25, 4.0, 0.965325066475761},
        {0.25, 5.0, .9047004446593261},
        {0.25, 6.0, .8559102804898941},
        {0.25, 7.0, 0.815088285969639},
        {0.25, 8.0, .7799969661583689},
        {0.25, 9.0, .7492253074916152},
        {0.25, 10.0, .7218263333035008},
        {0.25, 1000.0, -.4388225372378877},
        {0.25, 1001.0, -.4390725059930951},
        {0.25, 10000.0, -1.014553193217846},
        {0.5, 0.125, 2.230953804989556},
        {0.5, 0.25, 1.657106516191482},
        {0.5, 0.5, 1.1447298858494},
        {0.5, 1.0, .6931471805599453},
        {0.5, 2.0, .2876820724517809},
        {0.5, 3.0, .06453852113757118},
//        {0.5, 4.0, -.08961215868968714},
        {0.5, 5.0, -.2073951943460706},
        {0.5, 6.0, -.3027053741503954},
        {0.5, 7.0, -.3827480818239319},
        {0.5, 8.0, -.4517409533108833},
        {0.5, 9.0, -.5123655751273182},
        {0.5, 10.0, -.5664327963975939},
        {0.5, 1000.0, -2.881387696571577},
        {0.5, 1001.0, -2.881887571613228},
        {0.5, 10000.0, -4.032792743063396},
        {1.0, 0.125, 2.079441541679836},
        {1.0, 0.25, 1.386294361119891},
        {1.0, 0.5, .6931471805599453},
        {1.0, 1.0, 0.0},
        {1.0, 2.0, -.6931471805599453},
        {1.0, 3.0, -1.09861228866811},
        {1.0, 4.0, -1.386294361119891},
        {1.0, 5.0, -1.6094379124341},
        {1.0, 6.0, -1.791759469228055},
        {1.0, 7.0, -1.945910149055313},
        {1.0, 8.0, -2.079441541679836},
        {1.0, 9.0, -2.19722457733622},
        {1.0, 10.0, -2.302585092994046},
        {1.0, 1000.0, -6.907755278982137},
        {1.0, 1001.0, -6.90875477931522},
        {1.0, 10000.0, -9.210340371976184},
        {2.0, 0.125, 1.961658506023452},
        {2.0, 0.25, 1.163150809805681},
        {2.0, 0.5, .2876820724517809},
        {2.0, 1.0, -.6931471805599453},
        {2.0, 2.0, -1.791759469228055},
        {2.0, 3.0, -2.484906649788},
        {2.0, 4.0, -2.995732273553991},
        {2.0, 5.0, -3.401197381662155},
        {2.0, 6.0, -3.737669618283368},
        {2.0, 7.0, -4.02535169073515},
        {2.0, 8.0, -4.276666119016055},
        {2.0, 9.0, -4.499809670330265},
        {2.0, 10.0, -4.700480365792417},
        {2.0, 1000.0, -13.81651005829736},
        {2.0, 1001.0, -13.81850806096003},
        {2.0, 10000.0, -18.4207807389527},
        {3.0, 0.125, 1.901033884207018},
        {3.0, 0.25, 1.045367774149297},
        {3.0, 0.5, .06453852113757118},
        {3.0, 1.0, -1.09861228866811},
        {3.0, 2.0, -2.484906649788},
        {3.0, 3.0, -3.401197381662155},
        {3.0, 4.0, -4.0943445622221},
        {3.0, 5.0, -4.653960350157523},
        {3.0, 6.0, -5.123963979403259},
        {3.0, 7.0, -5.529429087511423},
        {3.0, 8.0, -5.886104031450156},
        {3.0, 9.0, -6.20455776256869},
        {3.0, 10.0, -6.492239835020471},
        {3.0, 1000.0, -20.03311615938222},
        {3.0, 1001.0, -20.03611166836202},
        {3.0, 10000.0, -26.9381739103716},
        {4.0, 0.125, 1.860211889686763},
        {4.0, 0.25, 0.965325066475761},
//        {4.0, 0.5, -.08961215868968714},
        {4.0, 1.0, -1.386294361119891},
        {4.0, 2.0, -2.995732273553991},
        {4.0, 3.0, -4.0943445622221},
        {4.0, 4.0, -4.941642422609304},
        {4.0, 5.0, -5.634789603169249},
        {4.0, 6.0, -6.222576268071369},
        {4.0, 7.0, -6.733401891837359},
        {4.0, 8.0, -7.185387015580416},
        {4.0, 9.0, -7.590852123688581},
        {4.0, 10.0, -7.958576903813898},
        {4.0, 1000.0, -25.84525465867605},
        {4.0, 1001.0, -25.84924667994559},
        {4.0, 10000.0, -35.05020194868867},
        {5.0, 0.125, 1.829440231020009},
        {5.0, 0.25, .9047004446593261},
        {5.0, 0.5, -.2073951943460706},
        {5.0, 1.0, -1.6094379124341},
        {5.0, 2.0, -3.401197381662155},
        {5.0, 3.0, -4.653960350157523},
        {5.0, 4.0, -5.634789603169249},
        {5.0, 5.0, -6.445719819385578},
        {5.0, 6.0, -7.138866999945524},
        {5.0, 7.0, -7.745002803515839},
        {5.0, 8.0, -8.283999304248526},
        {5.0, 9.0, -8.769507120030227},
        {5.0, 10.0, -9.211339872309265},
        {5.0, 1000.0, -31.37070759780783},
        {5.0, 1001.0, -31.37569513931887},
        {5.0, 10000.0, -42.87464787956629},
        {6.0, 0.125, 1.804747618429637},
        {6.0, 0.25, .8559102804898941},
        {6.0, 0.5, -.3027053741503954},
        {6.0, 1.0, -1.791759469228055},
        {6.0, 2.0, -3.737669618283368},
        {6.0, 3.0, -5.123963979403259},
        {6.0, 4.0, -6.222576268071369},
        {6.0, 5.0, -7.138866999945524},
        {6.0, 6.0, -7.927324360309794},
        {6.0, 7.0, -8.620471540869739},
        {6.0, 8.0, -9.239510749275963},
        {6.0, 9.0, -9.799126537211386},
        {6.0, 10.0, -10.30995216097738},
        {6.0, 1000.0, -36.67401250586691},
        {6.0, 1001.0, -36.67999457754446},
        {6.0, 10000.0, -50.47605021415003},
        {7.0, 0.125, 1.784128331226902},
        {7.0, 0.25, 0.815088285969639},
        {7.0, 0.5, -.3827480818239319},
        {7.0, 1.0, -1.945910149055313},
        {7.0, 2.0, -4.02535169073515},
        {7.0, 3.0, -5.529429087511423},
        {7.0, 4.0, -6.733401891837359},
        {7.0, 5.0, -7.745002803515839},
        {7.0, 6.0, -8.620471540869739},
        {7.0, 7.0, -9.39366142910322},
        {7.0, 8.0, -10.08680860966317},
        {7.0, 9.0, -10.71541726908554},
        {7.0, 10.0, -11.2907814139891},
        {7.0, 1000.0, -41.79599038729854},
        {7.0, 1001.0, -41.80296600103496},
        {7.0, 10000.0, -57.89523093697012},
        {8.0, 0.125, 1.766428754127501},
        {8.0, 0.25, .7799969661583689},
        {8.0, 0.5, -.4517409533108833},
        {8.0, 1.0, -2.079441541679836},
        {8.0, 2.0, -4.276666119016055},
        {8.0, 3.0, -5.886104031450156},
        {8.0, 4.0, -7.185387015580416},
        {8.0, 5.0, -8.283999304248526},
        {8.0, 6.0, -9.239510749275963},
        {8.0, 7.0, -10.08680860966317},
        {8.0, 8.0, -10.84894866171006},
        {8.0, 9.0, -11.54209584227001},
        {8.0, 10.0, -12.17808460899001},
        {8.0, 1000.0, -46.76481113096179},
        {8.0, 1001.0, -46.77277930061096},
        {8.0, 10000.0, -65.16036091500527},
        {9.0, 0.125, 1.750924567591535},
        {9.0, 0.25, .7492253074916152},
        {9.0, 0.5, -.5123655751273182},
        {9.0, 1.0, -2.19722457733622},
        {9.0, 2.0, -4.499809670330265},
        {9.0, 3.0, -6.20455776256869},
        {9.0, 4.0, -7.590852123688581},
        {9.0, 5.0, -8.769507120030227},
        {9.0, 6.0, -9.799126537211386},
        {9.0, 7.0, -10.71541726908554},
        {9.0, 8.0, -11.54209584227001},
        {9.0, 9.0, -12.29586764464639},
        {9.0, 10.0, -12.98901482520633},
        {9.0, 1000.0, -51.60109303791327},
        {9.0, 1001.0, -51.61005277928474},
        {9.0, 10000.0, -72.29205942547217},
        {10.0, 0.125, 1.7371312454592},
        {10.0, 0.25, .7218263333035008},
        {10.0, 0.5, -.5664327963975939},
        {10.0, 1.0, -2.302585092994046},
        {10.0, 2.0, -4.700480365792417},
        {10.0, 3.0, -6.492239835020471},
        {10.0, 4.0, -7.958576903813898},
        {10.0, 5.0, -9.211339872309265},
        {10.0, 6.0, -10.30995216097738},
        {10.0, 7.0, -11.2907814139891},
        {10.0, 8.0, -12.17808460899001},
        {10.0, 9.0, -12.98901482520633},
        {10.0, 10.0, -13.73622922703655},
        {10.0, 1000.0, -56.32058348093065},
        {10.0, 1001.0, -56.33053381178382},
        {10.0, 10000.0, -79.30607481535498},
        {1000.0, 0.125, 1.156003642015969},
        {1000.0, 0.25, -.4388225372378877},
        {1000.0, 0.5, -2.881387696571577},
        {1000.0, 1.0, -6.907755278982137},
        {1000.0, 2.0, -13.81651005829736},
        {1000.0, 3.0, -20.03311615938222},
        {1000.0, 4.0, -25.84525465867605},
        {1000.0, 5.0, -31.37070759780783},
        {1000.0, 6.0, -36.67401250586691},
        {1000.0, 7.0, -41.79599038729854},
        {1000.0, 8.0, -46.76481113096179},
        {1000.0, 9.0, -51.60109303791327},
        {1000.0, 10.0, -56.32058348093065},
        {1000.0, 1000.0, -1388.482601635902},
        {1000.0, 1001.0, -1389.175748816462},
        {1000.0, 10000.0, -3353.484270767097},
        {1001.0, 0.125, 1.155878649827818},
        {1001.0, 0.25, -.4390725059930951},
        {1001.0, 0.5, -2.881887571613228},
        {1001.0, 1.0, -6.90875477931522},
        {1001.0, 2.0, -13.81850806096003},
        {1001.0, 3.0, -20.03611166836202},
        {1001.0, 4.0, -25.84924667994559},
        {1001.0, 5.0, -31.37569513931887},
        {1001.0, 6.0, -36.67999457754446},
        {1001.0, 7.0, -41.80296600103496},
        {1001.0, 8.0, -46.77277930061096},
        {1001.0, 9.0, -51.61005277928474},
        {1001.0, 10.0, -56.33053381178382},
        {1001.0, 1000.0, -1389.175748816462},
        {1001.0, 1001.0, -1389.869395872064},
        {1001.0, 10000.0, -3355.882166039895},
        {10000.0, 0.125, .8681312798751318},
        {10000.0, 0.25, -1.014553193217846},
        {10000.0, 0.5, -4.032792743063396},
        {10000.0, 1.0, -9.210340371976184},
        {10000.0, 2.0, -18.4207807389527},
        {10000.0, 3.0, -26.9381739103716},
        {10000.0, 4.0, -35.05020194868867},
        {10000.0, 5.0, -42.87464787956629},
        {10000.0, 6.0, -50.47605021415003},
        {10000.0, 7.0, -57.89523093697012},
        {10000.0, 8.0, -65.16036091500527},
        {10000.0, 9.0, -72.29205942547217},
        {10000.0, 10.0, -79.30607481535498},
        {10000.0, 1000.0, -3353.484270767097},
        {10000.0, 1001.0, -3355.882166039895},
        {10000.0, 10000.0, -13866.28325676141},
    };

    private static final double[][] LOG_GAMMA_MINUS_LOG_GAMMA_SUM_REF = {
//          { 0.0 , 8.0 , 0.0 },
//          { 0.0 , 9.0 , 0.0 },
        {0.0, 10.0, 0.0},
        {0.0, 11.0, 0.0},
        {0.0, 12.0, 0.0},
        {0.0, 13.0, 0.0},
        {0.0, 14.0, 0.0},
        {0.0, 15.0, 0.0},
        {0.0, 16.0, 0.0},
        {0.0, 17.0, 0.0},
        {0.0, 18.0, 0.0},
//        {1.0, 8.0, -2.079441541679836},
//        {1.0, 9.0, -2.19722457733622},
        {1.0, 10.0, -2.302585092994046},
        {1.0, 11.0, -2.397895272798371},
        {1.0, 12.0, -2.484906649788},
        {1.0, 13.0, -2.564949357461537},
        {1.0, 14.0, -2.639057329615258},
        {1.0, 15.0, -2.70805020110221},
        {1.0, 16.0, -2.772588722239781},
        {1.0, 17.0, -2.833213344056216},
        {1.0, 18.0, -2.890371757896165},
//        {2.0, 8.0, -4.276666119016055},
//        {2.0, 9.0, -4.499809670330265},
        {2.0, 10.0, -4.700480365792417},
        {2.0, 11.0, -4.882801922586371},
        {2.0, 12.0, -5.049856007249537},
        {2.0, 13.0, -5.204006687076795},
        {2.0, 14.0, -5.347107530717468},
        {2.0, 15.0, -5.480638923341991},
        {2.0, 16.0, -5.605802066295998},
        {2.0, 17.0, -5.723585101952381},
        {2.0, 18.0, -5.834810737062605},
//        {3.0, 8.0, -6.579251212010101},
//        {3.0, 9.0, -6.897704943128636},
        {3.0, 10.0, -7.185387015580416},
        {3.0, 11.0, -7.447751280047908},
        {3.0, 12.0, -7.688913336864796},
        {3.0, 13.0, -7.912056888179006},
        {3.0, 14.0, -8.11969625295725},
        {3.0, 15.0, -8.313852267398207},
        {3.0, 16.0, -8.496173824192162},
        {3.0, 17.0, -8.668024081118821},
        {3.0, 18.0, -8.830543010616596},
//        {4.0, 8.0, -8.977146484808472},
//        {4.0, 9.0, -9.382611592916636},
        {4.0, 10.0, -9.750336373041954},
        {4.0, 11.0, -10.08680860966317},
        {4.0, 12.0, -10.39696353796701},
        {4.0, 13.0, -10.68464561041879},
        {4.0, 14.0, -10.95290959701347},
        {4.0, 15.0, -11.20422402529437},
        {4.0, 16.0, -11.4406128033586},
        {4.0, 17.0, -11.66375635467281},
        {4.0, 18.0, -11.87506544834002},
//        {5.0, 8.0, -11.46205313459647},
//        {5.0, 9.0, -11.94756095037817},
        {5.0, 10.0, -12.38939370265721},
        {5.0, 11.0, -12.79485881076538},
        {5.0, 12.0, -13.16955226020679},
        {5.0, 13.0, -13.517858954475},
        {5.0, 14.0, -13.84328135490963},
        {5.0, 15.0, -14.14866300446081},
        {5.0, 16.0, -14.43634507691259},
        {5.0, 17.0, -14.70827879239624},
        {5.0, 18.0, -14.96610790169833},
//        {6.0, 8.0, -14.02700249205801},
//        {6.0, 9.0, -14.58661827999343},
        {6.0, 10.0, -15.09744390375942},
        {6.0, 11.0, -15.56744753300516},
        {6.0, 12.0, -16.002765604263},
        {6.0, 13.0, -16.40823071237117},
        {6.0, 14.0, -16.78772033407607},
        {6.0, 15.0, -17.14439527801481},
        {6.0, 16.0, -17.48086751463602},
        {6.0, 17.0, -17.79932124575455},
        {6.0, 18.0, -18.10160211762749},
//        {7.0, 8.0, -16.66605982167327},
//        {7.0, 9.0, -17.29466848109564},
        {7.0, 10.0, -17.8700326259992},
        {7.0, 11.0, -18.40066087706137},
        {7.0, 12.0, -18.89313736215917},
        {7.0, 13.0, -19.35266969153761},
        {7.0, 14.0, -19.78345260763006},
        {7.0, 15.0, -20.18891771573823},
        {7.0, 16.0, -20.57190996799433},
        {7.0, 17.0, -20.9348154616837},
        {7.0, 18.0, -21.27965594797543},
//        {8.0, 8.0, -19.37411002277548},
//        {8.0, 9.0, -20.06725720333542},
        {8.0, 10.0, -20.70324597005542},
        {8.0, 11.0, -21.29103263495754},
        {8.0, 12.0, -21.83757634132561},
        {8.0, 13.0, -22.3484019650916},
        {8.0, 14.0, -22.82797504535349},
        {8.0, 15.0, -23.27996016909654},
        {8.0, 16.0, -23.70740418392348},
        {8.0, 17.0, -24.11286929203165},
        {8.0, 18.0, -24.49853177284363},
//        {9.0, 8.0, -22.14669874501526},
//        {9.0, 9.0, -22.90047054739164},
        {9.0, 10.0, -23.59361772795159},
        {9.0, 11.0, -24.23547161412398},
        {9.0, 12.0, -24.8333086148796},
        {9.0, 13.0, -25.39292440281502},
        {9.0, 14.0, -25.9190174987118},
        {9.0, 15.0, -26.41545438502569},
        {9.0, 16.0, -26.88545801427143},
        {9.0, 17.0, -27.33174511689985},
        {9.0, 18.0, -27.75662831086511},
//        {10.0, 8.0, -24.97991208907148},
//        {10.0, 9.0, -25.7908423052878},
        {10.0, 10.0, -26.53805670711802},
        {10.0, 11.0, -27.23120388767797},
        {10.0, 12.0, -27.87783105260302},
        {10.0, 13.0, -28.48396685617334},
        {10.0, 14.0, -29.05451171464095},
        {10.0, 15.0, -29.59350821537364},
        {10.0, 16.0, -30.10433383913963},
        {10.0, 17.0, -30.58984165492133},
        {10.0, 18.0, -31.05246517686944},
    };

    private static final double[][] SUM_DELTA_MINUS_DELTA_SUM_REF = {
        {10.0, 10.0, .01249480717472882},
        {10.0, 11.0, .01193628470267385},
        {10.0, 12.0, .01148578547212797},
        {10.0, 13.0, .01111659739668398},
        {10.0, 14.0, .01080991216314295},
        {10.0, 15.0, .01055214134859758},
        {10.0, 16.0, .01033324912491747},
        {10.0, 17.0, .01014568069918883},
        {10.0, 18.0, .009983653199146491},
        {10.0, 19.0, .009842674320242729},
        {10.0, 20.0, 0.0097192081956071},
        {11.0, 10.0, .01193628470267385},
        {11.0, 11.0, .01135973290745925},
        {11.0, 12.0, .01089355537047828},
        {11.0, 13.0, .01051064829297728},
        {11.0, 14.0, 0.0101918899639826},
        {11.0, 15.0, .009923438811859604},
        {11.0, 16.0, .009695052724952705},
        {11.0, 17.0, 0.00949900745283617},
        {11.0, 18.0, .009329379874933402},
        {11.0, 19.0, 0.00918156080743147},
        {11.0, 20.0, 0.00905191635141762},
        {12.0, 10.0, .01148578547212797},
        {12.0, 11.0, .01089355537047828},
        {12.0, 12.0, .01041365883144029},
        {12.0, 13.0, .01001867865848564},
        {12.0, 14.0, 0.00968923999191334},
        {12.0, 15.0, .009411294976563555},
        {12.0, 16.0, .009174432043268762},
        {12.0, 17.0, .008970786693291802},
        {12.0, 18.0, .008794318926790865},
        {12.0, 19.0, .008640321527910711},
        {12.0, 20.0, .008505077879954796},
        {13.0, 10.0, .01111659739668398},
        {13.0, 11.0, .01051064829297728},
        {13.0, 12.0, .01001867865848564},
        {13.0, 13.0, .009613018147953376},
        {13.0, 14.0, .009274085618154277},
        {13.0, 15.0, 0.0089876637564166},
        {13.0, 16.0, .008743200745261382},
        {13.0, 17.0, .008532715206686251},
        {13.0, 18.0, .008350069108807093},
        {13.0, 19.0, .008190472517984874},
        {13.0, 20.0, .008050138630244345},
        {14.0, 10.0, .01080991216314295},
        {14.0, 11.0, 0.0101918899639826},
        {14.0, 12.0, 0.00968923999191334},
        {14.0, 13.0, .009274085618154277},
        {14.0, 14.0, .008926676241967286},
        {14.0, 15.0, .008632654302369184},
        {14.0, 16.0, .008381351102615795},
        {14.0, 17.0, .008164687232662443},
        {14.0, 18.0, .007976441942841219},
        {14.0, 19.0, .007811755112234388},
        {14.0, 20.0, .007666780069317652},
        {15.0, 10.0, .01055214134859758},
        {15.0, 11.0, .009923438811859604},
        {15.0, 12.0, .009411294976563555},
        {15.0, 13.0, 0.0089876637564166},
        {15.0, 14.0, .008632654302369184},
        {15.0, 15.0, 0.00833179217417291},
        {15.0, 16.0, .008074310643041299},
        {15.0, 17.0, .007852047581145882},
        {15.0, 18.0, .007658712051540045},
        {15.0, 19.0, .007489384065757007},
        {15.0, 20.0, .007340165635725612},
        {16.0, 10.0, .01033324912491747},
        {16.0, 11.0, .009695052724952705},
        {16.0, 12.0, .009174432043268762},
        {16.0, 13.0, .008743200745261382},
        {16.0, 14.0, .008381351102615795},
        {16.0, 15.0, .008074310643041299},
        {16.0, 16.0, .007811229919967624},
        {16.0, 17.0, .007583876618287594},
        {16.0, 18.0, .007385899933505551},
        {16.0, 19.0, .007212328560607852},
        {16.0, 20.0, .007059220321091879},
        {17.0, 10.0, .01014568069918883},
        {17.0, 11.0, 0.00949900745283617},
        {17.0, 12.0, .008970786693291802},
        {17.0, 13.0, .008532715206686251},
        {17.0, 14.0, .008164687232662443},
        {17.0, 15.0, .007852047581145882},
        {17.0, 16.0, .007583876618287594},
        {17.0, 17.0, .007351882161431358},
        {17.0, 18.0, .007149662089534654},
        {17.0, 19.0, .006972200907152378},
        {17.0, 20.0, .006815518216094137},
        {18.0, 10.0, .009983653199146491},
        {18.0, 11.0, .009329379874933402},
        {18.0, 12.0, .008794318926790865},
        {18.0, 13.0, .008350069108807093},
        {18.0, 14.0, .007976441942841219},
        {18.0, 15.0, .007658712051540045},
        {18.0, 16.0, .007385899933505551},
        {18.0, 17.0, .007149662089534654},
        {18.0, 18.0, .006943552208153373},
        {18.0, 19.0, .006762516574228829},
        {18.0, 20.0, .006602541598043117},
        {19.0, 10.0, .009842674320242729},
        {19.0, 11.0, 0.00918156080743147},
        {19.0, 12.0, .008640321527910711},
        {19.0, 13.0, .008190472517984874},
        {19.0, 14.0, .007811755112234388},
        {19.0, 15.0, .007489384065757007},
        {19.0, 16.0, .007212328560607852},
        {19.0, 17.0, .006972200907152378},
        {19.0, 18.0, .006762516574228829},
        {19.0, 19.0, .006578188655176814},
        {19.0, 20.0, .006415174623476747},
        {20.0, 10.0, 0.0097192081956071},
        {20.0, 11.0, 0.00905191635141762},
        {20.0, 12.0, .008505077879954796},
        {20.0, 13.0, .008050138630244345},
        {20.0, 14.0, .007666780069317652},
        {20.0, 15.0, .007340165635725612},
        {20.0, 16.0, .007059220321091879},
        {20.0, 17.0, .006815518216094137},
        {20.0, 18.0, .006602541598043117},
        {20.0, 19.0, .006415174623476747},
        {20.0, 20.0, .006249349445691423},
    };

    @Test
    public void testLogBeta() {
        final int ulps = 3;
        for (int i = 0; i < LOG_BETA_REF.length; i++) {
            final double[] ref = LOG_BETA_REF[i];
            final double a = ref[0];
            final double b = ref[1];
            final double expected = ref[2];
            final double actual = LogBeta.value(a, b);
            final double tol = ulps * Math.ulp(expected);
            final StringBuilder builder = new StringBuilder();
            builder.append(a).append(", ").append(b);
            Assertions.assertEquals(expected, actual, tol, builder.toString());
        }
    }

    @Test
    public void testLogBetaNanPositive() {
        testLogBeta(Double.NaN, Double.NaN, 2);
    }

    @Test
    public void testLogBetaPositiveNan() {
        testLogBeta(Double.NaN, 1, Double.NaN);
    }

    @Test
    public void testLogBetaNegativePositive() {
        testLogBeta(Double.NaN, -1, 2);
    }

    @Test
    public void testLogBetaPositiveNegative() {
        testLogBeta(Double.NaN, 1, -2);
    }

    @Test
    public void testLogBetaZeroPositive() {
        testLogBeta(Double.NaN, 0, 2);
    }

    @Test
    public void testLogBetaPositiveZero() {
        testLogBeta(Double.NaN, 1, 0);
    }

    @Test
    public void testLogBetaPositivePositive() {
        testLogBeta(-0.693147180559945, 1, 2);
    }

    private void testLogBeta(double expected,
                             double a,
                             double b) {
        double actual = LogBeta.value(a, b);
        Assertions.assertEquals(expected, actual, 1e-15);
    }

    private static double logGammaMinusLogGammaSum(final double a,
                                                   final double b) {
        /*
         * Use reflection to access private method.
         */
        try {
            final Method m = LogBeta.class.getDeclaredMethod("logGammaMinusLogGammaSum",
                                                             Double.TYPE, Double.TYPE);
            m.setAccessible(true);
            return ((Double) m.invoke(null, a, b)).doubleValue();
        } catch (NoSuchMethodException e) {
            Assertions.fail(e.getMessage());
        } catch (IllegalAccessException e) {
            Assertions.fail(e.getMessage());
        } catch (InvocationTargetException e) {
            if (e.getTargetException() instanceof GammaException) {
                throw (GammaException) e.getTargetException();
            } else {
                Assertions.fail(e.getTargetException().getMessage());
            }
        }
        return Double.NaN;
    }

    @Test
    public void testLogGammaMinusLogGammaSum() {
        final int ulps = 4;
        for (int i = 0; i < LOG_GAMMA_MINUS_LOG_GAMMA_SUM_REF.length; i++) {
            final double[] ref = LOG_GAMMA_MINUS_LOG_GAMMA_SUM_REF[i];
            final double a = ref[0];
            final double b = ref[1];
            final double expected = ref[2];
            final double actual = logGammaMinusLogGammaSum(a, b);
            final double tol = ulps * Math.ulp(expected);
            final StringBuilder builder = new StringBuilder();
            builder.append(a).append(", ").append(b);
            Assertions.assertEquals(expected, actual, tol, builder.toString());
        }
    }

    @Test
    public void testLogGammaMinusLogGammaSumPrecondition1() {
        Assertions.assertThrows(IllegalArgumentException.class,
            () -> logGammaMinusLogGammaSum(-1, 8)
        );
    }

    @Test
    public void testLogGammaMinusLogGammaSumPrecondition2() {
        Assertions.assertThrows(IllegalArgumentException.class,
            () -> logGammaMinusLogGammaSum(1, 7)
        );
    }

    private static double sumDeltaMinusDeltaSum(final double a,
                                                final double b) {

        /*
         * Use reflection to access private method.
         */
        try {
            final Method m = LogBeta.class.getDeclaredMethod("sumDeltaMinusDeltaSum",
                                                             Double.TYPE, Double.TYPE);
            m.setAccessible(true);
            return ((Double) m.invoke(null, a, b)).doubleValue();
        } catch (NoSuchMethodException e) {
            Assertions.fail(e.getMessage());
        } catch (final IllegalAccessException e) {
            Assertions.fail(e.getMessage());
        } catch (final InvocationTargetException e) {
            if (e.getTargetException() instanceof GammaException) {
                throw (GammaException) e.getTargetException();
            }
            Assertions.fail(e.getTargetException().getMessage());
        }

        return Double.NaN;
    }

    @Test
    public void testSumDeltaMinusDeltaSum() {
        final int ulps = 3;
        for (int i = 0; i < SUM_DELTA_MINUS_DELTA_SUM_REF.length; i++) {
            final double[] ref = SUM_DELTA_MINUS_DELTA_SUM_REF[i];
            final double a = ref[0];
            final double b = ref[1];
            final double expected = ref[2];
            final double actual = sumDeltaMinusDeltaSum(a, b);
            final double tol = ulps * Math.ulp(expected);
            final StringBuilder builder = new StringBuilder();
            builder.append(a).append(", ").append(b);
            Assertions.assertEquals(expected, actual, tol, builder.toString());
        }
    }

    @Test
    public void testSumDeltaMinusDeltaSumPrecondition1() {
        Assertions.assertThrows(IllegalArgumentException.class,
            () -> sumDeltaMinusDeltaSum(9, 10)
        );
    }

    @Test
    public void testSumDeltaMinusDeltaSumPrecondition2() {
        Assertions.assertThrows(IllegalArgumentException.class,
            () -> sumDeltaMinusDeltaSum(10, 9)
        );
    }
}
