app/Services/ChartService.php
public function sosaStradonitzAncestors(Individual $individual, int $generations): Collection
    {
        $ancestors = [1 => $individual];

        $queue = [1];

        $max = 2 ** ($generations - 1);

        while (!empty($queue)) {
            $sosa_stradonitz_number = array_shift($queue);

            if ($sosa_stradonitz_number >= $max) {
                break;
            }

            $family = $ancestors[$sosa_stradonitz_number]->primaryChildFamily();

            if ($family instanceof Family) {
                if ($family->husband() instanceof Individual) {
                    $ancestors[$sosa_stradonitz_number * 2] = $family->husband();
                    $queue[] = $sosa_stradonitz_number * 2;
                }

                if ($family->wife() instanceof Individual) {
                    $ancestors[$sosa_stradonitz_number * 2 + 1] = $family->wife();
                    $queue[] = $sosa_stradonitz_number * 2 + 1;
                }
            }
        }

        return new Collection($ancestors);
    }
public function sosaStradonitzAncestors(Individual $individual, int $generations): Collection
    {
        $ancestors = [1 => $individual];

        $queue = [1];

        $max = 2 ** ($generations - 1);

        while (!empty($queue)) {
            $sosa_stradonitz_number = array_shift($queue);

            if ($sosa_stradonitz_number >= $max) {
                break;
            }

            $family = $ancestors[$sosa_stradonitz_number]->primaryChildFamily();

            if ($family instanceof Family) {
                if ($family->husband() instanceof Individual) {
                    $ancestors[$sosa_stradonitz_number * 2] = $family->husband();
                    $queue[] = $sosa_stradonitz_number * 2;
                }

                if ($family->wife() instanceof Individual) {
                    $ancestors[$sosa_stradonitz_number * 2 + 1] = $family->wife();
                    $queue[] = $sosa_stradonitz_number * 2 + 1;
                }
            }
        }

        return new Collection($ancestors);
    }
public function sosaStradonitzAncestors ( Individual $ individual , int $ generations ) : Collection { $ ancestors = [ 1 => $ individual ] ; $ queue = [ 1 ] ; $ max = 2 ** ( $ generations - 1 ) ; while ( ! empty ( $ queue ) ) { $ sosa_stradonitz_number = array_shift ( $ queue ) ; if ( $ sosa_stradonitz_number >= $ max ) { break ; } $ family = $ ancestors [ $ sosa_stradonitz_number ] -> primaryChildFamily ( ) ; if ( $ family instanceof Family ) { if ( $ family -> husband ( ) instanceof Individual ) { $ ancestors [ $ sosa_stradonitz_number * 2 ] = $ family -> husband ( ) ; $ queue [ ] = $ sosa_stradonitz_number * 2 ; } if ( $ family -> wife ( ) instanceof Individual ) { $ ancestors [ $ sosa_stradonitz_number * 2 + 1 ] = $ family -> wife ( ) ; $ queue [ ] = $ sosa_stradonitz_number * 2 + 1 ; } } } return new Collection ( $ ancestors ) ; }
Find the ancestors of an individual, indexed by their Sosa-Stradonitz number.

@param Individual $individual  Start with this individual
@param int        $generations Fetch this number of generations

@return Collection
@return Individual[]
Find the ancestors of an individual indexed by their Sosa - Stradonitz number .