গানের কান

ইংরেজিতে একটা কথা আছে, “train your ear”। এই কথাটা মিউজিক স্কেলের ক্ষেত্রেই বেশি ব্যাবহার হয়। কিন্তু আরেক ধরণের কান ট্রেইনিং এর কথা মাথায় ঘুরছে, আশেপাশে নানা কথা শুনে। যারা রক মিউজিক প্র্যাকটিস করে তারা অনেক সময় হাসির পাত্র হয়। শুধু চাচা খালা বয়সীরা না, আমার সমবয়সী অনেক বাঙালিরা এখনো ভাবে যে অন্তত রবীন্দ্র সঙ্গীত বা ক্লাসিক্যাল সঙ্গীতের মত শুদ্ধ কাতারে রককে ফেলা যাবে না। আবার অনেকের ধারণা কিশোর-তরুণ থাকা অবস্থায় এই ঝোঁক মানুষের আসে, আবার বড় হয়ে এটা চলে যায়। রক ক্ষণিকের পশ্চিমা আগ্রাসন, ক্লাসিক্যাল চিরস্থায়ী।

এটা অনেক biased চিন্তা। আমাদের দক্ষিণ এশিয়া অঞ্চলে সাধারণ মানুষের কাছে মিউজিক বলতে গলার কাজই বোঝায়, কখনো instrumental গান নিয়ে কেউ তেমন একটা কথাও বলে না।  অন্য অনেক সংস্কৃতিতে বাদ্যযন্ত্র একটা বড় মাধ্যম, বাদকদের গায়কের মতই কদর দেয়া হয় অনেক ক্ষেত্রে। আমাদের কাছে ‘মিউজিক’ শেখা মানে গলার কাজ শেখা। গায়কের অভাব নেই কিন্তু ভালো বাদক পাওয়া যায় না দেশে। রক একটা বাদ্যযন্ত্র নির্ভর মাধ্যম। যেটা অনেকে বোঝে না সেটা হচ্ছে বাদ্যযন্ত্র এখানে কন্ঠের মতই বা কন্ঠের থেকেও বেশি অবদান রাখে। শুধু আমাদের কান এইসব বাদ্যযন্ত্রের কাজ বা টোন উপলব্ধি করার জন্য তৈরি হয়নি।

এছাড়াও, সংস্কৃতি বহমান একটা প্রক্রিয়া। বাংলা রক পশ্চিমা রক থেকে বেশ ভিন্ন, আমাদের সংস্কৃতিতে এর নিজের একটি সত্ত্বা আছে। লিরিক, সুর, পরিবেশনা সবকিছুর ঢংই অন্যরকম। “সেক্স, ড্রাগস অ্যান্ড রক এন রোল” আন্দোলন কিন্তু আমাদের দেশে আসেনি, আমরা মূলত সুরের ঢংটাই  উপযোজন করেছি, আর কিছু না। হেড ব্যাং করলে অনেকে সমস্যা ভাবে, কিন্তু সুরের সাথে শরীরের গতিবিধি নানা সংস্কৃতিতে সবসময়ই আছে। রবীন্দ্র সঙ্গীতে নাচলে কিন্তু সমস্যা মনে হয় না এসব মানুষের। অনেক রক মিউজিশিয়ান ক্লাসিক্যাল সঙ্গীতও উপভোগ করে (কিছু poser বাদে)। কিন্তু ক্লাসিক্যালের মানুষরা আমাদের ছেলেমানুষ ভাবে, সেটাই আসল ছেলেমানুষি। আমার ক্লাসিক্যাল চায়নিজ মিউজিকের প্রফেসরকে Led Zeppelin এর গান এবং গিটার সোলো উন্মত্ত হয়ে শুনতে দেখেছি। ভালো সুর এবং বাদ্যযন্ত্রের কাজ যারা মিউজিক বোঝে তাদের কান ঠিকই ধরতে পারে।

প্রথম যখন ইলেক্ট্রিক গিটারে distortion tone বাজাই, কিছুক্ষণ বাজানোর পর মাথা ঝিমঝিম করছিল। আট বছর পর, এখন যদি টানা কয়েক ঘন্টাও বাজাই, তাহলে বেশ রিফ্রেশিং লাগে। অবশ্যই কান তৈরি হতে সময় লেগেছে, কারণ আমি ছোটবেলা থেকে এক্সপোজড ছিলাম না এই টোনের সাথে। সবার কান তৈরি করতে হবে তা বলছি না, কিন্তু রক সঙ্গীতকে অশুদ্ধ ভাবার কোন কারণ নেই। সঙ্গীত সবসময়ই acquired taste।

When/if possible, compute.

This Thanksgiving break, I spent a lot of my time sitting in my room and crunching a lot of numbers in my laptop and in a cluster. That’s my usual job, but I haven’t really been working too much with data in the last couple of months (been concentrating more on developing some sensor electronics for my thesis). This is the time of the semester I usually take a break for a day or two, forget about everything else and just relax. However, this will be a memorable break, and I was/am very excited, writing this update late at night because I simply had to share this experience with the world.

Computation is very powerful. I previously wrote that computation is not comprehension, always. But when it does yield comprehension, it can be the most beautiful thing ever. It can tell you stories that no one ever told before. And they are the best stories of all — beautiful truth disguised in a beautiful narrative of numbers.

For the last four years, I have been working (on and off) on developing a computational and algorithmic framework for analyzing religious texts, and associated scholars and historians relationships. A lot of the time has been spent crawling, mining, and cleaning the right form of data. Recently, our team (a few humanities professors from UC Davis and Stanford, and me) finished crawling and cleaning a few million hadiths (different versions of the teachings of the Islamic prophet), over 75000 scholar biographies and a few hundred thousand correct narration sequences. And based on some previous scripts I wrote, I worked during this break to reduce a complicated hair-ball like mess of network relationships (between scholars) to a handful of cleaner and important sub-networks.

A few eigen-analysis tricks were enough to pull this off, but the path to any mathematical project like this is usually not quite straight and rather convoluted. Some simple mathematical intuition can take you a long way in these things, and I hope to detail this journey later in the blog.

There are few exciting results so far, and they will be detailed in publications and talks. I will list the key experiences of the last two days, which is representative of what it is like to live the life of a data detective (when you have collected good data).

Time seemed to stop.

I saw a thousand years worth history unfold in front of me, in my computer, within two days. I saw trust, betrayal, self-interest, selflessness, and overall honest efforts of over 75000 scholars who lived in different cities/countries in different times, their lives condensed in network diagrams and eigenvectors. Each step taken to get from the hair ball mess to the cleaner networks was inspiring me immensely; solving each piece of that puzzle and not realizing when the day already became an evening. When I was getting close to making major inferences, the work did not seem work anymore. I had to push myself to get to bed, convincing myself against the fact that the results were knocking on my door. The satisfaction of doing this type of work is very high.

We need better visualization tools.

More than distributions and tables, I think we need better visualization tools to understand data, as our cognitive abilities can be fully utilized in that case. Visualizing networks and eigenvectors in clever ways at different stages of the analysis saved me a few weeks worth effort. More on this in later posts.

When in doubt, compute.

