Overview

Namespaces

  • Chippyash
    • Math
      • Matrix
        • Attribute
        • Computation
          • Add
          • Div
          • Mul
          • Sub
        • Decomposition
        • Derivative
          • Strategy
            • Determinant
        • Exceptions
        • Formatter
          • DirectedGraph
        • Interfaces
        • Special
        • Traits
        • Transformation
          • Strategy
            • Invert

Classes

  • Chippyash\Math\Matrix\Attribute\IsComplex
  • Chippyash\Math\Matrix\Attribute\IsIdentity
  • Chippyash\Math\Matrix\Attribute\IsMarkov
  • Chippyash\Math\Matrix\Attribute\IsNonsingular
  • Chippyash\Math\Matrix\Attribute\IsNumeric
  • Chippyash\Math\Matrix\Attribute\IsRational
  • Chippyash\Math\Matrix\ComplexMatrix
  • Chippyash\Math\Matrix\Computation\AbstractComputation
  • Chippyash\Math\Matrix\Computation\AbstractEntryWiseComputation
  • Chippyash\Math\Matrix\Computation\Add\Matrix
  • Chippyash\Math\Matrix\Computation\Add\Scalar
  • Chippyash\Math\Matrix\Computation\Div\Entrywise
  • Chippyash\Math\Matrix\Computation\Div\Matrix
  • Chippyash\Math\Matrix\Computation\Div\Scalar
  • Chippyash\Math\Matrix\Computation\Mul\Entrywise
  • Chippyash\Math\Matrix\Computation\Mul\Matrix
  • Chippyash\Math\Matrix\Computation\Mul\Scalar
  • Chippyash\Math\Matrix\Computation\Sub\Matrix
  • Chippyash\Math\Matrix\Computation\Sub\Scalar
  • Chippyash\Math\Matrix\Decomposition\AbstractDecomposition
  • Chippyash\Math\Matrix\Decomposition\GaussJordanElimination
  • Chippyash\Math\Matrix\Decomposition\Lu
  • Chippyash\Math\Matrix\Derivative\AbstractDerivative
  • Chippyash\Math\Matrix\Derivative\Determinant
  • Chippyash\Math\Matrix\Derivative\MarkovWeightedRandom
  • Chippyash\Math\Matrix\Derivative\Strategy\Determinant\Laplace
  • Chippyash\Math\Matrix\Derivative\Strategy\Determinant\Lu
  • Chippyash\Math\Matrix\Derivative\Sum
  • Chippyash\Math\Matrix\Derivative\Trace
  • Chippyash\Math\Matrix\Exceptions\ComputationException
  • Chippyash\Math\Matrix\Exceptions\MathMatrixException
  • Chippyash\Math\Matrix\Exceptions\NoInverseException
  • Chippyash\Math\Matrix\Exceptions\NotMarkovException
  • Chippyash\Math\Matrix\Exceptions\SingularMatrixException
  • Chippyash\Math\Matrix\Exceptions\UndefinedComputationException
  • Chippyash\Math\Matrix\Formatter\AsciiNumeric
  • Chippyash\Math\Matrix\Formatter\DirectedGraph
  • Chippyash\Math\Matrix\Formatter\DirectedGraph\VertexDescription
  • Chippyash\Math\Matrix\FunctionMatrix
  • Chippyash\Math\Matrix\IdentityMatrix
  • Chippyash\Math\Matrix\MatrixFactory
  • Chippyash\Math\Matrix\NumericMatrix
  • Chippyash\Math\Matrix\RationalMatrix
  • Chippyash\Math\Matrix\ShiftMatrix
  • Chippyash\Math\Matrix\Special\AbstractSpecial
  • Chippyash\Math\Matrix\Special\Cauchy
  • Chippyash\Math\Matrix\Special\Chebspsec
  • Chippyash\Math\Matrix\Special\Functional
  • Chippyash\Math\Matrix\Special\Identity
  • Chippyash\Math\Matrix\Special\Ones
  • Chippyash\Math\Matrix\Special\Zeros
  • Chippyash\Math\Matrix\SpecialMatrix
  • Chippyash\Math\Matrix\Transformation\Invert
  • Chippyash\Math\Matrix\Transformation\MarkovRandomWalk
  • Chippyash\Math\Matrix\Transformation\Strategy\Invert\Determinant
  • Chippyash\Math\Matrix\ZeroMatrix

Interfaces

  • Chippyash\Math\Matrix\Interfaces\ComputatationInterface
  • Chippyash\Math\Matrix\Interfaces\DecompositionInterface
  • Chippyash\Math\Matrix\Interfaces\DerivativeInterface
  • Chippyash\Math\Matrix\Interfaces\DeterminantStrategyInterface
  • Chippyash\Math\Matrix\Interfaces\InversionStrategyInterface
  • Chippyash\Math\Matrix\Interfaces\TuningInterface
  • Chippyash\Math\Matrix\Special\SpecialMatrixInterface

