Comments and draft for graph

This commit is contained in:
Dennis Eichhorn 2016-03-15 16:39:42 +01:00
parent d16899604d
commit c2eefd10cd
4 changed files with 374 additions and 69 deletions

View File

@ -0,0 +1,81 @@
<?php
/**
* Orange Management
*
* PHP Version 7.0
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright 2013 Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace phpOMS\Math\Optimization\Graph;
/**
* Graph class
*
* @category Framework
* @package phpOMS\Asset
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
interface EdgeInterface
{
/**
* Get edge id.
*
* @return mixed
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getId();
/**
* Get edge weight.
*
* @return mixed
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getWeight();
/**
* Set weight.
*
* @param mixed $weight Weight of edge
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setWeight($weight);
/**
* Get vertices.
*
* @return array
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getVertices() : array;
/**
* Set vertices.
*
* @param VerticeInterface $a Vertice a
* @param VerticeInterface $b Vertice b
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function setVertices(VerticeInterface $a, VerticeInterface $b);
}

View File

@ -0,0 +1,231 @@
<?php
/**
* Orange Management
*
* PHP Version 7.0
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright 2013 Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace phpOMS\Math\Optimization\Graph;
/**
* Graph class
*
* @category Framework
* @package phpOMS\Asset
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
class Graph
{
/**
* Vertices.
*
* @var VerticeInterface[]
* @since 1.0.0
*/
private $vertices = [];
/**
* Edge.
*
* @var EdgeInterface[]
* @since 1.0.0
*/
private $edges = null;
/**
* Constructor
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function __construct()
{
$this->edges = new MultiMap(KeyType::STRICT, OrderType::LOOSE);
}
/**
* Add vertice to graph.
*
* @param VerticeInterface $vertice Vertice
*
* @return bool
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function addVertice(VerticeInterface $vertice) : bool
{
if(!isset($this->vertices[$vertice->getId()])) {
$this->vertices[$vertice->getId()] = $vertice;
return true;
}
return false;
}
/**
* Add edge to graph.
*
* @param EdgeInterface $edge Edge
*
* @return bool
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function addEdge(EdgeInterface $edge) : bool
{
if(!isset($this->edges[$edge->getId()])) {
$this->edges[$edge->getId()] = $edge;
return true;
}
return false;
}
/**
* Remove vertice from graph.
*
* @param mixed $id Id of vertice to remove
*
* @return bool
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function removeVertice($id) : bool
{
if(isset($this->vertices[$id])) {
unset($this->vertices[$id]);
return true;
}
return false;
}
/**
* Remove edge by nodes from graph.
*
* @param mixed $a First node of edge
* @param mixed $b Second node of edge
*
* @return EdgeInterface
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function removeEdge($a, $b) : bool
{
return $this->edges->remove([$a, $b]);
}
/**
* Remove edge from graph.
*
* @param mixed $id Id of edge to remove
*
* @return bool
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function removeEdgeById($id) : bool
{
if(isset($this->edge[$id])) {
unset($this->edge[$id]);
return true;
}
return false;
}
/**
* Get vertice.
*
* @param mixed $id Id of vertice
*
* @return VerticeInterface
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getVertice($id) : VerticeInterface
{
return $this->vertices[$id] ?? new NullVertice();
}
/**
* Get edge by nodes.
*
* Order of nodes is irrelevant
*
* @param mixed $a First node of edge
* @param mixed $b Second node of edge
*
* @return EdgeInterface
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getEdge($a, $b) : EdgeInterface
{
return $this->edges->get([$a, $b]) ?? new NullEdge();
}
/**
* Get edge by id.
*
* @param itn $id Edge id
*
* @return EdgeInterface
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getEdgeById(int $id) : EdgeInterface
{
return $this->edges->get([$a, $b]) ?? new NullEdge();
}
/**
* Count vertices.
*
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function countVertices() : int
{
return count($this->vertices);
}
/**
* Count edges.
*
* @return int
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function countEdges() : int
{
return count($this->edges);
}
}

View File

@ -1,69 +0,0 @@
<?php
/**
* Orange Management
*
* PHP Version 7.0
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright 2013 Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace phpOMS\Math\Optimization;
class GraphAbstract {
private $vertices = [];
private $edges = null;
public function __construct()
{
$this->edges = new MultiMap(KeyType::STRICT, OrderType::LOOSE);
}
public function addVertice(VerticeInterface $Vertice) : bool
{
if(!isset($this->vertices[$Vertice->getId()])) {
$this->vertices[$Vertice->getId()] = $Vertice;
return true;
}
return false;
}
public function removeVertice($id) : bool
{
if(isset($this->vertices[$id])) {
unset($this->vertices[$id]);
return true;
}
return false;
}
public function getVertice($id) : VerticeInterface
{
return $this->vertices[$id] ?? new NullVertice();
}
public function getEdge($a, $b) : EdgeInterface
{
return $this->edges->get($a, $b) ?? new NullEdge();
}
public function countVertices() : int
{
return count($this->vertices);
}
public function countEdges() : int
{
return count($this->edges);
}
}

View File

@ -0,0 +1,62 @@
<?php
/**
* Orange Management
*
* PHP Version 7.0
*
* @category TBD
* @package TBD
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @copyright 2013 Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link http://orange-management.com
*/
namespace phpOMS\Math\Optimization\Graph;
/**
* Graph class
*
* @category Framework
* @package phpOMS\Asset
* @author OMS Development Team <dev@oms.com>
* @author Dennis Eichhorn <d.eichhorn@oms.com>
* @license OMS License 1.0
* @link http://orange-management.com
* @since 1.0.0
*/
interface VerticeInterface
{
/**
* Get vertice id.
*
* @return mixed
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getId();
/**
* Get edges.
*
* @return array
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function getEdges() array;
/**
* Add edge.
*
* @param EdgeInterface $edge Edge to add to vertice
*
* @return bool
*
* @since 1.0.0
* @author Dennis Eichhorn <d.eichhorn@oms.com>
*/
public function addEdge(EdgeInterface $edge) : bool;
}