Hypotheses and intuition can take us quite far, but when the data is complex, we have no other choice other than falling back to standard mathematical tools. It is usually encouraged to not compute blindly, but certain gut feelings and a few semi-blind computations can yield accidental but good results.

Simple mathematical tools are usually good enough.

SVD, PCA, basic graph manipulation techniques provide results that are easily understandable. Many times, some unsupervised learning methods get on my nerves for the many parameters and tuning options they provide. Using them is like trying to get a 98% in an exam instead of being satisfied with 92%. Sometimes the effort is not worth the time and agony, and the results are confusing many times.

Collect data that matters, impact is a byproduct.

One billion Muslims and their cultures are directly or indirectly affected by these hadiths and narration trees. The people of other faith who live around them are affected by these teachings too. Hadiths can unite, divide, inspire, or confuse people. Yet, no one seems to care about looking through a computational lens on the system, which could be an immensely useful tool to check the reliability, sanity, and soundness of this knowledge. It is also a novel way to see how knowledge diffused in the middle eastern countries over centuries.

Our team’s initial aim was to collect the correct form of this data from reliable sources. Impact will come as a byproduct of the computational analysis, that’s my hope.

The fallacy of unlimited scientific understanding

I have often encountered scientists, students of science and mathematics, and science enthusiasts who think (or hope) that scientific exploration and mindset will lead to unlimited knowledge for the questions we ask. If not today, then after n years, but we will find an answer to many of our questions. Even though questions lead to more questions, we are only exploring deeper and farther, and eventually we will reach an understanding of the universe, of ourselves, and our individual and collective behavior. I will tell you why I think that’s a problematic approach towards doing science.

A Reductionist view sometimes yield incomprehensible depth

The most appealing part of building a mathematical model is its elegance and simplicity. We streamline data and hypotheses into a few symbols that represent past, present and future states of a system. We break down observations into smaller pieces, assign variables to represent each piece, and describe the relationships between each piece using different tools that mathematicians have developed. Working on describing a system mathematically gives me immense joy, reduced sleep and a lot of excitements in every line written down on a notebook. Writing every piece of numerical or machine learning code is a blessing.

All that’s good. However, tackling a problem by dividing it branches out many children in the tree. In some cases, we make connections between these children nodes, but sometimes we can’t. Not all the scientific community is working in a balanced way. Human choices and wishes factor in. If deep learning neural networks seemed successful in tracking faces, many will start running behind the concept to utilize its applications in other things, leaving other children nodes unattended. Graphene got some people Nobel prize, and the next decade of papers in condensed matter physics will be filled with work related to Graphene.

More dangerous than that is our human capability to understand data. Good data is expensive. We carefully set up questions to ask, and we build tools to test these questions. The data that comes out is carefully catered to our five sense organs. There could be many data lost during this projection. There could be data that we cannot build sensors to capture because we do not know what would the nature of these data be to begin with.

Computation is not comprehension

The data that we capture, and given the volume of the data we produce nowadays, is in many cases incomprehensible. Many people argue that we can compute — run algorithms and crunch numbers using supercomputers. Let me suggest that computation does not necessarily mean comprehension. Even if we manage to crunch numbers in the most elegant supercomputers of distant future, the results do not necessarily help us, we may not comprehend what it means, with our current cognitive abilities. It may take a more evolved ultra-human to ask smarter questions and answer them, but they might as well face similar troubles in their scale.

Human and social factors

Lastly, but not the least, science is done by social animals who want recognition and satisfaction from their work. Plagiarism pops up. Politics to publish in prestigious journals. Journalists misinterpreting conclusions and scaring/demotivating people. Or motivating people about the wrong things. All sorts of things happen that hinder the progress of asking questions that matter.

Why we still do science

I don’t know about others, but it provides me comfort and peace, just what faith provides to many. Humans are curious, and we want to explain the things around us. It is a miracle that our world is comprehensible and describable (as told by Einstein). I personally believe that we should find peace in that miracle, while accepting the fact that a lot of the knowledge around us are too complex to describe and make connections.

No, religion is still not an answer to big questions

It’s easy to point to an entity who has answers to all these questions. However, I think religion should not be favored by default though. There are questions that cannot be answered by science, and cannot be captured by the naïveté of miracles that religion promises. Religion has its place for a different level of comfort, but is not a substitute for scientific exploration.

MIT Shenzhen Bootcamp: Navigation 101

Getting a Visa

I had to apply for the tourist visa category. As an international student, specially coming from a South Asian region (Bangladesh), there were some extra hurdles for me. I had to submit my bank statement, a letter from MIT stating that I am currently a student at MIT, along with photocopies of my passport and current I-20 document. I also got a letter of invitation from AQS China (our host company in China) to go with my Visa application. A friend recommended that I go talk to some travel agent in Chinatown to make my life easy, and so I did. They charged me a fee of $125 (including the fee to apply for Visa), and I didn’t have to go to NYC by myself to apply. Within a few weeks, I got my passport back with a 60-day visa.

Tips:

  1. Prepare early for your visa if you are an international student.
  2. Travel agents can help you a lot, for a small fee you can get a lot done.

Arrival

The Shenzhen International airport is a pretty big, with no visible sign of English language instructions anywhere. Our bootcamp instructor Bunnie Huang was generous enough to come and pick me up to avoid any complication. I had no Chinese phone/SIM, my US carrier wouldn’t work (no roaming network), and I had quite a big luggage (as I was carrying materials for a workshop I was organizing in Bangladesh). I thought of getting adventurous, still, by calling a taxi, as I had the apartment address that MIT rented for us. Bunnie said in an email, “having no phone and trying to get to the apartment by a taxi is a recipe for disaster.” Alright, I waited at a star bucks inside the airport for this amazing friendly guy to show up.

When I got to the apartment building, I was explained why simply getting a taxi wouldn’t work. You see, the address was given to us as 66 South Park road. In reality, it was called 66 Nanyang Road, and most of the drivers wouldn’t get the translation. Also, most taxis won’t have GPS, and they navigate by popular landmarks in the city.

View from my apartment.
View from my apartment.

Tips:

  1. For the first few days, it’s good to have someone show you around the city.
  2. Trying to use GPS maps may not help, there’s no Google maps either. Your best bet is to ask people, use Bing maps, memorize manual maps etc.

Survival: 1

You need to have a VPN installed in your computer if you want to use Google, Facebook etc services. It’s good to change your passwords as Chinese hackers might attack and poison your computers. If your ip is found to be using google, facebook etc several times, your ip might be blocked. The MIT VPN from Cisco worked well for me. There are commercial services like Strong VPN etc in case you don’t have access to free ones.

Survival: 2

The next day, we were taken to the shopping mall nearby our apartment building to buy necessities, and also to familiarize ourselves with cash transactions with the shop attendants. Remember that everything runs on cash, there’s no card specially when you go out to the street shops to buy things.

  1. You might want to get extra cushion for your bed if you aren’t used to sleeping on hard beds.
  2. Tap water is not quite safe to drink. I bought mineral water bottles for a month.
  3. It seems inevitable that you (a foreigner) will catch attention of many kinds of people in the street. I was handed phone numbers and cards with titles like “girls for fun” etc. And then there are sellers who want to sell you all sorts of ‘things’. A piece of advice from Bunnie: “don’t do stupid shit!”
  4. If you are not used to flat/pan commodes, then may God help you. It’s very common in shops and restaurants.
  5. Food was a whole new deal for me, even after eating “chinese food” in my country and USA. I will post another entry just on the food culture.

