heart is beating! tuk-tuk, tuk-tuk
Main engine has been finished, but needed to debug and refactoring
This commit is contained in:
		@@ -1,2 +0,0 @@
 | 
				
			|||||||
\chapter*{Введение}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -261,36 +261,7 @@ default ‘foobar’”
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Беря во внимание все вышеизложенное, такой результат может вернуть приложение-задача серверу на запрос информации (reltask -i):
 | 
					Беря во внимание все вышеизложенное, такой результат может вернуть приложение-задача серверу на запрос информации (reltask -i):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%{
 | 
					
 | 
				
			||||||
%        "title": "Example task",
 | 
					 | 
				
			||||||
%        "models": [
 | 
					 | 
				
			||||||
%            {
 | 
					 | 
				
			||||||
%                "title": "Example model",
 | 
					 | 
				
			||||||
%        "data": {
 | 
					 | 
				
			||||||
%                    "energy_max": "int choice [100] default 100 // Максимальная энергия",
 | 
					 | 
				
			||||||
%                    "energy_start": "int default 50 // Начальная энергия",
 | 
					 | 
				
			||||||
%                    "temp_start": "int default -15 // Температура в доме в момент приезда",
 | 
					 | 
				
			||||||
%                    "quota": "int default 200 // Количество работы для выполнения",
 | 
					 | 
				
			||||||
%                }
 | 
					 | 
				
			||||||
%                "methods": [
 | 
					 | 
				
			||||||
%                    {
 | 
					 | 
				
			||||||
%                        "title": "default",
 | 
					 | 
				
			||||||
%                        "data": {
 | 
					 | 
				
			||||||
%                                “temp_hour”: “int default -2 // Изменение температуры в час”
 | 
					 | 
				
			||||||
%                        }
 | 
					 | 
				
			||||||
%                    “results”:
 | 
					 | 
				
			||||||
%                {
 | 
					 | 
				
			||||||
%                        “data”: { “period”: “period”, “food”: “int” },
 | 
					 | 
				
			||||||
%“table”:
 | 
					 | 
				
			||||||
%{
 | 
					 | 
				
			||||||
%“head”: [“time title ‘Time’”, “int title ‘Energy’”, “int title ‘Temperature’”]
 | 
					 | 
				
			||||||
%}        
 | 
					 | 
				
			||||||
%                }
 | 
					 | 
				
			||||||
%}
 | 
					 | 
				
			||||||
%                        ]
 | 
					 | 
				
			||||||
%            }
 | 
					 | 
				
			||||||
%        ]
 | 
					 | 
				
			||||||
%}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Описание задачи состоит из списка моделей, которые включают в себя описание полей данных и методов. Методы тоже, как и модели, могут (и должны) включать в себя описание данных, которые будут использоваться управлением алгоритма.
 | 
					Описание задачи состоит из списка моделей, которые включают в себя описание полей данных и методов. Методы тоже, как и модели, могут (и должны) включать в себя описание данных, которые будут использоваться управлением алгоритма.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								trunk/manual/intro.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								trunk/manual/intro.tex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					\chapter*{Введение}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					О проникновении в нашу жизнь облачных технологий и возврату к терминальному режиму на современном уровне.
 | 
				
			||||||
							
								
								
									
										4
									
								
								trunk/manual/listings/answer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								trunk/manual/listings/answer.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
						"title": "test",
 | 
				
			||||||
 | 
						"author": "Anton Vakhrushev"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -4,9 +4,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
\begin{document}
 | 
					\begin{document}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\include{00_intro}
 | 
					\include{intro}
 | 
				
			||||||
\include{10_overview}
 | 
					\include{overview}
 | 
				
			||||||
\include{20_for_user}
 | 
					\include{for_user}
 | 
				
			||||||
\include{30_for_prog}
 | 
					\include{for_prog}
 | 
				
			||||||
 | 
					\include{outro}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\end{document}
 | 
					\end{document}
 | 
				
			||||||
							
								
								
									
										3
									
								
								trunk/manual/outro.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								trunk/manual/outro.tex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					\chapter*{Заключение}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Спасибо за внимание!
 | 
				
			||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
