/**
  * Convert if possible a supplied argument to a rational
  *
  * @param int|float|string|NumericTypeInterface $value
  *
  * @return \Chippyash\Math\Matrix\RationalNumber
  *
  * @throws \Chippyash\Matrix\Exceptions\MatrixException
  * @throws \Exception
  */
 protected function convertNumberToRational($value)
 {
     if ($value instanceof NumericTypeInterface) {
         return $value->asRational();
     }
     switch (gettype($value)) {
         case 'integer':
             return RationalTypeFactory::create($value, 1);
         case 'double':
             return RationalTypeFactory::fromFloat($value);
         case 'string':
             try {
                 return RationalTypeFactory::fromString($value);
             } catch (\Exception $e) {
                 try {
                     return ComplexTypeFactory::fromString($value)->asRational();
                 } catch (\Exception $ex) {
                     throw new MatrixException('The string representation of the number is invalid for a rational');
                 }
             }
         case 'NULL':
             return RationalTypeFactory::create(0, 1);
         case 'boolean':
             return RationalTypeFactory::create($value ? 1 : 0, 1);
         default:
             throw new MatrixException('Rational expects int, float, string, Rational or NumericTypeInterface ');
     }
 }
 /**
  * @dataProvider polars
  */
 public function testCreateFromPolarReturnsComplexType($r, $t)
 {
     $radius = RationalTypeFactory::fromString($r);
     $theta = RationalTypeFactory::fromString($t);
     $p = ComplexTypeFactory::fromPolar($radius, $theta);
     $this->assertInstanceOf(self::CTYPE_NAME, $p);
 }
 /**
  * Create and return a rational number matrix
  * $data elements are either:
  *  - a RationalType
  *  - string representations of rational number
  *  - a PHP float
  *  - a 2 item array representing numerator & denominator e.g. [2,-4] = '-2/4'
  *
  * @param array $data
  *
  * @return \Chippyash\Math\Matrix\RationalMatrix
  *
  * @throws \Chippyash\Math\Matrix\Exceptions\MathMatrixException
  */
 public static function createRational(array $data)
 {
     foreach ($data as &$row) {
         foreach ($row as &$item) {
             if (!$item instanceof RationalType) {
                 if (is_array($item) && count($item) == 2) {
                     $item = RationalTypeFactory::create($item[0], $item[1]);
                 } elseif (is_string($item)) {
                     try {
                         $item = RationalTypeFactory::fromString($item);
                     } catch (\InvalidArgumentException $e) {
                         throw new MathMatrixException('Invalid item type for Rational Matrix');
                     }
                 } elseif (is_float($item)) {
                     $item = RationalTypeFactory::fromFloat($item);
                 } else {
                     throw new MathMatrixException('Invalid item type for Rational Matrix');
                 }
             }
         }
     }
     return new RationalMatrix($data);
 }
 /**
  * Convert to RationalType
  *
  * @param mixed $original
  *
  * @return \Chippyash\Type\Number\Rational\RationalType|\Chippyash\Type\Number\Rational\GMPRationalType
  *
  * @throws InvalidTypeException
  */
 protected static function convertType($original)
 {
     if ($original instanceof AbstractRationalType) {
         return RationalTypeFactory::create($original->numerator()->get(), $original->denominator()->get());
     }
     if (is_numeric($original)) {
         if (is_int($original)) {
             return RationalTypeFactory::create($original, 1);
         }
         //default - convert to float
         return RationalTypeFactory::fromFloat(floatval($original));
     }
     if ($original instanceof FloatType) {
         return RationalTypeFactory::fromFloat($original());
     }
     if ($original instanceof IntType) {
         return RationalTypeFactory::create($original, 1);
     }
     if (is_string($original)) {
         try {
             return RationalTypeFactory::fromString($original);
         } catch (\InvalidArgumentException $e) {
             throw new InvalidTypeException("{$original} for Complex type construction");
         }
     }
     $type = gettype($original);
     throw new InvalidTypeException("{$type} for Complex type construction");
 }
 public function testSingleMatrixReturnsValueOfItsSingleEntry()
 {
     $this->assertEquals(2, $this->object->determinant(new NumericMatrix([2]))->get());
     $this->assertEquals('2/5', (string) $this->object->determinant(new RationalMatrix([RationalTypeFactory::fromString('2/5')])));
     $this->assertEquals('1+3i', $this->object->determinant(new ComplexMatrix([ComplexTypeFactory::fromString('1+3i')]))->get());
 }