A farewell note

I usually have a hard time letting people go.

Some friends and well-wishers told me that I don’t easily give in. I think they fail to realize that I do give in, only to my emotions.

I miss some people very badly. People who start a spark inside me, and then leave. A few months ago I was walking down the Boylston Street sidewalk, and noticed a violinist playing classical music. I stood there listening to him for 10 minutes, and then bought one of his untitled coverless CDs and came back home. After a few hours, I found myself going back to Boylston Street again in an attempt to find that guy. It’s not rare that a great piece of music brings tears to my eyes, only this time I had a chance to meet the genius who made it happen. I couldn’t find him obviously, but I keep an eye out for him in subways.

Speaking of subway, once I met this young lady who was playing a guitar and singing Arabic songs in the Central Square subway station. I sat beside her, smiling. A few Ashmont-bound trains passed by, I was getting really late for a meeting at MIT, but I was enchanted by her music. She understood, and smiled back at me. We were speaking through smiles, and she kept singing. I knew it was meant for me. I had to leave when the next train came. I looked at her, and she nodded. I had her permission to leave. We smiled at each other, and parted in our ways.

We walk away from these fleeting but strong bonds, because we have to. In some alternate universe, we might see relationships forming out of these simple yet powerful interactions, but may be not in this universe. This universe teaches us to move on, for our own good, because we have to. Logic pushes us to look away and walk our own path. And so I do, and you do. We all do. Ignoring the heart, listening to the head. Because we have to.

I know I will meet these people again, in some way or other, in strange circumstances. However, I know that it won’t spark the same emotion like the first time when we felt a bond. It will be a casual encounter.

Last night, Sujoy bhai was smiling back at me before I was leaving, and I couldn’t help but say, “bhai your smile is going to make me miss you.” Unfortunately I’m not good with words (read scared) in front of smart girls, so I just gave a hug to Tapoti apu.

Words can’t express how I feel when I have to kill these emotions — killing a newborn child is not easy. However, my human capabilities will only let me communicate through words. So here it goes, after the big preamble to explain the context behind these words:

Sujoy bhai and Tapoti apu, I will miss you.

বিন্দু আমি…

রবিবারের অলস দুপুরে গান শুনছি, প্রতিটা নোট গিলছি। গিটারের সোলো, ড্রামের হাই হ্যাটে মৃদু দুই একটা ফিল-ইন। বেজ গিটারে একটা লম্বা রিফের আমেজ, কিবোর্ডে ভরাট, ঘর গম্ভীর করা কোন কর্ড। লিরিকের মারপ্যাঁচ, গায়কের নিজের পুরোটা দিয়ে গাওয়া।

এরকম ভালোবাসায় বিশ্বাসী নও তুমি

অথচ তোমাকে দেখি আমি

অজস্র ছায়ার মাঝে দাঁড়িয়ে

কি যেন খুঁজছ তুমি।।

শুনতে শুনতে মনে হচ্ছে এই গানগুলো আর কোনদিন থামবে না। গানের চরিত্রগুলো যেন চোখের সামনে দেখতে পাচ্ছি।

সব আলো নিভে যাক আঁধারে
শুধু জেগে থাক ঐ দুরের তারারা
সব শব্দ থেমে যাক নিস্তব্ধতায়
শুধু জেগে থাক এই সাগর
আমার পাশে

সব বেদনা মুছে যাক স্থিরতায়
হৃদয় ভরে যাক অস্তিত্বের আনন্দে
হৃদয় গভীরে অবাক দৃষ্টিতে
থমকে দাড়িয়েছে মহাকাল এখানে

স্পন্দনের কাছে আমরা জিম্মি। oscillation দ্বারা প্রতিটা জিনিস পরিচালিত হয়, আমরা পৃথিবীর সন্তানরা বাদ যাবো কেন? শ্রুতিমধুর শব্দের কাছে, রিদমের কাছে আমরা আত্মসমর্পণ করতে বাধ্য।

তাহসানের প্রেমাতাল শুনছি, ওয়ারফেজের অবাক ভালোবাসার পর মাঝখানে ইয়েলো ব্রিক রোড শুনে আবার ফেরত আসছি অঞ্জন দত্তের কাছে। বেলা বোস আর মালার তালে গলা মিলিয়ে আবার ফেরত এসেছি বিন্দু তে।

বিন্দু আমি তুমি আমায় ঘিরে

বৃত্তের ভেতর শুধু তুমি আছো।

মাতাল আমি তোমার প্রেমে

তাই অর্থহীন সবই যে প্রেম লাগে।

বৃহস্পতির বলয় ঘিরে

শনিতে আজ আমি পৌঁছে গেছি।

তোমার প্রেমে পাগল হয়ে

পাগলামির ভাবসম্প্রসারণ করছি।।

গান আর না থামুক। চলতে থাকুক সারাদিন, সারা বছর, বছরের পর বছর। আমার চামড়া ঢিলে হয়ে পাকানো দড়ির মত হয়ে যাক। চুল আর দাঁত সব পড়ে যাক। থুড়থুড়ে বুড়ো হয়ে বেঁচে থাকবো, আর গান, গানের কথা, সুর আমাকে বাঁচিয়ে রাখবে। তারপর গান শুনতে শুনতেই একদিন বিদায় নেবো, কিন্তু কোন আক্ষেপ থাকবে না। সুখি হবার জন্য খুব বেশি কিছু লাগে কি?

nano fiction: recursion

Recursion

They read every page, but could not find the answer. Some of them examined the book closely. Debates ensued. Wars started. People died. They were divided, but everyone wanted to know the answer. So they went back to the book. Scrutinized pages after pages. This time their strategy was different. They sat together. Spoke for hours, days, months and years. Halley’s Comet kept passing by, they lost count at some point. Disputes ensued. Wars began..

“No! We can’t go on like this!” – exclaimed one of them.

An old man asked, “what do you suggest?”

“Burn The Book! It is the source of all evil!”

Everyone agreed.

The book was torn apart and thrown into fire. Smoke and fire shrouded the book, everyone looked at the mess with disbelief, pain, anger and frustration. A page was spit out from the ruin by the wind, almost burned but the text was legible. The old man went ahead and picked it up. He read the seven sentences written on the page, and suddenly realized what the answer was.

The very first page contained the answer that human beings forever sought to know.

Social Dynamics of Terabithia

In the land of Terabithia, king Jesse and princess May Belle have taken over the duty to rule the kingdom. The people of the kingdom are divided into five tribes at the time of their inauguration. These are liberal people, willing to accept and share new ideas and fashion available in each tribe. Jesse has appointed Abul (the court mathematician) to figure out how and at what rate his newly introduced fashion of wearing a Lungi will spread throughout his kingdom. He has also decided to divide his country into different districts based on different styles of wearing lungi.

