optimizationProcesses.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Tue Feb 23 09:45:26 2021
  5. @author: Oscar Portoles
  6. """
  7. import numpy as np
  8. from modelStages import WBLSmodel
  9. import copy
  10. class Opt_allROIpulse_Wenecor(WBLSmodel):
  11. """OPtimization of pulses for several stages sequetially
  12. With or without time delays (looks at self.velocity)
  13. OPtimizes FC, energy and bump topology"""
  14. def __init__(self,stageIx=0,vel=0,zh=None):
  15. super().__init__(stageIx=stageIx,vel=vel,zh=zh)
  16. self.widthPulse = 0.040 # [seconds] distance from center of bumps/pulse to state edges, width of pulse
  17. self.offMidBump = 0.01 # relative to the middel poit of a bump
  18. self._setHistDelayAndContainers()
  19. self._edgesImpulse()
  20. self._getEmpiReativEnv()
  21. def get_name(self):
  22. return "Opt. all ROI pulses, constrains, no delays, fixed G,L"
  23. def get_bounds(self):
  24. """Boundaries on: pulses """
  25. self.lowbound = [-1000]*self.C
  26. self.upbound = [ 1000]*self.C
  27. self.maxEner = np.max([self.upbound[0], np.abs(self.lowbound[0])]) * self.C
  28. return (self.lowbound, self.upbound)
  29. def fitness(self, x):
  30. self.pulse = np.float64(x)
  31. if self.velocity == 0:
  32. self.runModelNoDel_Pulsein()
  33. else:
  34. self.runModel_Pulsein()
  35. # cost function
  36. self.relativeEnvBuPre()
  37. self.getScorrelRelEnv()
  38. fitByStage = self.similarityPLIsWenergySperm()
  39. # for constrains
  40. self.meanEnvBuStage()
  41. fitSum = np.sum(fitByStage)
  42. if np.isnan(fitSum) or ( np.median(self.msEnv) < 0.01 ).any() or self.sCor < 0: # Penalize wrong solutions
  43. fitSum = -1
  44. # Keep logs
  45. self.log.append( [np.float64(x),self.orders, self.metaL,fitByStage, self.pli.astype(np.float16), np.float16(fitSum), np.float16(self.sCor),
  46. self.msEnv.astype(np.float16), self.mbEnv.astype(np.float16), self.relEnv.astype(np.float16)] )
  47. return np.array([-1* fitSum])
  48. class FindAndKeepBestSolution(WBLSmodel):
  49. """ Extracts the logs form an optimization, get parameters from best solution,
  50. run model and keep last samples. Used for squence of stages"""
  51. def extractBestPulse(self, logs):
  52. maxFit = 0
  53. for logIsla in logs:
  54. fit = np.array([log_[3] for log_ in logIsla]).astype(np.float32)
  55. if np.max(fit) > maxFit:
  56. iXmax = np.argmax(fit)
  57. self.bestPulse = np.array([log_[0] for log_ in logIsla])[iXmax,:].astype(np.float64)
  58. def getBestWeightedModel(self, logs, per):
  59. """ @ logs: list, logs from UDP
  60. @ per: float, percentile of best fitness to look for best solution"""
  61. fit, corr, ener, pulse = [], [], [], []
  62. for logIsla in logs:
  63. fit.append( np.array([log_[5] for log_ in logIsla]).ravel() )
  64. ener.append( np.array([np.sum(np.abs(log_[0])) for log_ in logIsla] ).ravel() )
  65. corr.append( np.array([log_[6] for log_ in logIsla]).ravel() )
  66. pulse.append(np.array([log_[0] for log_ in logIsla] ) )
  67. fit = np.hstack(fit)
  68. ener = np.hstack(ener)
  69. corr = np.hstack(corr)
  70. pulse = np.vstack(pulse)
  71. # top fitness pertcentile threshold
  72. perTh = np.percentile(fit, per)
  73. mask = fit >= perTh
  74. fit, corr, ener, pulse = fit[mask], np.float32(corr[mask]), np.float32(ener[mask]), pulse[mask,:]
  75. # best correlation-energy trade-off
  76. iXbest = np.argmin( ener*(1-corr))
  77. self.bestPulse = pulse[iXbest, :].astype(np.float64)
  78. self.bestEnergy, self.bestFit, self.bestCorr = ener[iXbest], fit[iXbest], corr[iXbest]
  79. def runBestModel(self):
  80. self._setHistDelayAndContainers()
  81. self._edgesImpulse()
  82. self._getEmpiReativEnv()
  83. self.pulse = copy.deepcopy(self.bestPulse)
  84. self.maxEner = 1000.0 * self.C
  85. if self.velocity == 0:
  86. self.runModelNoDel_Pulsein()
  87. else:
  88. self.runModel_Pulsein()
  89. # cost function
  90. self.relativeEnvBuPre()
  91. self.getScorrelRelEnv()
  92. fitByStage = self.similarityPLIsWenergySperm()
  93. # for constrains
  94. self.meanEnvBuStage()
  95. fitSum = np.sum(fitByStage)
  96. # Keep logs
  97. self.log.append( [self.pulse,self.orders, self.metaL,fitByStage, self.pli.astype(np.float16), np.float16(fitSum), np.float16(self.sCor),
  98. self.msEnv.astype(np.float16), self.mbEnv.astype(np.float16), self.relEnv.astype(np.float16)] )
  99. return self.z[:, -(self.maxDlay+1):, :]