\section{Задача оптимального управления}
 | 
					\section{Задача оптимального управления}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет "рывками", она плавно едет по извилистой змейке дороги.
 | 
					В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет <<рывками>>, она плавно едет по извилистой змейке дороги.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Но, тем не менее, почти все непрерывные процессы мы можем представить в качестве дискретных. Струю воды можно считать по каплям, а путь автомобиля по пройденным сантиметрам. Такой подход несколько неудобен для человека, который привык к плавности движений и форм. Однако, для вычислительных машин нет ничего лучше! Компьютеры все меряют отдельными значениями. Но если маленьких отдельных значений очень много, то они становятся похожи на непрерывный набор данных, поэтому, в сущности, какая в конечном счете разница что использовать: непрерывные функции или их дискретные аналоги?
 | 
					Но, тем не менее, почти все непрерывные процессы мы можем представить в качестве дискретных. Струю воды можно считать по каплям, а путь автомобиля по пройденным сантиметрам. Такой подход несколько неудобен для человека, который привык к плавности движений и форм. Однако, для вычислительных машин нет ничего лучше! Компьютеры все меряют отдельными значениями. Но если маленьких отдельных значений очень много, то они становятся похожи на непрерывный набор данных, поэтому, в сущности, какая в конечном счете разница что использовать: непрерывные функции или их дискретные аналоги?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -21,6 +21,15 @@ import subprocess
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import task
 | 
					import task
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					globallock = threading.Lock()
 | 
				
			||||||
 | 
					def WriteToLog(msg):
 | 
				
			||||||
 | 
					    with globallock:
 | 
				
			||||||
 | 
					        tm = str(datetime.datetime.now())
 | 
				
			||||||
 | 
					        msg = tm + '  ' + str(msg)
 | 
				
			||||||
 | 
					        #self.log.write(msg + '\n')
 | 
				
			||||||
 | 
					        print msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def GenerateId(data):
 | 
					def GenerateId(data):
 | 
				
			||||||
    import hashlib
 | 
					    import hashlib
 | 
				
			||||||
    title  = data['title']
 | 
					    title  = data['title']
 | 
				
			||||||
@@ -35,16 +44,19 @@ class LocalServer:
 | 
				
			|||||||
        self.max_workers = 2
 | 
					        self.max_workers = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.task_descrs = []
 | 
					        self.task_descrs = []
 | 
				
			||||||
        self.task_queue = []
 | 
					        self.jobs_queue = []
 | 
				
			||||||
        self.log = None
 | 
					        self.log = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.lock = threading.Lock()
 | 
					        self.queue_lock = threading.Lock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # init actions
 | 
					        # init actions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.log = open('log.txt', 'w')
 | 
					        self.log = open('log.txt', 'w')
 | 
				
			||||||
        self.WriteToLog('local server initialized')
 | 
					        self.WriteToLog('local server initialized')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        worker = Worker(self.jobs_queue, self.queue_lock)
 | 
				
			||||||
 | 
					        worker.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def Close(self):
 | 
					    def Close(self):
 | 
				
			||||||
        self.WriteToLog('local server closed\n')
 | 
					        self.WriteToLog('local server closed\n')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,8 +88,10 @@ class LocalServer:
 | 
				
			|||||||
            try:
 | 
					            try:
 | 
				
			||||||
                # нормализуем указанный путь
 | 
					                # нормализуем указанный путь
 | 
				
			||||||
                line = os.path.normpath(line)
 | 
					                line = os.path.normpath(line)
 | 
				
			||||||
 | 
					                line = os.path.abspath(line)
 | 
				
			||||||
                # считываем данные через shell (важно для скриптовых языков)
 | 
					                # считываем данные через shell (важно для скриптовых языков)
 | 
				
			||||||
                textdata = subprocess.check_output([line, '-i'], shell = True)
 | 
					                textdata = subprocess.check_output([line, '-i'], shell = True,
 | 
				
			||||||
 | 
					                    cwd = os.path.dirname(line))
 | 
				
			||||||
                # загружаем данные описания задачи
 | 
					                # загружаем данные описания задачи
 | 
				
			||||||
                data = json.loads(textdata)
 | 
					                data = json.loads(textdata)
 | 
				
			||||||
                # провряем их на корректность
 | 
					                # провряем их на корректность
 | 
				
			||||||
@@ -106,8 +120,11 @@ class LocalServer:
 | 
				
			|||||||
    def GetJob(self, index):
 | 
					    def GetJob(self, index):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def AddJob(self, taskdescr, data):
 | 
					    def AddJob(self, taskd, datadump):
 | 
				
			||||||
        pass
 | 
					        job = Job(taskd, datadump)
 | 
				
			||||||
 | 
					        with self.queue_lock:
 | 
				
			||||||
 | 
					            self.jobs_queue.append(job)
 | 
				
			||||||
 | 
					        WriteToLog('Job added')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#-------------------------------------------------------------------------------
 | 
					#-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -117,19 +134,22 @@ class Worker(threading.Thread):
 | 
				
			|||||||
        self.queue = queue
 | 
					        self.queue = queue
 | 
				
			||||||
        self.lock = lock
 | 
					        self.lock = lock
 | 
				
			||||||
        self.daemon = True
 | 
					        self.daemon = True
 | 
				
			||||||
 | 
					        WriteToLog('worker started')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def FindNext(self):
 | 
					    def FindNext(self):
 | 
				
			||||||
        result = None
 | 
					        result = None
 | 
				
			||||||
        for job in self.queue:
 | 
					        for job in self.queue:
 | 
				
			||||||
            if job.GetStatus() == JOB_STOP:
 | 
					            if job.GetState() == JOB_READY:
 | 
				
			||||||
                result = job
 | 
					                result = job
 | 
				
			||||||
        return result
 | 
					        return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run(self):
 | 
					    def run(self):
 | 
				
			||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            job = None
 | 
					            job = None
 | 
				
			||||||
 | 
					            # найти следующее готовое к выполнению задание
 | 
				
			||||||
            with self.lock:
 | 
					            with self.lock:
 | 
				
			||||||
                job = FindNext()
 | 
					                job = self.FindNext()
 | 
				
			||||||
 | 
					            # и, если нашли, приступаем к выполнению
 | 
				
			||||||
            if job:
 | 
					            if job:
 | 
				
			||||||
                job.Start()
 | 
					                job.Start()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