Now, there are several factors for Abul to consider here. Some of the tribes have accepted Lungi as their choice of official dress code. However, they have different styles of wearing those. Tribe 1 likes wearing it with no shirts on, tribe 2 refused to accept it as their fashion, tribe 3 wears lungi with a kurta, tribe 4 prefers this style

kerala_lungi

and so on. The fashion designers in each tribe have made appealing designs to impress and encourage people from other tribes to accept their fashion. Abul needs to figure out and forecast the possibility of each tribe’s fashion surviving and/or flourishing over the whole kingdom.

Problem Statement

In sociology, economics, business planning etc, researchers and analysts are always concerned about how competing cultures, languages, fashion etc survive over a period of time. Some cultural trends are short lived, some defeat the existing trends and completely take over. It is impossible to predict what individuals think about each trend, but it is in our reach to predict what the mass trend will be once a steady state is reached.

Individuals have different philosophies. In general we update our idea of fashion and culture based on movies, TV, books, what others around us do etc. Some of us are trend starters. Others follow them. Many times it is not one person, it is a group of people following a trend that motivates others to follow. In the formal terminology of social science and social dynamics, there are three stages of a cultural trend change before it reaches a steady state.

  1. Emergence: A new cultural center emerges in a population. Someone or a group of people start using a new colloquial word, begin wearing a new kind of jeans or may be start listening/propagating a new genre of metal songs to others.
  2. Broadcast: This new trend is “shown off” to others occasionally. The trend starters use their newly coined colloquial word too often in public, wear the newly designed clothes in parties or release albums and organize concerts to promote the new genre of metal with some frequency.
  3. Following and Competition: Others decide whether they will accept or reject the new trend. If someone decides to accept, occasionally he/she also becomes one of the broadcasters. If there are several competing trends available, then a decision is made based on factors like the current number of people following the trend and how long this trend has been followed or simply personal taste.

Every trend usually dies after some time. This can be months, years or even decades. Our general tendency is to accept the newest trend.

In the field of Social Dynamics, agent based modeling has been used by many mathematicians to study the behavior of such chaotic systems. It is usually hard to find closed form solutions of any mathematical model describing such a complex process, so discrete time Monte Carlo simulations or rule based cellular automata systems have been used to predict mass behavior in a society.

To help Abul, we modify and suggest some improvements to a model proposed in this paper and add some more functionality to study the culture of Terabithian people.

Monte Carlo Model

The Monte Carlo simulation is performed on a lattice of size L \times L, containing L^{2} agents who interact with their neighbors. A fashion is defined as I(s,a), where s is the cultural center and broadcaster site, and a is the age of the fashion.

The model assumes that newly arrived fashions are likely to be accepted more. A fashion I(s_{i},a_{i}) for a particular agent i can change its preference to another fashion from site s_{j} if a_{j}<a_{i}. Keeping this in mind, the proposed algorithm to take a timestep from t to t + 1 over the whole lattice is

  1. Emergence step: With a very small probability p_{new}, a new cultural center emerges. I_{i}(t)=I(i,0).
  2. Broadcast step: With a probability p_{repeat}, the cultural centers restrengthen themselves to affect their neighbors. I(i,a_{i,t})=I(i,0).
  3. Spread step: Each site i randomly chooses one of its nearest neighbors j (with equal probability) by whom it will be affected. If a_{j}<a_{i}, then the current fashion at i is changed to the fashion followed by j. I(s_{i},a_{i})=I(s_{j},a_{j}). Otherwise nothing changes for i.
  4. All ages in each lattice site is increased by 1.

Modifications

  1. The original model proposes choosing a site randomly as an emerging cultural center. This limits Abul to concentrate on one tribe only. In other words, the model does not consider competition between several *existing* fashions. We propose to change this scheme and assume each tribe acts as their own ambassador. Thus we assign a cultural center to each tribe as an initial condition and all of them are broadcasters of their own fashion.
  2. The paper considers geographic impacts such as closed boundary at the borders of a country. We extend this by considering geographic factors that can slow down the exchange of information, e.g. rivers and seas that divides countries and regions. To include this, we introduce another random variable p_{cross} that determines the probability of information crossing over the given obstacle. With this probability, we exchange information only between the two sides along the obstacle in step 3.
  3. Finally, we also propose changing the global p_{new} and p_{repeat} to local competing groups by converting these variables to arrays. This better captures the reality because different groups of people may have different tendencies to interact with others. It is too simple to assume that every competing group has the same level of interaction and motivation to spread their own culture.

Back to Terabithian Tribes

Mathematica was used to program this Monte Carlo simulation. We study the general model and our modifications one by one.

Terabithia is an infinite kingdom, it is a torus. That is, if you leave the kingdom from one side, you will enter through the other side. There is no escape from lungi or Jesse’s rules. We simulate this by assigning a periodic boundary condition on our lattice when choosing neighbors for a particular site.

For one of our examples though, we will use a closed boundary condition.

We model the kingdom by a 50 \times 50 lattice , each site represents a group of people (presumably a family or a house). We choose the nearest four neighbors with whom each site will interact.

tribes-colors

(a)

general-initial-lattice

(b)

Figure 1. (a) Tribe colors. (b) Initial distribution of different groups.

Figure 1 shows an initial random distribution of different groups of people who follow different tribes, colored according to 1(a).

We would like to run the original paper model first. We choose 500 iterations for the simulation. Estimating that only one active interaction (an interaction with a broadcaster that changes someone’s mind to start following a new fashion) occurs in a day, this would mean the simulation is the result after 500 days.

general-iter-500

Figure 2. Steady state reached after 500 iterations (days).

Figure 2 shows how fashions of different tribes have clustered over 500 days. Tribe 4 is less dominant for this particular number of iterations. The important point is that trends have emerged over different regions, it is not a random distribution of fashion anymore, as in 1(b).

Since we have imposed a periodic boundary condition, note how the clusters have continuity (wraps around) at the horizontal and vertical ends of the lattice.

We have helped Abul solve the initial problem. He can show this simulation to the king and inform him about possible clustering and number of people following particular fashions in this competing culture war after different number of days. However, there are more modifications on the way.

Rivers and Borders in Terabithia

Often we have borders among regions that stop people from interacting with each other. There are rivers and seas that distance people out (assuming no internet, like in the ancient days) and slow down the exchange of information and culture. Abul wants to incorporate these factors in the model. We help him by changing our neighborhood selection algorithm to include a set of cells in our lattice that stop information exchange.

border-initial-lattice

(a)

border-iter-500

(b)

Figure 3. (a) A different tribe is included among the cells (off-white cells creating a rectangle) which act as information barrier (a physical border, in a sense). (b) The two separate regions evolve independently, as expected.

Notice in figure 3 that some cultural trends have disappeared, they could not survive for 500 days. However, it is possible that they can come back if we ran the simulation for more iterations.

river-initial-lattice

(a)

river-500-iter

(b)

Figure 4. (a) A river that splits the kingdom into two equal regions. However, a slight probability of information exchange is allowed across the two river sides. Closed boundary conditions are used. (b) Result after 500 iterations.

