Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Understanding simple_production_v3.py

githubjimmyd edited this page Feb 6, 2019 · 9 revisions

From the code tab at the top, download simple_production_v3.py into your ccm suite folder.
Right-click it and select "open in Idle."

You can read over the comments in the file. This page has more detailed descriptions of the code. Python ACT-R actually re-programs parts of Python, being it to its will. If you already understand how to program in Python, you might get some interference, because certain functions have been redefined!

Importing Functions to Make it Work


import ccm log=ccm.log() from ccm.lib.actr import * 

For now, these commands should be in every Python ACT-R model you make.
They import the necessary functions for everything to run, and saves a record of what happened into a variable called "log."

The Environment

This is where we will eventually put things that are in the agent's environment--that is, not concepts in the head, but in the (simulated) world. But we're trying to keep things simple, so, for now, we will have nothing in the environment. To do this, we just put in 'pass.'


class MyEnvironment(ccm.Model):
pass

Creating the Agent

In the following code, we create an instance of the ACTR class, called MyAgent.


class MyAgent(ACTR):

Creating the focus buffer

The focus buffer is where we put goals. But we need to create the buffer, empty, first.


focus=Buffer()

The init() function gets run automatically. We want the agent to start with a goal, a focus on something. Here we set the focus of the agent to the goal of making a sandwich, and, specifically, the bread, because getting the first piece of bread is the first step.


def init():
focus.set('goal:sandwich object:bread')

Writing Productions

Productions are created using the

def
command. If you already know how to program in Python, don't get confused by this! It works differently, because Python ACT-R rewrites some of how Python works at all.

The arguments of the def, the stuff that goes in the parentheses after the production name, is the list of preconditions. That is, the left-hand side (LHS) of the production. For the production to "match," these preconditions need to be satisfied. In this case, the focus needs to be goal:sandwich and object:bread.

The body of the def function describes the right-hand side (RHS) of the production. In this case, we're just printing out "I have a piece of bread," then setting the goal to the next step in making a sandwich, which is to get the cheese.


def bread_bottom(focus='goal:sandwich object:bread'):
## In future models, it will actually do something.
## For now it just prints something out for us to see.
print "I have a piece of bread"
## To move on to the next step, we change the chunk that
## is in focus buffer by setting it to something new.
focus.set('goal:sandwich object:cheese') 

Clone this wiki locally