@@ -137,32 +157,57 @@ class Worker(threading.Thread):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#-------------------------------------------------------------------------------
 | 
					#-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
JOB_STOP     = 0
 | 
					JOB_READY     = 0
 | 
				
			||||||
JOB_RUN      = 1
 | 
					JOB_RUNNING   = 1
 | 
				
			||||||
JOB_PAUSE    = 2
 | 
					JOB_STOPPED   = 2
 | 
				
			||||||
JOB_COMPLETE = 4
 | 
					JOB_COMPLETED = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Job:
 | 
					class Job:
 | 
				
			||||||
    def __init__(self, taskd, datadump):
 | 
					    def __init__(self, taskd, datadump):
 | 
				
			||||||
        self.taskd   = taskd
 | 
					        self.taskd   = taskd
 | 
				
			||||||
        self.datad   = datadump
 | 
					        self.datad   = datadump
 | 
				
			||||||
        self.status  = JOB_STOP
 | 
					        self.state   = JOB_READY
 | 
				
			||||||
        self.percent = 0.0
 | 
					        self.percent = 0.0
 | 
				
			||||||
        self.result  = None
 | 
					        self.result  = None
 | 
				
			||||||
 | 
					        self.proc    = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #self.
 | 
					    def ProcessMsg(self, msg):
 | 
				
			||||||
 | 
					        WriteToLog(msg.strip())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def Start(self):
 | 
					    def Start(self):
 | 
				
			||||||
        pass
 | 
					        #try:
 | 
				
			||||||
 | 
					            self.state = JOB_RUNNING
 | 
				
			||||||
 | 
					            WriteToLog('Job started')
 | 
				
			||||||
 | 
					            execpath = self.taskd.execpath
 | 
				
			||||||
 | 
					            # запускаем процесс на выполнение
 | 
				
			||||||
 | 
					            self.proc = subprocess.Popen([execpath, '-r'], shell = True,
 | 
				
			||||||
 | 
					                stdin = subprocess.PIPE, stdout = subprocess.PIPE,
 | 
				
			||||||
 | 
					                stderr = subprocess.STDOUT, cwd = os.path.dirname(execpath))
 | 
				
			||||||
 | 
					            # передаем стартовые параметры
 | 
				
			||||||
 | 
					            istream = self.proc.stdin
 | 
				
			||||||
 | 
					            ostream = self.proc.stdout
 | 
				
			||||||
 | 
					            istream.write(self.datad + '\n')
 | 
				
			||||||
 | 
					            istream.flush()
 | 
				
			||||||
 | 
					            # пока процесс не завершится (или его не прибьют)
 | 
				
			||||||
 | 
					            while self.proc.poll() == None:
 | 
				
			||||||
 | 
					                try:
 | 
				
			||||||
 | 
					                    msg  = ostream.readline()
 | 
				
			||||||
 | 
					                    self.ProcessMsg(msg)
 | 
				
			||||||
 | 
					                except Exception, e:
 | 
				
			||||||
 | 
					                    WriteToLog('Income msg failed' + str(e))
 | 
				
			||||||
 | 
					            self.state = JOB_COMPLETED
 | 
				
			||||||
 | 
					            WriteToLog('Job done')
 | 
				
			||||||
 | 
					        #except:
 | 
				
			||||||
 | 
					            #WriteToLog('Job loop failed')
 | 
				
			||||||
 | 
					            #self.state = JOB_STOPPED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def Stop(self):
 | 
					    def Stop(self):
 | 
				
			||||||
        pass
 | 
					        if self.proc and self.proc.poll() != None:
 | 
				
			||||||
 | 
					            self.proc.kill()
 | 
				
			||||||
 | 
					            WriteToLog('Job killed')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def Pause(self):
 | 
					    def GetState(self):
 | 
				
			||||||
        pass
 | 
					        return self.state
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def GetStatus(self):
 | 
					 | 
				
			||||||
        return self.status
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def IsComplete(self):
 | 
					    def IsComplete(self):
 | 
				
			||||||
        return self.GetStatus() == JOB_COMPLETE
 | 
					        return self.GetStatus() == JOB_COMPLETE
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ class TaskDescription:
 | 
				
			|||||||
        self.data       = data
 | 
					        self.data       = data
 | 
				
			||||||
        self.models     = []
 | 
					        self.models     = []
 | 
				
			||||||
        for label, data in self.data['models'].iteritems():
 | 
					        for label, data in self.data['models'].iteritems():
 | 
				
			||||||
            self.models.append(DataDescription(self, label, data, self.server))
 | 
					            self.models.append(DataDescription(None, label, data, self))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetModelsDescriptions(self):
 | 
					    def GetModelsDescriptions(self):
 | 
				
			||||||
        return self.models
 | 
					        return self.models
 | 
				
			||||||