Figure 4 shows our modification of the original algorithm to include slow information exchange among two regions. 4(b) shows what we would expect. The same cultures have emerged around the river sides since they have some interaction. Note the consistency of the clusters on both sides. However, they are dominated by the trends that are stronger in the larger regions. Closed boundary conditions were used for this example.

Individual Probabilities for Tribes

As promised, we now help Abul make the model more realistic by assigning individual p_{new} and p_{repeat} variables to each tribe. The algorithm needs to changed slightly for doing this.

individual-probs

Figure 5. Biased and higher probabilities assigned to tribe #5, which is why it cultural trend dominates over the others.

This is much better because it gives us the capability to include real world information in the model. Although the probability distributions for each of these random variables are decided here by us, in reality we can conduct surveys and build realistic discrete distributions from which we can run a much reliable simulation of the future events.

Conclusion

With the proposed modifications, we can expect that the model is useful in a real world setting to predict future outcomes for competing cultural trends in a society. The best way to integrate all the modifications is to create an MCMC (Markov Chain Monte Carlo) sampler to estimate parameters for the joint distribution function for p_{new} and p_{repeat} from real world data.

The resulting parameters will be used in the above simulation and we may get some useful results if we cleverly choose a good neighborhood coverage for each lattice site (e.g. considering information exchanged over internet among distant sites).

Finally, Abul can present these results to the king and expect to get a promotion in return. Math saves the day, once more.

100 poems in 1 minute (Bangla)

সে এসেছিল সে মোর  মর্ম গভীরতম উন্নত শির রয়েছে তুলিয়া  সকল,
তোমারি ভৈরবী মুকুল মম সুবাসে তব গোপনে সৌরভী আমার…
বন্ধু যদি চায় ভুলো না আপনায়  মিথ্যা দিয়ে চাতুরী দিয়ে রচিয়া।
সে কোন্‌ খেলা  কোথা কেটে গেল বৎসর বৎসর ক্ষয়িষ্ণু স্মৃতির ব্যর্থ!
সে দেয় বাঁটি ভরেছে মন গীত গন্ধে বসে

তোমারি এক প্রেমে  দুঃখসুখের বিচিত্র জীবনে  তুমি ছাড়া আর অন্য।।
বন্ধু যত মাথা তুলে বলতে পারে না হায়…
প্রাণের রথে বাহির হতে  পারব কবে  প্রবল প্রেমে সবার মাঝে,
সে আমার প্রাণে লাগে আমার বাণী আমার প্রাণে বাজায় বাঁশি॥

ও মা।।
যা চোখে পড়ে  তার পরে পথ ছাড়ো  তার পরদিনে উঠিবে প্রভাত  ফুটিবে,
বন্ধু কারে দিব দোষ বৃথা কর রোষ যারা শুধু মরে কিন্তু!
প্রাণের নিরর্থক চাঞ্চল্যে  ময়ূরটি ঘাড় বাঁকায় এদিকে ওদিকে  তার
উদাসীন।

কবিতা লেখার প্রধান উপাদানগুলো কি? আমি কবিতা লেখার কিছুই জানি না প্রায়। ছোটবেলায় ভাবতাম ছন্দ মিলিয়ে দিলেই বুঝি কবিতা হয়ে যায়। একটু বড় হয়ে বুঝলাম যে এটাকে প্রাথমিক ভাবে ছড়া বলে। তখন ভাবা শুরু করলাম যে কঠিন শব্দ ও বাক্যের বিন্যাস থাকলেই মনে হয় সেটা খুব ভাল কবিতা। আপাতদৃষ্টিতে উঠতি কবিদের লেখা পড়ে তাইই ধারণা হত। কবিতা পড়ার পরিধি একটু বিস্তার পাবার পর (রুদ্র মোহাম্মাদ শহিদুল্লাহ, পূর্ণেন্দু পত্রি, কিছু নিরমলেন্দু গুন ইত্যাদি), আর আধুনিক গানের কথাগুলো (জেমস – মারজুক রাসেল ইত্যাদি) ভাল লাগতে শুরু হবার পর কবিতার ক্ষমতার প্রতি শ্রদ্ধা তৈরি হওয়া শুরু করলো। নিজে কখনো কবি হতে পারবো না, সেটা ভাল করেই বুঝে গিয়েছিলাম তখনি। কিন্তু এই হতাশাই বোধহয় কবিতা নিয়ে অনেক ভাবে ভাবতে শিখিয়েছে। প্রধান প্রশ্ন ঘুরে ফিরে একটাইঃ কবিতা লেখার প্রধান উপাদানগুলো কি?

সাধারণ পাঠক হিসেবে আমার ধারণাগুলো সংক্ষেপে বলি। শব্দ আর বাক্যের চয়ন অন্যতম মূল মশলা। এর সাথে থাকতে হবে কোন নির্দিষ্ট ভাব (বা অনির্দিষ্ট, ইংরেজিতে একে বলে nonsense theme)। বাক্য বিন্যাস গৎবাঁধা গদ্যের মত না হলেই চলে অনেক সময়; ছন্দর উপস্থিতি অত্যাবশ্যক নয়, কবিতার ভাব এবং কবির রুচির ওপর নির্ভর করে এটা। এর বাইরে আরো অনেক কিছু আছে, তবে এক কথায় এই হচ্ছে আমার চিন্তা।

স্বয়ংক্রিয় কবিতা

কবিতা না লিখতে পারলেও, কবিতা লেখার প্রক্রিয়াকে কি আমরা স্বয়ংক্রিয় করে তুলতে পারি? নিয়মের আষ্টেপৃষ্ঠে বাঁধা যন্ত্র কি সাবলীল ভাবে কবিতা তৈরি করতে পারবে? শব্দ ও বাক্যের বিন্যাস ঠিক রাখা সম্ভব, এটা করা সহজ ব্যাপার আর আমরা আসলে এটা অনেক আগেই করে ফেলেছি। কিন্তু একজন কবির ভাব এবং দৃষ্টি পুরোটাই তার নিজস্ব সৃজনশীল অনুভূতির ফসল। একটা যন্ত্র, যে শুধু কিছু প্রাথমিক কমান্ড বুঝতে পারে, তার কাছে সৃজনশীল অনুভূতি আশা করা উচিৎ কি?

আরো সাধারণভাবে যদি বলি – শুধু কিছু প্রাথমিক নিয়ম কে আমাদের বিল্ডিং ব্লক হিসেবে নিলে তাদের যেকোনো সমষ্টি থেকে আমরা কতোটুকু complex behavior আশা করতে পারি? মানুষের মস্তিষ্কের কার্যবিধি কিছুটা এরকম। আমাদের নিউরনরা বেশ কিছু সিগন্যাল আদান প্রদান করে নিজেদের মধ্যে। এসব সিগন্যালকে আমরা মোটামোটিভাবে শনাক্ত করে ফেলেছি। এছাড়াও দেখা গেছে যে কয়েকটি নিউরনের সমষ্টি (নিউরাল নেটওয়ার্ক) অনেক ধরণের কমপ্লেক্স প্যাটার্ন তৈরি করতে পারে। শুধু একটি নিউরনের পক্ষে এতোটুকু জটিল প্যাটার্ন তৈরি করা সম্ভব না, কিন্তু কয়েকজন একত্র হলেই কেওস (“বিশৃঙ্খলা”) তৈরি হয়ে যায়, যার থেকে তৈরি হয় অনুভূতি। আগ্রহীরা এই বইটি পরতে পারেনঃ New Kind of Science (Stephen Wolfram) যেখানে এই পদার্থবিদ ও গণিতবিদ সাধারণ মানুষের জন্য লিখেছেন ও দেখিয়েছেন কি করে শুধু ছোটখাটো কিছু প্রোগ্রাম একজন আরেকজনের সাথে interact করলে কতরকম কমপ্লেক্স কিন্তু বোধ্য প্যাটার্ন পাওয়া সম্ভব।