Traits

  • Chippyash\Math\Matrix\Traits\AssertMatrixIsNonSingular
  • Chippyash\Math\Matrix\Traits\AssertMatrixIsNumeric
  • Chippyash\Math\Matrix\Traits\AssertMatrixIsRational
  • Chippyash\Math\Matrix\Traits\AssertParameterIsNotString
  • Chippyash\Math\Matrix\Traits\AssertParameterIsRationalMatrix
  • Chippyash\Math\Matrix\Traits\AssertParameterIsRationalNumber
  • Chippyash\Math\Matrix\Traits\ConvertNumberToComplex
  • Chippyash\Math\Matrix\Traits\ConvertNumberToNumeric
  • Chippyash\Math\Matrix\Traits\ConvertNumberToRational
  • Chippyash\Math\Matrix\Traits\CreateCorrectMatrixType
  • Chippyash\Math\Matrix\Traits\CreateCorrectScalarType
  • Overview
  • Namespace
  • Class
  • Tree
 1:  2:  3:  4:  5:  6:  7:  8:  9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 
<?php
/*
 * Math-Matrix library
 *
 * @author Ashley Kitson <akitson@zf4.biz>
 * @copyright Ashley Kitson, UK, 2016
 * @licence GPL V3 or later : http://www.gnu.org/licenses/gpl.html
 * @link http://en.wikipedia.org/wiki/Matrix_(mathematics)
 */
namespace Chippyash\Math\Matrix\Formatter;

use Assembler\FFor;
use Chippyash\Math\Matrix\NumericMatrix;
use Chippyash\Math\Type\Comparator;
use Chippyash\Matrix\Interfaces\FormatterInterface;
use Chippyash\Matrix\Matrix;
use Chippyash\Type\TypeFactory;
use Graphp\GraphViz\GraphViz;
use Fhaculty\Graph\Graph;
use Monad\Collection;

/**
 * Create a Graphviz directed graph definition
 */
class DirectedGraph implements FormatterInterface
{
    /**
     * Format the matrix contents for outputting
     *
     * @param Matrix $mA Matrix to format
     * @param array $options Options for formatter
     *  - attribs => Collection of VertexDescription
     *  - optional: edgeFunc => function($weight){return $newWeight;}
     *  - optional: output:string script|object default = script
     *
     * If output is script, return the graphviz dot file contents
     * If output is object then return Fhaculty\Graph\Graph for your own
     * processing via Graphp\GraphViz\GraphViz
     *
     * @return Graph|string
     */
    public function format(Matrix $mA, array $options = array())
    {
        if (!$mA instanceof NumericMatrix) {
            throw new \InvalidArgumentException('Matrix is not NumericMatrix');
        }
        return FFor::create(['mA' => $mA, 'graph' => new Graph(), 'options' => $options])
            ->attribs(function($options) {
                $attribs = array_key_exists('attribs', $options) ? $options['attribs'] : new Collection([],'string');
                if ($attribs instanceof Collection) {
                    return $attribs;
                }
                throw new \InvalidArgumentException('options[attribs]');
            })
            ->edgeFunc(function($options) {
                $edgeFunc = array_key_exists('edgeFunc', $options) ? $options['edgeFunc'] : function($w){return $w;};
                if ($edgeFunc instanceof \Closure) {
                    return $edgeFunc;
                }
                throw new \InvalidArgumentException('pptions[edgeFunc]');
            })
            ->output(function($options) {
                return array_key_exists('output', $options) ? $options['output'] : 'script';
            })
            ->vertices(function(Collection $attribs, Matrix $mA, Graph $graph) {
                $vertices = [];
                foreach(range(0, $mA->rows()-1) as $idx) {
                    if (array_key_exists($idx, $attribs)) {
                        $attribute = $attribs[$idx];
                        $vertices[$idx+1] = $graph->createVertex($attribute->getName());
                        foreach($attribute->getAttributes() as $key => $val) {
                            $vertices[$idx+1]->setAttribute($key, $val);
                        }
                    } else {
                        $vertices[$idx+1] = $graph->createVertex();
                    }
                }
                return $vertices;
            })
            ->graphViz(function(Graph $graph, Matrix $mA, array $vertices, \Closure $edgeFunc, $output) {
                $comp = new Comparator();
                $zero = TypeFactory::createInt(0);
                $rows = $mA->rows();
                for ($row = 1; $row <= $rows; $row++) {
                    for ($col = 1; $col <= $rows; $col++) {
                        if ($comp->compare($zero, $mA->get($row, $col)) != 0) {
                            $vertices[$row]->createEdgeTo($vertices[$col])
                                ->setWeight($edgeFunc($mA->get($row, $col)->get()));
                        }
                    }
                }

                return $output == 'script' ? (new GraphViz())->createScript($graph) : $graph;
            })
            ->fyield('graphViz');
    }
}
Chippyash Math Matrix API documentation generated by ApiGen