{"action":"created","comment":{"url":"https://api.github.com/repos/sommer/veins/pulls/comments/201393325","pull_request_review_id":135788031,"id":201393325,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMTM5MzMyNQ==","diff_hunk":"@@ -0,0 +1,995 @@\n+//\n+// Copyright (C) 2018 Fabian Bronner <fabian.bronner@ccs-labs.org>\n+//\n+// Documentation for these modules is at http://veins.car2x.org/\n+//\n+// This program is free software; you can redistribute it and/or modify\n+// it under the terms of the GNU General Public License as published by\n+// the Free Software Foundation; either version 2 of the License, or\n+// (at your option) any later version.\n+//\n+// This program is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+// GNU General Public License for more details.\n+//\n+// You should have received a copy of the GNU General Public License\n+// along with this program; if not, write to the Free Software\n+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n+//\n+\n+//TODO: Use fixed size std::vector instead of c-style array\n+\n+#include \"veins/base/toolbox/Signal.h\"\n+#include \"veins/base/phyLayer/AnalogueModel.h\"\n+\n+namespace Veins {\n+\n+Signal::Signal():\n+\tspectrum(0), values(0), numAbsoluteValues(0), numRelativeValues(0), numDataValues(0), relativeOffset(0), dataOffset(0), centerFrequencyIndex(0),\n+\ttimingUsed(false), sendingStart(0), duration(0), propagationDelay(0),\n+\tanalogueModelList(0), numAnalogueModelsApplied(0), senderPos(0, 0), receiverPos(0, 0),\n+\tbitrate(0),\n+\tsenderModuleID(-1), senderFromGateID(-1), receiverModuleID(-1), receiverToGateID(-1)\n+{\n+\t//\n+}\n+\n+Signal::Signal(const Signal& other):\n+\tspectrum(other.spectrum), numAbsoluteValues(other.numAbsoluteValues), numRelativeValues(other.numRelativeValues),\n+\tnumDataValues(other.numDataValues), relativeOffset(other.relativeOffset), dataOffset(other.dataOffset), centerFrequencyIndex(other.centerFrequencyIndex),\n+\ttimingUsed(other.timingUsed), sendingStart(other.sendingStart), duration(other.duration), propagationDelay(other.propagationDelay),\n+\tanalogueModelList(other.analogueModelList), numAnalogueModelsApplied(other.numAnalogueModelsApplied), senderPos(other.senderPos), receiverPos(other.receiverPos),\n+\tbitrate(other.bitrate),\n+\tsenderModuleID(other.senderModuleID), senderFromGateID(other.senderFromGateID), receiverModuleID(other.receiverModuleID), receiverToGateID(other.receiverToGateID)\n+{\n+\tvalues = new double[spectrum->getNumFreqs()]{0};\n+\tstd::copy(other.getAbsoluteValues(), other.getAbsoluteValues()+numAbsoluteValues, values);\n+}\n+\n+Signal::Signal(SpectrumPtr spec):\n+\tspectrum(spec), numAbsoluteValues(spec->getNumFreqs()), numRelativeValues(0), numDataValues(0), relativeOffset(0), dataOffset(0), centerFrequencyIndex(0),\n+\ttimingUsed(false), sendingStart(0), duration(0), propagationDelay(0),\n+\tanalogueModelList(0), numAnalogueModelsApplied(0), senderPos(0, 0), receiverPos(0, 0),\n+\tbitrate(0),\n+\tsenderModuleID(-1), senderFromGateID(-1), receiverModuleID(-1), receiverToGateID(-1)\n+{\n+\tvalues = new double[numAbsoluteValues]{0};\n+}\n+\n+Signal::Signal(SpectrumPtr spec, simtime_t start, simtime_t dur):\n+\tspectrum (spec), numAbsoluteValues(spec->getNumFreqs()), numRelativeValues(0), numDataValues(0), relativeOffset(0), dataOffset(0), centerFrequencyIndex(0),\n+\ttimingUsed(true), sendingStart(start), duration(dur), propagationDelay(0),\n+\tanalogueModelList(0), numAnalogueModelsApplied(0), senderPos(0, 0), receiverPos(0, 0),\n+\tbitrate(0),\n+\tsenderModuleID(-1), senderFromGateID(-1), receiverModuleID(-1), receiverToGateID(-1)\n+{\n+\tvalues = new double[numAbsoluteValues]{0};\n+}\n+\n+Signal::~Signal()\n+{\n+\tif(values)\n+\t\tdelete[] values;\n+}\n+\n+double& Signal::operator[] (size_t index)\n+{\n+#ifndef PREFER_VECTORIZATION\n+\tincludeAbsoluteIndex(index);\n+#endif\n+\n+\treturn values[index];\n+}\n+\n+const double& Signal::operator[] (size_t index) const\n+{\n+\treturn values[index];\n+}\n+\n+double& Signal::operator() (double freq)\n+{\n+\tsize_t index = spectrum->indexOf(freq);\n+\n+\tincludeAbsoluteIndex(index);\n+\n+\treturn values[index];\n+}\n+\n+double Signal::operator() (double freq) const\n+{\n+\tsize_t index = spectrum->indexOf(freq);\n+\n+\treturn values[index];\n+}\n+\n+SpectrumPtr Signal::getSpectrum() const\n+{\n+\treturn spectrum;\n+}\n+\n+double Signal::getAbsoluteFreqAt(size_t freqIndex) const\n+{\n+\treturn spectrum->freqAt(freqIndex);\n+}\n+\n+double Signal::getRelativeFreqAt(size_t freqIndex) const\n+{\n+\treturn spectrum->freqAt(freqIndex + relativeOffset);\n+}\n+\n+double Signal::getDataFreqAt(size_t freqIndex) const\n+{\n+\treturn spectrum->freqAt(freqIndex + dataOffset);\n+}\n+\n+size_t Signal::getRelativeStart() const\n+{\n+\treturn relativeOffset;\n+}\n+\n+size_t Signal::getDataStart() const\n+{\n+\treturn dataOffset;\n+}\n+\n+size_t Signal::getRelativeEnd() const\n+{\n+\treturn relativeOffset + numRelativeValues;\n+}\n+\n+size_t Signal::getDataEnd() const\n+{\n+\treturn dataOffset + numDataValues;\n+}\n+\n+void Signal::setDataStart(size_t index)\n+{\n+\tdataOffset = index;\n+}\n+\n+void Signal::setDataEnd(size_t index)\n+{\n+\tnumDataValues = 1+index-dataOffset;\n+}\n+\n+void Signal::setDataNumValues(size_t num)\n+{\n+\tnumDataValues = num;\n+}\n+\n+double* Signal::getAbsoluteValues() const\n+{\n+\treturn values;\n+}\n+\n+double* Signal::getRelativeValues() const\n+{\n+\treturn values + relativeOffset;\n+}\n+\n+double* Signal::getDataValues() const\n+{\n+\treturn values + dataOffset;\n+}\n+\n+size_t Signal::getNumAbsoluteValues() const\n+{\n+\treturn numAbsoluteValues;\n+}\n+\n+size_t Signal::getNumRelativeValues() const\n+{\n+\treturn numRelativeValues;\n+}\n+\n+size_t Signal::getNumDataValues() const\n+{\n+\treturn numDataValues;\n+}\n+\n+size_t Signal::getRelativeOffset() const\n+{\n+\treturn relativeOffset;\n+}\n+\n+size_t Signal::getDataOffset() const\n+{\n+\treturn dataOffset;\n+}\n+\n+void Signal::setAbsolute(size_t index, double value)\n+{\n+\tincludeAbsoluteIndex(index);\n+\n+\tvalues[index] = value;\n+}\n+\n+void Signal::setRelative(size_t index, double value)\n+{\n+\tvalues[index + relativeOffset] = value;\n+}\n+\n+void Signal::setData(size_t index, double value)\n+{\n+\tvalues[index + dataOffset] = value;\n+}\n+\n+void Signal::setAtFreq(double freq, double value)\n+{\n+\tsize_t index = spectrum->indexOf(freq);\n+\n+\tincludeAbsoluteIndex(index);\n+\n+\tvalues[index] = value;\n+}\n+\n+double Signal::getAbsolute(size_t index) const\n+{\n+\treturn values[index];\n+}\n+\n+double Signal::getRelative(size_t index) const\n+{\n+\treturn values[index + relativeOffset];\n+}\n+\n+double Signal::getData(size_t index) const\n+{\n+\treturn values[index + dataOffset];\n+}\n+\n+double Signal::getAtFreq(double freq) const\n+{\n+\tsize_t index = spectrum->indexOf(freq);\n+\treturn values[index];\n+}\n+\n+void Signal::setCenterFrequencyIndex(size_t index)\n+{\n+\tcenterFrequencyIndex = index;\n+}\n+\n+size_t Signal::getCenterFrequencyIndex() const\n+{\n+\treturn centerFrequencyIndex;\n+}\n+\n+double Signal::getAtCenterFrequency() const\n+{\n+\treturn values[centerFrequencyIndex];\n+}\n+\n+bool Signal::greaterAtCenterFrequency(double threshold)\n+{\n+\tif(values[centerFrequencyIndex] < threshold)\n+\t\treturn false;\n+\n+\tuint16_t maxAnalogueModels = analogueModelList->size();\n+\n+\twhile(numAnalogueModelsApplied < maxAnalogueModels)\n+\t{\n+\t\t//Apply filter here\n+\t\t(*analogueModelList)[numAnalogueModelsApplied]->filterSignal(this, senderPos, receiverPos);\n+\t\tnumAnalogueModelsApplied++;\n+\n+\t\tif(values[centerFrequencyIndex] < threshold)\n+\t\t\treturn false;\n+\t}\n+\treturn true;\n+}\n+\n+bool Signal::smallerAtCenterFrequency(double threshold)\n+{\n+\tif(values[centerFrequencyIndex] < threshold)\n+\t\treturn true;\n+\n+\tuint16_t maxAnalogueModels = analogueModelList->size();\n+\n+\twhile(numAnalogueModelsApplied < maxAnalogueModels)\n+\t{\n+\t\t//Apply filter here\n+\t\t(*analogueModelList)[numAnalogueModelsApplied]->filterSignal(this, senderPos, receiverPos);\n+\t\tnumAnalogueModelsApplied++;\n+\n+\t\tif(values[centerFrequencyIndex] < threshold)\n+\t\t\treturn true;\n+\t}\n+\treturn false;\n+}\n+\n+uint16_t Signal::getNumAnalogueModelsApplied() const\n+{\n+\treturn numAnalogueModelsApplied;\n+}\n+\n+void Signal::applyAnalogueModel(uint16_t index)\n+{\n+\tuint16_t maxAnalogueModels = analogueModelList->size();\n+\n+\tif(index >= maxAnalogueModels || index < numAnalogueModelsApplied)\n+\t\treturn;\n+\n+\t(*analogueModelList)[index]->filterSignal(this, senderPos, receiverPos);\n+\tnumAnalogueModelsApplied++;\n+}\n+\n+void Signal::applyAllAnalogueModels()\n+{\n+\tuint16_t maxAnalogueModels = analogueModelList->size();\n+\twhile(numAnalogueModelsApplied < maxAnalogueModels)\n+\t{\n+\t\t(*analogueModelList)[numAnalogueModelsApplied]->filterSignal(this, senderPos, receiverPos);\n+\n+\t\tnumAnalogueModelsApplied++;\n+\t}\n+}\n+\n+void Signal::setAnalogueModelList(AnalogueModelList* list)\n+{\n+\tanalogueModelList = list;\n+}\n+\n+void Signal::setSenderPos(Coord pos)\n+{\n+\tsenderPos = pos;\n+}\n+\n+void Signal::setReceiverPos(Coord pos)\n+{\n+\treceiverPos = pos;\n+}\n+\n+AnalogueModelList* Signal::getAnalogueModelList() const\n+{\n+\treturn analogueModelList;\n+}\n+\n+size_t Signal::getNumAnalogueModels() const\n+{\n+\treturn analogueModelList->size();\n+}\n+\n+Coord Signal::getSenderPos() const\n+{\n+\treturn senderPos;\n+}\n+\n+Coord Signal::getReceiverPos() const\n+{\n+\treturn receiverPos;\n+}\n+\n+void Signal::setSendingStart(simtime_t start)\n+{\n+\tsendingStart = start;\n+\ttimingUsed = true;\n+}\n+\n+void Signal::setDuration(simtime_t dur)\n+{\n+\tduration = dur;\n+\ttimingUsed = true;\n+}\n+\n+void Signal::setPropagationDelay(simtime_t_cref delay)\n+{\n+\tpropagationDelay = delay;\n+}\n+\n+void Signal::setTiming(simtime_t start, simtime_t dur)\n+{\n+\tsendingStart = start;\n+\tduration = dur;\n+\ttimingUsed = true;\n+}\n+\n+simtime_t_cref Signal::getSendingStart() const\n+{\n+\treturn sendingStart;\n+}\n+\n+simtime_t Signal::getSendingEnd() const\n+{\n+\treturn sendingStart + duration;\n+}\n+\n+simtime_t Signal::getReceptionStart() const\n+{\n+\treturn sendingStart + propagationDelay;\n+}\n+\n+simtime_t Signal::getReceptionEnd() const\n+{\n+\treturn sendingStart + propagationDelay + duration;\n+}\n+\n+simtime_t_cref Signal::getDuration() const\n+{\n+\treturn duration;\n+}\n+\n+simtime_t_cref Signal::getPropagationDelay() const\n+{\n+\treturn propagationDelay;\n+}\n+\n+bool Signal::hasTiming() const\n+{\n+\treturn timingUsed;\n+}\n+\n+double Signal::getRelativeMin() const\n+{\n+\treturn *(std::min_element(values+relativeOffset, values+relativeOffset+numRelativeValues));\n+}\n+\n+double Signal::getDataMin() const\n+{\n+\treturn *(std::min_element(values+dataOffset, values+dataOffset+numDataValues));\n+}\n+\n+double Signal::getMinInRange(size_t freqIndexLow, size_t freqIndexHigh) const\n+{\n+\treturn *(std::min_element(values+freqIndexLow, values+freqIndexHigh));\n+}\n+\n+double Signal::getRelativeMax() const\n+{\n+\treturn *(std::max_element(values+relativeOffset, values+relativeOffset+numRelativeValues));\n+}\n+\n+double Signal::getDataMax() const\n+{\n+\treturn *(std::max_element(values+dataOffset, values+dataOffset+numDataValues));\n+}\n+\n+double Signal::getMaxInRange(size_t freqIndexLow, size_t freqIndexHigh) const\n+{\n+\treturn *(std::max_element(values+freqIndexLow, values+freqIndexHigh));\n+}\n+\n+void Signal::print() const\n+{\n+\tif(timingUsed)\n+\t\tstd::cout << \"Range: \" << getReceptionStart() << \" - \" << getReceptionEnd() << \" (\" << duration << \")\" << std::endl;\n+\n+\tfor(uint16_t i=getRelativeStart();i<getRelativeEnd();i++)\n+\t{\n+\t\tstd::cout << spectrum->freqAt(i) << \":\\t \" << values[i] << std::endl;\n+\t}\n+\n+\tstd::cout << \"-----------------------------------------------\" << std::endl;\n+}\n+\n+void Signal::printAbsolute() const\n+{\n+\tstd::cout << \"-----------------------------------------------\" << std::endl;\n+\n+\tif(timingUsed)\n+\t\tstd::cout << \"Range: \" << getReceptionStart() << \" - \" << getReceptionEnd() << \" (\" << duration << \")\" << std::endl;\n+\n+\tfor(uint16_t i=0;i<numAbsoluteValues;i++)\n+\t{\n+\t\tstd::cout << spectrum->freqAt(i) << \":\\t \" << values[i] << std::endl;\n+\t}\n+}\n+\n+Signal& Signal::operator= (const double value)\n+{\n+\tfor(size_t i = 0; i < numAbsoluteValues; i++)\n+\t{\n+\t\tvalues[i] = value;\n+\t}\n+\treturn *this;\n+}\n+\n+Signal& Signal::operator= (const Signal& other)\n+{\n+\tif(this == &other)\n+\t\treturn *this;\n+\n+\tsenderModuleID = other.senderModuleID;\n+\tsenderFromGateID = other.senderFromGateID;\n+\treceiverModuleID = other.receiverModuleID;\n+\treceiverToGateID = other.receiverToGateID;\n+\n+\tspectrum = other.getSpectrum();\n+\n+\trelativeOffset = other.getRelativeOffset();\n+\tdataOffset = other.getDataOffset();\n+\n+\tcenterFrequencyIndex = other.getCenterFrequencyIndex();\n+\n+\tnumAbsoluteValues = other.getNumAbsoluteValues();\n+\tnumRelativeValues = other.getNumRelativeValues();\n+\tnumDataValues = other.getNumDataValues();\n+\n+\t//TODO: Check if new spectrum has changed and new one is larger\n+\tif(values)\n+\t\tdelete[] values;\n+\tvalues = new double[spectrum->getNumFreqs()]{0};\n+\n+\tstd::copy(other.getAbsoluteValues(), other.getAbsoluteValues()+numAbsoluteValues, values);\n+\n+\tanalogueModelList = other.getAnalogueModelList();\n+\tnumAnalogueModelsApplied = other.getNumAnalogueModelsApplied();\n+\tsenderPos = other.getSenderPos();\n+\treceiverPos = other.getReceiverPos();\n+\n+\ttimingUsed = other.hasTiming();\n+\tsendingStart = other.getSendingStart();\n+\tduration = other.getDuration();\n+\tpropagationDelay = other.getPropagationDelay();\n+\n+\tbitrate = other.getBitrate();\n+\n+\treturn *this;\n+}\n+\n+Signal& Signal::operator+= (const Signal& other)\n+{\n+\tassert(this->getSpectrum() == other.getSpectrum());","path":"src/veins/base/toolbox/Signal.cc","position":532,"original_position":532,"commit_id":"70044a567321fc7df7cb50bd1814630272953ab6","original_commit_id":"70044a567321fc7df7cb50bd1814630272953ab6","user":{"login":"mightyCelu","id":2754929,"node_id":"MDQ6VXNlcjI3NTQ5Mjk=","avatar_url":"https://avatars3.githubusercontent.com/u/2754929?v=4","gravatar_id":"","url":"https://api.github.com/users/mightyCelu","html_url":"https://github.com/mightyCelu","followers_url":"https://api.github.com/users/mightyCelu/followers","following_url":"https://api.github.com/users/mightyCelu/following{/other_user}","gists_url":"https://api.github.com/users/mightyCelu/gists{/gist_id}","starred_url":"https://api.github.com/users/mightyCelu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mightyCelu/subscriptions","organizations_url":"https://api.github.com/users/mightyCelu/orgs","repos_url":"https://api.github.com/users/mightyCelu/repos","events_url":"https://api.github.com/users/mightyCelu/events{/privacy}","received_events_url":"https://api.github.com/users/mightyCelu/received_events","type":"User","site_admin":false},"body":"Consider using OMNeT++'s `ASSERT`.","created_at":"2018-07-10T15:41:25Z","updated_at":"2018-07-10T15:49:19Z","html_url":"https://github.com/sommer/veins/pull/78#discussion_r201393325","pull_request_url":"https://api.github.com/repos/sommer/veins/pulls/78","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/sommer/veins/pulls/comments/201393325"},"html":{"href":"https://github.com/sommer/veins/pull/78#discussion_r201393325"},"pull_request":{"href":"https://api.github.com/repos/sommer/veins/pulls/78"}}},"pull_request":{"url":"https://api.github.com/repos/sommer/veins/pulls/78","id":200366784,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAwMzY2Nzg0","html_url":"https://github.com/sommer/veins/pull/78","diff_url":"https://github.com/sommer/veins/pull/78.diff","patch_url":"https://github.com/sommer/veins/pull/78.patch","issue_url":"https://api.github.com/repos/sommer/veins/issues/78","number":78,"state":"closed","locked":false,"title":"Rewrite PHY to use completely new signal representation and thresholding mechanism","user":{"login":"f-bronner","id":38812239,"node_id":"MDQ6VXNlcjM4ODEyMjM5","avatar_url":"https://avatars1.githubusercontent.com/u/38812239?v=4","gravatar_id":"","url":"https://api.github.com/users/f-bronner","html_url":"https://github.com/f-bronner","followers_url":"https://api.github.com/users/f-bronner/followers","following_url":"https://api.github.com/users/f-bronner/following{/other_user}","gists_url":"https://api.github.com/users/f-bronner/gists{/gist_id}","starred_url":"https://api.github.com/users/f-bronner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f-bronner/subscriptions","organizations_url":"https://api.github.com/users/f-bronner/orgs","repos_url":"https://api.github.com/users/f-bronner/repos","events_url":"https://api.github.com/users/f-bronner/events{/privacy}","received_events_url":"https://api.github.com/users/f-bronner/received_events","type":"User","site_admin":false},"body":"These changes basically replace the mapping utilities, mostly used to represent wireless signals.\r\nAs they seem to be computational expensive, I introduce a new way of signal representation: a time independent description of their spectral shape.\r\nI was able to reproduce the same simulation results with this approach while having a faster execution of the simulation.\r\nAdditionally, the thresholding mechanism can avoid the computation of attenuation factors (represented by analogue models) if their computation does not influence the final results.\r\n\r\nThe pull request also contains several minor optimizations of the source.\r\n\r\nI created the source during work on my Bachelor thesis, more information can be found here: http://www.ccs-labs.org/bib/bronner2018efficient/","created_at":"2018-07-10T11:37:26Z","updated_at":"2018-07-10T15:49:19Z","closed_at":"2018-07-10T14:56:27Z","merged_at":"2018-07-10T14:56:27Z","merge_commit_sha":"81f0cde52088ba154a4fb4e5b023eedba694f8b3","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/sommer/veins/pulls/78/commits","review_comments_url":"https://api.github.com/repos/sommer/veins/pulls/78/comments","review_comment_url":"https://api.github.com/repos/sommer/veins/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sommer/veins/issues/78/comments","statuses_url":"https://api.github.com/repos/sommer/veins/statuses/70044a567321fc7df7cb50bd1814630272953ab6","head":{"label":"f-bronner:master","ref":"master","sha":"70044a567321fc7df7cb50bd1814630272953ab6","user":{"login":"f-bronner","id":38812239,"node_id":"MDQ6VXNlcjM4ODEyMjM5","avatar_url":"https://avatars1.githubusercontent.com/u/38812239?v=4","gravatar_id":"","url":"https://api.github.com/users/f-bronner","html_url":"https://github.com/f-bronner","followers_url":"https://api.github.com/users/f-bronner/followers","following_url":"https://api.github.com/users/f-bronner/following{/other_user}","gists_url":"https://api.github.com/users/f-bronner/gists{/gist_id}","starred_url":"https://api.github.com/users/f-bronner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f-bronner/subscriptions","organizations_url":"https://api.github.com/users/f-bronner/orgs","repos_url":"https://api.github.com/users/f-bronner/repos","events_url":"https://api.github.com/users/f-bronner/events{/privacy}","received_events_url":"https://api.github.com/users/f-bronner/received_events","type":"User","site_admin":false},"repo":{"id":131429082,"node_id":"MDEwOlJlcG9zaXRvcnkxMzE0MjkwODI=","name":"veins","full_name":"f-bronner/veins","owner":{"login":"f-bronner","id":38812239,"node_id":"MDQ6VXNlcjM4ODEyMjM5","avatar_url":"https://avatars1.githubusercontent.com/u/38812239?v=4","gravatar_id":"","url":"https://api.github.com/users/f-bronner","html_url":"https://github.com/f-bronner","followers_url":"https://api.github.com/users/f-bronner/followers","following_url":"https://api.github.com/users/f-bronner/following{/other_user}","gists_url":"https://api.github.com/users/f-bronner/gists{/gist_id}","starred_url":"https://api.github.com/users/f-bronner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f-bronner/subscriptions","organizations_url":"https://api.github.com/users/f-bronner/orgs","repos_url":"https://api.github.com/users/f-bronner/repos","events_url":"https://api.github.com/users/f-bronner/events{/privacy}","received_events_url":"https://api.github.com/users/f-bronner/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/f-bronner/veins","description":"The open source vehicular network simulation framework.","fork":true,"url":"https://api.github.com/repos/f-bronner/veins","forks_url":"https://api.github.com/repos/f-bronner/veins/forks","keys_url":"https://api.github.com/repos/f-bronner/veins/keys{/key_id}","collaborators_url":"https://api.github.com/repos/f-bronner/veins/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/f-bronner/veins/teams","hooks_url":"https://api.github.com/repos/f-bronner/veins/hooks","issue_events_url":"https://api.github.com/repos/f-bronner/veins/issues/events{/number}","events_url":"https://api.github.com/repos/f-bronner/veins/events","assignees_url":"https://api.github.com/repos/f-bronner/veins/assignees{/user}","branches_url":"https://api.github.com/repos/f-bronner/veins/branches{/branch}","tags_url":"https://api.github.com/repos/f-bronner/veins/tags","blobs_url":"https://api.github.com/repos/f-bronner/veins/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/f-bronner/veins/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/f-bronner/veins/git/refs{/sha}","trees_url":"https://api.github.com/repos/f-bronner/veins/git/trees{/sha}","statuses_url":"https://api.github.com/repos/f-bronner/veins/statuses/{sha}","languages_url":"https://api.github.com/repos/f-bronner/veins/languages","stargazers_url":"https://api.github.com/repos/f-bronner/veins/stargazers","contributors_url":"https://api.github.com/repos/f-bronner/veins/contributors","subscribers_url":"https://api.github.com/repos/f-bronner/veins/subscribers","subscription_url":"https://api.github.com/repos/f-bronner/veins/subscription","commits_url":"https://api.github.com/repos/f-bronner/veins/commits{/sha}","git_commits_url":"https://api.github.com/repos/f-bronner/veins/git/commits{/sha}","comments_url":"https://api.github.com/repos/f-bronner/veins/comments{/number}","issue_comment_url":"https://api.github.com/repos/f-bronner/veins/issues/comments{/number}","contents_url":"https://api.github.com/repos/f-bronner/veins/contents/{+path}","compare_url":"https://api.github.com/repos/f-bronner/veins/compare/{base}...{head}","merges_url":"https://api.github.com/repos/f-bronner/veins/merges","archive_url":"https://api.github.com/repos/f-bronner/veins/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/f-bronner/veins/downloads","issues_url":"https://api.github.com/repos/f-bronner/veins/issues{/number}","pulls_url":"https://api.github.com/repos/f-bronner/veins/pulls{/number}","milestones_url":"https://api.github.com/repos/f-bronner/veins/milestones{/number}","notifications_url":"https://api.github.com/repos/f-bronner/veins/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/f-bronner/veins/labels{/name}","releases_url":"https://api.github.com/repos/f-bronner/veins/releases{/id}","deployments_url":"https://api.github.com/repos/f-bronner/veins/deployments","created_at":"2018-04-28T17:12:46Z","updated_at":"2018-07-10T01:47:56Z","pushed_at":"2018-07-10T01:47:54Z","git_url":"git://github.com/f-bronner/veins.git","ssh_url":"git@github.com:f-bronner/veins.git","clone_url":"https://github.com/f-bronner/veins.git","svn_url":"https://github.com/f-bronner/veins","homepage":"http://veins.car2x.org","size":14960,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"sommer:master","ref":"master","sha":"20435c19699fa80ffdf9c84fb9471f8cba9dae74","user":{"login":"sommer","id":29601,"node_id":"MDQ6VXNlcjI5NjAx","avatar_url":"https://avatars1.githubusercontent.com/u/29601?v=4","gravatar_id":"","url":"https://api.github.com/users/sommer","html_url":"https://github.com/sommer","followers_url":"https://api.github.com/users/sommer/followers","following_url":"https://api.github.com/users/sommer/following{/other_user}","gists_url":"https://api.github.com/users/sommer/gists{/gist_id}","starred_url":"https://api.github.com/users/sommer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sommer/subscriptions","organizations_url":"https://api.github.com/users/sommer/orgs","repos_url":"https://api.github.com/users/sommer/repos","events_url":"https://api.github.com/users/sommer/events{/privacy}","received_events_url":"https://api.github.com/users/sommer/received_events","type":"User","site_admin":false},"repo":{"id":630140,"node_id":"MDEwOlJlcG9zaXRvcnk2MzAxNDA=","name":"veins","full_name":"sommer/veins","owner":{"login":"sommer","id":29601,"node_id":"MDQ6VXNlcjI5NjAx","avatar_url":"https://avatars1.githubusercontent.com/u/29601?v=4","gravatar_id":"","url":"https://api.github.com/users/sommer","html_url":"https://github.com/sommer","followers_url":"https://api.github.com/users/sommer/followers","following_url":"https://api.github.com/users/sommer/following{/other_user}","gists_url":"https://api.github.com/users/sommer/gists{/gist_id}","starred_url":"https://api.github.com/users/sommer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sommer/subscriptions","organizations_url":"https://api.github.com/users/sommer/orgs","repos_url":"https://api.github.com/users/sommer/repos","events_url":"https://api.github.com/users/sommer/events{/privacy}","received_events_url":"https://api.github.com/users/sommer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sommer/veins","description":"Official Repository of Veins - The open source vehicular network simulation framework.","fork":true,"url":"https://api.github.com/repos/sommer/veins","forks_url":"https://api.github.com/repos/sommer/veins/forks","keys_url":"https://api.github.com/repos/sommer/veins/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sommer/veins/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sommer/veins/teams","hooks_url":"https://api.github.com/repos/sommer/veins/hooks","issue_events_url":"https://api.github.com/repos/sommer/veins/issues/events{/number}","events_url":"https://api.github.com/repos/sommer/veins/events","assignees_url":"https://api.github.com/repos/sommer/veins/assignees{/user}","branches_url":"https://api.github.com/repos/sommer/veins/branches{/branch}","tags_url":"https://api.github.com/repos/sommer/veins/tags","blobs_url":"https://api.github.com/repos/sommer/veins/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sommer/veins/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sommer/veins/git/refs{/sha}","trees_url":"https://api.github.com/repos/sommer/veins/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sommer/veins/statuses/{sha}","languages_url":"https://api.github.com/repos/sommer/veins/languages","stargazers_url":"https://api.github.com/repos/sommer/veins/stargazers","contributors_url":"https://api.github.com/repos/sommer/veins/contributors","subscribers_url":"https://api.github.com/repos/sommer/veins/subscribers","subscription_url":"https://api.github.com/repos/sommer/veins/subscription","commits_url":"https://api.github.com/repos/sommer/veins/commits{/sha}","git_commits_url":"https://api.github.com/repos/sommer/veins/git/commits{/sha}","comments_url":"https://api.github.com/repos/sommer/veins/comments{/number}","issue_comment_url":"https://api.github.com/repos/sommer/veins/issues/comments{/number}","contents_url":"https://api.github.com/repos/sommer/veins/contents/{+path}","compare_url":"https://api.github.com/repos/sommer/veins/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sommer/veins/merges","archive_url":"https://api.github.com/repos/sommer/veins/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sommer/veins/downloads","issues_url":"https://api.github.com/repos/sommer/veins/issues{/number}","pulls_url":"https://api.github.com/repos/sommer/veins/pulls{/number}","milestones_url":"https://api.github.com/repos/sommer/veins/milestones{/number}","notifications_url":"https://api.github.com/repos/sommer/veins/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sommer/veins/labels{/name}","releases_url":"https://api.github.com/repos/sommer/veins/releases{/id}","deployments_url":"https://api.github.com/repos/sommer/veins/deployments","created_at":"2010-04-26T19:05:21Z","updated_at":"2018-07-10T15:33:39Z","pushed_at":"2018-07-10T15:33:36Z","git_url":"git://github.com/sommer/veins.git","ssh_url":"git@github.com:sommer/veins.git","clone_url":"https://github.com/sommer/veins.git","svn_url":"https://github.com/sommer/veins","homepage":"http://veins.car2x.org","size":14976,"stargazers_count":58,"watchers_count":58,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":70,"mirror_url":null,"archived":false,"open_issues_count":11,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":70,"open_issues":11,"watchers":58,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sommer/veins/pulls/78"},"html":{"href":"https://github.com/sommer/veins/pull/78"},"issue":{"href":"https://api.github.com/repos/sommer/veins/issues/78"},"comments":{"href":"https://api.github.com/repos/sommer/veins/issues/78/comments"},"review_comments":{"href":"https://api.github.com/repos/sommer/veins/pulls/78/comments"},"review_comment":{"href":"https://api.github.com/repos/sommer/veins/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sommer/veins/pulls/78/commits"},"statuses":{"href":"https://api.github.com/repos/sommer/veins/statuses/70044a567321fc7df7cb50bd1814630272953ab6"}},"author_association":"NONE"}}
{"actor":{"display_login":"mightyCelu"}}