তাহলে অনুভূতি বলতে কি বুঝি আমরা? এটাকে গনিতের আওতায় আনা সম্ভব কি? অনেকেই চেষ্টা চালিয়ে যাচ্ছেন (রজার পেনরোজ etc.), যাদের প্রধান যুক্তি গড়ে উঠেছে chaos theory কে কেন্দ্র করে। যেরকম কমপ্লেক্স আচরণের কথা বললাম, সেটাকেও গণিত দিয়ে বাঁধ মানানো সম্ভব হয়ত। তারই একটি প্রচেষ্টা হিসেবে ৭০ এর দশকে প্রথম স্বয়ংক্রিয় কবিতা তৈরি করার জন্য একটি অ্যালগরিদম দেয়া হয়। মারকভ মডেল ব্যাবহার করে এই প্রক্রিয়াটি কিছু প্রদত্ত টেক্সট থেকে pseudorandom টেক্সট তৈরি করতে পারে, যা পড়লে অনেক সময় বোঝা মুশকিল এটা আসল না নকল। উপরের কবিতাটা কিন্তু এই মারকভ মডেল দিয়েই তৈরি করা। 🙂

মারকভ মডেল

আমি প্রধানত ব্যবহার করেছি খুব সাধারণ একটা মডেল, যার নাম হচ্ছে n-gram Markov Model। এখানে n যেকোনো নাম্বার হতে পারে ১ থেকে শুরু করে।

যেকোনো মারকভ মডেল সাধারণত একটি বিবর্তনশীল প্রক্রিয়া। আমি যদি কিছু নাম্বার দিয়ে একটা ভেক্টর (state) তৈরি করি, আর সেই ভেক্টর কে একটি ম্যাট্রিক্স দিয়ে গুণ করতে থাকি (ম্যাট্রিক্সটির কিছু properties maintain করতে হবে, যেমন Ergodicity and Aperiodicity) তাহলে একটা সময় সেই ভেক্টরটির মাণ আর পরিবর্তন হয় না। আমরা কেওস থিওরি তে বা স্ট্যাটিস্টিকস এ একে বলি stable state। ম্যাট্রিক্সটিকে বলা হয় transition matrix। এই ম্যাট্রিক্সটি এবং এই পুরো বিবর্তন ব্যাবস্থাটি  এমন ভাবে তৈরি করা হয় যেন বর্তমান ভেক্টর এর মাণ শুধু এর আগের কিছু states (আগের ইটেরেশন এর ভেক্টর এর মাণ) থেকে একদিকে converge করতে শুরু করে। কিন্তু  বর্তমান ভেক্টরটি কিন্তু আবার আগের এবং পরের ভেক্টর থেকে স্বাধীন (একে বলা হয় Markov property)।

n-gram Markov Model সাধারণত n সংখ্যক শব্দ নেয় (প্রদত্ত টেক্সট থেকে), ধরি এটা হচ্ছে একটা ভেক্টর v[1..n], এবং বাকি টেক্সটের মাঝে v[2..n] খোঁজ করে। যতগুলো match পাওয়া যায়, ততগুলো থেকে আমরা র‍্যান্ডমলি একটা বেছে নেই। সেটার পরের শব্দটি নিয়ে আমরা আমাদের পরের state তৈরি করি, যাকে বলতে পারি v’। অর্থাৎ, v’ = Union[{v[2..n], chosen word}].

যেমনঃ “আমি ফুচকা খাবার জন্য ফুচকা খাবার দোকানে গেলাম, কিন্তু ফুচকা খাবার দোকান বন্ধ ছিল।” এই বাক্য থেকে আমি বেশ কিছু 3-gram (n = 3) তৈরি করতে পারি।

আমি ফুচকা খাবার, ফুচকা খাবার জন্য, খাবার জন্য ফুচকা, জন্য ফুচকা খাবার, ফুচকা খাবার দোকানে, খাবার দোকানে গেলাম, …, ফুচকা খাবার দোকান, দোকান বন্ধ ছিল।

এখানে আমি যদি v[1..n] = {আমি, ফুচকা, খাবার} ধরি, তাহলে v[2..n] = {ফুচকা, খাবার}. তাহলে এই পুরো বাক্যে v[2..n] তিনবার পাওয়া যাবেঃ ফুচকা খাবার জন্য, ফুচকা খাবার দোকানে এবং ফুচকা খাবার দোকান। আমার কাছে তাহলে তিনটি অপশন আছে পরের শব্দটি বাছাই করার জন্যঃ  জন্য, দোকানে এবং দোকান।ধরা যাক পরের শব্দটি র‍্যান্ডম ভাবে সিলেক্ট করলাম এবং পেলাম দোকান। তাহলে v'[1..n] = {ফুচকা, খাবার, দোকান}।

নতুন v’ দিয়ে আমি একি অ্যালগরিদম আবারো চালাতে পারি। এইভাবেই বেশ কিছু iteration এর পর আমরা নতুন আরেকটি বাক্য পাই। এখানে n যত বড় হবে, ততই accurate বাক্য পাওয়া যাবে। কিন্তু সেটা আমাদেরকে শুধু মূল প্রদত্ত টেক্সট এর কাছাকাছি একটা কিছু দেবে। n ছোট হলে আরো অনেক নতুনত্ব আসবে, কিন্তু accuracy কমে যাবে। সেটা যদিও আরো অনেক interesting হবে।

এটা মারকভ মডেল কারণ আমার বর্তমান ভেক্টর আগের ও পরের ভেক্টরের ওপর নির্ভরশীল নয়। এখানে আমরা যা করছি তা মূলত একটি বড় ম্যাট্রিক্স দিয়ে একটি ভেক্টর কে বারবার গুণ করারই সমান।

এখানে এটাও লক্ষণীয় যে এই মারকভ মডেল আসলে কেওস থিওরির সাথে সম্পৃক্ত। যেকোনো গল্প, উপন্যাস বা কবিতা কে যদি আমরা কিছু সমষ্টিগত শব্দের বিশৃঙ্খলা হিসেবে ধরে নেই, তাহলে এই বিশৃঙ্খলা থেকে একি প্যাটার্নের আরেকটি বিশৃঙ্খলা তৈরি করাই হচ্ছে n-gram মারকভ মডেল এর কাজ। কবিতার মত ভাব নির্ভর সাহিত্যে এ ধরণের মডেল বেশ কাজে আসে।

