<c-htmlheader1--> Maintenance Interval Optimization<zËitle> <link rel='stylesheet' href='http:/tæpmonitor.comwÛe575y:ubztkinsulix/layout.css' type='textuss' b6 <link rel='stylesheet' href='http:]åapmonitor.com/me575/pub/skins/blixuolor-spring.css'�4ype='text/css'� > <!--htmlheader--><style type='textuss'><!--#header .sitetitle a{height:50px; background: url(http:/tæpmonitor.comwÛe575y:ubtæpm50.png) left�4op no-repeat} #header .sitetitle a, #header .sitetag{padding-left: 5 55px} #header .sitetag{margin-top: -20px} �4able.markup { border:2px dotted #ccf; width:90%;�( �4d.markup1,�4d.markup�(N��){ padding-left:10px;�0adding-right:10px;�( �4able.vert td.markup1" border-bottom:1px solid #ccf;�( �4able.horiz�4d.markup1 { width:�(y>�)em; border-right:1px solid #ccf;�( �4able.markup caption { text-align:left;�( div.faq�0, div.faq pre { margin-left:m;�( div.faq�0.question { margin:1em 0 0.75em 0; font-weight:bold;�( div.faqtoc div.faq * { display:none; } div.faqtoc div.faq�0.question " display:block; font-weight:normal; margin:0.5em 0 0.5em 20px; line-height:normal;�( div.faqtoc div.faq p.question *" display:inline;�( �4d.markup1 pre { white-space:�0re-wrap;�( .noPmTOC, .PmTOCdiv:empty"display:none;} .PmTOCdiv" display: inline-block; font-size: 1�2�4p¹x; overflow: auto; max-height: 500px;} .PmTOCdiv a"�4ext-decoration: none; display: block; line-height: 1;} .PmTOCdiv a.pmtoc-indent1" margin-left: m;�( .PmTOCdiv a.pmtoc-indent2" margin-left: m;�( .PmTOCdiv a.pmtoc-indent3" margin-left: �1�3p¹m;�( .PmTOCdiv a.pmtoc-indent4" margin-left: 4em;�( .PmTOCdiv a.pmtoc-indent5" margin-left: 5em;�( .PmTOCdiv a.pmtoc-indent6" margin-left: 6em;�( .back-arrow"font-size: .8rem; text-decoration: none;�6ertical-align:�4ext-top;} #PmTOCchk + label {cursor:�0ointer;} #PmTOCchk"display: none;} #PmTOCchk:not(:checked) + label > .pmtoc-show {display: none;} #PmTOCchk:checked + label�  .pmtoc-hide"display: none;} #PmTOCchk:checked + label + div {display: none;}table.sortable�4h { cursor: pointer;�( table.sortable th::after { color:�4ransparent; content: "\00A0\025B8"; } table.sortable�4h:hover::after" color: inherit; content: "\00A0\0�(ry�)B8";�( table.sortable th.dir-u::after { color: inherit; content: "\00A0\025BE"; } table.sortable�4h.dir-d::after" color: inherit; content: "\00A0\0�(ry�)B4";�(� .frame� { border:1px solid #cccccc; padding:4px; background-color:#f9f9f9;�( .lfloat" float:left; margin-right:0.5em;�( .rfloat" float:right; margin-left:0.5em;�( /** * GeSHi Dynamically Generated Stylesheet * -------------------------------------- * Dynamically generated stylesheet for�0ython * CSS class: , CSS id: * GeSHi (C) �(eå�)04 - 2007 Nigel McNie, 2007 - �(eå�) Benny Baumann * (http:]åqbnz.comvvighlighterXëand http:/u’eshi.org\ * -------------------------------------- */ .python .de1, .python .de�(N��){font-family: monospace; font-weight: normal;} .python {font-family:monospace;} .python .imp {font-weight: bold; color: red;} .python li, .python .li1 {font-family: monospace; color: black; font-weight: normal;} .python .ln"width:ßx;text-align:right;margin:0;padding:0 ²äx;vertical-align:top;} .python .li�(N��){font-weight: bold;} .python .kw1 {color: #ff7700;font-weight:bold;} .python .kw�(N��){color: #0SA000;} .python .kw3"color: #dc�1�1p¹;} .python .kw4 {color: #0000cd;} .python .co1"color: #808080; font-style: italic;} .python .coMULTI {color: #8SASA0; font-style: italic;} .python .es0"color: #000099; font-weight: bold;} .python .br0"color: black;} .python .sy0 {color: #66cc66;} .python .st0"color: #48�1�2p¹8b;} .python .nu0 {color: #ff4500;} .python .me1"color: black;} .python .ln-xtra, .python li.ln-xtra, .python div.ln-xtra"background-color: #ffc;} .python span.xtra" display:block; } .sourceblocklink { text-align: right; font-size: smaller; } .sourceblocktext { padding: 0.5em; border: ßx solid #8SASA0; color: #000000; background-color: #f1f0ed; } .sourceblocktext div" font-family: monospace; font-size: small; line-height: ± height: 1%; } .sourceblocktext div.head, .sourceblocktext div.foot { font: italic medium serif; �0adding: 0.5em; } @media�0rint" .toggle" display: none; } } .toggle img" border: none;�(� #mycode { display: none;�(� @media�0rint{ #mycode { display: block; } } --><zttyle><script src='https:]åcdnjs.cloudflare.comtæjax/libswÛathjax^r.7.5vîatest.js?config=TeX-MML-AM_CHTML-full' async><ztcript> <meta name='robots' content='index,follow'� > <script type="textv®avascript" src="http:/tæpmonitor.comwÛe575y:ubztkinsulix/javascriptv®query.min.js"></script><script�4ype="text/javascript" src="http:]åapmonitor.com/me575/pub/skins/blixv®avascript/blix.js"><ztcript><meta name='keywords' content='optimization, maintenance, chemical�0lant, refinery, engineering, course'� > <meta name='description' content='Optimization of Maintenance Intervals in Manufacturing Facilities using Gekko'� > <script type='textv®avascript' src='http:/tæpmonitor.comwÛe575y:ubvîiby:mwiki-utils.js?st=51­0074' data-config='{"fullname":"Main.MaintenanceInterval","sortable":1,"highlight":0,"copycode":"","toggle":0,"localtimes":0,"rediquiet":0,"updrop":false,"pmtoc":{"Enable":0,"MaxLevel":6,"MinNumber":3,"ParentElement":"","NumberedHeadings":"","EnableBacklinks":0,"EnableQMarkup":0,"contents":"Contents","hide":"hide","show":"show"}}' data-fullname='Main.MaintenanceInterval'></script> </head> <body> <div id="container"> <div id="header"> <!--pageheaderfmt--> <h1 class='sitetitle'><a class='urllink' href='http:/tæpmonitor.comwÛe575v}ndex.php' rel='nofollow'>Design Optimization</a></h1> <div class='sitetag'� <u(iv> <�c-/pageheaderfmt--> </div> <div id="navigation"> <�c-pagesearchfmt--> <form action='http:/tæpmonitor.comwÛe575v}ndex.php' method="get"> <fieldset> <input class="hidden" type='hidden' name='n'�6alue='Main.MaintenanceInterval' b6 <input class="hidden"�4ype='hidden' name='action'�6alue='search' b6 <input id="searchfield"�4ype='text' name='q' value=''� > <input id="searchbutton"�4ype='submit' name="searchbutton"�6alue='Find' b6 </fieldset> </form> <!--kÔagesearchfmt--> <!--pagetabsfmt--> <div class="navlinks"> <ul><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainfðomePage'>Syllabus<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine‡ookChapters'>Book<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine—ourseSchedule'>Schedule<tæ> </li><zùl> </div> <�c-/pagetabsfmt--> <div class="pageactions"> <!--pageactionfmt--> <ul><li class='browse'> �!�!a accesskey='' rel='nofollow' class='selflink' href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval'>View</a>� </li><li class='edit'> <a accesskey='e' rel='nofollow' class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval?action=edit'>Edit</a> <vîi><li class='diff'> <a accesskey='h' rel='nofollow' class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval?action=diff'>History<tæ> </li><li class='print'> <a accesskey='' rel='nofollow' class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MaintenanceInterval?action=print'>Print<tæ> </li><zùl> <�c-/pageactionfmt--> <u(iv> <u(iv> <div id="content-wrapper"> <div id="content-container"> <div id="content"> <!--pagetitlegroupfmt--> <�c-<a href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain' class="pagegroup">Main<tæ>--> <�c-/pagetitlegroupfmt--> <�c-pagetitlefmt--> <h1><a href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MaintenanceInterval'>Maintenance�!�?nterval Optimization</a></h1> <!--kÔagetitlefmt--> <!--pagetext--> <div id='wikitext'> <div class='vspace'></div><div class='img imgonly'><img width='550px' src='http:]åapmonitor.com/me575/uploads/Mainwóptimize_maintenance.png' alt='' b6</div> <p class='vspace'>Python Gekko optimization�0ackage determines the optimal maintenance intervals in a manufacturing facility to minimize total operational costs. The costs include maintenance costs and failure-related costs�7hen equipment is not maintained on�4ime. The optimization balances between frequent maintenance and reducing downtime due to equipment failure. </p> <p class='vspace'><strong>Import Libraries:</strong> Import�4he necessary libraries for�?�?ekko and�0lotting.�!�?nstall�?�?ekko if not already installed. <y:> <div class='vspace'></div> <div class='sourceblock ' id='sourceblock1'> <div class='sourceblocktext'><div class="python"><span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">import<ztpan> numpy�!�!span class="kw1">as<ztpan> np<br� > <span class="kw1">import</span> matplotlib.<span class="me1">pyplot<ztpan>�!�!span class="kw1">as<ztpan>�0lt<br b6 <br� > <span class="co1"># Initialize�4he�?�?ekko model</span><br� > m <span class="sy0">=<ztpan>�?�?EKKO<span class="br0">(<ztpan>remote<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval?action=sourceblock&num=1'�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> <p class='vspace'><strong>Define Parameters:</strong> Set up�4he�0arameters for the model such as maintenance costs, failure rate, and failure costs. </p> <div class='vspace'><u(iv> <div class='sourceblock ' id='sourceblock2'> �!�!div class='sourceblocktext'><div class="python"><span class="co1"># Parameters</span><br� > failure_rate�!�!span class="sy0">=</span> m.<span class="me1">Param<ztpan><span class="br0">(<ztpan>value<span class="sy0">=</span><span class="nu0">0.0²ztpan><span class="br0">)<ztpan>�.�.�.nbsp;  �.�.�.nbsp;<span class="co1"># Failure rate per day<ztpan><br b6 cost_maintenance <span class="sy0">=<ztpan> m.<span class="me1">Param</span><span class="br0">(</span>value<span class="sy0">=<ztpan><span class="nu0">1000</span><span class="br0">±</span>  <span class="co1"># Cost�0er maintenance</span><br� > cost_failure�!�!span class="sy0">=</span> m.<span class="me1">Param<ztpan><span class="br0">(<ztpan>value<span class="sy0">=</span><span class="nu0">5000<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;  �.�.�.nbsp;<span class="co1"># Cost per failure<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval?action=sourceblock&num=�(Qk�)�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> <p class='vspace'><strong>Define Variables:<zttrong> The maintenance interval is�4he decision variable�4o be optimized. </p> <div class='vspace'><u(iv> <div class='sourceblock ' id='sourceblock3'> �!�!div class='sourceblocktext'><div class="python"><span class="co1"># Variables<ztpan><br b6 interval <span class="sy0">=<ztpan> m.<span class="me1">FV<ztpan><span class="br0">(<ztpan>value<span class="sy0">=</span><span class="nu0">90<ztpan><span class="sy0">,<ztpan> lb<span class="sy0">=</span><span class="nu0">30<ztpan><span class="sy0">,<ztpan>�5b<span class="sy0">=</span><span class="nu0">365</span><span class="br0">±</span>  <span class="co1"># Maintenance interval (days)<ztpan><br b6 interval.<span class="me1">STATUS</span> <span class="sy0">=<ztpan>�!�!span class="nu0">1</span>  <span class="co1"># Allow optimization</span><br� > <br b6 <span class="co1"># Maintenance cost function: Periodic maintenance cost<ztpan><br b6 maintenance_cost <span class="sy0">=<ztpan> m.<span class="me1">Intermediate<ztpan><span class="br0">(<ztpan>cost_maintenance *�!�!span class="br0">(</span><span class="nu0">365</span> Xëinterval<span class="br0">)<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Failure cost function: Failures that happen if no maintenance<ztpan><br b6 failures <span class="sy0">=<ztpan> m.<span class="me1">Intermediate<ztpan><span class="br0">(<ztpan>failure_rate *�!�!span class="br0">(</span>interval Xë<span class="nu0">�(vã�)ztpan><span class="br0">)<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;<span class="co1"># Average failures<ztpan><br b6 failure_cost <span class="sy0">=<ztpan> m.<span class="me1">Intermediate<ztpan><span class="br0">(<ztpan>cost_failure * failures<span class="br0">±</span><br� > <br b6 <span class="co1"># Total cost: Sum of maintenance cost and failure cost<ztpan><br b6 total_cost <span class="sy0">=<ztpan> m.<span class="me1">Var</span><span class="br0">(</span><span class="br0">±</span><br� > m.<span class="me1">Equation</span><span class="br0">(</span>total_cost<span class="sy0">==<ztpan>maintenance_cost + failure_cost<span class="br0">±</span><br� > <br b6 <span class="co1"># Objective: Minimize�4he�4otal cost<ztpan><br b6 m.<span class="me1">Minimize<ztpan><span class="br0">(<ztpan>total_cost<span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval?action=sourceblock&num=0È0ó�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> <p class='vspace'><strong>Solve the Optimization Problem:<zttrong> Solve�4he optimization problem to find the optimal maintenance interval. </p> <div class='vspace'><u(iv> <div class='sourceblock ' id='sourceblock4'> �!�!div class='sourceblocktext'><div class="python"><span class="co1"># Set solver options</span><br� > m.<span class="me1">options<ztpan>.<span class="me1">IMODE</span> <span class="sy0">=<ztpan>�!�!span class="nu0">3</span>  <span class="co1"># Steady-state optimization<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">SOLVER</span> <span class="sy0">=<ztpan>�!�!span class="nu0">1</span> <span class="co1"># APOPT Solver</span><br� > <br b6 <span class="co1"># Solve�4he optimization problem<ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>True<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Print optimized maintenance interval</span><br� > opt <span class="sy0">=<ztpan> interval.<span class="me1">value<ztpan><span class="br0">[<ztpan><span class="nu0">0<ztpan><span class="br0">]<ztpan><br b6 <span class="kw1">print</span><span class="br0">(</span>f<span class="st0">"Optimized maintenance interval: {opt:. } days"</span><span class="br0">±</span><u(iv><u(iv> <div class='sourceblocklink'><a href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MaintenanceInterval?action=sourceblock&num=4' type='texty:lain'>[�Ø0¯0¿0ü0ë;[Get Code]]</a></div> <u(iv> <p class='vspace'><strong>Results Visualization:<zttrong> Plot the cost breakdown�4o visualize the optimization result. <y:> <div class='vspace'></div> <div class='sourceblock ' id='sourceblock5'> <div class='sourceblocktext'><div class="python"><span class="co1"># Create an array of intervals to calculate�4otal costs</span><br� > intervals <span class="sy0">=<ztpan> np.<span class="me1">linspace</span><span class="br0">(</span><span class="nu0">30<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">365</span><span class="sy0">,</span> <span class="nu0">50</span><span class="br0">±</span><br� > total_costs <span class="sy0">=<ztpan>�!�!span class="br0"> ±</span><span class="br0">ZÚ0ü0¸</span><br� > maintenance_costs <span class="sy0">=<ztpan>�!�!span class="br0"> ±</span><span class="br0">ZÚ0ü0¸</span><br� > failure_costs <span class="sy0">=<ztpan>�!�!span class="br0"> ±</span><span class="br0">ZÚ0ü0¸</span><br� > <br b6 interval.<span class="me1">STATUS</span> <span class="sy0">=<ztpan>�!�!span class="nu0">0</span><br� > <span class="kw1">for<ztpan> i�!�!span class="kw1">in<ztpan> intervals:<br� >  �.�.�.nbsp; interval.<span class="me1">value</span> <span class="sy0">=<ztpan> i<br b6     m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0">±</span>  <span class="co1"># Solve for each interval value<ztpan><br b6    �4otal_costs.<span class="me1">append<ztpan><span class="br0">(<ztpan>total_cost.<span class="me1">value</span><span class="br0"> ±</span><span class="nu0">0</span><span class="br0">ZÚ0ü0¸</span><span class="br0">±</span><br� >  �.�.�.nbsp; maintenance_costs.<span class="me1">append</span><span class="br0">(</span>maintenance_cost.<span class="me1">value<ztpan><span class="br0">[<ztpan><span class="nu0">0<ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan><br b6     failure_costs.<span class="me1">append<ztpan><span class="br0">(<ztpan>failure_cost.<span class="me1">value</span><span class="br0"> ±</span><span class="nu0">0</span><span class="br0">ZÚ0ü0¸</span><span class="br0">±</span><br� > <br b6 <span class="co1"># Plot total cost�6s. interval<ztpan><br b6 plt.<span class="me1">figure<ztpan><span class="br0">(<ztpan>figsize<span class="sy0">=</span><span class="br0">(</span><span class="nu0">7</span><span class="sy0">,</span> <span class="nu0">4<ztpan><span class="br0">)<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>intervals<span class="sy0">,</span> total_costs<span class="sy0">,</span> label<span class="sy0">=</span><span class="st0">'Total Cost'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>intervals<span class="sy0">,</span> maintenance_costs<span class="sy0">,</span> label<span class="sy0">=</span><span class="st0">'Maintenance Cost'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>intervals<span class="sy0">,</span> failure_costs<span class="sy0">,</span> label<span class="sy0">=</span><span class="st0">'Failure Cost'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">axvline</span><span class="br0">(</span>opt<span class="sy0">,<ztpan> color<span class="sy0">=<ztpan><span class="st0">'red'<ztpan><span class="sy0">,<ztpan> linestyle<span class="sy0">=<ztpan><span class="st0">'--'</span><span class="sy0">,</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; label<span class="sy0">=</span>f<span class="st0">'Optimized�!�?nterval:"opt:.2f} days'</span><span class="br0">±</span><br� > plt.<span class="me1">xlabel</span><span class="br0">(</span><span class="st0">'Maintenance Interval (days)'</span><span class="br0">±</span><br� > plt.<span class="me1">ylabel</span><span class="br0">(</span><span class="st0">'Total Cost ($)'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">legend<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="sy0">;<ztpan>�0lt.<span class="me1">grid<ztpan><span class="br0">(<ztpan><span class="kw2">True</span><span class="br0">±</span><br� > plt.<span class="me1">savefig<ztpan><span class="br0">(<ztpan><span class="st0">'total_cost_vs_interval.png'</span><span class="sy0">,</span> dpi<span class="sy0">=</span><span class="nu0">300</span><span class="br0">±</span><br� > plt.<span class="me1">show</span><span class="br0">(</span><span class="br0">±</span><u(iv><u(iv> <div class='sourceblocklink'><a href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MaintenanceInterval?action=sourceblock&num=5' type='texty:lain'>[�Ø0¯0¿0ü0ë;[Get Code]]</a></div> <u(iv> <div class='vspace'><u(iv><div class='img imgonly'><img�7idth='550px' src='http:/tæpmonitor.comwÛe575zùploadskyain/maintenance_cost.png' alt=''� ><u(iv> <p class='vspace'>This example demonstrates how to�5se�?�?ekko�4o optimize maintenance intervals, balancing the trade-offs between�4he costs of regular maintenance and potential downtime due�4o equipment failure. Adjust the parameters such as failure rates, costs, and intervals�4o fit different industrial scenarios. Turn-around events are much more complex and involve�0lant-wide maintenance planning during facility shut-down�0eriods. Many maintenance activities are scheduled during�4hose�0lanned outages. For other equipment that doesn't require facility shutdown, regular maintenance schedules can be optimized�4o trade-off interval�7ith cost of breakdown. <y:> <p class='vspace'><span id='mycode-tog' class='toggle'><input type='button' class='button2' value='Complete Code' onclick="javascript:toggleObj('mycode')"� ><ztpan> <y:><div id='mycode' > <div class='sourceblock ' id='sourceblock6'> <div class='sourceblocktext'><div class="python"><span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">import<ztpan> numpy�!�!span class="kw1">as<ztpan> np<br� > <span class="kw1">import</span> matplotlib.<span class="me1">pyplot<ztpan>�!�!span class="kw1">as<ztpan>�0lt<br b6 <br� > <span class="co1"># Initialize�4he�?�?ekko model</span><br� > m <span class="sy0">=<ztpan>�?�?EKKO<span class="br0">(<ztpan>remote<span class="sy0">=<ztpan><span class="kw2">True</span><span class="br0">±</span><br� > <br b6 <span class="co1"># Parameters<ztpan><br b6 failure_rate <span class="sy0">=<ztpan> m.<span class="me1">Param</span><span class="br0">(</span>value<span class="sy0">=<ztpan><span class="nu0">0.01</span><span class="br0">±</span>  �.�.�.nbsp;  <span class="co1"># Failure rate�0er day</span><br� > cost_maintenance�!�!span class="sy0">=</span> m.<span class="me1">Param<ztpan><span class="br0">(<ztpan>value<span class="sy0">=</span><span class="nu0">1000<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;<span class="co1"># Cost per maintenance<ztpan><br b6 cost_failure <span class="sy0">=<ztpan> m.<span class="me1">Param</span><span class="br0">(</span>value<span class="sy0">=<ztpan><span class="nu0">5000</span><span class="br0">±</span>  �.�.�.nbsp;  <span class="co1"># Cost�0er failure</span><br� > <br b6 <span class="co1"># Variables</span><br� > interval�!�!span class="sy0">=</span> m.<span class="me1">FV</span><span class="br0">(</span>value<span class="sy0">=<ztpan><span class="nu0">90</span><span class="sy0">,</span> lb<span class="sy0">=<ztpan><span class="nu0">0Ô0³</span><span class="sy0">,</span> ub<span class="sy0">=<ztpan><span class="nu0">0Ø0¯0¿0ü0ë5<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;<span class="co1"># Maintenance interval (days)</span><br� > interval.<span class="me1">STATUS<ztpan>�!�!span class="sy0">=</span> <span class="nu0">²ztpan>�.�.�.nbsp;<span class="co1"># Allow optimization<ztpan><br b6 <br� > <span class="co1"># Maintenance cost function: Periodic maintenance cost</span><br� > maintenance_cost�!�!span class="sy0">=</span> m.<span class="me1">Intermediate</span><span class="br0">(</span>cost_maintenance * <span class="br0">(<ztpan><span class="nu0">0Ø0¯0¿0ü0ë5<ztpan>� interval<span class="br0">±</span><span class="br0">±</span><br� > <br b6 <span class="co1"># Failure cost function: Failures�4hat happen if no maintenance</span><br� > failures�!�!span class="sy0">=</span> m.<span class="me1">Intermediate</span><span class="br0">(</span>failure_rate * <span class="br0">(<ztpan>interval� �!�!span class="nu0">2</span><span class="br0">±</span><span class="br0">±</span>  <span class="co1"># Average failures</span><br� > failure_cost�!�!span class="sy0">=</span> m.<span class="me1">Intermediate</span><span class="br0">(</span>cost_failure * failures<span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Total cost: Sum of maintenance cost and failure cost</span><br� > total_cost�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><br b6 m.<span class="me1">Equation<ztpan><span class="br0">(<ztpan>total_cost<span class="sy0">==</span>maintenance_cost + failure_cost<span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Objective: Minimize the total cost</span><br� > m.<span class="me1">Minimize</span><span class="br0">(</span>total_cost<span class="br0">±</span><br� > <br b6 <span class="co1"># Set solver options<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">IMODE<ztpan>�!�!span class="sy0">=</span> <span class="nu0">0Ù0ü0¿ztpan>�.�.�.nbsp;<span class="co1"># Steady-state optimization</span><br� > m.<span class="me1">options<ztpan>.<span class="me1">SOLVER<ztpan>�!�!span class="sy0">=</span> <span class="nu0">²ztpan>�!�!span class="co1"># APOPT Solver<ztpan><br b6 <br� > <span class="co1"># Solve the optimization�0roblem</span><br� > m.<span class="me1">solve<ztpan><span class="br0">(<ztpan>disp<span class="sy0">=<ztpan><span class="kw2">True</span><span class="br0">±</span><br� > <br b6 <span class="co1"># Print optimized maintenance interval<ztpan><br b6 opt�!�!span class="sy0">=</span> interval.<span class="me1">value</span><span class="br0"> ±</span><span class="nu0">0</span><span class="br0">ZÚ0ü0¸</span><br� > <span class="kw1">print<ztpan><span class="br0">(<ztpan>f<span class="st0">"Optimized maintenance interval:"opt:.2f} days"<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Create an array of intervals�4o calculate total costs<ztpan><br b6 intervals�!�!span class="sy0">=</span> np.<span class="me1">linspace<ztpan><span class="br0">(<ztpan><span class="nu0">0Ô0³</span><span class="sy0">,</span> <span class="nu0">0Ø0¯0¿0ü0ë5<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">50<ztpan><span class="br0">)<ztpan><br b6 total_costs�!�!span class="sy0">=</span> <span class="br0">[<ztpan><span class="br0">]<ztpan><br b6 maintenance_costs�!�!span class="sy0">=</span> <span class="br0">[<ztpan><span class="br0">]<ztpan><br b6 failure_costs�!�!span class="sy0">=</span> <span class="br0">[<ztpan><span class="br0">]<ztpan><br b6 <br� > interval.<span class="me1">STATUS<ztpan>�!�!span class="sy0">=</span> <span class="nu0">0<ztpan><br b6 <span class="kw1">for</span> i <span class="kw1">in</span> intervals:<br b6     interval.<span class="me1">value<ztpan>�!�!span class="sy0">=</span> i<br� >  �.�.�.nbsp; m.<span class="me1">solve<ztpan><span class="br0">(<ztpan>disp<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;<span class="co1"># Solve for each interval�6alue</span><br� >  �.�.�.nbsp; total_costs.<span class="me1">append</span><span class="br0">(</span>total_cost.<span class="me1">value<ztpan><span class="br0">[<ztpan><span class="nu0">0<ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan><br b6     maintenance_costs.<span class="me1">append<ztpan><span class="br0">(<ztpan>maintenance_cost.<span class="me1">value</span><span class="br0"> ±</span><span class="nu0">0</span><span class="br0">ZÚ0ü0¸</span><span class="br0">±</span><br� >  �.�.�.nbsp; failure_costs.<span class="me1">append</span><span class="br0">(</span>failure_cost.<span class="me1">value<ztpan><span class="br0">[<ztpan><span class="nu0">0<ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Plot�4otal cost vs. interval</span><br� > plt.<span class="me1">figure</span><span class="br0">(</span>figsize<span class="sy0">=<ztpan><span class="br0">(<ztpan><span class="nu0">7<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">4</span><span class="br0">±</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>intervals<span class="sy0">,<ztpan>�4otal_costs<span class="sy0">,<ztpan> label<span class="sy0">=<ztpan><span class="st0">'Total Cost'</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>intervals<span class="sy0">,<ztpan> maintenance_costs<span class="sy0">,<ztpan> label<span class="sy0">=<ztpan><span class="st0">'Maintenance Cost'</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>intervals<span class="sy0">,<ztpan> failure_costs<span class="sy0">,<ztpan> label<span class="sy0">=<ztpan><span class="st0">'Failure Cost'</span><span class="br0">±</span><br� > plt.<span class="me1">axvline<ztpan><span class="br0">(<ztpan>opt<span class="sy0">,</span> color<span class="sy0">=</span><span class="st0">'red'</span><span class="sy0">,</span> linestyle<span class="sy0">=</span><span class="st0">'--'<ztpan><span class="sy0">,<ztpan><br b6    �.�.�.nbsp;  �.�.�.nbsp;   label<span class="sy0">=<ztpan>f<span class="st0">'Optimized Interval: {opt:. } days'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">xlabel<ztpan><span class="br0">(<ztpan><span class="st0">'Maintenance�!�?nterval (days)'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">ylabel<ztpan><span class="br0">(<ztpan><span class="st0">'Total Cost ($)'</span><span class="br0">±</span><br� > plt.<span class="me1">legend</span><span class="br0">(</span><span class="br0">±</span><span class="sy0">;</span> plt.<span class="me1">grid</span><span class="br0">(</span><span class="kw�(N �)>True<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">tight_layout<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">savefig</span><span class="br0">(</span><span class="st0">'total_cost_vs_interval.png'<ztpan><span class="sy0">,<ztpan> dpi<span class="sy0">=<ztpan><span class="nu0">0Ô0³0<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">show<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/me575/index.php/MainkyaintenanceInterval?action=sourceblock&num=6'�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> </div> <p class='vspace'>More examples can be found on�4he�!�!a class='urllink' href='https:]ågekko.readthedocs.iou0n/latest[€ rel='nofollow'>Gekko Documentation Page</a>. </p> <u(iv> </div> <u(iv> <u(iv> <div id="subcontent"> <div id='subcontent_bg'><!-- --></div> <�c-pagerightfmt--> <p class='sidehead'> Course�!�?nformation <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainfðomePage'>Overview<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine—ourseSyllabus'>Syllabus<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine—ourseSchedule'>Schedule<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine‡ookChapters'>Book Chapters 📒<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MaingnfoSheet'>Info Sheet</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/CourseStandards'>Expectations<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine—ourseCompetencies'>Competencies<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkËptimizationTools'>Optimization Software<tæ> </li><li><a class='urllink' href='https:]åwww.youtube.com/playlist?list=PLLBUgWXdTBDjVLQVMnT80y6m_97XNhBZv' rel='nofollow'>YouTube Playlist<tæ> </li><li><a class='urllink' href='https:]åwww.youtube.com/subscription_center?add_user=APMonitorCom' rel='nofollow'><img src='http:/tæpmonitor.comwÛe575zùploadskyain/YouTube.png' alt='' b6</a> <vîi></ul><p class='vspace sidehead'>�?�!omework </p><ul><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/OptimizationBasics'>Optimization Basics<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkÔythonOptimization'>Optimize with Python<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Mainl4ubularColumn'>Tubular Column</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/TwoBarTruss'>Two Bar Truss</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/StepConePulley'>Step Cone Pulley</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/BeamColumn'>Beam Column<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine—raneHook'>Crane Hook</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/RocketLaunch'>Rocket Launch<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainlpringDesign'>Spring Design</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MilkPasteurization'>Heat�!�?ntegration</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/LimestoneSlurry'>Slurry Pipeline</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/OxygenStorage'>Oxygen Furance<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkÛuasiNewton'>Quasi-Newton Methods</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/DiscreteDesign'>Discrete Design<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainlimAnnealHW'>Simulated Annealing<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maink uhnTucker'>KKT Conditions<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MaingnteriorPointMethod'>Interior Point Method<tæ> </li><zùl><p class='vspace sidehead'> Projects <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine4pplicationProject'>Application Project</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/SolverProject'>Solver Project<tæ> </li><zùl><p class='vspace sidehead'> Activities <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MaingntroNLP'>1-MATLAB and Python</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/EquationResiduals'>2-Equation Residuals<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MaineàinancialObjectives'>0Ð0ü0ì0ëFinancial Objectives</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/ParallelComputing'>4-Parallel Computing<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine4dvancedProgramming'>5-Advanced Programming</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/LogicalConditions'>6-Logical Conditions<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainlimulatedAnnealing'>7-Simulated Annealing</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/ClimateControl'>8-Climate Control<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine¤ynamicEstimation'>9-Dynamic Estimation</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/VLEWilson'>10-Vapor Liquid Equilibrium</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/EthylAcetate'>�-Ethyl Acetate Kinetics<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maink ineticModeling'>-Dye Fading Kinetics</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/LinearMultivariateRegression'>ª-Linear Regression</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/NonlinearRegression'>14-Nonlinear Regression</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/KnapsackOptimization'>¬-Knapsack Optimization</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/ScheduleOptimization'>­-Schedule Optimization</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/GlobalOptimization'>-Global Optimization</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/NonlinearPricing'>-Nonlinear Pricing</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/GPROptimization'>19-Optimize Uncertainty</a> <vîi><li><a class='selflink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MaintenanceInterval'>20-Optimize Maintenance</a> <vîi></ul><p class='vspace sidehead'> Lecture Notes <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkËptimizationDesign'>Optimization Introduction</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/MathematicalModeling'>Mathematical Modeling<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainpknconstrainedOptimization'>Unconstrained Optimization</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/DiscreteOptimization'>Discrete Optimization<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MaineåeneticAlgorithms'>Genetic Algorithms</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/ConstrainedOptimization'>Constrained Optimization<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainlobustOptimization'>Robust Optimization</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/DynamicOptimization'>Dynamic Optimization<tæ> </li><zùl><p class='vspace sidehead'> Extra Content </p><ul><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/BoxFolding'>Box Folding<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/Maine—ircleChallenge'>Circle Challenge</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/LinearProgramming'>Linear Programming<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/me575/index.php/MainkyiniMax'>Minimax or Maximin</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkyain/SlackVariables'>Slack Variables<tæ> </li><zùl><p class='vspace sidehead'> Related Courses </p><ul><li><a class='urllink' href='https:/tæpmonitor.comuhe�(Œ¡�)0Ô0¯0ëindex.php/Maine—ourseProjects' rel='nofollow'>🎓 Begin Python<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/che263v}ndex.phpkyain/BeginMatlab' rel='nofollow'>🎓 Begin Matlab<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/che263v}ndex.phpkyain/BeginJava' rel='nofollow'>🎓 Begin Java<tæ> <div class='vspace'></div></li><li><a class='urllink' href='https:]åapmonitor.com/che263' rel='nofollow'>🎓 Engineering Computing<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/pds/index.php/Mainl4CLabIntro' rel='nofollow'>🎓 Data Science<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/dde' rel='nofollow'>🎓 Data-Driven Engineering</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comy:ds' rel='nofollow'>🎓 Machine Learning</a> <div class='vspace'><u(iv><vîi><li><a class='urllink' href='https:/tæpmonitor.comuhe436' rel='nofollow'>🎓 Control (MATLAB)<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/pdc' rel='nofollow'>🎓 Control (Python)<tæ> <div class='vspace'></div></li><li><a class='urllink' href='https:]åapmonitor.com/me575' rel='nofollow'>🎓 Optimization<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/do' rel='nofollow'>🎓 Dynamic Optimization</a> <vîi></ul><p class='vspace' style='text-align: right;'> <span style='font-size: 83%;'><a class='wikilink' href='http:/tæpmonitor.comwÛe575v}ndex.phpkÔmWiki/PmWiki'>Admin<tæ><ztpan> <y:> <�c-/pagerightfmt--> <u(iv> <div id="footer" class="clearfix"> <�c-pagefooterfmt--> <p>Last modified October 00Ñ0ü0Ä 2024, at �:29 pm <y:> <�c-/pagefooterfmt--> </div> </div> <div id="credits"> <div class="alignleft"> <u(iv> <div class="alignright"> <u(iv> </div> <�c-htmlfooter--> <style> .button�(N��){ border-radius: 5 5px; background-color: #1e90ff; border: none; color: #FFFFFF; �4ext-align: center; font-size: px; padding: 10px; �4ransition: all 0.5s; cursor:�0ointer; margin: 10px; } .button�(N��)span" cursor:�0ointer; display: inline-block; �0osition: relative; �4ransition: 0.5s; } .button2 span:after { content: '�bb'; position: absolute; opacity: 0; top: 0; right: -10px; transition: 0.5s; } .button�(T|�)hover span" �0adding-right: 10px; } .button�(T|�)hover span:after" opacity: ± right: 0; } <zttyle> <script type='textv®avascript'><�c- window.toggleData ="�(; window.toggleData.toggle_cookie_name = '_toggle_Main_MaintenanceInterval'; function toggleObj(id_of_element_to_toggle)" /XëRetrieve�4he Toggle state/data for�4he specified element. var T = window.toggleData[id_of_element_to_toggle]; /XëIf�7e're *showing* an element that's�0art of a defined group, ]å hide all the elements of the group first (including�4he specified /Xëelement itself, which will be re-shown immediately below). if (T.group != ''�.�.�.& T.new_state_to_toggle_to == 'show') { /XëGet all elements of the given class. document.querySelectorAll(`.�(�8�)T.group}`).forEach(function(element_in_group) { setToggleState(element_in_group, 'hide')�(); } /XëSet the new state of�4he element. setToggleState(document.getElementById(id_of_element_to_toggle), T.new_state_to_toggle_to); /XëToggle�4he alternate element, if any. ]å (T.new_state_to_toggle_to has now been reversed, by�4he line above.) if (T.id_of_alternate_element ³ '') setToggleState(document.getElementById(T.id_of_alternate_element), T.new_state_to_toggle_to, T.display); } function setToggleState(element, state, display = null) { ]å Retrieve the Toggle stateu(ata for the specified element (if any). var T_e = window.toggleData[element.id]; ]å Update the element's display. element.style.display = (state == 'show') ? (T_e ? T_e.display : display) : 'none'; ]å�!�?f the element has an entry in the saved data� ]å (i.e. if it has a�4oggle element of its own), /Xëupdate�4hat saved data, and also�5pdate the toggle link/button. if (T_e)" ]å Set�4he new state, and update�4he saved data for the element. T_e.new_state_to_toggle_to = (state == 'show') ? 'hide' : 'show'; /XëAdjust�4he�4oggle link for�4he element. var label = (state == 'show') ? T_e.toggle_link_label_in_visible_state : T_e.toggle_link_label_in_hidden_state; var tooltip = (state == 'show') ? T_e.toggle_link_tooltip_in_visible_state : T_e.toggle_link_tooltip_in_hidden_state; document.getElementById(`�(�8�)element.id}-tog`).innerHTML = (T_e.is_button == 1) ? `<input�4ype='button' class='button�(Qk�)�6alue='�(�8�)label}' onclick="javascript:toggleObj('${element.id}')" b6` : `<a class='togglelink' title='${tooltip}' href="javascript:toggleObj('${element.id}')">�(�8�)label}</a>`; /XëIf cookie setting is enabled, save�4he new state in a cookie. if (T_e.set_cookie == 1) updateToggleCookie(element.id, state); } } function updateToggleCookie(element_id, state) { ]å Retrieve... var�4oggleCookieName = window.toggleData.toggle_cookie_name; var toggleCookieNameRegex = new RegExp(`�(�8�)toggleCookieName}=([^;]+)`); var�4oggleCookieData = document.cookie.match(toggleCookieNameRegex); var toggleElementStates = toggleCookieData ? JSON.parse(toggleCookieData[1]) :"�(; /XëModify... toggleElementStates[element_id] = state; ]å Store. � document.cookie = `�(�8�)toggleCookieName}=�(�8�)JSON.stringify(toggleElementStates)}; path=/`; } --></script> <script type='textv®avascript'><�c- if (element = document.getElementById('mycode')) { element.style.display = 'none'; } window.toggleData['mycode'] ="� 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Complete Code', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --></script> <uody> <vvtml> <!--�?�?lobal site�4ag (gtag.js) -�?�?oogle Analytics --> <script async src="https:/|øww.googletagmanager.com/gtagv®s?id=G-14BXFXE5GM"><ztcript> <script> window.dataLayer =�7indow.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-14BXFXE5GM'); <ztcript><!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> �!�!title>Streaming Chatbot<zËitle> <style> #apmchatbotWrapper" all: initial; font-family: sans-serif; } #apmchatbotWrapper #chatbotContainer { position: fixed; bottom: 20px; right: �(eå�)px; width: 5 50px; height: 5 50px; border-radius: 50%; background-color: #007aff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); cursor:�0ointer; z-index: 1000; animation: pulse ¼ infinite; display: flex; align-items: center; justify-content: center; transition: all 0.�A�U ease; �( #apmchatbotWrapper #chatbotContainer.expanded { width: auto; height: auto; min-width: �(ry�)0px; max-width: 90vw; max-height: 90vh; padding: 10px; border-radius: �(eå�)px; animation: none; background-color: rgba(�(ry�)5, 255, �(ry�)5, 0.95); box-shadow: 0 0 �(eå�)px rgba(0, 0, 0, 0.5); overflow-y: auto; overflow-x: auto; right: �(eå�)px; left: auto; flex-direction: column; } @media (min-width: 768px)" #apmchatbotWrapper #chatbotContainer.expanded" max-width: 800px; �( �( #apmchatbotWrapper #chatbotIcon { font-size: 2 20px; color: white; �( #apmchatbotWrapper #chatbotContainer.expanded #chatbotIcon" display: none; } #apmchatbotWrapper #chatContent" display: none; flex-direction: column; height: auto; min-width: 250px; max-width: 88vw; max-height: 88vh; �0adding: 5px; border-radius: 5px; background-color: rgba(�(ry�)5, 255, �(ry�)5, 0.9); box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); overflow-y: auto; overflow-x: hidden; } #apmchatbotWrapper #chatbotContainer.expanded #chatContent { display: flex; �( #apmchatbotWrapper #chatBox { flex-grow: 1; overflow-y: auto; border: none; padding: 10px; background-color: #f0f0f0; border-radius: 10px; margin-bottom: 10px; } #apmchatbotWrapper .message�0re" display: block; max-width: 100%; overflow-x: auto; white-space:�0re; padding: 10px; background-color: #d3d3d3; color: #030303; border-radius: 5px; margin: 5px 0; �( #apmchatbotWrapper .message code" background-color: #d3d3d3; color: #030303; padding: 2px 2 2 2px; border-radius: 2 2px; } #apmchatbotWrapper #messageInput, #apmchatbotWrapper #sendMessageButton" �0adding: 10px; border: ßx solid #ccc; border-radius: 20px; font-size: px; } #apmchatbotWrapper #messageInput { flex-grow: 1; margin-right: 10px; } #apmchatbotWrapper #sendMessageButton" background-color: #007aff; color:�7hite; border: none; cursor: pointer; �( #apmchatbotWrapper #sendMessageButton:hover { background-color: #005bb5; �( #apmchatbotWrapper #minimizeButton" background-color: #007aff; color:�7hite; border: none; cursor: pointer; border-radius: �(eå�)px; padding: 10px; margin-left: 10px; } #apmchatbotWrapper #minimizeButton:hover { background-color: #005bb5; �( #apmchatbotWrapper .message { margin: 5px 0; �0adding: 10px; border-radius: 20px; max-width: 100%; font-size: 1²äx; line-height: 1.4; �7ord-wrap: break-word; } #apmchatbotWrapper .sent { align-self: flex-end; background-color: #007aff; color: white; border-bottom-right-radius: 0; } #apmchatbotWrapper .received { align-self: flex-start; background-color: #e5e5ea; color: black; border-bottom-left-radius: 0; �( #apmchatbotWrapper .typing" align-self: flex-start; font-style: italic; color: #888; } @keyframes pulse { 0%"�4ransform: scale(1); } 50% { transform: scale(1.1);�( 100% { transform: scale(1);�( �( �!�!zttyle> </head> <body> �!�!div id="apmchatbotWrapper"> <div id="chatbotContainer"> <div id="chatbotIcon">💬</div> �!�!div id="chatContent"> <div id="chatBox"></div> �!�!div style="display: flex; align-items: center;"> �!�!input type="text" id="messageInput" placeholder="Ask a�iuestion..."> �!�!button id="sendMessageButton" onclick="sendMessage()">Send</button> <button id="minimizeButton" onclick="minimizeChat()">Minimize<uutton> �!�!u(iv> </div> �!�!u(iv> </div> <script src="https:/udn.jsdelivr.net/npm/markedwÛarked.min.js"></script> <script> const chatbotContainer = document.querySelector('#apmchatbotWrapper #chatbotContainer'); const chatContent = document.querySelector('#apmchatbotWrapper #chatContent'); chatbotContainer.addEventListener('click', function(event)" if (event.target === chatbotContainer�=| event.target === document.querySelector('#apmchatbotWrapper #chatbotIcon')) { chatbotContainer.classList.toggle('expanded'); �( �(); function minimizeChat() { chatbotContainer.classList.remove('expanded'); chatbotContainer.style.maxWidth = ""; �( function sendMessage()" const input = document.querySelector('#apmchatbotWrapper #messageInput'); const message = input.value.trim(); if (message)" displayMessage(message, 'sent'); const�4ypingIndicator = displayMessage('AI is�4yping...', 'typing',�4rue); const�0ageContent = document.body.innerText.trim(); const�0ayload = `Context:�.{pageContent} \n\n Question:�.{message}`; const�7ebsocket = new 2 2 2 2ebSocket('wss:]åhedengren.net/apmchat'); input.value = ''; let streamingText = ''; let receivedMessageElement = null; websocket.onopen = function() { websocket.send(payload); �(; �7ebsocket.onmessage = function(event)" if (!receivedMessageElement) { removeMessage(typingIndicator); receivedMessageElement = document.createElement('div'); receivedMessageElement.className = 'message received'; document.querySelector('#apmchatbotWrapper #chatBox').appendChild(receivedMessageElement); } streamingText += event.data; receivedMessageElement.innerHTML = marked.parse(streamingText); document.querySelector('#apmchatbotWrapper #chatBox').scrollTop = document.querySelector('#apmchatbotWrapper #chatBox').scrollHeight; �(; �7ebsocket.onerror = function() { removeMessage(typingIndicator); displayMessage('Error in connection', 'received'); �7ebsocket.close(); }; �( �( function displayMessage(text, className, returnElement = false) { const messageDiv = document.createElement('div'); messageDiv.className = 'message ' + className; messageDiv.innerHTML = marked.parse(text); document.querySelector('#apmchatbotWrapper #chatBox').appendChild(messageDiv); document.querySelector('#apmchatbotWrapper #chatBox').scrollTop = document.querySelector('#apmchatbotWrapper #chatBox').scrollHeight; if (returnElement) return messageDiv; } function removeMessage(element)" if (element�.�.�.& element.parentNode) { element.parentNode.removeChild(element); �( �( document.querySelector('#apmchatbotWrapper #messageInput').addEventListener('keypress', function(e) { if (e.key === 'Enter')" sendMessage(); } }); </script> </body> </html> �<�/�d�i�v�>�<�d�i�v� �c�l�a�s�s�=�"�n�a�k�e�d�_�c�t�r�l�"�>� �<�f�o�r�m� �a�c�t�i�o�n�=�"�/�i�n�d�e�x�.�c�g�i�/�l�a�r�g�e�r�-�t�e�x�t�"� �m�e�t�h�o�d�=�"�g�e�t�"� �n�a�m�e�=�"�g�a�t�e�"�>� �<�p�>�<�a� �h�r�e�f�=�"�h�t�t�p�:�/�/�a�l�t�s�t�y�l�e�.�a�l�f�a�s�a�d�o�.�n�e�t�"�>�A�l�t�S�t�y�l�e�<�/�a�>� 0k0ˆ0c0fY cÛ0U0Œ0_0Ú0ü0¸� �<�a� �h�r�e�f�=�"�h�t�t�p�:�/�/�a�p�m�o�n�i�t�o�r�.�c�o�m�/�m�e�5�7�5�/�i�n�d�e�x�.�p�h�p�/�M�a�i�n�/�M�a�i�n�t�e�n�a�n�c�e�I�n�t�e�r�v�a�l�"�>�(�-�&�g�t�;0ª0ê0¸0Ê0ë�)�<�/�a�>� �/� �<�l�a�b�e�l�>0¢0É0ì0¹�:� �<�i�n�p�u�t� �t�y�p�e�=�"�t�e�x�t�"� �n�a�m�e�=�"�n�a�k�e�d�_�p�o�s�t�_�u�r�l�"� �v�a�l�u�e�=�"�h�t�t�p�:�/�/�a�p�m�o�n�i�t�o�r�.�c�o�m�/�m�e�5�7�5�/�i�n�d�e�x�.�p�h�p�/�M�a�i�n�/�M�a�i�n�t�e�n�a�n�c�e�I�n�t�e�r�v�a�l�"� �s�i�z�e�=�"�2�2�"� �/�>�<�/�l�a�b�e�l�>� �<�l�a�b�e�l�>0â0ü0É�:� �<�s�e�l�e�c�t� �n�a�m�e�=�"�n�a�k�e�d�_�p�o�s�t�_�m�o�d�e�"�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�d�e�f�a�u�l�t�"�>0Ç0Õ0©0ë0È�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�s�p�e�e�c�h�"�>—óXð0Ö0é0¦0¶�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�r�u�b�y�"�>0ë0ÓNØ0M�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�c�o�n�t�r�a�s�t�"�>‘M‚rSÍŽâ�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�l�a�r�g�e�r�-�t�e�x�t�"� �s�e�l�e�c�t�e�d�=�"�s�e�l�e�c�t�e�d�"�>e‡[WbáY'�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�m�o�b�i�l�e�"�>0â0Ð0¤0ë�<�/�o�p�t�i�o�n�>� �<�/�s�e�l�e�c�t�>� �<�i�n�p�u�t� �t�y�p�e�=�"�s�u�b�m�i�t�"� �v�a�l�u�e�=�"ˆhy:�"� �/�>� �<�/�p�>� �<�/�f�o�r�m�>� �<�/�d�i�v�>� � �