2011-m1s2-ter/taln/NodeTestTool.php

530 lines
20 KiB
PHP

<?php
// Ctrl + F : TODO to find where to start working...
/**
*
* TODO: analysis of relationships of relations :
* - which are sometimes together ?
* - which are never together ?
* - why ?
* - are there other interesting combinations possible ?
* - are some always included in others ? ex. "synonym" and "related to"
* -
*
* IDEAS:
*
* - function or class that gives more info on clourds :
* ->make sure the same word dosn't appear twice
* ->make sure the main word does't appear in cloud
* ->filter to make all other words nouns, adg, etc.
* ->word count for percentage of words possible (if few words, small cloud ; if lots
* of words, big cloud
* ->
*/
require_once("db.php");
class NodeTestTool {
//private static $typer1r2 = "type in ($r1, $r2)";
//private static $banned_types = "4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001";
private static $relations = array(0 => "r_associated",
5 => "r_syn", 6 => "r_isa", 7 => "r_anto", 8 => "r_hypo", 9 => "r_haspart",
10 => "r_holo", 13 => "r_agent", 15 => "r_lieu", 16 => "r_inst", 17 => "r_carac");
/***********************GENERAL METHODS***********************************/
public static function getWordFromEID($eid) {
$db = getDB();
$query = "SELECT name FROM node WHERE eid = $eid";
$result = $db->querySingle($query, true);
if($result != null) return $result['name'];
else return null;
}
public static function getEIDFromWord($word) {
$db = getDB();
$query = "SELECT eid FROM node WHERE name = '$word'";
$result = $db->querySingle($query, true);
if($result != null) return $result['eid'];
else return null;
}
public static function isEIDInDB($eid) {
$db = getDB();
$query = "SELECT eid FROM node WHERE eid = $eid";
$result = $db->querySingle($query, true);
if ($result != null)
return true;
return false;
}
public static function isWordInDB($word) {
$db = getDB();
$query = "SELECT eid FROM node WHERE name = '$word'";
$result = $db->querySingle($query, true);
if ($result != null)
return true;
return false;
}
public static function isCentralEIDinDB($centralEID) {
$db = getDB();
$query = "SELECT eid FROM random_center_node WHERE eid = $centralEID";
$result = $db->querySingle($query, true);
if ($result != null)
return true;
return false;
}
public static function isCentralWordInDB($word) {
$centralEID = NodeTestTool::getEIDFromWord($word);
return NodeTestTool::isCentralEIDinDB($centralEID);
}
public static function isCloudEIDInDB($cloudEID) {
$db = getDB();
$query = "SELECT eid FROM random_cloud_node WHERE eid = $cloudEID";
$result = $db->querySingle($query, true);
if ($result != null)
return true;
return false;
}
public static function isCloudWordInDB($cloudWord) {
$db = getDB();
$cloudEID = NodeTestTool::getEIDFromWord($cloudWord);
return NodeTestTool::isCloudEIDinDB($cloudEID);
}
public static function getPOSsFromEID($eid) {
$db = getDB();
$query = "SELECT end FROM relation WHERE type = 4 AND start = $eid;";
$res = $db->query($query);
$adj = $adv = $nom = $ver = false;
$s = "";
while ($tuple = $res->fetchArray()) {
$endEID = $tuple['end'];
$query = "SELECT name FROM node WHERE eid = $endEID";
$res2 = $db->querySingle($query, true);
$POSline = $res2['name'];
if (preg_match("/^Adj:/", $POSline)) {
if ($adj == false) {
$s .= "Adj ";
$adj = true;
}
} else if (preg_match("/^Adv:/", $POSline)) {
if ($adv == false) {
$s .= "Adv ";
$adv = true;
}
} else if (preg_match("/^Nom:/", $POSline)) {
if ($nom == false) {
$s .= "Nom ";
$nom = true;
}
} else if (preg_match("/^Ver:/", $POSline)) {
if ($ver == false) {
$s .= "Ver ";
$ver = true;
}
}
}
return $s;
}
public static function getPOSsFromWord($word) {
$eid = NodeTestTool::getEIDFromWord($word);
$POSs = NodeTestTool::getPOSsFromEID($eid);
return $POSs;
}
public static function getCloudEIDsFromCentralEIDAndRelNo($centralEID, $relNo) {
if (NodeTestTool::isCentralEIDinDB($centralEID)) {
$db = getDB();
$query = "SELECT end FROM relation WHERE type = $relNo AND start = $centralEID";
$res = $db->query($query);
$s = "";
while ($tuple = $res->fetchArray()) {
$eid2 = $tuple['end'];
$query = "SELECT eid FROM node WHERE eid = $eid2";
$res2 = $db->querySingle($query, true);
$s .= $res2['eid'] . ":";
}
if(strlen($s) > 0) $s = substr($s, 0, -1);
return $s;
}
return null;
}
public static function getCloudWordsFromCentralEIDAndRelNo($centralEID, $relNo) {
if (NodeTestTool::isCentralEIDInDB($centralEID)) {
$db = getDB();
$query = "SELECT end FROM relation WHERE type = $relNo AND start = $centralEID";
$res = $db->query($query);
$s = "";
while ($tuple = $res->fetchArray()) {
$eid2 = $tuple['end'];
$query = "SELECT name FROM node WHERE eid = $eid2";
$res2 = $db->querySingle($query, true);
$s .= $res2['name'] . ":";
}
if(strlen($s) > 0) $s = substr($s, 0, -1);
return $s;
}
return null;
}
public static function getCloudEIDsFromCentralWordAndRelNo($centralWord, $relNo) {
$centralEID = NodeTestTool::getEIDFromWord($centralWord);
if (NodeTestTool::isCentralEIDInDB($centralEID)) {
return NodeTestTool::getCloudEIDsFromCentralEIDandRelNo($centralEID, $relNo);
}
return false;
}
public static function getCloudWordsFromCentralWordAndRelNo($centralWord, $relNo) {
if (NodeTestTool::isCentralWordInDB($centralWord)) {
$centralEID = NodeTestTool::getEIDFromWord($centralWord);
return NodeTestTool::getCloudWordsFromCentralEIDAndRelNo($centralEID, $relNo);
}
return false;
}
public static function getAllCloudEIDsFromCentralEID($centralEID) {
$s = "";
foreach (NodeTestTool::$relations AS $relNo => $relName) {
$cloud = NodeTestTool::getCloudEIDsFromCentralEIDAndRelNo($centralEID, $relNo);
$s .= $relNo . "=>" . $relName . ": " . $cloud . "<br />";
}
return $s;
}
public static function getAllCloudWordsFromCentralEID($centralEID) {
$s = "";
foreach (NodeTestTool::$relations AS $relNo => $relName) {
$cloud = NodeTestTool::getCloudWordsFromCentralEIDAndRelNo($centralEID, $relNo);
$s .= $relNo . "=>" . $relName . ": " . $cloud . "<br />";
}
return $s;
}
public static function getAllCloudEIDsFromCentralWord($centralWord) {
$s = "";
foreach (NodeTestTool::$relations AS $relNo => $relName) {
$cloud = NodeTestTool::getCloudEIDsFromCentralWordAndRelNo($centralWord, $relNo);
$s .= $relNo . "=>" . $relName . ": " . $cloud . "<br />";
}
return $s;
}
public static function getAllCloudWordsFromCentralWord($centralWord) {
$s = "";
foreach (NodeTestTool::$relations AS $relNo => $relName) {
$cloud = NodeTestTool::getCloudWordsFromCentralWordAndRelNo($centralWord, $relNo);
$s .= $relNo . "=>" . $relName . ": " . $cloud . "<br />";
}
return $s;
}
/*****************************RANDOM METHODS**************************/
public static function getRandomCentralEID() {
$db = getDB();
$query = "SELECT eid FROM random_center_node WHERE rowid =
(ABS(RANDOM()) % (SELECT MAX(rowid) FROM random_center_node)) + 1";
$res = $db->querySingle($query, true);
if ($res != null)
return $res['eid'];
else
return null;
}
public static function getRandomCentralWord() {
$eid = NodeTestTool::getRandomCentralEID();
return NodeTestTool::getWordFromEID($eid);
}
public static function getAbsoluteRandomCloudEID() {
$db = getDB();
$query = "SELECT eid FROM random_cloud_node WHERE rowid =
(ABS(RANDOM()) % (SELECT MAX(rowid) FROM random_center_node)) + 1";
$res = $db->querySingle($query, true);
if ($res != null)
return $res['eid'];
else
return null;
}
public static function getAbsoluteRandomCloudWord() {
$eid = NodeTestTool::getAbsoluteRandomCloudEID();
return NodeTestTool::getWordFromEID($eid);
}
public static function getRandomCloudEIDFromCentralEID($centralEID, $relNo){
$s = NodeTestTool::getCloudEIDsFromCentralEIDAndRelNo($centralEID, $relNo);
$ar = preg_split("/:/", $s);
if(count($ar) > 0) return $ar[rand(0, count($ar)-1)];
return null;
}
public static function getRandomCloudWordFromCentralEID($centralEID, $relNo){
$eid = NodeTestTool::getRandomCloudEIDFromCentralEID($centralEID, $relNo);
if($eid != null) return NodeTestTool::getWordFromEID($eid);
return null;
}
public static function getRandomCloudEIDFromCentralWord($centralWord, $relNo){
$centralEID = NodeTestTool::getEIDFromWord($centralWord);
if($centralEID != null) return NodeTestTool::getRandomCloudEIDFromCentralEID($centralEID, $relNo);
return null;
}
public static function getRandomCloudWordFromCentralWord($centralWord, $relNo){
$centralEID = NodeTestTool::getEIDFromWord($centralWord);
if($centralEID != null) return NodeTestTool::getRandomCloudWordFromCentralEID($centralEID, $relNo);
return null;
}
public static function getWordCloudDistance2($centralWord, $relNoDist1, $relNoDist2){
$randomCloudWord = NodeTestTool::getRandomCloudWordFromCentralWord($centralWord, $relNoDist1);
echo "Mot intermédiaire : " . $randomCloudWord . "<br />";
if(strlen($randomCloudWord) > 0)
return NodeTestTool::getCloudWordsFromCentralWordAndRelNo($randomCloudWord, $relNoDist2);
return null;
}
/*
* In the implementation of the function getWordCloudDistance2, 8 different
* functions could be made corresponding to returning a word cloud or an
* eid cloud, the naming would have to be changed to reflect the different
* parameters and return values...
*/
//TODO: FROM HERE DOWN ISN4T IN nodeTest01.php START FROM HERE !!
//getRandomCloudFromCentralEID($centralEID, $numWords)
//getRandomCloudFromCentralWord($centralWord, $numWords)
/* * *******************************WRONG OR DISTORTED CLOUD WORDS********* */
public static function getRandomCloudEIDofCloudEID($couldEID, $relNum) {
}
public static function getRandomCloudWordOfCloudWord($cloudWord, $relNum) {
}
/*************************ACCESSEURS************************/
public static function getRelations(){
return NodeTestTool::$relations;
}
/* * ***********************************GD****************************** */
/**
* (gd) Voisins 1 saut du bon type (= relations déjà existantes)
* @global <type> $typer1r2
* @param <type> $r1
* @param <type> $r2
* @param <type> $centerEID
*/
public static function gd1JumpGoodType($r1, $r2, $centerEID) {
global $typer1r2;
$db = getDB();
$query = "SELECT end AS eid, type = $r1 as r1, type = $r2 as r2,
0 as r0, 0 as trash FROM relation WHERE start = $centerEID AND
$typer1r2 order by random()";
$result = $db->querySingle($query, true); //??
return $result['end']; //??
}
/**
* (gd) Voisins 1 saut via r_associated (0), donc qu'on voudrait spécifier
* si possible.
* @param <type> $centerEID
*/
public static function gd1JumpViaRAssociated0($centerEID) {
$db = getDB();
$query = "SELECT end AS eid, 0.25 AS r1, 0.25 AS r2, 0.5 AS r0,
0 AS trash FROM relation WHERE start = $centerEid AND
type = 0 order by random()";
$result = $db->querySingle($query, true); //??
return $result['end']; //??
}
/**
* (gd) Voisins 1 saut via les autres relations
* @global $banned_types
* @param <type> $centerEid
* @param <type> $r1
* @param <type> $r2
* @return <type>
*/
public static function gd1JumpViaOtherRelation($centerEid, $r1, $r2) {
global $banned_types;
$query = "SELECT end AS eid, 0.1 AS r1, 0.1 AS r2, 0.8 AS r0, 0 AS trash
FROM relation WHERE start = $centerEid AND type NOT IN
(0, $r1, $r2, $banned_types) ORDER BY random()";
$result = $db->querySingle($query, true); //??
return $result['end']; //??
}
/**
* (gd) Voisins 2 sauts, avec un mix de R1 et R2 pour les liens. Par ex
* [ A -R1-> B -R2-> C ] ou bien [ A -R2-> B -R2-> C ]
* Version optimisée de : "SELECT end AS eid FROM relation WHERE $typer1r2
* AND start IN oneHopWithType ORDER BY random();"
* @global $typer1r2
* @param <type> $r1
* @param <type> $r2
* @param <type> $centerEid
* @return <type>
*/
public static function gd2JumpWithMixR1R2ForLinks($r1, $r2, $centerEid) {
global $typer1r2;
$db = getDB();
$query = "SELECT B.end AS eid, ((A.type = $r1) + (B.type = $r1)) / 3.
AS r1, ((A.type = $r2) + (B.type = $r2)) / 3. AS r2, 1/6. AS r0, 1/6.
AS trash FROM relation AS A, relation AS B WHERE A.start = $centerEid
AND A.$typer1r2 AND B.start = A.end AND B.$typer1r2 ORDER BY random()";
$result = $db->querySingle($query, true); //??
return $result['end']; //??
}
/**
* (gd) Voisins 1 saut r1/r2 + 1 saut synonyme
* Version optimisée de : "SELECT end AS eid FROM relation WHERE start IN
* oneHopWithType AND type = 5 order by random()";
* @global $typer1r2
* @param <type> $r1
* @param <type> $r2
* @param <type> $centerEid
* @return <type>
*/
public static function gd1JumpR1DivR2Plus1JumpSynonymOneHopWithType($r1, $r2, $centerEid) {
global $typer1r2;
$db = getDB();
$query = "SELECT B.end AS eid, (A.type = $r1) * 0.75 as r1,
(A.type = $r2) * 0.75 AS r2, 0.25 AS r0, 0 AS trash FROM relation AS A,
relation AS B WHERE A.start = $centerEid AND A.$typer1r2 AND B.start = A.end
AND B.type = 5 ORDER BY random()";
//$result = $db->querySingle($query, true); //??
//return $result['end']; //??
}
/**
* Version optimisée de : "SELECT end AS eid FROM relation WHERE start IN
* (SELECT end FROM relation WHERE start = $centerEid AND type = 5) AND $typer1r2
* ORDER BY random();"
* @global $typer1r2
* @param <type> $r1
* @param <type> $r2
* @param <type> $centerEid
* @return <type>
*/
public static function gd1JumpR1DivR2Plus1JumpSynonym($r1, $r2, $centerEid) {
global $typer1r2;
$db = getDB();
$query = "SELECT B.end AS eid, (B.type = $r1) * 0.75 as r1,
(B.type = $r2) * 0.75 AS r2, 0.25 AS r0, 0 AS trash FROM relation AS A,
relation AS B WHERE A.start = $centerEid AND A.type = 5 AND B.start = A.end
AND B.$typer1r2 ORDER BY random()";
//$result = $db->querySingle($query, true); //??
//return $result['end']; //??
}
/**
* // Voisins 2 sauts (tous)
* Version optimisée de : "SELECT end AS eid, 0.1 AS r1, 0.1 AS r2, 0.3 AS r0,
* 0.5 AS trash FROM relation WHERE start IN (SELECT end FROM relation
* WHERE start = $centerEid AND type NOT IN ($banned_types)) AND type NOT IN
* ($banned_types) ORDER BY random();"
* @global $banned_types $banned_types
* @param <type> $centerEid
* @param <type> $cloudSize
* @return <type>
*/
public static function gd2JumpAll($centerEid, $cloudSize) {
global $banned_types;
$db = getDB();
$query = "SELECT x AS eid, 0.1 AS r1, 0.1 AS r2, 0.3 AS r0, 0.5 AS trash
FROM (SELECT x FROM (SELECT X.eid + Y.dumb AS x FROM (SELECT B.end AS eid
FROM relation AS A, relation AS B WHERE A.type NOT IN ($banned_types)
AND A.start = $centerEid AND B.type NOT IN ($banned_types) AND
B.start = A.end LIMIT " . ($cloudSize * 4) . ") AS X, (SELECT 0 AS dumb)
AS Y)) ORDER BY random()";
//$result = $db->querySingle($query, true); //??
//return $result['end']; //??
}
/**
* (gd) Centre pointe vers X, M pointe vers X aussi, on prend M.
* Version optimisée de : "select start as eid from relation where end in (select end from relation where start = $centerEid) and type not in ($banned_types) order by random();"
* Ce n'est toujours pas ça… : "select eid from (select B.start as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.end = A.end limit 1) order by random();"
* Tordu, mais ça marche \o/ . En fait il faut empêcher l'optimiseur de ramener le random avant le limit (et l'optimiseur est malin… :)
* @global <type> $banned_types
* @param <type> $cloudSize
*/
public static function gdXPointsToMMPointsToXTakeM($cloudSize) {
global $banned_types;
$db = getDB();
$query = "SELECT x as eid, 0.1 as r1, 0.1 as r2, 0.2 as r0, 0.6 as trash
FROM (SELECT x from (SELECT X.eid + Y.dumb AS x FROM (SELECT
B.start AS eid FROM relation AS A, relation AS B WHERE A.type NOT IN
($banned_types) AND A.start = $centerEid AND B.type NOT IN ($banned_types)
AND B.end = A.end limit " . ($cloudSize * 4) . ") AS X, (SELECT 0 AS dumb) AS Y))
ORDER BY random()";
//$result = $db->querySingle($query, true); //??
//return $result['end']; //??
}
public static function gdGetGidFromGame() {
return "select gid from game where gid = (abs(random()) % (select max(gid) from game))+1 or gid = (select max(gid) from game where gid > 0) order by gid limit 1;";
}
// TODO Yoann : faire des tests d'erreur pour ces select ?
public static function sqlGetGamesForId($gameId) {
return "select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = " . $gameId . ";";
}
public static function sqlGetWordEidAndName($gameId) {
return "select eid_word,(select name from node where eid=eid_word) as name_word from game_cloud where gid = " . $gameId . ";";
}
public static function sqlGetInformationAboutGame($gameId) {
return "select eid_word,(select name from node where eid=eid_word) as name_word, num, difficulty, totalWeight, probaR1, probaR2, probaR0, probaTrash from game_cloud where gid = " . $gameId . ";";
}
public static function sqlGameIsOK($pgid, $gid, $user) {
return "SELECT 'ok' FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user' and timestamp = -1;";
}
public static function sqlGetScoreForUser($user) {
return "SELECT score FROM user WHERE login='" . $user . "';";
}
public static function sqlGetPlayedGameTime($pgid, $gid, $user) {
return "SELECT timestamp FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user';";
}
public static function sqlGetNumAndScoreFromGame($pgid, $gid) {
return "SELECT num,score from played_game_cloud where pgid = $pgid and gid = $gid;";
}
}
?>