এক মিনিটে ১০০ কবিতা?

চাইলেই কি এ দিয়ে অনেক কবিতা লিখে ফেলা যাবে? আমি রবীন্দ্রনাথের ৫০০ কবিতা, সুকান্তর কাব্যগ্রন্থ ছাড়পত্র আর জীবনানন্দর বেশ কিছু কাব্যগ্রন্থ একত্র করে একটা corpus তৈরি করেছিলাম বেশ আগেই, কবিতার মধ্যে শব্দর বিশৃঙ্খলার প্যাটার্ন বের করার উদ্দেশ্য নিয়ে। সেটা ব্যবহার করে, আর বেশ কিছু theme keyword দিয়ে (যারা কবিতার প্রধান ভাব নির্ধারণ করবে) মিনিটেই অনেক কবিতা বের করে ফেলা সম্ভব। Mathematica তে লেখা আমার বেশ ছোট একটা প্রোগ্রাম খুব দ্রুতই এই কাজ সেরে ফেলতে পারে নিপুণ ভাবে। প্রথমে লেখা কবিতাটি মূলত রবীন্দ্রনাথের ৫০০ কবিতার ওপর নির্ভরশীল। আমি আরো বেশ কিছু customization করেছি, যেমন র‍্যান্ডম চয়েস করার সময় চাইলেই biased সম্ভাব্যতা নিয়ে আসা যায়, তাহলে যেকোনো কবি বা কবিতার প্রাধান্য থাকতে পারে এই নতুন কবিতার ওপর।

সবসময় যে খুব ভাল কাজ করবে না, তার প্রমাণ পরের কবিতাটি। এটা বেশ কম সংখ্যক কবিতা থেকে তৈরি করা হয়েছে, এবং কিছু ভাবের (thematic) শব্দ কে লক্ষ্য করে প্রোগ্রামটি চালানো হয়েছে, যেমন প্রাণ, বন্ধু, সুখ, তোমারি এবং বিদায়।

প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ

তোমারি চরণ ওগো মৌন না যদি জুটে নিজের বল

সে ত্রিশূলমূলে শিবের দেউলদ্বারে কাঁদছে স্মৃতি কে দেবে,
সুখে তৃপ্ত তুমি আমার গীতরাগে ভালো লাগে জানি আমি তোমার

তোমারি ইচ্ছা করো হে পূর্ণ আমার জীবন মাঝে যাচি হে তোমার,
বন্ধু চুপে চুপে চলিতেছে বনপথ ধরি আকাশের বুকে বুকে

প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ।।
বন্ধু আজকে আঘাত দিও না তোমাদের পকেটে পকেটে আমরা!
সে যে সুদুর অজানা করবীকুঁড়ির পানে চোখ তার ভরে গেছে নীল!
সে ছুটিয়া যায় চকিত আকাশ পায় না নাগাল যার লুঘ।
যা ছিল গোপন স্বপন কদিন রয় এসেছে গোধূলি।।
প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ!
বিদায় তুমি তাহা জানিলে না চলে গেছে মুসাফের কবে ফের।
বিদায় দেখেছ উঠল যে হাওয়া ঝোড়ো ঠিকানা রইল।
সে সকাল আসবেই যেদিন এই খবর পাবে প্রত্যেকের চোখেমুখে সকালের আলোয়!
প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ

এই কবিতা তে একটা কথা বারবার এসেছেঃ প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ।। এর কারণ হচ্ছে corpus ছোট হওয়ায় খুব সম্ভব প্রাণ সংক্রান্ত কথা আমার বেচারা প্রোগ্রামটি আর খুঁজে পায় নি। আরেকটি অর্থহীন কথা আছেঃ বন্ধু আজকে আঘাত দিও না তোমাদের পকেটে পকেটে আমরা! এই কথার সাধারণ কোন মানে নেই, কিন্তু একেবারেই সম্পূর্ণ অর্থহীন বলা যাবে না ঠিক। কবিতা যেহেতু ভাব সাহিত্য, এখানে মারকভ মডেল সহজেই পার পেয়ে যেতে পারে!

উপসংহার

কখনো বুঝিনি যেটা, এটা ছিল সূচনা,

আছে বাকি স্বপ্নের উপসংহার…

– তপু।

মারকভ মডেল বেশ পুরনো জিনিস। অনেক ভাষাবিদ, গণিতবিদ ও কম্পিউটার বিজ্ঞানীরা এর ওপর কাজ করেছেন। n-gram মারকভ মডেল ব্যাবহার করে Automatic Content Generation এবং নকল করা লেখা ধরার উপায় নতুন কিছু না। যা করেছি তা হচ্ছে শুধুই সূচনা, গাণিতিক ভাবে এই মডেল এখন বহুল প্রচলিত গবেষণার বিষয়। প্রাণিবিদ্যায় cell culture dynamics এবং genetic code sequencing এও এই মডেল ব্যাবহার করা হয়।

কবিতা লেখায় এর গ্রহণযোগ্যতা প্রশ্নসাপেক্ষ। গাণিতিক ভাবে এই মডেল কে সাপোর্ট দেয়া যায়, এবং আশা করা যায় ডায়নামিক মারকভ মডেল দিয়ে ভবিষ্যতে কোন প্রদত্ত টেক্সট এর সাহায্য ছাড়াই কবিতা লেখা যাবে। মানুষ এটা মেনে নেবে নাকি জানি না। তবে সবার আগে জানতে হবে কবিতা বলতে আমরা কি বুঝি, বা আমার মূল প্রশ্নঃ কবিতার মূল উপাদানগুলো কি কি? অনেক সময় একটা theme সংক্রান্ত কিছু ব্যাকরণ মেনে চলা শব্দের চয়নকেও কবিতা বলা যেতে পারে।

আমি যদি আসলেই কাউকে বলতাম যে কবিতাটা আমার লেখা, তাহলে মানুষ কিন্তু প্রায় বিশ্বাস করে ফেলত (অনেকটা টুরিং এর এ.আই. টেস্টের মত ব্যাপার). কিছু বন্ধুকে জিজ্ঞেস করে দেখেছি, যারা মোটামোটি কবিতা পড়ে। প্রায় সবাইই ধরে নিয়েছে যে এটা (প্রথম কবিতাটা) আমি লিখেছি। কিছু চ্যাট লগ দেখলে বোঝা যেতে পারেঃ

: tui likhchos?
me: ho beta
: khaisere mama
pura nazrul type
hoise
me: hehehe
: seriously
: tui likhsos?
me: ho
kemon hoise?
: aissala
  bhaloi to mone hoy
  kar jonne likhsos?
me: hehehe
ki mone hoy?
me: just tell me what you think
: tumi tomar mar theke fragrance pao
she's the flower
you're the shourov
me: hmm
 khub e high thought er bepar mone hocche!

কিন্তু আমার ধারণা শুরুতেই যদি বলতাম যে এটা প্রোগ্রাম থেকে লিখেছি, সবাই সাথে সাথে ভুল ধরা শুরু করতো। আমরা সাধারণত কোন এক্সপার্ট কেউ কথা বললে সেটা মেনে নেই, তর্ক কম করি। অনেক বড় বড় বোদ্ধারা যখন কিছু বলে সেটাকে প্রশ্ন কম করি, কিন্তু একই কথা সাধারণ বা নগণ্য কেউ বললে মেনে নিতে পারি না।