@@ -126,20 +126,23 @@ class DataDefinition:
 | 
				
			|||||||
            raise ValueError
 | 
					            raise ValueError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def PackParams(self):
 | 
					    def PackParams(self):
 | 
				
			||||||
 | 
					 | 
				
			||||||
        owner = self
 | 
					 | 
				
			||||||
        package = []
 | 
					        package = []
 | 
				
			||||||
 | 
					        owner = self
 | 
				
			||||||
        while owner:
 | 
					        while owner:
 | 
				
			||||||
            data = {'label': owner.DD.GetLabel(), 'params': owner.params}
 | 
					            data = {'label': owner.DD.GetLabel(), 'params': owner.params}
 | 
				
			||||||
            package.append(data)
 | 
					            package.append(data)
 | 
				
			||||||
            owner = owner.parent
 | 
					            owner = owner.parent
 | 
				
			||||||
        package.reverse()
 | 
					        package.reverse()
 | 
				
			||||||
 | 
					        return json.dumps(package)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return package
 | 
					    def Flush(self):
 | 
				
			||||||
 | 
					        server = self.DD.taskd.server
 | 
				
			||||||
 | 
					        datadump = self.PackParams()
 | 
				
			||||||
 | 
					        server.AddJob(self.DD.taskd, datadump)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#-------------------------------------------------------------------------------
 | 
					#-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import server, json
 | 
					import server, json, time
 | 
				
			||||||
from pprint import pprint
 | 
					from pprint import pprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
@@ -153,11 +156,15 @@ def main():
 | 
				
			|||||||
    model = models[0]
 | 
					    model = models[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mdef = DataDefinition(model)
 | 
					    mdef = DataDefinition(model)
 | 
				
			||||||
    #pprint(mdef.DD.data)
 | 
					    pprint(mdef.DD.data)
 | 
				
			||||||
    mdef['x'] = 20
 | 
					    mdef['x'] = 20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    p = mdef.PackParams()
 | 
					    p = mdef.PackParams()
 | 
				
			||||||
    pprint(p)
 | 
					    pprint(p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mdef.Flush()
 | 
				
			||||||
 | 
					    mdef.Flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    time.sleep(15)
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    main()
 | 
					    main()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,22 +3,27 @@
 | 
				
			|||||||
import sys
 | 
					import sys
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def write(msg):
 | 
				
			||||||
 | 
					    sys.stdout.write(msg + '\n')
 | 
				
			||||||
 | 
					    sys.stdout.flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    try:
 | 
					#    try:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d = os.path.dirname(__file__)
 | 
					 | 
				
			||||||
    os.chdir(d)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if sys.argv[1] == '-i':
 | 
					    if sys.argv[1] == '-i':
 | 
				
			||||||
        with open('testt.js') as f:
 | 
					        with open('testt.json') as f:
 | 
				
			||||||
            d = json.load(f)
 | 
					            d = json.load(f)
 | 
				
			||||||
            print json.dumps(d, indent = 2)
 | 
					            write(json.dumps(d, indent = 2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    elif sys.argv[1] == '-r':
 | 
					    elif sys.argv[1] == '-r':
 | 
				
			||||||
        textdata = raw_input()
 | 
					        textdata = raw_input()
 | 
				
			||||||
        data = json.loads(data)
 | 
					        #data = json.loads(data)
 | 
				
			||||||
 | 
					        for i in xrange(10):
 | 
				
			||||||
 | 
					            time.sleep(0.5)
 | 
				
			||||||
 | 
					            write(json.dumps({ "hello": "world" }))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    except:
 | 
					#    except:
 | 
				
			||||||
#        print 'Error!'
 | 
					#        print 'Error!'
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user