আমার দিক থেকে এই প্রোগ্রামের আপাতত দুইটা ব্যাবহার দেখতে পাচ্ছি। একটা হচ্ছে আধুনিক যুগের বাংলা মেটাল ব্যান্ডদের জন্য। তাদের গানের কথা সাধারণত বোঝা যায় কম, এবং যত কম বোঝা যায় এবং যত কঠিন শব্দ ব্যাবহার করা যায় ততই ভাব। কাজেই বেচারাদের কষ্ট করে ডিকশনারি ঘেঁটে আর গানের কথা লেখার দরকার কি, এমনিতেই তো বাংলা প্রায় পারেই না। আমাকে বললে আমি ফ্রি তে তাদের গান পাঠায় দিব। বানাতে কয়েক সেকন্ড সময় লাগবে শুধু। আরেকটা ব্যাবহার হচ্ছে আধুনিক তরুণীদের মুগ্ধ করতে। আমাকে অনেকেই বলে মেয়েরা নাকি গম্ভীর কবিতা শুনলে পটে যায়। এই প্রোগ্রাম দিয়ে আর যাইই হোক, মেয়ে পটানতে সুবিধা হইতে পারে। 🙂

বিশেষ দ্রষ্টব্যঃ কোড

ইনপুট প্রোসেসিং এবং ডাটা স্ট্রাকচার সংক্রান্ত ঝামেলা বাদ দিলে মূল মারকভ মডেল কোড খুব ছোট এবং সাধারণ।


generateSentence[n_, size_, prtmain_, initword_] := Module[
 {prevch = {}, res = {}, choices = {}, posch = 0, i},
 posch = RandomChoice[Position[prtmain[[;; , 1]], initword]];
 For[i = 1, i <= size, i++,
 res = AppendTo[res, prtmain[[posch[[1]], 1]]];
 (* search for temp in the rest and pick a random one *)
 posch =
 RandomChoice[
 Position[prtmain[[;; , 1 ;; n]],
 prtmain[[posch[[1]], 2 ;; n + 1]]]];
 choices =
 AppendTo[choices,
 Length[Position[prtmain[[;; , 1 ;; n]],
 prtmain[[posch[[1]], 2 ;; n + 1]]]]]
 ];
 Return[{res, choices}]
 ]

poem = {};
For[i = 1, i <= Length[result], i++,
 poem = AppendTo[poem, StringJoin[
 Insert[result[[i, 1]], " ",
 Table[{j}, {j, 2, Length[result[[i, 1]]]}]],
 RandomChoice[{"...", "।", "।।", "!", "\n", ","}],
 "\n"
 ]
 ]
 ]

Nail Portrait

I have a thing for stuff made from/using wood. Not that I am an expert, in fact, I have no skills whatsoever. The only time I attempted to put something together was during my sophomore year. Nails were hammered and/or screwed into a piece of wood to write sentences. Since then I wanted to make portraits on wooden blocks using nails. That didn’t happen so far. So just to satisfy my desire, I have written a program in Mathematica that takes an image and converts it to a nail portrait. 🙂

The idea will be to use Mathematica functions only (and no other 3d models) to build the portrait from scratch.

Preprocessing

Here’s a test image of myself:


img = Darker[Import["me.png", ImageSize -> 250], 0.5]

First thing would be to find the edges. The image is blurred a bit (with 5 pixel radius) before the edge detection methods are called just so that noise is suppressed.


edge = EdgeDetect[Blur[img, 5], 2, 0.01]

That needs to be cleaned up, so I decided to delete the small components that are less than 25 pixel length.


dedge = DeleteSmallComponents[edge, 25]

The components that are touching the border are deleted next.


dedge = DeleteBorderComponents[dedge]

Finally we do a morphological connected components search to detect the different regions.


cedge = MorphologicalComponents[dedge];

% // Colorize

Making the “nails”

Each component in the connected components matrix is found and the number of elements in the matrix for each component is calculated. The components are then sampled uniformly to create a point set representation of each component. The points are plotted using the ListPlot command. They were also rotated by a [0 1; -1 0] rotation matrix (-90 degrees) for viewing the resulting plot correctly.


cm = ComponentMeasurements[cedge, "Count"];

counts = Table[cm[[i, 2]], {i, 1, Length[cm]}];

rm = {{0, 1}, {-1, 0}}

Table[rm.Position[cedge, 1][[i]], {i, 1, counts[[1]], 10}];

selpt = Table[
 rm.Position[cedge, i][[j]], {i, 1, Length[counts]}, {j, 1,
 counts[[i]], 8}];

ListPlot[Flatten[selpt, 1] -
 Table[{0, Min[Flatten[selpt]]}, {i, 1, Length[Flatten[selpt, 1]]}]]

To create the nails from this image, all the points are converted from 2d to 3d by adding a random amount of elevation to each 2d coordinates. The randomization is mainly to mimic the random heights of nails on the wooden board.


zlength = Max[Flatten[selpt]]/10.0
flselpt3d =
 Table[{flselpt2[[i, 1]], flselpt2[[i, 2]],
 RandomReal[{zlength, zlength + zlength/2}]}, {i, 1,
 Length[flselpt2]}];

The resulting 3d coordinates are plotted using the ListPointPlot3D command. The Filling property of this command is set to true (and a dark gray color is assigned to it) to show the height of each point. This will also act as the body of the nail in the final plot!


lst3d = ListPointPlot3D[flselpt3d, Filling -> Bottom,
 PlotStyle -> Directive[Black, PointSize[Large]],
 FillingStyle -> Directive[RGBColor[19/255, 19/255, 19/255], Thick],
 Lighting -> Automatic]

Making the “board”

The “wooden board” is actually just another plot using Mathematica. A wood texture has been applied to a region plot. A cuboid region is generated by using a simple condition: x >0. The limits are defined by the maximum and minimum range of the 3d “nail” points in x, y and z directions.


rgplot = RegionPlot3D[
 x > 0, {x, 0, Max[flselpt2[[;; , 1]]]}, {y, 0,
 Max[flselpt2[[;; , 2]]]}, {z, 0, zlength},
 PlotStyle -> Texture[wood3], BoxRatios -> Automatic, Mesh -> None]

Putting it altogether

The 3d points plot and the region plot are shown together using the Show[] command. The lighting is adjusted, borders and axes are taken out too to give the final image.


Show[lst3d, rgplot, PlotRange -> {0, 1.6*zlength}, Axes -> None,
 Boxed -> False, BoxRatios -> Automatic]

This gives us the final 3d plot.

Here’s another view of the plot.

Some details are lost in this portrait, for example the smile is missing (or can be hardly noticed)! Oh well, this is just a simple scheme. To reconstruct the smile would require a better image (where lighting conditions are suitable to find the correct edges) and more playing around with the blur and edge detection parameters in the preprocessing stage.

Anyway, this gives me a general platform to produce nail portraits of nearly anything.